From 1ef4931fd4e0f5e883733b7a1c0e23c67dcd8675 Mon Sep 17 00:00:00 2001 From: Dmitry Kunin Date: Thu, 23 May 2013 14:34:09 +0300 Subject: [PATCH] [android] Added libraries Holo&ABS --- .gitignore | 3 + android/.gitignore | 10 + android/3rd_party/HoloEverywhere/LICENSE | 7 + android/3rd_party/HoloEverywhere/README.md | 52 + .../3rd_party/HoloEverywhere/checkstyle.xml | 113 + .../contrib/ActionBarSherlock/.travis.yml | 18 + .../contrib/ActionBarSherlock/CHANGELOG.md | 496 +++++ .../contrib/ActionBarSherlock/CONTRIBUTING.md | 11 + .../contrib/ActionBarSherlock/LICENSE.txt | 202 ++ .../contrib/ActionBarSherlock/README.md | 60 + .../contrib/ActionBarSherlock/RELEASING.md | 24 + .../actionbarsherlock/AndroidManifest.xml | 6 + .../actionbarsherlock/README.md | 15 + .../actionbarsherlock/build.xml | 92 + .../libs/android-support-v4-r13.jar | Bin 0 -> 484258 bytes .../actionbarsherlock/lint.xml | 24 + .../actionbarsherlock/pom.xml | 137 ++ .../actionbarsherlock/proguard-project.txt | 20 + .../actionbarsherlock/project.properties | 12 + ...s__primary_text_disable_only_holo_dark.xml | 20 + ...__primary_text_disable_only_holo_light.xml | 20 + .../res/color/abs__primary_text_holo_dark.xml | 24 + .../color/abs__primary_text_holo_light.xml | 25 + .../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__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 .../abs__ic_commit_search_api_holo_dark.png | Bin 0 -> 597 bytes .../abs__ic_commit_search_api_holo_light.png | Bin 0 -> 616 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 -> 2558 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 .../res/drawable-hdpi/abs__toast_frame.9.png | Bin 0 -> 1319 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__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 .../abs__ic_commit_search_api_holo_dark.png | Bin 0 -> 511 bytes .../abs__ic_commit_search_api_holo_light.png | Bin 0 -> 532 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 .../res/drawable-mdpi/abs__toast_frame.9.png | Bin 0 -> 839 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__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 .../abs__ic_commit_search_api_holo_dark.png | Bin 0 -> 703 bytes .../abs__ic_commit_search_api_holo_light.png | Bin 0 -> 712 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 .../res/drawable-xhdpi/abs__toast_frame.9.png | Bin 0 -> 1956 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 | 21 + .../abs__textfield_searchview_holo_light.xml | 21 + ...__textfield_searchview_right_holo_dark.xml | 21 + ..._textfield_searchview_right_holo_light.xml | 21 + .../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 | 51 + .../abs__screen_action_bar_overlay.xml | 50 + .../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 + .../layout/abs__list_menu_item_checkbox.xml | 24 + .../res/layout/abs__list_menu_item_icon.xml | 27 + .../res/layout/abs__list_menu_item_radio.xml | 24 + .../layout/abs__popup_menu_item_layout.xml | 60 + .../res/layout/abs__screen_action_bar.xml | 58 + .../layout/abs__screen_action_bar_overlay.xml | 60 + .../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-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 | 29 + .../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 | 24 + .../res/values/abs__config.xml | 43 + .../res/values/abs__dimens.xml | 55 + .../actionbarsherlock/res/values/abs__ids.xml | 26 + .../res/values/abs__strings.xml | 49 + .../res/values/abs__styles.xml | 412 ++++ .../res/values/abs__themes.xml | 207 ++ .../src/android/support/v4/app/Watson.java | 143 ++ .../actionbarsherlock/ActionBarSherlock.java | 799 ++++++++ .../com/actionbarsherlock/app/ActionBar.java | 956 +++++++++ .../app/SherlockActivity.java | 276 +++ .../app/SherlockDialogFragment.java | 68 + .../app/SherlockExpandableListActivity.java | 265 +++ .../app/SherlockFragment.java | 68 + .../app/SherlockFragmentActivity.java | 309 +++ .../app/SherlockListActivity.java | 276 +++ .../app/SherlockListFragment.java | 68 + .../app/SherlockPreferenceActivity.java | 276 +++ .../internal/ActionBarSherlockCompat.java | 1177 +++++++++++ .../internal/ActionBarSherlockNative.java | 352 ++++ .../internal/ResourcesCompat.java | 182 ++ .../internal/app/ActionBarImpl.java | 1031 ++++++++++ .../internal/app/ActionBarWrapper.java | 480 +++++ .../nineoldandroids/animation/Animator.java | 278 +++ .../animation/AnimatorListenerAdapter.java | 54 + .../animation/AnimatorSet.java | 1111 ++++++++++ .../animation/FloatEvaluator.java | 42 + .../animation/FloatKeyframeSet.java | 135 ++ .../animation/IntEvaluator.java | 42 + .../animation/IntKeyframeSet.java | 134 ++ .../nineoldandroids/animation/Keyframe.java | 361 ++++ .../animation/KeyframeSet.java | 227 +++ .../animation/ObjectAnimator.java | 491 +++++ .../animation/PropertyValuesHolder.java | 1012 +++++++++ .../animation/TypeEvaluator.java | 44 + .../animation/ValueAnimator.java | 1266 ++++++++++++ .../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 | 296 +++ .../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 | 1341 ++++++++++++ .../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 | 206 ++ .../internal/view/menu/SubMenuBuilder.java | 134 ++ .../internal/view/menu/SubMenuWrapper.java | 72 + .../internal/widget/AbsActionBarView.java | 291 +++ .../internal/widget/ActionBarContainer.java | 251 +++ .../internal/widget/ActionBarContextView.java | 518 +++++ .../internal/widget/ActionBarView.java | 1465 +++++++++++++ .../internal/widget/CapitalizingButton.java | 45 + .../internal/widget/CapitalizingTextView.java | 50 + .../widget/CollapsibleActionViewWrapper.java | 30 + .../internal/widget/IcsAbsSpinner.java | 479 +++++ .../internal/widget/IcsAdapterView.java | 1160 +++++++++++ .../internal/widget/IcsColorDrawable.java | 51 + .../internal/widget/IcsLinearLayout.java | 280 +++ .../internal/widget/IcsListPopupWindow.java | 661 ++++++ .../internal/widget/IcsProgressBar.java | 1193 +++++++++++ .../internal/widget/IcsSpinner.java | 703 +++++++ .../internal/widget/IcsToast.java | 60 + .../internal/widget/IcsView.java | 21 + .../widget/ScrollingTabContainerView.java | 546 +++++ .../internal/widget/TabsLinearLayout.java | 113 + .../actionbarsherlock/view/ActionMode.java | 224 ++ .../view/ActionProvider.java | 170 ++ .../view/CollapsibleActionView.java | 39 + .../src/com/actionbarsherlock/view/Menu.java | 446 ++++ .../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 | 839 ++++++++ .../actionbarsherlock/widget/SearchView.java | 1811 +++++++++++++++++ .../widget/ShareActionProvider.java | 316 +++ .../widget/SuggestionsAdapter.java | 758 +++++++ .../internal/ResourcesCompatTest.java | 23 + .../contrib/ActionBarSherlock/checkstyle.xml | 120 ++ .../contrib/ActionBarSherlock/pom.xml | 219 ++ .../3rd_party/HoloEverywhere/formatting.xml | 252 +++ .../library/AndroidManifest.xml | 4 + .../HoloEverywhere/library/build.xml | 92 + .../3rd_party/HoloEverywhere/library/lint.xml | 21 + .../library/proguard-project.txt | 20 + .../HoloEverywhere/library/project.properties | 13 + .../library/res/anim/dialog_enter.xml | 4 + .../library/res/anim/dialog_exit.xml | 4 + .../library/res/anim/fade_in.xml | 1 + .../library/res/anim/fade_out.xml | 1 + .../library/res/anim/grow_fade_in.xml | 4 + .../library/res/anim/grow_fade_in_center.xml | 4 + .../res/anim/grow_fade_in_from_bottom.xml | 4 + .../library/res/anim/shrink_fade_out.xml | 4 + .../res/anim/shrink_fade_out_center.xml | 4 + .../res/anim/shrink_fade_out_from_bottom.xml | 4 + .../primary_text_disable_only_holo_dark.xml | 4 + .../primary_text_disable_only_holo_light.xml | 4 + .../res/color/primary_text_holo_dark.xml | 8 + .../res/color/primary_text_holo_light.xml | 8 + .../primary_text_nodisable_holo_dark.xml | 5 + .../primary_text_nodisable_holo_light.xml | 5 + .../res/color/secondary_text_holo_dark.xml | 11 + .../res/color/secondary_text_holo_light.xml | 11 + .../secondary_text_nodisable_holo_dark.xml | 5 + .../secondary_text_nodisable_holo_light.xml | 5 + .../res/color/tertiary_text_holo_dark.xml | 7 + .../res/color/tertiary_text_holo_light.xml | 7 + .../activity_picker_bg_activated.9.png | Bin 0 -> 326 bytes .../activity_picker_bg_focused.9.png | Bin 0 -> 263 bytes .../btn_check_label_background.9.png | Bin 0 -> 134 bytes ...n_check_off_disable_focused_holo_light.png | Bin 0 -> 124 bytes .../btn_check_off_disable_holo_dark.png | Bin 0 -> 124 bytes .../btn_check_off_disable_holo_light.png | Bin 0 -> 124 bytes ...n_check_off_disabled_focused_holo_dark.png | Bin 0 -> 273 bytes ..._check_off_disabled_focused_holo_light.png | Bin 0 -> 273 bytes .../btn_check_off_disabled_holo_dark.png | Bin 0 -> 159 bytes .../btn_check_off_disabled_holo_light.png | Bin 0 -> 167 bytes .../btn_check_off_focused_holo_dark.png | Bin 0 -> 292 bytes .../btn_check_off_focused_holo_light.png | Bin 0 -> 356 bytes .../drawable-hdpi/btn_check_off_holo_dark.png | Bin 0 -> 167 bytes .../btn_check_off_holo_light.png | Bin 0 -> 167 bytes .../btn_check_off_normal_holo_dark.png | Bin 0 -> 366 bytes .../btn_check_off_normal_holo_light.png | Bin 0 -> 292 bytes .../btn_check_off_pressed_holo_dark.png | Bin 0 -> 2058 bytes .../btn_check_off_pressed_holo_light.png | Bin 0 -> 2021 bytes ...tn_check_on_disable_focused_holo_light.png | Bin 0 -> 863 bytes .../btn_check_on_disable_holo_dark.png | Bin 0 -> 950 bytes .../btn_check_on_disable_holo_light.png | Bin 0 -> 863 bytes ...tn_check_on_disabled_focused_holo_dark.png | Bin 0 -> 762 bytes ...n_check_on_disabled_focused_holo_light.png | Bin 0 -> 610 bytes .../btn_check_on_disabled_holo_dark.png | Bin 0 -> 385 bytes .../btn_check_on_disabled_holo_light.png | Bin 0 -> 460 bytes .../btn_check_on_focused_holo_dark.png | Bin 0 -> 2130 bytes .../btn_check_on_focused_holo_light.png | Bin 0 -> 2136 bytes .../drawable-hdpi/btn_check_on_holo_dark.png | Bin 0 -> 1846 bytes .../drawable-hdpi/btn_check_on_holo_light.png | Bin 0 -> 1839 bytes .../btn_check_on_pressed_holo_dark.png | Bin 0 -> 2621 bytes .../btn_check_on_pressed_holo_light.png | Bin 0 -> 2273 bytes ...n_default_disabled_focused_holo_dark.9.png | Bin 0 -> 291 bytes ..._default_disabled_focused_holo_light.9.png | Bin 0 -> 291 bytes .../btn_default_disabled_holo_dark.9.png | Bin 0 -> 272 bytes .../btn_default_disabled_holo_light.9.png | Bin 0 -> 272 bytes .../btn_default_focused_holo_dark.9.png | Bin 0 -> 311 bytes .../btn_default_focused_holo_light.9.png | Bin 0 -> 311 bytes .../btn_default_normal_holo_dark.9.png | Bin 0 -> 298 bytes .../btn_default_normal_holo_light.9.png | Bin 0 -> 303 bytes .../btn_default_pressed_holo_dark.9.png | Bin 0 -> 458 bytes .../btn_default_pressed_holo_light.9.png | Bin 0 -> 458 bytes .../btn_group_disabled_holo_dark.9.png | Bin 0 -> 181 bytes .../btn_group_disabled_holo_light.9.png | Bin 0 -> 171 bytes .../btn_group_focused_holo_dark.9.png | Bin 0 -> 282 bytes .../btn_group_focused_holo_light.9.png | Bin 0 -> 282 bytes .../btn_group_normal_holo_dark.9.png | Bin 0 -> 182 bytes .../btn_group_normal_holo_light.9.png | Bin 0 -> 171 bytes .../btn_group_pressed_holo_dark.9.png | Bin 0 -> 276 bytes .../btn_group_pressed_holo_light.9.png | Bin 0 -> 277 bytes .../btn_radio_label_background.9.png | Bin 0 -> 125 bytes ...n_radio_off_disabled_focused_holo_dark.png | Bin 0 -> 1212 bytes ..._radio_off_disabled_focused_holo_light.png | Bin 0 -> 1291 bytes .../btn_radio_off_disabled_holo_dark.png | Bin 0 -> 434 bytes .../btn_radio_off_disabled_holo_light.png | Bin 0 -> 493 bytes .../btn_radio_off_focused_holo_dark.png | Bin 0 -> 1495 bytes .../btn_radio_off_focused_holo_light.png | Bin 0 -> 1674 bytes .../res/drawable-hdpi/btn_radio_off_holo.png | Bin 0 -> 871 bytes .../drawable-hdpi/btn_radio_off_holo_dark.png | Bin 0 -> 559 bytes .../btn_radio_off_holo_light.png | Bin 0 -> 756 bytes .../btn_radio_off_pressed_holo_dark.png | Bin 0 -> 2070 bytes .../btn_radio_off_pressed_holo_light.png | Bin 0 -> 2195 bytes ...tn_radio_on_disabled_focused_holo_dark.png | Bin 0 -> 1851 bytes ...n_radio_on_disabled_focused_holo_light.png | Bin 0 -> 1955 bytes .../btn_radio_on_disabled_holo_dark.png | Bin 0 -> 1058 bytes .../btn_radio_on_disabled_holo_light.png | Bin 0 -> 1145 bytes .../btn_radio_on_focused_holo_dark.png | Bin 0 -> 1875 bytes .../btn_radio_on_focused_holo_light.png | Bin 0 -> 1990 bytes .../drawable-hdpi/btn_radio_on_holo_dark.png | Bin 0 -> 1648 bytes .../drawable-hdpi/btn_radio_on_holo_light.png | Bin 0 -> 1515 bytes .../btn_radio_on_pressed_holo_dark.png | Bin 0 -> 2805 bytes .../btn_radio_on_pressed_holo_light.png | Bin 0 -> 2433 bytes ...ng_star_off_disabled_focused_holo_dark.png | Bin 0 -> 2229 bytes ...g_star_off_disabled_focused_holo_light.png | Bin 0 -> 2456 bytes ...btn_rating_star_off_disabled_holo_dark.png | Bin 0 -> 1264 bytes ...tn_rating_star_off_disabled_holo_light.png | Bin 0 -> 1388 bytes .../btn_rating_star_off_focused_holo_dark.png | Bin 0 -> 2444 bytes ...btn_rating_star_off_focused_holo_light.png | Bin 0 -> 2612 bytes .../btn_rating_star_off_normal_holo_dark.png | Bin 0 -> 1601 bytes .../btn_rating_star_off_normal_holo_light.png | Bin 0 -> 1664 bytes .../btn_rating_star_off_pressed_holo_dark.png | Bin 0 -> 2762 bytes ...btn_rating_star_off_pressed_holo_light.png | Bin 0 -> 2920 bytes ...ing_star_on_disabled_focused_holo_dark.png | Bin 0 -> 2404 bytes ...ng_star_on_disabled_focused_holo_light.png | Bin 0 -> 2461 bytes .../btn_rating_star_on_disabled_holo_dark.png | Bin 0 -> 1496 bytes ...btn_rating_star_on_disabled_holo_light.png | Bin 0 -> 1503 bytes .../btn_rating_star_on_focused_holo_dark.png | Bin 0 -> 2551 bytes .../btn_rating_star_on_focused_holo_light.png | Bin 0 -> 2615 bytes .../btn_rating_star_on_normal_holo_dark.png | Bin 0 -> 1572 bytes .../btn_rating_star_on_normal_holo_light.png | Bin 0 -> 1638 bytes .../btn_rating_star_on_pressed_holo_dark.png | Bin 0 -> 2851 bytes .../btn_rating_star_on_pressed_holo_light.png | Bin 0 -> 2898 bytes ...oggle_off_disabled_focused_holo_dark.9.png | Bin 0 -> 310 bytes ...ggle_off_disabled_focused_holo_light.9.png | Bin 0 -> 310 bytes .../btn_toggle_off_disabled_holo_dark.9.png | Bin 0 -> 284 bytes .../btn_toggle_off_disabled_holo_light.9.png | Bin 0 -> 284 bytes .../btn_toggle_off_focused_holo_dark.9.png | Bin 0 -> 325 bytes .../btn_toggle_off_focused_holo_light.9.png | Bin 0 -> 325 bytes .../btn_toggle_off_normal_holo_dark.9.png | Bin 0 -> 310 bytes .../btn_toggle_off_normal_holo_light.9.png | Bin 0 -> 310 bytes .../btn_toggle_off_pressed_holo_dark.9.png | Bin 0 -> 471 bytes .../btn_toggle_off_pressed_holo_light.9.png | Bin 0 -> 471 bytes ...toggle_on_disabled_focused_holo_dark.9.png | Bin 0 -> 388 bytes ...oggle_on_disabled_focused_holo_light.9.png | Bin 0 -> 388 bytes .../btn_toggle_on_disabled_holo_dark.9.png | Bin 0 -> 382 bytes .../btn_toggle_on_disabled_holo_light.9.png | Bin 0 -> 382 bytes .../btn_toggle_on_focused_holo_dark.9.png | Bin 0 -> 411 bytes .../btn_toggle_on_focused_holo_light.9.png | Bin 0 -> 411 bytes .../btn_toggle_on_normal_holo_dark.9.png | Bin 0 -> 402 bytes .../btn_toggle_on_normal_holo_light.9.png | Bin 0 -> 402 bytes .../btn_toggle_on_pressed_holo_dark.9.png | Bin 0 -> 555 bytes .../btn_toggle_on_pressed_holo_light.9.png | Bin 0 -> 555 bytes .../day_picker_week_view_dayline_holo.9.png | Bin 0 -> 108 bytes .../dialog_bottom_holo_dark.9.png | Bin 0 -> 864 bytes .../dialog_bottom_holo_light.9.png | Bin 0 -> 913 bytes .../dialog_divider_horizontal_holo_dark.9.png | Bin 0 -> 125 bytes ...dialog_divider_horizontal_holo_light.9.png | Bin 0 -> 125 bytes .../drawable-hdpi/dialog_full_holo_dark.9.png | Bin 0 -> 1414 bytes .../dialog_full_holo_light.9.png | Bin 0 -> 1365 bytes .../drawable-hdpi/dialog_middle_holo.9.png | Bin 0 -> 242 bytes .../dialog_middle_holo_dark.9.png | Bin 0 -> 193 bytes .../dialog_middle_holo_light.9.png | Bin 0 -> 193 bytes .../drawable-hdpi/dialog_top_holo_dark.9.png | Bin 0 -> 816 bytes .../drawable-hdpi/dialog_top_holo_light.9.png | Bin 0 -> 685 bytes .../expander_close_holo_dark.9.png | Bin 0 -> 421 bytes .../expander_close_holo_light.9.png | Bin 0 -> 344 bytes .../drawable-hdpi/expander_ic_maximized.9.png | Bin 0 -> 1976 bytes .../drawable-hdpi/expander_ic_minimized.9.png | Bin 0 -> 1720 bytes .../expander_open_holo_dark.9.png | Bin 0 -> 434 bytes .../expander_open_holo_light.9.png | Bin 0 -> 348 bytes .../fastscroll_label_left_holo_dark.9.png | Bin 0 -> 923 bytes .../fastscroll_label_left_holo_light.9.png | Bin 0 -> 922 bytes .../fastscroll_label_right_holo_dark.9.png | Bin 0 -> 931 bytes .../fastscroll_label_right_holo_light.9.png | Bin 0 -> 906 bytes .../fastscroll_thumb_default_holo.png | Bin 0 -> 166 bytes .../fastscroll_thumb_pressed_holo.png | Bin 0 -> 292 bytes .../fastscroll_track_default_holo_dark.9.png | Bin 0 -> 102 bytes .../fastscroll_track_default_holo_light.9.png | Bin 0 -> 102 bytes .../fastscroll_track_pressed_holo_dark.9.png | Bin 0 -> 102 bytes .../fastscroll_track_pressed_holo_light.9.png | Bin 0 -> 102 bytes .../drawable-hdpi/list_activated_holo.9.png | Bin 0 -> 108 bytes .../list_divider_holo_dark.9.png | Bin 0 -> 78 bytes .../list_divider_holo_light.9.png | Bin 0 -> 76 bytes .../res/drawable-hdpi/list_focused_holo.9.png | Bin 0 -> 125 bytes .../drawable-hdpi/list_longpressed_holo.9.png | Bin 0 -> 108 bytes .../list_pressed_holo_dark.9.png | Bin 0 -> 113 bytes .../list_pressed_holo_light.9.png | Bin 0 -> 113 bytes .../list_section_divider_holo_dark.9.png | Bin 0 -> 115 bytes .../list_section_divider_holo_light.9.png | Bin 0 -> 111 bytes .../list_selector_disabled_holo_dark.9.png | Bin 0 -> 128 bytes .../list_selector_disabled_holo_light.9.png | Bin 0 -> 128 bytes ...ckground_fill_parent_width_holo_dark.9.png | Bin 0 -> 816 bytes ...kground_fill_parent_width_holo_light.9.png | Bin 0 -> 685 bytes .../menu_dropdown_panel_holo_dark.9.png | Bin 0 -> 922 bytes .../menu_dropdown_panel_holo_light.9.png | Bin 0 -> 951 bytes .../menu_hardkey_panel_holo_dark.9.png | Bin 0 -> 713 bytes .../menu_hardkey_panel_holo_light.9.png | Bin 0 -> 634 bytes .../numberpicker_selection_divider.9.png | Bin 0 -> 101 bytes ...old_switch_thumb_activated_holo_dark.9.png | Bin 0 -> 506 bytes ...ld_switch_thumb_activated_holo_light.9.png | Bin 0 -> 509 bytes .../old_switch_thumb_disabled_holo_dark.9.png | Bin 0 -> 378 bytes ...old_switch_thumb_disabled_holo_light.9.png | Bin 0 -> 363 bytes .../old_switch_thumb_holo_dark.9.png | Bin 0 -> 486 bytes .../old_switch_thumb_holo_light.9.png | Bin 0 -> 440 bytes .../old_switch_thumb_pressed_holo_dark.9.png | Bin 0 -> 510 bytes .../old_switch_thumb_pressed_holo_light.9.png | Bin 0 -> 514 bytes .../res/drawable-hdpi/overscroll_edge.png | Bin 0 -> 1345 bytes .../res/drawable-hdpi/overscroll_glow.png | Bin 0 -> 24314 bytes .../drawable-hdpi/panel_bg_holo_dark.9.png | Bin 0 -> 251 bytes .../drawable-hdpi/panel_bg_holo_light.9.png | Bin 0 -> 580 bytes .../drawable-hdpi/progress_bg_holo_dark.9.png | Bin 0 -> 118 bytes .../progress_bg_holo_light.9.png | Bin 0 -> 116 bytes .../progress_primary_holo_dark.9.png | Bin 0 -> 869 bytes .../progress_primary_holo_light.9.png | Bin 0 -> 873 bytes .../progress_secondary_holo_dark.9.png | Bin 0 -> 123 bytes .../progress_secondary_holo_light.9.png | Bin 0 -> 122 bytes .../progressbar_indeterminate_holo1.png | Bin 0 -> 598 bytes .../progressbar_indeterminate_holo2.png | Bin 0 -> 726 bytes .../progressbar_indeterminate_holo3.png | Bin 0 -> 748 bytes .../progressbar_indeterminate_holo4.png | Bin 0 -> 792 bytes .../progressbar_indeterminate_holo5.png | Bin 0 -> 672 bytes .../progressbar_indeterminate_holo6.png | Bin 0 -> 807 bytes .../progressbar_indeterminate_holo7.png | Bin 0 -> 655 bytes .../progressbar_indeterminate_holo8.png | Bin 0 -> 706 bytes .../rate_star_big_half_holo_dark.png | Bin 0 -> 1780 bytes .../rate_star_big_half_holo_light.png | Bin 0 -> 1895 bytes .../rate_star_big_off_holo_dark.png | Bin 0 -> 1232 bytes .../rate_star_big_off_holo_light.png | Bin 0 -> 1312 bytes .../rate_star_big_on_holo_dark.png | Bin 0 -> 1731 bytes .../rate_star_big_on_holo_light.png | Bin 0 -> 1797 bytes .../rate_star_small_half_holo_dark.png | Bin 0 -> 812 bytes .../rate_star_small_half_holo_light.png | Bin 0 -> 838 bytes .../rate_star_small_off_holo_dark.png | Bin 0 -> 757 bytes .../rate_star_small_off_holo_light.png | Bin 0 -> 764 bytes .../rate_star_small_on_holo_dark.png | Bin 0 -> 793 bytes .../rate_star_small_on_holo_light.png | Bin 0 -> 818 bytes .../scrollbar_handle_holo_dark.9.png | Bin 0 -> 137 bytes .../scrollbar_handle_holo_light.9.png | Bin 0 -> 142 bytes .../scrubber_control_disabled_holo.png | Bin 0 -> 663 bytes .../scrubber_control_focused_holo.png | Bin 0 -> 925 bytes .../scrubber_control_normal_holo.png | Bin 0 -> 1038 bytes .../scrubber_control_pressed_holo.png | Bin 0 -> 1411 bytes .../drawable-hdpi/scrubber_primary_holo.9.png | Bin 0 -> 122 bytes .../scrubber_secondary_holo.9.png | Bin 0 -> 123 bytes .../scrubber_track_holo_dark.9.png | Bin 0 -> 117 bytes .../scrubber_track_holo_light.9.png | Bin 0 -> 118 bytes .../drawable-hdpi/spinner_16_inner_holo.png | Bin 0 -> 733 bytes .../drawable-hdpi/spinner_16_outer_holo.png | Bin 0 -> 654 bytes .../drawable-hdpi/spinner_20_inner_holo.png | Bin 0 -> 664 bytes .../drawable-hdpi/spinner_20_outer_holo.png | Bin 0 -> 759 bytes .../drawable-hdpi/spinner_48_inner_holo.png | Bin 0 -> 1794 bytes .../drawable-hdpi/spinner_48_outer_holo.png | Bin 0 -> 1811 bytes .../drawable-hdpi/spinner_76_inner_holo.png | Bin 0 -> 2936 bytes .../drawable-hdpi/spinner_76_outer_holo.png | Bin 0 -> 2876 bytes .../spinner_default_holo_dark.9.png | Bin 0 -> 244 bytes .../spinner_default_holo_light.9.png | Bin 0 -> 243 bytes .../spinner_disabled_holo_dark.9.png | Bin 0 -> 235 bytes .../spinner_disabled_holo_light.9.png | Bin 0 -> 233 bytes .../spinner_focused_holo_dark.9.png | Bin 0 -> 416 bytes .../spinner_focused_holo_light.9.png | Bin 0 -> 401 bytes .../spinner_pressed_holo_dark.9.png | Bin 0 -> 367 bytes .../spinner_pressed_holo_light.9.png | Bin 0 -> 362 bytes .../switch_bg_disabled_holo_dark.9.png | Bin 0 -> 149 bytes .../switch_bg_disabled_holo_light.9.png | Bin 0 -> 149 bytes .../switch_bg_focused_holo_dark.9.png | Bin 0 -> 167 bytes .../switch_bg_focused_holo_light.9.png | Bin 0 -> 167 bytes .../drawable-hdpi/switch_bg_holo_dark.9.png | Bin 0 -> 123 bytes .../drawable-hdpi/switch_bg_holo_light.9.png | Bin 0 -> 123 bytes .../switch_thumb_activated_holo_dark.9.png | Bin 0 -> 430 bytes .../switch_thumb_activated_holo_light.9.png | Bin 0 -> 430 bytes .../switch_thumb_disabled_holo_dark.9.png | Bin 0 -> 395 bytes .../switch_thumb_disabled_holo_light.9.png | Bin 0 -> 395 bytes .../switch_thumb_holo_dark.9.png | Bin 0 -> 419 bytes .../switch_thumb_holo_light.9.png | Bin 0 -> 419 bytes .../switch_thumb_pressed_holo_dark.9.png | Bin 0 -> 421 bytes .../switch_thumb_pressed_holo_light.9.png | Bin 0 -> 421 bytes .../textfield_activated_holo_dark.9.png | Bin 0 -> 134 bytes .../textfield_activated_holo_light.9.png | Bin 0 -> 134 bytes .../textfield_bg_activated_holo_dark.9.png | Bin 0 -> 142 bytes .../textfield_bg_default_holo_dark.9.png | Bin 0 -> 141 bytes ...tfield_bg_disabled_focused_holo_dark.9.png | Bin 0 -> 145 bytes .../textfield_bg_disabled_holo_dark.9.png | Bin 0 -> 141 bytes .../textfield_bg_focused_holo_dark.9.png | Bin 0 -> 146 bytes .../textfield_default_holo_dark.9.png | Bin 0 -> 134 bytes .../textfield_default_holo_light.9.png | Bin 0 -> 133 bytes ...textfield_disabled_focused_holo_dark.9.png | Bin 0 -> 204 bytes ...extfield_disabled_focused_holo_light.9.png | Bin 0 -> 195 bytes .../textfield_disabled_holo_dark.9.png | Bin 0 -> 134 bytes .../textfield_disabled_holo_light.9.png | Bin 0 -> 133 bytes .../textfield_focused_holo_dark.9.png | Bin 0 -> 202 bytes .../textfield_focused_holo_light.9.png | Bin 0 -> 202 bytes ...tfield_multiline_activated_holo_dark.9.png | Bin 0 -> 134 bytes ...extfield_multiline_default_holo_dark.9.png | Bin 0 -> 134 bytes ...multiline_disabled_focused_holo_dark.9.png | Bin 0 -> 209 bytes ...xtfield_multiline_disabled_holo_dark.9.png | Bin 0 -> 134 bytes ...extfield_multiline_focused_holo_dark.9.png | Bin 0 -> 205 bytes .../res/drawable-hdpi/toast_frame.9.png | Bin 0 -> 1319 bytes .../activity_picker_bg_activated.9.png | Bin 0 -> 284 bytes .../activity_picker_bg_focused.9.png | Bin 0 -> 242 bytes .../btn_check_label_background.9.png | Bin 0 -> 109 bytes .../btn_check_off_disable_holo_dark.png | Bin 0 -> 149 bytes .../btn_check_off_disable_holo_light.png | Bin 0 -> 149 bytes ...n_check_off_disabled_focused_holo_dark.png | Bin 0 -> 212 bytes ..._check_off_disabled_focused_holo_light.png | Bin 0 -> 212 bytes .../btn_check_off_disabled_holo_dark.png | Bin 0 -> 149 bytes .../btn_check_off_disabled_holo_light.png | Bin 0 -> 149 bytes .../btn_check_off_focused_holo_dark.png | Bin 0 -> 210 bytes .../btn_check_off_focused_holo_light.png | Bin 0 -> 265 bytes .../drawable-mdpi/btn_check_off_holo_dark.png | Bin 0 -> 149 bytes .../btn_check_off_holo_light.png | Bin 0 -> 149 bytes .../btn_check_off_normal_holo_dark.png | Bin 0 -> 472 bytes .../btn_check_off_normal_holo_light.png | Bin 0 -> 357 bytes .../btn_check_off_pressed_holo_dark.png | Bin 0 -> 1398 bytes .../btn_check_off_pressed_holo_light.png | Bin 0 -> 1385 bytes .../btn_check_on_disable_holo_dark.png | Bin 0 -> 531 bytes .../btn_check_on_disable_holo_light.png | Bin 0 -> 497 bytes ...tn_check_on_disabled_focused_holo_dark.png | Bin 0 -> 527 bytes ...n_check_on_disabled_focused_holo_light.png | Bin 0 -> 467 bytes .../btn_check_on_disabled_holo_dark.png | Bin 0 -> 291 bytes .../btn_check_on_disabled_holo_light.png | Bin 0 -> 364 bytes .../btn_check_on_focused_holo_dark.png | Bin 0 -> 1507 bytes .../btn_check_on_focused_holo_light.png | Bin 0 -> 1503 bytes .../drawable-mdpi/btn_check_on_holo_dark.png | Bin 0 -> 1395 bytes .../drawable-mdpi/btn_check_on_holo_light.png | Bin 0 -> 1370 bytes .../btn_check_on_pressed_holo_dark.png | Bin 0 -> 1558 bytes .../btn_check_on_pressed_holo_light.png | Bin 0 -> 1727 bytes ...n_default_disabled_focused_holo_dark.9.png | Bin 0 -> 219 bytes ..._default_disabled_focused_holo_light.9.png | Bin 0 -> 219 bytes .../btn_default_disabled_holo_dark.9.png | Bin 0 -> 203 bytes .../btn_default_disabled_holo_light.9.png | Bin 0 -> 203 bytes .../btn_default_focused_holo_dark.9.png | Bin 0 -> 235 bytes .../btn_default_focused_holo_light.9.png | Bin 0 -> 235 bytes .../btn_default_normal_holo_dark.9.png | Bin 0 -> 211 bytes .../btn_default_normal_holo_light.9.png | Bin 0 -> 217 bytes .../btn_default_pressed_holo_dark.9.png | Bin 0 -> 320 bytes .../btn_default_pressed_holo_light.9.png | Bin 0 -> 320 bytes .../btn_group_disabled_holo_dark.9.png | Bin 0 -> 150 bytes .../btn_group_disabled_holo_light.9.png | Bin 0 -> 147 bytes .../btn_group_focused_holo_dark.9.png | Bin 0 -> 219 bytes .../btn_group_focused_holo_light.9.png | Bin 0 -> 219 bytes .../btn_group_normal_holo_dark.9.png | Bin 0 -> 152 bytes .../btn_group_normal_holo_light.9.png | Bin 0 -> 150 bytes .../btn_group_pressed_holo_dark.9.png | Bin 0 -> 212 bytes .../btn_group_pressed_holo_light.9.png | Bin 0 -> 212 bytes .../btn_radio_label_background.9.png | Bin 0 -> 109 bytes ...n_radio_off_disabled_focused_holo_dark.png | Bin 0 -> 733 bytes ..._radio_off_disabled_focused_holo_light.png | Bin 0 -> 755 bytes .../btn_radio_off_disabled_holo_dark.png | Bin 0 -> 288 bytes .../btn_radio_off_disabled_holo_light.png | Bin 0 -> 299 bytes .../btn_radio_off_focused_holo_dark.png | Bin 0 -> 825 bytes .../btn_radio_off_focused_holo_light.png | Bin 0 -> 889 bytes .../res/drawable-mdpi/btn_radio_off_holo.png | Bin 0 -> 519 bytes .../drawable-mdpi/btn_radio_off_holo_dark.png | Bin 0 -> 335 bytes .../btn_radio_off_holo_light.png | Bin 0 -> 426 bytes .../btn_radio_off_pressed_holo_dark.png | Bin 0 -> 1520 bytes .../btn_radio_off_pressed_holo_light.png | Bin 0 -> 1624 bytes ...tn_radio_on_disabled_focused_holo_dark.png | Bin 0 -> 1015 bytes ...n_radio_on_disabled_focused_holo_light.png | Bin 0 -> 1097 bytes .../btn_radio_on_disabled_holo_dark.png | Bin 0 -> 573 bytes .../btn_radio_on_disabled_holo_light.png | Bin 0 -> 736 bytes .../btn_radio_on_focused_holo_dark.png | Bin 0 -> 1185 bytes .../btn_radio_on_focused_holo_light.png | Bin 0 -> 1231 bytes .../drawable-mdpi/btn_radio_on_holo_dark.png | Bin 0 -> 803 bytes .../drawable-mdpi/btn_radio_on_holo_light.png | Bin 0 -> 837 bytes .../btn_radio_on_pressed_holo_dark.png | Bin 0 -> 1854 bytes .../btn_radio_on_pressed_holo_light.png | Bin 0 -> 1602 bytes ...ng_star_off_disabled_focused_holo_dark.png | Bin 0 -> 1511 bytes ...g_star_off_disabled_focused_holo_light.png | Bin 0 -> 1593 bytes ...btn_rating_star_off_disabled_holo_dark.png | Bin 0 -> 979 bytes ...tn_rating_star_off_disabled_holo_light.png | Bin 0 -> 1060 bytes .../btn_rating_star_off_focused_holo_dark.png | Bin 0 -> 1615 bytes ...btn_rating_star_off_focused_holo_light.png | Bin 0 -> 1650 bytes .../btn_rating_star_off_normal_holo_dark.png | Bin 0 -> 1057 bytes .../btn_rating_star_off_normal_holo_light.png | Bin 0 -> 1116 bytes .../btn_rating_star_off_pressed_holo_dark.png | Bin 0 -> 1777 bytes ...btn_rating_star_off_pressed_holo_light.png | Bin 0 -> 1862 bytes ...ing_star_on_disabled_focused_holo_dark.png | Bin 0 -> 1560 bytes ...ng_star_on_disabled_focused_holo_light.png | Bin 0 -> 1567 bytes .../btn_rating_star_on_disabled_holo_dark.png | Bin 0 -> 1025 bytes ...btn_rating_star_on_disabled_holo_light.png | Bin 0 -> 1023 bytes .../btn_rating_star_on_focused_holo_dark.png | Bin 0 -> 1643 bytes .../btn_rating_star_on_focused_holo_light.png | Bin 0 -> 1637 bytes .../btn_rating_star_on_normal_holo_dark.png | Bin 0 -> 1059 bytes .../btn_rating_star_on_normal_holo_light.png | Bin 0 -> 1108 bytes .../btn_rating_star_on_pressed_holo_dark.png | Bin 0 -> 1820 bytes .../btn_rating_star_on_pressed_holo_light.png | Bin 0 -> 1830 bytes ...oggle_off_disabled_focused_holo_dark.9.png | Bin 0 -> 228 bytes ...ggle_off_disabled_focused_holo_light.9.png | Bin 0 -> 228 bytes .../btn_toggle_off_disabled_holo_dark.9.png | Bin 0 -> 213 bytes .../btn_toggle_off_disabled_holo_light.9.png | Bin 0 -> 213 bytes .../btn_toggle_off_focused_holo_dark.9.png | Bin 0 -> 249 bytes .../btn_toggle_off_focused_holo_light.9.png | Bin 0 -> 249 bytes .../btn_toggle_off_normal_holo_dark.9.png | Bin 0 -> 222 bytes .../btn_toggle_off_normal_holo_light.9.png | Bin 0 -> 222 bytes .../btn_toggle_off_pressed_holo_dark.9.png | Bin 0 -> 334 bytes .../btn_toggle_off_pressed_holo_light.9.png | Bin 0 -> 334 bytes ...toggle_on_disabled_focused_holo_dark.9.png | Bin 0 -> 254 bytes ...oggle_on_disabled_focused_holo_light.9.png | Bin 0 -> 254 bytes .../btn_toggle_on_disabled_holo_dark.9.png | Bin 0 -> 246 bytes .../btn_toggle_on_disabled_holo_light.9.png | Bin 0 -> 246 bytes .../btn_toggle_on_focused_holo_dark.9.png | Bin 0 -> 285 bytes .../btn_toggle_on_focused_holo_light.9.png | Bin 0 -> 285 bytes .../btn_toggle_on_normal_holo_dark.9.png | Bin 0 -> 258 bytes .../btn_toggle_on_normal_holo_light.9.png | Bin 0 -> 258 bytes .../btn_toggle_on_pressed_holo_dark.9.png | Bin 0 -> 364 bytes .../btn_toggle_on_pressed_holo_light.9.png | Bin 0 -> 364 bytes .../day_picker_week_view_dayline_holo.9.png | Bin 0 -> 105 bytes .../dialog_bottom_holo_dark.9.png | Bin 0 -> 582 bytes .../dialog_bottom_holo_light.9.png | Bin 0 -> 622 bytes .../dialog_divider_horizontal_holo_dark.9.png | Bin 0 -> 112 bytes ...dialog_divider_horizontal_holo_light.9.png | Bin 0 -> 115 bytes .../drawable-mdpi/dialog_full_holo_dark.9.png | Bin 0 -> 882 bytes .../dialog_full_holo_light.9.png | Bin 0 -> 1003 bytes .../drawable-mdpi/dialog_middle_holo.9.png | Bin 0 -> 219 bytes .../dialog_middle_holo_dark.9.png | Bin 0 -> 165 bytes .../drawable-mdpi/dialog_top_holo_dark.9.png | Bin 0 -> 553 bytes .../drawable-mdpi/dialog_top_holo_light.9.png | Bin 0 -> 494 bytes .../expander_close_holo_dark.9.png | Bin 0 -> 311 bytes .../expander_close_holo_light.9.png | Bin 0 -> 242 bytes .../drawable-mdpi/expander_ic_maximized.9.png | Bin 0 -> 1407 bytes .../drawable-mdpi/expander_ic_minimized.9.png | Bin 0 -> 1460 bytes .../expander_open_holo_dark.9.png | Bin 0 -> 305 bytes .../expander_open_holo_light.9.png | Bin 0 -> 243 bytes .../fastscroll_label_left_holo_dark.9.png | Bin 0 -> 952 bytes .../fastscroll_label_left_holo_light.9.png | Bin 0 -> 943 bytes .../fastscroll_label_right_holo_dark.9.png | Bin 0 -> 937 bytes .../fastscroll_label_right_holo_light.9.png | Bin 0 -> 967 bytes .../fastscroll_thumb_default_holo.png | Bin 0 -> 136 bytes .../fastscroll_thumb_pressed_holo.png | Bin 0 -> 222 bytes .../fastscroll_track_default_holo_dark.9.png | Bin 0 -> 99 bytes .../fastscroll_track_default_holo_light.9.png | Bin 0 -> 99 bytes .../fastscroll_track_pressed_holo_dark.9.png | Bin 0 -> 99 bytes .../fastscroll_track_pressed_holo_light.9.png | Bin 0 -> 99 bytes .../drawable-mdpi/list_activated_holo.9.png | Bin 0 -> 108 bytes .../list_divider_holo_dark.9.png | Bin 0 -> 78 bytes .../list_divider_holo_light.9.png | Bin 0 -> 76 bytes .../res/drawable-mdpi/list_focused_holo.9.png | Bin 0 -> 116 bytes .../drawable-mdpi/list_longpressed_holo.9.png | Bin 0 -> 108 bytes .../list_pressed_holo_dark.9.png | Bin 0 -> 110 bytes .../list_pressed_holo_light.9.png | Bin 0 -> 110 bytes .../list_section_divider_holo_dark.9.png | Bin 0 -> 112 bytes .../list_section_divider_holo_light.9.png | Bin 0 -> 109 bytes .../list_selector_disabled_holo_dark.9.png | Bin 0 -> 114 bytes .../list_selector_disabled_holo_light.9.png | Bin 0 -> 115 bytes ...ckground_fill_parent_width_holo_dark.9.png | Bin 0 -> 553 bytes ...kground_fill_parent_width_holo_light.9.png | Bin 0 -> 494 bytes .../menu_dropdown_panel_holo_dark.9.png | Bin 0 -> 651 bytes .../menu_dropdown_panel_holo_light.9.png | Bin 0 -> 720 bytes .../menu_hardkey_panel_holo_dark.9.png | Bin 0 -> 480 bytes .../menu_hardkey_panel_holo_light.9.png | Bin 0 -> 431 bytes .../numberpicker_selection_divider.9.png | Bin 0 -> 97 bytes ...old_switch_thumb_activated_holo_dark.9.png | Bin 0 -> 351 bytes ...ld_switch_thumb_activated_holo_light.9.png | Bin 0 -> 360 bytes .../old_switch_thumb_disabled_holo_dark.9.png | Bin 0 -> 301 bytes ...old_switch_thumb_disabled_holo_light.9.png | Bin 0 -> 280 bytes .../old_switch_thumb_holo_dark.9.png | Bin 0 -> 349 bytes .../old_switch_thumb_holo_light.9.png | Bin 0 -> 330 bytes .../old_switch_thumb_pressed_holo_dark.9.png | Bin 0 -> 365 bytes .../old_switch_thumb_pressed_holo_light.9.png | Bin 0 -> 375 bytes .../res/drawable-mdpi/overscroll_edge.png | Bin 0 -> 903 bytes .../res/drawable-mdpi/overscroll_glow.png | Bin 0 -> 13556 bytes .../drawable-mdpi/panel_bg_holo_dark.9.png | Bin 0 -> 218 bytes .../drawable-mdpi/panel_bg_holo_light.9.png | Bin 0 -> 209 bytes .../drawable-mdpi/progress_bg_holo_dark.9.png | Bin 0 -> 114 bytes .../progress_bg_holo_light.9.png | Bin 0 -> 114 bytes .../progress_primary_holo_dark.9.png | Bin 0 -> 559 bytes .../progress_primary_holo_light.9.png | Bin 0 -> 561 bytes .../progress_secondary_holo_dark.9.png | Bin 0 -> 118 bytes .../progress_secondary_holo_light.9.png | Bin 0 -> 119 bytes .../progressbar_indeterminate_holo1.png | Bin 0 -> 317 bytes .../progressbar_indeterminate_holo2.png | Bin 0 -> 370 bytes .../progressbar_indeterminate_holo3.png | Bin 0 -> 426 bytes .../progressbar_indeterminate_holo4.png | Bin 0 -> 427 bytes .../progressbar_indeterminate_holo5.png | Bin 0 -> 407 bytes .../progressbar_indeterminate_holo6.png | Bin 0 -> 438 bytes .../progressbar_indeterminate_holo7.png | Bin 0 -> 390 bytes .../progressbar_indeterminate_holo8.png | Bin 0 -> 389 bytes .../rate_star_big_half_holo_dark.png | Bin 0 -> 1184 bytes .../rate_star_big_half_holo_light.png | Bin 0 -> 1255 bytes .../rate_star_big_off_holo_dark.png | Bin 0 -> 1072 bytes .../rate_star_big_off_holo_light.png | Bin 0 -> 1090 bytes .../rate_star_big_on_holo_dark.png | Bin 0 -> 1155 bytes .../rate_star_big_on_holo_light.png | Bin 0 -> 1207 bytes .../rate_star_small_half_holo_dark.png | Bin 0 -> 517 bytes .../rate_star_small_half_holo_light.png | Bin 0 -> 517 bytes .../rate_star_small_off_holo_dark.png | Bin 0 -> 538 bytes .../rate_star_small_off_holo_light.png | Bin 0 -> 523 bytes .../rate_star_small_on_holo_dark.png | Bin 0 -> 496 bytes .../rate_star_small_on_holo_light.png | Bin 0 -> 506 bytes .../scrollbar_handle_holo_dark.9.png | Bin 0 -> 124 bytes .../scrollbar_handle_holo_light.9.png | Bin 0 -> 126 bytes .../scrubber_control_disabled_holo.png | Bin 0 -> 408 bytes .../scrubber_control_focused_holo.png | Bin 0 -> 504 bytes .../scrubber_control_normal_holo.png | Bin 0 -> 568 bytes .../scrubber_control_pressed_holo.png | Bin 0 -> 752 bytes .../drawable-mdpi/scrubber_primary_holo.9.png | Bin 0 -> 120 bytes .../scrubber_secondary_holo.9.png | Bin 0 -> 120 bytes .../scrubber_track_holo_dark.9.png | Bin 0 -> 111 bytes .../scrubber_track_holo_light.9.png | Bin 0 -> 112 bytes .../drawable-mdpi/spinner_16_inner_holo.png | Bin 0 -> 520 bytes .../drawable-mdpi/spinner_16_outer_holo.png | Bin 0 -> 451 bytes .../drawable-mdpi/spinner_20_inner_holo.png | Bin 0 -> 598 bytes .../drawable-mdpi/spinner_20_outer_holo.png | Bin 0 -> 548 bytes .../drawable-mdpi/spinner_48_inner_holo.png | Bin 0 -> 1076 bytes .../drawable-mdpi/spinner_48_outer_holo.png | Bin 0 -> 1165 bytes .../drawable-mdpi/spinner_76_inner_holo.png | Bin 0 -> 1787 bytes .../drawable-mdpi/spinner_76_outer_holo.png | Bin 0 -> 1808 bytes .../spinner_default_holo_dark.9.png | Bin 0 -> 198 bytes .../spinner_default_holo_light.9.png | Bin 0 -> 197 bytes .../spinner_disabled_holo_dark.9.png | Bin 0 -> 190 bytes .../spinner_disabled_holo_light.9.png | Bin 0 -> 186 bytes .../spinner_focused_holo_dark.9.png | Bin 0 -> 315 bytes .../spinner_focused_holo_light.9.png | Bin 0 -> 303 bytes .../spinner_pressed_holo_dark.9.png | Bin 0 -> 274 bytes .../spinner_pressed_holo_light.9.png | Bin 0 -> 272 bytes .../switch_bg_disabled_holo_dark.9.png | Bin 0 -> 131 bytes .../switch_bg_disabled_holo_light.9.png | Bin 0 -> 131 bytes .../switch_bg_focused_holo_dark.9.png | Bin 0 -> 139 bytes .../switch_bg_focused_holo_light.9.png | Bin 0 -> 141 bytes .../drawable-mdpi/switch_bg_holo_dark.9.png | Bin 0 -> 118 bytes .../drawable-mdpi/switch_bg_holo_light.9.png | Bin 0 -> 118 bytes .../switch_thumb_activated_holo_dark.9.png | Bin 0 -> 259 bytes .../switch_thumb_activated_holo_light.9.png | Bin 0 -> 259 bytes .../switch_thumb_disabled_holo_dark.9.png | Bin 0 -> 252 bytes .../switch_thumb_disabled_holo_light.9.png | Bin 0 -> 252 bytes .../switch_thumb_holo_dark.9.png | Bin 0 -> 272 bytes .../switch_thumb_holo_light.9.png | Bin 0 -> 272 bytes .../switch_thumb_pressed_holo_dark.9.png | Bin 0 -> 263 bytes .../switch_thumb_pressed_holo_light.9.png | Bin 0 -> 263 bytes .../textfield_activated_holo_light.9.png | Bin 0 -> 130 bytes .../textfield_bg_activated_holo_dark.9.png | Bin 0 -> 142 bytes .../textfield_bg_default_holo_dark.9.png | Bin 0 -> 141 bytes ...tfield_bg_disabled_focused_holo_dark.9.png | Bin 0 -> 145 bytes .../textfield_bg_disabled_holo_dark.9.png | Bin 0 -> 141 bytes .../textfield_bg_focused_holo_dark.9.png | Bin 0 -> 146 bytes .../textfield_default_holo_dark.9.png | Bin 0 -> 121 bytes .../textfield_default_holo_light.9.png | Bin 0 -> 118 bytes ...textfield_disabled_focused_holo_dark.9.png | Bin 0 -> 162 bytes ...extfield_disabled_focused_holo_light.9.png | Bin 0 -> 157 bytes .../textfield_disabled_holo_dark.9.png | Bin 0 -> 121 bytes .../textfield_disabled_holo_light.9.png | Bin 0 -> 118 bytes .../textfield_focused_holo_dark.9.png | Bin 0 -> 210 bytes .../textfield_focused_holo_light.9.png | Bin 0 -> 210 bytes ...tfield_multiline_activated_holo_dark.9.png | Bin 0 -> 130 bytes ...extfield_multiline_default_holo_dark.9.png | Bin 0 -> 121 bytes ...multiline_disabled_focused_holo_dark.9.png | Bin 0 -> 162 bytes ...xtfield_multiline_disabled_holo_dark.9.png | Bin 0 -> 121 bytes ...extfield_multiline_focused_holo_dark.9.png | Bin 0 -> 164 bytes .../res/drawable-mdpi/toast_frame.9.png | Bin 0 -> 839 bytes .../activity_picker_bg_activated.9.png | Bin 0 -> 413 bytes .../activity_picker_bg_focused.9.png | Bin 0 -> 324 bytes .../btn_check_label_background.9.png | Bin 0 -> 130 bytes .../btn_check_off_disable_holo_dark.png | Bin 0 -> 182 bytes .../btn_check_off_disable_holo_light.png | Bin 0 -> 188 bytes ...n_check_off_disabled_focused_holo_dark.png | Bin 0 -> 314 bytes ..._check_off_disabled_focused_holo_light.png | Bin 0 -> 314 bytes .../btn_check_off_disabled_holo_dark.png | Bin 0 -> 178 bytes .../btn_check_off_disabled_holo_light.png | Bin 0 -> 178 bytes .../btn_check_off_focused_holo_dark.png | Bin 0 -> 322 bytes .../btn_check_off_focused_holo_light.png | Bin 0 -> 487 bytes .../res/drawable-xhdpi/btn_check_off_holo.png | Bin 0 -> 264 bytes .../btn_check_off_holo_dark.png | Bin 0 -> 178 bytes .../btn_check_off_holo_light.png | Bin 0 -> 178 bytes .../btn_check_off_normal_holo_dark.png | Bin 0 -> 683 bytes .../btn_check_off_normal_holo_light.png | Bin 0 -> 601 bytes .../btn_check_off_pressed_holo_dark.png | Bin 0 -> 2629 bytes .../btn_check_off_pressed_holo_light.png | Bin 0 -> 2599 bytes ...tn_check_on_disabled_focused_holo_dark.png | Bin 0 -> 1023 bytes ...n_check_on_disabled_focused_holo_light.png | Bin 0 -> 760 bytes .../btn_check_on_disabled_holo_dark.png | Bin 0 -> 471 bytes .../btn_check_on_disabled_holo_light.png | Bin 0 -> 583 bytes .../btn_check_on_focused_holo_dark.png | Bin 0 -> 3021 bytes .../btn_check_on_focused_holo_light.png | Bin 0 -> 3014 bytes .../res/drawable-xhdpi/btn_check_on_holo.png | Bin 0 -> 2973 bytes .../drawable-xhdpi/btn_check_on_holo_dark.png | Bin 0 -> 2616 bytes .../btn_check_on_holo_light.png | Bin 0 -> 2622 bytes .../btn_check_on_pressed_holo_dark.png | Bin 0 -> 3787 bytes .../btn_check_on_pressed_holo_light.png | Bin 0 -> 3127 bytes ...n_default_disabled_focused_holo_dark.9.png | Bin 0 -> 394 bytes ..._default_disabled_focused_holo_light.9.png | Bin 0 -> 394 bytes .../btn_default_disabled_holo_dark.9.png | Bin 0 -> 387 bytes .../btn_default_disabled_holo_light.9.png | Bin 0 -> 387 bytes .../btn_default_focused_holo_dark.9.png | Bin 0 -> 412 bytes .../btn_default_focused_holo_light.9.png | Bin 0 -> 412 bytes .../btn_default_normal_holo_dark.9.png | Bin 0 -> 418 bytes .../btn_default_normal_holo_light.9.png | Bin 0 -> 425 bytes .../btn_default_pressed_holo_dark.9.png | Bin 0 -> 653 bytes .../btn_default_pressed_holo_light.9.png | Bin 0 -> 653 bytes .../btn_group_disabled_holo_dark.9.png | Bin 0 -> 213 bytes .../btn_group_disabled_holo_light.9.png | Bin 0 -> 206 bytes .../btn_group_focused_holo_dark.9.png | Bin 0 -> 355 bytes .../btn_group_focused_holo_light.9.png | Bin 0 -> 355 bytes .../btn_group_normal_holo_dark.9.png | Bin 0 -> 212 bytes .../btn_group_normal_holo_light.9.png | Bin 0 -> 206 bytes .../btn_group_pressed_holo_dark.9.png | Bin 0 -> 354 bytes .../btn_group_pressed_holo_light.9.png | Bin 0 -> 356 bytes .../btn_radio_label_background.9.png | Bin 0 -> 130 bytes ...n_radio_off_disabled_focused_holo_dark.png | Bin 0 -> 1512 bytes ..._radio_off_disabled_focused_holo_light.png | Bin 0 -> 1615 bytes .../btn_radio_off_disabled_holo_dark.png | Bin 0 -> 552 bytes .../btn_radio_off_disabled_holo_light.png | Bin 0 -> 641 bytes .../btn_radio_off_focused_holo_dark.png | Bin 0 -> 1933 bytes .../btn_radio_off_focused_holo_light.png | Bin 0 -> 2153 bytes .../res/drawable-xhdpi/btn_radio_off_holo.png | Bin 0 -> 1211 bytes .../btn_radio_off_holo_dark.png | Bin 0 -> 741 bytes .../btn_radio_off_holo_light.png | Bin 0 -> 968 bytes .../btn_radio_off_pressed_holo_dark.png | Bin 0 -> 2984 bytes .../btn_radio_off_pressed_holo_light.png | Bin 0 -> 3136 bytes ...tn_radio_on_disabled_focused_holo_dark.png | Bin 0 -> 2151 bytes ...n_radio_on_disabled_focused_holo_light.png | Bin 0 -> 2228 bytes .../btn_radio_on_disabled_holo_dark.png | Bin 0 -> 1446 bytes .../btn_radio_on_disabled_holo_light.png | Bin 0 -> 1643 bytes .../btn_radio_on_focused_holo_dark.png | Bin 0 -> 2920 bytes .../btn_radio_on_focused_holo_light.png | Bin 0 -> 2991 bytes .../drawable-xhdpi/btn_radio_on_holo_dark.png | Bin 0 -> 2160 bytes .../btn_radio_on_holo_light.png | Bin 0 -> 2236 bytes .../btn_radio_on_pressed_holo_dark.png | Bin 0 -> 4259 bytes .../btn_radio_on_pressed_holo_light.png | Bin 0 -> 3394 bytes ...ng_star_off_disabled_focused_holo_dark.png | Bin 0 -> 3540 bytes ...g_star_off_disabled_focused_holo_light.png | Bin 0 -> 3613 bytes ...btn_rating_star_off_disabled_holo_dark.png | Bin 0 -> 1725 bytes ...tn_rating_star_off_disabled_holo_light.png | Bin 0 -> 1895 bytes .../btn_rating_star_off_focused_holo_dark.png | Bin 0 -> 3834 bytes ...btn_rating_star_off_focused_holo_light.png | Bin 0 -> 3845 bytes .../btn_rating_star_off_normal_holo_dark.png | Bin 0 -> 1939 bytes .../btn_rating_star_off_normal_holo_light.png | Bin 0 -> 1735 bytes .../btn_rating_star_off_pressed_holo_dark.png | Bin 0 -> 4300 bytes ...btn_rating_star_off_pressed_holo_light.png | Bin 0 -> 4325 bytes ...ing_star_on_disabled_focused_holo_dark.png | Bin 0 -> 3802 bytes ...ng_star_on_disabled_focused_holo_light.png | Bin 0 -> 3605 bytes .../btn_rating_star_on_disabled_holo_dark.png | Bin 0 -> 2327 bytes ...btn_rating_star_on_disabled_holo_light.png | Bin 0 -> 2122 bytes .../btn_rating_star_on_focused_holo_dark.png | Bin 0 -> 4061 bytes .../btn_rating_star_on_focused_holo_light.png | Bin 0 -> 3843 bytes .../btn_rating_star_on_normal_holo_dark.png | Bin 0 -> 2456 bytes .../btn_rating_star_on_normal_holo_light.png | Bin 0 -> 2361 bytes .../btn_rating_star_on_pressed_holo_dark.png | Bin 0 -> 4565 bytes .../btn_rating_star_on_pressed_holo_light.png | Bin 0 -> 4298 bytes ...oggle_off_disabled_focused_holo_dark.9.png | Bin 0 -> 410 bytes ...ggle_off_disabled_focused_holo_light.9.png | Bin 0 -> 410 bytes .../btn_toggle_off_disabled_holo_dark.9.png | Bin 0 -> 402 bytes .../btn_toggle_off_disabled_holo_light.9.png | Bin 0 -> 402 bytes .../btn_toggle_off_focused_holo_dark.9.png | Bin 0 -> 429 bytes .../btn_toggle_off_focused_holo_light.9.png | Bin 0 -> 429 bytes .../btn_toggle_off_normal_holo_dark.9.png | Bin 0 -> 434 bytes .../btn_toggle_off_normal_holo_light.9.png | Bin 0 -> 434 bytes .../btn_toggle_off_pressed_holo_dark.9.png | Bin 0 -> 673 bytes .../btn_toggle_off_pressed_holo_light.9.png | Bin 0 -> 673 bytes ...toggle_on_disabled_focused_holo_dark.9.png | Bin 0 -> 498 bytes ...oggle_on_disabled_focused_holo_light.9.png | Bin 0 -> 498 bytes .../btn_toggle_on_disabled_holo_dark.9.png | Bin 0 -> 514 bytes .../btn_toggle_on_disabled_holo_light.9.png | Bin 0 -> 514 bytes .../btn_toggle_on_focused_holo_dark.9.png | Bin 0 -> 532 bytes .../btn_toggle_on_focused_holo_light.9.png | Bin 0 -> 532 bytes .../btn_toggle_on_normal_holo_dark.9.png | Bin 0 -> 548 bytes .../btn_toggle_on_normal_holo_light.9.png | Bin 0 -> 548 bytes .../btn_toggle_on_pressed_holo_dark.9.png | Bin 0 -> 761 bytes .../btn_toggle_on_pressed_holo_light.9.png | Bin 0 -> 761 bytes .../day_picker_week_view_dayline_holo.9.png | Bin 0 -> 113 bytes .../dialog_bottom_holo_dark.9.png | Bin 0 -> 1263 bytes .../dialog_bottom_holo_light.9.png | Bin 0 -> 1256 bytes .../dialog_divider_horizontal_holo_dark.9.png | Bin 0 -> 140 bytes ...dialog_divider_horizontal_holo_light.9.png | Bin 0 -> 137 bytes .../dialog_full_holo_dark.9.png | Bin 0 -> 2018 bytes .../dialog_full_holo_light.9.png | Bin 0 -> 1889 bytes .../dialog_middle_holo_dark.9.png | Bin 0 -> 249 bytes .../dialog_middle_holo_light.9.png | Bin 0 -> 249 bytes .../drawable-xhdpi/dialog_top_holo_dark.9.png | Bin 0 -> 1155 bytes .../dialog_top_holo_light.9.png | Bin 0 -> 863 bytes .../expander_close_holo_dark.9.png | Bin 0 -> 573 bytes .../expander_close_holo_light.9.png | Bin 0 -> 458 bytes .../expander_ic_maximized.9.png | Bin 0 -> 3869 bytes .../expander_ic_minimized.9.png | Bin 0 -> 3963 bytes .../expander_open_holo_dark.9.png | Bin 0 -> 600 bytes .../expander_open_holo_light.9.png | Bin 0 -> 461 bytes .../fastscroll_label_left_holo_dark.9.png | Bin 0 -> 1351 bytes .../fastscroll_label_left_holo_light.9.png | Bin 0 -> 1347 bytes .../fastscroll_label_right_holo_dark.9.png | Bin 0 -> 1316 bytes .../fastscroll_label_right_holo_light.9.png | Bin 0 -> 1279 bytes .../fastscroll_thumb_default_holo.png | Bin 0 -> 198 bytes .../fastscroll_thumb_pressed_holo.png | Bin 0 -> 383 bytes .../fastscroll_track_default_holo_dark.9.png | Bin 0 -> 101 bytes .../fastscroll_track_default_holo_light.9.png | Bin 0 -> 101 bytes .../fastscroll_track_pressed_holo_dark.9.png | Bin 0 -> 102 bytes .../fastscroll_track_pressed_holo_light.9.png | Bin 0 -> 102 bytes .../drawable-xhdpi/list_activated_holo.9.png | Bin 0 -> 111 bytes .../list_divider_holo_dark.9.png | Bin 0 -> 83 bytes .../list_divider_holo_light.9.png | Bin 0 -> 83 bytes .../drawable-xhdpi/list_focused_holo.9.png | Bin 0 -> 128 bytes .../list_longpressed_holo.9.png | Bin 0 -> 111 bytes .../list_pressed_holo_dark.9.png | Bin 0 -> 115 bytes .../list_pressed_holo_light.9.png | Bin 0 -> 115 bytes .../list_section_divider_holo_dark.9.png | Bin 0 -> 119 bytes .../list_section_divider_holo_light.9.png | Bin 0 -> 115 bytes .../list_selector_disabled_holo_dark.9.png | Bin 0 -> 138 bytes .../list_selector_disabled_holo_light.9.png | Bin 0 -> 130 bytes ...ckground_fill_parent_width_holo_dark.9.png | Bin 0 -> 1155 bytes ...kground_fill_parent_width_holo_light.9.png | Bin 0 -> 863 bytes .../menu_dropdown_panel_holo_dark.9.png | Bin 0 -> 1334 bytes .../menu_dropdown_panel_holo_light.9.png | Bin 0 -> 1306 bytes .../menu_hardkey_panel_holo_dark.9.png | Bin 0 -> 997 bytes .../menu_hardkey_panel_holo_light.9.png | Bin 0 -> 861 bytes .../numberpicker_selection_divider.9.png | Bin 0 -> 101 bytes ...old_switch_thumb_activated_holo_dark.9.png | Bin 0 -> 627 bytes ...ld_switch_thumb_activated_holo_light.9.png | Bin 0 -> 636 bytes .../old_switch_thumb_disabled_holo_dark.9.png | Bin 0 -> 482 bytes ...old_switch_thumb_disabled_holo_light.9.png | Bin 0 -> 453 bytes .../old_switch_thumb_holo_dark.9.png | Bin 0 -> 628 bytes .../old_switch_thumb_holo_light.9.png | Bin 0 -> 558 bytes .../old_switch_thumb_pressed_holo_dark.9.png | Bin 0 -> 644 bytes .../old_switch_thumb_pressed_holo_light.9.png | Bin 0 -> 650 bytes .../res/drawable-xhdpi/overscroll_edge.png | Bin 0 -> 1378 bytes .../res/drawable-xhdpi/overscroll_glow.png | Bin 0 -> 33690 bytes .../drawable-xhdpi/panel_bg_holo_dark.9.png | Bin 0 -> 265 bytes .../drawable-xhdpi/panel_bg_holo_light.9.png | Bin 0 -> 702 bytes .../progress_bg_holo_dark.9.png | Bin 0 -> 123 bytes .../progress_bg_holo_light.9.png | Bin 0 -> 122 bytes .../progress_primary_holo_dark.9.png | Bin 0 -> 1105 bytes .../progress_primary_holo_light.9.png | Bin 0 -> 1104 bytes .../progress_secondary_holo_dark.9.png | Bin 0 -> 128 bytes .../progress_secondary_holo_light.9.png | Bin 0 -> 128 bytes .../progressbar_indeterminate_holo1.png | Bin 0 -> 627 bytes .../progressbar_indeterminate_holo2.png | Bin 0 -> 761 bytes .../progressbar_indeterminate_holo3.png | Bin 0 -> 874 bytes .../progressbar_indeterminate_holo4.png | Bin 0 -> 856 bytes .../progressbar_indeterminate_holo5.png | Bin 0 -> 827 bytes .../progressbar_indeterminate_holo6.png | Bin 0 -> 945 bytes .../progressbar_indeterminate_holo7.png | Bin 0 -> 782 bytes .../progressbar_indeterminate_holo8.png | Bin 0 -> 809 bytes .../rate_star_big_half_holo_dark.png | Bin 0 -> 2358 bytes .../rate_star_big_half_holo_light.png | Bin 0 -> 2526 bytes .../rate_star_big_off_holo_dark.png | Bin 0 -> 1671 bytes .../rate_star_big_off_holo_light.png | Bin 0 -> 1783 bytes .../rate_star_big_on_holo_dark.png | Bin 0 -> 2303 bytes .../rate_star_big_on_holo_light.png | Bin 0 -> 2412 bytes .../rate_star_small_half_holo_dark.png | Bin 0 -> 1114 bytes .../rate_star_small_half_holo_light.png | Bin 0 -> 1158 bytes .../rate_star_small_off_holo_dark.png | Bin 0 -> 1018 bytes .../rate_star_small_off_holo_light.png | Bin 0 -> 1032 bytes .../rate_star_small_on_holo_dark.png | Bin 0 -> 1076 bytes .../rate_star_small_on_holo_light.png | Bin 0 -> 1125 bytes .../scrollbar_handle_holo_dark.9.png | Bin 0 -> 152 bytes .../scrollbar_handle_holo_light.9.png | Bin 0 -> 151 bytes .../scrubber_control_disabled_holo.png | Bin 0 -> 877 bytes .../scrubber_control_focused_holo.png | Bin 0 -> 1381 bytes .../scrubber_control_normal_holo.png | Bin 0 -> 1526 bytes .../scrubber_control_pressed_holo.png | Bin 0 -> 1986 bytes .../scrubber_primary_holo.9.png | Bin 0 -> 131 bytes .../scrubber_secondary_holo.9.png | Bin 0 -> 133 bytes .../scrubber_track_holo_dark.9.png | Bin 0 -> 123 bytes .../scrubber_track_holo_light.9.png | Bin 0 -> 124 bytes .../drawable-xhdpi/spinner_16_inner_holo.png | Bin 0 -> 729 bytes .../drawable-xhdpi/spinner_16_outer_holo.png | Bin 0 -> 808 bytes .../drawable-xhdpi/spinner_20_inner_holo.png | Bin 0 -> 943 bytes .../drawable-xhdpi/spinner_20_outer_holo.png | Bin 0 -> 1007 bytes .../drawable-xhdpi/spinner_48_inner_holo.png | Bin 0 -> 2411 bytes .../drawable-xhdpi/spinner_48_outer_holo.png | Bin 0 -> 2432 bytes .../drawable-xhdpi/spinner_76_inner_holo.png | Bin 0 -> 3869 bytes .../drawable-xhdpi/spinner_76_outer_holo.png | Bin 0 -> 3476 bytes .../spinner_default_holo_dark.9.png | Bin 0 -> 298 bytes .../spinner_default_holo_light.9.png | Bin 0 -> 298 bytes .../spinner_disabled_holo_dark.9.png | Bin 0 -> 285 bytes .../spinner_disabled_holo_light.9.png | Bin 0 -> 283 bytes .../spinner_focused_holo_dark.9.png | Bin 0 -> 496 bytes .../spinner_focused_holo_light.9.png | Bin 0 -> 480 bytes .../spinner_pressed_holo_dark.9.png | Bin 0 -> 451 bytes .../spinner_pressed_holo_light.9.png | Bin 0 -> 446 bytes .../switch_bg_disabled_holo_dark.9.png | Bin 0 -> 136 bytes .../switch_bg_disabled_holo_light.9.png | Bin 0 -> 136 bytes .../switch_bg_focused_holo_dark.9.png | Bin 0 -> 151 bytes .../switch_bg_focused_holo_light.9.png | Bin 0 -> 164 bytes .../drawable-xhdpi/switch_bg_holo_dark.9.png | Bin 0 -> 129 bytes .../drawable-xhdpi/switch_bg_holo_light.9.png | Bin 0 -> 129 bytes .../switch_thumb_activated_holo_dark.9.png | Bin 0 -> 484 bytes .../switch_thumb_activated_holo_light.9.png | Bin 0 -> 484 bytes .../switch_thumb_disabled_holo_dark.9.png | Bin 0 -> 487 bytes .../switch_thumb_disabled_holo_light.9.png | Bin 0 -> 487 bytes .../switch_thumb_holo_dark.9.png | Bin 0 -> 550 bytes .../switch_thumb_holo_light.9.png | Bin 0 -> 550 bytes .../switch_thumb_pressed_holo_dark.9.png | Bin 0 -> 479 bytes .../switch_thumb_pressed_holo_light.9.png | Bin 0 -> 479 bytes .../textfield_activated_holo_dark.9.png | Bin 0 -> 137 bytes .../textfield_activated_holo_light.9.png | Bin 0 -> 137 bytes .../textfield_default_holo_dark.9.png | Bin 0 -> 138 bytes .../textfield_default_holo_light.9.png | Bin 0 -> 138 bytes ...textfield_disabled_focused_holo_dark.9.png | Bin 0 -> 292 bytes ...extfield_disabled_focused_holo_light.9.png | Bin 0 -> 292 bytes .../textfield_disabled_holo_dark.9.png | Bin 0 -> 138 bytes .../textfield_disabled_holo_light.9.png | Bin 0 -> 138 bytes .../textfield_focused_holo_dark.9.png | Bin 0 -> 300 bytes .../textfield_focused_holo_light.9.png | Bin 0 -> 300 bytes ...tfield_multiline_activated_holo_dark.9.png | Bin 0 -> 137 bytes ...field_multiline_activated_holo_light.9.png | Bin 0 -> 137 bytes ...extfield_multiline_default_holo_dark.9.png | Bin 0 -> 138 bytes ...xtfield_multiline_default_holo_light.9.png | Bin 0 -> 138 bytes ...multiline_disabled_focused_holo_dark.9.png | Bin 0 -> 292 bytes ...ultiline_disabled_focused_holo_light.9.png | Bin 0 -> 292 bytes ...xtfield_multiline_disabled_holo_dark.9.png | Bin 0 -> 138 bytes ...tfield_multiline_disabled_holo_light.9.png | Bin 0 -> 138 bytes ...extfield_multiline_focused_holo_dark.9.png | Bin 0 -> 556 bytes ...xtfield_multiline_focused_holo_light.9.png | Bin 0 -> 556 bytes .../res/drawable-xhdpi/toast_frame.9.png | Bin 0 -> 1793 bytes .../drawable/activated_background_holo.xml | 4 + .../res/drawable/activity_picker_bg.xml | 10 + ...ckground_cache_hint_selector_holo_dark.xml | 4 + ...kground_cache_hint_selector_holo_light.xml | 4 + .../res/drawable/background_holo_dark.xml | 3 + .../res/drawable/background_holo_light.xml | 3 + .../res/drawable/btn_checkbox_holo_dark.xml | 16 + .../res/drawable/btn_checkbox_holo_light.xml | 16 + .../res/drawable/btn_default_holo_dark.xml | 9 + .../res/drawable/btn_default_holo_light.xml | 9 + .../res/drawable/btn_group_holo_dark.xml | 4 + .../res/drawable/btn_group_holo_light.xml | 4 + .../res/drawable/btn_radio_holo_dark.xml | 16 + .../res/drawable/btn_radio_holo_light.xml | 16 + .../res/drawable/btn_toggle_holo_dark.xml | 16 + .../res/drawable/btn_toggle_holo_light.xml | 16 + .../res/drawable/edit_text_holo_dark.xml | 9 + .../res/drawable/edit_text_holo_light.xml | 9 + .../library/res/drawable/expander_group.xml | 4 + .../res/drawable/expander_group_holo_dark.xml | 4 + .../drawable/expander_group_holo_light.xml | 4 + .../res/drawable/fastscroll_thumb_holo.xml | 4 + .../drawable/fastscroll_track_holo_dark.xml | 4 + .../drawable/fastscroll_track_holo_light.xml | 4 + .../drawable/item_background_holo_dark.xml | 8 + .../drawable/item_background_holo_light.xml | 8 + ...lector_background_transition_holo_dark.xml | 4 + ...ector_background_transition_holo_light.xml | 4 + .../res/drawable/list_selector_holo_dark.xml | 8 + .../res/drawable/list_selector_holo_light.xml | 8 + .../progress_horizontal_holo_dark.xml | 9 + .../progress_horizontal_holo_light.xml | 9 + ...progress_indeterminate_horizontal_holo.xml | 10 + .../res/drawable/progress_large_holo.xml | 8 + .../res/drawable/progress_medium_holo.xml | 8 + .../res/drawable/progress_small_holo.xml | 8 + .../ratingbar_full_empty_holo_dark.xml | 11 + .../ratingbar_full_empty_holo_light.xml | 11 + .../ratingbar_full_filled_holo_dark.xml | 11 + .../ratingbar_full_filled_holo_light.xml | 11 + .../res/drawable/ratingbar_full_holo_dark.xml | 5 + .../drawable/ratingbar_full_holo_light.xml | 5 + .../res/drawable/ratingbar_holo_dark.xml | 5 + .../res/drawable/ratingbar_holo_light.xml | 5 + .../drawable/ratingbar_small_holo_dark.xml | 5 + .../drawable/ratingbar_small_holo_light.xml | 5 + .../scrubber_control_selector_holo.xml | 8 + ...scrubber_progress_horizontal_holo_dark.xml | 11 + ...crubber_progress_horizontal_holo_light.xml | 11 + .../drawable/spinner_background_holo_dark.xml | 6 + .../spinner_background_holo_light.xml | 6 + .../res/drawable/switch_inner_holo_dark.xml | 8 + .../res/drawable/switch_inner_holo_light.xml | 8 + .../drawable/switch_old_inner_holo_dark.xml | 8 + .../drawable/switch_old_inner_holo_light.xml | 8 + .../res/drawable/switch_track_holo_dark.xml | 6 + .../res/drawable/switch_track_holo_light.xml | 6 + .../library/res/drawable/transparent.xml | 1 + .../res/interpolator/accelerate_cubic.xml | 1 + .../interpolator/accelerate_decelerate.xml | 1 + .../res/interpolator/accelerate_quad.xml | 1 + .../res/interpolator/accelerate_quint.xml | 1 + .../library/res/interpolator/anticipate.xml | 1 + .../res/interpolator/anticipate_overshoot.xml | 1 + .../library/res/interpolator/bounce.xml | 1 + .../library/res/interpolator/cycle.xml | 1 + .../res/interpolator/decelerate_cubic.xml | 1 + .../res/interpolator/decelerate_quad.xml | 1 + .../res/interpolator/decelerate_quint.xml | 1 + .../library/res/interpolator/linear.xml | 1 + .../library/res/interpolator/overshoot.xml | 1 + .../res/layout-sw600dp/date_picker_dialog.xml | 1 + .../res/layout-xlarge/select_dialog_holo.xml | 1 + .../layout-xlarge/select_dialog_item_holo.xml | 1 + .../select_dialog_multichoice_holo.xml | 1 + .../select_dialog_singlechoice_holo.xml | 1 + .../library/res/layout/alert_dialog_holo.xml | 26 + .../res/layout/alert_dialog_progress_holo.xml | 5 + .../library/res/layout/calendar_view.xml | 16 + .../library/res/layout/date_picker_dialog.xml | 1 + .../library/res/layout/date_picker_holo.xml | 8 + .../res/layout/expandable_list_content.xml | 1 + .../res/layout/expanded_menu_layout.xml | 1 + .../library/res/layout/grid_content.xml | 10 + .../library/res/layout/list_content.xml | 10 + .../res/layout/list_menu_item_checkbox.xml | 1 + .../res/layout/list_menu_item_icon.xml | 1 + .../res/layout/list_menu_item_layout.xml | 6 + .../res/layout/list_menu_item_radio.xml | 1 + .../number_picker_with_selector_wheel.xml | 3 + .../res/layout/popup_menu_item_layout.xml | 6 + .../res/layout/progress_dialog_holo.xml | 4 + .../library/res/layout/resolve_list_item.xml | 5 + .../library/res/layout/resolver_grid.xml | 9 + .../library/res/layout/select_dialog_holo.xml | 1 + .../res/layout/select_dialog_item_holo.xml | 1 + .../layout/select_dialog_multichoice_holo.xml | 1 + .../select_dialog_singlechoice_holo.xml | 1 + .../res/layout/simple_dropdown_hint.xml | 1 + .../res/layout/simple_dropdown_item_1line.xml | 1 + .../library/res/layout/simple_list_item_1.xml | 1 + .../library/res/layout/simple_list_item_2.xml | 4 + .../simple_list_item_2_single_choice.xml | 7 + .../layout/simple_list_item_activated_1.xml | 1 + .../layout/simple_list_item_activated_2.xml | 4 + .../res/layout/simple_list_item_checked.xml | 1 + .../simple_list_item_multiple_choice.xml | 1 + .../layout/simple_list_item_single_choice.xml | 1 + .../layout/simple_spinner_dropdown_item.xml | 1 + .../res/layout/simple_spinner_item.xml | 1 + .../library/res/layout/tab_swipe.xml | 1 + .../library/res/layout/time_picker_dialog.xml | 1 + .../library/res/layout/time_picker_holo.xml | 6 + .../library/res/raw/roboto_bold.ttf | Bin 0 -> 163448 bytes .../library/res/raw/roboto_bolditalic.ttf | Bin 0 -> 165864 bytes .../library/res/raw/roboto_italic.ttf | Bin 0 -> 160736 bytes .../library/res/raw/roboto_regular.ttf | Bin 0 -> 158604 bytes .../library/res/values-af/strings.xml | 34 + .../library/res/values-am/strings.xml | 34 + .../library/res/values-ar/strings.xml | 34 + .../library/res/values-be/strings.xml | 34 + .../library/res/values-bg/strings.xml | 34 + .../library/res/values-ca/strings.xml | 34 + .../library/res/values-cs/strings.xml | 34 + .../library/res/values-da/strings.xml | 34 + .../library/res/values-de/strings.xml | 34 + .../library/res/values-el/strings.xml | 34 + .../library/res/values-en-rGB/strings.xml | 34 + .../library/res/values-es-rUS/strings.xml | 34 + .../library/res/values-es/strings.xml | 34 + .../library/res/values-et/strings.xml | 34 + .../library/res/values-fa/strings.xml | 34 + .../library/res/values-fi/strings.xml | 34 + .../library/res/values-fr/strings.xml | 34 + .../library/res/values-h720dp/dimens.xml | 3 + .../library/res/values-hi/strings.xml | 34 + .../library/res/values-hr/strings.xml | 34 + .../library/res/values-hu/strings.xml | 34 + .../library/res/values-in/strings.xml | 34 + .../library/res/values-it/strings.xml | 34 + .../library/res/values-iw/strings.xml | 34 + .../library/res/values-ja/strings.xml | 34 + .../library/res/values-ko/strings.xml | 34 + .../library/res/values-large/config.xml | 3 + .../library/res/values-large/dimens.xml | 4 + .../library/res/values-large/themes.xml | 5 + .../library/res/values-lt/strings.xml | 34 + .../library/res/values-lv/strings.xml | 34 + .../library/res/values-ms/strings.xml | 34 + .../library/res/values-nb/strings.xml | 34 + .../library/res/values-nl/strings.xml | 34 + .../library/res/values-pl/strings.xml | 34 + .../library/res/values-pt-rPT/strings.xml | 34 + .../library/res/values-pt/strings.xml | 34 + .../library/res/values-rm/strings.xml | 10 + .../library/res/values-ro/strings.xml | 34 + .../library/res/values-ru/strings.xml | 34 + .../library/res/values-sk/strings.xml | 34 + .../library/res/values-sl/strings.xml | 34 + .../library/res/values-sr/strings.xml | 34 + .../library/res/values-sv/strings.xml | 34 + .../library/res/values-sw/strings.xml | 34 + .../library/res/values-sw600dp/config.xml | 3 + .../library/res/values-sw600dp/dimens.xml | 6 + .../library/res/values-sw720dp/config.xml | 3 + .../library/res/values-sw720dp/dimens.xml | 6 + .../library/res/values-th/strings.xml | 34 + .../library/res/values-tl/strings.xml | 34 + .../library/res/values-tr/strings.xml | 34 + .../library/res/values-uk/strings.xml | 34 + .../library/res/values-v11/themes.xml | 59 + .../library/res/values-vi/strings.xml | 34 + .../library/res/values-xlarge/dimens.xml | 5 + .../library/res/values-zh-rCN/strings.xml | 34 + .../library/res/values-zh-rTW/strings.xml | 34 + .../library/res/values-zu/strings.xml | 34 + .../library/res/values/attrs.xml | 378 ++++ .../library/res/values/colors.xml | 55 + .../library/res/values/config.xml | 9 + .../library/res/values/dialogs.xml | 149 ++ .../library/res/values/dimens.xml | 13 + .../HoloEverywhere/library/res/values/ids.xml | 11 + .../library/res/values/strings.xml | 35 + .../library/res/values/styles.xml | 404 ++++ .../library/res/values/text.xml | 153 ++ .../library/res/values/themes-core.xml | 263 +++ .../library/res/values/themes.xml | 326 +++ .../android/support/v4/app/_HoloActivity.java | 696 +++++++ .../android/support/v4/app/_HoloFragment.java | 282 +++ .../support/v4/app/_HoloFragmentInflater.java | 119 ++ .../view/menu/ContextMenuBuilder.java | 99 + .../view/menu/ContextMenuCallbackGetter.java | 8 + .../view/menu/ContextMenuDecorView.java | 101 + .../view/menu/ContextMenuItemWrapper.java | 17 + .../view/menu/ContextMenuListener.java | 16 + .../view/menu/ContextMenuWrapper.java | 56 + .../internal/view/menu/ExpandedMenuView.java | 54 + .../view/menu/HoloListMenuItemView.java | 259 +++ .../internal/view/menu/ListMenuPresenter.java | 254 +++ .../internal/view/menu/MenuDialogHelper.java | 131 ++ .../internal/view/menu/PopupMenuHelper.java | 356 ++++ .../actionbarsherlock/view/ContextMenu.java | 19 + .../src/org/holoeverywhere/ArrayAdapter.java | 328 +++ .../org/holoeverywhere/ChooserActivity.java | 42 + .../holoeverywhere/ContentResolverCompat.java | 67 + .../src/org/holoeverywhere/FontLoader.java | 277 +++ .../org/holoeverywhere/HoloEverywhere.java | 73 + .../library/src/org/holoeverywhere/IHolo.java | 21 + .../src/org/holoeverywhere/IHoloActivity.java | 67 + .../src/org/holoeverywhere/IHoloFragment.java | 47 + .../src/org/holoeverywhere/ITabSwipe.java | 61 + .../src/org/holoeverywhere/IntentCompat.java | 59 + .../org/holoeverywhere/LayoutInflater.java | 811 ++++++++ .../holoeverywhere/SystemServiceManager.java | 104 + .../src/org/holoeverywhere/ThemeManager.java | 982 +++++++++ .../holoeverywhere/addon/AddonSherlock.java | 239 +++ .../src/org/holoeverywhere/addon/IAddon.java | 99 + .../holoeverywhere/addon/IAddonActivity.java | 124 ++ .../addon/IAddonApplication.java | 14 + .../holoeverywhere/addon/IAddonAttacher.java | 66 + .../org/holoeverywhere/addon/IAddonBase.java | 27 + .../addon/IAddonBasicAttacher.java | 131 ++ .../holoeverywhere/addon/IAddonFragment.java | 21 + .../holoeverywhere/addon/IAddonThemes.java | 136 ++ .../src/org/holoeverywhere/app/Activity.java | 596 ++++++ .../org/holoeverywhere/app/AlertActivity.java | 53 + .../org/holoeverywhere/app/AlertDialog.java | 514 +++++ .../app/AlertDialogFragment.java | 21 + .../org/holoeverywhere/app/Application.java | 198 ++ .../app/ContextThemeWrapperPlus.java | 24 + .../holoeverywhere/app/DatePickerDialog.java | 125 ++ .../src/org/holoeverywhere/app/Dialog.java | 199 ++ .../holoeverywhere/app/DialogFragment.java | 406 ++++ .../app/ExpandableListActivity.java | 104 + .../src/org/holoeverywhere/app/Fragment.java | 146 ++ .../org/holoeverywhere/app/GridFragment.java | 217 ++ .../org/holoeverywhere/app/ListActivity.java | 106 + .../org/holoeverywhere/app/ListFragment.java | 217 ++ .../holoeverywhere/app/ProgressDialog.java | 314 +++ .../holoeverywhere/app/ResolverActivity.java | 703 +++++++ .../holoeverywhere/app/TabSwipeActivity.java | 156 ++ .../holoeverywhere/app/TabSwipeFragment.java | 305 +++ .../holoeverywhere/app/TimePickerDialog.java | 99 + .../drawable/ColorDrawable.java | 138 ++ .../drawable/DrawableCompat.java | 172 ++ .../drawable/DrawableContainer.java | 643 ++++++ .../drawable/LayerDrawable.java | 584 ++++++ .../drawable/RotateDrawable.java | 300 +++ .../drawable/StateListDrawable.java | 236 +++ .../internal/AlertController.java | 811 ++++++++ .../holoeverywhere/internal/DialogTitle.java | 53 + .../internal/GenericInflater.java | 278 +++ .../internal/NumberPickerEditText.java | 22 + .../internal/WindowDecorView.java | 163 ++ .../org/holoeverywhere/internal/_View.java | 236 +++ .../holoeverywhere/internal/_ViewGroup.java | 52 + .../preference/PreferenceManagerHelper.java | 70 + .../preference/SharedPreferences.java | 154 ++ .../text/AllCapsTransformationMethod.java | 35 + .../text/TransformationMethod.java | 17 + .../org/holoeverywhere/util/ArrayUtils.java | 187 ++ .../src/org/holoeverywhere/util/Arrays.java | 27 + .../holoeverywhere/util/CharSequences.java | 89 + .../util/FastXmlSerializer.java | 385 ++++ .../org/holoeverywhere/util/FinitePool.java | 61 + .../src/org/holoeverywhere/util/Pair.java | 42 + .../src/org/holoeverywhere/util/Pool.java | 8 + .../src/org/holoeverywhere/util/Poolable.java | 12 + .../holoeverywhere/util/PoolableManager.java | 10 + .../src/org/holoeverywhere/util/Pools.java | 26 + .../holoeverywhere/util/ReflectHelper.java | 38 + .../org/holoeverywhere/util/SparseArray.java | 230 +++ .../holoeverywhere/util/SparseIntArray.java | 197 ++ .../holoeverywhere/util/SynchronizedPool.java | 31 + .../org/holoeverywhere/util/WeaklyMap.java | 183 ++ .../src/org/holoeverywhere/util/XmlUtils.java | 658 ++++++ .../org/holoeverywhere/widget/AbsSeekBar.java | 414 ++++ .../org/holoeverywhere/widget/AbsSpinner.java | 382 ++++ .../holoeverywhere/widget/AdapterView.java | 677 ++++++ .../widget/AutoCompleteTextView.java | 722 +++++++ .../widget/BaseExpandableListAdapter.java | 77 + .../src/org/holoeverywhere/widget/Button.java | 84 + .../holoeverywhere/widget/CalendarView.java | 906 +++++++++ .../org/holoeverywhere/widget/CheckBox.java | 84 + .../widget/CheckedTextView.java | 85 + .../org/holoeverywhere/widget/DatePicker.java | 559 +++++ .../org/holoeverywhere/widget/Divider.java | 42 + .../org/holoeverywhere/widget/EditText.java | 98 + .../widget/ExpandableListConnector.java | 594 ++++++ .../widget/ExpandableListPosition.java | 92 + .../widget/ExpandableListView.java | 645 ++++++ .../holoeverywhere/widget/FastScroller.java | 754 +++++++ .../holoeverywhere/widget/FrameLayout.java | 19 + .../org/holoeverywhere/widget/GridView.java | 688 +++++++ .../widget/HeaderViewListAdapter.java | 180 ++ .../widget/HeterogeneousExpandableList.java | 12 + .../holoeverywhere/widget/LinearLayout.java | 1220 +++++++++++ .../widget/ListAdapterWrapper.java | 135 ++ .../widget/ListPopupWindow.java | 858 ++++++++ .../org/holoeverywhere/widget/ListView.java | 1029 ++++++++++ .../widget/MultiAutoCompleteTextView.java | 179 ++ .../holoeverywhere/widget/NumberPicker.java | 1388 +++++++++++++ .../org/holoeverywhere/widget/PopupMenu.java | 102 + .../holoeverywhere/widget/PopupWindow.java | 844 ++++++++ .../holoeverywhere/widget/ProgressBar.java | 870 ++++++++ .../holoeverywhere/widget/RadioButton.java | 84 + .../org/holoeverywhere/widget/Scroller.java | 307 +++ .../org/holoeverywhere/widget/SeekBar.java | 75 + .../widget/SimpleExpandableListAdapter.java | 149 ++ .../org/holoeverywhere/widget/Spinner.java | 699 +++++++ .../src/org/holoeverywhere/widget/Switch.java | 593 ++++++ .../org/holoeverywhere/widget/TextView.java | 84 + .../org/holoeverywhere/widget/TimePicker.java | 464 +++++ .../src/org/holoeverywhere/widget/Toast.java | 48 + .../holoeverywhere/widget/ToggleButton.java | 84 + .../android-support-v4-r13.jar | Bin 0 -> 484258 bytes android/MapsWithMePro/install-run.sh | 14 + 1554 files changed, 76813 insertions(+) create mode 100644 android/.gitignore create mode 100644 android/3rd_party/HoloEverywhere/LICENSE create mode 100644 android/3rd_party/HoloEverywhere/README.md create mode 100644 android/3rd_party/HoloEverywhere/checkstyle.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/.travis.yml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/CHANGELOG.md create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/CONTRIBUTING.md create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/LICENSE.txt create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/README.md create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/RELEASING.md create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/AndroidManifest.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/README.md create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/build.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/libs/android-support-v4-r13.jar create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/lint.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/pom.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/proguard-project.txt create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/project.properties create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/color/abs__primary_text_disable_only_holo_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/color/abs__primary_text_disable_only_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/color/abs__primary_text_holo_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/color/abs__primary_text_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ab_bottom_solid_dark_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ab_bottom_solid_inverse_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ab_bottom_solid_light_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ab_bottom_transparent_dark_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ab_bottom_transparent_light_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ab_share_pack_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ab_share_pack_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ab_solid_dark_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ab_solid_light_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ab_solid_shadow_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ab_stacked_solid_dark_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ab_stacked_solid_light_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ab_stacked_transparent_dark_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ab_stacked_transparent_light_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ab_transparent_dark_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ab_transparent_light_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__btn_cab_done_default_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__btn_cab_done_default_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__btn_cab_done_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__btn_cab_done_focused_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__btn_cab_done_pressed_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__btn_cab_done_pressed_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__cab_background_bottom_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__cab_background_bottom_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__cab_background_top_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__cab_background_top_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_ab_back_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_ab_back_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_cab_done_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_cab_done_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_clear_disabled.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_clear_normal.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_clear_search_api_disabled_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_clear_search_api_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_commit_search_api_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_commit_search_api_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_go.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_go_search_api_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_menu_moreoverflow_normal_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_menu_share_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_menu_share_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_search.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_search_api_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_voice_search.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_voice_search_api_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__list_activated_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__list_divider_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__list_divider_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__list_focused_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__list_longpressed_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__list_pressed_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__list_pressed_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__list_selector_disabled_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__list_selector_disabled_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__menu_dropdown_panel_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__menu_dropdown_panel_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__progress_bg_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__progress_bg_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__progress_primary_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__progress_primary_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__progress_secondary_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__progress_secondary_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__spinner_48_inner_holo.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__spinner_48_outer_holo.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__spinner_ab_default_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__spinner_ab_default_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__spinner_ab_disabled_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__spinner_ab_disabled_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__spinner_ab_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__spinner_ab_focused_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__spinner_ab_pressed_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__spinner_ab_pressed_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__tab_selected_focused_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__tab_selected_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__tab_selected_pressed_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__tab_unselected_pressed_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__textfield_search_default_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__textfield_search_default_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__textfield_search_right_default_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__textfield_search_right_default_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__textfield_search_right_selected_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__textfield_search_right_selected_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__textfield_search_selected_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__textfield_search_selected_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__toast_frame.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ab_bottom_solid_dark_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ab_bottom_solid_inverse_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ab_bottom_solid_light_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ab_bottom_transparent_dark_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ab_bottom_transparent_light_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ab_share_pack_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ab_share_pack_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ab_solid_dark_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ab_solid_light_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ab_solid_shadow_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ab_stacked_solid_dark_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ab_stacked_solid_light_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ab_stacked_transparent_dark_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ab_stacked_transparent_light_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ab_transparent_dark_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ab_transparent_light_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__btn_cab_done_default_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__btn_cab_done_default_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__btn_cab_done_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__btn_cab_done_focused_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__btn_cab_done_pressed_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__btn_cab_done_pressed_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__cab_background_bottom_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__cab_background_bottom_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__cab_background_top_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__cab_background_top_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ic_ab_back_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ic_ab_back_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ic_cab_done_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ic_cab_done_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ic_clear_disabled.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ic_clear_normal.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ic_clear_search_api_disabled_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ic_clear_search_api_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ic_commit_search_api_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ic_commit_search_api_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ic_go.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ic_go_search_api_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ic_menu_moreoverflow_normal_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ic_menu_share_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ic_menu_share_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ic_search.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ic_search_api_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ic_voice_search.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ic_voice_search_api_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__list_activated_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__list_divider_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__list_divider_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__list_focused_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__list_longpressed_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__list_pressed_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__list_pressed_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__list_selector_disabled_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__list_selector_disabled_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__menu_dropdown_panel_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__menu_dropdown_panel_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__progress_bg_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__progress_bg_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__progress_primary_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__progress_primary_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__progress_secondary_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__progress_secondary_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__spinner_48_inner_holo.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__spinner_48_outer_holo.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__spinner_ab_default_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__spinner_ab_default_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__spinner_ab_disabled_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__spinner_ab_disabled_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__spinner_ab_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__spinner_ab_focused_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__spinner_ab_pressed_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__spinner_ab_pressed_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__tab_selected_focused_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__tab_selected_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__tab_selected_pressed_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__tab_unselected_pressed_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__textfield_search_default_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__textfield_search_default_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__textfield_search_right_default_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__textfield_search_right_default_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__textfield_search_right_selected_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__textfield_search_right_selected_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__textfield_search_selected_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__textfield_search_selected_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__toast_frame.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-v11/abs__progress_medium_holo.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ab_bottom_solid_dark_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ab_bottom_solid_inverse_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ab_bottom_solid_light_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ab_bottom_transparent_dark_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ab_bottom_transparent_light_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ab_share_pack_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ab_share_pack_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ab_solid_dark_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ab_solid_light_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ab_solid_shadow_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ab_stacked_solid_dark_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ab_stacked_solid_light_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ab_stacked_transparent_dark_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ab_stacked_transparent_light_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ab_transparent_dark_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ab_transparent_light_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__btn_cab_done_default_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__btn_cab_done_default_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__btn_cab_done_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__btn_cab_done_focused_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__btn_cab_done_pressed_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__btn_cab_done_pressed_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__cab_background_bottom_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__cab_background_bottom_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__cab_background_top_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__cab_background_top_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_ab_back_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_ab_back_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_cab_done_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_cab_done_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_clear_disabled.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_clear_search_api_disabled_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_clear_search_api_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_commit_search_api_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_commit_search_api_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_go.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_go_search_api_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_menu_moreoverflow_normal_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_menu_share_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_menu_share_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_search.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_search_api_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_voice_search.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_voice_search_api_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__list_activated_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__list_divider_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__list_divider_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__list_focused_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__list_longpressed_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__list_pressed_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__list_pressed_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__list_selector_disabled_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__list_selector_disabled_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__menu_dropdown_panel_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__menu_dropdown_panel_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__progress_bg_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__progress_bg_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__progress_primary_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__progress_primary_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__progress_secondary_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__progress_secondary_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__spinner_48_inner_holo.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__spinner_48_outer_holo.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__spinner_ab_default_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__spinner_ab_default_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__spinner_ab_disabled_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__spinner_ab_disabled_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__spinner_ab_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__spinner_ab_focused_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__spinner_ab_pressed_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__spinner_ab_pressed_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__tab_selected_focused_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__tab_selected_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__tab_selected_pressed_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__tab_unselected_pressed_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__textfield_search_default_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__textfield_search_default_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__textfield_search_right_default_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__textfield_search_right_default_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__textfield_search_right_selected_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__textfield_search_right_selected_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__textfield_search_selected_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__textfield_search_selected_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__toast_frame.9.png create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__activated_background_holo_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__activated_background_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__btn_cab_done_holo_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__btn_cab_done_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__ic_clear.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__ic_clear_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__ic_menu_moreoverflow_holo_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__ic_menu_moreoverflow_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__item_background_holo_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__item_background_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__list_selector_background_transition_holo_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__list_selector_background_transition_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__list_selector_holo_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__list_selector_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__progress_horizontal_holo_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__progress_horizontal_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__progress_medium_holo.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__search_dropdown_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__search_dropdown_light.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__spinner_ab_holo_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__spinner_ab_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__tab_indicator_ab_holo.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__textfield_searchview_holo_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__textfield_searchview_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__textfield_searchview_right_holo_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__textfield_searchview_right_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout-large/abs__action_mode_close_item.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout-v14/sherlock_spinner_dropdown_item.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout-v14/sherlock_spinner_item.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout-xlarge/abs__screen_action_bar.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout-xlarge/abs__screen_action_bar_overlay.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__action_bar_home.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__action_bar_tab.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__action_bar_tab_bar_view.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__action_bar_title_item.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__action_menu_item_layout.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__action_menu_layout.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__action_mode_bar.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__action_mode_close_item.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__activity_chooser_view.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__activity_chooser_view_list_item.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__list_menu_item_checkbox.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__list_menu_item_icon.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__list_menu_item_radio.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__popup_menu_item_layout.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__screen_action_bar.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__screen_action_bar_overlay.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__screen_simple.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__screen_simple_overlay_action_mode.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__search_dropdown_item_icons_2line.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__search_view.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__simple_dropdown_hint.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/sherlock_spinner_dropdown_item.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/sherlock_spinner_item.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-land/abs__dimens.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-large-hdpi-1024x600/abs__dimens.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-large-land-hdpi-1024x600/abs__dimens.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-large-land-mdpi-1024x600/abs__dimens.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-large-mdpi-1024x600/abs__dimens.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-sw600dp/abs__bools.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-sw600dp/abs__dimens.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-v11/abs__themes.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-v14/abs__styles.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-v14/abs__themes.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-w360dp/abs__dimens.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-w480dp/abs__bools.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-w480dp/abs__config.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-w500dp/abs__dimens.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-w600dp/abs__dimens.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-xlarge/abs__dimens.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values/abs__attrs.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values/abs__bools.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values/abs__colors.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values/abs__config.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values/abs__dimens.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values/abs__ids.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values/abs__strings.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values/abs__styles.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values/abs__themes.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/android/support/v4/app/Watson.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/ActionBarSherlock.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/app/ActionBar.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/app/SherlockActivity.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/app/SherlockDialogFragment.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/app/SherlockExpandableListActivity.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/app/SherlockFragment.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/app/SherlockFragmentActivity.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/app/SherlockListActivity.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/app/SherlockListFragment.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/app/SherlockPreferenceActivity.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/ActionBarSherlockCompat.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/ActionBarSherlockNative.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/ResourcesCompat.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/app/ActionBarImpl.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/app/ActionBarWrapper.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/Animator.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorListenerAdapter.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorSet.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatEvaluator.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatKeyframeSet.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntEvaluator.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntKeyframeSet.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/Keyframe.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/KeyframeSet.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/ObjectAnimator.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/PropertyValuesHolder.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/TypeEvaluator.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/ValueAnimator.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/view/NineViewGroup.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/view/animation/AnimatorProxy.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineFrameLayout.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineHorizontalScrollView.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineLinearLayout.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/ActionProviderWrapper.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/StandaloneActionMode.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/View_HasStateListenerSupport.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/View_OnAttachStateChangeListener.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenu.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenuItem.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenuItemView.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenuPresenter.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenuView.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/BaseMenuPresenter.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/ListMenuItemView.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/MenuBuilder.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/MenuItemImpl.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/MenuItemWrapper.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/MenuPopupHelper.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/MenuPresenter.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/MenuView.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/MenuWrapper.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/SubMenuBuilder.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/SubMenuWrapper.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/AbsActionBarView.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/ActionBarContainer.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/ActionBarContextView.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/ActionBarView.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/CapitalizingButton.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/CapitalizingTextView.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/CollapsibleActionViewWrapper.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/IcsAbsSpinner.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/IcsAdapterView.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/IcsColorDrawable.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/IcsLinearLayout.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/IcsListPopupWindow.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/IcsProgressBar.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/IcsSpinner.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/IcsToast.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/IcsView.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/ScrollingTabContainerView.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/TabsLinearLayout.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/view/ActionMode.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/view/ActionProvider.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/view/CollapsibleActionView.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/view/Menu.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/view/MenuInflater.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/view/MenuItem.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/view/SubMenu.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/view/Window.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/widget/ActivityChooserModel.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/widget/ActivityChooserView.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/widget/SearchView.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/widget/ShareActionProvider.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/widget/SuggestionsAdapter.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/test/com/actionbarsherlock/internal/ResourcesCompatTest.java create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/checkstyle.xml create mode 100644 android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/pom.xml create mode 100644 android/3rd_party/HoloEverywhere/formatting.xml create mode 100644 android/3rd_party/HoloEverywhere/library/AndroidManifest.xml create mode 100644 android/3rd_party/HoloEverywhere/library/build.xml create mode 100644 android/3rd_party/HoloEverywhere/library/lint.xml create mode 100644 android/3rd_party/HoloEverywhere/library/proguard-project.txt create mode 100644 android/3rd_party/HoloEverywhere/library/project.properties create mode 100644 android/3rd_party/HoloEverywhere/library/res/anim/dialog_enter.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/anim/dialog_exit.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/anim/fade_in.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/anim/fade_out.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/anim/grow_fade_in.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/anim/grow_fade_in_center.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/anim/grow_fade_in_from_bottom.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/anim/shrink_fade_out.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/anim/shrink_fade_out_center.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/anim/shrink_fade_out_from_bottom.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/color/primary_text_disable_only_holo_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/color/primary_text_disable_only_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/color/primary_text_holo_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/color/primary_text_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/color/primary_text_nodisable_holo_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/color/primary_text_nodisable_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/color/secondary_text_holo_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/color/secondary_text_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/color/secondary_text_nodisable_holo_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/color/secondary_text_nodisable_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/color/tertiary_text_holo_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/color/tertiary_text_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/activity_picker_bg_activated.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/activity_picker_bg_focused.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_label_background.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_off_disable_focused_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_off_disable_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_off_disable_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_off_disabled_focused_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_off_disabled_focused_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_off_disabled_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_off_disabled_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_off_focused_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_off_focused_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_off_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_off_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_off_normal_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_off_normal_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_off_pressed_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_off_pressed_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_on_disable_focused_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_on_disable_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_on_disable_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_on_disabled_focused_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_on_disabled_focused_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_on_disabled_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_on_disabled_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_on_focused_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_on_focused_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_on_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_on_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_on_pressed_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_on_pressed_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_default_disabled_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_default_disabled_focused_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_default_disabled_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_default_disabled_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_default_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_default_focused_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_default_normal_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_default_normal_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_default_pressed_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_default_pressed_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_group_disabled_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_group_disabled_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_group_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_group_focused_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_group_normal_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_group_normal_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_group_pressed_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_group_pressed_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_label_background.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_off_disabled_focused_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_off_disabled_focused_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_off_disabled_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_off_disabled_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_off_focused_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_off_focused_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_off_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_off_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_off_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_off_pressed_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_off_pressed_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_on_disabled_focused_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_on_disabled_focused_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_on_disabled_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_on_disabled_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_on_focused_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_on_focused_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_on_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_on_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_on_pressed_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_on_pressed_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_rating_star_off_disabled_focused_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_rating_star_off_disabled_focused_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_rating_star_off_disabled_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_rating_star_off_disabled_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_rating_star_off_focused_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_rating_star_off_focused_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_rating_star_off_normal_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_rating_star_off_normal_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_rating_star_off_pressed_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_rating_star_off_pressed_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_rating_star_on_disabled_focused_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_rating_star_on_disabled_focused_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_rating_star_on_disabled_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_rating_star_on_disabled_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_rating_star_on_focused_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_rating_star_on_focused_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_rating_star_on_normal_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_rating_star_on_normal_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_rating_star_on_pressed_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_rating_star_on_pressed_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_off_disabled_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_off_disabled_focused_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_off_disabled_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_off_disabled_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_off_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_off_focused_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_off_normal_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_off_normal_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_off_pressed_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_off_pressed_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_on_disabled_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_on_disabled_focused_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_on_disabled_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_on_disabled_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_on_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_on_focused_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_on_normal_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_on_normal_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_on_pressed_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_on_pressed_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/day_picker_week_view_dayline_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/dialog_bottom_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/dialog_bottom_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/dialog_divider_horizontal_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/dialog_divider_horizontal_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/dialog_full_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/dialog_full_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/dialog_middle_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/dialog_middle_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/dialog_middle_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/dialog_top_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/dialog_top_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/expander_close_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/expander_close_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/expander_ic_maximized.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/expander_ic_minimized.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/expander_open_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/expander_open_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/fastscroll_label_left_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/fastscroll_label_left_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/fastscroll_label_right_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/fastscroll_label_right_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/fastscroll_thumb_default_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/fastscroll_thumb_pressed_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/fastscroll_track_default_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/fastscroll_track_default_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/fastscroll_track_pressed_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/fastscroll_track_pressed_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/list_activated_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/list_divider_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/list_divider_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/list_focused_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/list_longpressed_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/list_pressed_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/list_pressed_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/list_section_divider_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/list_section_divider_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/list_selector_disabled_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/list_selector_disabled_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/menu_background_fill_parent_width_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/menu_background_fill_parent_width_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/menu_dropdown_panel_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/menu_dropdown_panel_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/menu_hardkey_panel_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/menu_hardkey_panel_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/numberpicker_selection_divider.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/old_switch_thumb_activated_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/old_switch_thumb_activated_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/old_switch_thumb_disabled_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/old_switch_thumb_disabled_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/old_switch_thumb_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/old_switch_thumb_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/old_switch_thumb_pressed_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/old_switch_thumb_pressed_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/overscroll_edge.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/overscroll_glow.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/panel_bg_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/panel_bg_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/progress_bg_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/progress_bg_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/progress_primary_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/progress_primary_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/progress_secondary_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/progress_secondary_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/progressbar_indeterminate_holo1.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/progressbar_indeterminate_holo2.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/progressbar_indeterminate_holo3.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/progressbar_indeterminate_holo4.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/progressbar_indeterminate_holo5.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/progressbar_indeterminate_holo6.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/progressbar_indeterminate_holo7.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/progressbar_indeterminate_holo8.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/rate_star_big_half_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/rate_star_big_half_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/rate_star_big_off_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/rate_star_big_off_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/rate_star_big_on_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/rate_star_big_on_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/rate_star_small_half_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/rate_star_small_half_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/rate_star_small_off_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/rate_star_small_off_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/rate_star_small_on_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/rate_star_small_on_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/scrollbar_handle_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/scrollbar_handle_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/scrubber_control_disabled_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/scrubber_control_focused_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/scrubber_control_normal_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/scrubber_control_pressed_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/scrubber_primary_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/scrubber_secondary_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/scrubber_track_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/scrubber_track_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/spinner_16_inner_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/spinner_16_outer_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/spinner_20_inner_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/spinner_20_outer_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/spinner_48_inner_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/spinner_48_outer_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/spinner_76_inner_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/spinner_76_outer_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/spinner_default_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/spinner_default_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/spinner_disabled_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/spinner_disabled_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/spinner_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/spinner_focused_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/spinner_pressed_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/spinner_pressed_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/switch_bg_disabled_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/switch_bg_disabled_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/switch_bg_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/switch_bg_focused_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/switch_bg_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/switch_bg_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/switch_thumb_activated_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/switch_thumb_activated_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/switch_thumb_disabled_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/switch_thumb_disabled_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/switch_thumb_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/switch_thumb_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/switch_thumb_pressed_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/switch_thumb_pressed_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/textfield_activated_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/textfield_activated_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/textfield_bg_activated_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/textfield_bg_default_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/textfield_bg_disabled_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/textfield_bg_disabled_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/textfield_bg_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/textfield_default_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/textfield_default_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/textfield_disabled_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/textfield_disabled_focused_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/textfield_disabled_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/textfield_disabled_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/textfield_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/textfield_focused_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/textfield_multiline_activated_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/textfield_multiline_default_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/textfield_multiline_disabled_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/textfield_multiline_disabled_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/textfield_multiline_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/toast_frame.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/activity_picker_bg_activated.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/activity_picker_bg_focused.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_label_background.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_off_disable_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_off_disable_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_off_disabled_focused_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_off_disabled_focused_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_off_disabled_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_off_disabled_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_off_focused_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_off_focused_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_off_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_off_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_off_normal_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_off_normal_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_off_pressed_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_off_pressed_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_on_disable_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_on_disable_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_on_disabled_focused_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_on_disabled_focused_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_on_disabled_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_on_disabled_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_on_focused_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_on_focused_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_on_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_on_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_on_pressed_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_on_pressed_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_default_disabled_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_default_disabled_focused_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_default_disabled_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_default_disabled_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_default_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_default_focused_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_default_normal_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_default_normal_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_default_pressed_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_default_pressed_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_group_disabled_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_group_disabled_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_group_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_group_focused_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_group_normal_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_group_normal_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_group_pressed_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_group_pressed_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_label_background.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_off_disabled_focused_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_off_disabled_focused_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_off_disabled_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_off_disabled_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_off_focused_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_off_focused_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_off_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_off_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_off_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_off_pressed_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_off_pressed_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_on_disabled_focused_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_on_disabled_focused_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_on_disabled_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_on_disabled_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_on_focused_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_on_focused_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_on_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_on_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_on_pressed_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_on_pressed_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_rating_star_off_disabled_focused_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_rating_star_off_disabled_focused_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_rating_star_off_disabled_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_rating_star_off_disabled_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_rating_star_off_focused_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_rating_star_off_focused_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_rating_star_off_normal_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_rating_star_off_normal_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_rating_star_off_pressed_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_rating_star_off_pressed_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_rating_star_on_disabled_focused_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_rating_star_on_disabled_focused_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_rating_star_on_disabled_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_rating_star_on_disabled_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_rating_star_on_focused_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_rating_star_on_focused_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_rating_star_on_normal_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_rating_star_on_normal_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_rating_star_on_pressed_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_rating_star_on_pressed_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_off_disabled_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_off_disabled_focused_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_off_disabled_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_off_disabled_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_off_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_off_focused_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_off_normal_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_off_normal_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_off_pressed_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_off_pressed_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_on_disabled_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_on_disabled_focused_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_on_disabled_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_on_disabled_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_on_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_on_focused_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_on_normal_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_on_normal_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_on_pressed_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_on_pressed_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/day_picker_week_view_dayline_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/dialog_bottom_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/dialog_bottom_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/dialog_divider_horizontal_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/dialog_divider_horizontal_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/dialog_full_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/dialog_full_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/dialog_middle_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/dialog_middle_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/dialog_top_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/dialog_top_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/expander_close_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/expander_close_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/expander_ic_maximized.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/expander_ic_minimized.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/expander_open_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/expander_open_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/fastscroll_label_left_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/fastscroll_label_left_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/fastscroll_label_right_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/fastscroll_label_right_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/fastscroll_thumb_default_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/fastscroll_thumb_pressed_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/fastscroll_track_default_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/fastscroll_track_default_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/fastscroll_track_pressed_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/fastscroll_track_pressed_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/list_activated_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/list_divider_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/list_divider_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/list_focused_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/list_longpressed_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/list_pressed_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/list_pressed_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/list_section_divider_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/list_section_divider_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/list_selector_disabled_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/list_selector_disabled_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/menu_background_fill_parent_width_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/menu_background_fill_parent_width_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/menu_dropdown_panel_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/menu_dropdown_panel_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/menu_hardkey_panel_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/menu_hardkey_panel_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/numberpicker_selection_divider.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/old_switch_thumb_activated_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/old_switch_thumb_activated_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/old_switch_thumb_disabled_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/old_switch_thumb_disabled_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/old_switch_thumb_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/old_switch_thumb_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/old_switch_thumb_pressed_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/old_switch_thumb_pressed_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/overscroll_edge.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/overscroll_glow.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/panel_bg_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/panel_bg_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/progress_bg_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/progress_bg_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/progress_primary_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/progress_primary_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/progress_secondary_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/progress_secondary_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/progressbar_indeterminate_holo1.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/progressbar_indeterminate_holo2.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/progressbar_indeterminate_holo3.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/progressbar_indeterminate_holo4.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/progressbar_indeterminate_holo5.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/progressbar_indeterminate_holo6.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/progressbar_indeterminate_holo7.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/progressbar_indeterminate_holo8.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/rate_star_big_half_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/rate_star_big_half_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/rate_star_big_off_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/rate_star_big_off_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/rate_star_big_on_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/rate_star_big_on_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/rate_star_small_half_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/rate_star_small_half_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/rate_star_small_off_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/rate_star_small_off_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/rate_star_small_on_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/rate_star_small_on_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/scrollbar_handle_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/scrollbar_handle_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/scrubber_control_disabled_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/scrubber_control_focused_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/scrubber_control_normal_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/scrubber_control_pressed_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/scrubber_primary_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/scrubber_secondary_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/scrubber_track_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/scrubber_track_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/spinner_16_inner_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/spinner_16_outer_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/spinner_20_inner_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/spinner_20_outer_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/spinner_48_inner_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/spinner_48_outer_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/spinner_76_inner_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/spinner_76_outer_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/spinner_default_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/spinner_default_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/spinner_disabled_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/spinner_disabled_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/spinner_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/spinner_focused_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/spinner_pressed_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/spinner_pressed_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/switch_bg_disabled_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/switch_bg_disabled_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/switch_bg_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/switch_bg_focused_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/switch_bg_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/switch_bg_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/switch_thumb_activated_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/switch_thumb_activated_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/switch_thumb_disabled_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/switch_thumb_disabled_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/switch_thumb_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/switch_thumb_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/switch_thumb_pressed_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/switch_thumb_pressed_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_activated_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_bg_activated_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_bg_default_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_bg_disabled_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_bg_disabled_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_bg_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_default_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_default_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_disabled_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_disabled_focused_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_disabled_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_disabled_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_focused_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_multiline_activated_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_multiline_default_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_multiline_disabled_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_multiline_disabled_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_multiline_focused_holo_dark.9.png create mode 100755 android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/toast_frame.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/activity_picker_bg_activated.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/activity_picker_bg_focused.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_label_background.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_off_disable_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_off_disable_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_off_disabled_focused_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_off_disabled_focused_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_off_disabled_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_off_disabled_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_off_focused_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_off_focused_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_off_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_off_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_off_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_off_normal_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_off_normal_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_off_pressed_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_off_pressed_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_on_disabled_focused_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_on_disabled_focused_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_on_disabled_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_on_disabled_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_on_focused_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_on_focused_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_on_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_on_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_on_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_on_pressed_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_on_pressed_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_default_disabled_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_default_disabled_focused_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_default_disabled_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_default_disabled_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_default_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_default_focused_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_default_normal_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_default_normal_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_default_pressed_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_default_pressed_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_group_disabled_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_group_disabled_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_group_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_group_focused_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_group_normal_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_group_normal_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_group_pressed_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_group_pressed_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_label_background.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_off_disabled_focused_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_off_disabled_focused_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_off_disabled_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_off_disabled_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_off_focused_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_off_focused_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_off_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_off_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_off_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_off_pressed_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_off_pressed_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_on_disabled_focused_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_on_disabled_focused_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_on_disabled_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_on_disabled_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_on_focused_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_on_focused_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_on_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_on_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_on_pressed_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_on_pressed_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_off_disabled_focused_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_off_disabled_focused_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_off_disabled_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_off_disabled_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_off_focused_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_off_focused_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_off_normal_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_off_normal_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_off_pressed_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_off_pressed_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_on_disabled_focused_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_on_disabled_focused_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_on_disabled_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_on_disabled_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_on_focused_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_on_focused_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_on_normal_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_on_normal_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_on_pressed_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_on_pressed_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_off_disabled_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_off_disabled_focused_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_off_disabled_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_off_disabled_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_off_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_off_focused_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_off_normal_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_off_normal_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_off_pressed_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_off_pressed_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_on_disabled_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_on_disabled_focused_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_on_disabled_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_on_disabled_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_on_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_on_focused_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_on_normal_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_on_normal_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_on_pressed_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_on_pressed_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/day_picker_week_view_dayline_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/dialog_bottom_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/dialog_bottom_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/dialog_divider_horizontal_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/dialog_divider_horizontal_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/dialog_full_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/dialog_full_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/dialog_middle_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/dialog_middle_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/dialog_top_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/dialog_top_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/expander_close_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/expander_close_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/expander_ic_maximized.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/expander_ic_minimized.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/expander_open_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/expander_open_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/fastscroll_label_left_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/fastscroll_label_left_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/fastscroll_label_right_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/fastscroll_label_right_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/fastscroll_thumb_default_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/fastscroll_thumb_pressed_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/fastscroll_track_default_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/fastscroll_track_default_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/fastscroll_track_pressed_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/fastscroll_track_pressed_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/list_activated_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/list_divider_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/list_divider_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/list_focused_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/list_longpressed_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/list_pressed_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/list_pressed_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/list_section_divider_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/list_section_divider_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/list_selector_disabled_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/list_selector_disabled_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/menu_background_fill_parent_width_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/menu_background_fill_parent_width_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/menu_dropdown_panel_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/menu_dropdown_panel_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/menu_hardkey_panel_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/menu_hardkey_panel_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/numberpicker_selection_divider.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/old_switch_thumb_activated_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/old_switch_thumb_activated_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/old_switch_thumb_disabled_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/old_switch_thumb_disabled_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/old_switch_thumb_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/old_switch_thumb_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/old_switch_thumb_pressed_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/old_switch_thumb_pressed_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/overscroll_edge.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/overscroll_glow.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/panel_bg_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/panel_bg_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/progress_bg_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/progress_bg_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/progress_primary_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/progress_primary_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/progress_secondary_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/progress_secondary_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/progressbar_indeterminate_holo1.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/progressbar_indeterminate_holo2.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/progressbar_indeterminate_holo3.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/progressbar_indeterminate_holo4.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/progressbar_indeterminate_holo5.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/progressbar_indeterminate_holo6.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/progressbar_indeterminate_holo7.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/progressbar_indeterminate_holo8.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/rate_star_big_half_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/rate_star_big_half_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/rate_star_big_off_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/rate_star_big_off_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/rate_star_big_on_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/rate_star_big_on_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/rate_star_small_half_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/rate_star_small_half_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/rate_star_small_off_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/rate_star_small_off_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/rate_star_small_on_holo_dark.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/rate_star_small_on_holo_light.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/scrollbar_handle_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/scrollbar_handle_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/scrubber_control_disabled_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/scrubber_control_focused_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/scrubber_control_normal_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/scrubber_control_pressed_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/scrubber_primary_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/scrubber_secondary_holo.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/scrubber_track_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/scrubber_track_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/spinner_16_inner_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/spinner_16_outer_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/spinner_20_inner_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/spinner_20_outer_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/spinner_48_inner_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/spinner_48_outer_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/spinner_76_inner_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/spinner_76_outer_holo.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/spinner_default_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/spinner_default_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/spinner_disabled_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/spinner_disabled_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/spinner_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/spinner_focused_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/spinner_pressed_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/spinner_pressed_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/switch_bg_disabled_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/switch_bg_disabled_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/switch_bg_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/switch_bg_focused_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/switch_bg_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/switch_bg_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/switch_thumb_activated_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/switch_thumb_activated_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/switch_thumb_disabled_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/switch_thumb_disabled_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/switch_thumb_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/switch_thumb_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/switch_thumb_pressed_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/switch_thumb_pressed_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/textfield_activated_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/textfield_activated_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/textfield_default_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/textfield_default_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/textfield_disabled_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/textfield_disabled_focused_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/textfield_disabled_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/textfield_disabled_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/textfield_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/textfield_focused_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/textfield_multiline_activated_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/textfield_multiline_activated_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/textfield_multiline_default_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/textfield_multiline_default_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/textfield_multiline_disabled_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/textfield_multiline_disabled_focused_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/textfield_multiline_disabled_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/textfield_multiline_disabled_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/textfield_multiline_focused_holo_dark.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/textfield_multiline_focused_holo_light.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/toast_frame.9.png create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/activated_background_holo.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/activity_picker_bg.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/background_cache_hint_selector_holo_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/background_cache_hint_selector_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/background_holo_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/background_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/btn_checkbox_holo_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/btn_checkbox_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/btn_default_holo_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/btn_default_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/btn_group_holo_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/btn_group_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/btn_radio_holo_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/btn_radio_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/btn_toggle_holo_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/btn_toggle_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/edit_text_holo_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/edit_text_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/expander_group.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/expander_group_holo_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/expander_group_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/fastscroll_thumb_holo.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/fastscroll_track_holo_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/fastscroll_track_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/item_background_holo_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/item_background_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/list_selector_background_transition_holo_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/list_selector_background_transition_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/list_selector_holo_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/list_selector_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/progress_horizontal_holo_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/progress_horizontal_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/progress_indeterminate_horizontal_holo.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/progress_large_holo.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/progress_medium_holo.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/progress_small_holo.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/ratingbar_full_empty_holo_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/ratingbar_full_empty_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/ratingbar_full_filled_holo_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/ratingbar_full_filled_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/ratingbar_full_holo_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/ratingbar_full_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/ratingbar_holo_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/ratingbar_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/ratingbar_small_holo_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/ratingbar_small_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/scrubber_control_selector_holo.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/scrubber_progress_horizontal_holo_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/scrubber_progress_horizontal_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/spinner_background_holo_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/spinner_background_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/switch_inner_holo_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/switch_inner_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/switch_old_inner_holo_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/switch_old_inner_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/switch_track_holo_dark.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/switch_track_holo_light.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/drawable/transparent.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/interpolator/accelerate_cubic.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/interpolator/accelerate_decelerate.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/interpolator/accelerate_quad.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/interpolator/accelerate_quint.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/interpolator/anticipate.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/interpolator/anticipate_overshoot.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/interpolator/bounce.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/interpolator/cycle.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/interpolator/decelerate_cubic.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/interpolator/decelerate_quad.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/interpolator/decelerate_quint.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/interpolator/linear.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/interpolator/overshoot.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/layout-sw600dp/date_picker_dialog.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/layout-xlarge/select_dialog_holo.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/layout-xlarge/select_dialog_item_holo.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/layout-xlarge/select_dialog_multichoice_holo.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/layout-xlarge/select_dialog_singlechoice_holo.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/layout/alert_dialog_holo.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/layout/alert_dialog_progress_holo.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/layout/calendar_view.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/layout/date_picker_dialog.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/layout/date_picker_holo.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/layout/expandable_list_content.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/layout/expanded_menu_layout.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/layout/grid_content.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/layout/list_content.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/layout/list_menu_item_checkbox.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/layout/list_menu_item_icon.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/layout/list_menu_item_layout.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/layout/list_menu_item_radio.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/layout/number_picker_with_selector_wheel.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/layout/popup_menu_item_layout.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/layout/progress_dialog_holo.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/layout/resolve_list_item.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/layout/resolver_grid.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/layout/select_dialog_holo.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/layout/select_dialog_item_holo.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/layout/select_dialog_multichoice_holo.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/layout/select_dialog_singlechoice_holo.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/layout/simple_dropdown_hint.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/layout/simple_dropdown_item_1line.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/layout/simple_list_item_1.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/layout/simple_list_item_2.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/layout/simple_list_item_2_single_choice.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/layout/simple_list_item_activated_1.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/layout/simple_list_item_activated_2.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/layout/simple_list_item_checked.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/layout/simple_list_item_multiple_choice.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/layout/simple_list_item_single_choice.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/layout/simple_spinner_dropdown_item.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/layout/simple_spinner_item.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/layout/tab_swipe.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/layout/time_picker_dialog.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/layout/time_picker_holo.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/raw/roboto_bold.ttf create mode 100644 android/3rd_party/HoloEverywhere/library/res/raw/roboto_bolditalic.ttf create mode 100644 android/3rd_party/HoloEverywhere/library/res/raw/roboto_italic.ttf create mode 100644 android/3rd_party/HoloEverywhere/library/res/raw/roboto_regular.ttf create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-af/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-am/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-ar/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-be/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-bg/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-ca/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-cs/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-da/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-de/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-el/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-en-rGB/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-es-rUS/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-es/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-et/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-fa/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-fi/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-fr/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-h720dp/dimens.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-hi/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-hr/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-hu/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-in/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-it/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-iw/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-ja/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-ko/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-large/config.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-large/dimens.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-large/themes.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-lt/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-lv/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-ms/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-nb/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-nl/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-pl/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-pt-rPT/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-pt/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-rm/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-ro/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-ru/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-sk/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-sl/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-sr/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-sv/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-sw/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-sw600dp/config.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-sw600dp/dimens.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-sw720dp/config.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-sw720dp/dimens.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-th/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-tl/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-tr/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-uk/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-v11/themes.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-vi/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-xlarge/dimens.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-zh-rCN/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-zh-rTW/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values-zu/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values/attrs.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values/colors.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values/config.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values/dialogs.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values/dimens.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values/ids.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values/strings.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values/styles.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values/text.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values/themes-core.xml create mode 100644 android/3rd_party/HoloEverywhere/library/res/values/themes.xml create mode 100644 android/3rd_party/HoloEverywhere/library/src/android/support/v4/app/_HoloActivity.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/android/support/v4/app/_HoloFragment.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/android/support/v4/app/_HoloFragmentInflater.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/ContextMenuBuilder.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/ContextMenuCallbackGetter.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/ContextMenuDecorView.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/ContextMenuItemWrapper.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/ContextMenuListener.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/ContextMenuWrapper.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/ExpandedMenuView.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/HoloListMenuItemView.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/ListMenuPresenter.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/MenuDialogHelper.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/PopupMenuHelper.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/view/ContextMenu.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/ArrayAdapter.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/ChooserActivity.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/ContentResolverCompat.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/FontLoader.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/HoloEverywhere.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/IHolo.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/IHoloActivity.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/IHoloFragment.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/ITabSwipe.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/IntentCompat.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/LayoutInflater.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/SystemServiceManager.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/ThemeManager.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/addon/AddonSherlock.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/addon/IAddon.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/addon/IAddonActivity.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/addon/IAddonApplication.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/addon/IAddonAttacher.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/addon/IAddonBase.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/addon/IAddonBasicAttacher.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/addon/IAddonFragment.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/addon/IAddonThemes.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/Activity.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/AlertActivity.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/AlertDialog.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/AlertDialogFragment.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/Application.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/ContextThemeWrapperPlus.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/DatePickerDialog.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/Dialog.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/DialogFragment.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/ExpandableListActivity.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/Fragment.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/GridFragment.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/ListActivity.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/ListFragment.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/ProgressDialog.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/ResolverActivity.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/TabSwipeActivity.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/TabSwipeFragment.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/TimePickerDialog.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/drawable/ColorDrawable.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/drawable/DrawableCompat.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/drawable/DrawableContainer.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/drawable/LayerDrawable.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/drawable/RotateDrawable.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/drawable/StateListDrawable.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/internal/AlertController.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/internal/DialogTitle.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/internal/GenericInflater.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/internal/NumberPickerEditText.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/internal/WindowDecorView.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/internal/_View.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/internal/_ViewGroup.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/preference/PreferenceManagerHelper.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/preference/SharedPreferences.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/text/AllCapsTransformationMethod.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/text/TransformationMethod.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/ArrayUtils.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/Arrays.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/CharSequences.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/FastXmlSerializer.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/FinitePool.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/Pair.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/Pool.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/Poolable.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/PoolableManager.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/Pools.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/ReflectHelper.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/SparseArray.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/SparseIntArray.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/SynchronizedPool.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/WeaklyMap.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/XmlUtils.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/AbsSeekBar.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/AbsSpinner.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/AdapterView.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/AutoCompleteTextView.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/BaseExpandableListAdapter.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/Button.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/CalendarView.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/CheckBox.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/CheckedTextView.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/DatePicker.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/Divider.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/EditText.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/ExpandableListConnector.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/ExpandableListPosition.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/ExpandableListView.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/FastScroller.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/FrameLayout.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/GridView.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/HeaderViewListAdapter.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/HeterogeneousExpandableList.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/LinearLayout.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/ListAdapterWrapper.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/ListPopupWindow.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/ListView.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/MultiAutoCompleteTextView.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/NumberPicker.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/PopupMenu.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/PopupWindow.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/ProgressBar.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/RadioButton.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/Scroller.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/SeekBar.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/SimpleExpandableListAdapter.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/Spinner.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/Switch.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/TextView.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/TimePicker.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/Toast.java create mode 100644 android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/ToggleButton.java create mode 100644 android/3rd_party/HoloEverywhere/support-library/android-support-v4-r13.jar create mode 100755 android/MapsWithMePro/install-run.sh diff --git a/.gitignore b/.gitignore index 94f75852e0..0fe7dcddcc 100644 --- a/.gitignore +++ b/.gitignore @@ -63,6 +63,9 @@ bada/Maps/Res bada/Maps/Home bada/Maps/*.zip +# android temporal +mobile_api + # android android/bin android/gen diff --git a/android/.gitignore b/android/.gitignore new file mode 100644 index 0000000000..db834245bf --- /dev/null +++ b/android/.gitignore @@ -0,0 +1,10 @@ +#local files +.classpath +.cproject +.project +local.properties + +#dirs +bin/ +gen/ +resbuilder/ \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/LICENSE b/android/3rd_party/HoloEverywhere/LICENSE new file mode 100644 index 0000000000..8b5169554d --- /dev/null +++ b/android/3rd_party/HoloEverywhere/LICENSE @@ -0,0 +1,7 @@ +Copyright (C) 2013 Sergey Shatunov + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/android/3rd_party/HoloEverywhere/README.md b/android/3rd_party/HoloEverywhere/README.md new file mode 100644 index 0000000000..f4579731ef --- /dev/null +++ b/android/3rd_party/HoloEverywhere/README.md @@ -0,0 +1,52 @@ +![HoloEverywhere](http://holoeverywhere.org/github-res/logo.png "HoloEverywhere") + +[![Build Status](https://travis-ci.org/Prototik/HoloEverywhere.png?branch=master)](https://travis-ci.org/Prototik/HoloEverywhere) + +## What is it? +Bringing Holo Theme from Android 4.1 to 2.1 and above. +## Links +[![Play Store](http://holoeverywhere.org/github-res/play_store_button.png)][Play Store] +[![Donate](http://holoeverywhere.org/github-res/donate_button.png)][Donate] + +## How to use? +### [Eclipse](https://github.com/Prototik/HoloEverywhere/wiki/Import-in-IDE#eclipse) +### [Eclipse + Maven](https://github.com/Prototik/HoloEverywhere/wiki/Import-in-IDE#eclipse--maven) +### [IntelliJ IDEA](https://github.com/Prototik/HoloEverywhere/wiki/Import-in-IDE#intellij-idea) + +## Screenshots +![Screenshot 1](https://github.com/Prototik/HoloEverywhere/raw/gh-pages/img/screenshots/1.png "Screenshot 1") +![Screenshot 2](https://github.com/Prototik/HoloEverywhere/raw/gh-pages/img/screenshots/2.png "Screenshot 2") +![Screenshot 3](https://github.com/Prototik/HoloEverywhere/raw/gh-pages/img/screenshots/3.png "Screenshot 3") +![Screenshot 4](https://github.com/Prototik/HoloEverywhere/raw/gh-pages/img/screenshots/4.png "Screenshot 4") +![Screenshot 5](https://github.com/Prototik/HoloEverywhere/raw/gh-pages/img/screenshots/5.png "Screenshot 5") +![Screenshot 6](https://github.com/Prototik/HoloEverywhere/raw/gh-pages/img/screenshots/6.png "Screenshot 6") +![Screenshot 7](https://github.com/Prototik/HoloEverywhere/raw/gh-pages/img/screenshots/7.png "Screenshot 7") +![Screenshot 8](https://github.com/Prototik/HoloEverywhere/raw/gh-pages/img/screenshots/8.png "Screenshot 8") +![Screenshot 9](https://github.com/Prototik/HoloEverywhere/raw/gh-pages/img/screenshots/9.png "Screenshot 9") +![Screenshot 10](https://github.com/Prototik/HoloEverywhere/raw/gh-pages/img/screenshots/10.png "Screenshot 10") + +## Featured implementations + * [Project Euler](https://play.google.com/store/apps/details?id=ie.cathalcoffey.android.projecteuler) + * [Meditation Assistant](https://play.google.com/store/apps/details?id=sh.ftp.rocketninelabs.meditationassistant) + * [Ragnabase MVP](https://play.google.com/store/apps/details?id=com.ragnabase.mvp) + * [noodles - To Do List](https://play.google.com/store/apps/details?id=com.makeramen.noodles) + +Write to [Sergey](mailto:prototypegamez@gmail.com) for add your application to this list. + +## Contact + +Sergey: + * [Email](mailto:prototypegamez@gmail.com "Send email to Sergey") + * [Google Plus](https://plus.google.com/103272077758668000975/posts "Google Plus") + * [Habrahabr](http://habrahabr.ru/users/prototik/) + +Christophe: + * [Google Plus](https://plus.google.com/108315424589085456181/posts "Google Plus") + +## License +MIT License, full text of license see [here][License] + +[Play Store]: https://play.google.com/store/apps/details?id=org.holoeverywhere.demo "Play Store" +[Donate]: https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=X7E7U7HNR36YN&lc=US&item_name=HoloEverywhere¤cy_code=USD&bn=PP%2dDonationsBF%3adonate_button%2epng%3aNonHosted "Donate" +[Build with Maven]: https://github.com/Prototik/HoloEverywhere/wiki/Maven "Build with maven" +[License]: https://raw.github.com/Prototik/HoloEverywhere/master/LICENSE "LGPLv3" diff --git a/android/3rd_party/HoloEverywhere/checkstyle.xml b/android/3rd_party/HoloEverywhere/checkstyle.xml new file mode 100644 index 0000000000..56f743584b --- /dev/null +++ b/android/3rd_party/HoloEverywhere/checkstyle.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/.travis.yml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/.travis.yml new file mode 100644 index 0000000000..480bfd898c --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/.travis.yml @@ -0,0 +1,18 @@ +language: java + +branches: + excludes: + - gh-pages + +notifications: + email: false + +before_install: + - wget http://dl.google.com/android/android-sdk_r20.0.3-linux.tgz + - tar -zxf android-sdk_r20.0.3-linux.tgz + - export ANDROID_HOME=~/builds/JakeWharton/ActionBarSherlock/android-sdk-linux + - export PATH=${PATH}:${ANDROID_HOME}/tools:${ANDROID_HOME}/platform-tools + - TOOLS=$(android list sdk --no-ui | grep "Android SDK Platform-tools" | cut -d"-" -f1) + - android update sdk --filter "$TOOLS" --no-ui --force + - SDK=$(android list sdk --no-ui | grep ", API 14," | cut -d"-" -f1) + - android update sdk --filter "$SDK" --no-ui --force diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/CHANGELOG.md b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/CHANGELOG.md new file mode 100644 index 0000000000..63f84f4375 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/CHANGELOG.md @@ -0,0 +1,496 @@ +Change Log +=============================================================================== + +Version 4.3.1 *(2013-04-28)* +---------------------------- + + * Fix: Importing library into Eclipse as a Maven module now works correctly. + * Prevent dispatching touch events to both action bar and content view on API + 11 and up. + * Add Hebrew and Brazillian translations to i18n module. + + +Version 4.3.0 *(2013-04-15)* +---------------------------- + + * New: FEST module for testing ActionBarSherlock classes. + * New: i18n module for including internationalized strings used by actionbar. + * Removed dialog themes. + * Fix: `SearchView` suggestions now work properly. + * Fix: Prevent rare NPE when restoring state on pre-Honeycomb devices. + * Fix: Correct behavior of `IcsColorDrawable`'s `setAlpha` method. + * Fix: Handle cases where `Locale.ROOT` is not present on pre-Honeycomb. + * Fix: Correct tab measurement edge-case on pre-Honeycomb. + * Use custom Toast layout to ensure consistent look and feel. + * Fix: Prevent monkey runners from uselessly crashing. + * Fix: Do not hold on to old menu items after a call to `invalidateOptionsMenu`. + * Fix: Ensure `ShareActionProvider` works when only one intent is available. + * Fix: Scroll list navigation to the selected item when opened. + + +Version 4.2.0 *(2012-10-07)* +---------------------------- + +**Maven `artifactId` is now 'actionbarsherlock'.** + +Note: The `.Dialog` themes are now deprecated. These will be removed in a future +version of the library. + + * Add `SearchView` widget for standard search interaction (API 8+ only) + * Fix: `ShareActionProvider` in the split action bar no longer fills the entire + screen. + * Fix: `ShareActionProvider` now does file I/O on a background thread. + * Fix: Automatically correct `ColorDrawable` not respecting bounds when used as + a stacked background. + * Fix: Ensure fragments collection is present before dispatching events. + * Fix: XML-defined `onClick` searches the correct context for the declared + method. + * Fix: Ensure action mode start/finish callbacks are invoked on the activity + for the native action bar. + * Fix: Allow tab callbacks to have a fragment transaction instance for any + `FragmentActivity`. + * Fix: Ensure `CollapsibleActionView` callbacks are dispatched in both native + and compatbility action bars. + * Fix: Remove `.ForceOverflow` themes. These never should have been included. + + +Version 4.1.0 *(2012-05-17)* +---------------------------- + + * Fix: Altered technique used for menu event dispatching through the fragment + manager for greater control. + * Fix: Do not dispatch menu creation event if the activity has been destroyed. + * Fix: Correct potential `NullPointerException` when expanding an action item. + * Fix: Correct potential `NullPointerException` when the hardware menu key was + pressed in an activity that is forcing the overflow menu. + * Fix: Do not set a listener on the native action bar tab wrapper unless a + compatibility listener has been set. + * Fix: Ensure the compatibility animation framework is always available on + views even if they were previously detached from the view hierarchy. + + +Version 4.0.2 *(2012-04-15)* +---------------------------- + + * Upgrade to r7 support library. + * Fix: Do not trigger menu creation after `onCreate` if activity is finishing. + * Fix: Prevent overflow from displaying if there are no overflow action items. + * Fix: Long-pressing menu key no longer triggers overflow. + * Fix: Use proper tab state-list drawable to mimic ICS. + * Fix: Ensure dispatching menu creation and preparation to fragments can + properly return `false` when appropriate to avoid rendering artifacts. + * Fix: Properly save and fetch action mode tag on ICS. + * Fix: Add missing density-specific resources for certain asssets and remove + unused assets. + + +Version 4.0.1 *(2012-03-25)* +---------------------------- + + * Add `ShareActionProvider` widget for use as action items. + * Re-add 'Styled' sample to provide a more comprehensive theming example. + * Fix: Do not dispatch options item selection to fragments if the activity + handles the callback. + * Fix: Prevent menu key from opening the overflow menu when an action mode is + currently displayed. + * Fix: Ensure fragment transaction instance is not `null` on initial tab + selection callback. + * Fix: Displaying an action mode while using stacked tab navigation no longer + throws an exception. + * Fix: Using expandable action item callbacks no longer results in a possible + exception on older devices. + + +Version 4.0.0 *(2012-03-07)* +---------------------------- + +Complete rewrite of the library to backport the Android 4.0 action bar. + + * The minimum supported version of Android is now 2.1 (API 7). + * New base activities are provided (e.g., `SherlockActivity` and + `SherlockFragmentActivity`) which extend from the native activities. + * The support library sources are no longer included in the library. You must + include `android-support-v4.jar` in your project separately. + * Theming now mirrors that of the native action bar through the use of multiple + styles rather than through `ab`- and `am`-prefixed attributes in the theme. + * The action bar can be statically attached to an activity view without the + requirement of using one of the provided base activities. + + +Version 3.5.1 *(2012-01-03)* +---------------------------- + + * Fix: `NullPointerException` in `FragmentManager` can no longer occur when an + attempt is being made to save to a `Bundle` that has not yet been created. + * Fix: Pre-3.0 action item submenu dialogs now properly dismiss themselves when + an item of theirs is selected. + + +Version 3.5.0 *(2011-12-18)* +---------------------------- + + * Library now uses the `r6` version of the compatibility library for its base. + Ice Cream Sandwich-specific implementations are currently disabled, however, + but will be added in a future version of the library. + + `MenuCompat`, `MenuItemCompat`, and `ActivityCompat` have be added back in + to ease transition to this library but all their methods and the classes + themselves have been deprecated. + * Rewritten menu and action item support from Ice Cream Sandwich. + + * Removed the need for the custom `Window.FEATURE_ACTION_ITEM_TEXT` flag. + You should now use the `showAsAction` attribute and/or the + `setShowAsAction(int)` method on each `MenuItem` to control whether or + not text is shown + * Action item dividers are now added automatically only when necessary + to distinguish possible confusion between action items. + * Fix: Action views now properly size themselves within the bounded space + of the menu. + + * Fix: List navigation no longer becomes unusable on certain device + configurations. + * Fix: `SubMenu`'s `findItem(int)` method now properly returns the support + version of `MenuItem`. + * Fix: Invisible sub-menu items are no longer shown on the pre-3.0 popup list. + + +Version 3.4.2 *(2001-11-09)* +---------------------------- + + * Fix: Stacked action bar now properly sets the tab bar background based on + the theme. + + +Version 3.4.1 *(2011-11-09)* +---------------------------- + + * The `makeFragmentName` method in `FragmentPagerAdapter` has been changed to + `public` scope to allow for easier access to your fragments that it is + managing. + * Action bar will now animate when calling `show()` or `hide()`. + * `SherlockPreferenceActivity` now provides full fragment and loader support. + * Examples for the plugins are now in their own sample application. + * Fix: Home icon no longer erroneously clipped when it exceeds the size of the + action bar. + * Fix: Tabs will now scroll horizontally to mimic the native action bar + behavior. + * Fix: Plugins now properly DO NOT inline their `R.java` integer constants. + * Fix: Tabs below the action bar are now styled with a default background so + that they do not incorrectly inherit an applied background unless explicity + declared. + + +Version 3.4.0 *(2011-10-30)* +---------------------------- + + * Library now uses the `r4` version of the compatibility library for its base. + Ice Cream Sandwich-specific implementations are currently disabled, however, + but will be added in a future version of the library. + * Context menu callbacks now use the support version of `MenuItem` to maintain + consistency. + * Added preference plugin which provides an action bar enhanced preference + screen. + * Fix: `abHomeLayout` theme attribute is now honored. + * Fix: `onPrepareOptionsMenu` is now properly dispatched upon menu + invalidation. + + +Version 3.3.1 *(2011-10-20)* +---------------------------- + +ADT 14 is now required. Maven 3 is required if building from the command line. + + * XML-defined `onClick` attributes will now check for an `onClick` method that + takes an `android.support.v4.view.MenuItem` instance. + * Tabs on medium screens in landscape now display inline rather than below the + action bar to mirror how Android 4.0 behaves with the same configuration. + * Fix: Menu inflater properly checks activity context for `onClick` method + declared in the XML. + * Fix: Dialog fragment properly saves its `showDialog` state when not being + used as a popup. + * Fix: Return `-1` when in tab navigation but no tab is selected. This brings + the library in line with the post-3.0 behavior. + * Fix: Removing a menu group no longer throws an `IndexOutOfBoundsException`. + * Fix: `getSelectedTab` and `getTabAt` no longer throw `NullPointerException`s + on post-3.0 when no tab was selected or no tab existed at the specified + position, respectively. + * Fix: `findFragmentById` now properly returns fragments attached to + `android.R.id.content` when run on pre-3.0 devices. + + +Version 3.3.0 *(2011-10-11)* +---------------------------- + + * Tabs are now displayed below the action bar on all medium-screen devices and + portrait large-screen devices. + * Fix: Dialog fragments no longer throw an `IllegalStateException` when being + used as a regular fragment (i.e., not as a popup). See + [StackOverflow](http://stackoverflow.com/questions/5637894/dialogfragments-with-devices-api-level-11/7560686#7560686) + for more information. + * Fix: Popping a fragment off of the back stack now properly assigns its parent + activity. + * Fix: An activity result no longer causes a `NullPointerException` when the + target fragment no longer exists. + * Fix: Action item dividers are now properly initially hidden when their + associated action items are as well. + + +Version 3.2.3 *(2011-09-16)* +---------------------------- + + * Fix: Fragments in a `ViewPager` that contributed items to the options menu + were caught in a race condition causing inconsistent results when a new page + was selected. This regression was introduced in version 3.2.2. + + +Version 3.2.2 *(2011-09-15)* +---------------------------- + + * Fix: Side-effects related to using `FragmentMapActivity` due to how it was + referencing resources from the main library. + * Fix: Fragments adjacent to the currently selected fragment in a `ViewPager` + no longer receive context menu events. + * Fix: Eliminate exception when inflating context menus on 3.0+ when using + `getMenuInflater()`. + * Fix: `ViewPager` now determines whether or not an activity menu invalidation + is required independently of whether or not fragments were created or + destroyed. This should fix an edge case where an activity with a `ViewPager` + containing only two fragments would not get its menu properly invalidated. + + +Version 3.2.1 *(2011-09-12)* +---------------------------- + + * Fix: Action mode API incorrectly using the native `Menu` and `MenuItem` + classes causing an easy pitfall for `ClassCastExceptions`. + * Fix: Large action bar backgrounds increasing the size beyond that alloted in + the theme. + + +Version 3.2.0 *(2011-09-05)* +---------------------------- + + * Added support for `MapView` and the Google APIs through the use of + `FragmentMapActivity`. If you are using a map within a fragment you must + ensure it is always attached to an activity which extends from this new base + class. + + Since supporting maps requires compiling against the Google APIs, this + functionality is implemented in the form of a plugin which is to be used + alongside the normal library. You can choose to add it as an additional + library project or by including it as a `.jar`. Maven users may simply + include the additional dependency (artifactId: `plugin-maps`). + * Fix: Fragments adjacent to the currently selected fragment in a `ViewPager` + no longer contribute to the activity menu. + * `ActionBar.Tab` has been changed from an interface to an abstract class to + mirror its native counterpart. + + +Version 3.1.3 *(2011-08-14)* +---------------------------- + + * Renamed all resources to be prefixed with `abs__` to avoid conflicts when + including in your project. + * Fix: Action bar background being set on two views causing artifacts to remain + on screen when the action bar was hidden. + * Fix: Incorrect sub-menu item being selected by default when the sub-menu was + triggered from the native options menu on pre-3.0. + * Fix: `MenuItem.setVisible` now properly updates the associated action item and + native menu item visible state. + * Fix: Adding items to a menu now honors its ordering and category. + * Fix: Fragment options item selected callback now uses the proper version of + `MenuItem`. + + +Version 3.1.2 *(2011-08-07)* +---------------------------- + + * Fix: `MenuItem.getMenuInfo()` was throwing runtime exception. Will now just + return `null`. + * Fix: Dragging over a `WebView` contained in a `ViewPager` would not register. + * Fix: Inflation of context menu incorrectly being handled by the custom menu + inflater for the library. + + +Version 3.1.1 *(2011-07-31)* +---------------------------- + + * Fix: `MenuItem.getSubMenu` now returns a support instance rather than a + native instance. + * Fix: Fragment methods `onAttach` and `onInflate` incorrectly regressed to use + `Activity` instead of a `FragmentActivity` in their method signatures. + * Fix: Retained fragments not being re-attached on pre-3.0 when attached to + `android.R.id.content` upon activity recreation. + * Fix: `onPrepareOptionsMenu` not dispatched to fragments. This still will only + occur if the activity method returns true (which is the default). + * Fix: `Menu.findItem` not returning `null` when the item was not found on + Android 3.0+. + + +Version 3.1.0 *(2011-07-22)* +---------------------------- + +Due to shortcomings in the Android theming system, a small change must be made +in how this library handles themes. If you were using a custom style for +`actionBarStyle` you must now specify its attributes in the root of the theme +and prefix them with 'ab'. + +You can see an example of this in the `SherlockCustom` theme in +`samples/demos/res/values/styles.xml`. + + * Library now uses the `r3` version of the compatibility library for its base. + * `actionBarStyle` is no longer a valid theme attribute (see note above). + * Added the demo project included with the new compatibility library under + `samples/demos/` and merged in the old 'featuredemo'. + * Dividers are now shown on pre-3.0 devices between all action items. + * `Window.FEATURE_ACTION_BAR_OVERLAY` is now honored on pre-3.0 devices. + * Inflation of XML menu resources will now honor `android:actionLayout` and + `android:actionViewClass` attributes. + * Buttons for displaying the determinate and indeterminate progress bars have + been added to the feature toggle demo. + * Added support for indeterminate progress bar. Due to the `final` modifier on + the native type, you must use `setIndeterminateProgressBarVisibility(Boolean)` + and pass `Boolean.TRUE` or `Boolean.FALSE`. + * Fix: `MenuBuilder#removeItem(int)` and `MenuBuilder#findItem(int)` throwing + `IndexOutOfBoundsException`s when the item was not found. + * Fix: Theme attributes for home item data (e.g., icon, logo) will not be + overwritten by the special `MenuItem` instance for home. + * Fix: Native strings can now be specified for an XML menu `` in + `android:title` and `android:titleCondensed`. + * `Window.FEATURE_ENABLE_ACTION_BAR_WATSON_TEXT` is now + `Window.FEATURE_ACTION_BAR_ITEM_TEXT`. + * `Widget.Sherlock.Spinner.DropDown.ActionBar` and + `Widget.Sherlock.Light.Spinner.DropDown.ActionBar` styles are now + `Widget.Sherlock.Spinner` and `Widget.Sherlock.Light.Spinner`, respectively. + * `Widget.Sherlock.ActionBarView_TabXXX` styles are now + `Widget.Sherlock.ActionBar.TabXXX`. + + +Version 3.0.3 *(2011-07-17)* +---------------------------- + +This version is a hotfix for incompatibilities introduced with the SDKs for +3.1 r2 and 3.2 r1. Due to unavoidable changes in the underlying SDK, the library +must now be compiled against API level 13. + + * `actionModeStyle` and `actionModePopupWindowStyle` are no longer valid theme + attributes. + + +Version 3.0.2 *(2011-06-23)* +---------------------------- + + * Sub-menus for action items are now shown in a list dialog. + * Moved certain classes to the `com.actionbarsherlock.internal` package which + were not meant for public consumption. Despite being given `public` scope in + this new package, these classes should **NOT** be used under any circumstances + as their API can be considered highly volatile and is subject to change often + and without warning. + + +Version 3.0.1 *(2011-06-08)* +---------------------------- + + * Fix: `onOptionsItemSelected()` not being called in fragments if the activity + version returns `false`. + * Fix: `onCreateOptionsMenu()` not being called in fragments on Android 3.0+. + * New: Enable action item text display on pre-Android 3.0 by calling + `requestWindowFeature` with `Window.FEATURE_ENABLE_ACTION_BAR_WATSON_TEXT`. + * Fix: `setCustomView()` no longer automatically enables the custom view on + pre-3.0. You must call `setDisplayShowCustomEnabled()` in order to display + the view. + + +Version 3.0.0 *(2011-06-05)* +---------------------------- + +The API has been rewritten to mimic that of the native action bar. As a result, +usage now only requires changing a few imports to use the support versions +of classes and calling `getSupportActionBar()`. See the README for more info. + +The rewrite necessitated tight interaction with the +[compatibility library](http://android-developers.blogspot.com/2011/03/fragments-for-all.html) +to the point where its sources are now included. You are no longer required to +have the standalone `.jar` file. + +Also included is a default custom action bar for use by default on pre-3.0 +devices. This custom implementation is based off of Johan Nilsson's +[Android-ActionBar](https://github.com/johannilsson/android-actionbar) and the +[work that I have done](https://github.com/johannilsson/android-actionbar/pull/25) +on it. + +More details are available at http://actionbarsherlock.com + + +Version 2.1.1 *(2011-03-21)* +---------------------------- + +**No changes to library code.** + + * Moved library to the root of the repository. + * Added `samples/dependencies.py` script to automatically download the needed + dependencies for the sample projects. + + +Version 2.1.0 *(2011-03-21)* +---------------------------- + +**WARNING**: The +[Android Compatibility Library (v4)](http://android-developers.blogspot.com/2011/03/fragments-for-all.html) +is now required. + + * Added `ActionBarSherlock.Activity`, `ActionBarSherlock.FragmentActivity`, + and `ActionBarSherlock.ListActivity` for extension by implementing + activities, the latter of which is deprecated. This affords a much tighter + integration and allows for the use of other new features listed below. + * New API method: `layout(Fragment)` will use the fragment argument as the + content to the activity. + * New API method: `menu(int)` allows for the inflation of menu XMLs from a + resource. For the non-native implementation, the XML can be inflated to a + custom Menu which can then be applied appropriately to the third-party + action bar. Sub-menus are also supported. Third-party action bar handlers + should implement `ActionBarSherlock.HasMenu` for this functionality. *This + feature requires that activities extend from one of the provided activity + base classes.* + * New API method: `homeAsUp(boolean)`. This mimics the native method + `setDisplayHomeAsUpEnalbed` on the native action bar. Third-party action bar + handlers should implement `ActionBarSherlock.HasHomeAsUp` for this + functionality. + * New API method: `useLogo(boolean)` will trigger the action bar to hide the + application icon/home button and title and show a larger logo representing + the application. Third-party action bar handlers should implement + `ActionBarSherlock.HasLogo` for this functionality. + * New API method: `listNavigation(SpinnerAdapter, OnNavigationListener)`. Tells + the action bar to use drop-down style navigation with the specified list of + items and callback listener. Third-party action bar handlers should + implement `ActionBarSherlock.HasListNavigation` for this functionality. + * Javadocs are now available at + [jakewharton.github.com/ActionBarSherlock](http://jakewharton.github.com/ActionBarSherlock/). + * A standalone JAR is now available via the + [GitHub downloads page](https://github.com/JakeWharton/ActionBarSherlock/downloads) + or in my + [personal maven repository](http://r.jakewharton.com/maven/) + as `com.jakewharton:android-actionbarsherlock:2.1.0`. + + +Version 2.0.1 *(2011-03-11)* +---------------------------- + + * Use `Class.forName()` for detection of native action bar. This provides + compatability all the way back to Android 1.5. + + +Version 2.0.0 *(2011-03-09)* +---------------------------- +Complete rewrite! + + * New and better API. + * More sane logic and attachment to activity. + * Extensible via generics. Implement any ActionBar or roll your own with + minimal effort. + * Now a library project for easy inclusion in applications. + + +Version 1.0.0 *(2011-03-07)* +---------------------------- +Initial release. diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/CONTRIBUTING.md b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/CONTRIBUTING.md new file mode 100644 index 0000000000..30d383364e --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/CONTRIBUTING.md @@ -0,0 +1,11 @@ +Contributing +============ + +If you would like to contribute code to ActionBarSherlock you can do so through +GitHub by forking the repository and sending a pull request. + +When submitting code, please make every effort to follow existing conventions +and style in order to keep the code as readable as possible. Please also make +sure your code compiles by running `mvn clean verify`. Checkstyle failures +during compilation indicate errors in your style and can be viewed in the +`checkstyle-result.xml` file. diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/LICENSE.txt b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/LICENSE.txt new file mode 100644 index 0000000000..d645695673 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/README.md b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/README.md new file mode 100644 index 0000000000..6506c361d2 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/README.md @@ -0,0 +1,60 @@ +ActionBarSherlock +================= + +ActionBarSherlock is an standalone library designed to facilitate the use of +the action bar design pattern across all versions of Android through a single +API. + +The library will automatically use the [native ActionBar][2] implementation on +Android 4.0 or later. For previous versions which do not include ActionBar, a +custom action bar implementation based on the sources of Ice Cream Sandwich +will automatically be wrapped around the layout. This allows you to easily +develop an application with an action bar for every version of Android from 2.x +and up. + +**See http://actionbarsherlock.com for more information.** + +![Example Image][3] + +Try out the sample applications on the Android Market: [Feature Demos][4], +[Fragments][5], and [RoboGuice][6]. + +Continuous integration is provided by [Travis CI][7]. + + + +Developed By +============ + +* Jake Wharton - + + + +License +======= + + Copyright 2012 Jake Wharton + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + + + [1]: http://android-developers.blogspot.com/2011/03/fragments-for-all.html + [2]: http://developer.android.com/guide/topics/ui/actionbar.html + [3]: http://actionbarsherlock.com/static/feature.png + [4]: https://play.google.com/store/apps/details?id=com.actionbarsherlock.sample.demos + [5]: https://play.google.com/store/apps/details?id=com.actionbarsherlock.sample.fragments + [6]: https://play.google.com/store/apps/details?id=com.actionbarsherlock.sample.roboguice + [7]: https://travis-ci.org/JakeWharton/ActionBarSherlock diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/RELEASING.md b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/RELEASING.md new file mode 100644 index 0000000000..7fe25faf46 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/RELEASING.md @@ -0,0 +1,24 @@ +ActionBarSherlock Release Process +================================= + + 1. Make sure she builds! + + mvn clean verify + + 2. Ensure the `CHANGELOG.md` file has up-to-date information and the current date. + 3. Pull in the latest translations in the i18n module. + 4. Change all of the sample `AndroidManifest.xml` files to the correct version and bump the + version code arbitrarily. + + find actionbarsherlock-samples -name AndroidManifest.xml -exec sed -i '' 's|versionCode="[0-9]*"|versionCode="431"|g' {} \; + find actionbarsherlock-samples -name AndroidManifest.xml -exec sed -i '' 's|versionName="[0-9.]*"|versionName="4.3.1"|g' {} \; + + 5. Make the release! + + mvn clean release:clean + mvn release:prepare release:perform + + 6. Promote the Maven artifact on Sonatype's OSS Nexus install. + 7. Deploy the latest website. + + ./deploy_website.sh diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/AndroidManifest.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/AndroidManifest.xml new file mode 100644 index 0000000000..7b8a848240 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/AndroidManifest.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/README.md b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/README.md new file mode 100644 index 0000000000..e8a2c080e6 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/build.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/build.xml new file mode 100644 index 0000000000..2af40096c4 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/build.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/libs/android-support-v4-r13.jar b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/libs/android-support-v4-r13.jar new file mode 100644 index 0000000000000000000000000000000000000000..428bdbc02a1aa32649e236e0734261bd68bc4e6f GIT binary patch literal 484258 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ПpHSAC30$g7yH$GiAcgHdf4hoNNNW2%pqu zqm$p?=GRMDf)wGe9H;r09RK&TjQ_Hv_fKyvIs3o#YMlOcZ8BTg>aQr}Re~xWmlV(? zs?N)M$fu!?PsQp%u!|&~RYs>FD#&9D94X_agdk;f?l|+*?Cc_nlWWB`!pX#_YNFxmH!C(N&tDvv;ZIOL8 zln~KycEM#t!65H6S7MIYG1cwkgJToX#!Uh7nD!v1YT~^O=yH5Baka@kZ`|#wbwy64 zGVk<#aTEU{gwHCimv*-{QOZ?=)-Oy$&YhLoiUXUqt?e~0l(rlvXm9#ypZqrh49bO8 zjF;);Ui~<$*V=Q*=8>KT7=_m#BR!X@Hr2?#-iNrqTp^2UeGL5SZhpy­S=@2b9k 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�@v;$9bpl_%m}> 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

f4)&8pa{MTrd^Bdt^+KRphNNz9%3le_j=ZTL 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 z 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 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/lint.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/lint.xml new file mode 100644 index 0000000000..fe7707cf72 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/lint.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/pom.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/pom.xml new file mode 100644 index 0000000000..f9c9407c3f --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/pom.xml @@ -0,0 +1,137 @@ + + + + 4.0.0 + + + com.actionbarsherlock + parent + 4.3.1 + ../pom.xml + + + actionbarsherlock + ActionBarSherlock + apklib + + + + com.google.android + android + provided + + + com.google.android + support-v4 + + + + junit + junit + test + + + org.easytesting + fest-assert-core + test + + + org.robolectric + robolectric + test + + + + + src + test + + + + com.jayway.maven.plugins.android.generation2 + android-maven-plugin + true + + + + org.apache.maven.plugins + maven-javadoc-plugin + + true + + + + + com.google.code.maven-replacer-plugin + maven-replacer-plugin + + + 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.codehaus.mojo + build-helper-maven-plugin + + + 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/proguard-project.txt b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/proguard-project.txt new file mode 100644 index 0000000000..f2fe1559a2 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/proguard-project.txt @@ -0,0 +1,20 @@ +# To enable ProGuard in your project, edit project.properties +# to define the proguard.config property as described in that file. +# +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in ${sdk.dir}/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the ProGuard +# include property in project.properties. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/project.properties b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/project.properties new file mode 100644 index 0000000000..0e58ae1c0d --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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-17 diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/color/abs__primary_text_disable_only_holo_dark.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/color/abs__primary_text_disable_only_holo_dark.xml new file mode 100644 index 0000000000..048dc6e591 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/color/abs__primary_text_disable_only_holo_dark.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/color/abs__primary_text_disable_only_holo_light.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/color/abs__primary_text_disable_only_holo_light.xml new file mode 100644 index 0000000000..6aae62863d --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/color/abs__primary_text_disable_only_holo_light.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/color/abs__primary_text_holo_dark.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/color/abs__primary_text_holo_dark.xml new file mode 100644 index 0000000000..9d6a3f237b --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/color/abs__primary_text_holo_dark.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/color/abs__primary_text_holo_light.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/color/abs__primary_text_holo_light.xml new file mode 100644 index 0000000000..09802fdff8 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/color/abs__primary_text_holo_light.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ab_bottom_solid_dark_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ab_bottom_solid_dark_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ab_bottom_solid_light_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ab_bottom_solid_light_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ab_bottom_transparent_dark_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ab_bottom_transparent_dark_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ab_bottom_transparent_light_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ab_bottom_transparent_light_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ab_share_pack_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ab_share_pack_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..81b87b86c959a98c478177270c979763831ebf66 GIT binary patch literal 2863 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 N002ovPDHLkV1kHdRS^IH literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ab_share_pack_holo_light.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ab_share_pack_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..8fc83e22efde5509c563c97a836d869d05ff5dc6 GIT binary patch literal 2859 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 JPDHLkV1neRPs;!R literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ab_solid_dark_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ab_solid_dark_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ab_stacked_transparent_dark_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ab_stacked_transparent_dark_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ab_stacked_transparent_light_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ab_stacked_transparent_light_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ab_transparent_dark_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ab_transparent_dark_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ab_transparent_light_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ab_transparent_light_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__btn_cab_done_pressed_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__btn_cab_done_pressed_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..66adffed632f0f6267afe6dc2f518adb6a83ca4a GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^EI_Qo!3HFq_#{<Lb literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__cab_background_bottom_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__cab_background_bottom_holo_dark.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__cab_background_bottom_holo_light.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__cab_background_bottom_holo_light.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__cab_background_top_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__cab_background_top_holo_dark.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__cab_background_top_holo_light.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__cab_background_top_holo_light.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_ab_back_holo_dark.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_ab_back_holo_dark.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_ab_back_holo_light.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_ab_back_holo_light.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_cab_done_holo_dark.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_cab_done_holo_dark.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_cab_done_holo_light.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_cab_done_holo_light.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_clear_disabled.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_clear_disabled.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_clear_normal.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_clear_normal.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_clear_search_api_disabled_holo_light.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_clear_search_api_disabled_holo_light.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_clear_search_api_holo_light.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_clear_search_api_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..90db01b5bcf1246d6a94e83930cac63c93a6cf83 GIT binary patch literal 1540 zcmbVMeM}Q)7(Y=F%P>l6wi%|!l_|z@AEl-3t(BF#o>nN3LV!6Gj`m7V?OnYdwt!49 znSha?!(a?-ZbQt1aiUJQshMnS5#lskP=esLYSf@naft@zobD}B-5p2-N!r(2Pv-l0Xh0V+cH{ zBCj_i&zvf<=fadIaj*`>Q=E7j4yO?)k*d|}^=epy6F7!zFhY|;=*d(KiR19pg8*xi z%S}3HX37@WnGugH`$!B61OjLv6&0m&j4&FFVGfNZ1!$!BD+QSirU-sjgn{P#PKo!) zyePn7Mz&0>kj)72^jQdApWXhPSny9J3Zx7RvObJJam?!t$2F<#mmS;-H(sjk&#&}x zn1l0+6_OLw!>x*dLGE5{D69y)A#)@i6ouVDi_Qu!C&)J1jDQ=|#k)wHFyI8C*W!8& zo@O9G_*#m#(ncLk5wuRDi*URQYq45zkaC7$D25%CeFo3 zq8FabFUh~eK27K~6vb#VEHC1w7(*&OMYE%YZoXWL^{OtY6DOvBgsXZor;+pCKQtKq#@Yve*CfR+fr{_{8B9ptb8gkK z%ULbS=hkX#6P4u07w&nq!(Erw700WC$5)#d&8Z*xO$anUywM8X%;|F;}vpSN{JH^dZ%bO*Y+E_$@+l9v9er1)=9rDDlZ^_h;vo|CVI z?rvVb&$hTl?AAji%>~Hy)*)-Pauu3ldM%&)Z$xHfTKD zyVr^=X!?Dg@AQgMK?U!MZESw;m{+5X-^QKZnN?hof%lxLslBZFb<}vvcfGCr&M()E oGsi!#`|0>*OK8j7iTF}z;g*rN|9V1g4gZ&I)@=IAjMA5uFcs*D%W|cCj125Y$<-R)w+qs7}Yb?2Vpf=11nv3>8egx3Vn#S@pj8KhqR6 zG&EkkPhF*!8m+pTbC#dqiL_;DEXCrpx146woqFTqHxbD;9*+#ciDJuU9g+FiWw>gS zVB|+zwvro%KBPtN4f`h5(PAcTQ*_KY*3L^aYPv-~hnU})iiG*xW}TjAax7EU9No_B za>V+1kL8m|c0tZ*b`x|Nx^tDUT%G&w>a}foUzSY#K-<6eKL1*7+-p{Sv zk!_>Mn#{B)OMQRf|DtR4pA=Yu;IDNplVZ*;1ry%#Z@^GjEpd$~Nl7e8wMs5Z1yT$~ z28M>Z1{S)8W+8?KR;ET)rWU#e=2iv<8Lyj~Q8eV{r(~v8;?^L!&B`9AK@wy`aDG}z od16s2gJVj5QmTSyZen_BP-lj^I5jl^ z$;g>OGbAc|*BLC_!^W%}l=wi_;R6c?C(DXghXh=iT(a7h9Q>lbZLt^6k2Rh(@5*c6 zHXMKa@sI7ISBclZ^f7g4v-++!nvywl7H1a^qxa&h<6Bln#?D-z9l&w!rmCug(G@ZN zip9Q7GZtOTkTBkMLotE%Ap51guFq@(T<`L`*la!%elyI~YHMj96Gz4KdA#Rtq&IX- zJ!-CcHCZcQi^K=d6Pk+VB`+?kXd4^!8_I4vAS@W3b2+)+&M5pw&$`OV#YdHxt?me2 zN}j57|J}PgEE5>@OGUOd?U}p&9hbOcTS@p0ju6Y&%17t!J>;gaCGni-#Jz`f0#sCP zRhEXB@N_$S%`U6cJhE9tXb9`;Qei|6B4IGHXPC zsx8m}MucjKYeY#(Vo9o1a#1RfVlXl=G}JY)&^0s-F*3F?u&^>U)ip4;GB9Y@Qqo7! zkei>9nO2Eg!?*HTlYtr}K{f>ErbP0l+XkK3vuSJ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_go.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_go.png new file mode 100644 index 0000000000000000000000000000000000000000..97b825e83173c3c8efc593f11e3c7df839631291 GIT binary patch literal 1415 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 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_menu_moreoverflow_normal_holo_light.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_menu_moreoverflow_normal_holo_light.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_menu_share_holo_dark.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_menu_share_holo_dark.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_menu_share_holo_light.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_menu_share_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..682b2fdec4cdcffe042a0eaba5574fcb553c6fab GIT binary patch literal 505 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 AsQ>@~ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_voice_search_api_holo_light.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__ic_voice_search_api_holo_light.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__list_activated_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__list_activated_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__list_divider_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__list_divider_holo_dark.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__list_divider_holo_light.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__list_divider_holo_light.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__list_focused_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__list_focused_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__list_longpressed_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__list_longpressed_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__list_pressed_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__list_pressed_holo_dark.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__list_pressed_holo_light.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__list_pressed_holo_light.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__list_selector_disabled_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__list_selector_disabled_holo_dark.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__menu_dropdown_panel_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__menu_dropdown_panel_holo_dark.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__menu_dropdown_panel_holo_light.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__menu_dropdown_panel_holo_light.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__progress_bg_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__progress_bg_holo_dark.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__progress_bg_holo_light.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__progress_bg_holo_light.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__progress_primary_holo_light.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__progress_primary_holo_light.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__progress_secondary_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__progress_secondary_holo_dark.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__progress_secondary_holo_light.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__progress_secondary_holo_light.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__spinner_48_inner_holo.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__spinner_48_inner_holo.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__spinner_48_outer_holo.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__spinner_48_outer_holo.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__spinner_ab_default_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__spinner_ab_default_holo_dark.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__spinner_ab_default_holo_light.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__spinner_ab_default_holo_light.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__spinner_ab_disabled_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__spinner_ab_disabled_holo_dark.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__spinner_ab_disabled_holo_light.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__spinner_ab_disabled_holo_light.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__spinner_ab_focused_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__spinner_ab_focused_holo_dark.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__spinner_ab_focused_holo_light.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__spinner_ab_focused_holo_light.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__spinner_ab_pressed_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__spinner_ab_pressed_holo_dark.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__tab_selected_focused_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__tab_selected_focused_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__tab_selected_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__tab_selected_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__tab_unselected_pressed_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__tab_unselected_pressed_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__textfield_search_right_default_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__textfield_search_right_default_holo_dark.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__textfield_search_right_default_holo_light.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__textfield_search_right_default_holo_light.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__textfield_search_right_selected_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__textfield_search_right_selected_holo_dark.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__textfield_search_right_selected_holo_light.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__textfield_search_right_selected_holo_light.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__textfield_search_selected_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__textfield_search_selected_holo_dark.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__textfield_search_selected_holo_light.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-hdpi/abs__textfield_search_selected_holo_light.9.png new file mode 100644 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`(RCt{2olS1zMi53nQlgTD7hYzO zEbLhfJU5sFr<>s%(zUb>_$paf@S`0;M z@Z5(Dp8HPAQ}#a>7%{ZjiL#Yw6{xLbj7s?ti$GFVIF<;ittA==6^lroM6qIpVnoUh z9g$j78oWwW^lgnqBRS6iPb52m))K7&tnTjaKHuKn{<+y~K7H56GUzY=>=%J^Y#*PNQB~E?05NT*;ME+tT4PHpCpo9q4s1V%O)m~E0Yz;yY#n90IT!7 zcajlyeNejqI5MS%Hhc9(kv;|zkwz~vheQJW=p@SkWZA@qHJ4aK(rvq@M3znHdsARS zL<)UztA!%VCN;rMPPR3ve_$iaWoqAdW1|a2`dCcv?^A{;inM$t_c7-?WEQ*yNvS<6 z8I3*;-sC#?pRZ#g66GODIJA*jph#pEC=!_kibQ6CB9U33NMshqh{Q~jB;`P1Me>pi zOgSN04x#>clSpuABeQUdNQ_F$XL28p6)AbkE?E?l`#UDmm<(QInN03`Pb8b_%}a$s zmW}lD=oEmVh-444xpc^~vHhLQBROSglan%!&GI=Q9hC;?yC*fF%wCe!i!2-IXB(A* zGIbiaeuILs+NH2{|h370@KlJ6tzLwWyA4$e#Z}%nd zkDjJ9cojs1`42$d*Z=mlyr!kHkt&*K%g&GF;5~+S+sc0O#%wwi-V2upcDf?{sb#8F z5pnEXX;co$P~u5RnR~!+*wb%nk8n;MexH{IHm|lPlP=zn7F?k8B9fOc&|daiv%Q?# zj7E78ib{I4u|nx(fM`^TrKr&|$t8bbwrP>{lK^xiqDXlloo}zi?VQO*B0IFX#3GWk z?Mk+_`T%DBzZ6pIgQ1dKn2b%frH+ZDAB4hZk>rh?1AEURX##a}LDGuUVK{v0a0u0I zF??DMpN@1HSQ+eMqZKD6QE(l}z9u!F*R~vNRMKrL&7|kGg*w`b5KFvdqYov@8!JNS zvfi5$xe@{C#G*Eod69<#T_!Q1;IyNpI^Av$r8-INL-HUv$AK?RXrCi;?darRzy~L* de(Smp{{tYnj7r@g(8vG)002ovPDHLkV1ja;ZoU8j literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ab_bottom_solid_dark_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ab_bottom_solid_dark_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..b2293670b7fd0f1d20efadcb85df764eaf8f996c GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%zMd|QAs)xyUNz)8;K0FpacBG8 z{r_dveK(bI?AYL#c;KCB(}&!U`A=evwJLPDoBk{4*AEnmdKI;Vst0H2gA*Z=?k literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ab_bottom_solid_light_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ab_bottom_solid_light_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ab_bottom_transparent_dark_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ab_bottom_transparent_dark_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ab_bottom_transparent_light_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ab_bottom_transparent_light_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ab_share_pack_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ab_share_pack_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..738cb38d072137cb68723c576a801e3f3471bd3e GIT binary patch literal 2849 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 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ab_share_pack_holo_light.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ab_share_pack_holo_light.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ab_solid_dark_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ab_solid_dark_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ab_solid_light_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ab_solid_light_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ab_solid_shadow_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ab_solid_shadow_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ab_stacked_solid_dark_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ab_stacked_solid_dark_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ab_stacked_solid_light_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ab_stacked_solid_light_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ab_stacked_transparent_dark_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ab_stacked_transparent_dark_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ab_stacked_transparent_light_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ab_stacked_transparent_light_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__btn_cab_done_default_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__btn_cab_done_default_holo_dark.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__btn_cab_done_default_holo_light.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__btn_cab_done_default_holo_light.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__btn_cab_done_focused_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__btn_cab_done_focused_holo_dark.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__btn_cab_done_pressed_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__btn_cab_done_pressed_holo_dark.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__btn_cab_done_pressed_holo_light.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__btn_cab_done_pressed_holo_light.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__cab_background_bottom_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__cab_background_bottom_holo_dark.9.png new file mode 100644 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!M2>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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ic_cab_done_holo_dark.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ic_cab_done_holo_dark.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ic_cab_done_holo_light.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ic_cab_done_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..b28b3b54f4c81d482f797f31936cbd4013c093b5 GIT binary patch literal 552 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 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ic_clear_normal.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ic_clear_normal.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ic_clear_search_api_holo_light.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ic_clear_search_api_holo_light.png new file mode 100644 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?hQAxvXk4UOiAAEE)4(M`_JqL@;D1TB8!2v z2N=7Z%(epwmK8Xr18D^?ZvQoBE&~H2yQhm|h{y4_lQ-(QIEu9Gw|su~9BYG>3T z<`p7Roqh{%_^tdd;j;0b>)HiVJib^dHRZhfE4qDyk?~Gtt8equiqbxvtv@%Dx%e+* ztHqKpokrI$Us^9~(d}R?T;sm-btuy-6Pe-@#-}B813n&+({H&E#l^7U6xaGWpAJrF zJ1}K?Nt$It@!1Ahzh7SIGk!oK7J6Z5;@0+tTGye1X)N|Sst)@=kM`eLxa+CY>s=R@PU{kI zI+5bExq~-0Gx`KqoZk+Eg;9$CxLGZ0rQc^P;Nof3_xm~J{MYkeI3<4MPuaXsP7N3~ zswJ)wB`Jv|saDBFsX&Us$iUE0*T6#8&@9Bzz{=Ff%G5&Fz}(8fAmepYGm3`X{FKbJ zO57SGw^`W(HAsSN2+mI{DNig)WpGT%PfAtr%uP&B4N6T+sVqF1Y6Dcn;OXk;vd$@? F2>`GzyM6!w literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ic_commit_search_api_holo_light.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ic_commit_search_api_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..86c170e97b106064cfc22fd02e1992a19db85622 GIT binary patch literal 532 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UOiAAEE)4(M`_JqL@;D1TB8!2v z2N=7Z%(epwmK8Xr18D^?ZvQoBE&~IjjHioZh{y4_m-l)xJBl3r7++>CVDLiu2ai}2 z=f!(o9|d!28}>9#VDAde3F2s)U=r5U6v4GMCsGrGA^taB&NsNRu~(7N_=wE?_;Uwfvf8x zUfqfC)%uod^WNE#A#0wC-`s_lPO^$JUAepa!;4!Rx5SznYWgX1F&IV9lg)V5Rom{& z!#LxCpY!Rdt9-W1n6Q;0__XO^BNq;V?ulMJrn0Zv1Y8?Kd3^85p!{De0qV$jwj5OsmAL;amBv$v_Q~ARB`7(@M${i&7aJQ}UBi6+Ckj b(^G>|6H_V+Po~-c6)||a`njxgN@xNAod(4& literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ic_go.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ic_go.png new file mode 100644 index 0000000000000000000000000000000000000000..bf19833f2e1e2384f9bbd0dc39cd95c98a18dc39 GIT binary patch literal 1538 zcmZ`&dpOg39R4!pPN9rY%8D#z$+bjA+i}dWG*m9LLPRbRhD{FE!I9HBCb@J>q8M>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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ic_go_search_api_holo_light.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ic_go_search_api_holo_light.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ic_menu_share_holo_dark.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ic_menu_share_holo_dark.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ic_search.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__ic_search.png new file mode 100644 index 0000000000000000000000000000000000000000..4be72f108ba1a4f36da5c3a59b1ed08ddcf7cb8b GIT binary patch literal 2280 zcmZ`(X*kq<8~rm`vz0VsNwyK$W{_oMAB>8aXULj{?8IYV8q3&)vLrKUM8>{H5i+*H zkR-|$|R2*FfgciX9yK?;QuX#eqD|IovDbqdkR3e&?h;^O1G<)AHE%=VX) zAdqoXq`4s%2;{~C0wti(VgG8DV;zQipvLr>8Nuu3J|@fzC?Pn;(B0Z2$}|mMOeT}@ zZdYQ^RYrmCf1CTQ8D_yu^_6vr)v1{}ol;VM{icMDCQ&815)%T3JBf@H=ocUsx%n zJFIZgJID218z>DQRd%G!e*f!UHHr#G~u4^{*?KBR1a9(UgdwUCY z0N?ya!P21!5iYyGR=<_2?Bjxnf^O2gR)g=%%)N>(KO+75BgnrceouFrp}3VaIGj+w zwLt4?-zZ+mUHN{)1$>vEA-}OYQS>1;i@^W^ya2!Y)M2>#@dI%~p)CL)3JL&m2>`Iq zVDbt8gu(!TehUB)1pojJ$Z_d6WoB7jubLqNM#}w>F6PA*h_Vj`fRlp9U;&7QkYh6} z(9n~~68|FQci|HNI5BCCG{m3=$a#)_7@IT644iWCw-2KsQ3;kRYGgG`rBEI#nXS+A z-nc+%B1SM0R-#u?0hP&FPT;>NX_%P?hgg_gv`QC2%boBtHY&DNEv1Z{inN+o7UU&6~i6<@dDg@JfyZA zYYx+`gmaQz`KhmCK>`p*=#ih%ugw-Hso)F*NW>=M4c^v*LZjsr<%=hVT#flNo|-X@}#9er^0l84-{G`HDNMNzVWRl8caxci}W? zc0!?Gy@R{maX7Ejy=Wq@(@!~8(Psga1{<5D z(FKaex5510aojhOAqv&ccU0G`r}SP}xP6Mh|JfV%jcV*O-x8{S&;`%E-#%tx6}nZR z1c741ezikraQ!+eJJ^1Aeccm$-6B!t4f|nM%v7bMlWS!LpHJrZ6dm59q0S?ZF2y8=Q^-~&?1fzm&QwFJU6ATw$c`QT*f}qMc??#hST5e zxQkPhjP#qGiaKgzP|%tu=%>BCK5z-H-a(-N>e+VwJjD5gsQS*YAIrKo18uKi>CXsU zeAhr@2VZr~d^+{qL#Dp0azS&`-=zTTtOZv;dZ$~|%FEgLT!~MIsl%29Hp60Z+HY^7 zfgybsr8wt-*S<*>3Nmk=Hv%NUi5Hv+Je`(&hxE38qm@=h}CxYHB<_YKzwV*m;-gtIoI8pfRa+PV;bk|F;MAR5rU6MKLY;P6SK^ zz#4=epgT#wlNB;NZ)KQk&RpNA?XxC=IHlR)lJ=q^ZCLVD?9`ziSOwcFN_IajdC5?9?I!CqtLRha!P2$C-xcN_9o*P*U< z>ywK~yb{}ck`qS@bR2r(`2)}ccr??M(3_M=b8keT5ZSrdM3k>jXVBu6l+)-bCy%9L zOC!{#CvW7&b_6@Z+)50}d|4X``|?#6m&CLq^x$=(qc8fyU`qD!UMO&i%mY#l*4}je zUY*?ZjEBc&Wnfh-_S(?(-I1VFGpLuAnwkrWfB&u_7Eh-aA(LSbJS!^W!IYtsKzvnI z$O$r8AvKH7Zj?Q&ttHP{QT0h&4Itjl)T^om$6zqteEQ^VJAX-X>FMZBZwdsB&N9pC z&duEhzJ?EsUX2h5#=Dn9qOX(g&4sg}OPZZa}zHLP2EULVk3U%ri_nw6cMX{jf401yDMAwDEDv}|H}kQ!Hi zd6Zq>&@icXeV0kh{3rR3=9Pfw>KYoZiO&lIf`Ud5wud&~b5Kb)*ApHe8n)a3pwxh{ z$*%Q@uGRAQFhHV!SuhFXhEmJJ80 z#@5t?CG=2`p=bBgC|ivL%d-sutsh?4N)w>m>4-G|$T)jIZUG?nVeVx2HSX2slwO72 z?tfqI%rz)}0aMxE4glP1kt_`m08blB;JbCDXz|Vz7rB&3B!)8!3pk9r1N`tGhCG;) zv#l@NV!NfyPkmL`lq7YhRknd&E70EYthe7x3QD|N=UH*os_XK2gzahS*~Wuk+A^Om zUWFF&@#H?$j=xhhvg{BKeCYJ*w@lo~Q1$MWsGu2Tzn^=$H#-w?`IAO_z zJUWYU-^n>8UD1ty0E97-6T84fRf$ADUuGZlm2ZJhuLR0Qe#{1&>xs(Oc1?$GEei<= zsT^LIA3tVlYirh2F;ltF*;(F~#QbPJTh!MkretL{o|hTkm20(EH$s4%&!0a_-Zezt z8F@f+U@rQvF;DfgS&okNI7>?vJuS8A*Tv*l{c_E`jtQctXW8YByuLdQ4lg)%h&iLK zwVJ5AqekF+nnw*!vRqwheZ9SW3>I6n-pcdcUB?=2&1S67&W~KAhJ}?A!LEvto5)Q| zi+<+g9M9p{4sKLwx(NcFAd|nHs*I=*@XH1VEvYnh2lr@)Z#$*YoN_ES7AlPBo>PWwY4ShV_Tdn@F-`?hBDdB z7pW#_D=Qt!>xT8zaV%CFURWpJn$zK9Y8;eLhAQP7kXq8odoi|NLawOn(9GW*tOnNU@c~5bp`8}WK`SZCygwz3X~AcxF3qRnDDi}dn7gzv{{*Ttmg*cth)|J*$JG^N=l}c0cKPpv+!ONqp>EsX z5)n9@<3W4RqR-f(z4i&=&N?TIbdWIQFGx627b%C_t|QXXLhDj4J~DbP9Pk`r)4u4H zBhMqoU=6C=0d5&rl|IYz>`Y=!2TcS=Q+gkVKD8`a+Lduk5~GePH7zw`TxMvqb-VA! zMJAZdmCe&fj0bHlpR0=9*$0;fL3ZcvrnS>N@?7$%O5ckci$3m9)85=?NtniO6yx%5 zGX$8X%<%9;`8sIyD(L*OTn8b!Gsc71g|z2%{Mz5N7k^$s7qYFa`fqMm7ZEB@1P z@wUi&QCZac$}Wh-VeyQH-|%oV6_YFVlk(ykt+R&>Jtw>t_=A%Q{BFLF4bnz*tm(LM zw-I}!=OEiSqcKC2PQN&{#+E2ZP-_c{r!)I>uU2& zZz;>Uqp4v%s>RnQQ1a4gvHjNaSZ{My$!4k{|F>$}^-tq#;e}xrxF4CTSxy7fW8!Dp zhy4sX*~w44DD=@!ZE&yT^pa72)&~=-sHu?7v{Co+=&4lCrRlz@nFQ`o|7&xoJdzbvo*csP98!41fAT#+{$FUpF;1#Clh3C#8qQ`A@lx5|D&i;x6(!#6UKG{z>4)2u+fU4#eAfTFo+%i+* zuwgRR{~Lur7&WrpQ3*J#EBboU&C6>q4&?OX;#|=par?c8|DbSk`saxIBF`I|#R7mvD!_8EH}%bEg}miw6L4rj8Yl1i zGo28t*kK9)jI;^}bnTj_5rh*>20pB{BG!&8cOVd+yhN_Q%OT2S#uAO#RSZY&5{w^x zf)H+uy${n!(YBuouq317x1CEVWp2*tU#okNqi*jw-{irZ@;WfzMnuEm@wK(HlXl2b zhoo^uBiUm2{#qWM$TQ+H z-IfNUo(=~V?3Jt9TT?t#19>)?F!&bM)sHSsJlW@e29^BfIh=rwT#?~Xq?d37P=6h9fTS5b?a>@zW(i46kj(s;S|93%(K1`Vm#oa`~*L4G@(AuMJikd+kjU0|5u1B2$w*?sN5ZY|0 zJ^OE+@%xB3$9*o`zIT83obq#wx10s)9qxpb%vewyD(EWkhG7B&Ymr2c)$Ucb_LrKM zRxAwrb5Dj_QLsf#tg!02|K8op+!xR9zrS~bP;7hq{}|B?v;LGlc_{o=D|yP?{WTvC z98Y0Y%H`FnF>UOSC27e1EM*YkzWnD%emHPr(*=1IgWDDZGx^a@qB+f$vm znc+Y|e%$vjra|6rfs#|>as@5fibRCqG{_kRkA7!HcIqzHT?( z^Udi2~aKKwZ&`uCqoEMIZMMFroNUrsH$|M|tG<(bR=>IiR2 zT^oJ$@OO2wl*w=NN-rBRxh^~_!DEu_Q*os%BJH^rOON8}%SR*b=G_pqzj~>+Bg+s&b1MTQD-&Z~10ciTaemlU6b-rgDVb@NxHU{NdY1{*APKS|I6tkV oJh3R1!7(L2DOJHUH!(dmC^a#qvhZZ84Nwt-r>mdKI;Vst0G?(%xBvhE literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__list_activated_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__list_activated_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__list_divider_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__list_divider_holo_dark.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__list_divider_holo_light.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__list_divider_holo_light.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__list_focused_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__list_focused_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__list_longpressed_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__list_longpressed_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__list_pressed_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__list_pressed_holo_dark.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__list_pressed_holo_light.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__list_pressed_holo_light.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__list_selector_disabled_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__list_selector_disabled_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..92da2f0dd3711a2ceb843768cafd6b91a2807b43 GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^{6MVD!3HFkzrK_Oq*#ibJVQ8upoSx*1IXtr@Q5sC zVBqcqVMg#;uvX%d>fBtxy+SfFGJhTv9Z9>9n%%Tr7{oI+Q@DMao9hQt@O?p#8;eZd15IY| MboFyt=akR{068-?^#A|> literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__list_selector_disabled_holo_light.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__list_selector_disabled_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..42cb6463e4c28c6aeffa315c4fc869867dbb6b7c GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^{6MVD!3HFkzrK_Oq*#ibJVQ8upoSx*1IXtr@Q5sC zVBqcqVMg@oJyIHz9Y|%SiynA|kd)58s-{92FmHki*;@KxND!%;H%=F4ZU(n;yg$GVRgBd(s L{an^LB{Ts54)-;@ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__menu_dropdown_panel_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__menu_dropdown_panel_holo_dark.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__menu_dropdown_panel_holo_light.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__menu_dropdown_panel_holo_light.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__progress_bg_holo_light.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__progress_bg_holo_light.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__spinner_ab_default_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__spinner_ab_default_holo_dark.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__spinner_ab_focused_holo_light.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__spinner_ab_focused_holo_light.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__spinner_ab_pressed_holo_light.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__spinner_ab_pressed_holo_light.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__tab_selected_focused_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__tab_selected_focused_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__tab_selected_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__tab_selected_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__tab_selected_pressed_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__tab_selected_pressed_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__textfield_search_default_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__textfield_search_default_holo_dark.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__textfield_search_default_holo_light.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__textfield_search_default_holo_light.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__textfield_search_right_default_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__textfield_search_right_default_holo_dark.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__textfield_search_right_default_holo_light.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__textfield_search_right_default_holo_light.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__textfield_search_right_selected_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__textfield_search_right_selected_holo_dark.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__textfield_search_right_selected_holo_light.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__textfield_search_right_selected_holo_light.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__textfield_search_selected_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__textfield_search_selected_holo_dark.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__textfield_search_selected_holo_light.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__textfield_search_selected_holo_light.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__toast_frame.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-mdpi/abs__toast_frame.9.png new file mode 100644 index 0000000000000000000000000000000000000000..b9105deeefb805737627a38fc0818ac00be90e11 GIT binary patch literal 839 zcmV-N1GxN&P)j~O(aS~>jI*GARALPZW)ym*FPHDWq8I1(U46`4*`nM`D4nMO0(kX7~VWc8B1QAYMk#;(>=Ms+~!;%PV0Gr)z_q{C3C+FM>Baw?0{`#|j2Eey%`+L9N z|3EB+?_LjvCh`apVq4es)8TL!ErNlfs;X}Qej@gm6_n6K>hRD+9{hWJ42J2f4U2rolzf7QueV$hL*? zeq6Ps{oDTy*)c+Hc^mT++1otgPB0_q>{MgURD}oI*F)o7SLQ|BNQ`hyc?#qmEaNF@jv&1X-2A|B{*aCP2@CCrvu6{(w zNRVf+OW!EuQRD=m0q_Fg89)u-Pgg%9cu0fTL!$F&Ei5(YjZL1?AU%UM(r`{cJaB@_p?Zmwe8|2zaHPyRMb2tUt<#|N9Q^takF=<1YkybI$aT RjbH!(002ovPDHLkV1hAGdGG)L literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-v11/abs__progress_medium_holo.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-v11/abs__progress_medium_holo.xml new file mode 100644 index 0000000000..6bcbdb83f1 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-v11/abs__progress_medium_holo.xml @@ -0,0 +1,34 @@ + + + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ab_bottom_solid_dark_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ab_bottom_solid_dark_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ab_bottom_solid_light_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ab_bottom_solid_light_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ab_bottom_transparent_light_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ab_bottom_transparent_light_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ab_share_pack_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ab_share_pack_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..9a70a5d1e3ad43f632287aff78d86289259099db GIT binary patch literal 2878 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 Xx&sG-cNbs*00000NkvXXu0mjfHD**$ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ab_solid_dark_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ab_solid_dark_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ab_solid_light_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ab_solid_light_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ab_solid_shadow_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ab_solid_shadow_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ab_stacked_solid_dark_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ab_stacked_solid_dark_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ab_stacked_solid_light_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ab_stacked_solid_light_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ab_stacked_transparent_dark_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ab_stacked_transparent_dark_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ab_stacked_transparent_light_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ab_stacked_transparent_light_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ab_transparent_dark_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ab_transparent_dark_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ab_transparent_light_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ab_transparent_light_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__btn_cab_done_default_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__btn_cab_done_default_holo_dark.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__btn_cab_done_default_holo_light.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__btn_cab_done_default_holo_light.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__btn_cab_done_focused_holo_light.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__btn_cab_done_focused_holo_light.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__btn_cab_done_pressed_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__btn_cab_done_pressed_holo_dark.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__btn_cab_done_pressed_holo_light.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__btn_cab_done_pressed_holo_light.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__cab_background_bottom_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__cab_background_bottom_holo_dark.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__cab_background_bottom_holo_light.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__cab_background_bottom_holo_light.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_ab_back_holo_dark.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_ab_back_holo_dark.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_ab_back_holo_light.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_ab_back_holo_light.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_cab_done_holo_light.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_cab_done_holo_light.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_clear_disabled.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_clear_disabled.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_clear_search_api_disabled_holo_light.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_clear_search_api_disabled_holo_light.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_commit_search_api_holo_dark.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_commit_search_api_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..d8faf900ae775ef8d6cea8390b28a8966f02138f GIT binary patch literal 703 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;OpT z1B~5HX4`=T%L*LRfwTh{zxwy~(JodEH;O*nr)oi3u+*t#ne{^!|83r$Pej{ldKI)p3(v z6xCHeFXox)qc-_uiqU_`*H!@%uPm1C^7p>jpI5$W!No%nRVqhz=rcO^+<0y(%q6of z)#s$>`$HnTxJ69%Jk;GE>1LCDBWTf+{1-;8x{b+B&B+JK^(1Uo1QhsQUf!^ur@g`A ziT{K0XwKWL3SN4dH=eajKhW^%-o?!hhmGd{Y}$BCaJEmul`B`wtT}G4UC0zra8xcm zWXukPdN=5XGniLZKC2jk`t9X*||y;p~`IWw!ln_zy41;Dx&z{!2?4CY|_m z_gZ4l&AD1CJFK_;uV7xAs|)^fUx(-~o4+LF!kduG;on&%aPmGE z(b?OuGDx*rV*AoV+B0=tD(PICz50Xm{*pCb%jD)Q7We+a<^F4#uKt(xtTnBoYwyPC zcYDt9sPkiNtxu_a!(z)Z literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_commit_search_api_holo_light.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_commit_search_api_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..e7c7280add8f9908ff36a0e502608c8d415e21d4 GIT binary patch literal 712 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;OpT z1B~5HX4`=T%L*LRfwTh{zxww65w!ZcM8|W7_k0 z8BeX9GkbS%y=C?C;oIQv!*(pmF`w0Px5+2I{$q3h%7WNy zZi)pBR(%)$6lpQ*^BNXjw>vuN<%;XQ2d-Rso0fHN^V2Tlc|Vkb{in~7w3{%;XS0}` z_3Pr@H+L+KHhBJEfAHF!veW$CSHEj<54d6!xqH1oIJhTz{9*sYRK9xVjLHvjNx(=} zEpd$~Nl7e8wMs5Z1yT$~28M>Z1{S)8rXfbgRt6SUrlz_E=2ivnC}Q!>*k zaclTiK5H^igCxj?;QX|b^2DN42FH~Aq*MjZ+{Ezopr E0LOM9g#Z8m literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_go.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_go.png new file mode 100644 index 0000000000000000000000000000000000000000..1e2dcfa02057f16f9f89e31fada93991c4eb9ab6 GIT binary patch literal 1983 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 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_menu_moreoverflow_normal_holo_light.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_menu_moreoverflow_normal_holo_light.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_menu_share_holo_dark.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_menu_share_holo_dark.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_menu_share_holo_light.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_menu_share_holo_light.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_search.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_search.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_search_api_holo_light.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__ic_search_api_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..a4cdf1c7927896d70e6b9f6af2eaa64b1bb41707 GIT binary patch literal 3037 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 S!l#~*4goMWSah`&G3sAAl9aOm literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__list_activated_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__list_activated_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__list_longpressed_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__list_longpressed_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__list_pressed_holo_light.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__list_pressed_holo_light.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__list_selector_disabled_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__list_selector_disabled_holo_dark.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__menu_dropdown_panel_holo_light.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__menu_dropdown_panel_holo_light.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__progress_bg_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__progress_bg_holo_dark.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__progress_primary_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__progress_primary_holo_dark.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__progress_secondary_holo_light.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__progress_secondary_holo_light.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__spinner_48_inner_holo.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__spinner_48_inner_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..19517c4b0aee1010c7041a76089fdfdbfa495e80 GIT binary patch literal 2769 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 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__spinner_ab_default_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__spinner_ab_default_holo_dark.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__spinner_ab_default_holo_light.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__spinner_ab_default_holo_light.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__spinner_ab_disabled_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__spinner_ab_disabled_holo_dark.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__spinner_ab_disabled_holo_light.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__spinner_ab_disabled_holo_light.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__spinner_ab_focused_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__spinner_ab_focused_holo_dark.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__spinner_ab_pressed_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__spinner_ab_pressed_holo_dark.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__spinner_ab_pressed_holo_light.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__spinner_ab_pressed_holo_light.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__tab_selected_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__tab_selected_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__tab_selected_pressed_holo.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__tab_selected_pressed_holo.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__textfield_search_right_default_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__textfield_search_right_default_holo_dark.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__textfield_search_right_default_holo_light.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__textfield_search_right_default_holo_light.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__textfield_search_right_selected_holo_dark.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__textfield_search_right_selected_holo_dark.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__toast_frame.9.png b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable-xhdpi/abs__toast_frame.9.png new file mode 100644 index 0000000000000000000000000000000000000000..9f39a774607a55d3858f037004e4e26e1435629f GIT binary patch literal 1956 zcmV;V2V3}wP) zLZ;B0*6y>%bH)e_F(oy!;?5Z$+Ls%Xklfwh6FRWhP$YPJ%CIZcrh~6M1-0^Zt6L=!~-Yk(emo#{52bCTMhtrJQ{uy=kf zbS-#!-=J&^uO$SCO(4Rz@1^aA{mD5u4gIoa@QhHC7I{LKEi#H7Bf1`Wnb?#_3t#T| zJH(MfM+B`YFCrY6A{P-N!E5151ki0{2s@Vjz=U|>*4s{P5()I(Ufx6XkFGJIHZ_V2 zVWUBfA@q2JSaKc_=m zG4*Nn(bykUct5Z>SD%`G$DVfypYzy#kNG)sefqxdHk-|FA3uKl{oT8Ff8s&x-b|7% znxS5Q9=s+ZM3F$Y=Jo5>-@JPD>ihM2z1(iM=(;W(@LbgVs;KstN9P*rDf?XN_0DDW&G>>gv1IYLx)|g}vY<}&{`~cu*Jj@(*7}pa~sx%&};(EDRq6R?o>C>n7?(XiWFGI+&bX|v(lIRfF zo4{r*K;?4;ojb`%UXg5T18JAHx3^D{4iTd1`(AX{Vy{O%t0eV;E~GW6*U#0FKo3x&R4=ebAaf&` zNzM>iN=EPoII1cq>IFjP1ZZaw(jo#bb=%dogZvaAGJTw9!pb^OP#{OAFxPM^|M$Zor z93$jXDQR_doDqQ#&YqT*U5CYH$ga9~?5tuHKxj9*b#~8s|_LGn~Ia!mnM(`GS z)*pb7Iq?ePs8Dt(8KHCmnt)siCuub@f<4g-J$k(=LgqwkF_$KVhL~C-*ufbU$R*%u za*{4rTvRwJHOk?cf{;1!#6JmHjnE^C0tpY1pv#<3$Wzg&ZHIhx zaIp~~_qQ3+T4VHm-~WB|S0LmB2JMaXh_UE%TKjK&C*X#8!yWQ^n3Ezj1 z$?SH!_v`ig7XbIDj|zYj8SFxU(ZADfOgma@x$C;?wr%g)w*5M#balS3N{CP2_qXfy z`q%60>pwP|%?}!by_UkG)0Ir7ii{aRp>b-7TJgl=O z<9Tab5#nVaBIx^}-46TyHSIq`A9=qS+O0aj$2eMy43S$1Fq)f{4{D2MsPP#D<$6nCV+SJ@jhob4zuvqqt5Iw5aPm%4)<{LbuSqnS}{(fk;I83b= z5s1d#Xmv^>H&$sks_pQQ7Rhn%&Yv|zX=&IVd!fpSJEzqVL4+@27qf^lI?xEj$1_5d zB5A=#1+q5o~SHne!$W%ep4ef{%)49T_}h$T->v0BZvhqxEKu5T!~}{@~878A_>< zh+Pk6@8)vxr20oi@zD!HlV^_=tGDGMgl=^|JzhvDHA?2Sm&@70H#z-nB%l$9B{Bjq zo~866MD7PUUNkr$dXA9H``iZ>!OKihR10t|Hd2cfa;|nj@Lu=NX&Aut=LmKn8yR$j z0Q|z3g)+(E)uYlzvr17Eh$6!QIWb1*i+6XoDNiW{q6tWjD4p>H9~mJx#sO27;4GN| z75k=MpS&zQk=EShPci{eC&ZF~J)uY9r|`)XN-241Uv8`swZe@0O-X%d3Q|L{u*LK{ qe%1uQ^ATh5i;_p>f32gw@9`h#|LAXT%2*=+0000 + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__activated_background_holo_light.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__activated_background_holo_light.xml new file mode 100644 index 0000000000..85c2c02129 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__activated_background_holo_light.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__btn_cab_done_holo_dark.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__btn_cab_done_holo_dark.xml new file mode 100644 index 0000000000..cab896283c --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__btn_cab_done_holo_dark.xml @@ -0,0 +1,24 @@ + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__btn_cab_done_holo_light.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__btn_cab_done_holo_light.xml new file mode 100644 index 0000000000..42ba8a0df0 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__btn_cab_done_holo_light.xml @@ -0,0 +1,24 @@ + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__ic_clear.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__ic_clear.xml new file mode 100644 index 0000000000..a16f4b22e8 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__ic_clear.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__ic_clear_holo_light.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__ic_clear_holo_light.xml new file mode 100644 index 0000000000..256de80fb3 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__ic_clear_holo_light.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__ic_menu_moreoverflow_holo_dark.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__ic_menu_moreoverflow_holo_dark.xml new file mode 100644 index 0000000000..2588a492db --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__ic_menu_moreoverflow_holo_dark.xml @@ -0,0 +1,18 @@ + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__ic_menu_moreoverflow_holo_light.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__ic_menu_moreoverflow_holo_light.xml new file mode 100644 index 0000000000..e2078c9679 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__ic_menu_moreoverflow_holo_light.xml @@ -0,0 +1,18 @@ + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__item_background_holo_dark.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__item_background_holo_dark.xml new file mode 100644 index 0000000000..d99b7a426b --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__item_background_holo_dark.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__item_background_holo_light.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__item_background_holo_light.xml new file mode 100644 index 0000000000..da5fb2e86e --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__item_background_holo_light.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__list_selector_background_transition_holo_dark.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__list_selector_background_transition_holo_dark.xml new file mode 100644 index 0000000000..b2ce4f0f77 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__list_selector_background_transition_holo_dark.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__list_selector_background_transition_holo_light.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__list_selector_background_transition_holo_light.xml new file mode 100644 index 0000000000..d7e31b1d1f --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__list_selector_background_transition_holo_light.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__list_selector_holo_dark.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__list_selector_holo_dark.xml new file mode 100644 index 0000000000..08b8b12f37 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__list_selector_holo_dark.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__list_selector_holo_light.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__list_selector_holo_light.xml new file mode 100644 index 0000000000..ada490bf9f --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__list_selector_holo_light.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__progress_horizontal_holo_dark.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__progress_horizontal_holo_dark.xml new file mode 100644 index 0000000000..bd19140abf --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__progress_horizontal_holo_dark.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__progress_horizontal_holo_light.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__progress_horizontal_holo_light.xml new file mode 100644 index 0000000000..321f07c8b2 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__progress_horizontal_holo_light.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__progress_medium_holo.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__progress_medium_holo.xml new file mode 100644 index 0000000000..6d4814f862 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__progress_medium_holo.xml @@ -0,0 +1,34 @@ + + + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__search_dropdown_dark.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__search_dropdown_dark.xml new file mode 100644 index 0000000000..26284187a7 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__search_dropdown_dark.xml @@ -0,0 +1,22 @@ + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__search_dropdown_light.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__search_dropdown_light.xml new file mode 100644 index 0000000000..0d00c58788 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__search_dropdown_light.xml @@ -0,0 +1,22 @@ + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__spinner_ab_holo_dark.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__spinner_ab_holo_dark.xml new file mode 100644 index 0000000000..4af5e22a90 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__spinner_ab_holo_dark.xml @@ -0,0 +1,25 @@ + + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__spinner_ab_holo_light.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__spinner_ab_holo_light.xml new file mode 100644 index 0000000000..b785084782 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__spinner_ab_holo_light.xml @@ -0,0 +1,25 @@ + + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__tab_indicator_ab_holo.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__tab_indicator_ab_holo.xml new file mode 100644 index 0000000000..d34e208117 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__tab_indicator_ab_holo.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__textfield_searchview_holo_dark.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__textfield_searchview_holo_dark.xml new file mode 100644 index 0000000000..25d35cacad --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__textfield_searchview_holo_dark.xml @@ -0,0 +1,21 @@ + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__textfield_searchview_holo_light.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__textfield_searchview_holo_light.xml new file mode 100644 index 0000000000..e624ee60d8 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__textfield_searchview_holo_light.xml @@ -0,0 +1,21 @@ + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__textfield_searchview_right_holo_dark.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__textfield_searchview_right_holo_dark.xml new file mode 100644 index 0000000000..2e645ea9dd --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__textfield_searchview_right_holo_dark.xml @@ -0,0 +1,21 @@ + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__textfield_searchview_right_holo_light.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__textfield_searchview_right_holo_light.xml new file mode 100644 index 0000000000..e5643d4a42 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/drawable/abs__textfield_searchview_right_holo_light.xml @@ -0,0 +1,21 @@ + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout-large/abs__action_mode_close_item.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout-large/abs__action_mode_close_item.xml new file mode 100644 index 0000000000..8811dad8d6 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout-large/abs__action_mode_close_item.xml @@ -0,0 +1,40 @@ + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout-v14/sherlock_spinner_dropdown_item.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout-v14/sherlock_spinner_dropdown_item.xml new file mode 100644 index 0000000000..120f2f3c66 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout-v14/sherlock_spinner_dropdown_item.xml @@ -0,0 +1,26 @@ + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout-v14/sherlock_spinner_item.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout-v14/sherlock_spinner_item.xml new file mode 100644 index 0000000000..89268015ec --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout-v14/sherlock_spinner_item.xml @@ -0,0 +1,26 @@ + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout-xlarge/abs__screen_action_bar.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout-xlarge/abs__screen_action_bar.xml new file mode 100644 index 0000000000..ab4fa28d80 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout-xlarge/abs__screen_action_bar.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout-xlarge/abs__screen_action_bar_overlay.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout-xlarge/abs__screen_action_bar_overlay.xml new file mode 100644 index 0000000000..0ab3ae65c0 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout-xlarge/abs__screen_action_bar_overlay.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__action_bar_home.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__action_bar_home.xml new file mode 100644 index 0000000000..5c1e9ec4b3 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__action_bar_home.xml @@ -0,0 +1,38 @@ + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__action_bar_tab.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__action_bar_tab.xml new file mode 100644 index 0000000000..f46f7a044b --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__action_bar_tab.xml @@ -0,0 +1,7 @@ + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__action_bar_tab_bar_view.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__action_bar_tab_bar_view.xml new file mode 100644 index 0000000000..9d8f759bc6 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__action_bar_tab_bar_view.xml @@ -0,0 +1,6 @@ + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__action_bar_title_item.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__action_bar_title_item.xml new file mode 100644 index 0000000000..557410502b --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__action_bar_title_item.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__action_menu_item_layout.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__action_menu_item_layout.xml new file mode 100644 index 0000000000..f72e05268b --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__action_menu_item_layout.xml @@ -0,0 +1,56 @@ + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__action_menu_layout.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__action_menu_layout.xml new file mode 100644 index 0000000000..a6f8e53f8a --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__action_menu_layout.xml @@ -0,0 +1,23 @@ + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__action_mode_bar.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__action_mode_bar.xml new file mode 100644 index 0000000000..7168dc77fd --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__action_mode_bar.xml @@ -0,0 +1,24 @@ + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__action_mode_close_item.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__action_mode_close_item.xml new file mode 100644 index 0000000000..875ec3e1b0 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__action_mode_close_item.xml @@ -0,0 +1,31 @@ + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__activity_chooser_view.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__activity_chooser_view.xml new file mode 100644 index 0000000000..6a0ac9ece0 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__activity_chooser_view.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__activity_chooser_view_list_item.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__activity_chooser_view_list_item.xml new file mode 100644 index 0000000000..b430032a14 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__activity_chooser_view_list_item.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__list_menu_item_checkbox.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__list_menu_item_checkbox.xml new file mode 100644 index 0000000000..71754924ae --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__list_menu_item_checkbox.xml @@ -0,0 +1,24 @@ + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__list_menu_item_icon.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__list_menu_item_icon.xml new file mode 100644 index 0000000000..1afb886d44 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__list_menu_item_icon.xml @@ -0,0 +1,27 @@ + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__list_menu_item_radio.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__list_menu_item_radio.xml new file mode 100644 index 0000000000..f8e38d630b --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__list_menu_item_radio.xml @@ -0,0 +1,24 @@ + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__popup_menu_item_layout.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__popup_menu_item_layout.xml new file mode 100644 index 0000000000..8fc82d1c62 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__popup_menu_item_layout.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__screen_action_bar.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__screen_action_bar.xml new file mode 100644 index 0000000000..68dc7dfe57 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__screen_action_bar.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__screen_action_bar_overlay.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__screen_action_bar_overlay.xml new file mode 100644 index 0000000000..45cd7239f6 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__screen_action_bar_overlay.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__screen_simple.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__screen_simple.xml new file mode 100644 index 0000000000..dc47e46f71 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__screen_simple.xml @@ -0,0 +1,38 @@ + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__screen_simple_overlay_action_mode.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__screen_simple_overlay_action_mode.xml new file mode 100644 index 0000000000..f8b9fb1859 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__screen_simple_overlay_action_mode.xml @@ -0,0 +1,38 @@ + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__search_dropdown_item_icons_2line.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__search_dropdown_item_icons_2line.xml new file mode 100644 index 0000000000..e1d3dc49cb --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__search_dropdown_item_icons_2line.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__search_view.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__search_view.xml new file mode 100644 index 0000000000..6ba319121c --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__search_view.xml @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__simple_dropdown_hint.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__simple_dropdown_hint.xml new file mode 100644 index 0000000000..0088e14a76 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/abs__simple_dropdown_hint.xml @@ -0,0 +1,29 @@ + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/sherlock_spinner_dropdown_item.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/sherlock_spinner_dropdown_item.xml new file mode 100644 index 0000000000..f1f4eef42d --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/sherlock_spinner_dropdown_item.xml @@ -0,0 +1,26 @@ + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/sherlock_spinner_item.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/sherlock_spinner_item.xml new file mode 100644 index 0000000000..1bf3f3a165 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/layout/sherlock_spinner_item.xml @@ -0,0 +1,26 @@ + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-land/abs__dimens.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-land/abs__dimens.xml new file mode 100644 index 0000000000..502cc16a30 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-land/abs__dimens.xml @@ -0,0 +1,33 @@ + + + + + 40dip + + 4dip + + 16dp + + 12dp + + -2dp + + 4dip + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-large-hdpi-1024x600/abs__dimens.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-large-hdpi-1024x600/abs__dimens.xml new file mode 100644 index 0000000000..3312cfa7fd --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-large-hdpi-1024x600/abs__dimens.xml @@ -0,0 +1,33 @@ + + + + + 48dip + + 8dip + + 18dp + + 14dp + + -3dp + + 5dip + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-large-land-hdpi-1024x600/abs__dimens.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-large-land-hdpi-1024x600/abs__dimens.xml new file mode 100644 index 0000000000..502cc16a30 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-large-land-hdpi-1024x600/abs__dimens.xml @@ -0,0 +1,33 @@ + + + + + 40dip + + 4dip + + 16dp + + 12dp + + -2dp + + 4dip + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-large-land-mdpi-1024x600/abs__dimens.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-large-land-mdpi-1024x600/abs__dimens.xml new file mode 100644 index 0000000000..3312cfa7fd --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-large-land-mdpi-1024x600/abs__dimens.xml @@ -0,0 +1,33 @@ + + + + + 48dip + + 8dip + + 18dp + + 14dp + + -3dp + + 5dip + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-large-mdpi-1024x600/abs__dimens.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-large-mdpi-1024x600/abs__dimens.xml new file mode 100644 index 0000000000..d3a64c7d0b --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-large-mdpi-1024x600/abs__dimens.xml @@ -0,0 +1,36 @@ + + + + + 56dip + + 4dip + + 18dp + + 14dp + + -3dp + + 9dip + + + 64dip + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-sw600dp/abs__bools.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-sw600dp/abs__bools.xml new file mode 100644 index 0000000000..7a48e1542e --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-sw600dp/abs__bools.xml @@ -0,0 +1,19 @@ + + + + + false + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-sw600dp/abs__dimens.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-sw600dp/abs__dimens.xml new file mode 100644 index 0000000000..70084166c2 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-sw600dp/abs__dimens.xml @@ -0,0 +1,38 @@ + + + + + 56dip + + 4dip + + 18dp + + 14dp + + -3dp + + 9dip + + 5 + + + 64dip + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-v11/abs__themes.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-v11/abs__themes.xml new file mode 100644 index 0000000000..03473572c2 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-v11/abs__themes.xml @@ -0,0 +1,12 @@ + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-v14/abs__styles.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-v14/abs__styles.xml new file mode 100644 index 0000000000..88a60dd92d --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-v14/abs__styles.xml @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-v14/abs__themes.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-v14/abs__themes.xml new file mode 100644 index 0000000000..75e317b4a1 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-v14/abs__themes.xml @@ -0,0 +1,29 @@ + + + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-w360dp/abs__dimens.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-w360dp/abs__dimens.xml new file mode 100644 index 0000000000..6f49d7e47b --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-w360dp/abs__dimens.xml @@ -0,0 +1,22 @@ + + + + 3 + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-w480dp/abs__bools.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-w480dp/abs__bools.xml new file mode 100644 index 0000000000..3eaf4aee9d --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-w480dp/abs__bools.xml @@ -0,0 +1,22 @@ + + + + true + false + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-w480dp/abs__config.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-w480dp/abs__config.xml new file mode 100644 index 0000000000..88357b0a76 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-w480dp/abs__config.xml @@ -0,0 +1,29 @@ + + + + + + + + true + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-w500dp/abs__dimens.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-w500dp/abs__dimens.xml new file mode 100644 index 0000000000..2fd4deea2d --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-w500dp/abs__dimens.xml @@ -0,0 +1,22 @@ + + + + 4 + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-w600dp/abs__dimens.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-w600dp/abs__dimens.xml new file mode 100644 index 0000000000..b085952d32 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-w600dp/abs__dimens.xml @@ -0,0 +1,22 @@ + + + + 5 + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-xlarge/abs__dimens.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-xlarge/abs__dimens.xml new file mode 100644 index 0000000000..9ceb5b06f4 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values-xlarge/abs__dimens.xml @@ -0,0 +1,45 @@ + + + + + 56dip + + 4dip + + 18dp + + 14dp + + -3dp + + 9dip + + + 64dip + + + 45% + + 72% + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values/abs__attrs.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values/abs__attrs.xml new file mode 100644 index 0000000000..af5873d908 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values/abs__attrs.xml @@ -0,0 +1,432 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values/abs__bools.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values/abs__bools.xml new file mode 100644 index 0000000000..0b432448d9 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values/abs__bools.xml @@ -0,0 +1,22 @@ + + + + + false + true + true + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values/abs__colors.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values/abs__colors.xml new file mode 100644 index 0000000000..b189e727a4 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values/abs__colors.xml @@ -0,0 +1,24 @@ + + + + + #ff000000 + #fff3f3f3 + @color/abs__background_holo_light + @color/abs__background_holo_dark + #ff4c4c4c + #ffb2b2b2 + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values/abs__config.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values/abs__config.xml new file mode 100644 index 0000000000..4c7b5d4598 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values/abs__config.xml @@ -0,0 +1,43 @@ + + + + + + + + 320dp + + + false + + + true + + + false + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values/abs__dimens.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values/abs__dimens.xml new file mode 100644 index 0000000000..9ded219786 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values/abs__dimens.xml @@ -0,0 +1,55 @@ + + + + + 48dip + + 8dip + + 18dp + + 14dp + + -3dp + + 5dip + + 2 + + + 56dip + + + + 8dip + + + 8dip + + + 32dip + + + + 160dip + + + 320dip + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values/abs__ids.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values/abs__ids.xml new file mode 100644 index 0000000000..f9f56045b3 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values/abs__ids.xml @@ -0,0 +1,26 @@ + + + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values/abs__strings.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values/abs__strings.xml new file mode 100644 index 0000000000..cf0235922a --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values/abs__strings.xml @@ -0,0 +1,49 @@ + + + + + Navigate home + + Navigate up + + More options + + + Done + + + See all... + + Choose an application + + Share with + + Share with %s + + + Search + + Search query + + Clear query + + Submit query + + Voice search + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values/abs__styles.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values/abs__styles.xml new file mode 100644 index 0000000000..f86c1b8239 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values/abs__styles.xml @@ -0,0 +1,412 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values/abs__themes.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values/abs__themes.xml new file mode 100644 index 0000000000..6215e048ff --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/res/values/abs__themes.xml @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/android/support/v4/app/Watson.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/android/support/v4/app/Watson.java new file mode 100644 index 0000000000..ff72cdcfeb --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/android/support/v4/app/Watson.java @@ -0,0 +1,143 @@ +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.BuildConfig; +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 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 (BuildConfig.DEBUG) Log.d(TAG, "[onCreatePanelMenu] featureId: " + featureId + ", menu: " + menu); + + if (featureId == Window.FEATURE_OPTIONS_PANEL) { + boolean result = onCreateOptionsMenu(menu); + if (BuildConfig.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 (BuildConfig.DEBUG) Log.d(TAG, "[onCreatePanelMenu] fragments create result: " + show); + result |= show; + + if (BuildConfig.DEBUG) Log.d(TAG, "[onCreatePanelMenu] returning " + result); + return result; + } + return false; + } + + @Override + public boolean onPreparePanel(int featureId, View view, Menu menu) { + if (BuildConfig.DEBUG) Log.d(TAG, "[onPreparePanel] featureId: " + featureId + ", view: " + view + " menu: " + menu); + + if (featureId == Window.FEATURE_OPTIONS_PANEL) { + boolean result = onPrepareOptionsMenu(menu); + if (BuildConfig.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 (BuildConfig.DEBUG) Log.d(TAG, "[onPreparePanel] fragments prepare result: " + show); + result |= show; + + result &= menu.hasVisibleItems(); + if (BuildConfig.DEBUG) Log.d(TAG, "[onPreparePanel] returning " + result); + return result; + } + return false; + } + + @Override + public boolean onMenuItemSelected(int featureId, MenuItem item) { + if (BuildConfig.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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/ActionBarSherlock.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/ActionBarSherlock.java new file mode 100644 index 0000000000..0151470aad --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/ActionBarSherlock.java @@ -0,0 +1,799 @@ +package com.actionbarsherlock; + +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; +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 static android.view.ViewGroup.LayoutParams.MATCH_PARENT; + +/** + *

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"; + + 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 (BuildConfig.DEBUG) Log.w(TAG, "Class " + implementationClass.getSimpleName() + " already registered"); + return; + } + + Implementation impl = implementationClass.getAnnotation(Implementation.class); + if (BuildConfig.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 (BuildConfig.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 (BuildConfig.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 (BuildConfig.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 (BuildConfig.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 (BuildConfig.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 (BuildConfig.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 (BuildConfig.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 (BuildConfig.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 (BuildConfig.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 (BuildConfig.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 (BuildConfig.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); + + /** + * Ensure that the action bar is attached. + */ + public void ensureActionBar() {} +} diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/app/ActionBar.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/app/ActionBar.java new file mode 100644 index 0000000000..94fdd9e70e --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/app/SherlockActivity.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/app/SherlockActivity.java new file mode 100644 index 0000000000..6ae42fd81c --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/app/SherlockActivity.java @@ -0,0 +1,276 @@ +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); + } + + @Override + public View findViewById(int id) { + getSherlock().ensureActionBar(); + return super.findViewById(id); + } + + + /////////////////////////////////////////////////////////////////////////// + // 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/app/SherlockDialogFragment.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/app/SherlockDialogFragment.java new file mode 100644 index 0000000000..c139325cd6 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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 android.support.v4.app.Watson.OnCreateOptionsMenuListener; +import static android.support.v4.app.Watson.OnOptionsItemSelectedListener; +import static android.support.v4.app.Watson.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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/app/SherlockExpandableListActivity.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/app/SherlockExpandableListActivity.java new file mode 100644 index 0000000000..455fb4a8a0 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/app/SherlockExpandableListActivity.java @@ -0,0 +1,265 @@ +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); + } + + @Override + public View findViewById(int id) { + getSherlock().ensureActionBar(); + return super.findViewById(id); + } + + + /////////////////////////////////////////////////////////////////////////// + // 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/app/SherlockFragment.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/app/SherlockFragment.java new file mode 100644 index 0000000000..0bdd068a65 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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 android.support.v4.app.Watson.OnCreateOptionsMenuListener; +import static android.support.v4.app.Watson.OnOptionsItemSelectedListener; +import static android.support.v4.app.Watson.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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/app/SherlockFragmentActivity.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/app/SherlockFragmentActivity.java new file mode 100644 index 0000000000..b09f05e4df --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/app/SherlockFragmentActivity.java @@ -0,0 +1,309 @@ +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.BuildConfig; +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 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 (BuildConfig.DEBUG) Log.d(TAG, "[getSupportMenuInflater]"); + + return getSherlock().getMenuInflater(); + } + + public void invalidateOptionsMenu() { + if (BuildConfig.DEBUG) Log.d(TAG, "[invalidateOptionsMenu]"); + + getSherlock().dispatchInvalidateOptionsMenu(); + } + + public void supportInvalidateOptionsMenu() { + if (BuildConfig.DEBUG) Log.d(TAG, "[supportInvalidateOptionsMenu]"); + + invalidateOptionsMenu(); + } + + @Override + public final boolean onCreatePanelMenu(int featureId, android.view.Menu menu) { + if (BuildConfig.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 (BuildConfig.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 (BuildConfig.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 (BuildConfig.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 (BuildConfig.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 (BuildConfig.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); + } + + @Override + public View findViewById(int id) { + getSherlock().ensureActionBar(); + return super.findViewById(id); + } + + + /////////////////////////////////////////////////////////////////////////// + // 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/app/SherlockListActivity.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/app/SherlockListActivity.java new file mode 100644 index 0000000000..ecee68fc4a --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/app/SherlockListActivity.java @@ -0,0 +1,276 @@ +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); + } + + @Override + public View findViewById(int id) { + getSherlock().ensureActionBar(); + return super.findViewById(id); + } + + + /////////////////////////////////////////////////////////////////////////// + // 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/app/SherlockListFragment.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/app/SherlockListFragment.java new file mode 100644 index 0000000000..7c4d09511a --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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 android.support.v4.app.Watson.OnCreateOptionsMenuListener; +import static android.support.v4.app.Watson.OnOptionsItemSelectedListener; +import static android.support.v4.app.Watson.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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/app/SherlockPreferenceActivity.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/app/SherlockPreferenceActivity.java new file mode 100644 index 0000000000..9644b18258 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/app/SherlockPreferenceActivity.java @@ -0,0 +1,276 @@ +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); + } + + @Override + public View findViewById(int id) { + getSherlock().ensureActionBar(); + return super.findViewById(id); + } + + + /////////////////////////////////////////////////////////////////////////// + // 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/ActionBarSherlockCompat.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/ActionBarSherlockCompat.java new file mode 100644 index 0000000000..421c94bd6e --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/ActionBarSherlockCompat.java @@ -0,0 +1,1177 @@ +package com.actionbarsherlock.internal; + +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 com.actionbarsherlock.ActionBarSherlock; +import com.actionbarsherlock.BuildConfig; +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; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import org.xmlpull.v1.XmlPullParser; + +import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; +import static com.actionbarsherlock.internal.ResourcesCompat.getResources_getBoolean; + +@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; + + + + /////////////////////////////////////////////////////////////////////////// + // Instance methods + /////////////////////////////////////////////////////////////////////////// + + @Override + public ActionBar getActionBar() { + if (BuildConfig.DEBUG) Log.d(TAG, "[getActionBar]"); + + initActionBar(); + return aActionBar; + } + + private void initActionBar() { + if (BuildConfig.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 (BuildConfig.DEBUG) Log.d(TAG, "[setTitle] title: " + title); + + dispatchTitleChanged(title, 0); + } + + @Override + public ActionMode startActionMode(ActionMode.Callback callback) { + if (BuildConfig.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 (BuildConfig.DEBUG) Log.d(TAG, "[dispatchConfigurationChanged] newConfig: " + newConfig); + + if (aActionBar != null) { + aActionBar.onConfigurationChanged(newConfig); + } + } + + @Override + public void dispatchPostResume() { + if (BuildConfig.DEBUG) Log.d(TAG, "[dispatchPostResume]"); + + if (aActionBar != null) { + aActionBar.setShowHideAnimationEnabled(true); + } + } + + @Override + public void dispatchPause() { + if (BuildConfig.DEBUG) Log.d(TAG, "[dispatchPause]"); + + if (wActionBar != null && wActionBar.isOverflowMenuShowing()) { + wActionBar.hideOverflowMenu(); + } + } + + @Override + public void dispatchStop() { + if (BuildConfig.DEBUG) Log.d(TAG, "[dispatchStop]"); + + if (aActionBar != null) { + aActionBar.setShowHideAnimationEnabled(false); + } + } + + @Override + public void dispatchInvalidateOptionsMenu() { + if (BuildConfig.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 (BuildConfig.DEBUG) Log.d(TAG, "[dispatchOpenOptionsMenu]"); + + if (!isReservingOverflow()) { + return false; + } + + return wActionBar.showOverflowMenu(); + } + + @Override + public boolean dispatchCloseOptionsMenu() { + if (BuildConfig.DEBUG) Log.d(TAG, "[dispatchCloseOptionsMenu]"); + + if (!isReservingOverflow()) { + return false; + } + + if (wActionBar != null) { + return wActionBar.hideOverflowMenu(); + } + return false; + } + + @Override + public void dispatchPostCreate(Bundle savedInstanceState) { + if (BuildConfig.DEBUG) Log.d(TAG, "[dispatchOnPostCreate]"); + + if (mIsDelegate) { + mIsTitleReady = true; + } + + if (mDecor == null) { + initActionBar(); + } + } + + @Override + public boolean dispatchCreateOptionsMenu(android.view.Menu menu) { + if (BuildConfig.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 (BuildConfig.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 (BuildConfig.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 (BuildConfig.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 (BuildConfig.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 (BuildConfig.DEBUG) Log.d(TAG, "[dispatchTitleChanged] title: " + title + ", color: " + color); + + if ((!mIsDelegate || mIsTitleReady) && (wActionBar != null)) { + wActionBar.setWindowTitle(title); + } + } + + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + if (BuildConfig.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 (BuildConfig.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 (BuildConfig.DEBUG) Log.d(TAG, "[dispatchKeyEvent] returning true"); + return true; + } + } + + if (BuildConfig.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 (BuildConfig.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 (BuildConfig.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 (BuildConfig.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 (BuildConfig.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 (BuildConfig.DEBUG) Log.d(TAG, "[setProgress] progress: " + progress); + + setFeatureInt(Window.FEATURE_PROGRESS, progress + Window.PROGRESS_START); + } + + @Override + public void setSecondaryProgress(int secondaryProgress) { + if (BuildConfig.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 (BuildConfig.DEBUG) Log.d(TAG, "[getFeatures] returning " + mFeatures); + + return mFeatures; + } + + @Override + public boolean hasFeature(int featureId) { + if (BuildConfig.DEBUG) Log.d(TAG, "[hasFeature] featureId: " + featureId); + + boolean result = (mFeatures & (1 << featureId)) != 0; + if (BuildConfig.DEBUG) Log.d(TAG, "[hasFeature] returning " + result); + return result; + } + + @Override + public boolean requestFeature(int featureId) { + if (BuildConfig.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 (BuildConfig.DEBUG) Log.d(TAG, "[setUiOptions] uiOptions: " + uiOptions); + + mUiOptions = uiOptions; + } + + @Override + public void setUiOptions(int uiOptions, int mask) { + if (BuildConfig.DEBUG) Log.d(TAG, "[setUiOptions] uiOptions: " + uiOptions + ", mask: " + mask); + + mUiOptions = (mUiOptions & ~mask) | (uiOptions & mask); + } + + @Override + public void setContentView(int layoutResId) { + if (BuildConfig.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 (BuildConfig.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 (BuildConfig.DEBUG) Log.d(TAG, "[addContentView] view: " + view + ", params: " + params); + + if (mContentParent == null) { + installDecor(); + } + mContentParent.addView(view, params); + + initActionBar(); + } + + private void installDecor() { + if (BuildConfig.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); + } + } + + 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 (BuildConfig.DEBUG) Log.d(TAG, "[generateLayout]"); + + // Apply data from current theme. + + TypedArray a = mActivity.getTheme().obtainStyledAttributes(R.styleable.SherlockTheme); + + 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 (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 (BuildConfig.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 (BuildConfig.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 (BuildConfig.DEBUG) Log.d(TAG, "Got "); + + for (int i = xml.getAttributeCount() - 1; i >= 0; i--) { + if (BuildConfig.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 (BuildConfig.DEBUG) Log.d(TAG, "Got "); + Integer activityUiOptions = null; + String activityPackage = null; + boolean isOurActivity = false; + + for (int i = xml.getAttributeCount() - 1; i >= 0; i--) { + if (BuildConfig.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 (BuildConfig.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; + } + } + + @Override + public void ensureActionBar() { + if (BuildConfig.DEBUG) Log.d(TAG, "[ensureActionBar]"); + + if (mDecor == null) { + initActionBar(); + } + } +} diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/ActionBarSherlockNative.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/ActionBarSherlockNative.java new file mode 100644 index 0000000000..4f67b9faa7 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/ActionBarSherlockNative.java @@ -0,0 +1,352 @@ +package com.actionbarsherlock.internal; + +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.ViewGroup.LayoutParams; +import android.view.Window; +import com.actionbarsherlock.ActionBarSherlock; +import com.actionbarsherlock.BuildConfig; +import com.actionbarsherlock.app.ActionBar; +import com.actionbarsherlock.internal.app.ActionBarWrapper; +import com.actionbarsherlock.internal.view.menu.MenuItemWrapper; +import com.actionbarsherlock.internal.view.menu.MenuWrapper; +import com.actionbarsherlock.view.ActionMode; +import com.actionbarsherlock.view.MenuInflater; +import com.actionbarsherlock.view.MenuItem; + +@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 (BuildConfig.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 (BuildConfig.DEBUG) Log.d(TAG, "[dispatchInvalidateOptionsMenu]"); + + mActivity.getWindow().invalidatePanelMenu(Window.FEATURE_OPTIONS_PANEL); + + if (mMenu != null) mMenu.invalidate(); + } + + @Override + public boolean dispatchCreateOptionsMenu(android.view.Menu menu) { + if (BuildConfig.DEBUG) Log.d(TAG, "[dispatchCreateOptionsMenu] menu: " + menu); + + if (mMenu == null || menu != mMenu.unwrap()) { + mMenu = new MenuWrapper(menu); + } + + final boolean result = callbackCreateOptionsMenu(mMenu); + if (BuildConfig.DEBUG) Log.d(TAG, "[dispatchCreateOptionsMenu] returning " + result); + return result; + } + + @Override + public boolean dispatchPrepareOptionsMenu(android.view.Menu menu) { + if (BuildConfig.DEBUG) Log.d(TAG, "[dispatchPrepareOptionsMenu] menu: " + menu); + + final boolean result = callbackPrepareOptionsMenu(mMenu); + if (BuildConfig.DEBUG) Log.d(TAG, "[dispatchPrepareOptionsMenu] returning " + result); + return result; + } + + @Override + public boolean dispatchOptionsItemSelected(android.view.MenuItem item) { + if (BuildConfig.DEBUG) Log.d(TAG, "[dispatchOptionsItemSelected] item: " + item.getTitleCondensed()); + + MenuItem wrapped; + if (mMenu == null) { + if (item.getItemId() != android.R.id.home) { + throw new IllegalStateException("Non-home action item clicked before onCreateOptionsMenu with ID " + item.getItemId()); + } + // Create a throw-away wrapper for now. + wrapped = new MenuItemWrapper(item); + } else { + wrapped = mMenu.findItem(item); + } + final boolean result = callbackOptionsItemSelected(wrapped); + if (BuildConfig.DEBUG) Log.d(TAG, "[dispatchOptionsItemSelected] returning " + result); + return result; + } + + @Override + public boolean hasFeature(int feature) { + if (BuildConfig.DEBUG) Log.d(TAG, "[hasFeature] feature: " + feature); + + final boolean result = mActivity.getWindow().hasFeature(feature); + if (BuildConfig.DEBUG) Log.d(TAG, "[hasFeature] returning " + result); + return result; + } + + @Override + public boolean requestFeature(int featureId) { + if (BuildConfig.DEBUG) Log.d(TAG, "[requestFeature] featureId: " + featureId); + + final boolean result = mActivity.getWindow().requestFeature(featureId); + if (BuildConfig.DEBUG) Log.d(TAG, "[requestFeature] returning " + result); + return result; + } + + @Override + public void setUiOptions(int uiOptions) { + if (BuildConfig.DEBUG) Log.d(TAG, "[setUiOptions] uiOptions: " + uiOptions); + + mActivity.getWindow().setUiOptions(uiOptions); + } + + @Override + public void setUiOptions(int uiOptions, int mask) { + if (BuildConfig.DEBUG) Log.d(TAG, "[setUiOptions] uiOptions: " + uiOptions + ", mask: " + mask); + + mActivity.getWindow().setUiOptions(uiOptions, mask); + } + + @Override + public void setContentView(int layoutResId) { + if (BuildConfig.DEBUG) Log.d(TAG, "[setContentView] layoutResId: " + layoutResId); + + mActivity.getWindow().setContentView(layoutResId); + initActionBar(); + } + + @Override + public void setContentView(View view, LayoutParams params) { + if (BuildConfig.DEBUG) Log.d(TAG, "[setContentView] view: " + view + ", params: " + params); + + mActivity.getWindow().setContentView(view, params); + initActionBar(); + } + + @Override + public void addContentView(View view, LayoutParams params) { + if (BuildConfig.DEBUG) Log.d(TAG, "[addContentView] view: " + view + ", params: " + params); + + mActivity.getWindow().addContentView(view, params); + initActionBar(); + } + + @Override + public void setTitle(CharSequence title) { + if (BuildConfig.DEBUG) Log.d(TAG, "[setTitle] title: " + title); + + mActivity.getWindow().setTitle(title); + } + + @Override + public void setProgressBarVisibility(boolean visible) { + if (BuildConfig.DEBUG) Log.d(TAG, "[setProgressBarVisibility] visible: " + visible); + + mActivity.setProgressBarVisibility(visible); + } + + @Override + public void setProgressBarIndeterminateVisibility(boolean visible) { + if (BuildConfig.DEBUG) Log.d(TAG, "[setProgressBarIndeterminateVisibility] visible: " + visible); + + mActivity.setProgressBarIndeterminateVisibility(visible); + } + + @Override + public void setProgressBarIndeterminate(boolean indeterminate) { + if (BuildConfig.DEBUG) Log.d(TAG, "[setProgressBarIndeterminate] indeterminate: " + indeterminate); + + mActivity.setProgressBarIndeterminate(indeterminate); + } + + @Override + public void setProgress(int progress) { + if (BuildConfig.DEBUG) Log.d(TAG, "[setProgress] progress: " + progress); + + mActivity.setProgress(progress); + } + + @Override + public void setSecondaryProgress(int secondaryProgress) { + if (BuildConfig.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 (BuildConfig.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(); + if (mMenu != null) mMenu.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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/ResourcesCompat.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/ResourcesCompat.java new file mode 100644 index 0000000000..55a86a8788 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/ResourcesCompat.java @@ -0,0 +1,182 @@ +package com.actionbarsherlock.internal; + +import android.app.Activity; +import android.content.Context; +import android.content.res.AssetManager; +import android.content.res.XmlResourceParser; +import android.os.Build; +import android.util.DisplayMetrics; +import android.util.Log; +import com.actionbarsherlock.BuildConfig; +import com.actionbarsherlock.R; +import org.xmlpull.v1.XmlPullParser; + +public final class ResourcesCompat { + private static final String TAG = "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); + } + + /** + * 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. + */ + public static int loadLogoFromManifest(Activity activity) { + int logo = 0; + try { + final String thisPackage = activity.getClass().getName(); + if (BuildConfig.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 (BuildConfig.DEBUG) Log.d(TAG, "Got "); + + for (int i = xml.getAttributeCount() - 1; i >= 0; i--) { + if (BuildConfig.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 (BuildConfig.DEBUG) Log.d(TAG, "Got "); + Integer activityLogo = null; + String activityPackage = null; + boolean isOurActivity = false; + + for (int i = xml.getAttributeCount() - 1; i >= 0; i--) { + if (BuildConfig.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 (BuildConfig.DEBUG) Log.i(TAG, "Returning " + Integer.toHexString(logo)); + return logo; + } +} diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/app/ActionBarImpl.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/app/ActionBarImpl.java new file mode 100644 index 0000000000..81f7d80018 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/app/ActionBarImpl.java @@ -0,0 +1,1031 @@ +/* + * 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. + boolean homeButtonEnabled = mContext.getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.ICE_CREAM_SANDWICH; + + // If the homeAsUp display option is set, always enable the home button. + homeButtonEnabled |= (mActionView.getDisplayOptions() & ActionBar.DISPLAY_HOME_AS_UP) != 0; + + setHomeButtonEnabled(homeButtonEnabled); + + 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/app/ActionBarWrapper.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/app/ActionBarWrapper.java new file mode 100644 index 0000000000..fe479d0b86 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/app/ActionBarWrapper.java @@ -0,0 +1,480 @@ +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); + + // Fixes issue #746 + int displayOptions = mActionBar.getDisplayOptions(); + mActionBar.setHomeButtonEnabled((displayOptions & DISPLAY_HOME_AS_UP) != 0); + } + } + + + @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); + + // Fixes issue #746 + mActionBar.setHomeButtonEnabled((options & DISPLAY_HOME_AS_UP) != 0); + } + + @Override + public void setDisplayOptions(int options, int mask) { + mActionBar.setDisplayOptions(options, mask); + + // Fixes issue #746 + if ((mask & DISPLAY_HOME_AS_UP) != 0) { + mActionBar.setHomeButtonEnabled((options & DISPLAY_HOME_AS_UP) != 0); + } + } + + @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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/Animator.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/Animator.java new file mode 100644 index 0000000000..2caf5b4a96 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorListenerAdapter.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorListenerAdapter.java new file mode 100644 index 0000000000..02ddff48d2 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorSet.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorSet.java new file mode 100644 index 0000000000..3231080c44 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatEvaluator.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatEvaluator.java new file mode 100644 index 0000000000..e41019364d --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatKeyframeSet.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatKeyframeSet.java new file mode 100644 index 0000000000..1d1c52045e --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatKeyframeSet.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.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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntEvaluator.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntEvaluator.java new file mode 100644 index 0000000000..ed5e79ec64 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntKeyframeSet.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntKeyframeSet.java new file mode 100644 index 0000000000..5c211a3ad1 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntKeyframeSet.java @@ -0,0 +1,134 @@ +/* + * 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/Keyframe.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/Keyframe.java new file mode 100644 index 0000000000..ab76fa7f68 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/KeyframeSet.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/KeyframeSet.java new file mode 100644 index 0000000000..a71e1ad3cf --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/ObjectAnimator.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/ObjectAnimator.java new file mode 100644 index 0000000000..21d15c02ac --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/PropertyValuesHolder.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/PropertyValuesHolder.java new file mode 100644 index 0000000000..84f7504abc --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/TypeEvaluator.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/TypeEvaluator.java new file mode 100644 index 0000000000..0ea3192446 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/ValueAnimator.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/ValueAnimator.java new file mode 100644 index 0000000000..7f0f93efd7 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/ValueAnimator.java @@ -0,0 +1,1266 @@ +/* + * 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 + @SuppressWarnings("fallthrough") + 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/view/NineViewGroup.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/view/NineViewGroup.java new file mode 100644 index 0000000000..7b830b9c05 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/view/animation/AnimatorProxy.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/view/animation/AnimatorProxy.java new file mode 100644 index 0000000000..067d0494ee --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineFrameLayout.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineFrameLayout.java new file mode 100644 index 0000000000..953e3e8444 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineHorizontalScrollView.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineHorizontalScrollView.java new file mode 100644 index 0000000000..129b5aaaa6 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineLinearLayout.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineLinearLayout.java new file mode 100644 index 0000000000..1f381013a7 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/ActionProviderWrapper.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/ActionProviderWrapper.java new file mode 100644 index 0000000000..b136d50f07 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/StandaloneActionMode.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/StandaloneActionMode.java new file mode 100644 index 0000000000..0a87bd3f79 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/View_HasStateListenerSupport.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/View_HasStateListenerSupport.java new file mode 100644 index 0000000000..7d45e81be7 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/View_OnAttachStateChangeListener.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/View_OnAttachStateChangeListener.java new file mode 100644 index 0000000000..3869d32907 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenu.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenu.java new file mode 100644 index 0000000000..0354ad1ad1 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenuItem.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenuItem.java new file mode 100644 index 0000000000..510b974886 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenuItemView.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenuItemView.java new file mode 100644 index 0000000000..7d36c3b22c --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenuItemView.java @@ -0,0 +1,296 @@ +/* + * 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 com.actionbarsherlock.internal.widget.IcsToast; + +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 = IcsToast.makeText(context, mItemData.getTitle(), IcsToast.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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenuPresenter.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenuPresenter.java new file mode 100644 index 0000000000..876a22c589 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenuView.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenuView.java new file mode 100644 index 0000000000..0e3b1ae0d7 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/BaseMenuPresenter.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/BaseMenuPresenter.java new file mode 100644 index 0000000000..6da26f2ae7 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/ListMenuItemView.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/ListMenuItemView.java new file mode 100644 index 0000000000..ac25c37369 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/MenuBuilder.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/MenuBuilder.java new file mode 100644 index 0000000000..51bacd7bec --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/MenuBuilder.java @@ -0,0 +1,1341 @@ +/* + * 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.Build; +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()); + + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB && viewStates == null) { + //Fixes Issue #652 with sdk <= 2.3.6 + return; + } + + 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/MenuItemImpl.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/MenuItemImpl.java new file mode 100644 index 0000000000..f5359fb407 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/MenuItemWrapper.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/MenuItemWrapper.java new file mode 100644 index 0000000000..aaf2997b74 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/MenuPopupHelper.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/MenuPopupHelper.java new file mode 100644 index 0000000000..f030de310a --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/MenuPresenter.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/MenuPresenter.java new file mode 100644 index 0000000000..c3f35472c5 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/MenuView.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/MenuView.java new file mode 100644 index 0000000000..323ba2d88d --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/MenuWrapper.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/MenuWrapper.java new file mode 100644 index 0000000000..4eb8d09f45 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/MenuWrapper.java @@ -0,0 +1,206 @@ +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) { + mNativeMap.remove(mNativeMenu.findItem(id)); + mNativeMenu.removeItem(id); + } + + @Override + public void removeGroup(int groupId) { + for (int i = 0; i < mNativeMenu.size(); i++) { + final android.view.MenuItem item = mNativeMenu.getItem(i); + if (item.getGroupId() == groupId) { + mNativeMap.remove(item); + } + } + mNativeMenu.removeGroup(groupId); + } + + @Override + public void clear() { + mNativeMap.clear(); + mNativeMenu.clear(); + } + + public void invalidate() { + if (mNativeMap.isEmpty()) return; + + final WeakHashMap menuMapCopy = new WeakHashMap(mNativeMap.size()); + + for (int i = 0; i < mNativeMenu.size(); i++) { + final android.view.MenuItem item = mNativeMenu.getItem(i); + menuMapCopy.put(item, mNativeMap.get(item)); + } + + mNativeMap.clear(); + mNativeMap.putAll(menuMapCopy); + } + + @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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/SubMenuBuilder.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/SubMenuBuilder.java new file mode 100644 index 0000000000..6679cf3860 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/SubMenuWrapper.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/view/menu/SubMenuWrapper.java new file mode 100644 index 0000000000..7d307acb10 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/AbsActionBarView.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/AbsActionBarView.java new file mode 100644 index 0000000000..3a4a446756 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/ActionBarContainer.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/ActionBarContainer.java new file mode 100644 index 0000000000..0889825c00 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/ActionBarContainer.java @@ -0,0 +1,251 @@ +/* + * 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.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) { + mStackedBackground = new IcsColorDrawable((ColorDrawable) mStackedBackground); + } + + 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/ActionBarContextView.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/ActionBarContextView.java new file mode 100644 index 0000000000..9ec250f387 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/ActionBarView.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/ActionBarView.java new file mode 100644 index 0000000000..61e55b0a21 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/ActionBarView.java @@ -0,0 +1,1465 @@ +/* + * 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 com.actionbarsherlock.internal.ResourcesCompat; +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.Configuration; +import android.content.res.TypedArray; +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.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"; + + /** + * 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 = ResourcesCompat.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); + } + + /* + * 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/CapitalizingButton.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/CapitalizingButton.java new file mode 100644 index 0000000000..6a134a1606 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/CapitalizingButton.java @@ -0,0 +1,45 @@ +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) { + 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/CapitalizingTextView.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/CapitalizingTextView.java new file mode 100644 index 0000000000..cae8b8aed3 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/CollapsibleActionViewWrapper.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/CollapsibleActionViewWrapper.java new file mode 100644 index 0000000000..14f092c81f --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/IcsAbsSpinner.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/IcsAbsSpinner.java new file mode 100644 index 0000000000..ce0cb3bcaa --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/IcsAdapterView.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/IcsAdapterView.java new file mode 100644 index 0000000000..c786dc5c19 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/IcsColorDrawable.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/IcsColorDrawable.java new file mode 100644 index 0000000000..3e022e63a0 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/IcsColorDrawable.java @@ -0,0 +1,51 @@ +package com.actionbarsherlock.internal.widget; + +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.ColorFilter; +import android.graphics.Paint; +import android.graphics.drawable.ColorDrawable; +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(ColorDrawable drawable) { + Bitmap bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888); + Canvas c = new Canvas(bitmap); + drawable.draw(c); + this.color = bitmap.getPixel(0, 0); + bitmap.recycle(); + } + + 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/IcsLinearLayout.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/IcsLinearLayout.java new file mode 100644 index 0000000000..b7c6ff3183 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/IcsLinearLayout.java @@ -0,0 +1,280 @@ +package com.actionbarsherlock.internal.widget; + +import android.content.Context; +import android.content.res.TypedArray; +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.View; + +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, + /* 2 */ android.R.attr.showDividers, + /* 3 */ android.R.attr.dividerPadding, + }; + private static final int LinearLayout_divider = 0; + private static final int LinearLayout_showDividers = 1; + private static final int LinearLayout_dividerPadding = 2; + + /** + * 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; + + 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); + + 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; + } + + //Fix for issue #379 + if (divider instanceof ColorDrawable && Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { + divider = new IcsColorDrawable((ColorDrawable) divider); + } + + 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; + } +} diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/IcsListPopupWindow.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/IcsListPopupWindow.java new file mode 100644 index 0000000000..5da831898a --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/IcsListPopupWindow.java @@ -0,0 +1,661 @@ +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); + } + + /** + * Set the selected position of the list. + * Only valid when {@link #isShowing()} == {@code true}. + * + * @param position List position to set as selected. + */ + public void setSelection(int position) { + DropDownListView list = mDropDownList; + if (isShowing() && list != null) { + list.mListSelectionHidden = false; + list.setSelection(position); + if (list.getChoiceMode() != ListView.CHOICE_MODE_NONE) { + list.setItemChecked(position, true); + } + } + } + + 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/IcsProgressBar.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/IcsProgressBar.java new file mode 100644 index 0000000000..1c02d4acad --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/IcsSpinner.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/IcsSpinner.java new file mode 100644 index 0000000000..038d1e0318 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/IcsToast.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/IcsToast.java new file mode 100644 index 0000000000..042648b244 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/IcsToast.java @@ -0,0 +1,60 @@ + +package com.actionbarsherlock.internal.widget; + +import android.content.Context; +import android.util.Log; +import android.view.Gravity; +import android.os.Build.VERSION; +import android.os.Build.VERSION_CODES; +import android.widget.TextView; +import android.widget.Toast; + +import com.actionbarsherlock.R; + +public class IcsToast extends Toast { + public static final int LENGTH_LONG = Toast.LENGTH_LONG; + public static final int LENGTH_SHORT = Toast.LENGTH_SHORT; + private static final String TAG = "Toast"; + + public static Toast makeText(Context context, CharSequence s, int duration) { + if (VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH) { + return Toast.makeText(context, s, duration); + } + IcsToast toast = new IcsToast(context); + toast.setDuration(duration); + TextView view = new TextView(context); + view.setText(s); + // Original AOSP using reference on @android:color/bright_foreground_dark + // bright_foreground_dark - reference on @android:color/background_light + // background_light - 0xffffffff + view.setTextColor(0xffffffff); + view.setGravity(Gravity.CENTER); + view.setBackgroundResource(R.drawable.abs__toast_frame); + toast.setView(view); + return toast; + } + + public static Toast makeText(Context context, int resId, int duration) { + return makeText(context, context.getResources().getString(resId), duration); + } + + public IcsToast(Context context) { + super(context); + } + + @Override + public void setText(CharSequence s) { + if (VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH) { + super.setText(s); + return; + } + if (getView() == null) { + return; + } + try { + ((TextView) getView()).setText(s); + } catch (ClassCastException e) { + Log.e(TAG, "This Toast was not created with IcsToast.makeText", e); + } + } +} diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/IcsView.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/IcsView.java new file mode 100644 index 0000000000..a7185d082c --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/ScrollingTabContainerView.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/ScrollingTabContainerView.java new file mode 100644 index 0000000000..eb178e0de7 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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 TabsLinearLayout tabLayout = (TabsLinearLayout) 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/TabsLinearLayout.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/TabsLinearLayout.java new file mode 100644 index 0000000000..03d09b1f67 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/internal/widget/TabsLinearLayout.java @@ -0,0 +1,113 @@ +package com.actionbarsherlock.internal.widget; + +import android.content.Context; +import android.content.res.TypedArray; +import android.util.AttributeSet; +import android.view.View; +import android.widget.LinearLayout; + +public class TabsLinearLayout extends IcsLinearLayout { + private static final int[] R_styleable_LinearLayout = new int[] { + /* 0 */ android.R.attr.measureWithLargestChild, + }; + private static final int LinearLayout_measureWithLargestChild = 0; + + private boolean mUseLargestChild; + + public TabsLinearLayout(Context context, AttributeSet attrs) { + super(context, attrs); + + TypedArray a = context.obtainStyledAttributes(attrs, /*com.android.internal.R.styleable.*/R_styleable_LinearLayout); + mUseLargestChild = a.getBoolean(/*com.android.internal.R.styleable.*/LinearLayout_measureWithLargestChild, false); + + a.recycle(); + } + + /** + * 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); + + final int childCount = getChildCount(); + if (childCount <= 2) return; + + final int mode = MeasureSpec.getMode(widthMeasureSpec); + if (mUseLargestChild && mode == MeasureSpec.UNSPECIFIED) { + final int orientation = getOrientation(); + if (orientation == HORIZONTAL) { + useLargestChildHorizontal(); + } + } + } + + 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()); + } +} diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/view/ActionMode.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/view/ActionMode.java new file mode 100644 index 0000000000..7551dbf6c9 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/view/ActionProvider.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/view/ActionProvider.java new file mode 100644 index 0000000000..ae7cb1fe03 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/view/CollapsibleActionView.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/view/CollapsibleActionView.java new file mode 100644 index 0000000000..43281b013c --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/view/Menu.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/view/Menu.java new file mode 100644 index 0000000000..f461cc8145 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/view/Menu.java @@ -0,0 +1,446 @@ +/* + * 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/view/MenuInflater.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/view/MenuInflater.java new file mode 100644 index 0000000000..afe9f7361c --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/view/MenuItem.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/view/MenuItem.java new file mode 100644 index 0000000000..7fc3aa4306 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/view/SubMenu.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/view/SubMenu.java new file mode 100644 index 0000000000..397fd1c2d7 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/view/Window.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/view/Window.java new file mode 100644 index 0000000000..1d2828c581 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/widget/ActivityChooserModel.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/widget/ActivityChooserModel.java new file mode 100644 index 0000000000..d7f110fc62 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/widget/ActivityChooserView.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/widget/ActivityChooserView.java new file mode 100644 index 0000000000..7eb7330e48 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/widget/ActivityChooserView.java @@ -0,0 +1,839 @@ +/* + * 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) { + try { + dataModel.registerObserver(mModelDataSetOberver); + } catch (IllegalStateException e) { + // Related to #557. + } + } + 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); + } + + // Work-around for #415. + mAdapter.setShowDefaultActivity(false, false); + } 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; + + // Work-around for #415. + private boolean mShowDefaultActivity = true; + + 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()) { + try { + dataModel.registerObserver(mModelDataSetOberver); + } catch (IllegalStateException e) { + // Related to #557. + } + } + 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/widget/SearchView.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/widget/SearchView.java new file mode 100644 index 0000000000..fb8319645b --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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 = AutoCompleteTextView.class.getDeclaredMethod("doBeforeTextChanged"); + Method after = AutoCompleteTextView.class.getDeclaredMethod("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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/widget/ShareActionProvider.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/widget/ShareActionProvider.java new file mode 100644 index 0000000000..83e9f0ca9f --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/widget/SuggestionsAdapter.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/widget/SuggestionsAdapter.java new file mode 100644 index 0000000000..82d4f0c425 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/src/com/actionbarsherlock/widget/SuggestionsAdapter.java @@ -0,0 +1,758 @@ +/* + * 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 SearchableInfo mSearchable; + 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 searchable, 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); + mSearchable = searchable; + 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) { + if (mSearchable == null) { + return null; + } + + String authority = mSearchable.getSuggestAuthority(); + if (authority == null) { + return null; + } + + Uri.Builder uriBuilder = new Uri.Builder() + .scheme(ContentResolver.SCHEME_CONTENT) + .authority(authority) + .query("") // TODO: Remove, workaround for a bug in Uri.writeToParcel() + .fragment(""); // TODO: Remove, workaround for a bug in Uri.writeToParcel() + + // if content path provided, insert it now + final String contentPath = mSearchable.getSuggestPath(); + if (contentPath != null) { + uriBuilder.appendEncodedPath(contentPath); + } + + // append standard suggestion query path + uriBuilder.appendPath(SearchManager.SUGGEST_URI_PATH_QUERY); + + // get the query selection, may be null + String selection = mSearchable.getSuggestSelection(); + // inject query, either as selection args or inline + String[] selArgs = null; + if (selection != null) { // use selection if provided + selArgs = new String[] { query }; + } else { // no selection, use REST pattern + uriBuilder.appendPath(query); + } + + if (limit > 0) { + uriBuilder.appendQueryParameter("limit", String.valueOf(limit)); + } + + Uri uri = uriBuilder.build(); + + // finally, make the query + return mContext.getContentResolver().query(uri, null, selection, selArgs, 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/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/test/com/actionbarsherlock/internal/ResourcesCompatTest.java b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/test/com/actionbarsherlock/internal/ResourcesCompatTest.java new file mode 100644 index 0000000000..f621d3a963 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/actionbarsherlock/test/com/actionbarsherlock/internal/ResourcesCompatTest.java @@ -0,0 +1,23 @@ +package com.actionbarsherlock.internal; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; + +import static com.actionbarsherlock.internal.ActionBarSherlockCompat.cleanActivityName; +import static org.fest.assertions.api.Assertions.assertThat; + +@RunWith(RobolectricTestRunner.class) +public class ResourcesCompatTest { + @Test + public void testCleanActivityName() { + assertThat(cleanActivityName("com.jakewharton.test", "com.other.package.SomeClass")) // + .isEqualTo("com.other.package.SomeClass"); + assertThat(cleanActivityName("com.jakewharton.test", "com.jakewharton.test.SomeClass")) // + .isEqualTo("com.jakewharton.test.SomeClass"); + assertThat(cleanActivityName("com.jakewharton.test", "SomeClass")) // + .isEqualTo("com.jakewharton.test.SomeClass"); + assertThat(cleanActivityName("com.jakewharton.test", ".ui.SomeClass")) // + .isEqualTo("com.jakewharton.test.ui.SomeClass"); + } +} \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/checkstyle.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/checkstyle.xml new file mode 100644 index 0000000000..47ab84ec77 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/checkstyle.xml @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/pom.xml b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/pom.xml new file mode 100644 index 0000000000..2225eaed18 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/contrib/ActionBarSherlock/pom.xml @@ -0,0 +1,219 @@ + + + + 4.0.0 + + + org.sonatype.oss + oss-parent + 7 + + + com.actionbarsherlock + parent + pom + 4.3.1 + + ActionBarSherlock (Parent) + Android library for implementing the action bar design pattern using the backported sources of Ice Cream Sandwich. + http://actionbarsherlock.com + 2011 + + + actionbarsherlock + actionbarsherlock-fest + actionbarsherlock-i18n + actionbarsherlock-samples + + + + https://github.com/JakeWharton/ActionBarSherlock/ + scm:git:git://github.com/JakeWharton/ActionBarSherlock.git + scm:git:git@github.com:JakeWharton/ActionBarSherlock.git + 4.3.1 + + + + + Jake Wharton + jakewharton@gmail.com + jakewharton + http://jakewharton.com + -5 + + developer + + + + + + + Apache License Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + Jake Wharton + http://jakewharton.com + + + + GitHub Issues + https://github.com/JakeWharton/ActionBarSherlock/issues + + + + UTF-8 + UTF-8 + + 1.6 + 14 + + + 4.0.1.2 + r7 + 1.0.4 + + + 2.4.0 + 1.5 + + + 4.10 + 2.0M10 + 2.0-alpha-2 + + + + + + com.google.android + android + ${android.version} + + + com.google.android + support-v4 + ${android-support.version} + + + com.nineoldandroids + library + ${nineoldandroids.version} + + + com.github.rtyley + roboguice-sherlock + ${roboguice-sherlock.version} + + + junit + junit + ${junit.version} + + + org.easytesting + fest-assert-core + ${fest.version} + + + org.robolectric + robolectric + ${robolectric.version} + + + com.squareup + fest-android + ${fest.android.version} + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.0 + + ${java.version} + ${java.version} + true + + + + + + + + com.jayway.maven.plugins.android.generation2 + android-maven-plugin + 3.5.3 + + ignored + + ${android.platform} + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.9 + + + + org.codehaus.mojo + build-helper-maven-plugin + 1.7 + + + + org.holoeverywhere + resbuilder + 1.5.0 + + + + com.google.code.maven-replacer-plugin + maven-replacer-plugin + 1.4.0 + + + + + + + org.apache.maven.plugins + maven-release-plugin + 2.4 + + true + + + + + org.apache.maven.plugins + maven-checkstyle-plugin + 2.10 + + true + true + checkstyle.xml + + + + verify + + checkstyle + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/formatting.xml b/android/3rd_party/HoloEverywhere/formatting.xml new file mode 100644 index 0000000000..9b43767005 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/formatting.xml @@ -0,0 +1,252 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/library/AndroidManifest.xml b/android/3rd_party/HoloEverywhere/library/AndroidManifest.xml new file mode 100644 index 0000000000..21f84ac48e --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/build.xml b/android/3rd_party/HoloEverywhere/library/build.xml new file mode 100644 index 0000000000..2f6f323a25 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/build.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/library/lint.xml b/android/3rd_party/HoloEverywhere/library/lint.xml new file mode 100644 index 0000000000..49ef765ccb --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/lint.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/library/proguard-project.txt b/android/3rd_party/HoloEverywhere/library/proguard-project.txt new file mode 100644 index 0000000000..f2fe1559a2 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/proguard-project.txt @@ -0,0 +1,20 @@ +# To enable ProGuard in your project, edit project.properties +# to define the proguard.config property as described in that file. +# +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in ${sdk.dir}/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the ProGuard +# include property in project.properties. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/android/3rd_party/HoloEverywhere/library/project.properties b/android/3rd_party/HoloEverywhere/library/project.properties new file mode 100644 index 0000000000..a9057a83e5 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/project.properties @@ -0,0 +1,13 @@ +# 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. + +# Project target. +target=android-17 +android.library=true +android.library.reference.1=../contrib/ActionBarSherlock/actionbarsherlock diff --git a/android/3rd_party/HoloEverywhere/library/res/anim/dialog_enter.xml b/android/3rd_party/HoloEverywhere/library/res/anim/dialog_enter.xml new file mode 100644 index 0000000000..3d0abc1d32 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/anim/dialog_enter.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/anim/dialog_exit.xml b/android/3rd_party/HoloEverywhere/library/res/anim/dialog_exit.xml new file mode 100644 index 0000000000..f7d1f9b895 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/anim/dialog_exit.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/anim/fade_in.xml b/android/3rd_party/HoloEverywhere/library/res/anim/fade_in.xml new file mode 100644 index 0000000000..4b1ada8a1c --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/anim/fade_in.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/anim/fade_out.xml b/android/3rd_party/HoloEverywhere/library/res/anim/fade_out.xml new file mode 100644 index 0000000000..bc0e190f27 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/anim/fade_out.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/anim/grow_fade_in.xml b/android/3rd_party/HoloEverywhere/library/res/anim/grow_fade_in.xml new file mode 100644 index 0000000000..f0b51037da --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/anim/grow_fade_in.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/anim/grow_fade_in_center.xml b/android/3rd_party/HoloEverywhere/library/res/anim/grow_fade_in_center.xml new file mode 100644 index 0000000000..3d0abc1d32 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/anim/grow_fade_in_center.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/anim/grow_fade_in_from_bottom.xml b/android/3rd_party/HoloEverywhere/library/res/anim/grow_fade_in_from_bottom.xml new file mode 100644 index 0000000000..e5d00c27c9 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/anim/grow_fade_in_from_bottom.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/anim/shrink_fade_out.xml b/android/3rd_party/HoloEverywhere/library/res/anim/shrink_fade_out.xml new file mode 100644 index 0000000000..996dba535d --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/anim/shrink_fade_out.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/anim/shrink_fade_out_center.xml b/android/3rd_party/HoloEverywhere/library/res/anim/shrink_fade_out_center.xml new file mode 100644 index 0000000000..f7d1f9b895 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/anim/shrink_fade_out_center.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/anim/shrink_fade_out_from_bottom.xml b/android/3rd_party/HoloEverywhere/library/res/anim/shrink_fade_out_from_bottom.xml new file mode 100644 index 0000000000..31651b4e1b --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/anim/shrink_fade_out_from_bottom.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/color/primary_text_disable_only_holo_dark.xml b/android/3rd_party/HoloEverywhere/library/res/color/primary_text_disable_only_holo_dark.xml new file mode 100644 index 0000000000..ee8a885d44 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/color/primary_text_disable_only_holo_dark.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/color/primary_text_disable_only_holo_light.xml b/android/3rd_party/HoloEverywhere/library/res/color/primary_text_disable_only_holo_light.xml new file mode 100644 index 0000000000..c204ec7157 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/color/primary_text_disable_only_holo_light.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/color/primary_text_holo_dark.xml b/android/3rd_party/HoloEverywhere/library/res/color/primary_text_holo_dark.xml new file mode 100644 index 0000000000..8066c63408 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/color/primary_text_holo_dark.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/color/primary_text_holo_light.xml b/android/3rd_party/HoloEverywhere/library/res/color/primary_text_holo_light.xml new file mode 100644 index 0000000000..790c7496a3 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/color/primary_text_holo_light.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/color/primary_text_nodisable_holo_dark.xml b/android/3rd_party/HoloEverywhere/library/res/color/primary_text_nodisable_holo_dark.xml new file mode 100644 index 0000000000..ffabcf4ac7 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/color/primary_text_nodisable_holo_dark.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/color/primary_text_nodisable_holo_light.xml b/android/3rd_party/HoloEverywhere/library/res/color/primary_text_nodisable_holo_light.xml new file mode 100644 index 0000000000..d2c70ad179 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/color/primary_text_nodisable_holo_light.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/color/secondary_text_holo_dark.xml b/android/3rd_party/HoloEverywhere/library/res/color/secondary_text_holo_dark.xml new file mode 100644 index 0000000000..30285b3335 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/color/secondary_text_holo_dark.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/color/secondary_text_holo_light.xml b/android/3rd_party/HoloEverywhere/library/res/color/secondary_text_holo_light.xml new file mode 100644 index 0000000000..2b513974bb --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/color/secondary_text_holo_light.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/color/secondary_text_nodisable_holo_dark.xml b/android/3rd_party/HoloEverywhere/library/res/color/secondary_text_nodisable_holo_dark.xml new file mode 100644 index 0000000000..6b6ddf2aa3 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/color/secondary_text_nodisable_holo_dark.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/color/secondary_text_nodisable_holo_light.xml b/android/3rd_party/HoloEverywhere/library/res/color/secondary_text_nodisable_holo_light.xml new file mode 100644 index 0000000000..6b6ddf2aa3 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/color/secondary_text_nodisable_holo_light.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/color/tertiary_text_holo_dark.xml b/android/3rd_party/HoloEverywhere/library/res/color/tertiary_text_holo_dark.xml new file mode 100644 index 0000000000..041e38878c --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/color/tertiary_text_holo_dark.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/color/tertiary_text_holo_light.xml b/android/3rd_party/HoloEverywhere/library/res/color/tertiary_text_holo_light.xml new file mode 100644 index 0000000000..994b1f839d --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/color/tertiary_text_holo_light.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/activity_picker_bg_activated.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/activity_picker_bg_activated.9.png new file mode 100644 index 0000000000000000000000000000000000000000..e591a7b009ad931342bf25593aa270489ce00436 GIT binary patch literal 326 zcmeAS@N?(olHy`uVBq!ia0vp^;vmey1|%P7U0DF6Sc;uILpXq-h9ji|$mcBZh%9Dc z;O+!rM)Q-W*8&A!c)B=-cyw-^YRK2DAkt><`#kQzRpuEtPA+6$alJ5qSGBCI1G~8} z|ASYoRgKqKH8K@dx#|xw@Y}^T%x~`y(AaqE|4F5k`^{fB#5S_6XfSHn%*1VQHuvKe zX0|x~+mbIDqCL{&dL8VyALUlq&g6b@#n-v-o+R`=(zubcphE4lnoz{*jSoXpDp(7G zWbd!8U}<>Qw^3-q9l?%ePd+4cziU(vF8Xo)zmV`eAJ2!kT(t9)ck&1=65a9Q%=Ebe z^TmG1oEDL^liaaNAz9_a3hha?3u{|=-HtNKBA^Q^xs TcBLK$`kBGg)z4*}Q$iB}9#MTD literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/activity_picker_bg_focused.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/activity_picker_bg_focused.9.png new file mode 100644 index 0000000000000000000000000000000000000000..ea27290d76dd858d01935506622f40dcb2c64e56 GIT binary patch literal 263 zcmeAS@N?(olHy`uVBq!ia0vp^;vmey1|%P7U0DF6Sc;uILpXq-h9ji|$mcBZh%9Dc z;O+!rM)Q-W*8&Asdb&7 zyim)kBl@a5huvbae;oe=Dx{T_$(Ca38}9#yK)QED1AqJ&S8i|4^Db znV~@2-lAhs9dpF5zC|xgyH;kOGflES*MDic>(!rmTj^!WN~pqm*OJYD@<);T3K F0RSCOWKRG9 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_label_background.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_label_background.9.png new file mode 100644 index 0000000000000000000000000000000000000000..3fdf8a2d55de7e4aa1e16e1e654a9e86157acfb7 GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKz3?$tr89oG3oB=)|uK)l42Qq=6E^uWmkYXwc z@(X5QD4TrN0?5Sajv*Ss$q5p760$S|S{yC;6q*XBG|z1o3TYN)V2JYI5>@zQb`z+S N!PC{xWt~$(696c;AsGMw literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_off_disable_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_off_disable_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..da1134a8920d15bcb6c01ccbc73f894e2252b012 GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDD3?#L31Vw-pXMj(LE0BhO=H!r<@AV%w9XJ$KXg z-aUf^kX0Vhn#d2-FH#cZ7tFxK#j6q!nG!82B&?>+!{)E-$7%Hc+zp_7fv1aONJZS+ zD~3!B3LLG8tu8@l*8IM|m6^lYkFVzQ@9W}bkChg1F4|--H1m?7_ynWLjm1rx4v#j6 zgj&uF;9TJ$>^j-0D&Y22(eTw_3bq=%-pE!wXk_PB-%w}#+MVtD`PDs-6)zia`CWJM e%drjO-x;5*6DfM&G=~*vH-o3EpUXO@geCy=$Zo*^ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_off_disabled_focused_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_off_disabled_focused_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..e6951f40ba6fded8d3f6f2b2c01e68402663cd67 GIT binary patch literal 273 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sHUT~%u0Wb$<{7MrY06QNf_|~w zE@LEstg_-^rW{baNJ)@iFar}8uS!5rR<#LUyhF~q_@IYELog0WjcsK8-TLP%H>vod1}XK+hff(WN8OLRs^ oQi{g|AD$hP_|LJJb4_4i$amq*4!h;)1~h@e)78&qol`;+0O=+!8UO$Q literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_off_disabled_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_off_disabled_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..4c065f93ee62859a5ef5b8c66250844850e99a70 GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDB3?!H8JlO)IL<4+6T!FMP2H5u2dpA&my(Gvl zn1RcR!IW?du44$rjF6*2UngBCLCN}^8 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_off_focused_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_off_focused_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..1a4d882e6a1b7f852d2a4ea468efb68f7d2ed20f GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-st^qzFu0Yy&>r?#5YTJ|Sy>|-s z-9Cc^khMIYzIq|hAn}qQzhDMteqpnUHdDT79p$QW3O;@kysai>Oi2#fEGEIwtE@MUNvO~I(sO^V-D10AetssAY4+6uKc7Y|;1^^u zTvNd*b3`{a?3R*+T7yfgM61vTN4>3vSto-W&KgK%E@))i&;8E-!QZoA+TGh;A6~sB p`Mtu6-wE%2JE$KzydvL{G3mO5{%lD(pbHonJYD@<);T3K0RYn#d0qej literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_off_focused_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_off_focused_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..ff129f6db21d774d9d78f1b1201bc85c3ab33ec0 GIT binary patch literal 356 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sQ2{<7u0Wb$<{45E)0Crv03JhNh1?eAVM~$viw0c&~UkuAirP+21aI9Hg-NaRdwgO&aT?&J&q0z3l_{V zkaDWwl{GoSHVde7wx^3@NJZS+tKNLA3OsFrjh})X1wXv~x4rVYNAcx_oauM+e{El! zaYKH6wVs1k3(LXCO8#3n$MzD{SMstyoL4l#ZZ~s%bUcuEMWa2xZpfb?THt`nqMj(CfCee rZ}_ah{>L4A^8&Y8jVIGxFZ^Nn@>6H;i+~$$py2X!^>bP0l+XkKShtJz literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_off_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_off_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..dc2e87adcd70538f10f2ed977f9a8e6e63aaf702 GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDB3?!H8JlO)IL<4+6T!Hi%4Dd!-O&Tb{UJ~RN z%)slz?Z+hXW7))uKp`tn7sn6_|KtP-)(FPc3l(HI*cChtR%;w=oXj|hWwErAdl$o| u7NsU#6D>m{l>$|^IVaiEo1|Gi7#LpL@m0%3%c%iPVeoYIb6Mw<&;$TCATiqj literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_off_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_off_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..d90965f534e9885e952193365aa9f787457b5b63 GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDB3?!H8JlO)IL<4+6T!FMP2H5u2dpA&my(Gvl zm_cf$*c@hqU{~-oSgmoeaWdm1mc`Oe?p+L< uT9le}O|%S+R0>qt=A2|tZ<1#9U|@J{$5$;EEvE)Fg~8L+&t;ucLK6TB{3x{m literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_off_normal_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_off_normal_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..43323f8c30b2d76f5f4c34106b1221a40356ff5b GIT binary patch literal 366 zcmeAS@N?(olHy`uVBq!ia0vp^#vshW3=*k7AOWP(0(?STf%JbEc=P7X`}gnf-Me?| z)~)N;uV21=`ND+@FJHcV`t<4Fzkh%I`t{?-kFQ_9e){z3(W6I4jvP6A_Uy@%CyyUL zzJLGzLx&E*jKM-*_g6atv`MKX$S;^d%{{{q8(G+ zw^z;i4jTxt22MU_$)5W2-}Eh4`7Kzj9fS2g+}gj{&^&ZXsql_vdfY0p9#;jkoOg-& z=r3dc{I^-F=xW0Op63?NlP<|<8mfDpnJHAf@JNiNp|{tWCZWyCkH}~kntPq;6571% zNREbKwAYzFq0bAB*k~H+d!3mp^m*ZtJ(`A_tbhJ~W<6`;^_let|DW%e{fn`3mi+#G SzY9Sj%i!ti=d#Wzp$Py#4!L0f literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_off_normal_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_off_normal_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..b96e31b856241366ff412cf820e33158cf865dca GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^#vshW3=*k7AOWPj1AIbUf%Jb8!TtO9-@kwV=g*)0 z`}hC*_wV=b-+%x9{q^hD^O<{-fyN1x1o;IseBR5(eyh6V^6%2WHMcKb62A~#1eB}r zba4!+hnaLrC z5jl(*3KdoklS5xV5< zE$0(k;qBV(-E?cYB7h9AD)P5Yz!7P^TJFCwrB}NR5ZKmR0?PVx1jOg)v!<*XW^Ed` zux;AH=70Fp|C9m3KnZPRg+8*9JHiLZ0T||Ie`r+_#ofw+s_GhM zEsOCho6RUKe9%a_;pvS!rSK;2t0|z>-9hkkA;1j(^ql1Qn}a~&g$Nr<9Bjmn=i8J4N1a}2?S#%l8i-Dsg_qve|A5Op9 z+qZJjtFa<@PKAkxJFLX0Sbum$`KbE4(8B0g5W4Mm%?pR>W@6rOHtdCc?+*!YP8(Wu zL@r8p@kqPyrX%%Bn{|-IQ2{i9D?fGIAcECwuHU6Qd}}w@bTp1P=r}$$apm2E*MT3; zfH@24DTGk$)#-idDI6vGsmpB}qcY(=Se<;@To?K~Q}l~kQ)1df6MRI>MxKXQwcX1% z*gfFnnf@9Af_l^kQ{zqN%O*3`D<;#uy6Ym{6=Y`Ta|KLo=0Yy2rW$*`U)xCeELCZG za2z@27vu5pm6}TMwR#0v$=nmg5X0DkUYb7Ft6i^TzbYdWRScJv6^Dq!6}5Uj+K;U{ zs)a=t%f-^a_VHtM8n+izZYHg%gqW?APFfKARd~{UJc0cQD~kmCo`Y(n^xN`*&=2DM z39s@x{l|Bq%O<49a)yTpopO$b4VMp0d#l40!e;$Tjz2;KeQ)g6MU!hXXJo1_1t@n^ z_gU^p8051zF@lZeA;pW8xPvIodXH;!6jDm{^E|c2_O>1}F=b7_DOZQkSNHu)&?x=E zGh1TkF*DaH9|Q8nv&DKDT`9{_2{PU3>3|is4%|pGlsNGd2(0HLSs7GcDeRnrUY7LBV?|4MWSK#! za#wZk@CnC2Y1uy5`1JO6YY!XikpJF{H(p|4h7q?}!xRW;jA~z1Z!jPoPe@eu?q>0x zY#wFJx@#cH&kkms_I9m^pM5!KE8A9#R4*Nu_)nVmkyML`GlOJ}-qf3%JoR%1slGh( z-@K@Px^>8m@{=^zfP43Nc$woz7VUnT`0!+8^$DCP9!dHK^?5H?){ zk~OV;M_8t`Yv$7UvUzmm`?KM0@;wNZ7K7kAwjApm6+H7y(H_ZoEm-K7^JgcQRgU5~ zb>)8AsZWY<-Te6vJTs$2N`D&+S<+K7fb!QWdG0>zUeSRm^K5ILR%RGIwJ=}3n6@{d zNG(Dsw3XLvo#&F+ixv*%uLi9NX|I(L{Ph7!?2r4#gze^|sr6>-HH9;-2e~|ZMz(SQ zAy8V0GT+t~*WruzR{$g25eLS*p=#rs@?0kdJ|LNZ2mV?bp|)Ags?^0R9T@(e*l7+8*2an literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_off_pressed_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_off_pressed_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..98c4abf94f61347a2bb9312e220186cbbac754c1 GIT binary patch literal 2021 zcmZ{k2~bnl9>#+rRGwHVqeb%+gg`5@+ypxaf|Qy-q6iokS$s$!0Rn_wWRpNZ!VW=} zXdoZ~F{Ug@fcOBhG#H==tt=8`kww5N1X~KIEcS-9)XuaszjOZI{m%El=iGZ|ZkoNV zwX)J7B?ttfj6ox@USzlevs5dOpmevtrVbGP!HK-r&w z?K#|!ca&*>KMk_&%Ps-_3vd^3{s-z`05ZVFZ4HXDF1U-&9}cKpr5e8FOCKkPyLD7= z*~zzGxJ)>*o#MeyOOL?XI_ywGdHN9p0!cw3p}-rn zVSig<@_p(l;=A4Ls_KHZFm<8voAmbo^d0U~s&4P$J(y-P8#%fZ#b$So>ah{sVU+^c zn*|qi-rmN=CqO)f5}nKD#O~GiFE>q|(@SZ=Xh~e^viM@|$gWStC&i5xn={(D zI3EAlMie%Nv{vvI?M%_{zM(kGnNC@2j*T>ma+<#Lg#&=r%Sa)e!#*jy-o^|SS;Itm z-yY0y)Dz4Sab|Q*iMqGbbffRtwpLmwhGVwo*Y}%7?U99n>Lay`&*NZ7TR2q9>!@m~ zqx~lpHG!g3#{TAf=hR~CS(+vaxevcjgIM9%ltOyNLXED_u<~JUWkjZV?=c0^vYm^% z(U4ZK&$_j`WS=<1z&xjElAM?vzo(RLVkNJIGL#tjT~eaOy2`1&5}YyiSs{(UQS~++ zW2Hn$=G}2)^83x)iIA{51j`DbsaTHZkS!E`t+Iwm>Ih#Q2YF24 z0Njv$B1>se3B#k|5aA;|KWT8ib4_MZ;t(q~Ot`n_w)|{sCV@*^!U`TW%^6vU;i)8@ z13!$8nuJSse@CIOpHhLfokbceL>X*eKhzSXk!bkgdTr=%%FXXwkN0Npdz=ilM3|I9 zl_0dlZu-eJ4OL}phQ$J;*fr6@c*<^eolGf$CM-n8yK+B3@;~25BndsNl)vW3F+Jtv zI(@%1a2VO~V9(gAAGPA^%ie`I8Y29uulx4Mb>;;^c|`Gn+&MLk;|TwbM`zrTEGNa5 zmsI;BeB3amJY#GyeNW7ITv&tCR~=c}sb{#C0tMr-K7(%B82|HwsCep>&oE_Sv;n0e ze7t}xkFeU2HS0g~#F>xB%uLYdF?rhR8AFmALFd>F18(WJth%4acswBa#@=uEJ}Ce6 zM&+HumzTOTFa5%2wenjhSN)6f9~CTM&SRT@S>rUn#@-1HstYwe&*&*!x3$ePQ;v); zr@9~g`hsHX+cf-o!r_&K;*8df%~OqZ*m=dZ^da&!Xy`~)zNRKhGim)0m7WeUUR%BjBdTsgOKgjPnNnd&ALeZx8laq+M2}9WZCq{!_7^ac5!vftD8CkpZ3D zFHJlluHh(xJCiea&)Ho0hj;gJN|e{>$F!3Q`7mMLD6Hr7tq#j*J*cFAsp?@w#}yPt zNv@E_sH~(fq5I3s+@`yJ{w?q!^We3N|C67!j1ao2*~EK_Gf#LkQCG-J7&Q_5 zDK>ypJ?Q2h&`|&M#NIQizU${U!(%q)$9kz62S=@}-;BPb%#o>P)!B@;UpeHt$yZB5 zKaSI;mf4)00$9^ho5y?-Dd%*M-@EkBcCfdWR9f0zm+9xIP@vN1Swo8=0O!m;%Q7fUzk6 zGz_=T|E+-(j3@d;|9eAwa-2Qba8SB~L$FW8Ra_VWVu=s-B4}VpI9~#mfWt?Jb`i|L O5Cns=Mb>=dN%_4ZMN8fcwtHM7wIRp z%Ay2Sp;*(Fsy7? z(A4|E>rOuI1&6~2?y;-KA9{QAOd+U*X+nSyB!n1Yg7yHyuDl@MJI!1QxcxGq5@uLH zh{eqkB7`}{yc@3T5zf{4-T-r{{uofF)?JkkLktUhLRcUyGM3zMU0>kbIledSbOPLC zH-NcyRetu}_vg#+kD}SlqiC+!isno0SfSjGndM^}6$XDU(0abqisg#USa!4dVi_Dx zC%`>+1K4~#zZ$9t@x`VtN-bTK+X+!QNr>ucQhYeOAJvm2a;#i3k_88I1;Oo)0j@qq zfhw6RxAi;1x6e~T{P1F%fHmYGw{jfMfy3#7KL$d|1{;WAp35{65bqYg(>27$pFny9 zeC`^wX6I~CZuK;t2M2S7z&&;YILEQ^xb;sfC-H(M9>P1e@ZF2F_;i^Td%p-h{&{I% z!y0l#2PX6aIG8I8ZodsIR?p(5CB6&chAq685%oS{;6mR5naLmrCdjmIf@4w!<_Sw% zXS%sV)r24jtC9G|;HB6f60TOn0Rz9|TAkJ?2f1WAVS)o({u$6z7|(ai9Nho z5ua~Y@8IAXMl2KP5}8iA4QSx@-#{l}Vy-dg7!^nSm*1=6>z}ndfQiFv?nFOBBj+*T z{|JdL8E{n}Rff=Sf7d)<6BsFUfx0#_FtJSx12jIUD8_@TkIJ)XFQ_v-N^D?qo0yML zGEf*9pz1%yz>Q^q#xCVKMty&fk%7ErpqIgHJM;gb0cSHetPZ3+4>I3hB}6BYvo^7_ z2hfFE?t-`a=ny)E4G#mJR|(%==I9j4;uzg?#%MU&$nKNK5f6h6eirOrq&zQkzQ0ay zoyV3%H%TUvIgAA6y4E+$#=tQ5hiP;F%0^>onDv2ywS28-AUC_y)jhA%@(azRzf#IC p^%MWMiVPVtWXO;qLxzk;$3NumD2_Aq|L_0+002ovPDHLkV1nBVk8c0~ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_on_disable_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_on_disable_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..5cd7fc213c499882dc36128de0e1271c06c5bd44 GIT binary patch literal 950 zcmV;n14;aeP)vtWGIy3^y~}?3H{W%--{N{d=!{Xk8*ih!7z{ga{E1$E*FA>-D?1`x+j`drLfw zr2$PxLf8L3zq~qo`secKS?A*W{O|Lx3%@#F77sh0mVTaoh_z4N#|@76miyr6=!3p^ z2k$}yTF`{H?IVv5;!*SweqxLW5FtV)BFy9sB8<#^1N^R^wY-;C=g_v-07i>HaFmcZ zp($dTm?36~IU;(4Ic}TbzEk|J#9BUR+iC!{iYez&lZY_!m=kD@jQhv0;CS+(HpMP7h+kgj)kL!1eh^8p{waqbotu&@5N)Plzc{pfCztxR# zeRX|Yf3Ys1z@FJW>DJYdt76~RRqk6Im{CWy(F;zdFqn(V5 z!lY#+Rg$yNV6D($=kt>71`cQ&rvUsq~G{TekBHe(rCBO?lx95h%< zJ~;gtv)uspa$b0|#G+OY=8eSbBf8oEK3!|}VLqq!t`Qi93AH+rhX!kfe?Z$I0}I!Z~J7wYanVEXa$N!@+~vz z%#KITzUh$xJ22vfK^V1WLaT*}Y#?eFFtxq58o;%HPu3_A&$gsuU-G+d{pB8TF>W&A zMjM;(S>=?j8wTR6HQ7FXyX?Gy?eQW?rkA{H2ySyW$Ry0Fjjn;9(*_1h$TZ+Zg4W0n z0p`q7;`N}^*?^-ZG`NUipkR~_4D9~T0IvmO1}p;ui`emPG`lV3kra|ctq)J0*8obW z*;hgX+o{`MtrjlQ{+YPI0NLFV{XBHfU({bvA-^uZ%_4ZMN8fcwtHM7wIRp z%Ay2Sp;*(Fsy7? z(A4|E>rOuI1&6~2?y;-KA9{QAOd+U*X+nSyB!n1Yg7yHyuDl@MJI!1QxcxGq5@uLH zh{eqkB7`}{yc@3T5zf{4-T-r{{uofF)?JkkLktUhLRcUyGM3zMU0>kbIledSbOPLC zH-NcyRetu}_vg#+kD}SlqiC+!isno0SfSjGndM^}6$XDU(0abqisg#USa!4dVi_Dx zC%`>+1K4~#zZ$9t@x`VtN-bTK+X+!QNr>ucQhYeOAJvm2a;#i3k_88I1;Oo)0j@qq zfhw6RxAi;1x6e~T{P1F%fHmYGw{jfMfy3#7KL$d|1{;WAp35{65bqYg(>27$pFny9 zeC`^wX6I~CZuK;t2M2S7z&&;YILEQ^xb;sfC-H(M9>P1e@ZF2F_;i^Td%p-h{&{I% z!y0l#2PX6aIG8I8ZodsIR?p(5CB6&chAq685%oS{;6mR5naLmrCdjmIf@4w!<_Sw% zXS%sV)r24jtC9G|;HB6f60TOn0Rz9|TAkJ?2f1WAVS)o({u$6z7|(ai9Nho z5ua~Y@8IAXMl2KP5}8iA4QSx@-#{l}Vy-dg7!^nSm*1=6>z}ndfQiFv?nFOBBj+*T z{|JdL8E{n}Rff=Sf7d)<6BsFUfx0#_FtJSx12jIUD8_@TkIJ)XFQ_v-N^D?qo0yML zGEf*9pz1%yz>Q^q#xCVKMty&fk%7ErpqIgHJM;gb0cSHetPZ3+4>I3hB}6BYvo^7_ z2hfFE?t-`a=ny)E4G#mJR|(%==I9j4;uzg?#%MU&$nKNK5f6h6eirOrq&zQkzQ0ay zoyV3%H%TUvIgAA6y4E+$#=tQ5hiP;F%0^>onDv2ywS28-AUC_y)jhA%@(azRzf#IC p^%MWMiVPVtWXO;qLxzk;$3NumD2_Aq|L_0+002ovPDHLkV1nBVk8c0~ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_on_disabled_focused_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_on_disabled_focused_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..dbbd8b9d4d0ecf08b313a7b06aa8796ebd926f16 GIT binary patch literal 762 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sp96eCT!A#h%rihRbN?A21CBW6 zUJze)U26GFAd*>mi)X*(sd0S%H4TCLDjJG}oa)AhF zl)|c8CTp(Rth;8r?wZ~DYbI-NoHz}#0s@vEI^OdA!%+|k0Y^@qIeO~M zp_5Q9oH}*-%*oSdHXl19F&`=>w&)UE7APe;@63wBXR@}OQCN8cA`Uca%ds<->#o6- zK^Q>i0sVD2UB?0F>%fvAzhIE}nV4BvIfNypMA#WQwF0AK0)<6_QsZKnw3QST3us zQ$1ZALn>~)y&4_f8W})bF$23FyU0d;Ws<(Ughh5l6?NVtvXx4>9=14)pgJFHw7eIc=L^Q z%H})z*0#Tu3*KbdOL)~Ze6L~n{aJP*|BZi1C7vmUl0EC^+&?cL8?N<+)iI%_INSYD zrvIY9cWbxBoSRf3@b2#ce%3eb{Qdq@R(Ua1)O~DL5V5a*`StDGOFmkR9*6rCMCS2U zFT9_-jpOaAvoy+Yc(H(;p~I+_!rc(7qArAUQc3}FFEJ7Aurnn z#lw+l&et!z_FYwMF;&BP{n^znPvnxPg=vXhaQ77}cvqNJ<>+#bpY?C3L_$jJp>4ju Y*t+afvvv3F2ba$C$q{Ffb~5 zx;TbZ+=U|Lf3jw# z#jqYqnd-g!S!9$*X5>nTImVfLa(*Y(7O!U8RTs=Hb;6dnLiy|71+zT&a=Dbt{QY*} z{_Smx*)JYWKDoQD?oI34%58jG{%-P!{&@ZUD)sAIOA@~SsV=(}a@G6#{%cM9S#2Gz zynk(WC++OQ{{lMwhvg0&StR`1wu;MP!Ey$cDj^`n$O7c$*j*H6c=TG@mUlxvdj->{ zFiwV#X&Y4d7&_eBScByoDyGh`|K{`6_*#yMjKr$){LFNzH+wGM;@@}1?rh@!&P|}i N;_2$=vd$@?2>=j*=c@n! literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_on_disabled_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_on_disabled_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..1419a5a08d95634f3110d49a94432695c7b7ed58 GIT binary patch literal 385 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sApt%iu0Z+>wZVgDT3$eNWlDnl zf*IJ1)fm*7xeX+Fq!=|M^jV~tI1PnWSrz$2bt{i7cn(x|z|+Msq~g}wD|>~S6(n2& z?F3j32x#Mqppx|#y=#F*n^*llEx5gj2 zcHG^D@#EXAeo4FI=M^!n`n70s2J^3y8m5q|Ym(+&G-ha=$H?(T#9_g51}0lpfoluY z8IopQC~o-6xWS(xTZiFinnCpsrzy>@pFKq>Cy6)-X z7*cWT?Un69hYSQ<18<6HD>M69Oep^GU*Ba$Ha7bm*Ys_gPfPYQp#+K54?ZAa$4j4(+yGU z(;L^`lv}V%_!pBc`>MA~mn_WRA$Q>G?jsh4->Of?-nid$+9&&M@{8#!muVY1EMGm7 zyL;W=uiSrY(;6<_RQM&gmqp=%Hv`jN4uuP+ffS3vGygA44HbJYo@V%MeL(#|{#<5` o`#jT*FWJ$5Mn2Otch(O6?~GiZSkE0$1A39c)78&qol`;+0Et1TbN~PV literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_on_focused_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_on_focused_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..84a65aee594bbfc3bd0be680d9bd46559930830e GIT binary patch literal 2130 zcmV-Y2(9;tP) zOE2N65(r#M8-*m)38jgR8U-gvi4oX|b8%v`yWVq~`SmyJk@s+H$MMEic<^{Xnt3|s z^PS(!oU?1T**1AF;9(2w8=kr^f%D(Ze{}+obS)0JTo`yr@<1f}q!Y&FlRbsF&j7zY zw{G&TWwM6495|*41_vNh;Ob8es4e4zNs=MV`;Z5MYd}%!W($Rc=|T}~!vKqOFepXJ zFj(5QSjsR_g<3&gYB1L8>#i9llQI7fa}$x{0#(>2Tnp@0SBXuW*{xcXT`Zp_~AR9{rv+k zp_Jm%$eX`oPd+zp)^BHteIVBqAeLGx`CqrO_MFKC*+{&HJ8FH&5F`Q!s$PW117v21 zXoYm|i25rbn|$Y1xe%WJS9?oO|I564@Ec0E1x)+XkvD(C4n6y^xn+lv7Kz!1#2#23 zHSYtQd`^r+J{ba*B%9|q`M zo0u$K{LddV-GlFDx`$MyQIiaUYp#GqPyymI%M-_30zLaWfDC^SOl4<1qS z-k0RBP8P?{{W;UK?|8bszsLYY`~jAL@wLdS4^m%7uEnZybZ)0hm&fWwxtJl*G@<$| zk<)#a1hc_Mr`j5KY$N$0lD8A`6H~=YqsP*H2T$3pz4HQ5BBBmJBr8zEYXKkw@DYqy z1*~vpIxR-t*pt8Y$;;8%;Q>xFPfiz_GeA)?XS@0?3KQ^ z7y?C<4K9qdHq>W-xRN|ok7oYB>0o;vri-O--z=7%nf1JEAcTq;=@7}c(Hbg1gb1Jl zL|@#oy)$q1whj#aoVV}!=BJp+S)D^q(aG}D;KIKKy7v>yowRRF{&xewNK3MIc~NPXgbasK31cYDK+{HDIA=7eE~QnJ9X zQrqcRY{W5s{o>hS1b|&>>lxaVhi;?od`W(a{ zG`8izw7?UL%@}rS%kBdQRnptiFqe^ky(0fu$6XRA+kl)17|KAOJW`+(0mYyo(&P#G z8lS`ngaLX+fXm##69sOk{#pF^Lv^he;vsHGUb#Nvz2%8{2auv;h{!@Dd1P4G4nZVj zNKsPENXXZ)gb)`3STtHZn*kzvS{5>0gU3tb=l)7(`86s$Dq-!tlKd>w@`RTL=~IA+ z+#`~g3>m5xhzMuPUQ)iM3ZVL^04YEb`?eG^fFRv5FvmDQK_P&IenORK1pNZGD1UkM zSa#rvCGv_KmuLeDKqi^aE{RY`yjh&b8%KNDdc4dbCtN@o4?y?~fT!E~?vO53;=iau zq#9cDDzra!^>cc{{v|h1nfW;_T~@s&sN<3w3!{w zWL1450|4QGE_F3T6cgkz;!WNIbOF)d_y84aZUAOp-8s$52;f!VKw}=zxPs&mF1&i{ z(8w&3v=@#_g%XwyNOaVgP}fw~-p~ML$#@~E+~hDxNrJhRiU`=EU$qH_2!PA}vW2L6 z0-5gB$S063TwC2^-2x=OhZz$kGg{`2|< zB8f6FM|i6RfLi~-v4Jf8r^YM$YYGq#@zBunn{2YlCSTF^f9j+60Xyw=3jhEB07*qo IM6N<$f(1eO^#A|> literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_on_focused_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_on_focused_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..693ea6bb97f0d062c26579447f19e2d0402843e0 GIT binary patch literal 2136 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 O0000WsV7o%VQ~nN`+8nwI{meyaZctGep+ zXr$)V)c+<}Z-Cv$W^W4M>|Z+8)j%A&5eBSg2G$84NbwkF!YF(^1}0!V;A7x%MK6pi zZbDfncp+9bR)^=lFpPc$))8J7F?t{C0*}axMGPdbBfR2EBdIaT5mSMAtTxbW9pMFN z!k11;I#(_m#bf{IFTM9_ue-RAjF?ka=~8_&Ff}zL0Ft$hhcBvwb5KSml{m0PF0(~X zmalTA6gX3tNG5_d=PA;htDsxBqB>{ZAIRnM&m-sF#mS?8m-an0t+d`2ru5aY0U!QQ z&{C{@LV^k?Dd0g005&o%JF+X=637;UYLgt&e{F5{=pz5c{`|wf?xEZZY;fd0f!hs= z_QT}SBhudSZEXb5A8ml>dh4;055)k1*+#903jQh z$Rbvw4;I4F-cFS+op1HZ#WaDYNFo}fj2{gGH0&=v>S^E9M)0Equf^eKOBc`m%NQOz zk?PAA2;LNdVSRb3 zr@gK9iR6yEYQaw=yLVh80Na-v!biFg7^vghoyxI112%#j7;qMTP1>Ix%V+Pn>#tph z#$W2}?R}Akb0@dV>n6~14g11mc3Z3Q*lO_9y|;|q*o59SaFqZ|lI0t4A|~QrqxE&b zLx0DU5n;f+_Pb`Des^a!Kl(E3-F5#Dn9ivEqX%iTJY!$@xS!x!D)3)_(!DjKKav{S zy?-_M*4)@f-Ps;f1+;1ysILQYp)WE56yVy~iH*u_+a9+%hYw!%WUb(ENerbtKvCu7;OO4Y7X9JQl=6@0 zs=&Wpf#2SDg#gMLAWHz+DKc=A@M|0Jod$!93W0-&fSX09id=ny!3qA0`v+!UP6i z7S-Xe2Jj@4Dz9i{pq25p;2Sc4Bp@UNk{%jxNn$D4bnq-njGZ78g8Hez1l@=5m(IOq z{?gRVqK@1^fF%yZcT@W`Ilk4ZL|L<*{n5K=>s z|5h3(lTMOY^obsVm_%?9!WSI@0un}&0Z~S%+>?1pCU}`5TUns;|NS2tTCq2q7vqcJ k&wMr2R8vhg)l~EP13B+(#s!-sNB{r;07*qoM6N<$g6t4)9smFU literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_on_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_on_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..4d03e16f599f384d5ed588483688693504e1ad66 GIT binary patch literal 1839 zcmV+~2hjM5P)z=c_HVMQ9dv^i95Zk<@G$9QX$BCj`RFx8?q*X|1t0ossd(|(HtKKCS zz2YiDYMYYWkV+IPmBw*QZAx3x7HASfq*lb~&y+c0Pxz7*lOM2taXNI=!?0*GOO8$HPy|=o? zkIZV_n~^jJR5XAy8t8%a^HzBYYR3h}Nmh`eV33Ni0&7)eAiAx8ruog+F0NcSGhlzE z_f@ui^hpkOD^R!R{lg06X8Mvs~VQ-8Y$OnNS%sEN-Fozn&Wg_#Zl@;jx=8Zz;63H2O62 z2)p&csbBOx|LQE(bS0(bv6iWyp(PLr2|z74KRa|Pd$)awP0Q`XU z;Fe=<1Rp4-6UK+koKFk|Tf5B0N-y=C>#C;X)E&(_wQ~XjEQ)GiONy|%oPtS zX1dA2M8Uajdbj4xTxE!=Rsjo_k=~NQ0^e+WG+8mM+)=kOng(C9tJh9e9vh#ucMR8s z6Gt|&7D~nn#Mv;#3h2S&Eqit9)V}=O)mNG`r}q%2(FMRoQ7jA!jekz zu9mM|KUq02J_YbA{Ky0e2B=g89!iGy?$H^}D}Xd(%|NjDg|#w$dQV|szYC zViofo&w?7R+%cBU|8^w5^WmS=dv`tciK`czrIGPmclQrgFP|TTmg(Z~S1)YWFg@aL zA3gk~@cR$`sX$$X-Bo`b1L+mWtk?*?b7}H{v;?UMSxL%d*zWsmdd_uG5`5s$L>QZ@YQ?`;2(c#$|?^nVW;6E-znh6QXs>p?LM?m z_IrTWooC8l6?Q%1ls)HMb@sC1GWH|ZQ|e=?jw8?-Qp}$6p2rcyLV&as_;)#cX>bVu z9Dvs_Ap|>huO0ZdDj@wa!<6s^CL}H=R%qAWgZ1(wPyEsP{NuOrLbZlSz$?)N;5nCS zk(x66&CdY-={0yz6T3|pQ83V43EG9v-a>>hP6Ci?rNuae+p-QrH~|;XNicDf{~mxT zLtIGS`2*3;4=g9}AeZkv;|AJ*&u)P6L`j@|FDY%vOO3IgAJ}`h{MCb#c6C-XA;Z4| z@E-#F5(kgvM&jUIQP8p$z`O6m>kbRFmRO*Wu z0Dj({zxEs6Hs!&)EoetPZ4emX&vsX7yYShEn1-ziID!G;O&rDyOpp>Gf0(~=kvJs$ zK4O$w)oZ^3_(`iWROe!3aRl?iT_gD&ib_4Pt!;Q=^2^p_|7aK@vGaAiAVQ8OU z3cRz`f6Odnj7j1F2aQ&>{3Hu&g1rVefQi>OeD(^EFrG-?;X^FJC#G~Tp%q6D zxc!^Ap24byjE8yyvE`&pxI8Bwm@pLK@6CW*1^7(N*EsY!u>5tO0I5bZVQ#Hp*`O%# zvu*rL2u2h53CbE?pFmC zL9c@}fg7a6Qk3WgV(}V@6+o0C%;Ii=HAAol$v#5RV)hE$`&WqVK9|V{!~b)1)KNzr db<|NO{s#`jQ|&&VHzgwP5?_6=TEf=xDn zkl2@G$tJ$#YI_N}%%x|#>Tu4SE?2p#mGLUyRCR5u`}dvts=8+k7p`w;rPMO%A}Do= z+8Gj%w1RO9;E$;l0ryq-ebEMmbE1$z>;H16T z&>6I7vH<}NeIP|uhG2xc;252&4kVQOdFxO!Uo4idT>B|?rW)XN1h1i%H%KbPT&yr_ zB%KJ7^Srbm`GN?2Xgsh#Yu|j%8lI8~@S*Au08&9dmM199e~1tGjE@mfs?H23?2b>X zXF}I!J7zZ%;KNu3pTsN!hXxZE8;JAoFc=XNDi}fGQ4J=Pso~&&@L@(WaG10XupUBh zCNcsb1CGG~#0*O;H<^$`7zGJP4qqhs*731`A9x{S5HL7OYo`7%UC>+=+>rO`x2Cyz)BD zJg9WX0fA1U6rht<3}FoKFUr(L0}==pOaT%l>r_<{aD`wi$3rZ?SinaROp*M3?jtbqW}*=1k?cS<5NTY$d2)LQ=8@!4~qJni4TwKI6EE64HSETOX` zSu1P;vF0@m`A(j?K@5NOt-13&ZtH>~^Ps@`i(*`J+1C*uz9@j956k%71xdt9$QR-sXLe|vXu|KqLRmrwe3 z(5+n6uh5YJ!`_3Z1pm5nw#V>NedO!N+Z|&dq?{%mfb0p{ zY)s1xaAk|j$68DDaJz7V^2~Sm&1&a7&CG+lFNd!jvH{TN=cnc<^KYGMoB0&}v)#e^ zjji4qXPy}d-1cjDi--hIYJR_}i4nuyh(m8kW zNNb@prKi4icQ$(4=#<+nZTZK|?mEYzbo)(k9P-K!wmyE?-F!CS%2VEJ_z}se zN$`^mVA@Bym?(TR!V2Z41ZB4g=1*JQjn8(?fN?TBI3{t=C!ul*hdAEuY>(gwDwv?-CiojEymgk~twnS$z+T{fKQpUXrf*<{Ld$4(ZtG7X!@AG*ceiYyxlG6LJqjW6g zHHpK_c`k{S9p4aP=#*8;0ahCLhQx&*ZM)e2rZJpj{#yhFRq5G$C-&?0g=$bD!{Q_9``3W2Fc-(1rUnm z$0x}|j(8d&iBV=u1K{GcHrW>+l)n7VDvCoJfkAzJt-@^bH47T>(Q#?@b3?*ua$te2 z7nTeQ3piAkZ}9UI?Nd&npA~82pH%S8f1v@A9EQq|;U$s*HiE~P4}%#a{E*Iqi*M

HJ5n$v^H&n`9ml1)lCP5NLFb@FK)uKwudJ@+djjgW>Xn+AZxM z|7o$=M1!zFE@VCzrehf3*`$f~d{>)r0U$&v{;4f_T6z1K8^dbTE;x z%H}6!JeGr|O5ri7d=8I$$A+B|nU12vF6CH4fpOVk9~8!arEv#Y1G!18+q}Zfl}C(^ zjfV;O7tF+j5>TP$K1d6Zky?=DKR1EdZj|meZ>oI!H0Hk(zY}L3;&{Zz(3p7zdCt}3 z2!#rVxMc8{!v{lRPG(?8npU_+qm!8sC+s&oJ#`HLnE$PK;tXJFa56kLz_Uu8f#cMf z7l>>oFy?{yra+qf1t?cu?I4UFQh96=c-F&W>B_Y}bruP3Hjrjz^b?VfLkgZA=kPf+ zD}~2oZDjB}H25!$&=b;4(sxOxNv-;6tWjWHRD6hH1>h~HS}-v}!59XE0X&08%pYPU f=@IGQr0xF$*Lv4EtLAGI00000NkvXXu0mjfnD_q~ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_on_pressed_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_check_on_pressed_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..dae544b64a9a5b86cee92e9cee2e1ee4e9b9cf06 GIT binary patch literal 2273 zcmV<72p;!|P)NFRgS-^Bfp+N*j0zd?K76X+C!$O#J=+YvLV{))X^5PLi95%}X z-goOQQ&m2xlN6qRD4*e2WkkyPZTv0o3j>FazemLS&)PA`p1F%4Xj> zc?22~whws*WCX73ga(Kqf^{BA8Y$(#*Q8zQPU2XRmyl5e0b(LN4wUtU6eJ0ZRpLtQ zQ^DQcn25m`V9-?OmsO@>3Gg|Sth_GF<6 zst_xKqj4$$At6{N-|J@f@%ji&Ym_uc%=yD!^^>$|84sN6kt=G0G#{NFpzlP3U>xl|?R z2)JnLZeHJO;RH}xq$KaBp52gf%5%*E#F9SLy~lyp`I-EKcaPXdcV{_)13&oo(PVb# z`b_7Ci?>adVF(*0&r53*LUdI-tWIRmqSP`g#6hKi?7o0V;=6kBJB=PC^(l-r(2+8aBBn=rKvI2zi0ti4oC#{^=xt`d zy>ww?`NSn09q$+vL$bjYoK9YCeF6KSQ5YzpY866{?mrhM^3#8K!G8T;O@9B;OB>5? ztl-Fa-SVDbv|&VmQ5^{Y(zh~*Uv9j&?#7iVv=(~b+yBT=sTWdj+_j72`TK7lwD)gK zCFI+kxuYw^(yy-I$j(m0M?}aDEqNII-k!JjZz}TLxnoy~r8hnk@?to|`htLv@{BwH%4%9z^fK>>SnH$N{Pa7A z?ZdAo$_}#d0`;zRfAGS?AOaEG^%Wxj`#F2>OHKa3(r3l7*RPu4(Vl&Lf5?xHKP5vn zM}y`ER;tpeS0DYu5)=v}`Go*eeLqz_S zt7Q4r((*v$DX|yq<9kDjsDkucsc$|wO-x!T+P&R-*3k`ir4hm2yE#E3<_16d>vKcz z{cg_Qy*?R{A0+bg%d5rG>n+?7!p4B_0TfSi5}k4aeJ^lQ**&yB9je zKqX@R%ZdEVsWH=SXPW#gt>WlwYxEG;QK7L-*zIyotL2hMt4FIlx74DT?$kYDI)zKf zcZmF2aqP9v19@&%<^Lf7(|g2FGUQsHkYcz^p3ou~LjHJ*$+x#gR&&wM>XS2r5zt+5$2;Ms=$2Gf^N^y*U9{ zzv%8=ypv3d zXLJn;K}sY5-xE;ArPe?`Es(sz=Jx@KV@+PHuX0Qy6@YxGDq*CA1&eua=+s~+IfjAy z#}78U@&HDMx`=i1bmEa4^uXQ~$T%ek2~G%WvK$t|$!0wR)(@Wl%e=8xctRzBDGPsn zlp+=W3t|F!V?ELwLRQFQoga!A$FG^G7ku=5!lC5Hrk^~0_19;^!B&&?1M$rdwgOOj zA&{pzzLixv&y~HHmT5LL_uB8Hd>n9j}X(C3xi;fN@X*@{KA14EDFSZj%x* zv3`&HdIq^I{tcGj2Nq*ffn+1ZD~UEKn7%tD*ELa%C}9)JYw}ptT}U1I+{L&*bB ze=FY91E>UUN**=&fTHxkE~<-{CMgoeFjASGu8OcaSencuprWMI=l97yLBqJHgNWNfX z7F@AEWW0?q+1m}2`|&O^jdal;)GDJp*#uqPC*-wKWU+ pulvQ<<)7v47`iYsc;Ns5002ovPDHLkV1n+1gy#SN literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_default_disabled_focused_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_default_disabled_focused_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..0fa3ac487c5b105f8cb77f74f0251b25e895a1a6 GIT binary patch literal 291 zcmV+;0o?wHP)CMgoeFjASGu8OcaSencuprWMI=l97yLBqJHgNWNfX z7F@AEWW0?q+1m}2`|&O^jdal;)GDJp*#uqPC*-wKWU+ pulvQ<<)7v47`iYsc;Ns5002ovPDHLkV1n+1gy#SN literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_default_disabled_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_default_disabled_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..f74cd69f5255bba3cbe1e6f91a6991b4f56bf517 GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^nm}yC!3HD`7Jga>q^^6qIEGZ*dV6y(SF?c(OToc~ zwQS4tmY!FbTQhwP*QE=2O@#)|*M5B5FiSh=#Voa#MeOx=-qkfvPHWs;+m|TuY`a8q z-sw$SUhgVu(H(Z;x?uFI);t$UHzwY)OnaBUhhR3;m(~Wl7HRl>6U3C*1hx=A}9RvBk8@Cawn; zivPXw(e+tq=-pO<^}E*XUY6M;Uv;rx_D$+M%bnVHVwK`P-b<8FtNiyrxQ_k9pUG_Y TMjP#bUS#le^>bP0l+XkKtL}Nv literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_default_disabled_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_default_disabled_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..f74cd69f5255bba3cbe1e6f91a6991b4f56bf517 GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^nm}yC!3HD`7Jga>q^^6qIEGZ*dV6y(SF?c(OToc~ zwQS4tmY!FbTQhwP*QE=2O@#)|*M5B5FiSh=#Voa#MeOx=-qkfvPHWs;+m|TuY`a8q z-sw$SUhgVu(H(Z;x?uFI);t$UHzwY)OnaBUhhR3;m(~Wl7HRl>6U3C*1hx=A}9RvBk8@Cawn; zivPXw(e+tq=-pO<^}E*XUY6M;Uv;rx_D$+M%bnVHVwK`P-b<8FtNiyrxQ_k9pUG_Y TMjP#bUS#le^>bP0l+XkKtL}Nv literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_default_focused_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_default_focused_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..320b0c57ca95832f255e27049792c5144268c8da GIT binary patch literal 311 zcmV-70m%M|P)J3wzT@?K@ zr=4xOCnIUH@ktbEhjzrCM67qo>f+ueT!pm1BrO$^u4*8ev19^CNJ0{lkc1>8KO_@K zs*=Q;gd`*(2}wvo^6!oVIX+m8j-o_6v?DL+t#)j9;5r3Gzqj7WN}8^2rr1G{d?)))`3DaNiaw(N#k>Fj002ov JPDHLkV1l>}e!c(z literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_default_focused_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_default_focused_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..320b0c57ca95832f255e27049792c5144268c8da GIT binary patch literal 311 zcmV-70m%M|P)J3wzT@?K@ zr=4xOCnIUH@ktbEhjzrCM67qo>f+ueT!pm1BrO$^u4*8ev19^CNJ0{lkc1>8KO_@K zs*=Q;gd`*(2}wvo^6!oVIX+m8j-o_6v?DL+t#)j9;5r3Gzqj7WN}8^2rr1G{d?)))`3DaNiaw(N#k>Fj002ov JPDHLkV1l>}e!c(z literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_default_normal_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_default_normal_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..1c7a82b34506813c679de09079e6a862bb5a61dc GIT binary patch literal 298 zcmeAS@N?(olHy`uVBq!ia0vp^nm}yC!3HD`7Jga>q&|AOIEGZ*dOOpQugO8g#eCrb z10ZY+)zrI+06bqsoj1ee3kQzn47z{m+V{sam4#yhfMYGH$&en>HVu tcd1AF>k{woulKBZ4xgF#zy8#IhIFH}Me;^V_5wZ6;OXk;vd$@?2>^8_ffoP( literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_default_normal_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_default_normal_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..fd6d263961bce33b96d7a51be3373828316cd6eb GIT binary patch literal 303 zcmeAS@N?(olHy`uVBq!ia0vp^nm}yC!3HD`7Jga>q`rB&IEGZ*dOOpQugO8g#eCxd zp$XjFEp z;jdWlM)|`A^)nMCrd>9fyYzaYjQ%!my&pFWOXqy8-T!u1-u-R4w@l6+D?7+4Z+*jf z;+IvcZgFxrq(gXf#9b#cKG}8Spq#4a$|=iKR5d+4y@Do9lAknd(l(W!YEbT!C#;XN zCsodqf3>Sji^HzWM|H1?XJ2Y$8k3hS=duT<&z<~YXUW}^Almj&w`-BR%<=Nutl~8{ vBa{6lk4^q{srB%$^|Eb=Z=R{!J)JKsUo`F2;fpE25Mc0h^>bP0l+XkKbDVxE literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_default_pressed_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_default_pressed_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..456707870d16be5f348a1c79607546d6eaf90e06 GIT binary patch literal 458 zcmV;*0X6=KP)YU6b5k7C$J9@>`-d0i}V({igq-62?=6m2Oq%VqIOp3>L1XGP+NQf>#h`n)dtf# zh|f^Zx0Dz!O^4iig%kLuUe5OmWGLs(CH#!WQT^nbgA`?rvPG#-9EGW%2Yu+B1~*R; z6dMEnAm|lvOagA;um;(LM}{omfJP}qfr}JdGo%ey7%A|Bh7n<;`TIcNtlz&Mxt&kX zef;`R70joeWAsUoW*BKj59AuX?NTe~iuTZ7Z4UZ*1;Jd*FSUa%`XopzjC7(|K7Za> zxq0i4feNA2+fQcd9WU2-RSL!YO#Q(_U)&Palx=#A>g9=XaMerK z?uO}FEAe11=2Oop`r_8nLbfx{(%UT^-tHRJi#=mM`Cu;QqX&I)i~W?&S0rI*Q8Q#w zb|bbxDQf~O!}E_WK;y5H%^6)Kn=x0(`d`X_1C5KG7QB}jZU6uP07*qoM6N<$g11Z1 A_y7O^ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_default_pressed_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_default_pressed_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..456707870d16be5f348a1c79607546d6eaf90e06 GIT binary patch literal 458 zcmV;*0X6=KP)YU6b5k7C$J9@>`-d0i}V({igq-62?=6m2Oq%VqIOp3>L1XGP+NQf>#h`n)dtf# zh|f^Zx0Dz!O^4iig%kLuUe5OmWGLs(CH#!WQT^nbgA`?rvPG#-9EGW%2Yu+B1~*R; z6dMEnAm|lvOagA;um;(LM}{omfJP}qfr}JdGo%ey7%A|Bh7n<;`TIcNtlz&Mxt&kX zef;`R70joeWAsUoW*BKj59AuX?NTe~iuTZ7Z4UZ*1;Jd*FSUa%`XopzjC7(|K7Za> zxq0i4feNA2+fQcd9WU2-RSL!YO#Q(_U)&Palx=#A>g9=XaMerK z?uO}FEAe11=2Oop`r_8nLbfx{(%UT^-tHRJi#=mM`Cu;QqX&I)i~W?&S0rI*Q8Q#w zb|bbxDQf~O!}E_WK;y5H%^6)Kn=x0(`d`X_1C5KG7QB}jZU6uP07*qoM6N<$g11Z1 A_y7O^ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_group_disabled_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_group_disabled_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..b66a28fc45deee3b79bfca5a7f93b4bcdc73e65e GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^;y|px!3HFMhCbd3q-s1}978H@y`8*}tHD6P;V<{( z#G@$!d~d$9Yi~;Ws5~uv`kUXqPygP2()DmcC!fnhxjjYf`gcvuPqa6E&{Jd)O+GT^ z(xIi6Z?hl$ow{`YgdIohMa~ON&;IFn$I?71TYcU4x)r_JYrl4NNMDyQzWlFn4nqUq hxlC!t2TvBUmIdU-h@28qX9Bu|!PC{xWt~$(698>cN^t-H literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_group_disabled_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_group_disabled_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..591711edbf0e6b5081d9b2ef75cbf8e3df0ab5fa GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^;y|px!3HFMhCbd3q>4OU978H@y`8Mc*I>ZoI$iaJ zY~z`N#<>iww>blXV=}L=cz5?$mO%5A13aAnRnKoZ8N9aA!II^H%ek9j?5?+kzq^liMxU3g1 W&I`@my6zRwb_P#ZKbLh*2~7Zd%|y=t literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_group_focused_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_group_focused_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d2a6bb9fc7f6581e1f621d16335d607d9db0d424 GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^3P5bf!3HF~mPyJ3sfV5}jv*Dd-rn5EcQ8Pt{bSxE z(Oq6ggg?0H*fg!!d&FZ;W9VV#j%?3Ak!Y)3Rw#xqMCH2w%WPZ;3>1wg(zMeT# zETjELAwAn<)|r`a_h_|QC^SATI4)JXJl?{#hTFMC@Q}n}iv1UNZxX78FG z8^V|HV(QjaYm=A{a|yRto+)(fNqg8}vZ%=}$tJ<_j=;icAFE<#XPV3uKk<$C{kb~E YS6kml&Dwrv1<zopr0J5lT8UO$Q literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_group_focused_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_group_focused_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d2a6bb9fc7f6581e1f621d16335d607d9db0d424 GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^3P5bf!3HF~mPyJ3sfV5}jv*Dd-rn5EcQ8Pt{bSxE z(Oq6ggg?0H*fg!!d&FZ;W9VV#j%?3Ak!Y)3Rw#xqMCH2w%WPZ;3>1wg(zMeT# zETjELAwAn<)|r`a_h_|QC^SATI4)JXJl?{#hTFMC@Q}n}iv1UNZxX78FG z8^V|HV(QjaYm=A{a|yRto+)(fNqg8}vZ%=}$tJ<_j=;icAFE<#XPV3uKk<$C{kb~E YS6kml&Dwrv1<zopr0J5lT8UO$Q literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_group_normal_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_group_normal_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..3b033c8c41cac4cc7237c87cf8014f38760f202c GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^;y|px!3HFMhCbd3q-s4~978H@y`8*}tHD6P;k&rn z{zv~3D#Z>aNl&Y7@HAMfyLO$_^zZePwcDK4tOQ!CKb(@?Q=*B z#I(*8#tXk+r}LNfxaGfv70)cb4OU978H@y`8*~x50piwGE4k00c625F|9@NUyi7O91-u>bw*S?BAE=l6g3HJg307ViQ>789ukbCwET zg$OqWMiv1FFmXVW@zeMC1_mY$1qjiQe;|WH!nEO3(`P`hej^(yXLtaqn8?VJ3fK}Yk}?Z1qRecb|= T%r03B^d^I+tDnm{r-UW|XpU+A literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_group_pressed_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_group_pressed_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..ac7c4d19159a266d55dcd4be6817f0ecc40e4430 GIT binary patch literal 277 zcmeAS@N?(olHy`uVBq!ia0vp^3P5bf!3HF~mPyJ3sXLx7jv*Dd-rhXO)#M;>tZ=hY zev?bPUzOm&(4N}m_x|&4(@*5Ida~hM!v*sX`>pm*@tfQ#u&H-fLZ1 zz*w1R{OW?}+@R^=E8Odn`9w8Ot3R1K>j}r6Z$C~?eSPs&yhUAceuyfgNn3*(Q$ZVp zI%CCY4uu8=CJ1puRpHNHX#`*4fwX}XlN;v(Qjj&24p@4zKUr{b{ayW2-`y)!I%3O# P{$%iU^>bP0l+XkKI9zF_ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_label_background.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_label_background.9.png new file mode 100644 index 0000000000000000000000000000000000000000..16c2ed40f81812e10d304e0a948416e6dbf7bb5c GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKz3?$tr89oG3oB=)|uK)l42Qq=6E^uWmkYXwc z@(X5QD4TrN0?1SJba4#Pn3x=p=)f8rP~pR)nDK|f#O|<0{S^CC@(On94Cj3qZ`qjz QSc8o4boFyt=akR{0Ki}$9smFU literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_off_disabled_focused_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_off_disabled_focused_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..dd9a2fe669c125e656347631adb1ee3477f42d21 GIT binary patch literal 1212 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBgK_U~CTX32_B-jki8MbLI??BnA<$ z5|?QO`)&gbfq=Yyx3Ma--S!x!1mrL{+j83zH1$BKXxVrMMQ92uI7KF>#K%NA z$}>sCxf}3_dPIwdn=vu7vN4I7hiVun*fX>6Nh&C-@v=A=v6<+xGYcrH$Ov+?3o&!( zvxqW^vFNgJ%5gZ`Nh>llGmB^^u`o(8T6@dL%W;PY1@fwf@pH-Q0F7gfEakt5%+fLYv)-3635sVE$GxxSh3M0S2#_>b=lKimMx2pJ`1{Z_qyKJ z?A`0P-k!fNLSBYrTJ5`<+6s&3mhY?U-cRLTcbc_AVg32%tu_aC?rRgQPtfXEba15u zNAvkl3>S)6)K6%*UJjX}@*zS-D%;b?U1HKcD`EFZCqrt|%zTYD`W(8;@cX&Pmng1X z^HMGQ&faS%`fPFXd7?RUNJ2~NokcrBc&49v8nk1F(!FybEX$&bf7Zt?kb0f%8yOg# z>zS3mqU+9{+qW0Bta>cRY47|r-)q&Tvo9BDHtZ_#4%~TF;OG#djca<2FtG9TuUQ#;QLp3fKea=~g}=p2 zn>FraYe{98H&}apuAAF&vv_%ii11VPUl|s));dZST{o5NRg^vibrx&!FJE)u*y0JM z-yX*<`ka#QUvBi`@1x6XKhGo!R-K=u?WBBUgW3PAZoJLDy!h9y^rX?Ns z5iN3#e=Dyg_~W^zR{g=1l~Zia9DbaTW1u4SQfAHpiB5B#IVnmrk5t^@=b59>wj;jn z+#G?eQ~rOKFJAD6^M{~>#r+enW-6~v?_0yY_VibA{cTkN`NjXH0Mk8#r>mdKI;Vst E0QNprDgXcg literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_off_disabled_focused_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_off_disabled_focused_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..2fd6f7226ea92e2123e35a9e66873547ad574e0c GIT binary patch literal 1291 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBgK_U|bvE6XFWw8gG4SYikQ6kr@y! zG6`3MEJ!LFXb3W}sGb5e0VslIj>*ca$jTsUpdt>AXo`)uJTX~!8zPIM64?j`Cx|YS zH8&w@EGi}d878Z)fygyCkkta&5XBG%RLarGWXV~R<(DAZAqs$`RZIp%fn`oTSnvr% z3aSfc6i^Ui8ZrZ-(sbb|TYCqftjX%@CTnk*tiJ;i-vTnnWW{BxxE!mLVu;Ga+a;=i z5!PQ4uF87#VH7j>dBBU|?XX z^K@|xsfc?!^?CfQ1cBqTXG~bYqQc3UpvBRqlIj}BeJUiyV#AgxMpyN$+t3?-owgjO$NO@`OzC3 zr8p$FP7=vYj+nObqDW@B!Y-lbGo~)Sx%n~Qou@_C$JA|1(!X2%<~De&;yb5Yc{)qr zB$tOWkK)x{CUCq~cQ`c1=IQ*tGiT0yyqJ-bS7ujqQ+oPN7a^SkK}M6$>FA^~@2puE z5fgd#NG=leR+)!Ji^+GM^sM=|GC88@eGSNd?DGs0y1g)<_u*Kagv#R$ZoxT^fBrQ+GB|r(}cMd$+yM3%XkUefunh#`Aw3B+jZcxiVS9_Srm+wKf|Tet327vg~b^OOq@99r|2k zAHcwzpsE&Sv;LGVC$rw-U3!5X7P?q z$`3^U^2A)+BJ;(`fuq7Hev815TdfUZ#_gT?Txk`o#u`y4$_+N}leS|?cH>k@weI@8 zUt1wtQ{l0-!t8Ii`ggEg;;%hvzv9S7`9u3u-g4U;em8QIZ!xfy*lsy%Ls+?p#N)n_ z*-I=}Utih(+iUic6?*U7CpL;Jy)^r0^-gBW<3!~?M|JDSrRPp+y_}=-*P{2n+mnVe UORm|Sz|6tm>FVdQ&MBb@00NsIKmY&$ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_off_disabled_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_off_disabled_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..62ec812851fb413c3956d3ec0d9152a5d9531b2e GIT binary patch literal 434 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-r0X`wFK>7?Vfz{p1Ux0Qflmz(& zGcYi+sW7uBvUA9=N-M|-a4V|`O7iiFN^uIwi;1Xm#W$#I2daJO>Eakt5%+e=$-E;9 z0xrwN%W`f=i4h_oAW0gYT~<@)_LSaqYit%)EXnUWug-i{~t`yZ2q8_q(I~iodS66&->&t|X^T oNp|Bi(ray1$aZ_$`8rg7g%elcCHpB4fu3dXboFyt=akR{0Hg-Wh5!Hn literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_off_disabled_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_off_disabled_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..c1b6713397f30d172e1a985e8be65cf1dba31590 GIT binary patch literal 493 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sMFBn`u0YzBzF?w*loilcwUQve zUX+=TN?&NPkl`Nhvjv*Cs zZ$nO&9ai93({qD|t>^oZbGQEe*Z;P6-mD0VXLDXy^d|~PoxN^-eR)@wSkk(#T9$;| zn~M#THL2bTiqJ=V?Y{(}ljKrlS>pXSU053CVj^Jqwl3 zczPjRC2sL@PPuF$@ns7+dj)T{yirdzpZj<1%;xOiYZtbdnt0Flzxd4i_HQfu&T9N}ZBo;vK-+aI!X^kZEf3`oFf6{T(fs@ld*`ob3E>kWP1tg88r_hdx>dkb faB61 z;3m)|5Ky-N7B2TVY<~<>g+kkJe+jJWmgKcr&@d&8E3G6Url@KAk%L9W1wfPz#ajLz|DuacFxf&Q;uAP3qlxPGcF_m zQ_QZCAirQB&C1O$#35%Nombsb6=f%DklZ$9T7Or2Yob0Evr6yOY!5woQO}%?B;}?+ z1!gub9_HW%8{fVO@k*>5(#8(%-bQR*uH0;jP97G@Vtfj$ZtR_Gp4z<3=4`e-)-G&< z)&h)7HjZp5v8J4637m|E^{hTD@+^KDTI`N8QmK>KoS6)nB6$k5l~n9?as}$7Mcsr& ze7qV3#bmgdOqeviSyzcqb~dPGVvTQq^_Hk2!I14KV%B^K@|x@i?BG zAi?^C(Jf6Z%*-rIEX{3E$mZgLqQcJ~K7A_u%+0Y$_|oAMN-8=^T55WVN}7s#YFetg z%H84JbM|a#TC`-+rmj`9X07Vk)wXO=)3j|ed0*c!Stae+Rki6CTbr9(8{09RDz%`b zWod7AT-iJ$IwC6a_KjONtu3r9Ev+nW-`thq9j&$F)FXrYcY+R`y?glb>D$MzpTB?q z{Pp9vwG}3)dN|!Nm010oRmbU!)8E=dhm@6OIxzW66nvN%D0tCOXk%f-pMx6flO^X* zcrkU#oF)MuUmtJ(a~zvYwjSfrp5}8@r@VfBPPAG|;IcV)zHo?XAKg<^@|Cq!%vDCt zE_2%pA(jIh3t#Ro0M+YE2b<;yrJ^O^FaQlg$W$;+Fdt9;wG+iyZmQkw#U4@ zC2E$*YASVtQdd4?&S+hi_^f5Z&0>#2p*a8FNgqu#BA%Z+EV}00XTzqg3)}=H3MUu3 z#VlLFpnTCYnQ_|^Mz0!f@rPbD-DeGjO_ zmj8Uls%5Jlh3PL{q0qD5fKBv!>rACZT?Zb;xj4lHhIn;56!Lc+thp*1V_msqNkv&v sVbKQRa8ASR-~DG^@=uv+%C&)k;ds}k!zZmyg7O=Kr>mdKI;Vst042xf)c^nh literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_off_focused_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_off_focused_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..94196a3c348f2e75b84e94b965d768d8f1c89b32 GIT binary patch literal 1674 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBgK_V44!(6XFWw+S=M0Z+%KrM5Gl! zWyruXyAGGDOc$Mks01oN)&k+0E5D8>mK(?)&Jyd+lV<6Xb<~|75bpA1rEFl0l%{nLw zqSi9A3dpdE$$(3tnS(5jCI!?8k%e0e=fW94DeJ&UWCdo^b^*CS2g3z{!3boVEIn_s z;xZ6{*sHFAOaMj!7{CMBbir|;fa#*sKw0bH80&~+h(&O6LaFBhV7k0h666;Qq*=N7 zg*fEwqw}g;s-o;<4U*fYOzZDzZ%x$aVpi#$n(d({FY1}ok)+%dsKCM_A}PTV++gF| zHz8h$jo&=Ap>KL`iYc3yD>t`e%Y*_q9U1pRdv0zw_D(kGNnui~Y~lHAwmsG^Y|3Sd z%u3}=>?yI?g1HHtjE42xLX})TEKdEbegdrlOu>zOjus}Vli8eE(y~~RnIm}$w0T`? zxpi^{>ZC;{YUv6Ki_DlJ-YBRbCgW1alAaUf&Em{bQ<2Bj#>U1T%F)fE?Z7)xkEamTaXdLeg7pcbTAEmxnOT@vn%bg}&BX;pg`Yos`c(Lt zn`4vkrNc**RCJWI)btdUG!^yKv{ZGKyTiNZ?Ag$?D5Y~#*Q!~wR`u*^Tehfa+BTWI zuWy*FlJ@MX+H{$hr?-cf*C*nO&(b4j&fF|qnZ9wumQC9>Zrwcp!HXwv-aLwUlJx`z37mDcTXg76t>3X5P3KRnoPRelNo&CdPjB(XR!{sksrx6SnAl)2R}P z7PEcUY1-|?)%e&@QQJ?#k-L#4KvAGRh@o1MK`+hkt>xRhSMJTRsZaGeGn1j-{{H5~ z=TesnM2sIay{Y-x+MWANc-QRfYm1BK6r6mwsrQTM99GFSE1o3mw>p2}#EAxmeLB)i&IQsh*!5m zA%E9FuB*{8+bfqWsmLoXEZQI(&S`i)Zd2M>A*I!80vlKv7#@n8%j_^XzX+IV89ZJ6 KT-G@yGywoSQ^I-x literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_off_holo.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_off_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..454cef93985fa377075bc9b7bc205c2cc0c4dbb4 GIT binary patch literal 871 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 V*nH0z_Z|QM002ovPDHLkV1ixv9l8Jj literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_on_disabled_focused_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_on_disabled_focused_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..1bcef5ed6e6284dc6ee2c9ec4ab6d79a21fa9f4f GIT binary patch literal 1851 zcmcgsc~nwa7=Jua+)yE0Gxr5IBtc8uw=_^dQ!AZ}%F>F8PF8LO)?}KQHKlD+IpsK3 zCsRw%7E>&>6hlkRv`Is91Jkso({Y(Qa_XGs%-{2!_wIe~`z_zS-+kxhuoxj24Py-m zf-oyXgCfC9`sY?df|1>)UIjsL2`elr7`&3JWdGa6t?h077CUQu|Ff>QK>CgH!|Wv( z{1=~6C2MLC|3GSOZEI_Lz7S7Z#7aI@FbFtevADgxT`HB%&CSiv&wDJmd47W=5{W{g z0Qv7Bm&<`l=>W7{U0nbgA0KaMXsE2L1Q`Gg3=AASdX&jzdV6~>UkD!`pU%!s<&qj( z!~sI-%*>2XC}c1gUS3|Ip`k1mD>5>2c6QcRCFF6B976j$_|i7BmfbK#JajVU8~XiI;8e^yo&olXZEadL73 z5NNVUB&w*W0B5v(;Y7fh0#6^I^mIdKo~TQ?q?8O(4){{vB}Xz=K@bwHp{0U%@LCzU z#(t4`z}ig->wk*%H-io1LrB_sp>YPQ-C?APDy+XOnm}gzB2n5#=2o^Cl%K0Ag@{J# zT3DOlG|_5EH5U|G9}UAW${D3@stzMjK%^GvvseYKfzdIs(A2Y|1_n`8%oZb&XdOFR zVsa{s#KSty@u@sMAJ%h3$7k?C*lk21jA2?TA4Yi6O>i27L>|vnGYW_COy+AvV041h z)NNwYbdoXHM4r9I62Nqd&#;4?VJsb~s;N()2AP6-Dk|&LHXsoQZ`zLNhg7i3jVpuv zqe7b$g>j+y2*ai!PpN$KzSv!B%M9>qd&2|<*M?UZZs#{9LA1wmRBGU=!*%F%k>?JYGGFGOl7qlH@XILU zhnJ}q-LXkub*Ju#TPCuUzs>I4RBzNV>#-C(M0Go>$qq+Mlm=MTc(@1>sC`@f@an-Szrx&*uRkkDp<}Xw#s*PZ5-x3xS!D>s zt%@1UQ-AVd?X7(>PT@&2$FGV9{oI2-QQWpnS=}Y3*i&=hV(q19W5gFpg;V1j)7tX+ z@K4gq+oP|VyoyVk>nQlL$$8ZB@eYvjZwWblJsZh5L zPuyY~(JngM&B(WVOPFdwta$qJN)A(!L_=f^-N^rBxXdHJ&i>EYq$@5sb~Hzqt(q{K zG@+7tQEv*ubrcf~e-SWM2YaMubc?)_+0S3D1+T9S3Hrl-f661QRSF^JAdAXOCf$mf zI}nqq>vJR%o}rxSy4`K{LPKFw%uP13?|TgoYbf4kMB`Gb42`*Vbmg^^(uzRWN-r`Os~#5vMlsed+tdqm3_r+wV5k;&Q$H zDR=74-WnY9WfSK^GlGhRMvD=mYYF^=t}z>othSxk|MFpZp*o?u@kNBK1ma!7Cb!o_DBd$mqg{C@k+#v4_~bz{*_dU8$;Y#r)d(sM}!$J8jUB^229 ztv8WObQDPs5*BaMze{_1JU70^d-r|qsIn4UT=yWws(`!|OD>epmEJTW;05WzO%eCc z#&g`lryHp7beYZLN5nIdg6O^#{Hq4^dzEwZ>W|m(5LP|Se#X1PUW0!Nv@)0xR2INK F^fwv3b}s+` literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_on_disabled_focused_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_on_disabled_focused_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..4e43fa4c1074dc2727948f91f5f92b262411d1b9 GIT binary patch literal 1955 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 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_on_focused_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_on_focused_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..512b442ccde630084c2b626573e93577566c166b GIT binary patch literal 1875 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 Y4}a{xZ~+&zb^rhX07*qoM6N<$f)4M*o&W#< literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_on_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_on_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..efc9b4406fb7f5d456be7ad2e9be42e1c4a7aee6 GIT binary patch literal 1648 zcmXw23pkW%6#kjAhD6yEGJ~1%xRlFKE+OMSt=pgtElsi|n%uTrO1YHH&hzL(ZKZV? zq7}u+jO!Rp=3>KKB#b7PVK-@$Hd?#evqyHH=lthC-}j&IJ@0wX_ZNl)`DtkwXdnop zMfUd&g}3eMqmBYk9Y?nyh^inYAlwI*_AN7D``RWMy|Q|Ngeeq*uk4jk+9!hBCd+$e z-*hM-p}TKj&Fmg3IDG?b(V!DcSrwW@d)gsaOAM;=o^IiDsOmK z%M7`7@@Ih*5MYPK8FyhRAxPrLv$&%*d?^6d3Z(w6Q>h$zgHQs?M?!IC_ZW#i-6mQE z0b4r@!5)?pHX#RiJ`_q?|4&%UvAH*7&FCjGC!;$Qz@g;HD#JAc1dFR|ToTfdm3oaIC4NJ?HwXEO<+$H+UHjWcFh7B#BkLo)LrSQ&vBA11v7P zEN5^Ycdi0+qA;U-Y?T8GIOODZ4}(6?`*GlWl5U(_WLx*#IOQ^yMo;Wo<&00b0Gq}s zML;jSeIkoHW|BlVj6H)tS8jQO18RdlncUG1(ctwb&ss!cYNx{P;R}l^Ea<`@=Cpo9 z(iPq?Oav&|)UHnFtF}oXaF;JT!5Ie+mnWrL4y}R0phIf6929O4NRl~nAa;;97xQG! zv;9{`)(lJ`jQh%kJ$qa<@7g-+-Zs07HM5&F6SrSa2d?tOccDRH2%>^QYiVy#N2zLJ z9esmB10AudXo5e*+uj0)^P%9?RZ*MWT}&~?ID(7YCKO7~-w%($TM-?dcVGy9TRgEQ zyFJLE2lipT(5ANTfpK|d4Oo9yb(C3%$JeOd)2OCdS4RZ`aJZY;Mn5X+332v@9NAnI-z&t&V-xBP=m1 zD?9vVYqMKozjUiMmJ@Ni^!nE6V+~gig2IoTuFMlCbz{6^300p?7GYZv3_j3u?v zj9}`3H(OudYg8ZL^LiMCJIUh*+I}eAouuMBK75b%vDkOE$h+}=>gM#LdDr;XcgRQ5 zY$dlR|BD;jEma5{o?kNFy`re9PEdp@UM?)I4Jvm|TNx7RRw!xPPwO2! zr$b3`(;o1^Y_*Q*MEX5WJK5`m2nbZYuKG$Ut>=D?T0g_Lwb}fh4pmK0^}vJ2nz@M| zHC5v6rn91%w7eU`ffnS$?y a>IhOTGraR8(ry#{ZwT2Z$oqjOHSb@&fkiX` literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_on_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_on_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..b858f151ea294359cfb2eb820a3bd5c813b6bdcc GIT binary patch literal 1515 zcmV0zy?jHeg@0fCAkXK#>W4 zE^ZDL85=@e;xhMZbD)$FjmaciroZPeO#ESY9(FOUbORP%*|PT}PkMXrIp;m+-gECg z=X!}Gl1L(nB+~z$VlLnRC-_$xE|~;pv3m0vCVxI{%kzBl#sC0qeTK=8+h6bP%FATu z-*9zvuS~x+XNh4$vd$12Utoxht0S}$IvH9BwKTSecsTGvW*SF?H(uHEvs7=|oZ`Q)@JeddmBy1Wttx6c;ES!_|d+>-TV^maZetr|SwC7A?$j@dWni!rGO zCxka%ee`P?zj5nIn$>bLs-54IY351~MX1jF5Eyg$9^w8fLI^O??zz%gi8 zUpRP_U84%!o=O$T*3bmh(;ivv>Vy#F7B)2V3i@yZZO{sh?Zg_I-5_S1nh+cP<*%uc zpO0ond@^JL(5AjLj4_^Y$Y^RhLrKS5r0XD7!X=!9b3kv}>4&hv%#-nJsV|riMOgoG z&scg`%Rv4rOOq|kTzN7g_dqv*Hu^9I9`G`mU`&<7zDtoT|ZoTRl2hc{Jn#RBbUdS-n zAcPZi(#DQgxAskjk^r-xVOok4giqi0n)2eEl`L%5PZ(cVYmck`Xr$%X4hWLcT+6wzRwqex> zi9n0p8eML87<-2wsV?1iE;&8yT+lh>lynRNXixNE3_LLvA2VC<;u^76>Ron5!dp(%6{#sYvZ9^qfVdWH=L4VgHErffIf_Y zM|H6IIRQV0WV}A3mwn}ox0rOSCDofcbaPlBosOUr2IJ219rRW)}0y5 zUTiG7B(-08DC-!4finVlAp=?HfG+6dir!JuH$LW5(wF0#&&&Y{83V&+1If%C5I%%t z)(a12>wwI9aY_gw=@Te~u!*;06Cc!PzUsD#SI|aWXlWVqYQO$?rpAL8GApKT;_Yk` z`_26^TIh0&o^!YzqkcOo`lXHi<1=+Y+Bh%{8Fq}uO*uwO8@z?O$ar>5K=DPkx<4Ui_CAnO68zVl$-@-R`Nx^4&JOkJ&bYmGBf!=)=tWm}^JC z>milM6+D$tH+4Np=5z&Bs+hjt+>$wYaibNXv9P3hOjdLLfwXDhA%HgeXl#IZrX+J* zL6wpva|tfVoS^A+1ub>G_PzEn_jLMhdRTLRzPz}>wroe)$;HOK-2mF?!x(tn)9Fs6 z(=~sl)A^I>w9o}jhJu#637ZZzfro-7E%Mx`k&2mY0PXoMXxu~T$N);pwW!KGl$7Bv zC8ZAVR8msdOqP@f>D&(yyrg6fxYfn1v}8rSahJBNfr|R;9*cVPq2Omly?Itez3|T} ziFj6Nq+_t{$+ODNeLT0nE)t;I+kieAbAMLJHv1uL=Jjo8veeXPWG{W{Ve2sAI72J? zFebpmmH!_(8E__!;QNFs?Ol1Tqq`U8N*c=_yp R#kK$d002ovPDHLkV1lE|;O_tc literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_on_pressed_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_on_pressed_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..ac33d41bb73b9c0396332e0b2553349c9a086693 GIT binary patch literal 2805 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 Hu0mjfi1aTp literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_on_pressed_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_radio_on_pressed_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..50f0fc7b9fd0ba8a684366091f7ff290b88e0277 GIT binary patch literal 2433 zcmV-{34Zp8P)mM9;!Av;u^qd3Y$x#; z6FVus&5S*s89R1jCkPXwsHBNQoR}1Q5}-VAX{+)``_iXgzBOIDYiD=sIL@@Fkv{48 z%sG?qTl-sUuf6va74on6wLjhh+zG4)9H11~3hV^-0QEo}UGu%40*~>t>-pVV3ZQUP zqzShJUjzKWW?&ak3p4>?576h0z+Qf56W{~xrtkbB$lnIs3p@<$0P2}o1ZdXKVugGj z(FD~2&ja5B?g4HqoT=R^Ujaf)ynzT9gj<1q8rlq~`>l)?Lrgsj2?FcHT7{Fp75FBw zg`*WVNi)HA;FpY-Y~at@MUYiUEnDk;;MPLPe+hVqquvBW4C3t?;SM0m=(HfJp@ZJh z#TY^wc{CoB+*mvLFLRRa)}w9^@6ZT$F}fN14XFEFBFGRTBNE|&l>@~T$Tdfv$yXUs zZ?h5?!UuqZK#v6n83&Xg5hFs3(FjujS;XyY@%%&lqMbYwH%P~TUJWlBQ1@d>kRc@M zA)*}kmgIzYwRwO&AJ)jX^OvircN1|Y64MCx0k1F)DQNfl2qH*?=%c}bYEvTEPR{}N z5l1fpUj?@C3(Y2ZE$Rmi;)-y8@rh3lJ5%ouIupMg^^ILh5O6)>9DRQfpA9HM79j^X zFd{;Yge3MRV4c?_6$0us@@*dEIpQF6@(%+}_Uf=dc6=sSd+;rHXZUhxd-ZbY=M~rT z*j}?t_kwjjZ~1#?r}69%-sx9DJVdk`BK86S;%aLT?j`Gp@7ePPc_Zrm&e0DB16`Rp zcSplJp>0(wZdLR`AewsJclga|U*cjWkAYLuf#~?WTiJ1eo}p(0-Pu`Z`ggBV0JPDF z86s3pw5ojI^7?f^1aNQj2oF=UluAxm8+k+>6u{jku#xZD|2pT^t>;*n4r-R5j+xlVoN?mc*g$jb)!IvB>G|Rw0$g5`D4G;XqgVL}**}3fV>{&%`tS zfm8EtdFx8arl0+3L+OwHOrUGJ=O1|E_2RjY(`rPN2(lA>XJCJJmaSxr0_TEMq%f~1 z){_9&u#Z$8Bl?K=2&{7@&^CO!_{8t?eplq3nGYv}O@}USc>KxFH-7s&f7`fm<3DuJ zy$z*LevW6}#tjkOYQDlhoH>4#?`si@)bKJodz2 z)+&JB!Mn4%0N=>@Z0OlNSCM0J&V$ti)D|jW;{QQFou>e?P(rg%LbK4Zo43%r|7oG^ zc?*q-fYmKjaU(gvN&HTrGd-{8K!Hh|ApvSa3q-9++#@Z8HHoE+nzJwqkTSaW-(@s$ zeHlIV#!Zybd992lP)6e@qYGR{4~qbM8D#-my(Ti52V^2Ujw-R?<$$L}r@@O7&Kv#b_nEEv>|;-b(1Bfc9W2817fC#NSQgbdOt! zi_~`L(a*OM`|_>C61Nh{|1pn-t`_jAW^T9S0SmB9X57r3#FU>y4?m?wL5YC1vScST zZn=_8&wQquIl88MWE+lrN^c|ZUHN8?R%x`>u>0R!*hn*X7x2_7?L@D(gdBD&U%G(A zT|xz#Fhr!35GS)dgI0QuK-bi%(r5IXzAnhO(-rx4`aIg{K|T5&_6c)4eW$*lX%HKk zqaeu)&{A?dw4?rtThny`wn|wRGbtrTT^kFV1d~s>)m^-xxs=qsZFeW1xc z3R00&LX!v@3EpYQ1zKJ`gG!P?ZBH0$WBwbM{V0J*XJ}DR?~rX^v7|{}N~bmY4Yox+ z;Ttjvt1j&Ol%1UE4~DR2Cdfoy~mGXW9zKDvuO!pR?s`W2VA3TY-}y@#@388 zd3A)|@gT2TN3T4!K#;h4Z7n`UN)0QSB6@7wiogKP*w|Ve#&%+y8bAVFV{37kKBH%Z zxNK;dwwMnW7fhCx=VO8nsg!Nd9erDJkE$4IqI$)bpP*u zYVZgPX#gT3h6Q=U{K-K*Z|y%UKQ;K`e(Vtde!|ICXaC)VkY$AV*>bjupT4UwuNVGv zoBNo^4}oWRu~7vy68QQ>;A!A-!1v$!xy?TTYWegnJN6$r00000NkvXXu0mjfi-e6{ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_rating_star_off_disabled_focused_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_rating_star_off_disabled_focused_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..20a79050e3f56982e1f6341009119be4e6bc649e GIT binary patch literal 2229 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 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_rating_star_off_disabled_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_rating_star_off_disabled_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..a336f160f9871502eadd644ba96dce7c9bffab72 GIT binary patch literal 1388 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 KMNUMnLSTZ%W}{C4 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_rating_star_off_focused_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_rating_star_off_focused_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..cb61753f1d3a229f517a62d82abed03b418ba40f GIT binary patch literal 2612 zcmV-43d{A0P)Oa>zM(kfI~co18ywhcKVz!S&<$U2FDYLBsTf*gRe0O4^0kQurhDT<&{ zJSsX#K<_VENuhv23-X~dd~dB1k%<=K}%m1Q+vH){Ko;}G_kcEFF@$>V$1pkY; zU%buEq6kA3_oh9=0CK0GeUdqg5qQ&ZEswzl>wBr-Dcin(t%E9iAVY)FT~ zL-gV8-pD5^m8xiQaq$rq1h3jC&LY3t4_HZdh9bxeI1P}n`M(jdg(ZR3j$$aw%gbL` zTU!^~CSIw?sGd4E%GnD66(!$On@7*p)1>^!Gu(L4^k<74j(>T&0DNdu4p$4 z3a1b2m~nx~WU|7Ag@uPt6Ljs`wLz2^(E9}ylm}SuRyh*jP3}Qg{!Qc#t|T=zwUHIV z2jo4H%jJcR=@-~p6uw&p?WGT?X_?~|=eu|B&hVx1Nl#C2lG{6@R4NE1OLn86XetP| zZ`{ULS69D&mY~kg&KZ>Hb7OW#o{8wePYg)ckpT(@b3hGbY@B@*N>W^0d>aKk3y}DY zTCFa&iBD$*9R)0S{g?q#29vFNcsXDVxB$UG3=jt-tjANY0dE1R$hwF#z*z=D*3ao`y63UCn60QP_q5I;{axo=&< zDS*5vtPZ_Oe0_Z{X)6aA92{Ihsh-t+&)Yv=a54}Lr~sX2O#tw=ww;Ae{gDKZ{DvcF z=v(5~vGxSs4HLwxZkTx13=k8koK#d)+|xx6;_dByQ56=0-@~D4n}4DY|E^E4e+s_J zy2v^OsI?U&1Jdb-g9g7M`>%XJ95c&^IyRXoL!!B?pVY>ITT9?0I-${MF3!)-f1#_O zmX?+gUHd|$)_aM}-i0Wg~_9OC@;d&H-4iiRrzW z=Ke_qB>^IB1ewxx=fJ{0xOhn{78kU)w~yl>cQ}|S_!1AOD9E*_iJd{QTCYKDNDv0o z&>}F3Gv3tHG`xf5;0%16l$2DD;fqVbHC9dzV57?}CIgOdNc!ln#40L*lT=<_-nA3u z%+Ah!2ARrAkyt|9O50dDd4RXhK`_2*tRyVO*e4fok`faW-(!MI!80&0u*tE zNlC0ET-t;PU0t&{PO-U)1b_HzRt^&K!om?ema`>djI8(NT!Bic zm_$TGR8CJ%|3YYTT3cI3EG;dIWVVjP_vQ*;&P#w)M-95aZaz)Za1gU2R#sNUFrZN( zh*?@%dYqS+_dd=X)q$fVWc)i;%o#wVuRxYY?IAR6iiC`PM=%7y0YPiW0dAKZ%wva! zhF0KCweL(7%^^|J0S7>|6^VCeAcNiE@Rh@Xg@uJ(9v>h7`BuwmZf^e2+}!+}Z0|mZ z(-!!zRQ#4-g1`=eW9&dQt@A`?>qKy%IN&Wh{5?8-`g9AO zgjgGkr-GD02MMM(^(_a%IB=6&Ag)3aBnL79h<$#?1+lfYwSD@Q!(Q1_g&$=F9TA!! zd;X;;$Q9`nZeXROy1Kd->h;rbxcpX^&sJ7ec4LkzZ0;{qPzoRwlAtIm$olYWBp@I_ zr@|msLa@ASB9(D+V`F1$rlzK}PN87c1U`pV7ojPUD6I*WinX0JxC`OK zDTAZ`SA)CSOQcq|M5$C3UB7<)zP6HVY-~!f=EWw&gd#`@cpNOMECVo$>Uryq_D?UE{-I(mc>L6ou*c;tB2lRcW(Fa*{DUPYtlPnN;?+L((x<5q z1jWz?!q)_U;!k^sJ9q9(ySuwzFp-&JFpIAwzcv*?vzBZ^j+UITs>|fS`DLBYH`(s( zgs}d+LGS(GPEu7>^}%LqO-4pWGd=)Z%B0l={!MyofPSYJ|5ge90~fqgjk5{Yrp?kQ zkou@lA35w)AA8P0sZ~`i~LL<-X_Df1}_bSFMrR^5z~Yg|KO<=%x4mSZ58CS5nklha092&I~41d@FDQe@K#08{jWEh zHEKZgj2yTI$YMY1RePU+2(G`<($YIv#AI%Oph)_6(*Wsq3JRfvRv%3!IK^?t$<57e z!-2}}UEtDFKVM7^5USNKrW<&nG6sMU>s5uhQBs8V>32mGd5#0?Dk(8 W9xM{gd}K!e0000ddA*qM~F`5WUf+j>wd@v9n&_Fcc zEe4{Gl4zn27@y>Y7=!wtAps$&R6=Vjl$KuhQuflzZoA#i?tVVdma^9wyJSh&|Jym| zJLml7f6kow&HzOfRa8+$Jpv-oQQA^yiupi0sf~UmeLlwG@_@tR?SKI`y!Ma);aQa5 zboATt3K<>_p#3BIQFH$i81ceG07P|I*|!9kEcF?&k2D1b!rm#tX9a-1GL)maz(8a} zOTR=60D|I#7B3arp*`T;(rjTsLKBr05Qu<1UUO7CTXsvt;rT*3v<_7+>0VJ5ydri{ z0fBbMxPUmn!fi(dHWUbmv}hf)CGH!+Z;5f(T_}fIU>>$6L9#(RTB)QkK)b>vqvqsF zw;e{b6aa{9cxuR&S|2imO0cUC4z+^!+S4_-Y-l7=?QjbR+A*S^O1oEvZQ#-Re~0BW zHxVGg1QSH)V4SIxzyJV7tan?}_lxKP2Kxb8jQHIm!ZQtiBoM?HLM)VdR+a>z!!uY7 zC(2=*gGeJ;;}yG?#WVP8h|~^96D->a89)fP(T6|T)$Bl9@ujR8(NAh)niwDDV|+{_ z^9e3ClU7U%YL|dZ@OPbpR%Rr~LR^URv67e&H%2TG1o0e;XIV0KfqoG7kLhn!sGT^I z65KSG?qRfY{S8dw$o)7e4gmli!hs=c*RuG6lda6sN9uYEK^$V&l3Q51aC#Mo$Bb8N z?tRDetFpk_0p5jo+0E28mc9!$;@JUSSsPsy?BC|;ouNkWL;|e}t!R(PafdI1OQ`9eH z>2%SJJ?05~jqg|@SF8dcfH=H`gJb%?S44E`ahCem4Dvo4V{J;J6#)SNZNkU##hn%E z-a0MRDBNlEYPCq0RWK}jULth0AYPZz~%?xPyZCydpL$|JBDU4Mel7NuREjOt0&;PY`;_ZZA!D5AliBBG%$st_jpS)HG~PSMBg^ z>9o6WjQ#kSr=i;rNsSma$C>h7q!5UzQSM7wFs)qw@45m00`{?A*yngh>~HR>@+P0l z3C?FyzKfJPv8YE1DdV8-K0Z~IDt>c@5Ryfb>9 zH$UC0Wnp##hb*_7yOw$8`xG>Tp)QX=#G&3lx1kwT3~%j_JUGD)vpdPL>>~DZ=T^BJ zyT!R1{6wj&!6s!u%HFaSFptatiJ{sd>m+{1sZ^L*pKyYHvmAMPvUgFRL*@a%XL4-F zC(vqO+yL+~r`zd+3n$sd>>b!8+J}SA1C_ylDm)S}YH&EIltpq+r3`3IM3@#FzEv(^ z3TN;wQ;-v}C{EMQ!h7o*D*Rnl<9cXNi}u|86p6kGUmx$FHabnqRrlRV=c&zegWBjt zCGpA}5)Dyw;xxOg{$bd8`U5YQy$%ahrY_l@avMFlz!7w`gPeH-DypcWih7jv9}7;n z(LI)h*8l(jC3HntbYx+4WjbSWWnpw>05UK!F)c7SEif}wGBY|gHaajdEigAaFff2D zHVyy)03~!qSaf7zbY(hiZ)9m^c>ppnF)=MLI4v+UR5CLigzs$CSPoo+g}w>2%lH zsf&(dr|qH(s~xpg?TDxq>Z6Vwi@YBWFU!k-B1jxC4<4ZlzyVCiy-65Y1*-BY<&f>7o4_%9 zHOe$&*m2-s33d`+9lSKrK`Ko z)u)o&kj zIxgS*rJ1J-ab8UF$LX*cJBN!*8m;d*-W4jZt3C2B_xOY9rGdakn>G1LTc##{?Q-Ev zIM0=RcZYh;FOHAs-kO0p3N+HhSpT#ZD@zSR5TsKrl%YirZ5oJvkY& z(7@vK_k3}pd4SV2xbOE=C{EMK(~j7-_LtJa{7NSlss;}7*U z_jY83`mx^TtGDChvr|rfX2i42(xtS8X{)a5{+575sj2qMGKZDZJX*@iTW#M%U%#%h zB}47snwxNzU-|lmql4o-UfR<8VZ#WGj`)hfD4QWsD)VaXR-;e8I)0&@>y$C>%~r_i z$2g5hs$`w*c_|8&c$}u%($oJ9aLUuV5)TB>O>cj~pDpRC1f3X|ar>FF!?zsmoM2Gc z2;t{LRvN}*Dxd61QHv;-|GNHT6_s4_{;K9ACTp>A2_6rLiO~H=4DgS;FLEG&zyztH zD%0E)^k~G45C^oONT(9zKGTeZ4a)@-PT~$x&Oxm$SVOv)5n_PSkeD*W0YPyF$%xo` z!~kvB6s;9q0%n?!k+vK_GE#P%1Y18>?AjEKn3pCTC7_rvBi3WN@g<(1roY-#8GshFfL(Xqiyv2lRw>cv~q$6bnw6uSKg8oqFWcT;01+9 zt-Y`Wc67I=#YSjnfz(&-*hlFI9MBrJy|X!?<;lgtUIuGot_X9==DBK;@t#z-<%^4sT-z? zazrI)Ko)z@l%$>Sq)f=t7ZxF9%Lo>(abF}1KohNOJ#RyW4+VlJnf(6yGL%ez4vT{d zDyX1>T0Qz7Q+$+@>R_{{0000bbVXQnWMOn=I%9HWVRU5xGB7bQEigDOFf&v#GdeXk zIxsOUFgH3dFn}yJ4gdfEC3HntbYx+4WjbwdWNBu305UK!F)c7SEif}wGBY|gH99pg zEigAaFfjDdFkt`y02y>eSaefwW^{L9a%BKPWN%_+AW3auXJt}lVPtu6$z?nM0000< KMNUMnLSTaaGXDPn literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_rating_star_off_pressed_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_rating_star_off_pressed_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..04b1dec404197af73b12fbf037e04bd33c8950c4 GIT binary patch literal 2762 zcmV;*3N`hKP)aRM#5UcO2QmM z9EiGBz2>IYo7B(!cReh3~V6WPKdfz2tsW6F<~1Bkcns5c8h%P zVGDg83l9^E2r-dP&~=0d`#}zX0RA1suSoZv7sLpdO2}?^ez;p}c|(Gv$KXYg9D8Q- z7Qe5?dN>dWobUGd^6pR7?~(}E-y%dLL1PKO69^)%IX1G#~bbMNO;j*1WhCb=W&EhVvF5WYWgb(DK0MV0zrV$Xsqd?EjOLE9*3Y` z6UIbRaDIsA4W(VKQ%h>tLo3HmxOb6!{6^%}f~ zE)xh5gHETb@9OnsPvsNzb9{uWb?azY0FEZau%mpm048bN%UKx8ijy9XrzAN!*~cRY z9?5KqhKT+s5`Ly6 zF)a7l?ehmdt*)+Sxld@=Y&LBb%ZU`mM#8lJ)4*9kn}?f}#@h|uZ^I)pGBSGQ5(F|q z>VkB`A5^e$J>eFDCYYd`!JZlfHFkSagu+xVGBY!sAob`)+gmEw2>g;TN+3r=m>JFk zrV<{_Y~QmozvJb#=eu6ptu-G&;5|}rI~t6SS{%ob=m|*G^}LUTR#a5z!yyQOR)oaz z)Mdwe!OuL=WPi8sdtuMc3+4mQeA4;q(j4R72h;T7dfqxhoIp@C;TK{z-j|}^d9c>@ zW~RaU!9|-V+3fP=IO#;eBKrfk+g;ky($biclHv=OpzQ4I9#r|1T^INF{WiBR&*=1K zUNE~(pSkQf@jHHg1>6=Kf8xb%f<7!Pti8Rx_7Yw7_4O?j6Le)|Wkw`&g@uLIoSYm7 z={U}F=gzruF^hRTNmn4h0-8!F@={$K~-pjnu1*d2nL1gH>V+4M*` z$>OqH@Fw}vZEQ9mI83@Rslf(&d7+#_JCBni`g9US_ zv8Oe=&fvuj4Gqm#V_ZU}j$jN)_vpp$w`69}cVKJD8BM_++#>bBJI}UlN212!QUwgU zisDTN;tl0Jxf^j($x93;f}C(Bzh=rQKem*aUPnFwgJ9TT5(7_$#strG*OQ9u{fiBPrc2Z%-M3PZYg;5$!5p#yUxlgDV8$rOEZw3);Pk-P%oQC z0q|6-<2_-^p}Px3Z5);q;CcbBUeI(k3m5VVzW ztEw@GRsE~Q4BDl&9KaXtk6whI!PrZ*-gh~i&IiPK{H%nGx{@$jEpjx38NB#|c^+ujau(;#@w!8+zOG68SO@96zV@Fv~~iNgVhgv2D;jcWY9 z*P~(vpw}cel!?WlCd2=gn_Q)1~_D1VsrN zLs%vD@A00)Z@>?G$X{h z|4BsyHEJ53q3E{4xE6;e4S7r$+va%|_{XqAAc}eFBVyS)Z;lCrR7f^q!w1dwW1M?e z<2_0ebQ4dL-dkZg$Z>5Rwy-(oZ?fXIuUasYFo~0Maf!k-?5cu}KXdL`PKZ&zNDUur z*iiRqcufd-7rN8DD>Oqn2hUXcm|rx&G28iU3q{F%r%>K}m#~b}dXgLGzE4m*QT#Sx zeLn`Z;|aI0#rF5z@Zjl$XZt}=Jbqq{QX`sG^P32Adr{Na;zkVc-GW#b$7-t$GHrN{ zeOQfJa%&7bjuRx@`8R}n2wx577e>O|b~h6i6JC%w2;vzzQEJPsQEc&(nf$tfbvb6U zbRd@9qx6=KMvVnKSbSR^WXJd5xypKue77ITzN&^Wn0CYj+cA6%UxR!78z^tf;Q-qi Q-v9sr07*qoM6N<$f+VXq3;+NC literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_rating_star_off_pressed_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_rating_star_off_pressed_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..6744f97bf98bc7ec14bfe000b7484a2d1a77db86 GIT binary patch literal 2920 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 FV1gxc)m;Dp literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_rating_star_on_focused_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_rating_star_on_focused_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..505b10d542fec9a6ca658adc200b2b9495f69654 GIT binary patch literal 2551 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 Z{{vKi*u!C5;U)k8002ovPDHLkV1kPw#8?0T literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_rating_star_on_normal_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_rating_star_on_normal_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..54d32aa2ecd910e9ae1367f60d1f0516edf7f92f GIT binary patch literal 1572 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 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_rating_star_on_pressed_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_rating_star_on_pressed_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..930f1699af64e5cd2f577778302e4a54a533d128 GIT binary patch literal 2851 zcmV+;3*7XHP)h4i!bj zl|3v;h-`_3kOTsRgpg!rvd)%CGE4gXp4{8+oe-=}Z4`zy08fFp!4fYl z1Y^LjDP(OECynngM%FbpMIgWPOr?`q* zfEp>#y)s{`QQj+ZxPI7~YDuFoZo2Kya+*q=anT0bmnx29P)+ch z9{~%zO_J7%E9I3)gN4F)vhk`Zy~OD{_59)N_ay@Tnc~-kptQe|X-_C9Nu(gRGW58< zh~jO$YThilpQ5(`)moqj!BlS(9Cy;Nf&#pMp+HALyb+gIlB9B24*((6VH?#2L4sfq zB24?!vdMjuVf}BZ(-qtMP_|tr5XGa2e>$17LLn8>9Mlu<4Dz532#A9h3>t!_!d(9b zv;$9qP9pg11Nwq~VoMDZrg)~eiFE>bCCIi-d9us+`p9{lLUwqixikTXLhsDDOfbn3eFt3X^u!;aPzKSbj>Y3bp z3ZcaJ5HTN~b!QQuRgeYZqfG{5#D{H5(S%@i)V4~fSRLcQJA9}XoP_zN8Se_uSxulf zPv_=S%y|e$c&|oG2SdRxL9k4m#^8A{PqTpt->2B&I<@7hIh_Ki!SDlO{upB@-s^sb z#zM8DNZ!nGcXu$UCI3t+T+bCTI?7LRUWK6WdOi>Z9i2zn}MuAYz?e%0u9{7g{-3Kop*DoU@BlXMQK9d{n$>R8e zwM!EU)-AtS_;0(b?97@=#+&{KL^7=Q3zv+g2lyN^CpK@D=R4jwmAjJfchmD=g;v{a z(9$hXFnCFJ@gJiMA0qYe$=C2(&g2$oD0!h_WZK`kdD>!`$O5K{tARc z+Q9q$#cX$;q!om~N0?SQp|kBl?6+;<`GPeHVGQZunX4J=?IM10_lrv4k6bm`6QT{p zmuPyoT{EYxPcdbzOfqIJi7(J|0%UG%e$M1mxdom;Wb=pMjpGT?AW|q4zjw_<3N^kAHSc*B6RrEPUI-$2+W}H-A#2FWDFl8aK~+3s|4;9}?^83kV_cQ zz@t^a_XL{oU1^r>J|@>D zfL0*5GAa{~fhlS)<-k6}069<&m;(=lm0}pgdj8CFqR^r1fi`1El?v_$Lg$ec^~nMB1c@{?__T`U;Wh$ z>$SXMXQaY8)DzSVq(BeJ!VfkY&_V2u+^-*bVh2k>3^JMZoAg6Yp+5rA*WyQ+C~ra^ z3mOEnrMIK(Yu&UuBIv;RIyoNX$%W;qiAcR|4@*krIb(BLFCVj(Y@y*js9tPSC@D7! zWY^dbS-{GPet?pTFVzLE8cvLLtNG%Pr8Qy-#Q_J96B<;Re=5T(4GmY5+dgUk5?oPL)dYb^Ms#Y{EBykcH5@i^XBUT6f(&2g}-Ffc@tS0tUdux-S zxkuG^m*hFqz|XW6C|K6DIx5nzoD-M>i*jr7eC;Ju1}h6#HPPrhT*vGEh0O@4i0YDg^^o@w_0ZHG;t~bZy}kS}ii#!?Ui3ezD~{5amw0LRXTo{p zHI+qISi0@k%v%|QfjE4en_Q`H;Dd)>5F>vOY%i-+aa*9lxp{+hwZA z*Mx#w3z!dpzW#LE&cI&>MZvF9Fa#5|UO^o6Ta|E*%mahmt46`4s1F{Mmc#vLFbL67 zpax)c1qb;$Xzyz!Q>>=@K^T}_!FNBcX?9Tz_6e}?Hrs1^i&a?nHXPIt@GCGvVkp#@ zLMt4oT+m=Y2KFu(3LX}dtY{{I@9*HxAug<9`#{BFq^S^Tfr>CAg+&VG{s#j!g5ra-Q)B=D002ovPDHLkV1nnn BUDyBs literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_rating_star_on_pressed_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_rating_star_on_pressed_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..a144be8c0c3dfc7a9ec07239c953ba2d62628701 GIT binary patch literal 2898 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 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_off_disabled_focused_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_off_disabled_focused_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..ed3196e121c994a5875d4cee85e7c822a6c1a6da GIT binary patch literal 310 zcmV-60m=S}P){xNOsC)1k43@-FZ9 zTwC=gYDzXITa+!!Ry4F6?&rdL$}waujWq~C{yZXTVuM1^1CMhcZHzM=bpQYW07*qo IM6N<$g7eUZ`2YX_ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_off_disabled_focused_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_off_disabled_focused_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..ed3196e121c994a5875d4cee85e7c822a6c1a6da GIT binary patch literal 310 zcmV-60m=S}P){xNOsC)1k43@-FZ9 zTwC=gYDzXITa+!!Ry4F6?&rdL$}waujWq~C{yZXTVuM1^1CMhcZHzM=bpQYW07*qo IM6N<$g7eUZ`2YX_ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_off_disabled_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_off_disabled_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..98bf92e5d647d1e1c1fdcc413ebfc84618a6a49f GIT binary patch literal 284 zcmeAS@N?(olHy`uVBq!ia0vp^nm}yC!3HD`7Jga>q#k>^IEGZ*dOLG3SF-^_3pd|e zV~f(&wQMh+>~6{9x^yA0$!dmT_Mgg#+1jPqt!)~j@0t(0zT2mma^Wt2Pw<|-&K!#O zFGkJ(z3+T`qQ;xc)%W&VmZhyiR`*K^h(^mYXbL@52Q`7j$ zHau5}485u~sjPj{lqD*vnx39sL6auQtGavrn)GBQR3y*asB6({5wASIO**GT En zQC&La`?AbO+j7MxI_v-1_*hF)#j{Az$>x%Y?k1hja$gq7Td#|+I(ScQi>2O-4_lo% gellPC_wXMJOY`iYxk^jt0lmxM>FVdQ&MBb@04Awq#k>^IEGZ*dOLG3SF-^_3pd|e zV~f(&wQMh+>~6{9x^yA0$!dmT_Mgg#+1jPqt!)~j@0t(0zT2mma^Wt2Pw<|-&K!#O zFGkJ(z3+T`qQ;xc)%W&VmZhyiR`*K^h(^mYXbL@52Q`7j$ zHau5}485u~sjPj{lqD*vnx39sL6auQtGavrn)GBQR3y*asB6({5wASIO**GT En zQC&La`?AbO+j7MxI_v-1_*hF)#j{Az$>x%Y?k1hja$gq7Td#|+I(ScQi>2O-4_lo% gellPC_wXMJOY`iYxk^jt0lmxM>FVdQ&MBb@04AwKbpH+{eI#8SN&W|`#!{8=Lp%DCwb4w}7m`&__1DHT zT}fMHb7fKS=At^>vZ4Ajw4?cmY7sFaPZWs~1I1f^?7F8Ji?9iY5&OD>Apf3E|8Tzm XB`%X$5MCUx00000NkvXXu0mjfM$U+T literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_off_focused_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_off_focused_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..cf7a11de2d660e45561cb2a943ee1fe86c5aab00 GIT binary patch literal 325 zcmV-L0lNN)P)KbpH+{eI#8SN&W|`#!{8=Lp%DCwb4w}7m`&__1DHT zT}fMHb7fKS=At^>vZ4Ajw4?cmY7sFaPZWs~1I1f^?7F8Ji?9iY5&OD>Apf3E|8Tzm XB`%X$5MCUx00000NkvXXu0mjfM$U+T literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_off_normal_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_off_normal_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..1d2e46130ae1b27ca3135a08297108b0db2941ce GIT binary patch literal 310 zcmV-60m=S}P)o4;@qBs9!G!vFAh z^8Q;4vlwSTq#vs78-`(+?`fK5)pgxP_SUxTRd>M!A3LL0)<~?nu6I>c9m=wdgb-WZ z1s8nmU{6KT&hvaPK>!*n_}IaoisU>^(-XxKlCJB%hEj5Jl1Y*ri=r@k9>K?ss-zu;;VH|qSb`!$f)V&~=dAiZX*rIw z_B`+I`~EWsf`{&c3%=ahsJ`?fw(LT7X{_L5hhdn%i}@e!Z@Zjt#=Q$5=>Px#07*qo IM6N<$f?R-#Bme*a literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_off_normal_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_off_normal_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..1d2e46130ae1b27ca3135a08297108b0db2941ce GIT binary patch literal 310 zcmV-60m=S}P)o4;@qBs9!G!vFAh z^8Q;4vlwSTq#vs78-`(+?`fK5)pgxP_SUxTRd>M!A3LL0)<~?nu6I>c9m=wdgb-WZ z1s8nmU{6KT&hvaPK>!*n_}IaoisU>^(-XxKlCJB%hEj5Jl1Y*ri=r@k9>K?ss-zu;;VH|qSb`!$f)V&~=dAiZX*rIw z_B`+I`~EWsf`{&c3%=ahsJ`?fw(LT7X{_L5hhdn%i}@e!Z@Zjt#=Q$5=>Px#07*qo IM6N<$f?R-#Bme*a literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_off_pressed_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_off_pressed_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..4babf77a8c02ac8fc123a3c5120f8deee417d15e GIT binary patch literal 471 zcmV;|0Vw{7P)YU6o;igft`GUV24s`T}o5vTC|&HFCjt9?BD}fT-44Ly7~vSBGeXNz`84iV70-t z4kGvl@f>JFh?k~9ZoGkW;oA_py&5sd^=K zKda}@yK6UZLsyWaDD+s^$MTpdnK^qh;Oi_5;tlp-A4!rVNs=TYU6o;igft`GUV24s`T}o5vTC|&HFCjt9?BD}fT-44Ly7~vSBGeXNz`84iV70-t z4kGvl@f>JFh?k~9ZoGkW;oA_py&5sd^=K zKda}@yK6UZLsyWaDD+s^$MTpdnK^qh;Oi_5;tlp-A4!rVNs=TYU6vj_%gMze+yXF?uMTyd>R8lEADEJ0W`Xa7McmD--6zVF1K7p+XNNL}|=eV9j zQz#iqyyi;4?}HzgK={s&5Hg(5527d7yeA#4H6aM{FSGtQSn|8WhW|9$wT1M{oSC1j zS*hMdjrlMN==#GN3t=3{93pZ|B+GQwmm=%P9GPb#=}t@5pTAb}CMD@Y5|WUFBqSjT zNk~F6EvX@ymn7avNJ0{lko*%#k5N;2MUxbvRc4dfmNU8biX^ERpE*r9VKx|5B*_|6 zPf2bu3Quw@*~_%Lb8e!*4deFW{pVrzVQ|FffqNUboy@Dh-Y+COuT8pq&n7ySZOt)q zW)_tG&Rf$|vP}EOYjoD#q4Sp(U06VRrGJm-7%ovArot>Uim6#ZCH<9To^eWyYmpKm iNTFl@r?;Mvr{6ak*)dW=bT%>o0000YU6vj_%gMze+yXF?uMTyd>R8lEADEJ0W`Xa7McmD--6zVF1K7p+XNNL}|=eV9j zQz#iqyyi;4?}HzgK={s&5Hg(5527d7yeA#4H6aM{FSGtQSn|8WhW|9$wT1M{oSC1j zS*hMdjrlMN==#GN3t=3{93pZ|B+GQwmm=%P9GPb#=}t@5pTAb}CMD@Y5|WUFBqSjT zNk~F6EvX@ymn7avNJ0{lko*%#k5N;2MUxbvRc4dfmNU8biX^ERpE*r9VKx|5B*_|6 zPf2bu3Quw@*~_%Lb8e!*4deFW{pVrzVQ|FffqNUboy@Dh-Y+COuT8pq&n7ySZOt)q zW)_tG&Rf$|vP}EOYjoD#q4Sp(U06VRrGJm-7%ovArot>Uim6#ZCH<9To^eWyYmpKm iNTFl@r?;Mvr{6ak*)dW=bT%>o0000kCD11qK$t`Ajyyj8MKn*UL)9cu2KpVD}3n=0EXJBT6951J literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_on_disabled_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_on_disabled_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..89b10d28fd64685f7785d61f32ec877ce66ba16b GIT binary patch literal 382 zcmV-^0fGLBP)kCD11qK$t`Ajyyj8MKn*UL)9cu2KpVD}3n=0EXJBT6951J literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_on_focused_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_on_focused_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..962447a7ac4bf62edfff5c9c74a396e83ed2ef44 GIT binary patch literal 411 zcmeAS@N?(olHy`uVBq!ia0vp^nm}yC!3HD`7JgdCz`&T~>EaktaqI02U$4Us5^c*H z7j-M_Y}Mn6tza;(>VC&1DY?_1jw6>8oaE2bE}5ud2}#>RPJfX3y`6{b-u%kEcQeO<`p#^-V6kLs6{ zf18XR>CWlC7o);r-J2YK#+|uw9{bgFrI(v0i<_RXeGyozHpwxn=;yQM<~G+K{3j2z zr5rX>@tg!l^;(*qm!_%IPKJmWPkgd~(`oOgMV>_)ILi(y-ndvDr*cx@4fD#MR~DUB z@?6*K=kgyx>$ddRr-nOMl@+uv)0J?F2zy6r~U_la-s^37fNZ2h9+AB3(liw3ak zZg|)*ZC?DvTDOm1IGNjjOqSz%YVYcmSsKHY{gZ9A%CZHs9=6{G20DYMtDnm{r-UW| Dwe7TK literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_on_focused_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_on_focused_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..962447a7ac4bf62edfff5c9c74a396e83ed2ef44 GIT binary patch literal 411 zcmeAS@N?(olHy`uVBq!ia0vp^nm}yC!3HD`7JgdCz`&T~>EaktaqI02U$4Us5^c*H z7j-M_Y}Mn6tza;(>VC&1DY?_1jw6>8oaE2bE}5ud2}#>RPJfX3y`6{b-u%kEcQeO<`p#^-V6kLs6{ zf18XR>CWlC7o);r-J2YK#+|uw9{bgFrI(v0i<_RXeGyozHpwxn=;yQM<~G+K{3j2z zr5rX>@tg!l^;(*qm!_%IPKJmWPkgd~(`oOgMV>_)ILi(y-ndvDr*cx@4fD#MR~DUB z@?6*K=kgyx>$ddRr-nOMl@+uv)0J?F2zy6r~U_la-s^37fNZ2h9+AB3(liw3ak zZg|)*ZC?DvTDOm1IGNjjOqSz%YVYcmSsKHY{gZ9A%CZHs9=6{G20DYMtDnm{r-UW| Dwe7TK literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_on_normal_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_on_normal_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..79b03135eea05bdf53a0214c6e3be876f4334ffb GIT binary patch literal 402 zcmeAS@N?(olHy`uVBq!ia0vp^nm}yC!3HD`7JgdCz`z*k>EaktaqI02f3L$1GOew8 zk0fI_BX=9UPFZVyg3)A2koV)LlS<3n0*+*zm6u|j{gQKy0&hk06QO&HjLtEO3hGFt zDRkd&cGui;|F^^>olW2RKdkrq&D-j<@Xy>$I@@3EvJ;jK4=vT+{h+CT?$rJ@qAv}O z-C3l;ciE(LlFH5Lu>}W@^L?A;krgQNm4(A0l~vyQMz+#UITlBGg{w#TzIjYi@r0vK z+f~#(BPW&kLPSt<`<+`at9Sqa literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_on_normal_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_on_normal_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..79b03135eea05bdf53a0214c6e3be876f4334ffb GIT binary patch literal 402 zcmeAS@N?(olHy`uVBq!ia0vp^nm}yC!3HD`7JgdCz`z*k>EaktaqI02f3L$1GOew8 zk0fI_BX=9UPFZVyg3)A2koV)LlS<3n0*+*zm6u|j{gQKy0&hk06QO&HjLtEO3hGFt zDRkd&cGui;|F^^>olW2RKdkrq&D-j<@Xy>$I@@3EvJ;jK4=vT+{h+CT?$rJ@qAv}O z-C3l;ciE(LlFH5Lu>}W@^L?A;krgQNm4(A0l~vyQMz+#UITlBGg{w#TzIjYi@r0vK z+f~#(BPW&kLPSt<`<+`at9Sqa literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_on_pressed_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/btn_toggle_on_pressed_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..5e9b4a8e02938c4a247c5a2dc2bdf00da6a2d3dc GIT binary patch literal 555 zcmV+`0@VG9P)5c{?X`kZJG(ymlA&!Vekda{j-$Gj7f?^stBu{XLzRJy9|N4qyTB0YQrR8aWQk z?MBWBh(G`f`~!hTzOkL)9ByWSdGyhfbm0buaA^gHfdFHY0rYB>6!8Xwh^>;+-wnm! z?8W;|C{xXaZfj*)V13Bhg*-h;3G_%)(y!fMi|1E7sbW@4EAn`vRIpP3>tcORx|qd0 z9Z7$yWKhfK;nV8a*=s=+q$mnGGUn-dw3W0TJci)uWGqA*%)vY^$tAfYm*kRMl1p+) zE~%9yT(V!1{F~>#`$2N&1o#$x>k|rN~Zbo8T{8vn4s1R0=bfgYVmCR=>(oS*^g6vl5c{?X`kZJG(ymlA&!Vekda{j-$Gj7f?^stBu{XLzRJy9|N4qyTB0YQrR8aWQk z?MBWBh(G`f`~!hTzOkL)9ByWSdGyhfbm0buaA^gHfdFHY0rYB>6!8Xwh^>;+-wnm! z?8W;|C{xXaZfj*)V13Bhg*-h;3G_%)(y!fMi|1E7sbW@4EAn`vRIpP3>tcORx|qd0 z9Z7$yWKhfK;nV8a*=s=+q$mnGGUn-dw3W0TJci)uWGqA*%)vY^$tAfYm*kRMl1p+) zE~%9yT(V!1{F~>#`$2N&1o#$x>k|rN~Zbo8T{8vn4s1R0=bfgYVmCR=>(oS*^g6vlgTe~ HDWM4fZYLuw literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/dialog_bottom_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/dialog_bottom_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..256067dea3e3af39fff6e64b1f8e20d43ad74b64 GIT binary patch literal 864 zcmV-m1E2hfP)pSWZ9&0?K8&# z#3H4nu^o`>BUezOHm5dHg-b-@)OI~woa<8}*|N3|L6(ip^U38+NhE!-bjHO1S1eS)q+wi>y5<0Ui2 zVO*8$(k7Cr#rP3RTgIeAk%%HKAIY=MeQ|m#RU~brmT2dk`}r3JPi8>K?GCX_)(0R_ zkt}wBEfNjk3wB-CJv!%}>i-*LN}O{~UDrJ#rqIu~eg#3Xx+UI_`0h zZmrItNb?|-Psy2<=_N#u_)QU8kw$2dW zoK-lN)7m_-IklUOTAI?@XjGX}iMEwQOVO&33bZnx>pm#bys+yVEy$q$>gr<`>cE*I z$??XtQ&QP>>RK`%QX<$NWOMDTL_k?2`*~9cB-&)Ybi(i3AZBYww<~t(f>tC qijq9G9r4kmXFDW|;36-)_jm&gBhf{^%x1FyplI8)Z8vTE1mH7(F95zSm&>1*&f3YB`F#Ezz#6~?z;6Is z0K2xmwygos+~40504lCDSLdDKA~{KLk(?yBNKO)5Bqs?jl9L1%$w`8XouCDxqRkM7VLIAJUu<(@$vBiVy)4S zN>Qef_qC0^)OL4wce_|DeoUv+Z}RHqq5V_({>|}H9GBxfE+vHUYqeV4Vm!5(U)H6y zvMdoo;8Zt3{~-YDL4X^vVU141nt-^{8wUyJQm3R%gYNHRiqeJ&BU)` z*OGczH4@OTeK@tD9a#32=}gx}L5$^GAAK#zs+Y7>GNtJ{DPAK1U7aL_(ie;5L<+He zMPDKpDKD%G%vPGy``o%?t;-FAMQ-aP{!FJStA2{rL|z}|hjo=&7vQ?M*6EOl2(mr` z>>7!PD2TH+hSQv$#8?z^k@CVig|~##0_n50K}a$ex-83mNZQ+^BaDtdF46zRm`qx# zUIgQurlS!sve-%{?rTXkCXmaN7i8?mgp%)JOd{aGLbFW3K&Y|p!Ev3db4aLeD=X`m nM8NqAp5|XdCs$7Lf{5@3Bu_uN9eqKH00000NkvXXu0mjf4j81_ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/dialog_divider_horizontal_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/dialog_divider_horizontal_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..0037fbc36d030112f3e151f6ed4c4b6e108b2a86 GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^+(696!3HEnjZ%I9DHl%{$B>F!y?u?G3F!y?udP3<@01yTj${ z%Ga-ZEjf*wMN*VkZpGwG<_&_4#;VcSnqT^=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/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/dialog_full_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/dialog_full_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..5fc7d23c8eccccd1635fe7f1602ba3ed5a6329f9 GIT binary patch literal 1365 zcmeAS@N?(olHy`uVBq!ia0vp^lYrQcgBeJEuim5yq?n7HJVQ7*IBq}me*oli7I;J! zGca&>f-s}`$K79Ddkt0Ws9zAyK*zx1X zPnAmsE?vHS`O1|mSFc{ZcJ12r z>(_7GxN-C5&0Du_-M)SM&Ye3zTY%QxzkmP1g9k5PzI^@q^_w?ufR6e2@#CjYpFV&7 z{N>A+uV24zHq-0^x+bV3$S;_Ik&%g+g_Vt+gOiJ!hnJ6EKu}0nL{v;%LQ+avMpjN< zK~YIrMO95*LsLsjTSr$<-@wqw*u>P#+``h*%Er##(aG7(-P6n4`_Rz~*YDi9cW+C9 z-gRJN;PZ5G49U3ncGkwe$8G{HtFu>}m5obs_j`Nf-^9Ncev7N8r~hMBXXELNeVWjw zqiZ5{E>}8V zEbEZIB$TblCHVGY@5zSc?dmIL#C34ExVW$2Jn?nqF%ut`#*TzD0kJc9Zf|2~;5zTI zLWhU#x1r>Q+(^aS3(}@8@^qQRZ@t4!0~{J;EDe*NEh3`PQMaW`v{CoHY0XA!LXw@$?9#-rBFg-dz%%Q>?A zF`44z#+|Tl(X-r5JcolfePsS|_=1x~luoG9CZ6}Pe;k!~roAY0-KeB^;?So&OSvsO zL?#7Wsm$^zobFZk?v2B_ndyA*6)FV;BW{J6DK9)$ZrSl-mC!UTMWsbDE-kOi`a^Yc z&EEZVQLxPawz)9+`z_gyEFJ&V`YoKt99=q=+Q&?kbJ-GC{ke3%`bFP_S_`EOsSUp7 z-n#{lro_3pGHts%@r~OP(L1uozAEg}pH?NX3J8<&#f z;+uV|(--k>7G`IR*VeS_TA>%`xJ}}^`{L@PmF5?jPHyX0idwrj;N+*oiF;#a8LRJG z6r_GVDzl(5y_bO%&!0Yw^?$#hSBv^3yW<2e_XtruW4h&?_+oB?Q*Rimp!TUc`4=1 zc*Q7HvTge1)2CmStor_3_SEvLGfzJ)vWq|Wc*e|0tGwFQPB3EHc1qyx1e<3SJ7bPb zS)vwfs+Xh5%=moe)tS}`C%s~eWRAbOv*<*OsS87x=O!0{-~2Zlp_PYCk5v}HNZ0o^!L`+s`kjaZ2YBuX8%^9 W#`cYE%l8BG9fPNKmnk7zx z(AawQd~1fv`9E`ka&ew6jv*CsZ!dT9HYf$`DN$<}tQ`w)fppk9Xzb-bZ>LxZR5C@q!9JX}&%~i*k@AXVo US(dfuBhV%WPgg&ebxsLQ0JpwZBme*a literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/dialog_middle_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/dialog_middle_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..7429b06f12cc108462afd92363e5f37584428380 GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^lYm%?g&9b$+a|#Qq_hHjLR^6~F+f8@BV_6Q2B1=& zk|4ie1}0W60dWOQ6Gy)|-P*NpfZ|r3E{-7p%|iboFyt=akR{0C~_Z AlmGw# literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/dialog_middle_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/dialog_middle_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..66a78491e4b443af45c4d78cdecd82a1737e5aac GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^lYm%?g&9b$+a|#Qq_hHjLR^8gF(Cj{^Y!c3`vSVl zfGnPpAirP+MrKw{ULkQ=6&=%lpHu^&xRs}iV~EA+ z=zH{e<~k$ITx-t2?4m44b`0QI1gDF_Hjt2ncIuNX9RH9;etK2dQ7hbzUf>?W^HJAM z)LJAU2!bF4$JKH1LH85x%VNpRoQ3COZF8r#36IAm8e6*_=^rq*$jVb!j(!o&*FdwY zscQ_yV;kGUwdgicC{KZ5~i=pUDnE=@L z3G0D}td^Aq=QV7)0@4?uFR&h5NVc4ZipG?fTxmZQorJjcU~?BE3gbWxfV#WVh|-X2 zL_X8|Ivt6JFe;!JKtk#<8^eVpB3cJFCu&%!0sO;x{c7~r&df8;)Wanto)Z}nB><8< z&)@Sr|D9#o+l>#`gC73zgTN*F9`PMh`_}k(HBIw(zu*5TisBC)%8Jbxv@5jnuyzp< zfNZzh{VdD!tt?B_b#1w?@YPUCAxV<&+wJyOQ4}BOhcD`63KK({&5brVizo$<9goNN z!{Km;#}S@|)*4k+Ax+b705a2zeli}xu?-ND4quXOa-tMKb~>Hz_(;Mt=^{*q;Ts(- zR4W>omLqXTN~@~6$1?~kplw^=EF|CC+<=IE=J^p9Qi4z06T&6MXB3+BHqM0vxRY%v zCLwIhI&&d8w{&cdWUhS2n(iS9VUwaSBCZEurXv{O0C#9Ig(+mRP#)RE{w+b*{elMptxQ06^5bqNV^)111>A98t(`i(ZG>Yc1{~ECLl0w=!B67kXWM3HL=8zSn;)APH@+gM>EW uIf#&iMGzqgi*RkeBmbf+Y-Z^~YmNUvjS-F#d2+}A0000(|#8 zu1x^4tV)9Xf*BYYnV4Bv+1NQaxwv_F`S=9{g@i>!#l$5frKDwK<>VCf2-`1_nkiPZ!4!3CXty9gBn=8CVXkn)i?^ecz)0?eYiX zP0p@q>3yiTR!JfFU(v&x_kO(JU*Gn}@rj?@+B>4B)IT|jusn(65{c5-e`2nHi_3)P z8dHM2ymwBN=IoMII`LT4E7Ln#?5TmJhf6QJ%e;kCuyT*n_Nz~` zyv5p2E?Z&9zF4C_{MNd4PZx1(v8u6e&$++fci#J|zYmiXS@kCSs-BdHS67!fr(Gb* z?c-pmmR$2tL~=@6DEH0{J5zg3dOnlrJe9bqQ!Uxg&nPo|m6)2stXv;IqupUz=8P^r zZfxq3%AFk!H(Y#=Jy9|4?8vZ8bKZih;Cn`*N8Z0T3uPd|wMfz&W9?Im` ad=d^fj1mgIB{&rrHw>PxelF{r5}E)7CgVi_ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/expander_close_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/expander_close_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..b10e209baa7c65b27fb5a6177c94beda54e56611 GIT binary patch literal 421 zcmV;W0b2fvP)%%`K~gU&H)YuZINdJD}2w^52A16k!%K$?!{z*uxho`}yE*|&99VmrCC16i)gO1kHh`5L)F z$Z^!UTnUL~@<4pf$U@S6n%ZxlTttU`v4lk2?}y|l%xyG&_#vDpV=@TqHox>KOby?QBU=U@T8xL$$Sv52`A=z}dNSonzd$KadyHz0K=VlD-S zAZMXF@N}_102%i)uDO33otT`R{WW;JGGbG9qF`sn&3EE7fetKe2_7on@M#@`)!9e? z3c@BO?)heqU{0yBKv|^AY4yV)&}l%TbVOcCN2mU|2uwkuA3&!g_HPOGD=rC1NJ0{l qkc1>8p(u)?5rvr5I#|=x)&C3eVqo#s8bQhc0000%2kd{SRihyjggiW@nKtxE`m&huzqy!Q$$rpn_SOSC^ zgQ+YM!OBpODYYP0M_a0;Mk#_$g$r`6cNFwmjQ73G4FB$#`JV52pZ7h_dC$q2eEjGm zA-X$FcA`)y-B5C1EW8iEvety0>3#hNJ|F;3EqM~9;eDvrM@UpV9@$vC3 zam!g`FrKPufx2LBkgn$|v8nd&r{{H@09L~VNz}VPW zC=^1fpr8OSEiH|~U_ir6CKEygK^7MmF&GRQjn>xICJ+c9IyyQ|PftV7paAOW=}9CK z(9fJX*OcoXva5&uL?CI$N4ofSQN+^SC2_d+_j?B!=V0uVMh*&I!OVZKN(bm?+JKNja1p)z| z&xfCt_3fGtq}NMgkHn#@ENyIw)+D6eLD0dyEbg&u*Y1>{>s!A5>QKXsyzNWTdB=0z zsa?5PRx8UO|DtS$=@G|onsF*<6iUBnzH}k2h>R;aX~$wECsAulq7QK8tg|_Jna-Yv z@@u$GGp1kE)i#S8PR4TE+N32e6i%EIJJTqI7ln^?s^lO7-~AocO#jcSWGvUFOs-=G z_b96_CN96eGrsz43L+qItLvI=7#SjoiNUSP#UL0 z1N|xF+o>t$&xJkz6?5sOcdbU(TNK+w;!v}*lj=Q;))@At zcGTd*GsjKxy1pIt8Xl`#lv4XeopX0^m$hi-r(P}o!_4ff&}VU*-LlQgwNdDz0QTtU zm$gGLXM{^j!e`I^-6i^`9)@4cEH9&%jdq_NS}BNGJSm?3Mj6>a(9|AtSPG^7IIzgR zrKj1lk*7c5U8>WtOlq1}$f{}Q2jxh}#E+h(S5msj6I{e*j5U7L{SwkVxQMc`>NTZ| z$D9sKY|A&)O~1J#AZVnG8Y0Uo99CfOr{B~l3d$Wwig|v5c_Ayz+Q&h-PxjZ;f^~M` zo=?(Ox6T=s_4;C2XJ>w~sY?1d9l4n(PVS%3|C5~?6KCK0f$WEQL+Yj5xQX@l%U2R& zF)`TqsoPX3f^WXtp&)9_Hd%;>E%y*KqQm-l;PU`%cxzZwXmw6wYx&xsPUP)(zO3)M zSIVEgj$Oi1!oQ2CIc#|?O|teU%kMSST`%GK%tb$2^QFrEpWTxi{%B60P-$|mUb{>F z;T^*)ex98(NDUB&k(oI8lY#YBbuQ@406k@#Tl zMgq~f^0x@_JqE`Mc@XXJ221L3q}Q@-7$@wcj2#gfjjP*l{bz7{>Ik!LH7ppNB40&b zln!p6oJlq8A3NL7>ee?@dgyg?-seN#S2Vxh8|WZb+jzcz-JwQ={V@4j*mbll-7+8xo$7nN@N z1*!*v&97bF9~%gMG*p3I(1}wC2c2t)yYxO;U*ss2kZ*;L^;r;bJB)nahyRD*TDC7hA@oxj^A(!4cpJQ)Bmt@zY ZQ4iOSm>M6u^1m-KDm3UwpduiJ{a;ii&b0sl literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/expander_ic_minimized.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/expander_ic_minimized.9.png new file mode 100644 index 0000000000000000000000000000000000000000..02dc21ea87761ff947e5525c4b9c521c10b7121e GIT binary patch literal 1720 zcmV;p21ogcP)*|l9*r&f~=N(SK2~a3V{}a3+W46hX!LS2*Xy8uxMgXab_H0U=VSmsL&R% zv}jVlLEn_^6BrjN@Qx3_@{;NEGjmg3n7Ma`nE{(Q$v?UG-1Gbw?so1O_SlEjq0_7H}EfPhB`MMOk2Bkl>njRsn1qKyZ< zY$wQBh~!k8yzvDj&zNMb0!e;0?T7Q$~A`LPtR=7?qj~_p#CZN;lzH4b|`O9Ll*jxd% zaH#2&m6e^q)0s18EO->uItp^0LGu0>py>4J(_hMdk|W3$UPg9y_Lchj`oDX6dTh>s z8fxKC)2XPaD8ZAQJ*z!Pi=!Z|g1h!0kF^Am?}?Q8`T6XutgLRmUOz2Q7@HO_HZwEx z8ntj}4Dwil4B$~MNF9UZ((0o~0v&@yLzv{bxw)*2j0}U!i)KtFlg$wrlb)V#q=s58 z8l|PBC-5YfR-ZkH-cb;))q8S7@%WuMeE6^q5@*7srKOpwtE*>?Mx*V0;FyfL?o0@P z7d+t&k9c(y9S!n(aY~ z90iGE(Bk4EPpv0G!NH_YbOuTo3|CcE%_||;PEJnlRYEw+ix)iM4Uc$Lo1)y8X}~?1 z4vbMKH)gK0qN}T`$+NSwSr{h(NJ>hw(8n=n`S5@jJmC$GcvYKkH8QZZwbep#bab>H zG8e)miSbMc(<32z*{07GEP5^B@-~~^3bLI>2Bt`PZ<$W?Ki)UlQ!^1h=4uK}x zc)$yu@aF7y`xU`YwY9ZYi1zN?ds+4qya_bX#sgmPEGJX(a|qADwoHU7BH3?Y84(h z;r4`QwVATc{zQ4GK;~69|9t-3A||cP&CLUOd3nQtZTdLIn5{K%zy+u0ovTkYn*~D{ z(}*EzsNJpq1@V#n()&ShPH-8pO&`Y?v&Ywb&DVU**FN;-`{&Hv*!~4%ts6|JY&i=6 O00004g!rG+AbxCpvbTm(m*U33!M99&%b2RJ$kj>W;bW5H2e#LYzz6dc4KSVh6V zB)-BM0^u%20)7bZ3lC{84SY{}$>j>?T!A?7ALCd*1QbP46s0mw5|WUFBqSjTNhDsW zs>m6eA(1aof<~g4RPhatFNldm`9u7fB*o)#RuU!KC9soL zI0v8L05qdQ>jYZh2z-GdXnPS0i4N$47w`&Bz!du^M8fx3FyQZ>!6BIR5|+EuK6qkb zr(oU}9<^O?21eik^sINMcxT!H_bl)dtnm5-+cj{-{#&r+1uYkL5D7EA4zBr++<;A9 z-)7+>imb*0#Q0$sM3%t?c&A7o+<`aVN{cmX#_ZTpCo%_yocTw#129u1z?ey-o&z0l z3_iG>wtRmqU@tLVWFswLFY)W61u;0qW{6}gU^@wl)S;ImNk~Exl8}U=D2leIaBLnE cXHUBRZ$yQ%^P|m}1poj507*qoM6N<$f?kKQZ2$lO literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/expander_open_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/expander_open_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..5a5b49cb6dbad8611584d42192273f87dad2b266 GIT binary patch literal 348 zcmV-i0i*tjP)s~``0cpdW+Jq0CVbI{F#Lf`aQ6`$ zG(8i$@B|yU^aa)klyC)~@Bn3#65DVCE2v-!JE=(Wya#u%GA6K+Im?4-bR_^<-!a14d}$~}0o_IDV#@mX!Lr|@cpzCqvKpIPCRiJauV#U8;k ztWD(F3Cy7D`{yK)itNKZRBo-@LdW&X`q&YYoofvfD1CeG5~)bv3$*zF7}|b{4LXWT uLK2dYgd`-PD2nnox2PCv9b(he)&B)0Q();vDwJaY0000p&_J_@7{LZI4H;WoHA+$%j2KAc#I?KrYfchdq77DQ#UE(F z4sBXZYA3a#l>{O!=GQy-zW2S?KnXzZrh++ zGblayBw2Kv9SL)X=-vbhK+s{Aj_DPB72RIv06N<9zVy%nOqc9}Jq^$T=vjN&C@sL$ z%eJPc08)VWjIG)!5n2FK)4KaFXaTgMGe&6vs{LBiQwF2}Rijm% zG6Gfrlyy;00;B-rMlR?i3@w11(2wOfKngG}GTENL2mxfkE=n071sE5d)(K-M0owBy zKnieHWk$yUS^yc+E2cyXP_Z(rqXx79I&9}nA6Nk@y)q{w2DAV=qI1#vAAv63vv5I_r{6?@qzEkLDTKaxQMQhmXn9JKzNXigkZ86vO~ej>3w6mUsbx zxZ&4|Kn$?e3ZJ>Bi5CDUn*Q_P6EDCMA68wH7yyXB`|H6aUVyC-ZnzC%03iM4SMrP) zpji|*-FoB&0OEGOoF61!fMyK0Tq7o003h!AdcH>t(2T`*?oN?t0f6{CulpCo0L>JB zY|mtb008##y5A)R_$?K8-8Ug7Rsi79eqMJw-~|A}y89{=!~lxrt z46xY>*W4eG7XS#4-D=1aFTkeHS6fYD0HAp4uIG*zU?UGVTAPs<0EmCO6`v6U{8EH3 zTMr^H01&tRl0Qtm01sn+D{I6=3DBO&+&&{f`v$(v?u0}O0Ho*sQ}-hA0<5R}r|gH2 zXaNBH>+7w55--5L6n@Tbhe!(mH1_>cwv%`PfN;O{bzTqyG>+VI_IKh10K%`?nh(SP xjaGi`u!*kEqT|Bj?2Fyk1>Kq;0-%4e@E`d5OXu2`J(U0e002ovPDHLkV1g#rjDi3F literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/fastscroll_label_left_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/fastscroll_label_left_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..df4698b14e50ad43dd2a5f93630dcf68ea36bf26 GIT binary patch literal 922 zcmV;L17-Y)P)MU&wByiX37cjE2MLADo#TJ9$NP7Nr_3lgP{A6j2L%-_ z89LKcFmR+;&b;sI=V&ml=Vy-&pZAmN`HSzP&y$Pk{}riS{Z=nC z!vaX3)}@CC6yPhB?{t_67C=7BYSKlh0GBeE)G84yfSlIv`6#0TTrBAgJjBZ00SL5C1;sn0py(C z;1Zz%4E#HPF~I^zRVO(kRDgl9)TBZL3n0U3{sIK(?~%In5rG2qv!wY85x{lRwDc0; z0+6FXzyRTIJ7;%*0XCw4W*+%~2apIpxLLCu@c>fcrF|GYFu?kOyJ_A=Jb+YKv`z0K zF2MSso3opM7my0e=B~357ht_`cg!jvKq{=dd0zknY*=^CEJZwkRM@n)?IAG0x^qqQ zD&PU6;#+si9RLHo@&18%5%2&~;V;{;A0jTmo8TXrry;@tq~eZk*u97guonGe^EgB} zfK+^MXU#icfVDJ}VF9F8_g%wmM?8R(e_1^6KH>tr{xp+qL0&+b$xPEZV1Sj}-ZmQ% z4L3=JU7WW}64jJN>H-Zk@A0TCe0Wag$l z00vkJ?qUAiM?ioylbMFu2L@OQ{@3EEk8l8~uw!P6Jz#)8qJ5J8<|7_J>b-5`?;L)-J1=-@}d-N6vca`^ZC1pVcCdwJjI`5&9jW;?O$I+NGQ zJ9=Z`_2lSI+OYrsySLd+Uj0}i>#lk8=6bTJDuCy|tqd?nw{jzC!%+pmi(eK8pwwov zxe9>SWOaaaet0tB1O^zV(XGK&=^CP0I6bfwyzc$fQI+_-OvCd z$Hsi`1!Mq9X5v0*fT7aBVx$fkfQu72GEP@j8KaVK-#X<0Syp7R_25Y$N&_|NZrU=fV7gbAk+Z^ zgebHxve*D+`6+)H8GzISLH-B8%b({RAXJf;gAM1jMdnl$KuT7KaCY1+K&mOd4K@M; zC?p>W3Dyn_pqSEo?g}yh$vHk1a3BMi;s$pO8Gz(GfBUZ*00SWLBi8~9Adytyr&uR2 zfK1{x*M?jHBo+Dlfm&n$;=lOYfB{7EfAt~*a7FKo3wH~M#B95fKLpu=cgltPH7F3X zbVhr>h;dRW?FOp=a7t0}G%Nx7FPW+b$m?CEqjA z<%9)@5VzTlJTjx^{An-l&{Wh6uK94s=HjFt`Uksk2Pb1Dzseww&W5r#Vm{pA>As4v z!r+e2CrCR8D7Yyy6fXcgN*qh`fs43tdKB3U zB8RCNMfm}X8>cr)(a$_`prTPw?geopHB%J*Bp`>X4(63f9yeBZoMIou>%hUvL*LbL z-T@2n$c(RxSE~wFe@qW8yzU<9X}+p>eJej;;S3(L@CT%qrNPrDI*tGU002ovPDHLk FV1gV^r^o;R literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/fastscroll_label_right_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/fastscroll_label_right_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..2e7a4c326b2e5536930a90a0c085474a4a819325 GIT binary patch literal 906 zcmV;519kj~P)g!;YsAXN$^n}A&;11X&3}{Kd(Sy*F#P#+dvM*%XPe&i@LIpj z<oWNnkvS5Xn^Tf zawjr~3_z)im;w!uZpU{+L&yM>C`Cfh0Le~lKRApGK=E=osTqL*9_!HqZ3G#BVwGUl zZv+O2>)}In6d8b`Rc%2r;a&n1)kDYX7%~8bYk}o|$iROLK*55492y{0SM#zN7$8jA zDYGCafPxMGn$(XBK!G#nga*)>{!M8B8Gr&s=7k2(TFSOKh@1dYFC+#H5NNZv;vM7! zkiR5_paIkl+w%=0CxDc)ln{)-0DfJ5FN`23fRu`u;f=@uy8J=7hYUchDn92;zyOLa z9}5qV6F{scE&Y`NFaVOj_{O0DSY2H4nt=fnl1~H+asr4o#Mj<_WB?Msdn~{JGI2lb z$N)mav1Y-&1Z3h)Y{)-?Lfx@q!TlSQh%4BTZ-j)JW7&#(D=g{mW7`<)!w@6B>R7Pi zJ`T&e`_MKDydlC@>{%=BmYA%&4{XSrqI}t&wBl}y%N_Tg4fkNgPkhONd^E<|?%he; z!%>xl3kUA;cz{@o+nyW*1`vu)9=Jq?HMvbYZjqEm!kH7fOipQV>vr5i$sh@*PAhP! ztWx*n?R~HSLGl$`6R_p-5%SkO%T6;aK!|*wT*xgmYSoi-;xh#084uONV$KV;p*L2wAjNdd#UB*>y6j% g$yY1f*lQMk1LK#wLA|dfj{pDw07*qoM6N<$f)?hXt^fc4 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/fastscroll_thumb_default_holo.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/fastscroll_thumb_default_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..01663257f6b4aeb846630c369bc4df82cdc2b578 GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^xLp1&|DJNO1DWajDO7-DfcIYENeS(sz$baBoE!E$|leg6YWd?I@K5~A`T p820F)#i!i`m6aP0WEfhyFfyF8O^pubP}l*o(9_k=Wt~$(69BqOF+TtR literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/fastscroll_thumb_pressed_holo.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/fastscroll_thumb_pressed_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..a93ceb5f5ad7223a6f9f29db2cd9fb2aab0d2ae7 GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^xJsCC|OHY$LL> zKQGz3-@l%5c69XXm(AO*)o2%F+GfpJH(&d4eIon%96{l`Ygwy*M?COhm}b`9xbDc) z=C4_E@@HUMcJhQ>%YR%A%|` z-mNmTdJ%n(>Z}|bvkjbh`r)o WVAKw&UU#6k89ZJ6T-G@yGywo%w{;!> literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/fastscroll_track_default_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/fastscroll_track_default_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..774c4fb7103aa44fa17e8ebb7ab1be2dc3f3b336 GIT binary patch literal 102 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRQ!3HGLSWET+DP2z&$B>F!M<*Bpm2ogt2j+iy z&gT2{Nr-t>Q^EwEM7Fo`5sMju_J;2|YPFdm>6oZ@X@liaphgByS3j3^P6F!M<*Bpm2ogt2j+iy z&gT2{Nr-t>Q^EwEM7Fo`5sMju_J;2|YPFdm>6oZ@X@liaphgByS3j3^P6F!M<*Bpm2ogt?^^#l zn$7p=lMwT&ri2MRiEMA>BNj6R?G4{`)M_(>&0ewUXWU#iK#dHZu6{1-oD!M<(3>2S literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/fastscroll_track_pressed_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/fastscroll_track_pressed_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d4bc6a51b7393ce1ff133ded2bd03300de91bf73 GIT binary patch literal 102 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRQ!3HGLSWET+DP2z&$B>F!M<*Bpm2ogt@8W;s z&*uB|Nr-t>Q^EwEM7Fo`5sMju_J;2|YPFfcHC(KHu8m<7P$PqmdKI;Vst0P7PbivR!s literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/list_pressed_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/list_pressed_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..fd42ded48bd2f504db60f2ce92a376432e5bc73e GIT binary patch literal 113 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1|(OmDOUqh7M?DSAr-gIPTa`JU?9MBSM%~e z1xd}~9}!0!X03OMv)EvvZTRev=q%w%y}*SZqi5Qt{F(mUc+G_A5A7Z%f1P6W8)ycD Mr>mdKI;Vst0P7PbivR!s literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/list_section_divider_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/list_section_divider_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d5790c6e196e9f6a9c2afb9c990c1a757036ef36 GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^+(2x^!3HF|ZYnwhDJxGG$B>F!Z%-L=9Z+CkIruyH z-~Vl#O9XR{IB^tl-}arL`B-q%u(>nEbIHf3lvivN|p}_T-D$YoI9% Mp00i_>zopr0H9bX;{X5v literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/list_section_divider_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/list_section_divider_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..af41decd1b15355fe1084f7f343a08523a8643cd GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^+(2x^!3HF|ZYnwhDKk$O$B>F!Z%=LHWKa+}a^d#L zzvDzxCnWCXG-bV#k5H{-7x<_$I+yX5r5?KHos30^JBl0=q3AJN@W?)1O`u6 KKbLh*2~7ag=_GUj literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/list_selector_disabled_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/list_selector_disabled_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..16c81cc85b73928e23c10e9f8865e6c051dd1ef7 GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^;y~=k#0(_eCttq_q<8{+LR^6~9GJc|p9bVGmjw9* zGt@LpaVca0auqyX9780+lM@mWEEtYNt!_v-SFk89QCOyK%HMj09}Eol{qF5!?Nmqr Ond9l|=d#Wzp$PzM6d(2g literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/list_selector_disabled_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/list_selector_disabled_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..4b6d2660a6be3ba1a316d0af120a23e989f89220 GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^;y~=k#0(_eCttq_q<8{+LR^6~9GJc|p9bVGmjw9* zGswv=w*U48$W`!kaSV|NPfkckuwXb6wYnkUT*0EaL}8h_DSzt~elRfH_q(@`wNoJh OWR9n+pUXO@geCx!A|SQ^ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/menu_background_fill_parent_width_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/menu_background_fill_parent_width_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..50534a1eaa14048d9130711c67d3ae3f50b355e9 GIT binary patch literal 816 zcmV-01JC@4P) z=zH{e<~k$ITx-t2?4m44b`0QI1gDF_Hjt2ncIuNX9RH9;etK2dQ7hbzUf>?W^HJAM z)LJAU2!bF4$JKH1LH85x%VNpRoQ3COZF8r#36IAm8e6*_=^rq*$jVb!j(!o&*FdwY zscQ_yV;kGUwdgicC{KZ5~i=pUDnE=@L z3G0D}td^Aq=QV7)0@4?uFR&h5NVc4ZipG?fTxmZQorJjcU~?BE3gbWxfV#WVh|-X2 zL_X8|Ivt6JFe;!JKtk#<8^eVpB3cJFCu&%!0sO;x{c7~r&df8;)Wanto)Z}nB><8< z&)@Sr|D9#o+l>#`gC73zgTN*F9`PMh`_}k(HBIw(zu*5TisBC)%8Jbxv@5jnuyzp< zfNZzh{VdD!tt?B_b#1w?@YPUCAxV<&+wJyOQ4}BOhcD`63KK({&5brVizo$<9goNN z!{Km;#}S@|)*4k+Ax+b705a2zeli}xu?-ND4quXOa-tMKb~>Hz_(;Mt=^{*q;Ts(- zR4W>omLqXTN~@~6$1?~kplw^=EF|CC+<=IE=J^p9Qi4z06T&6MXB3+BHqM0vxRY%v zCLwIhI&&d8w{&cdWUhS2n(iS9VUwaSBCZEurXv{O0C#9Ig(+mRP#)RE{w+b*{elMptxQ06^5bqNV^)111>A98t(`i(ZG>Yc1{~ECLl0w=!B67kXWM3HL=8zSn;)APH@+gM>EW uIf#&iMGzqgi*RkeBmbf+Y-Z^~YmNUvjS-F#d2+}A0000(|#8 zu1x^4tV)9Xf*BYYnV4Bv+1NQaxwv_F`S=9{g@i>!#l$5frKDwK<>VCf2-`1_nkiPZ!4!3CXty9gBn=8CVXkn)i?^ecz)0?eYiX zP0p@q>3yiTR!JfFU(v&x_kO(JU*Gn}@rj?@+B>4B)IT|jusn(65{c5-e`2nHi_3)P z8dHM2ymwBN=IoMII`LT4E7Ln#?5TmJhf6QJ%e;kCuyT*n_Nz~` zyv5p2E?Z&9zF4C_{MNd4PZx1(v8u6e&$++fci#J|zYmiXS@kCSs-BdHS67!fr(Gb* z?c-pmmR$2tL~=@6DEH0{J5zg3dOnlrJe9bqQ!Uxg&nPo|m6)2stXv;IqupUz=8P^r zZfxq3%AFk!H(Y#=Jy9|4?8vZ8bKZih;Cn`*N8Z0T3uPd|wMfz&W9?Im` ad=d^fj1mgIB{&rrHw>PxelF{r5}E)7CgVi_ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/menu_dropdown_panel_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/menu_dropdown_panel_holo_dark.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/menu_dropdown_panel_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/menu_dropdown_panel_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..996fcb933d5068b6a109802c100254d963512f67 GIT binary patch literal 951 zcmeAS@N?(olHy`uVBq!ia0vp^NkDAG!3-oPeEoMCNHG^Xd4_OsaNK_A{{YD4Ebxdd zW?ecJluiw0R^Zxz&1!fB;0S&b%3GxeOU}R)sW?^Mx=iubx z=Hcbz7Z4N@77-N_mync_mXVc{S5Q<^R#8<`*U;3`*3s2BFtoS7b?eTZL-s{d3=B+y zo-U3d5r^N-xY&E!fyX6XW9o#YI}WS-n8Qygs;b(93`) z!=OTdW0Hb?%V`6fd(9ia%QL^3HetG8Tds7$i;|W}0x2aY?z68>Kd>$5rWuRBD9gzg z>!*BL#CCfb54XW|2Se8**B52|W-C<4vu0S<(Xm471%twcmfc)U3d-BGjc$QL&zx7v7n2rfMloG8EjqLc3T{aB;AXmKL*UWTFKtmqKLMjH9#L%dWUeCT&~f z%TFMZdSoBV#p`sw=f?%Gvun3byXW6%WPNzsqNCoz%M(uropv~T=!SJ;Wm2x| z9*Zk|$(k!Y-80`X@I14cz!B#Z;TbsZmT5o(YxKg^lXtGM`}2Daw*!l;-W~mO-4S1> zmE;)6Z+$I!eBJj<>FmGvbZy??48penK5^5a?HlzmBcmiD$OtlE ze>@(4#u)#E5Z)jCZ`MfHb$?H%)9>^7{14+Bk=GE7G?zxSl(Yk|2XKfnez*x!LJ03M z#t#4o+_c(ZT2IwXQIeW?G#mgNLI}T}bLs1&*XFJNC=2*(x^DV|wPyex4fnLf{)jWr z8>R*PiouLYipq^}xEXr@Kj21`z*AF$acWYrjNo;GMn`0ZV?##p5v4hb%oS^@5i&hF zHar@rSj!oR5v38qYlRz;N1CuGHSyoM5hc?iuMU6EHHWQ4$#g^zZM*CmUjkmB%}5|h zjL=e)VVwm|1-W)jGY(OzD?LGa~o0$0H(-rkAGcotlX7v{XlxUNuHo)40x* zD!nu#m4uFUxZpCJUx|Bty75+d}#>Hu{$>O?tw3@F)1-ZE)j7f z@^B-lndIg{I<}=%3hn&iP7mosh5#8etccK3QVZa+_%hee1!E(!DQeCLKFs2aras|D vlyJdKD>CDX%#xZ%pOk&%WK*SUN(uh~2k5Q#ApwKU00000NkvXXu0mjfSVTNR literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/menu_hardkey_panel_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/menu_hardkey_panel_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d0644b9c043ee4b0d6887ece7dd742806ad0848e GIT binary patch literal 634 zcmeAS@N?(olHy`uVBq!ia0vp^NkFW|!3HGlbNose7?>PAT^vIyZoQp-+wYKri0j6s z;!6WsniRUE92MP!AHO}wp8Vzi4>e(Xws}8VcB$VyvTTL2ZbjlbPqBP~O<{g&vQCMd z!rTh|2Q2hXz=4F3^dTF2-MdU?n#&4!7S1@Nc8%-NnbZC!$~xI=He_npedw6oVIr=Y z&(W>I{3C&TiUWg|f=cLyz0X1%J+w*!775#n9#NA1xvfz!h>=O)llN6eW|M<_8I9j& zT~_kFu%KCLF3U=Vo{5#(&y+V*rJ6|bs!cxmy2PrtwS0>3(>6yh`C~sSl43ceEjl?A zSM(o$EPi=ueOu9DnWae<2d=eT$ZMY7A<($(<)+dD7xg-X3~kPa9jW5|=Su~n5$CMrihIh}C(lh=_U=5&t3a*ZlW#}ms({I>2VCV$;u zvFX@}*vqHh&HB}S$5iymx3Btl_9Z>}-f{oGt<%2)JD4{8nfa0Tj9}+P)7R?*fN6@s M)78&qol`;+0J-iMi~s-t literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/numberpicker_selection_divider.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/numberpicker_selection_divider.9.png new file mode 100644 index 0000000000000000000000000000000000000000..46fa805fe9c7ec6d8d74983ba0c1d8b77e3b8f1d GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^tRT$61|)m))t&+=9Zwg>kcwNqJqI}%7&w@2ue^DC zk?E|%Mjx&#KRobxA>#(lBUat+OBeh<{&_Rwyl#E3T8ql7Kz$6Ju6{1-oD!MZd0Lh?;|hsHA`-dxD%|a*NGlPE#9I*SSu^kH_#HJ$A1Z&RRrd732t&>UcXnJ-yN&A#>Mp2hc3)BDX?0sEr!I?aU82gxbid*nm%H zj)9mTFsN?^JyuZPAsP<*^pfg}?HSE8kkA2DU#z|(PhaSOsxPuGT3{eO2ULBL`i{{^ z)HfJXeUbVW8A#-Ss;{TM6Eqt49hy{MXfJ4qfy54|`amv}(c=l6zI8Az%DRiEEE8c+Kyl~kXvZ;gSZ9#HlD zc7d8%p5~M4bKlWA1IaX?>T@qWeVGPSeeMPW$vmKNeOG8A&o7!JSlP9i_@% literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/old_switch_thumb_activated_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/old_switch_thumb_activated_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..42c346466ae307a095dd209414963edcbcb508ea GIT binary patch literal 509 zcmVshJ3T$U!XF`X*K~T&JZdASMA@i;`u*FPA8-IQkX^C? zpV0yXF+ZSR-yC`>p}r$D6!hsO)fZU{Ei#b60aah5zGGKk;DD+xv^H8|ARPx(eWChJ zP(AD$45_|Qeaj3abU@YDQQs*Vj`|KwsxPn?w8B6l2ULB5HC=s?1FF72eX9&4)_|(- zPiJT(?sEiEeZF4N8Uu+vpz8B=?&^y@pz8B_L+cDA(SWMY>jI4?eU?h9&(miyki-M3 zzTYm3)wjbyj0`AH-yNDX^31thh`w*MkE+H86r%4DO;>Q;9Iy`^mQbIK4p3G4Uo-N3 zmSt7ZAgY(J+J6jKLo;Z$g!LBf?@E-Xy0zU8XM{7xFTWfh00000NkvXXu0mjf@;>E{ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/old_switch_thumb_disabled_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/old_switch_thumb_disabled_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..9afd8875d47eec54bb01687308d48412c29bc78b GIT binary patch literal 378 zcmeAS@N?(olHy`uVBq!ia0vp^0YI$7!3HEheY6*6U|@9gba4!+xb^n-*(@hRks}|O zv+hn?we`Z(wef4Y*V=jC`yY5|=Td_hm%a0jBu%z7(EsqXSJuJ-zhZt#K#9I@t-Xe?MUaJ}q66cB#$3N-e(=pI zWZmC4n|@2!^Nw+8|F0M*p>LD?j8CKX%5yG_+Jlpr!q&WR{w2f|wkp5h*U%d%(aE?} z-!P%|m)%Nz=L1|{_a;o!1@hXCdGmwhv@dO6xUUDKWWkrG+&2!Vxwbxz+xTjK+KZB1 j_P^JOywBX8^_^EN@u&06#l`=CVanj?>gTe~DWM4f8Bx6W literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/old_switch_thumb_disabled_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/old_switch_thumb_disabled_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..ed16f8524ade307d6d5abae528a7c307e5354199 GIT binary patch literal 363 zcmeAS@N?(olHy`uVBq!ia0vp^0YI$7!3HEheY6*6U|=-zba4!+xb^mSY!;KFfa^o2 z$>#Nw9yDhpG0l3j;`{z7+hkh0Q&Nns_RW|VTwq@Cz2pW;R(*}MQ24b(AE^Cg7gJxv z{pIg(mTYWzp$$}g2u3Mi`TlHkBGa|?@4bKJ0adm#UJRE2Q{}rGgzxWKRdDN+`LFeo lGRN<}-5pf7g!k$@j%81$h0atd@dgGWgQu&X%Q~loCII%jqvHSo literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/old_switch_thumb_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/old_switch_thumb_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..57b20bca83db4b50266b9c08db4ad370d98f0204 GIT binary patch literal 486 zcmV@P)F2bk0iHf4AD2nbtj5F;5%Y$$mLJ#TTwsg9x z;M>6A4`k@nn7LMxV;HJqY^SHEH}uEg?2Iu49q7SNg?P|~X8(5X2W&wXyowF@0v({D z2DJ6f!*d1eJA$#WS1)UQiRxPb3LQ}E8(815tuJ&ytuIy&7J(uM)cRtbzH)RBKUXl7<=cGL`pgGx z0A(6b>oeE3zDxsZeP$CV^MJzZyMgIEzi6`H`aWR`DA$03>$|n}HWpOhH|zm99Z*nxk1*@{ z*-92v-#(D@0fp4}Wa}$(z)?7?V0|7OKwbJ@Gs=C;T!$vKDyZ=v12&)ya}_i)Y=2kc cGAU}iU*$y}{Qu2T!TS6o%m_M%(Vhjo^Q)f?Fy0Uv;HbyUhJx%6LwhaR?-1JTsMa&UfIuftM#)1X37d zik_S)*6g?)4u=z8mhYabs(1&qIc<^IrnIu&E`7jl+BCy>?-oW84j8X*pZ1nvz#H05 z)6;99uamw*2GST1`hMN5)z=&l`huG~eXRkZPo&QWgubA@BL)%-2z{-)v--jTp|4fn zvDFt22z`yarwxJuTtMg(>GJ`hPo&QWgudE7XeSJ$b3o{;?ZN8n9uWFO`g}m>6Y28- zq3=iEDFgX)K5B>oeUSl`>U(zjq5~?`H(`BA0xH!vij3z2D%5w*`jQ1yrtih+OBPU(zAvXQ zX+Y?U45&!o1?x*5P>H@*r*D-3w`kWH#^YVFKJC9|^!ixfCT*9tm*L9)2w2*Wi3P zBJ0~nPt-3M(fUF?Vg@F1K&>ydzJpSIkppUdq4mweR2)$2D_h?odaL;tCtBYxPnd(L zYCx?opnxM}s=baNT3^63=3%NHQ0oiScZ|MTu4IYU7pQLmrltY4z8@zc^+gY;^%cEf z5w_+5wZ5WL^w)DWU$nm5E0$pE8c^%YonfHf`$^(?eQ#KXjWM9t^_^od&K*thyuKCK zSOa=o-vx%^-cuJ(>wCv4Z0rF&t?#l_U+e)rtnUMBuucZ_u)Zq{yLzrjJge^$>#)uS z^sK&XjJSNVO+2e_1J>z)9@Te)QP07*qoM6N<$f|v60 A0RR91 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/old_switch_thumb_pressed_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/old_switch_thumb_pressed_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..8f8d054c5d99a71156b80edeef9f9aef2de59631 GIT binary patch literal 514 zcmV+d0{#7oP)}nc0UH5ou|VBWS84Y^O($o~AznXJ>3DZ!m!ZBteSEp*^^r z`vKF)p$JKkdrZQ(A23+oIPMZy-!3}KeR@UftLOn!Fl7hS`YP79hpw>i57GJ}6)+7G zI-u4US>Haoqkh4N))(p#Gcb_@YJH*g9R%tN8&K;Dt#1~l;(%IT+4>IAQ_a6P(fWRQ z!W>Lh18RK%MI52G+Up3S^#wd*9;WI6wZ1@o$LOo&N|tDSf%+C;Y8p`M`*9LdU-W=l zU&#v=VQU^x>nk}$e?3?8MeEDIVhOgc0kyvT83yXTpCq2w_l9NI7z27;-#G^3+|d-z z>sx`1HK51!U0^8gJ$3Q4zIUv`#vahq`Yr?Y#Tn4U`aZA*>tsL=>$}3RtLKWuv-&=< z4(n_{&+5BI#^sZ3;#qwguucc`sJp(9 ztnaU8H1^46vlbmlCs67?223G?(FAI3w%3)Uk^I$m-&k<@<5R@VCjbBd07*qoM6N<$ Eg2Bi0C;$Ke literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/overscroll_edge.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/overscroll_edge.png new file mode 100644 index 0000000000000000000000000000000000000000..08fc022629710097025ed80c9286709966333b69 GIT binary patch literal 1345 zcmeAS@N?(olHy`uVBq!ia0y~yVCDz1g*e!Nq-@P2J|M-G|H(?D8gCb z5m^kRJ;2!QWVRhhu&lr_9j2dQ?Tpk(3=Ax;o-U3d6}R5bN-SDzz~h$cvFon!8^fv| z+x-5G$6v^9^KAGVnElChBja|@$$9r@CmL+aInC6ZGMVRH)AHxjr%cwAkG0d8Z=Po6 zdDAVW`sDl1kx#c--seAG{FD9UZLj-#XZ}6$^j6#Szb2cHuL+-?y8TlA^!4VGp1aGJ zyxF|w_QBsq6K_9zZ5VIQBE55ur?uMCl@r#Rh5!Cl%Dwd)V^n7Cw|!Onb?+4Q8SdY2 zZfF1J_XVT)wyr-Z`S-VYuG4+at7JawrsEU-B0CS;{c>k=reCg}c=LI(`lt0f*X~_X ze(BumIsZ>Z*w{YV@_p$q-%Hc_J=`xjj<$t|3U%B2aFx~#1GVi2iPLXHd6&DpKbI85x|H1U} z%fUXruua>iJ94$(yl7cwWgYv}zt!fh?~Pk4lV4hkYTa-B^Wwnka~)O}Z#!9^^keS) zvFTfEH;~b^qWhL!>)QaQ0@#S#~#B>HD?O)%$D8-%72po8NkVt$TF-{^&>A z3)1HA7JjgLqkL|1{@0@l+y6&MCcnKm<<_Ur2V2W#UC!0BD0puCZStEE)?G`Q*O_F` z+a@V{F2erV>c`cc>5+4vPAl`SI$o7$f41LRB=7m&xz_LE$~Oc@uXt-XQxf;5@%(vU;U)A?&P$O z;d;Cmu3gx_S%;1Poq@jPlXds!#CU&L@baurWoFLW^M~%tcx1eO|BK9j)wklCUq4_B zIlHm<`WmydcMn(VqTh0pY|Ye!?wcL>lK%7ikjbimR)@D z)vp?sErttbM3?q`4PN?AHKR0cx=h?w|25&0KF=-N{8>TmpRGXi#wY>f&{K>2l9!&l zbDwYNzH2u&|6225^`*ZK9~k7;#7NKE`ufw=x4*A`-LG=vQQc2I?fJU!C8<`)MX5lF!N|bSP}jgh z*T5vi(Adhz$jSuBHMcS_SgIGW7)3*FeoAIqC8h=gQ;3EoWrw~2HAsSN2+mI{DNig) kWpGT%PfAtr%uP&B4N6T+sVqF1Y6J3}r>mdKI;Vst0IADs%K!iX literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/overscroll_glow.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/overscroll_glow.png new file mode 100644 index 0000000000000000000000000000000000000000..859ef53d7d2587b9751405ac22f3080203ccce0c GIT binary patch literal 24314 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 S$$dbB7(8A5T-G@yGywn@4kW?= literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/progress_bg_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/progress_bg_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d3bb238736b2d7a6e0d6f6d69997d0a12beb1239 GIT binary patch literal 116 zcmeAS@N?(olHy`uVBq!ia0vp^96&6^!3HF|1ZAaxl(naeV@SoVyOTHaG8k|iF5%+0;GyQ+?h z-24HJL=dJwICM4Lb^6EoP8HRP2qXnBUIG{b2te42Cb+CY!3;^mvMK%V88I;p2U@x3@>v zC*>QiyW?YC?N;^YXj?~zt(tMNrA9i=Gfi;28Kyp}qLHG^aBpKAxz3t#w%K<6`Q_ux z{rmN5n9YC>(0aRX$CIg=l}7E6Yh1GuBXf%8eYG@pE2Wbnc}dwQ7-~F}%}Q9Py2Z$A z3NKO330GLitWf)@q~~SklV3i&H@m{7;H@{%yA|8*s@-Wv=10j=Dx#I2blI9-DH^k) zaJjrF>}VFUs!z^EaCMZ~4=NEK8|{^1IIjY54-3HW_v)&h8x~6t0lP>Bi|04muqRi@*hj za3T!k7xT}HkbybU1K_(WmUh6m=)>FC*BNkIz2WwlUrEbJgR>FKYZ+&R3Wfd$(U50@8TK9-Dg00000NkvXXu0mjfTRoGy literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/progress_primary_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/progress_primary_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..2f76a22648d1e1a49b6462736994deebb6a35899 GIT binary patch literal 873 zcmV-v1D5=WP)DaJY4;Tc>`U@6@Fr2>`Sdx1t5d?E(BnvfCzDRGF6gF4csf$in%H4Xw827`PE6p zqeuCAn1O%?;7&EP$#lkYy<|0Z);ThuFh}CN%NA<4lv+~3Q;3EH14|d9S(1s_O@-$m zPs-+yQzn`vx4i-WpD*9O)t?U?7nkCBV z^b8Bia#|S-T}U!VKp;FoIgoT0gV72Q1e9fVM&YDb^%1b>nGe4|_-SF;A`S_FM}mb2 z0`P>EDZ&t84p;(=gek)W8W7Fs1|$<`Mi~SGFad@v5->?i`;Zx6PVt9Jm>Woo1p1fA z|FF)M<}Sv--+T3=i;sJwzQDA=l}+C)p6BHgc-~~NrMP%^fCS|fP3J#O2jl?H$An36 z0tUh%89={Ue_4bGU=H#zfbXt3+5)}>A8x>=ue`9jh-^;iDa@_ry2a31?eH#lUI^Yr zy2D)|dlrMiJRv(^0hAMRWCoFeLJ;J%oRBynY!u6I{Oc#1r`I$vfqm)mD)N1MQ)|yg zJbUA1UQ1+pP4rpC({^TE67QC<*_1ou@2!z(A7OqsVE< zaq_!Xnk!pws@>m+-5p>Xzz{_B9NX)Twj47)E7;5`ZrD2O=_zGow-VW=72cg@&db)K z)5^9Zib_?bbS!nVJ#`0PZDj!ZZ!kC2V3Btlz$Uo!1e~X*ziw?GzL#sKbLh*2~7Z>StrN< literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/progress_secondary_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/progress_secondary_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..c8205922543ed9b6d60341263daf2e40ec6b0965 GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^96&6^!3HF|1ZAaxl%uDMV@SoVyOTHaGAMAc)JusK z@NF+u`Cj3fp%JI;d{Fgz?01Gq1uJ+vtp5lva5uPSmddwmlZ8R*d|j@-Z$B;g`1&Mk VqV}cOh64>_@O1TaS?83{1OO}qBccER literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/progressbar_indeterminate_holo1.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/progressbar_indeterminate_holo1.png new file mode 100644 index 0000000000000000000000000000000000000000..c0297438afc582ef9136ecc7846c863611c87d31 GIT binary patch literal 598 zcmeAS@N?(olHy`uVBq!ia0y~yVD1I7B{-OYWah~iX+Wwsz$e5NNE>f`I!Mr$olW*Y z2kDgr`2{mDGBLBTvaxe;a&hzU@e2qF35$q{OG-)0$|)!*tEj4}hxSgGJazhvnX_ik z`B~S=IGcfi(aY1tF{I+w+gs83O$HLj3d6EfWwr{JRwP&*ynO8Y{|fFqGh&l+Kh646 zUtaK0g+G6m$reVSg+LH@WcKFz%%H%_zrzzx@%_BJS#EZxvGKK4+##{ELaux{Bw-tL z*IhC*dB&&3KmYz#IJxZG;fZt8JXcJ;lsI2a)YNvvW}Dugpi?fHcAI@F3;zABl@WQm z?N?Dq?rA0Nt$ds9e6_NEZHQiAe8g)( zHa#e_yvi=^t5m(hf4X$A+?@LQ|FT>BH*E||F<%RmUJG_mA%VT{-E@ zcd)SLXA6DlWi~qVuX^}~ExvR0gx}OzZ$g&73HjOW?ECML$ItG=ob0BS4<{5II{4Dw z)bj82qF?9FT4WU&`<*&#k=GkMIr_0tUN0zlFfcqY{lhrR&^5!Yp*bGJ_jL7hS?83{ F1OQOL7Lxz~ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/progressbar_indeterminate_holo2.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/progressbar_indeterminate_holo2.png new file mode 100644 index 0000000000000000000000000000000000000000..4b84169f6a22355181e65fc8eb3ae70df3aa2450 GIT binary patch literal 726 zcmeAS@N?(olHy`uVBq!ia0y~yVD1I7B{-OYWah~iX+UawfKP}kkT%}>bjYFZpZ7q1 zvndJk3ua(sVrF4wW9Q)H;^yJy;};MV5*85^6PJ*bl9rK`lUGnuR#8<`H@6OrN$8z0 zdFr(3GiJ`3J!iq9Wh;N~UYniHz`!`k)5S5Q;?~<+p2bZL0&R&bGJ+=-@UaOCmoJXI zGd<_e|NEj}1yp5<8nq65w=8<0weQu+S+nwZfi3_7%RsM)B_$tY|L8u_J&^w=`sbgM zI^AA}S~6d>zuJ|^6{u+wXx4kFvCv0oqR*E*X+rOxe9@Zkd^u+Qx<4u_-F$Byy1<)w zI?DMc>+)CgvS;qfi(0M{IKk)9+&NiKgERWXO4t?`E^6Dmtw?)WLC9`%8S%Rr7cwia z7VUhswa@d>oX*Tj$2jB8@}f^uU6*`X@n0fi^U}c5e&sWp7>+iUm zW+{CtE0iz&^x^xD%!N-+DqsHY)Y1xd^_ZWouG;z6yUlfd4nJ>BKmEJ1LRHQ8daj>S z%#0s>i+?4?Exmv8eeTcgpUSP4e_S11o;}yKLUmc=l!GQNDwAi=zP;RF{iXL$`t#mK z%)ERe^NC5?CzGP!r^`dXAI w7G{rc^qfAGCKLTQr+2gIyxz5ikRW|>n15++>1WH^P5~eRPgg&ebxsLQ0Ix1x9smFU literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/progressbar_indeterminate_holo3.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/progressbar_indeterminate_holo3.png new file mode 100644 index 0000000000000000000000000000000000000000..ea50c6044be88e3098a8fa5c503f9f81b8e66495 GIT binary patch literal 748 zcmeAS@N?(olHy`uVBq!ia0y~yVD1I7B{-OYWah~iX+UaSfKP}kkT%}>bf_REzrWr< z7h9GD`2{mDGBLBTvaxe;a&hzU^6?7@3JHsdiit}|N=eJg$tx%-DXXZesheAe#`I2@ zJayXi88c_ip0i-lPlscUyBHW4w|KfZhE&{odn-D>$w1;*A)Bb+h6SO8#W~6I$^w>O zmi_TBKBpv8Y;WWu^ODd1cQ1PQ>}~M9mMx_~`+?vCd+e2r^ifH{7H_r-m7J${_;TtTW8v0FL8lECEb$fV^ezhj`)DfnZLXYE;iZ=N)HnJymwd(Qi>DTYx{%I8WXAOtq4XHzUyW{LuZjfAc{OPY3`DNL^ z*4fsqQ(Mt~-tXtyfW#GDoAN%_$$WpVx=N!ea0!>w2HTeJ6M3Fq-DK1Ga<{+nFO$0# z(nmffgk5{9IN7LLW8vbA?d--NRsFL~{62?PGF>kJD|z=sy9dX$Qsw$pf0hU~>DI4$ z^Jqh(BgeKkj|vVQd}gP3qv+7Vm-g)UTM|ycv^RgeL&S|^+nt`r*DS=BaUSf8ehdln bAJY36_Ep=wUbC>=0VLw->gTe~DWM4f5v5*- literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/progressbar_indeterminate_holo4.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/progressbar_indeterminate_holo4.png new file mode 100644 index 0000000000000000000000000000000000000000..306bc9e76feec833fd6326d3c8229350412950ca GIT binary patch literal 792 zcmeAS@N?(olHy`uVBq!ia0y~yVD1I7B{-OYWah~iX+UaMfKP}kkT%}>bSNUX&o7q( zU2j_wA`=tF^RrT@xH$J zf_RVN!}h>fb@w!tNW%k zaj&!vUwm@n%n3}_3!BeRIQ33jdYMD2v0Pd7s#gX6Gi$w<=`Ab#w_(n*Pd|HYqD zdYS3@X|Ip3J)1T0+?Myhs;23M&30!pd+k~^-NRq4{AH4_f(p}316HlMXI~}SaoOtU z%&zrbqPLyhf~AaanfNk>3y03oU!Ub zuN?i(2CLhw&|`l4yXwO<@q2Zp$=7;QuAD7$imNWveYf}7hO=%7Tp>>8XQS2{o?Th_ z&XxUY>Mf3@&6>Le?{?%Zx!P;7^3js6$y!q!KXl=KcQIK$`k&}HYC;PJh zGyWz2@=yKMKfSO*vVD4CNZhf9S1sgxl^NZ+PcuOyqv7&rzPrymgiY^MP5}vdy85}S Ib4q9e0KzhGBme*a literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/progressbar_indeterminate_holo5.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/progressbar_indeterminate_holo5.png new file mode 100644 index 0000000000000000000000000000000000000000..fbcbfc990964bc7717603eb4aa17db46654c304f GIT binary patch literal 672 zcmeAS@N?(olHy`uVBq!ia0y~yVD1I7B{-OYWah~iX+UazfKP}kkT%}>bkL%?hIIiz zCz_N5`2{mDGBLBTvaxe;a&hzU^6?7@3JHsdiAzdJ%gD(qC@HI`s;P&@Butn*b^45% zvu4j(uxQ!JMP^I)GcYjLc)B=-RNQ)dD>}c)L7**>`?XUe)2YXLYLWxZ(FEHhapVC8Lv4TV|4L zW(ve)sefA+`uc{f-*fKUHCAub_65}iiFTMsfA@W2y7$DF2KNH?pphIp{zo(pYEnjZLOQJ)@=8mf+N>`nDhwlvr1!J*wr~7#_XtblOp!@***s_P__6Ax2^~2v-E{r=UitesPagSk?*8o^Z(IV? zBR$IGw$6)MT-?|_)8%D>_lI9KJ(sMlBg^D&y8WBNBEGq|X62`YZUvh0tL8i^nBiEU zx!mGTLBR$80!?$7JO7F~{R$Mf|KHQ|xKZL@E0DTs(Z8Hi@8MMoNbvoe?C-X0SKRSQ RtKWbGJYD@<);T3K0RXI_KTQAt literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/progressbar_indeterminate_holo6.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/progressbar_indeterminate_holo6.png new file mode 100644 index 0000000000000000000000000000000000000000..b92d07fa394de81586035d695586b607b12f7fdc GIT binary patch literal 807 zcmeAS@N?(olHy`uVBq!ia0y~yVD1I7B{-OYWah~iX+Y{gfKP}kkT%}>bm*d&Ei;Y+ z{a{}b)y1lS8aE`Rax4|42l znxnNMVxsif@BhP+QkU6S=;r4>{9m27JhQA^ZSq}ENQ1!?7gOhBi+`SuGyAhy`^Uqk z8r#agRX*OwB|=YpWL*?+Y|AH$=xuE3K1;p6b{r|(&$=^BKY97vu#jn@;zc^1r@y*R zaJyo2Jf%e-%_`29MRkHswBo7En;*P?tXmrFv|^sr_Z*LA?(MhDLYzd7Jzk%FWNB1p zOY=pGs~fJ1%?Ui_y4zf4y2GX%?_g8yII|;e%^&WWhOF9McxQdgBsR;`_Zb&*e=YMe z{k`t9flt5p;j5Xc`yz77GPk`>H4$Bw)|I&>Ccj*D<6WJ_kq1iU&MbPGw!3+MLfyIc zzIE1TE#6(%^=z)$WPb16_w@T0*8IACTuYbJeD%>iFE@1Uak)~&vt0D#q?_e2@5;Uj zowH?|)4gvGqo>r2pQ-P?4;$_M;GOo0`|qZ#m=?M3hgx-JI$z)Z_nqURoy*&Dud9Dz zQ^`ztI(_f@-1hE&+s~M+lwRQ$qP%LO#?_9=T7Ii6R*F4c(iJUp=g|YP>9UKA`i z+{ou1XeIOF-{Rl>@9G10{h!fuI7LS7F_)2K`^rL}-pB3T2Bv(lSXug!`LX#nPO+D~ PyFfyou6{1-oD!MbZ{bxX0aHM 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 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/rate_star_big_off_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/rate_star_big_off_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..e7e9b4bc6e412c34a166bf3ce4c6e5fd789126f9 GIT binary patch literal 1232 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 Z{R_A;q5E`VGTHzD002ovPDHLkV1mzcD{lY* literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/rate_star_big_on_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/rate_star_big_on_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..e8e4f26a62d8f2bf54ce856b334827215aa37e53 GIT binary patch literal 1797 zcmV+g2m1JlP)6Q>|F6(fHfZ(goQ-NRoYcujK-TcP9Ri1RP7=oe-XbOPX@Q z#v`sHQa4+%*|bYiOBEypgB^MfDb`e+xv9$k__RRok%7<_EH z`bfL!{9We(Z?41Vi9l>=VmP3ujk@C!_1dqmhwZrbcUX1ZW95SKBU~FvD!%izG(i&B z%NVy&>DzVNF8@h_h|u-NZ`g)KEyeeJEG;gn`A)9ss@$5BB%~hQ_8%U)PsrNIVspmf z8V5_t3Su3)#}&aD+#(_R1TOpZtU&HL57%fcMUV@dFP!T2_6MJZRb745P>`nb>@CM$ zLrZX791vJS?CBu#49E&Ds=Z7C8Uc^zJ+t6*wm|e2u2on<-j?7zVAMM8<_mWj5se5g zK5#|k6}S-Bc6{Drk~>={PVr4!Q%i2zkRXV?=NvnxtfgZT8*mtSfUk!Dh(VOKziv^; zny-E|B!(cdzVDXSvW3#?3S7+M1v@CJcE1HwU9&=d4!hyjE2hy%k| zTwXHeY`U$N?mtx!P?sLPZma2%i{y1IejDFlzF5$YS*s7|0Xl>BKn?tXJCFcTBf-oE z0bm3?R5DK@n=Np0PZzrR%@=zIW#g&8kAS#L(mA?-aCmuev8?|aYh^JENNE(qQYyWs z<$r?A;HM_UFfr-MLyA*wV>7BRW(}BTwuXx=7@u zS}1h&&fv>j(~xn@v|_O*(gQG*@Opr85R&CFIj1IY>FzVZg|(OI_=Ija@vCOz>6@C0 zv$qIs<+(d#^m^Q*U1{v5n}&j|cFXsF&>Z@6!oAw*gQUi8n| z_Kj1&;iWhca~MHw4B3bh7mb&88@MuP#oi0Lsw;odqR$f~+-G+2KI~K`bJQhG8NL@% zlaV&+PPxjgO-GT7J$OFE)IARU@Vj5!#$;6S9p&#bHfHxvN-}nu*xX_$TUX`PoRUVqvJ&Pnf$?&@ z=2V^GES_MhLyuRBRC&8j(E{cYgQD;b6^QU|*(gVn$Q%IM7{!_|CLDouC7TwYg-m_K zC{8I7k}G&p8F{j3-~d?0OgbGwe_BA1Fs*_Xq=ij##1NmPQL%+A9)AkfdAu(OsUXJn37^mEdu9s%rt7BeDwPh@LIwhJ9=CQvcV%X9;TM;TBSyc0vSJT)ji}HxYv0YWSA2=4 z^4#sFZcx4M*w21*%MPfPd~||#pea#Q?+9Ie=9{x`C&de_37*NhyLBk&o)%a9v$q_R zbcrcI(|#sj)^@Hue(FZp$d)Z0M8tP0{BjfG=l*ZHbuKar8PRF8B~Vg zH-4Z!Wy`kOu6cg*)*qzZGE|zokI&qJ@|xZy*_xyC(*rk^PsLWln?V`=AYgIzacQ^M zLbgCijl?d%2C$glx`H?=&?p}aS#`J$yWD8E{NLMpjBD>Wi&7tRxa&m9f~kj~zbjPp zdrZoy5w`VNfL%$X^vJ*)25Zm(yEV~P7n$#uvEfj|rXkOIr`th0)^+?pyhkc)8b^{ zbTee|*p&pbl_m_?&~A;Vmt)AZ_iD;d{zh|qPFcJQb~KJ2jw$0$luby7Tym}GyzI9L z?Uc)u#S!(k@{D#V2hm&``&6gCudh}u*?9t;)i1fW(p1VBO&Whh9{xG@5xti)uNGr~ z!bmlX00d%Jk_0Xu8E7!BfWS10M<&hRaI{jG)~(9O=Ucxy69Gnn8O+}%8C*t$5{LoI n#Nj~-)WFrMb+nGwVYcxPbY)l5l)|mJ00000NkvXXu0mjfbR2O% literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/rate_star_small_half_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/rate_star_small_half_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..13dbd178b269868321fc14008c962ea8192150db GIT binary patch literal 812 zcmV+{1JnG8P)NklSfRyr6LLn!62+x zG6VMqo##z$Zfj0)n^w!se{;^=?N4srw!7#0J~7KcYl9gbeAw-F`~L2p=l9&L`mZ)w zme)ZctVsB3xCGZAexJ-H57zy*jQvK~ zlFI^R35n=lIs((3{f=NVnPhS77~~{84{FEeQvFwr6R{SiR|tp0LpXL9@-qpb3ScvA zgI!PxWl#Yph%7g$$75fs^j`6uo{`*c_c$S>1;3q!L$DW0p#+N4S!+Q-!Xi{P#Ns0XwNeMj>Ykks+_G|99fGUbnOKF^M`(d&6wv8(gk{;d)oSH!HXAoE zFfi+KxqP8e$cdajcnZ5gvA7Ml!tHM9+C4_PB!MUd(t8gXM(8cv*vJqaz_~+|~f_|HGWZGyn#_9Mo z3_};41Lxj>HQ7FU9&0A!?#hno1Z`E*tT2qn1?_ho&+|^Z-5xX;3`vj2<4yN{Q8ooi zu;AV|d*(c^zC_1o=0ywU;{}c%g$ig81fdVD>7}chE;Kr%nTAtm1&Q=b#8QK}Y7M?$ zhhk8q6+sQ|rWJ+k_@s;LGAJ^AxY0ls8sIP#EOFi%*ar`x6YfJnrmx0xa2_^+;xBi* q0nR{mrUfV!D6@RysQ?%AkGJn(8j}^!=#*^$0000*nF8AnlD+p%B53=gPBu{Fv2L3QvV1lNhKWCd`mZ%1j3pzC&RI* zXfj6=%+zfX3W4}v7KxGsVMJ0P1<^lII{Th%;2#QGOzPmncE{cG+&$0lCF*}WqJh0z z!AU5D5@7B|0wG+5Mi56jI05-2lci&`V+{CT42(!7h=B_kC8zEkuQ)qM5X5Di3nG~y zg~8@D7wQLQZkqaE357x(u4P9mI0K5gS$VzcN3$yfkDq*1C=^y)I|)>%L72dUSV#m3 zq`*FqMiE4FCnW!HH+TH5$z%MNxFKa{~A51qp}(G5EmR`i6($5@;AKwwC1Z zS}1;O8&fFiWW|g1g1n;^Y2V~xnP=HQpTvdO1i*@=y&+v=vyW{gxvv)z}nENCj`>=M*v%Enk@Or)e zp`oEK7K>%kY&OpujmEi-j*jO_rP9V=F!YF314%$^Et3FFFk|C&;_B;eI%xjHM}NL& zWg{q*9$f%2#TcYc$96#BkRp5hh$y@)iAPYU3RrJ7s?l-E>^ff(!(# z5{t#R>+9>sF{^z%9TCX Q`Tzg`07*qoM6N<$f`iwG6#xJL literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/rate_star_small_off_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/rate_star_small_off_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..f31a2555ea05720b9713bad422ba4fc890a8bec8 GIT binary patch literal 757 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1&H|4}5bXiRZYQ(tK!Rljj_E)e zteT<1XX!E^hbhV1-G$+Qd;gjJ3=E8aJzX3_EPB^Y^!J#YD0BRK-nk_gI<|PM@^-2; zbn@68!t&Qv)T#Z&qzaCH$C8!F7gRg>N`*wMj$b?YJy!4evTG%mbGNKKdd1YZ{dU~- zg8%ov?U~QlDE*C#`4U151y+ZH# zLYKcJuJp}#RGFptajGNVRkach)lG69nR$9wnxbFao;CZ#&aRo~ZH#2*u+6eO#ChxG zf^Kh~wR(H?tzAsk?SHCuch0i8W>J}G`ja?~!zGUBxwR~|S+&!o-0VqkYKmIX%Z_Ik zV^WtFa7bDo{*qv-SU4xW=1iOT^(N`fnfqUzv@DU7bS-~g`zpt3#+?5fB@dqV_EY-X z`O$#CZfE#(8%x%o>y6_g{)NqY#Cd#zRN;Kb!H~ z#SM2?Kj-n6d|bFRT=3P7gT8$4_H_S^S$y2VVCDv?=e;dgA9!!QmcN8+8h^;jw+6su zp<3b^QIe8al4_M)lnSI6j0_A7bqy?lD8$gn%D}+N$UxV?9LRVqZK#N%AvZrIGp!Q0 zhDmOnbAcKpK{f>ErbP0l+XkK D<8wd2 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/rate_star_small_off_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/rate_star_small_off_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..233f3e5aeb51a7e7ab96db8cbd4b29e5c3ca57a7 GIT binary patch literal 764 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1&H|4}5bXiRZYQ(tK!Rljj_E)e zteT<1XX!E^hbhV1-G$+Qd;gjJKn{zii(`nz>Ewh3LJ8>)6kIKhn^~KcnYBMkwMbl& z{3M~$8G7zS!kMVk7Y`(yKj1Ql&99B)_|1Ral9MHWbX-9$`DPkEME zwPmnzCU7({$~W(J$o;ZP_5Aj~%$lxkxBuzZ&)w>}rt_e@gmn)`eSyJ@jZdu4&8jK= zte^5U`u~|-uPx{AZ8 zG!2(F^IuxZa!V`CKk5Fs?QU~!yLb2AbNl{if)8pN%xLg|-Fwfz=bYa;=Wf-1^-)!I zEu_JUgs+CPa1l~gqJwSl0`#yu(cv5vOHAz)74{L|%ONR|9jt?Uy>4Ns)gJ!NRJ9J* zn-keVHb&lDWAWK5KlAR{h+@LMBao2rBq*PlllsrJJA;L-4#Db+4B}oDq{I?HQehKp zg`JQE*`R}CC`rA3GB|pu*(T>T*_5Y0W+!E)zQVJUkOzAp3o;=inzaTv3fDkB)Ip=9 zFoPhow;`FepcHL>l;fK}V!qPr=5yant2t1Lne@47B1${82};aJzlkWUi87!8NE-csN>~^RNMyU34w%$5bENLh`4IJ`cZC2N$|szLD98 zSz&5DesdI3;yJll=tTc$*gr)zU#x>WgFc7ESW9##Y2w}gIYF5jvDmJK^(OPzmwMb@ zUQ{~J_5{Qgu7NT-T(sEp3t9ce>!8zI{N5R&Srxo<2o|qsLEB15j`!Vj-!K&#$v4_X z+N#|yVMtV%QNk-@z$03#@X9#eVvjuk85n1O_I-Lh9b_Wt^~!*u-uD~C%AtY zbWrOSl%8j!fpK~sLMf@Fv4)cZL17)gf|41dHsJa)WB?bH4rSPyjWc0+0E3~!bq=^# zUv3m=f?7BLsf)BrhP_Y?t#AucWBqF^gd*4o++Sw99!^0?tQ`<7XyW|G(*g$bk3YWw X<{N~(V&w7000000NkvXXu0mjfu%m6> literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/rate_star_small_on_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/rate_star_small_on_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..f54387802e168ca0f5eaf39d16102b1da5296e51 GIT binary patch literal 818 zcmV-21I_%2P)xR`oFSBsKFMCdf>;lv-kYZ%X!}S9M1n%d=UJt za0Zq^D)7MLC4(JM04h(1QxHq@_*PmVs>1hVpuuA$gw3+l4W|{Ec^w>z-iqJe;IY!s z0)Cs{y513INt-k2Krh7!wF;P&zUsz%HEO637D!%?b(`FL5zf zA}!^~l;x~kRpA}8yjkBgFcEugY7V{`+J>fNDeGEUxw;Z#tXzq2899gM3kxwB3v%)y z4j7m(KghzL<&x;cVYrc0yKfxC{_ zSjD1hWUK`lQ1D9$AfDo~7Fo*rRx(5L)fZo!g`4{)XQEEseJ0PyJx6X2&P@W5E02Uw zto1FzkjPqnqkY`j1tL%0ekw5}G*S$c?^w26cXqBC7qJ8vHs8c;nEl-aw3TgxG|Mk> ztRxEDs$jA@NV9*2q9+Ub5_$Z_V^*m-h_O+BvbmB(I&=MxW}7aKPHU^$2gz4RVTrZae4lwzM0`6jMu(bZmg5Z&|S zlV*E$AK8fRKAV&X+8eN~q8Gc?F3>ElAx+0|9fTq}KWI;#oe}$#ky{Eb zmyr>QtX^7UJ!Vao-wKcdy)@jJoQM$?c6WsnV8CvPw=1i?lqflOE5 wbPO253}T>M=$8TF+1aq0J2|4 zOQ!=VmXaX9Ubbb-G2e8P)`@fkcwMxrx+G&5B@qcrRlw2!m3oX@|EnzN|i&?k94Pn qDchB+{ODKNJNfHtnPoRW`O8hckQVo2?~zWR1q`09elF{r5}E*l+%>EK literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/scrubber_control_disabled_holo.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/scrubber_control_disabled_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..e222468a23e3ef7c853843db0d5c55cd6073b941 GIT binary patch literal 663 zcmV;I0%-k-P)*{)4flJ#$n%0`Z5|o5eNnGszC@) zG`V26W@%%IK7Hm*o`99{Pp1E;_6T$%Q}5gi=Q_C6IF-Dm)A$# z@%M4_c6u+7Wm%^YK$2=5@QC|PZREckNWt;s$FIiZ=WmHDcgJ_%&d$|lf?9&K`+rBp z*(p*+jylE9Np7dplgq22VgT4tfs6_vqU* z@lwC(;H7@k*lit;7O}-^l^BGkFScHQ9Sav*JM=~G=7WgAo@w#yGfp91IfxLvF}$#Q z>@x(`uGiN%-5*tjvu(oNChzJ4$4k%vAO177_V{drZ3EX|Y9s|v0Q<7>ul~NmFR80u~e!px%hr2A{;^BWOfl07`5lB9|Hu zFQ9<7r9^!JP3rfD&om)vnCZ0CO?Hwm*-mHw`Tpa~&Ybd^*Su!lM%PLLAK(YNfdCLZ zf&l;XbL@XZx{Ks&APhu+vp_G7tB|5x0a8$qfP{KnzF%DIi0n*cX#A z92@1k)`=-X@_vRy2E^Qw?U3`1+Zhou!RedWw)kl$?~q#|8#<7OVJ1c@9MHgYcJh zq4FEQYfkD>0ga|sbzzA@+tjQxXmUTEY)lAHo63IzE9l2#EuUZ~^{5+CAq>nnKyA@>Q@>6W4b zX>tmxC}43J&!`AT!Y(6xb`jIc3S3+-)o#A2euF3OC@PR4Cri}>{lFCs1@@50S_&W! zzNd@k3Ydow!T=%kQ9p#LpC=0XA=IuUUX{euOyZZ9^5q)_N!+?JnmsI|I~rwlSF?=9 z70Rf=LIy7&j2>Y<_;uVumcBUX`P;UYxV%xGU%(10o{$icoRGv8h}9?1 z2g~m*ZdaekSi`M^QXWLLHgn7egvQDe7B*QMq&f*C$nsag zs#sYT$TNtWY^THIS-s{pubH>M*#cNNnE6n@00000NkvXXu0mjf;XSI) literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/scrubber_control_normal_holo.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/scrubber_control_normal_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..083abd77a8a57b15fa6a404a872eac05ad56f850 GIT binary patch literal 1038 zcmV+p1o8WcP)a`dC@Pp z1Gs?)_<$b-K{pAq%|{zI`!rRw3v^Oc4+w!_5Cdbt029PuTZ}d#_VIBH7r0j89uNS1 z;1)=LMer1?f_1O~GGv2ot71dj1pD@JEKfrx!ol4Pg)q1S=D-V(25&$PwgGullY*iJmK9MbsJxO0( z^j)|302l<*U=8eoe1q7fk7@e!Q-iX2KNtZ|Kw4qdRlkiieGXeDp%gZQ94G_w*UW4B z9=uXGG23_GfswQb%WR)}e3;fLkD#3%D(vUK|8aq0By zRPnST$Y-=2%m2it&a|4K*7MEG3b2o5?vBdfMxp%nQPKQ7RWi>KN9ND*Liv|*_y_qc zZSp^{5nB}>)V4^i?!U9o5Nq|E%F2r{@I%C+%?>9bHe##zP2{L?h?+0Ne@r#|NN7wI z%`=Pmnv)P)=~G8Gic#~0^m!MotE_&qXdX+5P~@eEt@Kg(7N`+gnNB%@AQ%UmR~--; zW*-~$8&}^EVk>>5ufha2sWoVwKsT6BsXCD+KOob5Hz>{t29Q3|S78DfYVH27CJ+P$ z*l5=f@`JHDHt~tVCO*-ziS?z?l38(_Mq#Tdjkf;}nYEM%X(}ZuHA;z!j#7eJ-Tx}) z9)is}i@5_S+>(}JE_q(e9q2FS?B(=|rgD1UQcmw{DyLWM<+S~QX1;|VXy)w?H1-Gj zcnd#L#;LKx$wU2i3yI&RrZ6=+I#yX~)nk=*JJ?#YA8a{4TAXRkqebV3yF*~1Nr$_c zDu=sD$LkACI$j^KAFr!laLhE}f+Ii;TCSJ|K!Vw6yFsaPi9QA_VWahu?Az+TfG~*D=`v$>=L*-XJM6Q}G2$FEKp(E_yy%WtF1nwARE>-76m1sS zC!*n^Tl=d9qn1|)>S%ug;e}+WvK$-@_Dvap`%5Z~y=R07*qo IM6N<$f~uM9^Z)<= literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/scrubber_control_pressed_holo.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/scrubber_control_pressed_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..d8e95aa3c900c82d6c8a7c9d667a46143fc66885 GIT binary patch literal 1411 zcmV-}1$_F6P) zxv20!C1|d-Q|G28@CT5#NhENpdcB)grfFypA@%Yd^gSF|TjQ}eaUN>vC#}7+v)`FH zGjnE+%N~93d2Tql15|)o@DgYSZ-b8nUY`Q{S*AjsDYfVTs0RB$7+eAi;5N7q)OfqP0!2CM-G%z>*Q z4u%9?&w}eLv&Ls!a*uVM1Xc2`&1m(fK|i>yUcL@2Faf@xTZBM2=mhNouTS${gk>lA z?7C`%G`IljK)^5Y<=_aIQLeH9mcT{O1G+$)Azgg-BJ0{vbKG1D79p$ zttMCNHz|vkIK8!%n6t{2Rzb68FEFSYR&mNtYMw78LD51@E;Uwr8Bh;w7D^S<`nyN0 z;NEB|R3A&dFUa+-5v!xfUPw`!En2Cy*vQsj!ij90oT8t zn05x_o|Gvt?3h$zGa{O`0Ttj9E&L1gnZ9JtsMY=2l=JnmNhf)5EVZ%cvgJaoyL&Y0 zzKCo24aVF$KINR3vIQ8?M{O>(R%ioi!2)kOAY$6`BL0;Ldj;a$=RM+o`AzN}nXvDo z?D<{hJrSWcms)GJ0S({|Z_a^`N#%#*b}w4ql2*s}oJbkziI?N{$A$)ksLiF;25mqK zxX+tcLEc^b!l)I5j}IS!i?HQ$B4xy#WK0;2hi+dUo7?B>(kB+ zxJTaGNf{F|$oEFAkm1T4Q`7tzZ9rIsutO$s52ncvj!road^&FfWN>2~B==*AHH?pj zRA?X827IW(*WoQP!1B|8ch%l>3>&1S8a*^__Z~HwMkk$HvMT#Ijn;xiwUC8P7qa8i&NuliWGHhNtMOL_gcM=5kS%5} zWR)tESOcG%F7@#1(-8J8dLkw6#8Bctj~08gjuw9gb)wDW zaQ9V^D8b?Gr`d5E#RqAWbCU!J&1q- zZZz(A{MBGx{ncQRWqbH+HHDY_&mNWB*)^y?dxXh5;1oE(GAN69{?Vtb>|due7vqTx RsAB*C002ovPDHLkV1lL6pvnLM literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/scrubber_primary_holo.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/scrubber_primary_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..b7fd6631eab6d106fcb20dc08193c4c5444205ef GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^ft>_?IyI zH!Z(Me8Htjd^{QxZBkY&*J5;Gox1ORk@&w!Ei+TjOx0S>BAV>EYKEP(-6ZwTI~YBp W^x760X*>ZM#^CAd=d#Wzp$P!z;U*XW literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/scrubber_secondary_holo.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/scrubber_secondary_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..00dddf30aafaa61d3c7615d95a02eda13f34484e GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^ft>xXM@l z0pGc&D(?(d2p1yU2)z4*}Q$iB}kY6gX literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/scrubber_track_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/scrubber_track_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..51dc5e3a12ecbc3391eece26d4fce4e73f696a20 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^fWzAKX;03$7J--@?`v3CH4fk4to$gp$Z^($j)<$Vj?b*la{O2LR()m*BhREPxnl=x R+koaUc)I$ztaD0e0svIPCHMdU literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/scrubber_track_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/scrubber_track_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..970ecba66805cecf8f3a73d8cdcae25940cfbc89 GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^f(mp!%Y T$h~hsgBUzr{an^LB{Ts5L=q}; literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/spinner_16_inner_holo.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/spinner_16_inner_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..df8653d50735f723c1b97d73b25d6b123be3fbe5 GIT binary patch literal 733 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1&H|4}5bXiRZYQ(tK!Rljj_E)e zteT<1XX!E^hbhV1-G$+Qd;gjJ3=E7-G2e5# zoNJH1EtEYq_e{i;`e*-z{%rlR`?~+h`)dRysx1?{XV%}a>C>H5M{mo3mi3!si}wcAocv~^zUmXN&+8}Q>g#=? z6?+peiQe=QhllWc{$lIpo_qEFk#Wb! zO!+zvsy6|dswJ)wB`Jv|saDBFsX&Us$iUE0*T6#8 z$T-B%%*xo<%E(yPz}(8f;9Z3}D5)Vd(hkPX54X(i=}MX3yq jDfvmM3ZA)%>8U}fi7AzZCsS>JiWody{an^LB{Ts57REx6 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/spinner_16_outer_holo.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/spinner_16_outer_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..ffdb78af90400876c8c7f57c9bd4ec538554165a GIT binary patch literal 654 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1rX+877l!}s{b%+Ad7K3vkswhI zFm^kcZ3hx8D{xE)(qO#|6+TOsF)%Pr^K@|xu{gbTvah#vphWBZa--yq$&SjoViP$$ zTg6s!1ijc6uuHS-d3?d^^B3hGc)2W`vaV&_?~Q^jPJ*Hno4jsm)m@p9(%0>2G_$be z`OUk<=PUQWtA4mKG1Eyfe7RS%vftXdd&+~8+GPYjHM-t<^TBogjjeuZY?979TDH9W zFeyA_Mrzl6ozFMdy}P33?mE?E&76RK$;;Jiv%R^smONeNkSh9AR(SsHDH-$#aUyZASJxx_A|jOH7VT>V05XLxJHzu zB$lLFB^RXvDF!10LqlByOI<_D5JOWdV>2rg3taYi#?$z8glbfGSez?YbZ!% zc?r}Y39=zLKdq!Zu_%?nF(p4KRlzeiF+DXXH8G{K@MNkDP!WTttDnm{r-UW|L#G7z literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/spinner_20_inner_holo.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/spinner_20_inner_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..a488f9e6b922c0c8c6fac4f2e7bb2d6e9f5b63fa GIT binary patch literal 664 zcmV;J0%!e+P)3I&nW!67RNP5N-IXV^|Lq9dOvM zJ?PgU#xZd>cUaZKk7UrUSj6URq-M34iVS5jrLU02C7gMJBD@KnWjB{Oc4DV=TOK$p z;2o-Q5p_k_f)+Ee50*H(tM{CK)^FOXT~ASnTiDDM_r2cAh2l<1XJF`pKM${ht@QJU zr7C4gf9j4lqc#s)6&uVk5oSf4(M=6#C@*1D3BXCJa+>wGq~J*)51WYaSWm%&zzVZX zCu#E}cns`WP@JXn@9dbQ=fX=`@z^!msA=8J!=1)uX4%1tduv2Px~BUDedZch*~-&j zP>wzedgndp60(IMNpYIOUYC9JC1M_?GLvMV));XO#U6+BoC4awYIItc?Tgv;;r7MeZ_p)kH=-2H50cJZEH_ z@tc_=#?U0JfqfQr0q$_cZ8PnvTrFD|c0OC@1m|uXl%1X*eQdXw>tHRbDNaac-ImR} ySxa8$F-GruA43egdiu=VFK#ix{cDu}W&Hv6NFxRiicCKM0000 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/spinner_20_outer_holo.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/spinner_20_outer_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..69f00704712343cfe4350478079903562b819a07 GIT binary patch literal 759 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX0wgC|rfC8xrX+877l!}s{b%+Ad7K3vk;OpT z1B~5HX4`=T%L*LRfizez!w>(5whRo6|2b1E` zoC0(v^?C^CtYf*G`ThWR;o|TIvO6yC4GGw#xhP3I&!sCM+T}Le(PPVwJ$pary6f!! z_S^rO8P^;(eqRGb1xkm%EWdK@e#%58={3O%vW~r1Q;wczW4Y;zL+I44tG`z*nX_l& zDJE`yX+Z&jf?ij(larDs>CXEwWsxKgcaGYI%z(v?6F_(oIt@ zO%W=(vR~?|?AnZA{;4uC*+Ir${7#H1+UuwPTJpQ-cj@9;m$&RW_`jE*z?>-;QvsqeH2b&y<-6e^+HLVI z!osbMdE4&(STz;j6cf!86CPSy-z{hr;#_9B>m7%A$A)XAISLCLPS~sz{I=!9#Pr$b z%Pz7?Yiw#hFFMKDu1)c@klE>)?E7-MZ*?c7eE6|q{<7nGpCTT}rAH=iU3vR9PfbzG zf@5m&nt{elkuH{pLq8pF(+w{lk%O#AA#vY zwZt`|BqgyV)hf9t6-Y4{85kPs8d&HW8HX5}Ss5E!85!#um|GbbysJ=Bv(s2h<=5vLQG>t)x7$D3!r6B|j-u!8128JvAsbF{QHbWU38N5re0zpUXO@ GgeCx&?={c> literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/spinner_48_inner_holo.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/spinner_48_inner_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..91ce9c105927312a84b1fa7e0135183789d26f87 GIT binary patch literal 1794 zcmV+d2mSboP)Ys-2VCF{Dj8>mcc#TXkC>!yu^gy4z`Bm^28>;i;1 zZsTwPngn-9L!b=}tq3|XG>OqcPwUq8w1#%+0g^6hlI7&2wqyJKfrv#lCOLLub3;Cs zZ~c5<|6f_JpNIc9OO`AVixxs;FMGj+-(<0BSdbjl5Lbd0C8#A%V3Z^CtrU}tYnt>o z!v9gwEJW4hZgtT~GclqB00MwKS*00c@H+zxD*5$%RY#VAxK^-U*U_XH2mk^99vL7C zZ-iV2M|&V-Vr$#X?O3tPF5TOMzGTonwu9A$%dv5f>`PRI=Z;1DnH9KYhJ;3@v~ z;%R=X7kOQSq-7AGfHv*m9=e|hDsm6apk-`fs~SOoAg2-fbWS6r$k*^r--f7`(Wy18 zRttdufi=QDoq9C8$e?MI;5PLTE5zhA#7UiIGM1-^??R2*c&|3lq5uSFnghK0Xl4;X zNt9rxHd0f_N$MC!HC7u^lJC{1Lt9v{I0zu6104ElX5m5g+^(AnIU$4E$D4Io%J3Mf zqer)@8G#_By}b67?1F-(VrI*r&dWo@mvmoCW-MWKo3Q5EIJp&KBte^?h#l2iz7}gp6k?{r=?gyeY>j*rkIflR;lFx<%E{7_oM-D(9;mc2UgP`>1#aj{W%QwM?x?cr>~EZUDEx|yAd z189`pTzsh1UuxI0$#n*t-G?P@t7x?J}St3A`1QZQ&4fV{K(Ja+6r7UqELjBM5c^3-` zhyw^x&Qm2ykre>c5|A$zBq9JtSwgBrAvqP+M@2`55CDW!PXHJI1Vw{v3WIV4Q6-Wi z0)RX&9+W4;oVX)YOH5JbWC-UAy3CwW;HR-O}&x}qhyF0qI9~392KWH9SDFarsfF(k26Mt z0lKR*G%cr{IYXo=J~D917i}9!)lYWbN7!?C9lNMAzzIKpeY(Oy zEj+*q1B~*_XGiB9*=qXU;u6<^VU@d2_pPIHei^XV?Eskbo-Az#ZH8WFjd8tiq>c(w zGw)MW2+h!|Y)L`y34O-H1}v`kx?WKsPe-*$9Rg&|>EdTf-KX{>$K6KE5cf6@of^7< z#d}6xqfLbslN=*c@}}q7(5L)&+ZcDS-Hj(%tY4#cZ6_f>dEQX}r_0&N_cX8gY7&OP z>zwqJhkVFqNNu4szmpr?HxGD*+y{8K7jV=~Ug`C|#&HA2_%g5gpl2R{#Rb7pXz*rlaU=Rq)U4n3fCoL| zq;t-Pq2<7Vqi%M)yS&29j+(+NWW@X3d;e@jP82u6^pOJ$vdt?UGX_yh7hPn@kY<_; zvxpeA)Kf?8e|>67r+t{g`@;$zac<7O*2fSx&_g>{t~^SV1}`r%fHVUfb)V9^Dt+d9 zvq>I4%o(p`Jy%nQ0E_|iZVH)Uz^6E`nUA?jhrnAy#t*&XH{8i8R?tfPoqvUeQAm~) zqweQC!^+&_DxXT2t(sri~_=sHcV)p>m$pv?m#7gd~}}Ll!_R%FCk05eE*i k?a(>r?w|}ymMmHFPmsO`P~6+}xBvhE07*qoM6N<$f+v4TDF6Tf literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/spinner_48_outer_holo.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/spinner_48_outer_holo.png new file mode 100644 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/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/spinner_76_inner_holo.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/spinner_76_inner_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..a077c61e9e610337944318479d7b57c2194541bc GIT binary patch literal 2936 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 z z`h~-5K9QED-}fEAiR@Ph+4JJb_I*n456+$D%rSS#mTRY`Z{1n?y`W;=_9wFp<)7{E zeZS7|m_%}q;jukyukGq)k#O3T(NV?7Ho?%!y&6bq?#eP~x#J??gbSreIDMKS@7OWX zspF(`l|$IE4=T@&JwLw8Wjaq<#Y>5~lVlg^6&iJi+q~D`zVi5b>kqFsy-+&A z`h~-7Sq+ZXH}$z6m0P>S=l;2-{z>jmre(_oPp|B?H4)LbOZnTMS4OXs{G9gh_K$Z` z$vuY0B$CgZ&RW~<(V)1byKRMd0)ymY?-G#&hM9|JvpIW+CUOYkKob)=PA2bTQFP-{ zRO5ficvJH5^*#K{qc+IPh5m3`~UwxTs?$QckqTO*bw&}kGys~Tz>3Q(5?qS zvg^=wt8Gu(4qbQN{;2-I4WQxQ1qx(=lyXUsU$F1Y3E>PoLYhLNRyS|lIB^=ojFe>Q z_)@?A(6A*@OB?)ag3A`nJaiDK{D7y6V@O5Z+pDMfnhXS5ANomlFA~c+ef0Oz_y7CM zayaHp*<_%m_V2a+<~hn*?>^rvUgEW3^Q1?fuOl|-X0E%$cKM>?>4;wru?8-?&Lv%) zwZhy;c%#wID?jw5{&jrZpZM?DJ+-sHO1);5*4^{rnH0;&c7lsX$iU-*f@3oauaF6x z!OVELnUN_?Ve>N!wTvl2l^f;D_xAW+Hrf7mNqdv^h0U>l7K{BWn0bRqvd1&0i}RSI gt@D<`Jt>dxbzTr%_0uEyHP9~%p00i_>zopr0E3moj{pDw literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/spinner_focused_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/spinner_focused_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..6b70776307a9dc5e52d2e7297533db240a78994e GIT binary patch literal 401 zcmeAS@N?(olHy`uVBq!ia0vp^%0O(y!3HF+1t+C5Ffc}Vx;TbZ+@0?V#S#gPMM#UAx5IPfIEl$`X`uaVZcEXAhhc%Tj;5Qa)z#f#rP5 z?^Pd`-Q!*Kq}IborQ9^x=WTmp*Pr(qvL(MK-pskFG28Qi#`W2vTIC66gc&4@>qU#7 z_{rSP5M%Ess}+8yZ|L_@E$7x6R*vs4D!+$IJXO;JGFPlHR7>1mt}fp)i+ZayBW)28@$Z*5lD@{*$ceTSw@IQq@>s`Ye^o)#UGcMcMq zjEO2NEfWO<+?>!k2NP9}$UpvHt*xlg)AGRJ^73sBEJx4Gi*}VbB%a)pA7*y$<(GrP zllwm@-9D`Nm7RV6sdEn-v zE5-Y7PdjoINV@KL1e8KUseA82L`=3mwcGx9;^C`ld+(ZWds49P_Qb>2a`xS^-uA>{ z`(u|KkAP+#2=h}1QnDpMe!(*tuFbu){oIa)3=@)5rb%z;pEz^w=?$~Co!&BM-U8Rx z7c_wimwUQ6hE&A8y?UCj$w0vEp(M9PuI7Wk*S^>LcJ3~6dfhZ*M#Z)GG|T;4e(4=s z!M%0S!N|ySyA~{3H#uhR>@x~K+fI6{{Oa>((Zx`oKfIsKpVwZTad~lyPwm~aJf2q% zG~^_BAYg_E7zQydUZi58U|Hx>TeOB(%JFhA!Gw~{|sfzqF8IY1{fc)I$ztaD0e0suD^tc?Hw literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/spinner_pressed_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/spinner_pressed_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..af8d0f3131858320009fb85028c4c75bc5021e58 GIT binary patch literal 362 zcmeAS@N?(olHy`uVBq!ia0vp^%0O(y!3-oH_D%`~QsDtUA+E+-p8}c25oyM2ZyCqr z7}w7>uA60?SY*8H0#FKsx>i9M5H5t=^2B)4L*q3!jh9_CZk%VFT4CI>$avjt<5ky; zQ_Fz{CZG7z4y0sCg8YJKGF+Q`Y5R_I3#Tz`NRdvS&_8kJtho!eo!&BM-s!lNN+9LS zJY5_^D&pQ=J zN(q7BtVst}XmIkLm}EJn<(S0fGT)njBc!t5X8yi(^a0FVdQ&MBb@0HlAJm;e9( literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/switch_bg_disabled_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/switch_bg_disabled_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..41576711033670b8df1a2b4f60a94d4e3e7d9eff GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^3P7yG!VDz8O5l6stO1DsRTynmZXP)jO`acI0zr` jFp%)<;(5@-A|b)B`<}43U;ej!K+O!Eu6{1-oD!MmdKI;Vst0PWK%WdHyG literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/switch_bg_focused_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/switch_bg_focused_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..2bbea59bcadffed73be3f7349b8095c787c1c15b GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^3P7yG!VDz8O9Y2ne=51#%ny z{C5CStR+Ey!3;jdGiT=b>GlBy>^)r^Lp07OCp0jGu}LHpIx_O{=yWxCIB;kv9B5#X zaAZ2>(QvUeq+x=?iHwQ~It}w)7)(;FI+U8g;mX9r!|-iFk&(Cj4>_Pw44$rjF6*2U FngCq4FsuLo literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/switch_bg_focused_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/switch_bg_focused_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..9ad2d43613cfba6b1c3f0733d008ae8f519597d2 GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^3P7yG!VDz8O9;&YTG(fe6Ue z?@W{hQmiFGe!&brzQr@2Y5gk#3fOzPIEHAPPfloH2xF5-D0F1xe17N>&^nIDX#*!FUNYz$2}z`&p#=2M@1^UX4# OQU*^~KbLh*2~7YXa38t= literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/switch_bg_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/switch_bg_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..01b8653ed79a91933dce6a79e8be6b74eaeb7873 GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^3P7yG#0(@WuLa2fDb4_&5LX~QbLLDSxirL;1xPWK z1o;Is_}2aVAPVHkd%8G=NL)@%0D>e17N>&^nIDX#*!FUNYz$2}z`&p#=2M@1^UX4# OQU*^~KbLh*2~7Y)4YrByQWFAvLR^6~!^|@bC9@eO9Zo*@ z0K~0W$T0Od$DDHxn{P5$`Tzy~|Nrm0`KHi<3jrH0Fittj(6r8S%_WAS8H_-UvTAIz z&oWFn$WSMT_&!ats59p+88Pp0PVWn8YTgx^h<*Lf*H;zY?EO+aQ5sTV@8H$=UKL{ z^j0{-dv@Ep{kugp&Ym+mvxHS_i4?et@Aux978JN-d^+MYjO~1 zeaIGaA@5n`hJ%&Ue&0WL;{j~k8Vdc$&?9>Y?q4;>{;m3 z`9Sm9JFzoYKX!A(<%jNNTD|&oGsmetugw!`r+c%ooKT(AqW_U6_;RwO$=O;4*BYrByQWFAvLR^6~!^|@bC9@eO9Zo*@ z0K~0W$T0Od$DDHxn{P5$`Tzy~|Nrm0`KHi<3jrH0Fittj(6r8S%_WAS8H_-UvTAIz z&oWFn$WSMT_&!ats59p+88Pp0PVWn8YTgx^h<*Lf*H;zY?EO+aQ5sTV@8H$=UKL{ z^j0{-dv@Ep{kugp&Ym+mvxHS_i4?et@Aux978JN-d^+MYjO~1 zeaIGaA@5n`hJ%&Ue&0WL;{j~k8Vdc$&?9>Y?q4;>{;m3 z`9Sm9JFzoYKX!A(<%jNNTD|&oGsmetugw!`r+c%ooKT(AqW_U6_;RwO$=O;4*BYrByQgs17A+A6g2qsLJ03>sAa&mKX zm6er+goNhKoeN|yT)5EJ*Ec36CN3^6At50#F;P`jb>_^OnwpwGEt4lt?(grPK7D#` zZ||f@lcr3WGGoRJe}Dg`rlx7rrp=l)s|yT@i;IEmHGSX}! zP}5{j7srr_xVP6%@-;aKv?Q`mJ<90fm>wZ|bI$jAM`7XoGH-Rc*Zadh&CTAd^}SDG z;%{U3rnrg(E?dnVr+2dlPk-Nkmv- X;u&RIADVp!I*-BA)z4*}Q$iB}(<+P3 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/switch_thumb_disabled_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/switch_thumb_disabled_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..1cfbe02109741fff904b80703e4ab7b525cd16d3 GIT binary patch literal 395 zcmeAS@N?(olHy`uVBq!ia0vp^0YI$7!3-pi>YrByQgs17A+A6g0wzqDkdu>>o13ew ztSlrXGHdGhq>(|db+ zCrz3(Wy+KpGiLbv`!_W;O`A4t)~s1wU{G9K3}h!KC%3e;G&VK@WwWxfva_>+_Npn| zum@6_B|(0{42(=n%*-6zJp2N}VnCpvuAysWWMm8kHtz1R@d?SPX=&-{+1ZkjW)p#$ zCVRR#hE&{odwnNgQ-VNiV4Y*xl+ZGfoA>{-diwNSjDORrT1%%7cGCodE$_7?7^KV0ILqkJ0CWorhrk2# zdM%3$GinrHeD$3->8bB~PRGr1)28M~W(9L-Y4^-@@-|d(jGG}++Is)7`O(57QP$I5 VWt3$wuKfxMQcqVumvv4FO#r#vkNf}t literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/switch_thumb_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/switch_thumb_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..77a5049b2386beef60e378f8f71b37a00f5866e0 GIT binary patch literal 419 zcmeAS@N?(olHy`uVBq!ia0vp^0YI$7!3-pi>YrByQe6Q)A+A7r#*7&=XU+@_4Q**@ z2@DK8b?OvQP*hZO{`~pQ&d&Y){Xp*j|NnvF2M!#VHf`Fzefwt3nsxQ+RT~?dii!#e z35iv!RxMn(@b>N7b#-;FuCA4pl|4N@A|fJOTwGRGR?*SX?d|PAa_Q2gy1KeRGA1Ub zySp36?(FRB>gobY0jY#`E-D6G(Whh|s@T1pJK$H9u;cY&ffp5e%{>2-COEQ5rc7|$-zg|zZYOw#f7e~9?5~>YO;1xf zz8!0N7%1d;vphTCx;KN=2~m%xcH8||zC?)m7R%>1YrS@i`g9cNOa@O^KbLh*2~7Zn C^PY_W literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/switch_thumb_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/switch_thumb_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..77a5049b2386beef60e378f8f71b37a00f5866e0 GIT binary patch literal 419 zcmeAS@N?(olHy`uVBq!ia0vp^0YI$7!3-pi>YrByQe6Q)A+A7r#*7&=XU+@_4Q**@ z2@DK8b?OvQP*hZO{`~pQ&d&Y){Xp*j|NnvF2M!#VHf`Fzefwt3nsxQ+RT~?dii!#e z35iv!RxMn(@b>N7b#-;FuCA4pl|4N@A|fJOTwGRGR?*SX?d|PAa_Q2gy1KeRGA1Ub zySp36?(FRB>gobY0jY#`E-D6G(Whh|s@T1pJK$H9u;cY&ffp5e%{>2-COEQ5rc7|$-zg|zZYOw#f7e~9?5~>YO;1xf zz8!0N7%1d;vphTCx;KN=2~m%xcH8||zC?)m7R%>1YrS@i`g9cNOa@O^KbLh*2~7Zn C^PY_W literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/switch_thumb_pressed_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/switch_thumb_pressed_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..4d30b4b2586cfaa7550995718d226e3ec4055b43 GIT binary patch literal 421 zcmV;W0b2fvP)zg3|8*0023+<|vP~GO^%h$m|nDR{#J10001e&g?WIJf3BwdF9Y*eH&(CWovrtJyQO6RS_xX|-z_@;005myL_t(|UhURL z4#F@Hg<&Uw5U`!z3n}!H`(F|GW}G)sDjfY#3XGfB?BgQt%~SVRCsagO<4ur@$t#Wd5j= P00000NkvXXu0mjfV*swT literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/switch_thumb_pressed_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/switch_thumb_pressed_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..4d30b4b2586cfaa7550995718d226e3ec4055b43 GIT binary patch literal 421 zcmV;W0b2fvP)zg3|8*0023+<|vP~GO^%h$m|nDR{#J10001e&g?WIJf3BwdF9Y*eH&(CWovrtJyQO6RS_xX|-z_@;005myL_t(|UhURL z4#F@Hg<&Uw5U`!z3n}!H`(F|GW}G)sDjfY#3XGfB?BgQt%~SVRCsagO<4ur@$t#Wd5j= P00000NkvXXu0mjfV*swT literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/textfield_activated_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/textfield_activated_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..e20ec979a66bbe74a75ba1c76dfdb4b2c8ce2297 GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^nm}yC#0(_&$V=G*Db4_&5LX}#0yEESGz#MYG8jvO z{DK)Ap4~_TaAfoZyG69Fn aLJT|C30WS!X1E%tjlt8^&t;ucLK6T9W+6!c literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/textfield_activated_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/textfield_activated_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..e20ec979a66bbe74a75ba1c76dfdb4b2c8ce2297 GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^nm}yC#0(_&$V=G*Db4_&5LX}#0yEESGz#MYG8jvO z{DK)Ap4~_TaAfoZyG69Fn aLJT|C30WS!X1E%tjlt8^&t;ucLK6T9W+6!c literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/textfield_bg_activated_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/textfield_bg_activated_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..40aa0d8e8ee26769129e96b0b8508c811a08c407 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^IzTMO!3HFEr`DYUQlXwMjv*Dd-d;E4V^H8=c8EW0 zUDNRYzu(s8#k1MGy@F)+8aOf+*sebC-Sr!LtRkCq4C9%k_euu~4>2eePD(6bn-SK` qyN*Y0=0xV|=>|6*_#Y^8f5EbaK|f{nKN%OG1q`09elF{r5}E*=11}K( literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/textfield_bg_default_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/textfield_bg_default_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..4ff75e4e80a65db93ea848f8f7b171c0df89c488 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^IzTMO!3HFEr`DYUQX!r$jv*Dd-d^9x%b>vF61Y5( zkGvF63AY_ zxIOXzQa??d+@3ZEyOW78xp^0QR?Q3j^xgd%`!vM{#&Cw}%Izu_3lB}IdZ1$cfMY{6 qBl9{QxrvFU%xpYA_~yLhm^*9cvCOL{Tl|6MGkCiCxvXvBE2 w*`R!28xvcN@sD1f<&p*o2htyu%)h`mv0|R+7bWBCKuZ`rUHx3vIVCg!0M#}&Z~y=R literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/textfield_default_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/textfield_default_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..ecde1b1c39ce7d2ae2d3dba5733716562e8ec131 GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^nm}yC#0(_&$V=G*Db4_&5LY1m|Nnm=S$wRy5J)kV z1o;Is_}2aVAPVGZdAc};XiQ8_U|?Ft%G1nZ(!){4ESR(COiIfJ76+D-ZvqTB5*Fw+ bEK_9&tP#pQ&*UKl)WzWG>gTe~DWM4f*194- literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/textfield_default_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/textfield_default_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..0f630dabb6068cdecee11c51ce3e82b858dc747f GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^nm}yC!3HD`7Jga>qq`Ev^978H@y}fG4)nFjt5-9G} z_vml_jxN`(2A*9fr5@JLa58uz+I0KDp5Bg*4z(u=j!i6_LMk2;K#ZRZFBOC*Ok>$- zem})B{Pw!%0TZiZWacnm{hpDs_wIx*wp^KaPgj4>NsRgqFVdQ&MBb@042{bp#T5? literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/textfield_focused_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/textfield_focused_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..ac1ab97f505f2894b9cf12e8f77199bff64f890e GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^nm}yC!VDyh@TS<^#FoQ@Mr=L){@TS<^#FoQ@Mr=L){AfoZyG69Fn aLJT|C30WS!X1E%tjlt8^&t;ucLK6T9W+6!c literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/textfield_multiline_default_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/textfield_multiline_default_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..ecde1b1c39ce7d2ae2d3dba5733716562e8ec131 GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^nm}yC#0(_&$V=G*Db4_&5LY1m|Nnm=S$wRy5J)kV z1o;Is_}2aVAPVGZdAc};XiQ8_U|?Ft%G1nZ(!){4ESR(COiIfJ76+D-ZvqTB5*Fw+ bEK_9&tP#pQ&*UKl)WzWG>gTe~DWM4f*194- literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/textfield_multiline_disabled_focused_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/textfield_multiline_disabled_focused_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..e6b8e5180264711b24f9429000cda2cbe1c86d01 GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^nm}yC!3HD`7Jga>q-J=!IEGZ*dVAB6t3g4eC6V=` z#@+vIYAk~J4;y~@Jd~fI;PEVahqjMjr8kFSi$J@`1O>+?7EU1*4j3 z+!HQ}E-ar_ZglmT|73o@_g6Za{Q~wbp1AWOr^VjI6E4=&%=~_XUF!Br3!6CcCGL)S zoiV|^Th2pF literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/textfield_multiline_disabled_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/textfield_multiline_disabled_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..022a81672f944482b3596fbc112297a184295620 GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^nm}yC#0(_&$V=G*Db4_&5LY1m|Nnm=S$wRy5J)kV z1o;Iss4bc2aTLhY@^oEaktaqI0hN3H_~94>*q&;Et43rJiri=(kD@K5(7 zgZ$~fnx3I6f0y3clzMvUmFp_SR>?)?N2DYVFR44NsW$x)Yx~P-Im<2I9%f9cigDiQ u^V?&c^(2+jijGB&3s_zDbn~tL&!We$oVEStCjU;5TRdI;T-G@yGywp8iA!4m literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/toast_frame.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-hdpi/toast_frame.9.png new file mode 100644 index 0000000000000000000000000000000000000000..ad2cb5a965b730037606cfe0e89bb0c5d64cb754 GIT binary patch literal 1319 zcmV+?1=#wDP)(RCt{2olS1zMi53nQlgTD7hYzO zEbLhfJU5sFr<>s%(zUb>_$paf@S`0;M z@Z5(Dp8HPAQ}#a>7%{ZjiL#Yw6{xLbj7s?ti$GFVIF<;ittA==6^lroM6qIpVnoUh z9g$j78oWwW^lgnqBRS6iPb52m))K7&tnTjaKHuKn{<+y~K7H56GUzY=>=%J^Y#*PNQB~E?05NT*;ME+tT4PHpCpo9q4s1V%O)m~E0Yz;yY#n90IT!7 zcajlyeNejqI5MS%Hhc9(kv;|zkwz~vheQJW=p@SkWZA@qHJ4aK(rvq@M3znHdsARS zL<)UztA!%VCN;rMPPR3ve_$iaWoqAdW1|a2`dCcv?^A{;inM$t_c7-?WEQ*yNvS<6 z8I3*;-sC#?pRZ#g66GODIJA*jph#pEC=!_kibQ6CB9U33NMshqh{Q~jB;`P1Me>pi zOgSN04x#>clSpuABeQUdNQ_F$XL28p6)AbkE?E?l`#UDmm<(QInN03`Pb8b_%}a$s zmW}lD=oEmVh-444xpc^~vHhLQBROSglan%!&GI=Q9hC;?yC*fF%wCe!i!2-IXB(A* zGIbiaeuILs+NH2{|h370@KlJ6tzLwWyA4$e#Z}%nd zkDjJ9cojs1`42$d*Z=mlyr!kHkt&*K%g&GF;5~+S+sc0O#%wwi-V2upcDf?{sb#8F z5pnEXX;co$P~u5RnR~!+*wb%nk8n;MexH{IHm|lPlP=zn7F?k8B9fOc&|daiv%Q?# zj7E78ib{I4u|nx(fM`^TrKr&|$t8bbwrP>{lK^xiqDXlloo}zi?VQO*B0IFX#3GWk z?Mk+_`T%DBzZ6pIgQ1dKn2b%frH+ZDAB4hZk>rh?1AEURX##a}LDGuUVK{v0a0u0I zF??DMpN@1HSQ+eMqZKD6QE(l}z9u!F*R~vNRMKrL&7|kGg*w`b5KFvdqYov@8!JNS zvfi5$xe@{C#G*Eod69<#T_!Q1;IyNpI^Av$r8-INL-HUv$AK?RXrCi;?darRzy~L* de(Smp{{tYnj7r@g(8vG)002ovPDHLkV1ja;ZoU8j literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/activity_picker_bg_activated.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/activity_picker_bg_activated.9.png new file mode 100644 index 0000000000000000000000000000000000000000..7dfea4c00546a18eeb6eeccd12d751247caa65c5 GIT binary patch literal 284 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ zaCd?*qxs3xYk`9MJY5_^EPA(2J}cN{Akezs;NI6Kt=zT~^j;j`+Q4;8YYUV00`3=$ z+~R&w2R|nmHA%44-}6b^bo0B}>`G}BL&lw7tuzyBCQN%Pb%R;VgJ~AqiiYI5N5db) zDd^tjEnwRg{PxQQ#@$xk`V*~Bh<6m;kvSl~f%}M@Si;k$Cz_QU9bNbA7)4k+HVYai zUcSQ=U!HJp)4!XI4nJ zaCd?*qxs3xYk`7OJY5_^EPD4&I>>uiL4f7?nv#e8)+Y|XJY@RQ)%TrJ-415Eb;+L< zg?2I&iX7EeJb3rr#w14}UX8Uyo7dWMPLn^Dx}V9|AmoQ2$LlNk=bfH&=o+pxf8Ofd zc);rG_DNMS-*)eIxOedSi;N>BB?r#)y-|KWpRa~XP~uYdb%D)$E7=bUdOa#Qb34+& kbH-lQz~9pPE}k|Fdqk9v&oxZF0(2jPr>mdKI;Vst01kFqRR910 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_label_background.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_label_background.9.png new file mode 100644 index 0000000000000000000000000000000000000000..c375556e663b826517c33addce611d1b65d4e76e GIT binary patch literal 109 zcmeAS@N?(olHy`uVBq!ia0vp^8X(Nb3?#Q1Xz2kdwg8_HS0D`pOVf9r2U3hBL4Lsu z4$p3+0Xd?cE{-7_vdIMr42^6GX)K0qmM2*l4sBz2`SHto3y>~PS3j3^P6wE~K=l?3?( zGl;UVGAiU&MTY@JbUa-gLo|Yu6C?}{BrRcKJH;2k_{_o4K)|$t%Yf4%!>x6qLc_z_ d9tJ6(V)lvblh>VzdkbVTc)I$ztaD0e0s!lWE*Jm+ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_off_disable_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_off_disable_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..a26977bf4c462f443962ed9bc49d583882500136 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvp#Yx{S0IfB9%xH00t&H}1o;Is z7;^D2c^TBZt_F(ec)B=-XapxGNEjSQTEfD1iZ6iinS-N&fN2Al0jEQTTkAxHhKIF1 b3{pVF>=W51uR9a>7G$`mtDnm{r-UW|XnY^h literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_off_disabled_focused_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_off_disabled_focused_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..d4bdf3345c4e4358dae275fc82569fce63d9e978 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvtpJ}8S0HV?^(h)M-TKsh$0N@j z56^%BME1*cp`$?6d?i7C!3-?i%+^uSmg*YHGFFkhUEJe5!34LJOfCw^U-JxZTxAnIafjjJY1>>Cj)V$%+lCqE4>f)0 kV{ln7s54=zWCjbv6*jwxpUR7RfyOd;y85}Sb4q9e08eyEga7~l literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_off_disabled_focused_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_off_disabled_focused_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..7759e9e667cb0ccba5cff96455f1f227b0643ea8 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvtpJ}8S0K$W^9&kdoPLtCZ39=! zT4OMP$o{z1unMS{uO!GXn1O|x**YrPN=w^B+bVKy#fpDG8E;P)#}JL+LnsR|^znD+%%o zW{_cHWmFE%S|A1#(eZR~4ABTqPLMD-khFw_?G#@C<1+_G0|C?k$kX;OXk;vd$@?2>=$qEBpWe literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_off_disabled_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_off_disabled_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..5644fbd30db97084b75ef5b8217bf7fa1e321c50 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvp#Yx{S0HVS3i4&Lo&rVLN`m}? z8MHY$7)>TKA94bU=yEakt zaqI0ROR)nA9Ik<`f}-i)_g|mFrKkRyv!w$*<)_~6gG&j}3Kk9}8jT+aAiy(RYa<2U&q Y87}4V$p)0X+7I%Rr>mdKI;Vst01bg;L;wH) literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_off_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_off_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..baca81be9bf735b66bbaadb5e8686d3aea780d44 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvp#Yx{S0H@`6>LnsR|^znD+%%o zX0YVuVsvF+6a5}2qT}h}7@`rJoFHLvAZZB;+bO;P#%B(W1_GuHTn3yD8E&l;6&fDa d_Ap2R6|+xdpS3Z(xdf#1J>19`7szkc@Y z*@q7we*E}x`}XZGU%p(tc=7Y+&qt0NIdkUB!-o&AUAuPt`0-n}Zb7vE`SSU<{Q2_>7cKw=A3uH!)C;s4Xc~}l_Uu`p zW8(B)S_7SES`y?J%%H}iWEdW92m$6`%3NPKoS7j!T!S$BilWMeqB} z9^JX?_^?Cc8v7#;iyJCRslqEg6fPQx6(l#X>s&UtD9OK+HRZ%iJ1?G_wT|k&nMtAQi!{0f)3_O|0%a<}q-_cLCZZlJ_zv@-Vkd#k1oA{^R=;yAu5mI!!S$d|3dccH} zuestvlCHT2%yzl7ul~VZKVi9VYA+IbR(Y;$Upa64FO}ji>@PcH9WSH_#RHws;OXk; Jvd$@?2>?Q20pI`t literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_off_normal_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_off_normal_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..003cbe670f77f848cbb22a87e8e8afde0d1da0da GIT binary patch literal 357 zcmeAS@N?(olHy`uVBq!ia0vp^N+8U^3=*07`vZ{54DbnY1=9aX2j9MZ18TZ(;llaz z=f8aUa`EEDzkmO}d-v}0<;$Nwefs+K>-X>9fB*jd`Sa(0|Ni~>@#D{*KcBDgCIc-K zDhcunW{`O-&TxuL;t}_c2MtZ<&o$Q9_J+{D&%DQdiTaJHC9VZu4g$v&kT5>wtBL|TvI9O%VB>OX7Q>VZLKb1 zeDyQNVUgFei(DI&3s)L=-njXYjqSC?O|?g151y2t>^UjpKTlzvfSQQ6&DVxM(@z$$ zpNgTe~ HDWM4f(}BiF literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_off_pressed_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_off_pressed_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..ee2c9a649868945786a8296ec724fe313b4b2d5b GIT binary patch literal 1398 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0U~CBR331ih@DPZ!A!y@6?Trt0 zpy-j##z(ryXcLGF6oe^&>4KS{3se9@Ky!d*f=qyk=xut04L#P|gazquehf!I1qPcR zJM4VwwDXzME;xGXvmU3pEGOPG1)UA$!JqGc;qF5fnB^_tbI)~;W-VbjLVTXrqjGGqGoDLvU~8D4CDe}#c= z;VkfoEC$jZVC;4>+m3;OsngTNF+@T#^q^zkl`sLe2ftRYy8CvcFF(`Kj-zWP-q^s{ zcX*a?!IYe0Za&7%3GGMtcs=Iwti6zT+qSOm>v7w_37=~9e#i?t8th>E@LA}`<>)`G zCN_>+nV$4iC2$o*_mw@}c>J5i7Ek$t*4BU%ZEqHJ#9F7_Pp;Nk{#P}86@yF561KM! z7TwyqnE80ornReACMiz&plS4K@tjq$uQS?CN|_snvbwbJXuta;Rj9zme*5pWyFR{* z93JbIziIH9=4Ivg^3qwokNS+6A9xFtgUW9=GkcjjH&-)d^*sxb>kYfI{ow_6ZDUrw z0yU+GD;e|Rfx3ixMu9-;PJY+@Xy87uU73V4bhHem@(VHVMS)~qsf0?Ka3K6 zWf45b)v=vHF|@q7Uy|#k)|y()#hX-gj%xf-yy{^siTS|j(2{Vp?IUixq@XU z40!DhPv<|M-nioqv%>d;GfI=5+Uq$joFF3Ppr)+8@%-Jx)0@@1oLiiN99@N;D9mI( zwf+5LpObPb&0Bc9H+rhgG!_?hH2UhNYI}|2i}cJDlTK8s^a{pU@b~(eRW{eGQfu*e zw&I>TTeBB`s>?+4<+~EvXWeAGwEoM{-yJh{eJEA>Ja_Stk0*JLrGJ{4vOfHTC6l9j zNgI#MZ24-PC6hONVLCB!x!#KenOCNHZ!-V?QvTp7SI7OS_FUz@?wB4vv6mczajz$Q zeAT??k6gD*@dEA(^?AxFYKE^&ODgmZpGa`ocldsPS?%lTPuE$=uF)$IoS*h_W>1Ia zF8AHt?|PGS%0+|2Uwbu1suUV7JiT%Ei+cx8XXcb^Y~LQmtlbzOw6$B~LizhI{QrO5 zzJ338V|zu->J>gNMgDA-n`)VB{<2@%v_|0h{g+a})TvtH8c~vxSdwa$T$Bo=7>o=I z4Rs9-bd4-R42`W!jI0dIbq&m|3=Fp3Jn{xbLvDUbW?Cg~4M$pP0)QGMK{f>ErbP0l+XkKXL+OB literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_off_pressed_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_off_pressed_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..aadbdfb6c7f64e8fed5da5ac77e12dc8c51fd49d GIT binary patch literal 1385 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0V5|!8331ih@DPZ!A!y@6?Trt0 zpy-j##z(ryXcLGF6oe^&>4KS{3se9@Ky!d*f=qyk=xut04L#P|gazquehfz-1sfjd zFFdV3|D^tclllu!p(CImP-@|6pfbal9K+07!>l?msyEE4H_V2h2DpI`h5?clP^kqc zfp!7K!RQG{!Gco;n}G}{0-6R?3F2-6BRB)XMIsHe8-R{9-0}pd9^{^w9Q}o7fX;)4 zGdQ%_k35(SjEuUHAirQikCe=uy!^uA(z5c3%Brf8qJq4vR8Oz;>e{-RT<@~_hQ_Am zme#iRj?S*`o{ql$36myInL4p+>de`5=Py{eXx^Mz)4IoKFVa%%CG8Ar}e@5xTf@M1Q|0j38A&H|6f zVj%4S#%?FG?HCxCT0C7GLnI_a4?6Z;ju2tJP<_9CqxRDl7pAH12F!-+%igpUu5UQ{ zWy|#gLJ~|`DrrYK6kT?C2MQlAO!~e5HlNmnUo!0f*%_P{PI}UB`g8mBKkYHEJT`Y7 znVGX(amm#^-u*V)V&3w9P55r|n5AjUlvx@{!R0r%$Gm<1w`}c9Nl%7JI#bG=LuT(P zF0y}r`IPR=LMFvM{b!EK9nT83p5AV!Yr8ZhO@%=-sPL3(vbx-yRok_{PtlR|3<$cJ zu6}WOqTchuh-$CwdyFD+6aR4O%({BcbMn$7s_#7(da5icZNaQFIumu=<0eeFq$sXqH|u6j;p;VNW{Q@2hdfXG`n05de*Bi}X(rESe$?@@ zbUaqE^Zzva6e-W=`Qqyiaqx-%?KHX6wD}b0zh~1pk_1-E)!eI-nkb{dG2y{XL*vLJ z$@liuTQwE@ak-Ni#5Un$H*=E$gV0GGSGfs!^BzRLZhpYR;;ZqP;n@U}va0eQ_j;Ya zO%MrU36>XkcDlA=Gl!@1Yon8kOFjnl?d54Ukr7?U;TyAi>DQI(kJRk4F>DBQ|Ln)r z>La(TLn&BiOS-6K=_LC{w`Y9ut+4d?`Q*wp{{0*4d!#k3K0Tc+b8v$3tRp_hLO)tc zcc{M?sro(1vgm%xoUXfzo?H*9uld-xhmlY5=nC}Q!>*kacelzQWF5wAPKS|I6tkVJh3R1!7(L2 gDOJHUH!(dmC^a#qvhZZ84Nwt-r>mdKI;Vst03GO*Pyhe` literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_on_disable_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_on_disable_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..3ed345f6417a7ece9994df741e377097e5cfad6f GIT binary patch literal 531 zcmV+u0_^>XP)%1y(F{ftoZt7MKXp&s0DZ#2?TfP@{+f;sep>Qg?vC_(-HglP*Z~I>%0$ z*aZvQgphQSleTl`bk3c*_qLK_jyX0Gwtc%O?c60?40#|p4jfzT>$|_8^?SB6G zqpoy%<#1a)jI_G@(dPSZ48T2n7()zV!2#Fu%<&?ck%tf<1PL<)_~uLq@mP>!JzD<_ zzW)nADZARkJil<7pb+AOBw^WvB#$W^8&Gww%aVYX&xXRYQc@+qNFVz|`eaIE7`TTo zRq~0|BfnTF1_X-;zJhC2K&Mv;b7|w5@}yX+5UO60J@x3Idpu(dVju*u;5_xJVXFe< zwpxsEe-lWyUYigbXM}UNfpvN&F(l6WTNT8D^Qd!WO9EQzL6okuge4@(U5tzT<(SCV z4Zx=hsp%pR3r-tcs{*jic$F_B5fT;}F0pkDNTNX3%_~{tE=dGe097M;qXSI8*>FFfT&ewjmPm zIzUo}ksLb&Thg=*Z9IrDJ1jI7!f+eC&+>U-K8S{X6c77jG_s##>pvupIp)|%*bkS@ Vnq{ntk0t;B002ovPDHLkV1m?<=A!@r literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_on_disable_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_on_disable_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..720adf3157518a9caea6c2a445eb3faced8858b9 GIT binary patch literal 497 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyTLOGST!HlR^9IBqCT2!fc18|v zCN5rPZhmGSer8@lW=2MaRp;H-Ty$T1$z$DRkM&o8$aDQw&kaCy&2!^*AoALD!)r4T z-SpaW(|gM;@2x;|+k4v`pY3;jcH9FZ-<|h;cRldk_0VrO5IyqS^B9Qy_X5!q|9wF8 z)PMi8fCE7EJmBDqz(X$sn?HZ-0=nC#B*-tAfti(qlZ%^&mrqDURLsWK&fdYnA$c=V zK;AZi8)(i3PZ!4!i_=dp8}>073bK~NU7W|(iGOc8vufwFZMjN-<*?per z@Ote5F@vUtf0IKaZlC_kCls~q-iK{0Pu8qhbB$Ygo~WwyDvnc`**+T{e>4%?yeOwV zMMZAMM^T&e>P3|L*SE%py0F!&X4IGkCiC KxvXjHd2T!A#h%rig$B!Ng^(G}?x zH-SiYe=`$U>LH5qre@1=Xef`akWmen*iUYZN z8}38caQ#58&Q#GPpo6VSg8YJkG$RwIu&59#r+sv6h=53pi?NZR7AKQ1o2I-dvy`DK zld+MciV7Q}DklqvoFktEudXPwGAoOSp4PlYK;73oT^vIyZk@e!U8u=Gp!MOA1sWZ^ zIUQKm0pvXfg9aO`z9@=igNWAIxevlDzbi$hZ3pEN}KRa@^2m zIKon9t#Dm>V^jKn#vgZAICdP6<#W@|F@4W7e@@`l?-F)Vi-RsMoVMA0`uuLW6{-rd TKs_&jK4kE8^>bP0l+XkKsJQRX literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_on_disabled_focused_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_on_disabled_focused_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..015556aaa5210d915408ceb7df1ad1a489f8f5fa GIT binary patch literal 467 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dylLLH0T!FN$tu4dMGe87qK)8(4 zPjPo_;%Q&c)wLBUMGSx#f~*qLWVkHrq=RraGUHXb+B%@K3`>Iif*F{(xEU=XqXVt9 zv{hJG^#x3{WgV+y8tR-F9qOa`?U`BZ#BDfgZ243wlh)I$~pC5?knBf6C;yU z4RWVf2(7k_-R$^ag2I#=7dnpT2vjIe`cb*jSL{~9vY3?0g?k;mKRiBQ5cU50gX4_8 z*|&Zl{>WpEX3RS0&lb=ypJxHXdTxQ! z@oTTMzxeC;i{XcU!~1ER94xOAsyeb~?>fo2E%c=ucfyCy54ijNMP`4x>cs=}34^Dr KpUXO@geCyvS*pxgbYZvlysfq$J2M zn1M~km`TNuRZ@ykRoO_Gg+YRod6V>d8K8WVr;B4q#jU584hkJs;BXBTV9GMdoc#a) z^|Bdy1s8m`SKh9^()(desOxs&9|r_8yz|(_Z@M>f-q|;|s#2FRUGdf--i7V~tKSP2 zoP1No5aVL>`S!1)f_Hj7PQ9<0W!q>S`2O1S11(=I4H9d48O&d2GgKWC+VPip%hE*O g$L*5KMCG>fFXUm)eYx~xCeSqup00i_>zopr0FYaN3jhEB literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_on_disabled_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_on_disabled_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..3a967f41ba8cb9ba4051a74704e5b95a033889cf GIT binary patch literal 364 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyX#qYVu0YzB_FyN|y?UTcN+m&l z!3^4*^$pehtQ-Q-j4UxxCU%a@_71g9b^0~3d=YH6kv!bL++S}4s-EoW;uum9_w>?E zp~DJ1u7QmQh1ibo-kksc|76Z(je%E|e9eA8Gf?@)b(@ztjMMKLL#-&9!|MdW^LP8%}%+xYPD?-UuA}1 z0*b9EDgr7{QmLUk0lrW%HB;EF-EAG)a@y6=_9`>ZPBZ5}_x|U8=ey^A=UitpqU~)q z+CU%>`- zyu|RusR;u-l&!HS*IHNf+VlER!f~S1xPtsYn+b1LrZ!`1K#Dm>>+(QP5Km$5wh@Fc z0n!A3vem9!wL4Gk&R2WzHJ+7PL{$$`(Cb+};8Q;ykXK1B{5d$Ag|8hpk&9JoMYmeM zY_e{3Yqv(yrKwl-2%h(rb@Ugt>%LR!18xYTISTqC1HD#5%)E!M(|=JRNovFvh-n-J zMP>+*PGN7>qjReO2Gr2ftyuwMi=;HRoG6~el(r$y-zL;AkD&E1j%H1zu5nokLgTnsW;wXXD~k(A>Qp_Z*#L1M8m8pYraKDM zB@U^kqi(gdOC##i1}#UtN&n7(nVvo$$A|~385Cv) zg~BW>t*osqU=HpGBns_=Uhn9*#@@y}`TEUU`Gv*TaPCO>dXF2&8I0Y`_{8KSLgc-D zp3V-jVPWCn5s{P_X40M*>D0{1`% zY~3@Q;?LZ^4o=wYkKYo$w`E?R9_-_6w}%Q36^R(zcOGgzbtp5?krvc6KQBu;CZAhO zrypbC>}VUd4=g@W>Q9CoPPwzmiiS?sFPsd)#2+Z~Hm6{Zjim3|TY!Q_d2db|P79_Y zp`_H|!IU7sa1J}DBZZI~m!Gm=%6mmjve*K+YepIqc*PGCbf)^LjR|R@K z!ic$A!t{U(QvW*h_P3^@{NaMX{Z6OyOHkAd=hVyjSbm~t%}q{cds)Z(KVFfvolUeo7|9SoWrlZwsSgZJ7RjP{g`p<(MY6g`^=%y3o+&pDW&fTW? z1iue4TbO(&BV>1 zy3%HAn_Xh{H76rYoX?Folp`v}=^_|$AvzAq@M4>g2Aj%_wx)lApyJ296aDuqVWAIS z_jzYrdCbe9O`ocSY@2T0hy6MwZJm9=M~m4(XW`TaOMHj%u*<>ekXec2ey-iwq=Jx& yBl%{151KDTCEQ;q_8T2FxB1Aw4o{0Ead;VK6(U2G_gVGRnB=0{}QPk1^ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_on_focused_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_on_focused_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..8729815cf3737c4656ead51391beeb443cd8e559 GIT binary patch literal 1503 zcmZ9K2~ZPf6vsEqDMuj?!hM9BB`rw+g%uGtZD;3ux%}qR_!y6k~#P8 z1(Iy(gIhHNR=7#7b$&v(7K#EtEE0{}gT^GF@hN^8d2Z!mgexIjnsBeX?({XE)G_@*Zr**%9z3ZBSArLg z>o$!U6kZ@OTLFWHgl&G5_6#( zW{OOY3dmjan`CGN04TDj?#vdXTm-(m#d`|+5l#nOCc@=65Ig6*WJ{EP8-a#JQDjRl z#SK1H9o{^#M^%qHgjjbI@aDpCpl?>tXxa8aPdI7Q{)i-7#-8dx!=vqrnh510^NVr| zp&Vomcw*xa!rctP=QsG2oyRqgg8E}y?-P3#QF=6xHT#OIT_(cRj}o~ZM2;9=&`6O! zK@%8wu1upzt}mQ)>wW^1Ns<|CP8Ft14AqUAw8$wv3m_KVlZdO3f}Uz$xN9$-1uYmj5*OYtN60FVaIENAwlaf=@4>8C=^`F|~ zKdL!?Jinl*gk5U5T$E8d{kdZ$zxLyb(irkKu7Iq@+z<%Ca+;qw$dWdUXQENyF5MzP{U7 zsW6Hg8fLW#um(Y^*HkLi$&to2hmbpZK@02!(+YTdZfSpjQ^+ly%he232(H~JI*q1n zKA^(r%ijF;=CwELbDkq}D#LnMFF!S~RO!Tvx3{o)>o26}M8(K4CgqmGA)Ibzj?ydb zo3Phi7YT_29X7OqvgV;zV{0$xb_eflSWH-fgBZE%YfDDa!K9_$%>H@%j2K)fznG*;@=Mna@tPLKgGa zmF3=%yBV0}PVAm=db= z-5TAZ4=lN?HJU4;HjNXnNpX4Ql!rqg*`n-yqVA#a7I?mBCzlI>BK)Z;&{N;tCsp@Q zTPFO@-y)Sf0N+|9l&gFEE5xiSm^1imw)u zFSjhB{3~Su;#F{y+V}!wZgv^kRJ|JtY9lIPrpU~K%`C3Szf$hcZD%ep(_1G%^FHAq zLujt;G6+=xv2TsOk;i4d9Mf5U

wa4F#Kc!Vl`ZUx!XNRP~@yso=4VFI&Hh5prXOrAw z20dWEHeWCW)&YhoQtJa3!gdYA8=SeGyu^fE5VXW@=`wpqhi{zGF3VAfRjyc^$Lb{r zXJ;e|v(g>s?Hzu7@A@??Iz1#LbPIzOzb7HK^;3Tm)(PqEO-m41tgXbAsL*vjf$TPG z{}1a|ptpK_OYqyg)0jrYgnLkeHU)eawx`WvI!yCIVj?_38ygd%wsVA;!M-k$flU?* zoOV$3$(j{Qa*0|SWw6R+rcC-iAD2i%ifKNRPGqmcFvtf7vSL=F!!`tE7&C$+Tu@tR z>Bi@2fyhuiF_BF~V%)IwkT4_?g&O+tT?|k(xs4gIJ6JPPPRUrg6RY_ALZbP%T=IeJ zv;DU|1U{(<-Iw5AyzAbDkdlz%!p`EtsO-P-ZqCOY8@6}DPHTLcCgR<)SRCT2I(t?f z;Ta)*cG`+Q@z$Qs8U9Z(XZbifXMMY4mfwB=LpMNnj?B0?ZI=C7i1BM#Rjg`^8@$4| zo*lF|YK7aDM6|#-SX7dOXAF+JGMIVqa?=mooG(m1(BWC()M)%CzMF1!oU1v1CAJ1f za5{P77)Er?vvhvK4+>0?iryc2`7&8%7wOC0>d4Aj1KFeWftz)P(B=#9#cT=BL46AP zNXa;9_%p?A9uZZQnwrG1gN6sr?U~_>i41;6%c0?zeDbSHDY|1njlIekHwWLCT(!@+ zFGn!lvn2a_tED*B-H&JI8%{5>=1L3iW0aPT;;JdEw~sO2Fq`#96Nm45GQ*X!BU+d4 z`mzmCR4;^+`Pi*zZofXQHEhZ|l4(5my7Z`ri9NHdljHuelN1C?WM6=AR9_ZzPs8eRV(DXq3XfIrD|lS~DZ@)hchGezP3*<#oMmsfjd>BWxXk?A>C zWjR*FgM8M#K641YT;-hZFnxSzZ`~uQT)uxg`OVLlX~u7J2R?6}w|^`C%WNI-c>_)| Nw2hU(Y=}%P{2zh=yM6!w literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_on_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_on_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..9317ef29d698af33bb31ec0b171d122d0d762903 GIT binary patch literal 1370 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0V2Td#32_B-jki7}9@*O3LKJIF z-3wtrM1Z8NgQJa$2Sm^^tHz?N*Su#9kgHxl-@JLQR@p>@Ro8)BkV-o{Ahxx$x3zb) zb#}FJ^Rn>{un7paN-ET7U#Zo-Mse{ujcL1;izgVYz5&u=XK&*hV!Y*v(T01PJsUK; z*ND$Q%P{Q(PsLn_b+(Q!w)PGXHjvcn+XOU345a2HWBp3O>~6!gw}Ij|?%uWzPDYy_ zSx2WM6i?Wy)df_1hN*s~NZ};Ib$4yN0&E?ftpg)8>gQ>-uLRl)SFAm0hgR2Wpi0rw z>2PryzffBzSHm^8RI6r~^sYAUS*6*#5u!zB+Fqb~@%d-O%4QgCxDOOG+WgqY#Z9hq zmSX!#@dalk=AQ*R6{t*S<^ip4s7mv?nWl?Q+qk&f+S`lfbh9`*SfWldwBDp<=>+b=T0kzwB_!@714315ETL)*5h_kzmt0&MXrdekgW}Z3YSF;wF zypERy`2{mDFfuW-vT?ApaPtWW@^Xnt$S6vSGK+|dOGwG7XzQriPY;t9>n_WHQNH{h^G?%*x6hf9yH_r5{u}e}sd@;n@BE4#E)| zPHg_muE{85FIjJ7kT~)G@iV8l&D8DutN&ZxZHM%cy26H+m6}CC%Oxe3#x<;|{Pz8P z{0t^WL$wLBC1>3F_BOqxQF_+%e}>M!c~n3GTEFHu>$4pVMZS)1$0F^w=>7k5 zo+orc-o}Gdn7M3Dn?AL);M2CP`qR!R7_jH{j~_qoeE;ylz-nrCR##DRvFx93@Bjb* zZ@`*n<9O%JowKnvcN8j*ExmI`pmGK0f5{!oBexY6xtY9vIW_y1!MgOs^!5{nmA&s} z$V#&-C%ar0&lF!^Bd)IOA}1!^Gl|Ln|3>MwX4}FqBG(;{|DS#EQ-S-x|NnbWzLK)$ zFwkY$^*&9{MUGG9%FM{0-@EjMg`(8^LtcUhnMgbQe`MU7p_2E@PFdr`y}Ve^pmc&%lXqZtqT#DH5#~nS!E1w3?M@+yK-Bh>zj4 zm5ACPBaa5qlYpYPFX*pPaNt6d{!_`CDX#V37VFc`(8z5ycv9J!>- z05nMLHbqzCj=mZMQ>%v* zs4YGS!II5`P{JXd$xM2j(*E&c`xL?VGrYjWU4GEJ`ul_428XP0W^xv6ZA+Qhw2vZ8 zNkK;GvH-wv6DH&0fnBLF(-|oIq&lL)6ak3C46COaj1T~96d^&+*$G*5)Fm$k8!;1ji)fFVK_4A>x%s{l{mQ zxBhxM@Hr1oXQuJa+|&_*?+$SP^Zoob{m-p?1b;U01%WB@#B=7yL1F7O;xwFJ@8Xt5W77Ugr@A&x>qqsU;4aq1H#}iU9^?z9JuART# zxuzm`?5A~(yu*=qDe`{TN%V2#ssb4ib8HNPvh6DYz*8VUOnNk_ZrATuyZ1P1u7f`w z_SY!wOAmU!$MBrsG$tpY9Lbg8D6?Y*^sw*%vW9-ZrQmQt&4kzWyOr+Bwavj3PB~>} zkUK1LFYtok9`&tAODPh9%0U$nE0uAmDHjp0;AVNayWBys`Pk=(^3d^|5r^mk+$Ch7 zHH_8V^=w#H3MfZ0O1p#tnIoPD_NDR6SR_(dW`M{5(0-JDf(bwbcnJRgteycQFewM{ zK0!yPTlU_3^AMI}MxSI@e&r+if|&6;A)sb};XFqKccU_(DTmN@SQ3CMkxsF$!U4v=8Aq8!U2}~*%vrD( z+gU190SHkR^eI@BP1H&@h?M{U6;RvfQFKw{h4#g8W=jzUkcvq3fC?f~77@LuKoB$X zt+-b0nsyi91y%w@NV@-n&tGF;H5*i45A^~QQy6&mQL3xR161I8KeR)_*%aQ028=-6 zQ_>Fzn$mLJ)1W;1NX3yEz&I22w2KK``k2iER>=<6L}-Q)w4g!(*0vvvJ3|6kpwXIZ z?Tmu&fb($b^l?Z8J34}BfViFktZ77EIPjrEg`#it+AL5NAatw}Q9RL6T07*qo IM6N<$f-!vLNB{r; literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_on_pressed_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_check_on_pressed_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..7778f044fd55581ee36201a57ad2fe7e318525c8 GIT binary patch literal 1727 zcmZvb2T&7P7=SZ!ND~D`rRWJ#Y(RDcNDN5?q>2I)gJMByK#UL&q>7SIlqO9|AO=DS z(h>{`9(vMaLLCn?sMr9Nq9@8x?kwS6KpgMJop1m5-e2GT^KX)~qphO6x;z4bP_(zR zB7jv>^2$m9X;qfYM<7<P(}AKF79am^T_JQ;M#EQ5X2ji zSZ_)|6$>zjJ#lzEnj8bwJT_u<>~TA7a+xj346Lj!%n>j2nTt@(6BLtgMs&m49WY6{ zE~!}3jdAssR6G+4)jmPdo1xkvaA)JpdaUgMtlh!gu?3i;B%HY=I)Da>ng%C=&VbS; zm&&oW4(LFje7bmKqbYGP=c&YjBhg?ToPoxO(GJ=O5<;wQ(7L5=fDPz5=qHe%|A22p zvN$R@$%A+A%%y{Q`aP83cu3jK$Nx+qB{<|{mbEK$MNw6iYq-s_@I~S_=V*n`N$fSw>FFW2ALxYg4rP-a!tXGx5G^{=BH0 zQ&zRwWokZpO7wY!^uqD|J2drv6?`2~Z_&taJ06>LBsPEkHX(KWI(VbDA7S4X58m~P z%~$qJ9IW#)q#KkQ7d0V{eW($wb5u@00olg5ORF1JtX}2Op*YD@GRW}X;aoqib}Ww> zNqIlCp&@!e{AYwGzYL+}U9N~@)l%uBOq6J&BNrc$Obk+(sY?-8Wi)^lUhyf}H;H4%wwZi=k>;r`gC% z-ZjhrQ}NP*^trq7Eng2$R>CrqwDD~V+pq09=c1O`UZz^mF@D!oV?&&Rc;+OlNW^Jq zSUG0)LN)nyUa7_4)$8*b&x{6Byqtm?uVPUesI~924m+tmb2r%&-llZ>wEbM#o6mK$ z*V*?kD!lv9m8ndH3$|_kuq{Tqlk)aS6MIWf|5n}8yV|IbwO%*@5q^gd7${0{-;6>iEbSsM) z(m6>t=T{qO)HPpv5l!Wml!%L>R^xnPQBM4Iont1aVF7$owZDfa2rt8~Oi$-54X(Qh;kSkqrXWBoz)(d_%)M l&yo-pJ`^vKrhR~?ABjNn^oa}>lCZ!DVQ=kd#j*6D{R{I2JlOyM literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_default_disabled_focused_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_default_disabled_focused_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d90c72eb91468c2d8b11e90420e9f0695b3596d9 GIT binary patch literal 219 zcmV<103`p3P)s#C`3hAW+KS`nJ52$A|kUS z41?7rX4335wwuqkpDQB--ILo0^<`Q6DQP3vz*dOxK+nmSuCK3=fG#$$m7I`Os6rL~ z6>@Z;zM%?LxD=-P<3C0SH-U|C;jOvQ{asQ$R1(m|MyL=uI&w!LB=;Md7>Rz6{s38Q VG4sPvv-AJ}002ovPDHLkV1f`SS||Vj literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_default_disabled_focused_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_default_disabled_focused_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d90c72eb91468c2d8b11e90420e9f0695b3596d9 GIT binary patch literal 219 zcmV<103`p3P)s#C`3hAW+KS`nJ52$A|kUS z41?7rX4335wwuqkpDQB--ILo0^<`Q6DQP3vz*dOxK+nmSuCK3=fG#$$m7I`Os6rL~ z6>@Z;zM%?LxD=-P<3C0SH-U|C;jOvQ{asQ$R1(m|MyL=uI&w!LB=;Md7>Rz6{s38Q VG4sPvv-AJ}002ovPDHLkV1f`SS||Vj literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_default_disabled_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_default_disabled_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..8b0d0a77c3e8ccc121c4cb7b45b9c318f3e82e63 GIT binary patch literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^GC-`v!3HFKYIk}9sY#wLjv*Dd-cH}hc|?K1Rk+VV zY=>mttds_mrapx{g^s05t=3GhkC~{{s&V6q{g0*ZMa3Rn@%Y(0!M>Oy@wDaXDM6PD zzLmTwxXL2_es7myT@@R9OsM1YId6CmeLRtnIKh!Ezd5yHLiq`W=Ialf<7=|lzT!O; zC|$#;$hUT@(XkWL9_q*x_)cB({9bHxb5FvL_AlIjq!T+2?5lkMbRC1ItDnm{r-UW| DKG{=L literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_default_disabled_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_default_disabled_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..8b0d0a77c3e8ccc121c4cb7b45b9c318f3e82e63 GIT binary patch literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^GC-`v!3HFKYIk}9sY#wLjv*Dd-cH}hc|?K1Rk+VV zY=>mttds_mrapx{g^s05t=3GhkC~{{s&V6q{g0*ZMa3Rn@%Y(0!M>Oy@wDaXDM6PD zzLmTwxXL2_es7myT@@R9OsM1YId6CmeLRtnIKh!Ezd5yHLiq`W=Ialf<7=|lzT!O; zC|$#;$hUT@(XkWL9_q*x_)cB({9bHxb5FvL_AlIjq!T+2?5lkMbRC1ItDnm{r-UW| DKG{=L literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_default_focused_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_default_focused_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..6dfcd615da8d645f212746c67c1207dd9df14c49 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^GC-`v!3HFKYIk}9sZE|Pjv*Dd-cC2|j- ztk`nv(qe)240FprFti{ht;KfYfu{Xu4@ASu8N= j;KSHm9NoVa{xZGVd+C2E>!gK1*E4v!`njxgN@xNArLkZ; literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_default_focused_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_default_focused_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..6dfcd615da8d645f212746c67c1207dd9df14c49 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^GC-`v!3HFKYIk}9sZE|Pjv*Dd-cC2|j- ztk`nv(qe)240FprFti{ht;KfYfu{Xu4@ASu8N= j;KSHm9NoVa{xZGVd+C2E>!gK1*E4v!`njxgN@xNArLkZ; literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_default_normal_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_default_normal_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..54c5803e780bf10d58cbd26ae983c154977de57d GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^GC-`v!3HFKYIk}9sac*bjv*Dd-cC2WrH$L{G-kUR5iI-jgnN0axzX8T|F9w_ileR7`Tr%{_gh*xI6 zVHj^Z|8d@RlO8;ob9>MC?9*$uO2?=kyeUzf&wGgR`pc%7j%<>Dq|e-K-s22p@Xq^k z^m>$ibaTNJHhrg#_9>s1PBAh)9BJ`DiYu}&b~YRPOULj0FQtzd9;!)yqHYOvC4;A{ KpUXO@geCyPAyQ%h literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_default_normal_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_default_normal_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..0f630ca5b5e8b4337a643b56a537d2b974fa36d2 GIT binary patch literal 217 zcmeAS@N?(olHy`uVBq!ia0vp^GC-`v!3HFKYIk}9sRf=cjv*Dd-cC2IY_ z@)gVHFVdQ&MBb@0P*`%-T(jq literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_default_pressed_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_default_pressed_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d21bc08ade4e5e227763815d4a08ac8a58a9b9e8 GIT binary patch literal 320 zcmV-G0l)rBLM zfs<~Wfd|4c?;$RnFB5SEFIZP;;R%EaK_!@ssBf3>DV8M|Oc6Q;xG8UjV(~-;98_Q< zW)vLM!wuUttJ}x2?)Yxa@x3U(S#W?01$7(@HwxpURi582A8{X*c-X;+~vW}jRKqn z2e?pB|9BD35BE)}w{A(@RXYlB795m|aPn7u92H|6X2f6Pn)Zi~MjO`>A4s40>fh$y SGO8&60000BLM zfs<~Wfd|4c?;$RnFB5SEFIZP;;R%EaK_!@ssBf3>DV8M|Oc6Q;xG8UjV(~-;98_Q< zW)vLM!wuUttJ}x2?)Yxa@x3U(S#W?01$7(@HwxpURi582A8{X*c-X;+~vW}jRKqn z2e?pB|9BD35BE)}w{A(@RXYlB795m|aPn7u92H|6X2f6Pn)Zi~MjO`>A4s40>fh$y SGO8&60000<#5d;c3sF@y1!Ub#$4pZD&+8*I2aX{-s$`O+Z^1JYD@<);T3K0RR?sGx`7k literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_group_focused_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_group_focused_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..ec41fcb58a4b7185dd2a5b1d6fe27c87b2bcf0ba GIT binary patch literal 219 zcmV<103`p3P)HTQ4eabM!2~pyTH9GPm-=iCJk(X#;i~}+?e11efE6`WNfn2n}$YF;a zcKF+H_$nNB*x`Q*U(goAOAOWU3KJpP!x0TN+{7HaHwtVqc#-fYr0!~b_M)2S<_%-G V=&ogukD~wp002ovPDHLkV1gWESoi<{ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_group_focused_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_group_focused_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..ec41fcb58a4b7185dd2a5b1d6fe27c87b2bcf0ba GIT binary patch literal 219 zcmV<103`p3P)HTQ4eabM!2~pyTH9GPm-=iCJk(X#;i~}+?e11efE6`WNfn2n}$YF;a zcKF+H_$nNB*x`Q*U(goAOAOWU3KJpP!x0TN+{7HaHwtVqc#-fYr0!~b_M)2S<_%-G V=&ogukD~wp002ovPDHLkV1gWESoi<{ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_group_normal_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_group_normal_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..4f7623a18e916975c4274a480d764dfa76252b8d GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRr!3HExu9B$%Qt_THjv*Dd-cH)f+2FwAc0RDA zRVQ&_u2IWs4zZP+T*7+n6=Y(XI+j*`m?g6QhezcBy~*D@POMnv{kHP6TOZTrbhbwg zwR}%HbkEo*J}UEeS^fExA;Se(zNxi8<*!L>V4hvGHY1Mnz!acW44$rjF6*2UngGI4 BID!BG literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_group_normal_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_group_normal_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..edde84b9efedcea5bae6c807c32805a984de95f6 GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRr!3HExu9B$%Qn8*cjv*Dd-cH)c+hD-Ma(PJt zgW5-@5S|CDDXc2>_tDnm{r-UW|99J@= literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_group_pressed_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_group_pressed_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d18fc40dc22ee21dc2ee486a1849707d5cdbfcab GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^VnD3L!3HF^^Q?Xgq-J}%IEGZ*dV75%SF?dgYvStN zvRzv|j`6LuIP&A)c`^Tm$?p`ODTVE5te^P7Gfylx$m?uh=%$%7rbk6{G*O$#;!N&xBqOve{L=x3TI zX`_*#e#rh#=mOzaUi)6jpAbJ&38K19!y#&t+c#+_!$zX#GHn;>PTZO>}8~iJ9 zxC$N=@Fc;V0(LBX;I052QIm43Z;?;f`Gg#UiZ6JehV9;wfA%P^v$+A8BFrB4+A|>l O0000~PS3j3^P6@@`TK6eO$LfDIC^>B(JMfaxks-6xigP|*aiD;gY=v^lf4(J z3!>K)Y$niTAa~iZOAs{+k6nhyqLDyZhzNwS2&}9SZ2OEOSAl|=FvEccE;)7?Xio3U znk1nALrQ}Df`K#(zmx)(rdL$729si-vziF6s8NiQ7(2g&G`oQ=yNH}9H#@r?I}5u5 zJEH)*V*sa?u&{_XJF_gCr+~5wpR};JB#(?dTM)YvI~#{#tSCGC`F*py7#J9BJY5_^ zD&o!tWji++h={f?n9bADsUUn=L%GR7`*hD6*O|5}{{64_tUjS!Rr96J`u0uR@9*Xu z>IxM!@s(7;)+`+Mq&^bQ*}8MhAyp9ABE!PC{xWt~$(695}>Ueo{p literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_off_disabled_focused_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_off_disabled_focused_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..f8f8180585bb014d2651e31395b392239d74d8b1 GIT binary patch literal 755 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0VB`q!32_B-ZEbChw?0KfSOwA4 zpl~-owhl`G>Vj*u4vsP2@))AVqG}RE3Qk(oOan?;N2WkTtfJF_T#L$y5UxcnNEU*C zBF38^fk?1v))7e%HP)f=2n8_3a9uzKNDI)4;ArE`AZJ)qOt7e#3KEG(wu;FBI>4fS zCXfpf35ng}^6nKdEFwyR{DOfr3%`^Cm!?-#v<8!6ptG6?uc%RslNhJCil#EBn1L>b zoUVc(7l$6FJR7G22crasV*sa?u&jtTC#w#pr+~5wpR}+fj~2H)r$`V7hY}|c7{+qm zeJlDH817DpM zfu}crmpz}i^R%V<#>9y%D^1QX4_4T@heun|C#}&qatDi2htS00O4pmGPP#m5t&kPT z*ccLK+QRlK({~wL$6x&mzqZ}n@Fwl@HmPTR-BL~|`#fInK9N~$&v|{@g}CldZ{z}s zzE6DhcX=GU?2o(7%MNnL&+HSot2p$KltiqG|D%_3bk>Dm+S=D{$E*p+du%)9_v7L$j>5w}-AnaDxtV-*uRmGI zD5hgBDI7jOQg8il7opbFWwKxY`9wFKoVrc?=!I|6!uRVwYA7;nS}g&LDF#nhKbLh* G2~7azOE{$f literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_off_disabled_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_off_disabled_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..979af62f87dbd7c422aa0185e48d26f59c743c50 GIT binary patch literal 288 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyHUT~%u0Z+>xgbYZvlysfq$J2M zn1Ml*RhpSmgqxjTf<-`1MpjsyZPm^If1rH5r;B4qMcmUMPcCLd9_jay)3^QqpS>`k z%a`wEWr^^nfTW+h|B@8wG@yQ9ArMs9pJeYG{iitCnl d58h$RpLU!1$l8}LIe|`L@O1TaS?83{1OO5|dyxPD literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_off_disabled_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_off_disabled_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..5fb2d1b0e72562419e6d8ec85222a9bc4526a9ad GIT binary patch literal 299 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy_5nU2u0YzB0#LGkk_ONS(UKs) zUB8YmZ+1MIh%5_Hv+UTVngch1;tP*m28xvLzg2zUX7T>ptB+p<3PPL& zWSBKwQ#atZ%Wv=O$g|~RF{(P}YRmDe}tRqXQc zcHz;m(H7@b=W*rL-{njoI)zD6J0cX&Nr@clQ5F< zF8Y{~(;M?#_?^`a0kiGub=jDu?ju(`p4 zMMt7>(jI*srJol<`|oDYJ7Buj+4O?5=2X5ajq}Ef?e<#vuic(8J)(a_gnodIOWx13 zQ*H~m9-i_$ndj*?rWD`9HGaIozV5AtGq&C_U&&W*p=Wu;v(5jEaqezw(_90YAIGmJ hJa}B0@msYk{^S%Rz1S$V`@o1~@O1TaS?83{1ORjOjT-;} literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_off_focused_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_off_focused_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..6142dc21917d70061672d7824bc1fe424f4b8645 GIT binary patch literal 889 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0V2lj#32_B-jki9vwY3G3)JK~h z+V}VPV3{6dk%tpmb=f|eOoa6yD=n;t*};a1pq z1;CZr_yoaKLX{zT8LkYX2Ce|e0E&RfjUdB;Y|HctAj3K^0_Z#-0|+ehntf?Ba55 z#gw`{yj=tXD#CQ7r1ks+UB!Y0LUKeC1oN2elPc_GgM8&|3dGC!_(c=NO#*F9+cabo zbYj$m@@4d6*-K@a1q2I3g+l#>JjLS0s^$JHJz@`x;}}mD#}JFt$q5oM4HIX!PVMcT z+B#Ekw}~~oy0|$%zqz=+yuFwzQtQd;u$3olRamy%vzpH$O;GYKM7t{MfKZBJk-oS~z$c8%}Vn-lIH z)JsXuUY^1K_?C6VObe@z%90PxJYDoSt6yM)d3o{kPYx0X-()_1`nEY|`TFhi?e!1M zWsGU$bM!gEHRDXPvs2`QI|lPUba;g1OS-mxb~#)bWMjCIZ3Wk(HAi+lay-|pC2%-I zp>GL8x9Bg<6JY`+DN4)CCkO1|(q7R zh>P=|ovj9wWi&2YRXYjks>@sVm7JA1przVse3M^>f#GbN#k4x{eV2gI%i!ti=d#Wz Gp$Pz5S7RFh literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_off_holo.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_off_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..246a8f9d20a07909268a3f8619ca19cc17f40ef7 GIT binary patch literal 519 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy(*k@#T!Hk12M=!FzP)<&>ihTa z1KD`Ml`B{F?Afz-?_QvqvuDo&$!piH-MV!PqUGw4=`2{naIeYWWX%=>kJsBN5rhCs{y?Ww8*SWKmRp&2-+^h(_dF95{8<%h1xO(N* zwHw!OT)BDfn(d+UM}WHDdAc};RK#7KbThBnK*Xgw*C!(BF{`jg2XkZ2-QWN1uXib3 z6%VgGzvtYuYAwOO%uO{V0CzgJpZ`W4mqp3%5`5DP(VDw4SGF+b<^i%A&u0Z+>4Zz7XelRHat3;Q3Ksw6H}(P*c6quuhE&8o4LZ$tSb-;6 z$cb|?zt`z`|NqaOtmdmdf%*Hhw4>9S&pxeT?h89IRp!O-)$@-l2pzNZy;bKBw=XDS zk*tXAq@Rq=Wm$i0XWJVYUM=5|Yk#PAwQmPE=ZCdQcZxd?FIHMG(BJu0Yy$Z~$3<`Qd z1v4-*FmVe9=h#c-R_NLVh~$NYmBsN3=n3Tq$@nJlaRu7w*v3fv#g;M`g!;#S6}rCz zsB@vGi(^Pd+|xn}#Fq`2Na+u61^Fz=K8!k_&|{miv@GJ(6^Cd~^vF7PH$ zT+rI0?d-<$Pj4EoahWe|m;Yh=h3!8T|K8to*)ibbVQCSC^9MR_iEb^ur{^6e{JJhv ov1HM`lurqE*V5XYHdxd$_OIm7OufBi3ed3(p00i_>zopr0EU5$-T(jq literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_off_pressed_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_off_pressed_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..0da1a518793e17e1901bf2b023f7f35b9c548054 GIT binary patch literal 1520 zcmd5*30D(W6dtA0h+-+I4IGQ80cndAjFO_*2qZvg5+V^O0mK!NMS&;;F`(=s6-3s6 zLRbPVlGA=5hUVYoE*zw zqZYjYQ=T{fRfS&!z$y9mYkd)^z6j`*xY!F6*GuYCf`U86a^M$aff4#+HINNbU#P` z`3<$)GD0PvUBj-f;R`FgVk(+yYU}D7svDy|Mwc|za2uOA$pMw^>}DRnrmf;c17Fx8 z;MJWGaN62id8MuOH$-)b0xm~zyh>EdDs2+58)I3m&FrQY->TMH7E2`L3Mv`|{JjT4 zovEk&&2`fmK=m*I=e{3l8FrVHTN1FrcoKeFJ(YT`n=W~hPAje>ncG{SP+~gOrX%uC zFWQPhPV5Kb)uWk@o*`Cb2_7DFar6kaJXU$@ex$K+daE7x?b(5p-wUP~6R%_D7IK-= zJ%yoVn3V-)9|cP+`+c;r#1YT_Nt<7sx48RgoeOo@PI#iTn^f3Ygn|ep#o!?!0$MhS zoR9|wd!-keMo~|PhX0K}Z-kVl!H#QJ{4gbRwMr0O?n*jp6nDp51G5p+6?9o8ddo|} zBiL=To5M!!AIZHW z(ika3bBKHW05!;GSGU5|WV=*#Kin_Dcu=-Xvw;@0od-M4uEOLL7Cg5Yz1AYwyy?h< zt!R_qdf{9Y&*>9U-YTVIF={CD?38`-7q&CuPdp^VqloChlEBhq_OYoqXr=XI#U=Jm zryL%+vewD>+gs?E?sn$W)jHR^bd*9((uWENSyc`VML8FS=79Z_vGr6L{@(X4?L#VQ_ zYR1XUQ4tvn+Q2Mp>-cku?8Eoom(Oc?66M%mI!O!D aNtFVv!bM%8)}XcE2ZacDGEV4mF#R8tkS0g~ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_off_pressed_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_off_pressed_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..25b5fb4bc4f78382d3b0e0092cf8df807551242a GIT binary patch literal 1624 zcmdT@`!~~l9A7E9Eu;e{1X#J)xPDxw z9L63(#1*0f;t;W9Sq4sOLPqDI{NoU~B3RWBNCNz?)4F%RSWJnOb&~+Ac=3xxWXl36 zo+SY*Je38j8vdOGcw|hz@#+mGG=VISj3py*6j=@&iFjl`bvnn1Wk+B7E z(j(a^JXabZ?_|P>l^{T*G7+gPWOz1+fk%^4p$ukH!bjaq1~ELh8Tdk^FhMyPWwl&9 zD7RWA9yA0QM*(__>)rx9XbUPRNs6p{2T!e(839T__ka;#5XO|q>?30eOlU$N47dZA z1LUfbECgVcOWXe6(NF$M9lV~_5VX@N@R~FZxm*nnbKbPo4jUd7ZL4At7#oL+kBPit zem){0F$sTGOZOTfIhB~Ala`(V&CJTamt%Q1r|5obXD8*}wjgq&fLqO|<_aF>+ZVOa zi%Y2VmJW)IUqdmilwQ`5@2hUy#4V{{Fw0vW-oa1>bXFz1lux-{+fvP`;@o=7sj0os zCGnW`b&QTs4yTrT-=|nmM(2~7T50};ya%*~g5y*kx2&wQsFlfSZ6w#W)liRlo-;ZX zg1+)%;t~WRr)qCy;i|P2)838M!DwxG^LqA(kLV@p+pgq3dY+paws@0W##>88c|Z3p znid^XtXGX{)+_6iFSO=<1@GId+hk|}rilU+=#(#$YljKFvqP5{MhR`gCYXbq( zl8aS}g@h$&I~}&SQ`>JL%+nq%S~{~vPJA0qnY(@*%Qi|{tB+RKR`pvWpJzL;)YrS0 zr**(4!TCTA)?-|ape!P@a|Y+d=z^;s&{#A3-QBdG6YJ$qHjad}VhV!Xg?S>EeMatX(IAgxll@%=x;%9A6L0uW;iCRo?9-`>z9wkmvxah* z%)b$^r1mn8NS+m6?qR^p)w(aL9N^v_Bf{0HMK zOPr0PxB;$g#jV-o4Wt+cwpj>L+JLM7_to>dof5Lv+p3%sf#HWiw8M zXLgahgu$P<9E3Mtu-V8PO?>VepVoyJZZk=^nSLh1OW)gNzCZp#0TLtcX1zevaIBHMi`1J$7GW0zan-% z4Uin&f}QA`iuP-+*`!_?3o+R(;7Ao>LKRzaz&rZKEh*nXwsb8iXEc917y|}z*!`;pd>ZkobPd?MU kAYzA@9x&Fd()_fnsgvP5);t>}20uB(-rC8k+VUdqUxMF3A^-pY literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_on_disabled_focused_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_on_disabled_focused_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..ce53618a85498f9f50de2b0ca191c01bf6a34669 GIT binary patch literal 1015 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0V5|!832_B-jki9f5SeU!y5Q*L zGcYjk=oN^8`TK4|#Lk{Qd+yx1OJI<*?+#FQ?$Iki!5cSj{QLLsKN!qB0@76g)&f-g z_3PIsPo7MeFd;QH^~;wp*?U2{;K+3A(?5UyOr1K_)6>)4-QC;U8)y;G89)Wgj$OKS z>z0FqgPWThkhHL{xOwyD!ef`=dVwmPoSf|J?99#0jg5_g4uDGm8RyTR@9ph1GBN@x zgNP?5C+q9$o0ymYxq4vG)6)ZVysfP*P#mIi(Xq>)K79g;0Of(o3isW9{P=Nye}76! z3XnVF$kj}k`+<&Ja_lnDJ!|G)bq0ohT}hB%FarY%zmx)(rdL$729si-vziF6s8NiQ z7(2g&G`oQ=yNH|^4?73D9=j+j6ALT51G|g>GpCRgGrMB|r!{I+8Ur)pcQL-qH!)J45m`r~FoJ`F}U; zjqm=N@_q9@+nxVBuh{CJq)9;f^sw7kIWuovE-2@3I^|GRQXtLQCaiIDwYkKvD$gkw zlGfU!Eb)0($9>jdOX>lips*EB_fC|O*>tnrU1qWJ;j-DqJ)4sDe|vo8fyLoncjg>F zyfaqE*w8I=_WK6Tx}Xn!g^SL=|K53L%k-I?Ea|h^&M1C1E7MYGRlb;^qSLzUW~-|U zyPJdepG~!`laoGPbxAUno4jL5t?mZCcXu3uX0M69bL*bx=^Hoi2^p_R6~7tG`uhdr z+^0pAt>Gd+Wv1I+S?s=w!M%^Q{rQtE7X(E7{B0KZFj_J*U0J}<^)g?i@xk@3OZ^K< z)~#c3kK1wdbWyW@yq5d2E6NAWwVztWPuyQwdUn0DuG`&~CATl#jeRL5!MbMOb9s@~ z^7H4-pD!o6dTyh_9htCDKJSFdUpE*PMd)WmDCDi)EVtdc^Y_=aX-A{DgN^sr=Ui%X zh_*YM;;YLuBXF<#&nYpMwOS2A7T4BoDfYg<^lh7I{WZDcj&J|-?qg_v9J}+{ad$Of P8e;Ht^>bP0l+XkKk$2!+ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_on_disabled_focused_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_on_disabled_focused_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f83c8d25bd8c5cc7f09d7c3a4bf7b97e24550b GIT binary patch literal 1097 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0U|bd86XFWw8gG3{DcbzlIxN8! z30OxY8E<(EG1j7L5=6${-rm{S*~iBR$hD}M29&jqOmT2wr|_3PJvFo=tbvx-g! zN?BA+1S&px^5l~zPbN&5keZr${P=MvCnt+qkVXXB{OH7q6Mz2vnL2fCd8ySuly z_pxKgfL1^pU>zKjl#~Rt#m&tPNLpA}Bqk!O=hk zKwUuYzJ2?EBv9UXGbm&%Dkhvdb?Wis$Nl~NDJdxyHB*6t))C1G2?iK$t;eCqsld*}!phF+z#+lRDI~=#!QmLdsU^(JCTJ3s%`7Y8&B^Xo*3iJt=_#Nr zAwJ1aSaOlIBq2Was1*#PyR{|P`GL7mFj1<=!DPWos|-L45v@K8+&jBwXWtiiONlE zlnU46wCooNJgT~M3txlLu02k^F9mP@Ryq}snd0+omDc8!w<3bQUv|d-_B<899^q}f zB`UF&nOiDbGj$h#$WhbAXJQ%Ix!KuU4}Rmjkoo?VpY(<1uTnSd*x$dAmv~YBsn7A6 zY0Fb@Qpk;EW{ zc)@>yE&W2;Pt^LAIqiycW|efSEzO^2uzZ4jcg^SYL+0m~@04^YTfxmjb*?v; zym=F%?CaOBy}i9RZrlJWo-knoP_ehSx092Tot>S7gM*u!8<6z$^mKQ3H!?B;%HFzl z3uv0Lu`$pPb8~Yb`S|f;TU*=I)Ks7XAfvy(KP4rlr>6&~_|vCPKpPiMJ?#ecgF{J> zUob-h3#+I!GlL+joQw#k1V1|yGf#s+85@t7bQCKGGqVt@fRJ#uNts(&gGp4BIBQNr zPD3`QiIkhEkhG92vxr!WVII(|H=ZtzAr_~f23==rG7z}Tr#Zza#NjAsUcvjn|Lawo z_8j=gJnQFWq-Mw99SfvSiL@+N&k4UOiAAEE)4(M`_JqL@;D1TB8!2v z2N=7Z%(i1-VEpUp;uzv_{Oy$US;B!L$M*lcKT~a{N`T{KA&(4)-6x%1XWct6mvwW| zQkEJ<*6*)`IS#687RN9%cB)Ct8Ov!q)cpMQ#c}^=XUldV_z5hhNlZ(%~WoXIP)xX$B)Y?#f&n{ zs;wga`vZL2SR4ZWd0Fq1pZVja%w3LxkTtLV@;`qa6n@)`U%X-KY2Kg(_mBQwYS3O* z)WvduF-+v=<&()vH~!dqMmviyp?2rjHNpFD^xs?OB3O6)zLPIc!U4Ul^S$PaZ=d(# z>V;1XIyx^;M_0bt`_X&(+t4|R+uG(Zq@?aYxa*eR%y8S&?5wT)=O102TNIvcaMRuF z-UOBbws)8-qut1oS6z&D$n8lklEHLek5;Wg3(!~-J!}p7kJt>GwS(Yzsj_> zbV{=}3-^@fsO1i?wfqnFnrnRAAaU@6k?VWQ$Ist7GMuYCu>0G;)AC=t^J}&%a8w=N z*q6CH=Hf5;^VgON=iat4X*AvBIPK-Uit_$v7j`|I(#UCS=qokbb5B_P+3aN>MgG5e z6QwBdLg#ewhiBW24L&Y>!Qk}c|Nnq@CE8!ao5XGwpEp$Q2c`(s64!{5l*E!$tK_0o zAjM#0U}&goXrOCk5n^a;Wo%+)YNBgkZe?Kb;>*^HC>nC}Q!>*kach{lk~bHqK@wy` saDG}zd16s2gJVj5QmTSyZen_BP-Et6< zcb`1J_Y@TEI(dH5;j2J#H0yHr-PwKW{En07mmIs?eDFr*-a9}9WB>($44~rP!`Fap zplsN#`*6KWj$P_LbREde-FF)(JLSk#i)~MUT%!&5wWjS;sb4Vl$W^#vprwnCT{hnO zM0@5z)3W~f35zOM?J+Iy*O_?`Xe`iS$gY}kWx@;4yX}s1(31#)VZdEH?*ei(XF5By6dUSuBUrWozK{NN4a*s zX5Z$VeRni^H!Ii9%iag_RO7)L%GGm>w>$JMRQgFlg5U`GQ`cU6$LP$mjJa zSIySw-2@cR+jkpil-9JpDs>C`4qpr1b-xSj_pH5l(!oJA?Z{PNI0FL#s2GBR4!rc- z`@(b^h-4eqC29ZB;cL9ey_fTMK11eG^N8M1DI1Wn z$SJ2EPl>eDk+&&G;CE4qT>t5xvWvK~#gtDZ(BwI~Z`^-O; zDWBMt)+;GbJ@Z(A-##i!Kv}?(pTCFSl)u_kKH;`)JTQeG^K@|xu{fQaqQD^Wa&?0s zi^RWX1~b;4H3qC_dV1#nPu6&lp7Q4;W6;O`pWpfI+>WJZaLrJWT=+oVc*d@u{H~1q zzo^&E=(7KRvw`hHT}|7PhKcjr=eG;K^OzR@=Dz*izn|q7HuOfzFOz@6eeHX_t0aGY zlXk+Fd#^t^e3UkKVHAG6e!Wvqk2G`GpLWfJE(TBA=}baqJnsMg|Nju$SGfJr%>4fe zTtU-kWEjOg3`;U$jxK!lfA9K3Mm;^3{~r>0a?U#~#U}aGi52{2UoP$czkI*--#OU@ zBFh{;35(~SDAab#?YKX4-9P)Z&95$tKUQAwz&+@|8b02wvwPa#Ot1gf6EMMg{R`p$ zcENUTt{eXR{XhT08V0LNPj8CmNxNBYXmbDGzrb?SQ>hEhQtV5v{Qno4vg7=jnpdkY z$BN`PF?(HpVX;{C#_Z$&>si@YiX05TY+ixad6_)Z6B+jczMK} zu<45Hk&0aKVqL^-r>Bz`dndNn#Oy*?1z7%CVuBv zK3V#F_ECc{gFpQHtGebgE1zr>S}T3OszW-W{@=fT+neg=#ZxPKwQusr++$&wmU&9~ U@UE@xz_iEU>FVdQ&MBb@03JVH5dZ)H literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_on_focused_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_on_focused_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..ae3248f2c6ba252b91c3f90e50bd612254a5457c GIT binary patch literal 1231 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0U=j%M32_B-jki9f3EK3~Iy}+V z$;H;u8HAi%tRs?*H$OtN%d)rwq{i9R#y8k1slcMN$D*{`Dls1@2xJ2lTSuqcIyu|; zhM0FOGv4|HqTRe>DNsF7ja6(WP{gvR!#XV9WZi8b+i1gmt!evI>K9mt##@wuOn{t3xr^N>+VPsGY2&YN#UtUPK| z+GF0e5-4RIo&;13wA#imR57p1V$ME`x%+JVLVzN0LqG}~ovo4zwWjV7E1D#}@Vscz zB&);%pddsF=rHBl`Rvt;EQ>pVf~-}Glxyb!r8sl@8D^XUnk<&p!PLH)seKDj(5z=Q ze_AVldMnTYz#ui=^Z;m=$(kEtneCjpeXLarfod#^+JWY1P1~zdx4=3o&AfBDRcsbe z92l68u(c@bwJ7fgidcsw*g84^84#qt@{075i%hf5Fw8u|GW#r>`6)4Anpj;D$n4dftR(4}ROle7oYLjt?J5#npX_L4>8EjFOpPYFCT9aIpy?Ym4rZ>f&|H0jmY(%{(V}nRU;wp z6hGzDrv!VmHVwHHhp03E&NwEh6&qzgF)4VGEqmr)98i{BWBqzf3HcC}sb?Mwh?GQS zNoq-Wiq<6=iS|eqRh!Dof4^?Rz`%Ie)5S5w;`GtU-Wo1}GRMxFKjtf(y>X&jrdY=! zACc6BdxC<@QW6(>EY9JHoDt!%B%<=k)ZV$96qY`bRGczFC1tTqP)3}aadCh3ySdr# z&P-(o9|R9`IKKY+qVczZLoy4K zdB&2jUL1@(o_w_p4gIeg*zeV?XG(bR)h0yh!KVAaG6XIho%!%lb8Nvoi-g<%SQiwn zePiaTmcmdGzjoGQt_3So-TQsgStHrv=BPdRbwXF8A=S*BdwGpk*AnS%Ez;@hIQoBx z9Ede&t9ItSirDInD^(|48<+)-Y8h9 zB|W)uVcKWzO>FNDd+(S3y=*4Sr$3i({J($y56go$2bJr&+k}CskipZ{&t;ucLK6VB Cuo++g literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_on_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_on_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..8d574944df5f63531aa96d32f347f1febbc17f28 GIT binary patch literal 803 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0V6+bK32_B-jki7pqQG4bRvo`+ zvF!^E;0^J$9>%Qf-C-Qkc%2l&9dN%=0(3-YarEURG z9Ox;aFFg0YFx~bv=)g;pZBNa%J+;?Zxf2+C$t6L4!NA~T;#D@WwNd8b&~>%aR#nr{ z;o!BkP*&47vE;EcP&Rgr$};3&vapDpa{BR?i6^vemTD{8Ir6u2*7Go_gl7eN>jRsp-RQhk@3Zc)B=-RK(q#^g61^L7?q+ zs6#M|&%p_6zE0>`e$L6=cDuURX_z--8n z9No_M+;v7_tN(Rbfg4wC@2z_&v)wYESXr+c8ce-w@lC5lWQgFQ_9Sq Uskq*K2aGNTPgg&ebxsLQ0J6o8%m4rY literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_on_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_on_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..06235f0a6b18736b99249339de150ee0b3e9ad6d GIT binary patch literal 837 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0U$NEDwo1$g3R;K8+xUjqIynPL^NwZ4Tc1D- zG4EIkR17r1#xKk|EZ$_@ZJ@Z(hWlF6_Nmk_0O~U9UIo+wRIferpkYaGXxH5AMO#hQ z-U8`zaxt5*(ZhIwDpcVQSxE*0Y*Ft(8B$6=;!p=W?K#CTnhpWwwhJO=7KD2-K)G zZLdn*0-zL77bI9LN_%X)0&E?f7-pW4UUHFX)*1DcS6F7B<+8ul2@KiXk|4ieU`R8G zIVKf4@CDZ=I~o}|2Jwm&C1|PXn`k8#iu$P-yGCXCGsRm(PC5NpB_WVWyjCM}{ilDQ z)@#*>I>k@<^eMqU#Ubjr#YWjrObVW4pZOOD6xUe4UXv+AW$Ky7B~e*gqIF3| zVnqk$eb)e5Xz1zU7-DfcIYA<=L6Boc1A|NQ)bymZ#MH?X6N?iQ(~^#;oj-Z>?BUr* z^$#4@)o5ASG|@A{CB!GjDJaM(#%orrSS)M6{*F0&nifskv}w|!rafHNyCi#7#bkYY zB{eJR)~%>nQm?FbRsG7~;^FBP>G3_}%*Ew&M%P3{XYHDcA~$YyY2Ui}{OR*&&z@V} z(Co6dTBwy!^lU-_ZyEb3=FlDLySyr@3>RvB_%`v&SM4*b%})05p8pwixR{C;Dj0AC zGoIiwH}2RoQ+k@sbJUbWS>7f+s?I`QPejiXyD2S;iivV7x1>(X+ER>5tU+RsDVLdHXiP3mA>E|S z+-I1i*<6NPM>L7lR?P63F;cWv>^s>%_MH8H&w1yY-|xLX&+~rgBX}J?sJGO3DGG(s zb9Hg@fqzrgPirweoo*4EP$)H-m&XxjxbET({m*8_9a0%@X!lox16%>ag69X`kTq|} zhClQpe;5p|kOm=0fCGf=s)zU14DYKMb`(g#AP4*qwc)G$Xo1vAID%;zOYBtOyT|e3 zaZK}=w{QfiAQQ?L$U;N=>R|_g)T2&@ZIcsvlqp?`vrorDnh|({$GuJlQOHqs<_*Ew zTPTBuxGqI-6LP8v2@xS-%}A&SIW0nxyA%)w%nQu{^TqD**mn8JrqS>g1lu;2&@NBv zl*1W3aqaSjGalbxN;Oom zkYoEb2Y6wck)#g!i;0=gW+Y8K4t^+yYv05SWI_{w3gr-mp>TzvfFD8t5>^0^fGKbR zoN)FM%2XTVs&On1t2D<>=Kp)r|=&x${FXe+p2&@=30wO@k z84&`@g2jP)Koiyt1||Qs`T2Q@=MoCM>(jA5hkfDQH`w8QCMLm4e~n9cVsgqsUB~DP zY50q&xTt*rNtefm-_K+c$W$7GQzxTy zDbx{JJexJZD&{e{A(smU+(+V?G9odT#^5t}{W4x;PAQ+mD{;#$F6Yzpr~*ENA)wu7 zvm63{vhPx8pJDDwmg;tDY6`Wdp_MTL%K)Uw!x7V|rkitwI|RA9wBzX;wzlWk#-1zJ=`e9jdaCI#HNOINe8v)u?bWpy)YM%Y>$lQmbOUkv;UdhQ zKqX}^+sZ7)w8_~{xjb)s3ES@VV1dXKF1!v{@lMChf+@k1qospE+= zw^H-f1v~fk8^*cN)yRS3(DQ$}eQeXdy@kYi=N@Qx%0tgz@@7oCP!uo`t*5kzTgUJf zG`Kowx2G5dF)!$!sgAz3-pYywX|l$5 ziRSel(Y@{#L7$@cpMK?#QfOqRO_Zj*xjnhne^dGWKG`v{s5K(#@O9lK=$Yl{1}qIv z=)Oi79X9+^!ux$|?^>Fht>1K1&Au&<*G3gllC1i+Wj%QK{DD^Lq00xTCv?U;lQ*TF z`oqIL2F(c}i)6L++p^{TwA*B>v$X*|mh#;sPJzhTJUF%N`8ET|CkrJ(D-Kt$7eGqy zkKY;`)%1C&+(!43BS literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_on_pressed_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_radio_on_pressed_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..0de13591a7b788a040de99607e94fbca56df7854 GIT binary patch literal 1602 zcmdT@`BRfu6iulu0i{wT5?m@Mib_Wf*}en<$R=TgL_(-aK}10o1B6Y8g@hn$08s=D zVGqF&mS7-}E#LxCf)%YI4HUG3C@!Gj2wKoSV8&ni7j)*n_q}`PynD|%^S%tK`#wG0 zb-FMZOpom1=mEYaiwpiO*c~e~RWO(qnY!Q838ZNGv;RRfjbWb)FEJMu6puZEEjQEwdlstuK;ks@g$hK!LJo4sTec?7_6`tia$p@8jh{#g*XB{w`3Uu zSP{axn3@6HIhi%Zi)3Si%avgyj~0uU?*j~;R}H9IQM_Gj$Q%IEv%dEQ74li9z8+xnb7laiX|jocKJ zp25q?+?aDVSMS{UybJmE+4&_69o^l<7uGQa&1z-6xL&Eg$|sk!SC*BRR8<=oV#pgL+unel?z6s;+E%^SM>nQyeU7eMrT1mUc7?WSv(^?RMHwN7^;{c8D-Q_-{9L?n2Lq183)Qv0xef;Bq{V5- z+jMm7Mg7Er)L)DghI?QMUoz1)Zo%1D74?au7W3mHQ$LOn36-)2yO77a)Ad8PHrG4p ztYp^BZ0ofcg%JJIM1f(-yykJn+SSzT=l`rG+K>|vv= zwid&ohBP%PzQaO$dVZ|O+G=~i)zebc@tIu=`~%0HUAxEmZ1^=xo5=~$I6N3K)$w?L zhWs?1mcoB&67%}D3s*MCd6F5`jP_C8iFExr2F5M(Tm5cRvW~yAuZ+6=WsZM)DjzG1 z$hR-2YPygE%&@y_jh+)PO_)huMMoFQB$M?1j);ir)RF&ttK( z+iel$hv&*!=4{ZGm-q<;BgWN>68ca<5}5UD@m}BA*C%BUf4UVrS>v6$vnZk>SRA67 ztBMK>Xljvba()`Pn%+qw~U6*|zz5PPdwduV#j?j76zk*!bj jy{RJy=kBnsmvnwJkV!w8{$|t;{J$`=le=TRy&v~q_e~tR literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_rating_star_off_disabled_focused_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_rating_star_off_disabled_focused_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..2d88c0706b2583aec0d7e3c94d3734dabf25492f GIT binary patch literal 1511 zcmV1%rKN~SOjKRTlSp?6BC~_Ci#s^J|zW88#GSQfrI4>p| z6XTPa7-xX8Z(#?4NGZr-J3yh(g|>fJ!0*7llps6(o09YK)6b{PI#X1 zA}f=dI}pJTolcWiZ(qx9X=$n4&w-(#p;9mub0CU;p5Mpr4`*x^hVN!J1TvC1)cA|+ z0?Bdl`H=3eUa!xGq5Gk}zP`%pbmf*bEX17PJEAcN5#U34{QaKg_@DkUB{wcu(|Rdl zV+P0le@WLY+gw?wW5Kn)3D^2Y?#9N36tLNBvi|=5G8lRg#>U1FFu&=;)|Gc{DaQRw0r=ZEY=#Iu+{b>bCF0)NXBUt?caVEbr~@EgKvhECqX!!_q(0 zmRFer*A8+Zn9E>jnW?F%BDay=2b_W+>|C;?L)|i29&i|+UxyRWE=VJo0~dMQ`1bbp z3Zi7$LyCO5+xVcP4y9{o8hHJu+LCIqSn}H1+A6$dJj&K$cSyhf+mOf^i?QOdCTkG$ zTJp`9F%cJ{CdD)y!0Qs8z7VNgcqPQ5qc?rS8cb&S+A! z!{tU47;2TKGHUlUZ1b1S&b84^WZGNOS@JQZoNJ$x0$ZDnw2`cCKE`VjoArX^@e?7H z#(c?X8(5>!6nr(hEwKZ=wt0b4Ju%#{{CAL4U=DAc*0dc4<9b6X}M1QVpz{p4TQ52IqpEb%y$j^8wv{d!Ne+m!M-Yn13_F) zGejWOr)fB3j7gK*JMO(BRu2HrAUddX4>ARJBp7#Z8t*^;<3C3}{{gh|WUx$#N=5(x N002ovPDHLkV1ioK;gtXY literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_rating_star_off_disabled_focused_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_rating_star_off_disabled_focused_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..b010d3d6e6f1b2fad171475b66df96e8ce8bbf78 GIT binary patch literal 1593 zcmV-92FCe`P)rb0i7CrecVxF{Ne}wV2p|PXrgBG|L{EZJE0<`SPCg{GRLY9A4O8`)hx3 zw_Gd#Aoi@`Q3N^y4FP|z5fBoXTuYCE{3475VSB~+1B~ZEN)uO)!!)GX-f>B+fp;leR>RU?gpJk$yB2*5h{B^Zsy zF#*J#dlzbIYK~K**CQ=0%?@1)GzxsKr)fAN2}Brj0x5x<=`>1$I0hOl zUIGy407gegy&Dl|X=%xj=bxnn5?FhvaZhG%8J@+Q8ABjoB79)0okYR(Yj_@52fhHC z&2|_K-3YU@v;GLN44jL9<2TO>1CrX52;*UJO#cd|_GyT(xecm{xtKIVbE%|){7S}9=m@1dU{)1TV{86clO}mVD7zp_ww%F zzn_Pxg23XOnws*_zP}aB%*^;FCntS$kCBlPFYb%LnbFnNm3`~ht<0vTru6FS>LYwU z->fKpof434MnFUW$sc_M5i%9Dwzg)_LxT-EKdP##jzrnhA$9h5Iz#x+Dqb}K*dBZX zf_M|u)zziZwirw-EG*>vd_ITB?E{?dXguTKEp;F%K@zf7l)ecWS=sjC;o%d(G9J^_ zV6|Iy@4OGLH_aQQLlYP&#Zu~|DiJF~cq#^T~)L4AF_TbArHn{Ln2 zoYyn0bbAw)7IwNBP?&Ff=su5>8(x8j>(?^of4G$GE>kXFR0#? zNnKG<;W9Mz(ngA9tSb9H&qeqY0o@E@0 zKJu)xDarZy`FwtigsM#gr#Ce!_SBUP(9qD}-c0wGmXg=M#9x05Xe=5 z7mTH)r2^cmq@=`&&f%;Mu*K1btG>RzTrA>9iQKF?-^^BzT0DHC7R-(YdRty_7Ib=p zwWFgW3-@C^e8q4tX6Xrx}>q7;$SXju9_hiF$0h{a-yG_Q>A zC*`aI>96$Sb(0=sVj>f^je*Fc&yfi82g__ZE#m6`UP&y&)r=84?QD@Wx~%t~7rBxV rVMv7e-Q5;VI~EGM{k6aL*Ou46>Z{-Q%_I&E00000NkvXXu0mjfpo0A{ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_rating_star_off_disabled_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_rating_star_off_disabled_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..8b6bd9335640d00526b6ea3cd1f4b1c2f748b8b1 GIT binary patch literal 979 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 N002ovPDHLkV1n~X4v_!= literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_rating_star_off_focused_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_rating_star_off_focused_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..f7ab8996f6ce880f038783871f084392fc50d053 GIT binary patch literal 1650 zcmV-&295cNP);-7KiImz>=*AGMY!RGQ5fvV24EnL<}IpM3@dxE>4(S zBucqSp@1&axH#k7%(7(nY{|Ch{*OI}y(c4NRHVM7B%I_Ee&Idm`JT)3e9!4?D{ZB% zH1?Wq@^8Yj4Ll6lj~EcqauXm!a&!~V0RIw92zR*z@5anL_-`^mP~JHzLXRv90l^4F zoVS8br#s~(SeG9?@FNj$1o3h8;8!8L5m+0u6`Grytpx=IO|q;qx(acwED<0Iy(B03TSO@9ro4gseqk`O9}`@Ao%2EFdB^?lE5isE6EiK%f{=E zfuvW&#}x~g0fDvJEzs81HcW%3SS*&yGE)g%1+A+I@J5cRd!Ir;VBm2w<8uY{_xIoR zl!ajM&xwF^#Lblis1XP_TmfdYxtRt%m-zVj(;F_@=qiZV3}_AFiv%K3NHh|Q#3Ngf zMC2W02XiR15#TB|Kwn?q^n3zpYHB_e?L0&Uyi2}k*p6&v`hEk6K{QAtB4$?DZK0V& z&*W=(8KT-g2en#VLIRzSk&%%vJb1#q*zv#MCHv1sjEKge5N3u!JM;@g)DMB&d;z4H zCuZ_G|Ly(Y_h$0UA@z;k3|`@ye+gBAr$hm3`~*;6U*G3Q03jnIP5H z(2{;<@J}#+Ajt^p_8bLr=!1)!A+mXj7DB@Mc?D1#;1#wJf`Wo9$BrFqI&JtILL45>Pv%9p<9M+0U`v* ze#Ja}*4aYE69~;(>rX_$A;f(t1iX%bXjeAW*48>*sWUS(>qAOg=_&**#j{Bo$wtJG zp`W?utN`MB_*+w{06p6Re34vb%N>Y|iz|OoaA^9*@ma;8$g#1pM;t$X9^*DM5H~gj zC=s-|rBGU0+V05rr>CdaaYK~gC6eZsm6dha?e-`0{eN*-#E5{V|2y!H-wt}czJdfj+fInZl0qh(nw<1M zjxRfs17@hMuI?fOlbaY3LvC=&=IPl!MuoV|DSiozr-#r}9l#Yy^T-Rv#Kgp7(pOqq zS{+Ufd*^_>8qkL;a_u9B*qblP56rCw>K^H=J4nF+Or`;xZLB4SKoJsRX=rG;K@R$? zhp$LB1nfb;Q!EFuR8}Z7n8=o(17;!0g`_}IZIL+Ue1P)GXRucH7VvmHvtZi++FuN7 z87TN<3%PF6fsQgO!(D{C21 w2V5^^AA2LO`gb*dM22|0w$fJGN?UOI2bEe2WwkPlx&QzG07*qoM6N<$f=3ARg#Z8m literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_rating_star_off_normal_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_rating_star_off_normal_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..1360dd036382b5837e07485fe6c7b164ee7fd5fc GIT binary patch literal 1057 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}a}trX+877l!}s{b%+Ad7K3vk;OpT z1B~5HX4`=T%L*LRfizez!?|}o;S3DSnw~C>ArXh)PWAQ?4istoZ#{RL$x*&3N)o#L zZDPI^8VWO}C~%ANX7%*5x|O*_?z||`3q;)Jub6rR&GmflNIElR^;jnxd<=D5&CwC0 zA(BzKb=%x?g$s`?I{angHPQcB?{+?)^L}3O^LyMn*^&PvRRrdr`yz99Y4S^!oX-}{ zcc;wv;F&J4aBKb52U%N|a5_jYTfK)ZeBGAzFE3Xn+z-$bxU%C+h8J@KOX2Amf($Wg zZ+zWZeb?>j;9{uJex`MDTGfGb7w5E|e<)+JT*6_R!_xethfd@kDGOSz3keH&yOqUg5wGygAm!9!!lxEp%XC)dQar%G$o66(+k$2( zj!(9%^WGe7Y+W2?uFv?RQJ{h0&y0g6%N`z8*mZM<%!6+=cOBwph=(S|JyD)>gi)|> z#v`VKo-&N9I=mjaZav{%;`n;TE3w_0>;?~hIXKU^4D(X`_~=*NW!spfNjwY+wt7{w z?nfR`d0(@4|1$q_=IxRv-!U=>v@ia*E&N(#?4y_AexVjWH@~@=wA#ly!~2I*f3A-D zzAgJN2Yl>!YudMYUwzt>J13h?$D7xgc^Aq#=dP%^aHaEejvJe|_cy6`uH|-W3=A3JKT6hL&24J3IB690Ni2OvvL}D*zOoh3*Y=$=`wXc4WC3~aSDTOF}jX~CIrfh!u8K3tRLZaK*;btkgxbH@ssohy9hF1+Yu zWH`2IgQX|K%)i_A`)^S@;@Pb`ndz0MV)rGnYr9)tC@x+UxY}6fi&($At({}<`8lCo z{U^7auoGmxz@9aC>Gz#~Z#jqhpJu!AX#UJX#&0T7E>bJA9?nb;G0A#=&hB8Jv3~KQ z(zBtv4?l_hFvmzE_wyyuDgKi6cU@=xi+X4=jDupsl|*UyUjM#gj|@)-zYuzB>H* z=K1?8O$!e+Te9C>SZerp+oi*n>~peV6HIX@iYnM;Z+n6 zS(_8Nxqs_5uje^A*KX~4^H~1G&eDgj;&-=f&5JQlO-;>|Up;5t+Ayh|Q zVrPZlSj2J8D`c2_(US3?)~&sNKbYlohjmVwDx;kY~740vvNq^I-@Z{!>e3zwq z;)K+b_rdyl9NXMjQ&o5^3b|$;vfdENDr(EDG(pB=!hXj0QUssAB@nAct9(*FDNVMIXL1p$?rXL?wk9KPLRW&6#+G_BEOOoAu#I{MPWh8?GLFAR8UUH+k*$ zqg%QJmJ83ha76v=R^D*E$9!rvkNU?4W$d_I`1ao2FQaV&Q41@>f?{oOxi3O(GF zz_L=L=#|L|Wv4e7#xz^h^=VXFGPm+vD&ST5U0n10 zz@NWPv6q==``-?})~Ui_H0dDQ${!J~S+@=)U0a;HexGH;^|hD%G+3A(+KVNpt%+`b z|4?GeJew^B%=W(Gd3SfbUUxiPV%e|gH9paOGZM}}=O|yD_wipmS5r`2ghJnQ#)jjU zKYscn>~4JT?^%h$m%rMdA71XQ%EfTvOq&GHs=&o|j(M&-eYk3j=j3PXc)sqq`1(6K zZaRN;#cnSNIikw>?ScDaX`lA2fRZIPivJR`&*moE#{IZIX~v=3{Kt+bORo7+(!Fx^ z>{Z-XRK27P=48v&x0&tGkl6fU!}qzeXWmZap6I3OY`a`N!Nq!QJ(J`OPHwr23C9Eu z|L?T7IL~ylI{#M*F!QOFxJHzuB$lLFB^RXvDF!10LqlBy3ta=_5F=wNQ!^_AAlKZ= zz@S0Lj1NUaZhlH;S|z#$Q!7&gh=wm04HAJGBtbR==ckpFCl;kLIHu$$r7C#lCZ?wb Yr6#6S7M@JC0V-nfboFyt=akR{0IOc&761SM literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_rating_star_off_pressed_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_rating_star_off_pressed_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..0a88b701d5917f29b3dbbb748b8248d5b8f6c188 GIT binary patch literal 1777 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 KMNUMnLSTXqG3Ye_ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_rating_star_on_disabled_focused_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_rating_star_on_disabled_focused_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..1801f9c88df4282d205b8a985e972060207901dd GIT binary patch literal 1567 zcmV+)2H^RLP)4weW9+k^^WIs%-V_Jd*JnlK|RMEJsu2Bp>Q z^&kBVXigxcVv}NpISnC0$oYGoh)6=D@K7V{2vE`mJXEGr*pSuhFq zNTxmcy%qeoWc;@!|CcmvV&HqW8v!Fh?yKK|Jl)EL&;QvlSOESbpH!Sq{nU}-tZk=ehR*#q zXSe`zPkvp41WWKhirF5H$95Oez6A4q8)q2qTocw+EeWQCO8wFltw(OK(c!Qlbi=kn z+z?b5;0>JkayEVRb^_IGxjfD6!7e6j!Nco#XGtjQu?Up-pS zP;#Ic0>{4)x;BMa`bfsE6c!sO?b$%`Al?9IplQn%017=u-hfCL59yp4e)A7NlLAaS z#{+NoJC!NHnZjZnKj%gF6>Va0H20r6noMWpuqlk6Q{xL7(&nrXIIs9&y64e|vvnWK zLehA61P2x_%>|OsHKPpxRcD#Dbbfygh#i0ofu`j$nwMGr;mG+8elRQd)HgN54KJx$ z2UJtMgpr6DfCd5P<*g+4qJzqTvp?1u7OoAeoLo#x;T4GvB|}I$XKz2tvLF{T05bxn z`|^QK_m=Ya#q(w4eN9U@(5c3pT53r{?5QPi?DJd7b64BJBIDw9EPzxoAFkZNo}WOj zGjU|n2fqE7mo?8&Wq5$=yds>a+05`$Ht?OaXrP`#qhFoq_V=q!F<+fyc8>&?kN`d# zmXiS@n;1U#yYT5mj!0zkJaFPG&=k%FO;LS-NDJizx-QmE-3WKaBuF#OV4He8!tqHKWu;b#l*n#F7=*+@Jb@#=utO`4os=j942 zVwu+9u{O2~)uRm|AFKrnvw^3Lv*dnIIXEvGr&99P=H)HoJ;O7DqcGUf>^nGp-Ez7T z?1OH0>LZjQX)GID*V~X1DW?}b4u4A!71DpHo_)I99qHgzhUDd;K)x(N!psIEFm(M?elT?IuHMRiel z#4D+YM|Ct+%VJkQHZHv9|V~6ki-u<6_@B2Le=bPgjzTq3b z@&As=$;l`X;;rHX)dph@UN-@+3}Ef0&uT%VY?O=l5#A;~KyRGL=GOETA83>n;B$(% z1rUAbyEZ?yytjn-I%MGByI^k-Po(XBF;HX)psZCX#CLJt5idPNbq#r=+xxnoET3PKM$2RH=|NQVy9&fG84{AWwaoHMIaO`0g+&- znHV#%U=>KZ{Y_)a{r2b_8l#%9hOV)iBid@-NDvM}z(O$B5#b3SQ!#4HYf~Dy4N@Ji z0$Jq#4=w*zmnQ!vxZ1835SPKZHkI(?2c;;xN>co{07~on#b=SF&f^-(9M?LA1T-)4 zsC$@SgMCC6q+M;`43ACZLQ6VWK9c}gQr&po*5^`FF>)tIniU18Az9G0c&2wDa!_x~ z-S={!&|TuGo){-4Gf2F{Rh6R0@(?m99EqTqyp-9B2Rgfv7tloau>LbKv8%<4YWu}a za+3v51pc#DVL^N=JkB;3?hC5c3M^Z5R&q&NWogEY*~i`vie^(d8@1#5mmvXV8<*Q| zb8b$3(5>ZXRXM+;ik|k1o2Qmc5(r?-w1Kz|I^ac{$b z!+WBvRYi@?YPWeG6*e5Z!tv#^19yPBH+KcVdWe1C>>lXWn!HhvI|4{Lj56<_a9fKV z&3NZUk4-Ea*ctY}k`-dU4NM0R{;W^OvnNbY+b1U1N>0^Yk3gN83Vj5nP)47+owDPP zj=oWdsK__6(14Y(-EnJfIt=e|;tJo94RtAnE;}p1a+~Pl>SHaE#4Z z`Xpy+`EenB{PENhNCUzD(q|Z8(XXHrvv#*#8ivv-S%?$w21V=&Ny%w69A+yJ3;bqM z1VO@2+(|tAH8o7su2OJ}*oO-rRYK}l@je*@IWbolNUiJF@$RC5VZ>I@S_LT}Y?kKp v15qFyBrxKETr{trsTTN#Z}^69c-8m~5FGs~T4A@n00000NkvXXu0mjfM6Ty* literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_rating_star_on_disabled_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_rating_star_on_disabled_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..d2e97294f954805bab0ea1a005d6d32bd2e9ecaf GIT binary patch literal 1023 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 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_rating_star_on_focused_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_rating_star_on_focused_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..47fd33e1bc25b133b45df318c7444138e6a0e92d GIT binary patch literal 1637 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 aivIyOEDC659RlM30000bN=(D!>bq1 z>$7VO9>5291JTPAxF_ffrh{eRdoT{X1w=2yRUZO2f+&jB;6osC*Wd{sfDIsuhZW#; zcNNeDECx}}U?T8v$E*J-9qf?`-LaJqlzXXvUk~1PHvyf%LUy3j(;9au&5j3>X8WxH z2@RVm5#xc#odo!UNOq8^GSh`UrP_wfCUe=Y673O6z$)PDPL*dWJHWu3vKYP1k^N<| z)V46QNmFC6-QdWD0l+N;^Z;ww!JQEsPM)bY)Zp)b2#n*k37FW?6@v4gtXXpWCAP|Mf?2-oVHD-V|IVkrU3!E3;iwXR6$k?06~ z!Fxfv-7Uagm;57M;cB~xXspFh$#EA`ml647taSXQ>s1L5mRqmU2uj%LE zNz!N@0ds&C5%4C6VE<>f!hFeKYqtR7ch&T&y)#lRP38q)clqGTK`5R2D}X zF3tf7qj=uRi?Zzy*%lRbaZZFw`<^hFY$qf}}vj{8fp6uT$^i$F(b*_=b)qWxvs z-E=_eYi<8Ek{VmHST8Vy9w655w*l3ItePt-@@cs$R*Ng;rrs%d}~ zC$^j;_%P6ec9etZu1c7h-nf%2^cT+mAdU*-YDTBXEXcvqT&3kQ8e%lhZ2f+#j?Gwu z!CV75sRT%>zYEot;%{7=7j(DQkYjsVtUt+9d42%?bnx_@=m*wtE%0l(HdbkIynm36}mc7ZB|gWo3b2zfT%5o%@2ffEi@OknT(03|J8#Ng&!&O8gmYgOuou; z1;;0bC-@N11N<*j*Bu0NEjTPmvgMB4bg>+D8h_i{8~n68awCpRF8a!Gp1?PPQNX9Y z?$jF$1?#yss5RJ9LeiPRr5(f+YGgMg&F6T64+kFuPgl&m{$LgDeQ;*;0^l;+D_{!l zfE?2sNAQcl8$yR2`c5pSy7f_#2SRfIcd=m3-KL)?0YNUE)QDfA%PTQ&%hBeA3V_9~ zJu5cQWpgR;aixHO|Mmq*v;mJzoCz!hR5fjt-j+-WhycA^`P^p)djn#3Z%IuRPYdj; z6shGnTd*K;yhjm6<0Ug9r%)&AZ?N{rKXNM$8w$P<(f=><0=J4$ta|S$qCf@7W z?iPt$I6I?}E~mqU3g`^N*o$V!P4SqKn*tIfEn6^f5GxS>#CV$Hs`D}dO^}SOPtXI% z!(SqRjH_hkral`CJcJ17N!NdDnzFN4BPoRsD#l|J>Z;MDFa*r!6S4sVlN5IjMWF({ zK%Cs#R)hj?Ap&~Qn<5$0#d_O~hOV0*lar>VVcm$ZtSYHv9OMYN3-*?HcIDxHu!F=E)M1U9gu8n7V3HXTGkhbVP zU=Uc{#x+L?YG(An&%+up0(1jyeZt)nOrr9OdvF)X=3_N2ix7?X(DVVY+gE=Dn+c4QL_0z#sHy0`CMmyn4M1uYUn^FI_GV^#qv!0000< KMNUMnLSTZ@g;{X` literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_rating_star_on_pressed_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_rating_star_on_pressed_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..52298d3521bcd4d3fe43a54d13e4f51810255638 GIT binary patch literal 1830 zcmV+>2if?EP)*U;w)!65|9kiY*c= z8hgf=SW?y46HRQB$)t>#NslT2WgxTOyeG(86(`x5Z*)evob%o-=iF`a|3~B#zVEID zSc3v&&r;wmApjB~1JYm+s6qBDJoO030piSpwjgV+!83s{4@kr`P&L;CY+)i$17g6U zIX-KenTsK=d9rq$OL6`+IfbU258uJku2Ld6^6a>>5uyIW7k>*8HLtDM`#ua zIKXVv;It`u%x?VsFUBskYpHI z<4G2{Db3J~t==J7{S#u1xBbummM|gAw|`K!}C}7!FA=7N(m96t?p^7O!&w zp7;-Z0{XHeSL_Vkgcfr;jDZm_4B}xhL_$vp0e5I!m#ApqtsnwYxJB7$*fvQWH*pgS zm}lI3`@Xf-Z&Aql_o)eE=fMmZ2?kK`2`FJKkQB-eeMqTni;a73{w|h4$htFkY`lY{CBU5{^+nh;!JxKYApPp26j)MC ze)B8IduAzlO)%(i5^E-)c=g39h<|( zt>u%on*3=4wOzc6g4Z0UupOU?C6EkqmVgW7n*O7zcRb0JDpt!ZRCerFjy-(6CSmdx z_vGvy9uo@pdZaC=@t(QzFyk|;?5JPvx_1H=Y&jFQ>&7n)CD4A;xv%|c<4HV_6SZS7 z)0ZD&<1%g|v#Ql`6E->aORTgH>rp1RSG}ZAd*I=a&<x z7r+x2w5;a5!r84*Uv`*JU;g+EFq~$=cm_VY`ZxH=kDU>^xC8x#sIu9Tb{E z&x5Rf3k?wJq}beN*#{JEKK&#EXBz>lrEGnJSxF)k{1kBDE6T3?smipgI7Ju;3vJ#` z4E)>U4&Lzk<$J2$aj!b`h$b9}B+^^^f{Z`N>|i($FKBrU-h?}`1#8@U>;B^kK5WPJ zpVYDAt6B$lBCJ25;B%ojSc;v-wh#k(LR+e`Q-5;on^0lccIlqEgU6e`g*UxalbAtx z(?Y?|gRUTNOoiE9@OGi*4rx=Vc5&-h9lmUiz%k~ZemNCyW3d)st%>dVGeHj)kJ4r7 zVTSOO+DBFzPx6|& z<-zTyCV&(7q^f5uq0keX@6pg2B$d}T(4XI-jJv-eG${qFS!rql`qf9S+8eqH1wRLj zAU9Vdqu{Si*nD*wn6zHfevchZ;ixIXrobmKNNT4hRBmTIaBVVZGzH{WosznUU0a8`M?}kk?N`26$ER(!@zJqbs(_u~4{LNB z`zKZg7H{Vhhy$595>WFyQ0w51#GbBT`MY$_IrP2@U5C$LJ5_C`=Flyw_Npax!-roA z{fuw++T-Xq_yjV*T5D!ruJ{fA`}yV&--muOQNu9u#c&+1tQ9>05j~ zg+~9btzU@H#h1n$^FPLPVAk%bV^gb41HiT61=awuHqp52bFmW@1=?9^(|G_nM7;0{ z3)-}tuu^-J2yCZDbL{_Vrh{q{(g`i(iQ4vX>&5R}kc_QgJJPLqv(XK?@9dY^E>_?< zsc0Xj*{^IYb{&I=h2X!gBJa0;_2Ar^Qp#Dfa754&^HtvW>Z;l0Sx z!MO;fx=`b8EhPabzO2SA0)PxXSiVn2uGodnA1NuZE=2228KgdB(g z2at)B=5{Gnwds#_}v=PuL4Ixrt|oy0MaD{`~k0j%LsAB;Wp zflLspg*t+TIlsv8he$}Q`!f)1K_>AHE1^9MhQzw0+@uFDJ_Rh`aejHy;y?BI8;aQS Ub3dBsGynhq07*qoM6N<$f;rrCApigX literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_off_disabled_focused_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_off_disabled_focused_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..05b0636d6aa670215c970ea77882e65d849d6cff GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^GC-`v!3HFKYIk}9snwn?jv*Dd-cB;)YjO~Asb63s z!yvWcQdE^i&t7vwF|h-TU)aiy-E%l9YjeCjU7FiBrd)V&idtoKj?w3?*h*p6#P9tp zRv8HU7D|X8EnHLVe_`(I-s|&USq5I=oyyY0o3oQ6IkP%i%YXYF_L7Z_x?Gw|COB<9 ze!aEEnM;#L?A)}cQhzpX*y$v}Vs@u>_Fu1U&%Mf~-vTOqsO2K$oOQy+^DW!w(}5of bJwxBQ`dUV-WK4SkbT)&htDnm{r-UW|dtp|r literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_off_disabled_focused_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_off_disabled_focused_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..05b0636d6aa670215c970ea77882e65d849d6cff GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^GC-`v!3HFKYIk}9snwn?jv*Dd-cB;)YjO~Asb63s z!yvWcQdE^i&t7vwF|h-TU)aiy-E%l9YjeCjU7FiBrd)V&idtoKj?w3?*h*p6#P9tp zRv8HU7D|X8EnHLVe_`(I-s|&USq5I=oyyY0o3oQ6IkP%i%YXYF_L7Z_x?Gw|COB<9 ze!aEEnM;#L?A)}cQhzpX*y$v}Vs@u>_Fu1U&%Mf~-vTOqsO2K$oOQy+^DW!w(}5of bJwxBQ`dUV-WK4SkbT)&htDnm{r-UW|dtp|r literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_off_disabled_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_off_disabled_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..0373d23ce4309eae46a9e06b37ba6c5f3495d756 GIT binary patch literal 213 zcmV;`04o29P)SfXcbP>$bUA%!Hj*jYKlf0!%hMN2kTKXQmMfksO@E`Q@Av3!B zocX(SDW$R2YDy`GirJO%0BgHc+w?KUDd&8b6b!JMgdqeY6@oz_g%ncw7S5*&d508I zC>AQEUg+-%z4zir6d0|-tJeByt(}~6=14IM23RdZWLSF>6%6JJBma0V);(!8#WM7l P00000NkvXXu0mjfNf}k6 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_off_disabled_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_off_disabled_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..0373d23ce4309eae46a9e06b37ba6c5f3495d756 GIT binary patch literal 213 zcmV;`04o29P)SfXcbP>$bUA%!Hj*jYKlf0!%hMN2kTKXQmMfksO@E`Q@Av3!B zocX(SDW$R2YDy`GirJO%0BgHc+w?KUDd&8b6b!JMgdqeY6@oz_g%ncw7S5*&d508I zC>AQEUg+-%z4zir6d0|-tJeByt(}~6=14IM23RdZWLSF>6%6JJBma0V);(!8#WM7l P00000NkvXXu0mjfNf}k6 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_off_focused_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_off_focused_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..84368b7947b76e2f1ea6390f4c4551d3f9b4cd10 GIT binary patch literal 249 zcmVB0!T-Ux z1m63GWC?vp4ZP1K|Ci`wHc@V>Np2n-(4E?i_m8TbK|j+aWm<=T4Q#mxM|3Eg((Lk7 zmc$cB0!T-Ux z1m63GWC?vp4ZP1K|Ci`wHc@V>Np2n-(4E?i_m8TbK|j+aWm<=T4Q#mxM|3Eg((Lk7 zmc$c7sCI2pl;l} z$cVnZ&-`7sIcHmI9ZD&yirI;A0&DrGmg!=QeM;#pX$YYQt3|l?-e06bFu7sCI2pl;l} z$cVnZ&-`7sIcHmI9ZD&yirI;A0&DrGmg!=QeM;#pX$YYQt3|l?-e06bFuRvK#p=2)%4JAE4jdPl5WHs|h1N1@$WFets|4?`*(ayS*80>X&%>-mX7S47S zwpXQCU*E9`A%kRbAs2EX7v6-{*MKo3;h}O4E(P!+TAd}Qpk8Glx$&dTMSi) zvv5N@gqsV42Iz$h$a)+T9S7k^YpII$X<4jIDl|YZWIPVSKN07*qoM6N<$f}JOd2LJ#7 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_off_pressed_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_off_pressed_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..aea407132e4d09b1a0d4e65171a9cd8968aec2c8 GIT binary patch literal 334 zcmV-U0kQsxP)RvK#p=2)%4JAE4jdPl5WHs|h1N1@$WFets|4?`*(ayS*80>X&%>-mX7S47S zwpXQCU*E9`A%kRbAs2EX7v6-{*MKo3;h}O4E(P!+TAd}Qpk8Glx$&dTMSi) zvv5N@gqsV42Iz$h$a)+T9S7k^YpII$X<4jIDl|YZWIPVSKN07*qoM6N<$f}JOd2LJ#7 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_on_disabled_focused_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_on_disabled_focused_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d4a06931b94d95aa41e4a5b84fc60fde346732a4 GIT binary patch literal 254 zcmV_J@FQXV7&rFMDKo*j>N{+> z3m5C5S)Nm~x?~d2#fGa8X)+Ph5)#=Bjh7ISs0JjiH$#;|gbJm!X8-^I07*qoM6N<$ Ef)yNP82|tP literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_on_disabled_focused_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_on_disabled_focused_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d4a06931b94d95aa41e4a5b84fc60fde346732a4 GIT binary patch literal 254 zcmV_J@FQXV7&rFMDKo*j>N{+> z3m5C5S)Nm~x?~d2#fGa8X)+Ph5)#=Bjh7ISs0JjiH$#;|gbJm!X8-^I07*qoM6N<$ Ef)yNP82|tP literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_on_disabled_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_on_disabled_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..93da97e1cdeec680ee496b8225538150f1a193d2 GIT binary patch literal 246 zcmV;}AnK8*w-KBT&MDaZbmk!1R3+nsfgHp)% zLE6EKMda=Gw7=WXT3dw>nD;&lJPVFBy1GAAcVlA=ch1d9KnJ>#f?8`<8bk*LDM&#I zK7+CMAbmp${#Ni5n)%^;T>=XW&mRx&FYT&oZ#!Ungy?q$l~TO)O3{%T9MyHb5khb& wCCdTNq61wiLEHqG7J&|0FN-l|9ea?mJ2xP4;#pq7zW@LL07*qoM6N<$f}kj2AOHXW literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_on_disabled_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_on_disabled_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..93da97e1cdeec680ee496b8225538150f1a193d2 GIT binary patch literal 246 zcmV;}AnK8*w-KBT&MDaZbmk!1R3+nsfgHp)% zLE6EKMda=Gw7=WXT3dw>nD;&lJPVFBy1GAAcVlA=ch1d9KnJ>#f?8`<8bk*LDM&#I zK7+CMAbmp${#Ni5n)%^;T>=XW&mRx&FYT&oZ#!Ungy?q$l~TO)O3{%T9MyHb5khb& wCCdTNq61wiLEHqG7J&|0FN-l|9ea?mJ2xP4;#pq7zW@LL07*qoM6N<$f}kj2AOHXW literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_on_focused_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_on_focused_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..5b50955d96e399a0ecd891c0b63b85848b1e5a53 GIT binary patch literal 285 zcmV+&0pk9NP)~LAHo&?69RoTkwr)30X9b1`W!Dnv^?e7R|#ylv+Z|h}XRi4M|@nQTM!5z%Fj!Rvuvu(19M%mjt_d jvPJoLgb-4-1c^KV?}X(=A=Jaz00000NkvXXu0mjf(!q1P literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_on_focused_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_on_focused_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..5b50955d96e399a0ecd891c0b63b85848b1e5a53 GIT binary patch literal 285 zcmV+&0pk9NP)~LAHo&?69RoTkwr)30X9b1`W!Dnv^?e7R|#ylv+Z|h}XRi4M|@nQTM!5z%Fj!Rvuvu(19M%mjt_d jvPJoLgb-4-1c^KV?}X(=A=Jaz00000NkvXXu0mjf(!q1P literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_on_normal_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_on_normal_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..a11532003a84195a66c5c6c2be57c2983ea6b927 GIT binary patch literal 258 zcmV+d0sa1oP)=Li@VwdE__H6eb7p|`5ep=p*?IX!=o9`5I&X=KA z3Jh1_fDjT>N{@^&;Zv9e2C!U&kg@F~sKCH<5@U?lSW}NY0oqU0$D0-FbpQYW07*qo IM6N<$g7-jfDgXcg literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_on_normal_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_on_normal_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..a11532003a84195a66c5c6c2be57c2983ea6b927 GIT binary patch literal 258 zcmV+d0sa1oP)=Li@VwdE__H6eb7p|`5ep=p*?IX!=o9`5I&X=KA z3Jh1_fDjT>N{@^&;Zv9e2C!U&kg@F~sKCH<5@U?lSW}NY0oqU0$D0-FbpQYW07*qo IM6N<$g7-jfDgXcg literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_on_pressed_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/btn_toggle_on_pressed_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..21d08591492070fc7f2170596bc27d11794127cb GIT binary patch literal 364 zcmV-y0h9iTP)f()%Qv}2KJiiX_LlIJkv>{f(w0~IQZ?X!+%z?1P zM0Q#x(z24IA}!Q#qvU9`&`36%z-qik4=pzi&fGX;3HBlbShUbcekl4R>R@UgjlVru z7YZ_vMYFSo{fS+>^ZcShWB`i`xsVIFa4jTT7xHh&h5IEud5nAx^q81A2v>Wb9r@<@ zLcV^wWC`{nBRvT3WYnjnQi+!tDetf()%Qv}2KJiiX_LlIJkv>{f(w0~IQZ?X!+%z?1P zM0Q#x(z24IA}!Q#qvU9`&`36%z-qik4=pzi&fGX;3HBlbShUbcekl4R>R@UgjlVru z7YZ_vMYFSo{fS+>^ZcShWB`i`xsVIFa4jTT7xHh&h5IEud5nAx^q81A2v>Wb9r@<@ zLcV^wWC`{nBRvT3WYnjnQi+!tDet_E)L!3HEN&baUbDFaUz$B>F!TPGX@@>rPPrj$iT z9G02t(J`I9aDUuoe@+Hdqn7=F)nb?5?LTGun3K=3P{IFE-29tBy$qhNelF{r5}E)< C_8&C> literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/dialog_bottom_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/dialog_bottom_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..611d538906ce7aa07ff88cf6cc5ccf78e729fa98 GIT binary patch literal 582 zcmV-M0=fN(P)WG$vw4FcCX~iP#ZL z#Ezgv#79#*s&1dojI+cAPJMQmkZrIiQwNJ5O)mOttk17mc8L&cvoMU!kQ_UoFtLbO zz!d-HXKY4=&$3fUmk1ZWI0ec-zs>!pq|Q@kJSU@WOzCRS5+-37>mm7R8Lg^F?GYkE zBoyQE_yMbobtpr21x*>PeOI?>bqDqY--SH~u7GQNNA@DjpN8vl;D9CDy?cy2$}4=} zU-<6o2fow#3cLa1FfU>%f|NY5;7l!;hc9Mfz6?Kd3>;!21TCTjzVTsyQiuOdGyKLL zkrJWzheFL)VX-6H)nFppRWZTmC)H8V-n8fBiNz#z9k9$5G%LYGc;b_$REAWCR6`m5 z*E%_MJ({2nS8v`qwS3&#TV=rb-Fv5+avqigH< znhH>dnQktv#{&`)VEGWO1G^aub9T=01LcnR UL6aF(f|Me literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/dialog_bottom_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/dialog_bottom_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..cf2f01b1f456820ba041c0a9d1ef3a80ccf0e6c3 GIT binary patch literal 622 zcmV-!0+IcRP)Ly$}0$;qwZgs8gxBCE_n{3+(XS)eXMe`V{u9>$(f`y2WB4h!PgqLMpBaZVAZK zAZ1SgiHPAZQxkWTjWKBoiV-PC?_V6u=(8b7YMN#^5n%%1DYYM1G&i7_kTUo}oNX-) zrxO8C*EN8>GMo}V-xfT1SM|u4P?3~3T3;(<>2drW&+06RKc*K`7xcRZO#lD@07*qo IM6N<$f(6SHK>z>% literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/dialog_divider_horizontal_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/dialog_divider_horizontal_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..b3ab49fccae410fa1c6ad7e5336002cae24b435b GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRV!3HF!2OrA@Qs$m6jv*DddV2%87!-J%%9U*k z?k>K)^PA!o1&<2(R|Sfiv(7zuCEnmzH0#sU{C#~-elGvzUwTJfQ&FjY!>xHQfJQKQ My85}Sb4q9e0Pd0}761SM literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/dialog_divider_horizontal_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/dialog_divider_horizontal_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..89f7ecc7e36542be729790d370e8acb7b71c150f GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRV!3HF!2OrA@QdXWWjv*Dddiw&o7!)|1_x_iB zC3iPz_r;_Z#eY{47E~MYcwP)){%ox?iTQv}b$Q;u;w8cV1O9s6J!#&y)=_ujEVC@2 ODGZ*jelF{r5}E*1^Csc| literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/dialog_full_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/dialog_full_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..fb3660eab1c5c380435a3cb29e836585a75346f5 GIT binary patch literal 882 zcmV-&1C9KNP)d5lfPH{+~ 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/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/dialog_full_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/dialog_full_holo_light.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/dialog_middle_holo.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/dialog_middle_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..13d2b62a87a608c964e7ec662be2d597d9dfcb70 GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^=YW`xgBeH$XkK;#QpN#3A+A8$($dn_);29I&A`CG z)YSAp7}(p}v#_w(+1XiHS(%xc85tP?Wq~q4^u=B|(0{4CbbG_Et(p#>Y*} zENz__*4#gp4U}{Dba4!+h`XEM literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/dialog_middle_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/dialog_middle_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..188555b02a01440cb2e98b75158600ee9133ad8e GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^NkA;b!3HE3v~!;aQaPS3jv*Dd-rn5E+hD-s5~vXr zn9itmeP*NPjr#t_6V_}A3{w1}`We&^vT>)7JyyOo``+}oX) zceCjBtmx@?;v5(lSp>iY3yS~(9qCuB;HZ6K_=UmXyX97`c>OY}$e2@)>!IWs2BkVZ%Y zDgZAmDi$(J){YY~;v)XYg0}N>0OXC};@3W`AITgtgw9(tBTNAE{6VHD>@ zMv$016D)v@j|Rbv8o>_#uz_OW&}5(0nl_^x3kuM48w4@;QXaU zzQEA$)QioWeb01FJ~zg=zVE;H`~4?^=(1-3fRhHTmxto^RP2V<>$ z1Mr0)K1BuAylX$4-n;?3oIM;Uq*~0Z}iF%e3^Ph z=&_`4)LZ49PCKbIQC28rY;n<&KY3;|0=RyEATyLQcs3-TG*hLCKRHpaP|Bc8kVa%n z6A&9gW+-Kl3EYT?T#t~;97-9fWueI)!Qo~oW!zkWP>~|JwPVYFHbih%b+C4FPMRmk%^gwm5rT)lZ%^&mycgSP)JxrOk6@zT1HM@ zQCUS*O+!b|z|hFJqW$~NUw;nGNIC`7d)?E;F+@W0?ZMNb%!UH42dm>xdkVCE?my%? zfpxK4^5@86o%bsy#fN{}`SJbwC+(L6=9xOqde(i%Ghl+O)U0_X>Xwr74)d;F;GfLK z*4^1z=s54P!S3|)H+`lt&WKp)6;lzWUo6+|K7*GzVD+(R-fxzD-}(7+*D+tYA|aU* z!uR5uTDZZ=!krsJ^%e^?GR#_aFm16G7fX|;=CC7+fb2Y z?61SgO5>q;;!?+1lf z&%#%Bhu(rpB-ifHBAR!`*jLmfOd>J%2WUSZEfHyTknf=9e*)pUQi-eX#G(KI002ov JPDHLkV1oYPfCvBp literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/expander_close_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/expander_close_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..19d4984cd55f74f62bb912b8c215507520bfd08f GIT binary patch literal 242 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 DNG*8$ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/expander_open_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/expander_open_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..056bf15e2cf41985a72a3004ee7dda4047c0ab04 GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^iXhCv1|-9u9Lfh$yF6VSLn>~)ow}Ec$xwi;xGCaA z=3{^LX-S$998JASO$trF{^f7tQ<;%8akUxaP5!p#HwXQkrm+Zex-4*OY0-G_u_EM% zYRn^jm02F&?N$92y^PvEWyWESB4^zTht7B{Vi(_`HSv$^VP3y!>KD}}TKnuTGUTo} zAlY`UJc+@*;*inWwGUX?U)=V0zxP+K^UdS~X4iF>JNG|eySE|CG?-J@B(S&JdjgkG r)Dd}u=>?qrogTH!6X&Z+m;C3yl<8#SfAn7i&=(Azu6{1-oD!M<#%f+c literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/fastscroll_label_left_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/fastscroll_label_left_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..36bb884a5f0d869980d385282d90e46166f187c4 GIT binary patch literal 952 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 LNkvXXu0mjf7z4ZE literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/fastscroll_label_right_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/fastscroll_label_right_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..142b88e680f2e4be50194ee095a1ee581c3035e0 GIT binary patch literal 967 zcmV;&133JNP)i{N-1B1rV%V?a8G8*Dy zh=U;x1{dN$93YWIBDc2Z->A=LVr2Jm>eJ-(5BTNDd){-tb52F6RH``jE0xvwKfk}G zD=RBzd3m`k$I{Z$!R+j8VsdhlYWw?tadFY)a=Ee`^Yim2l}f#un3$**EOBJBS(8qu zcac~h8@43aw3(iseiMtuss&4iotc^0OC%EEv9U41GGUX+q?wwUS_N#4V7ZC4%fWsO zzoDTa!IEK3JRV;g85yY+EEyJU*8$4Gl}IEaSTd}MMx*P1trsjG_6X(R#=yXUC0H)3 z866$n2!%oog5|@WpgXwT*VktWmJ4f!hle*&4jKi^hs~oL-0SV_trRR5)`Y|1t^WRg zr(nsjXuAr7gM$x)!JtF1+{7A`gKd-pw_y3OMU;alfk2>2uv}P!?qH{+bIE8o`obQ4W4!5{q_qbqSW7Sc6IIEnsT} z%ZL4mI-BzOe1avz8cbsEk=k>D<-;B!wbzkaOR!v6dwfKPa6zzq*b}7oR!2vNC0H)3 zJwBt>HVT#xn+NRO_V#v5utZoa7L3Q^dDhz6>JTguwzIQyr@6T~pi)4DMOuq)xBF>R zQ&W{-iLglPHqz=*yG4XWS_??)Bd62p5G)ZEE3Pf1)ukmZ5f*99qrJM1+FB`CA}rFn ziL_qQwjmMLUdE!f=1^NL!SX&P+MU1#(%PU;GelTST1QChO_$4M36=zFmjUbvthcnZ z)a&y%5f*7ZKw7UNtvay5g2kaYJFRO-Yn_f55n(ZD?PCWkj!8?0;#jbD8Nlb4Rcs5M z)oDW_EGDfzuh$y^tPUQtU~##_;G5RVwzjrvo#-aQqIccJhr%Gb0bTB3!Quj45t}W~ zvDs3kTQfvhOj_Tt+2Yj&IwCACDHpNX@)#w+Ay^_TZpwVcW{XRgl!>q?0|o54K0u3A zDOeILo-VOltS?v)T-HMnL|Bx8JQf6Z>=T57CBmY2{e%|lq8{5J!s2PDW9(vOu#060 zmI#Zqen5+LUJsfPVbKj7BCXd@2J{3U6Lx%j{2jg!)Y0EITv%8znM|fE$K2f9Ar=HF pz*aC}|2!gFIz9A2@4r9H`wJl)J9jK#@CdX?_w4P4Gc+&Q_R_;vNQSB zHrN<6-g~oLr8bFeZtIQ4r>f_i-ekVy5<1b!Vm9le*dqsT{t2DUX-%ybmoC+?pLOX} zofeS-?JZ&)<5oEq;d5L%TC5+CyIh* Rodi0V!PC{xWt~$(695dHT;~7) literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/fastscroll_track_default_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/fastscroll_track_default_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..017b663217ee19360a3c43640c4a6dd9ef6de5db GIT binary patch literal 99 zcmeAS@N?(olHy`uVBq!ia0vp^>>$j+1|*LJg3VBk1hHPQUr xXRfA2-OXv)3IQHY%I-hpuTI|b@cf#5*}q2x=lgrd?g#2(@O1TaS?83{1OWe3A7KCh literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/fastscroll_track_default_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/fastscroll_track_default_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..017b663217ee19360a3c43640c4a6dd9ef6de5db GIT binary patch literal 99 zcmeAS@N?(olHy`uVBq!ia0vp^>>$j+1|*LJg3VBk1hHPQUr xXRfA2-OXv)3IQHY%I-hpuTI|b@cf#5*}q2x=lgrd?g#2(@O1TaS?83{1OWe3A7KCh literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/fastscroll_track_pressed_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/fastscroll_track_pressed_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..8af63ba7c2befbeb2134dca5b5a0c67a6c4a517a GIT binary patch literal 99 zcmeAS@N?(olHy`uVBq!ia0vp^>>$j+1|*LJg3VBk1hRki-} xTCS!=-OXv)3IQHY%I-hpuTI|b@cf#5SxXZk^9`G_<^gpvc)I$ztaD0e0s!t+9&rEw literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/fastscroll_track_pressed_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/fastscroll_track_pressed_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..dde17cc0b130e644f10cb7fb4f1cfed4f36899d0 GIT binary patch literal 99 zcmeAS@N?(olHy`uVBq!ia0vp^>>$j+1|*LJg3VBk1hRmJ~h wIakx7?&h>?g#ZsHW%nQQS0`_Icz#X3taXo&t?aGrD4;F|Pgg&ebxsLQ0L_veegFUf literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/list_activated_holo.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/list_activated_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..5f50359b7f32c3ece0c528f6f3267907dffa9925 GIT binary patch literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFq#-1*YAr-fl_8;T~$}runZ!XJH zcb@P<@Qa59$DVe^i4qF~uY8>-JuSb{{^9kFJ?8S56NWVS7NY6#TM;OXk;vd$@? F2>}0=B254Q literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/list_divider_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/list_divider_holo_dark.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/list_divider_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/list_divider_holo_light.9.png new file mode 100644 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/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/list_focused_holo.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/list_focused_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..c98c2168f9a68b2bb98003d46160133ede24ec12 GIT binary patch literal 116 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFq)}AhoAr-fl_8;VAP~c(SJ-K?v z{AP-JuSb{{^9kFJ?8S56NWVS7NY6#TM;OXk;vd$@? F2>}0=B254Q literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/list_pressed_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/list_pressed_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..fb9f0ea4cf138b7d95975a5f3cbc4a711f3227b3 GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqrk*a2Ar-fl_HX0_${hZ4GTZjZ zdJOBUy literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/list_selector_disabled_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/list_selector_disabled_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..33436bf500c84ac160e2cedcfd5914e5db9afc66 GIT binary patch literal 114 zcmeAS@N?(olHy`uVBq!ia0vp^{6MVD!3HFkzrK_Oq%1vM978H@y}e+_#h@U-e6V`w zkIz%JTbVf{@)Tm1c`|-IVY1^6-|k!8N0UCv_q2B&O)BhaJhmjaoWbj+@2{`3XT<^y OVeoYIb6Mw<&;$UDJSd6) literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/list_selector_disabled_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/list_selector_disabled_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..cb4a044a1cf52050053708b6cb4b59f8d1d1ecd6 GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^{6MVD!3HFkzrK_Oq^vw$978H@y}huJlfi(8+0lQ} z8~dm1(;1xwmee#_#V%%gH8Hbbr)=3)@$RFK>?Qbxfs_byujlP|3>lMJ>tu? literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/menu_background_fill_parent_width_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/menu_background_fill_parent_width_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..4d9974879373c51b4a0aa79a77d9deb53c6c8172 GIT binary patch literal 553 zcmV+^0@nSBP)}$e2@)>!IWs2BkVZ%Y zDgZAmDi$(J){YY~;v)XYg0}N>0OXC};@3W`AITgtgw9(tBTNAE{6VHD>@ zMv$016D)v@j|Rbv8o>_#uz_OW&}5(0nl_^x3kuM48w4@;QXaU zzQEA$)QioWeb01FJ~zg=zVE;H`~4?^=(1-3fRhHTmxto^RP2V<>$ z1Mr0)K1BuAylX$4-n;?3oIM;Uq*~0Z}iF%e3^Ph z=&_`4)LZ49PCKbIQC28rY;n<&KY3;|0=RyEATyLQcs3-TG*hLCKRHpaP|Bc8kVa%n z6A&9gW+-Kl3EYT?T#t~;97-9fWueI)!Qo~oW!zkWP>~|JwPVYFHbih%b+C4FPMRmk%^gwm5rT)lZ%^&mycgSP)JxrOk6@zT1HM@ zQCUS*O+!b|z|hFJqW$~NUw;nGNIC`7d)?E;F+@W0?ZMNb%!UH42dm>xdkVCE?my%? zfpxK4^5@86o%bsy#fN{}`SJbwC+(L6=9xOqde(i%Ghl+O)U0_X>Xwr74)d;F;GfLK z*4^1z=s54P!S3|)H+`lt&WKp)6;lzWUo6+|K7*GzVD+(R-fxzD-}(7+*D+tYA|aU* z!uR5uTDZZ=!krsJ^%e^?GR#_aFm16G7fX|;=CC7+fb2Y z?61S!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/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/menu_dropdown_panel_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/menu_dropdown_panel_holo_light.9.png new file mode 100644 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(f$Q*=n)K3Oc_Q5ooM84c|9U4fC-*J8Q3YO%v~++&PWU+ zJCO*22UdUs8sG)Az*|abamNOCuFye5Vn~g~2Tay=z$@qi7fgT$reKybrrd49UAx@f zp^Hg3P4+ejK3E5B&+~qL-@kw$V_d@BLkGIpbkpN6it#ak1!_ECf&1w!oUGNfCg5F_vdjtYc0(q;5Wh?4># zPFEqUTOo9Qs0qekp-_kgotkviZ`}xs)y4|mh%w!){Ht;2Z^RrN6bNykOX3i9;DT?k zQy|2SF77|?5t#U!r33ol18fusv7t+!ZbCLh6?DK1tP}{bqDzNv@eq;|WEq)1c>Vx4 W7EYZtr-y9-0000DwiL6VM4Af)Tg{5s0sxh`o;4JH@C8 zaXW86bD2osVix8?J3O;-`K*X6@3Lxxi z*l)!DL@dA?I2a(}z$^=y2uE^{cm+EHMC_PFdXI1~ic5mclVBk3XYx4Hr vt@#!1Th@s&DF!g!N<61KG4|NML%VtYD#``UXSg;EsE5JR)z4*}Q$iB}+bkZG literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/old_switch_thumb_activated_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/old_switch_thumb_activated_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..86c6925060ad0ddba44ed0bcb5852f2782707364 GIT binary patch literal 351 zcmeAS@N?(olHy`uVBq!ia0vp^W}9ba4!+xb^miy?0ZfMBB&b zbHsb*DDiZ1Ox)+z9sS^ffQbnUFK=V@{e!Lr!b$>)6BGpYJ5Kof@UP$U?2>&)cQwoX zSj(>W?yZZa>b442`?}U;|9^Kce`~g~I%1)jp z@i_u%d&A^CIX1_=X8e7SGjUt?+JZinmdN#AJHiT_W_*nj_W+T>GA!yXH`jgb^Hxzj zQ?*v|7EtN6>{vx^AZh#1z(Vm%*;@V>Wf1plp$O2>-PhFfCbSy7-a4;P24u%I-Ay2p z+X`$)?L)pupq1H;d0;!3LxN^}jPjntqTc?|f!XNjv}0kgzmUWSsy&)w63)^VWN}Ad$}Bz-P}qnjslJXMKSkl%E zBH6X3jWzl;BlE*68yvE0AMxB2cviL6J%=-$qj>i<@pBV-6W3j@I<&2z&ER@=FNAk& z9gw#@yY?{?Sg|-yt8vTDxa_7r%`+dP*5435Cl_X}y~FA83014Lab2OIsyc}`C+g(B oH_u{scCYHLdNBRxCiA}xvC>H!{_w}d07H<$)78&qol`;+0K@l~W&i*H literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/old_switch_thumb_disabled_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/old_switch_thumb_disabled_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..adaeffb9b382913d9be45e1d04be2563985f3616 GIT binary patch literal 301 zcmV+|0n+}7P)Bd>LKwaQ}TwH81s z#Hefat1i7It@Q#+AeCaIwJxq!pcsEGFGg7F3I>7&h*8yA0f`giujR$aYOR3;i4oPh zfuUeQVnnqzK!U|cYTaF}a50ivTVSHZNNSA)ixMNKwF4$vOnI$`uN5h#vX*BLOp=)5 zT2C+*EKSVUIx4GmaJ6FBzJlwG@PTieCEe)*y9t^`GCw<$00000NkvXXu0mjf{tJJC literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/old_switch_thumb_disabled_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/old_switch_thumb_disabled_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..ee7a22c6231a928ec012141c1c832e46fbe2f18c GIT binary patch literal 280 zcmV+z0q6dSP)b5=`YMru7( zD?!Xat&$)~%t);jfHbjeYl$;KvRLM|UaFNS=B$>)oYj)pPpTl-%xYaof%HwU;9)cP ezz<_G#OVtc2yQP=|FC=j0000}7ba4!+xb^nNey>A;630G% zmswb%spP5pN-rv^MInQu>47;*Q}Of*LcWeJEP{?5;R)Z^^*?+Om6{`OD1T7g?scR7 z`Lab*gt+%K)$ez@{44C^lDn%`SsjxQ7B0^?Vtn$lJskjlQlV2yPboW+1PNwtduQuDt| YWs{BbeL^xe0)vgg)78&qol`;+0E~y2Z2$lO literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/old_switch_thumb_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/old_switch_thumb_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..84d18fca150d47a794782e8958592da9828a45a9 GIT binary patch literal 330 zcmV-Q0k!^#P)9&fN+gOw3p-ITzO~Vq^8Wv)oGigx59frC8F0gD2NtUvl~T0E6>VTR z>3^7 zM=VvXIgCM$Sh`w|eJw{UU9B^aBbKh#6YPpPV(Ds4z#Or3wVq*5%n?gh>m1A#OIGWp zujPs*t91cZA(o=nE9{F^h=s591D9YGVkv69!APt^EJdv;Se00UTJLZmRwb68))iQ_ zSnygOPAx|)ZmnyuCb7V^KH*TTS&Rb%xP?U^Zopc_`dS7<*b2lztL{%~43j{NHub!sak39z+8s1)?wi2wiq07*qoM6N<$g2sxBNB{r; literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/old_switch_thumb_pressed_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/old_switch_thumb_pressed_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..47144d282bd2eef51ee8d594527c185d558e01c7 GIT binary patch literal 365 zcmeAS@N?(olHy`uVBq!ia0vp^WomvO$rh$-Qfy5{>k6pk()5> zs${`~mF#hKZ#!0??w%-E|9Ai03Tsk>1w% z+#&IK24{N9(&%jVqa5DbudzOBH9i!y*7S&8m*BL#wca{hK*^}rqSYF15xcgo+n_QB zBwT9(=55pg^0L;N%PcTFJZWud^R|Mth(%lP6?PmG6suYrUD8tA(i;1k*?mRdh6~wu z6J0IbBVKIn3zSV>VCz+z4sdPHHczv+mP^x2V3Pf>dmq4VNWZN z(s(7UKBK6$w~l);TX4#qU^ypl?na;gSK0UZP22yHeQJ`-=R0}xHGsj$;OXk;vd$@? F2>>nOnvVbg literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/old_switch_thumb_pressed_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/old_switch_thumb_pressed_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..06edb98a3aae78a87383e173e6709e4ec335934a GIT binary patch literal 375 zcmV--0f_#IP)(sM3}p^4v{6o+^uzmHQ^FruGV_R5wc{Mv$d|VAzU)d(OPdfMy3cez19sH z!YRVcuJw)+HaE4qFW_qoAw1rcInO*A> z=g3uIhSz$)mT>AY9+*ehP}CPLP^)148;jcdM<80}hz5(h0 VhcaN;6_Nk|002ovPDHLkV1jyXsUrXY literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/overscroll_edge.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/overscroll_edge.png new file mode 100644 index 0000000000000000000000000000000000000000..4c87a8bce61f3b061222e3099208d04a0d3a938f GIT binary patch literal 903 zcmeAS@N?(olHy`uVBq!ia0y~yU;?puIM{$BGyBv;AjOvC?e4fG0oHO z?uggV4-|Xzs!dr#x^#NN>8gE7)8n51x4WJlar~CC_17Hlin>1gj*W7WxDm9-m zVavb#Z0mI6TgJCVe(h&?!}!PK_Qe$C2Ki;TEv0Y0&pkKyrk~k&kzbpmx$B>ApT7Kk z5&x1e^UDiOKe#?PZ5yrqqav~9;Q^;6SC($JZ;=uP7cbvauT}dJ{d{+E)vwQ0@f$?C zFN<>*JpS?K@mdR=wyw>LeAlPbD2=o90do}KW=yRfi^_cx$&ZE0w=bHd`*A&^Q&yc|M%Y_?$A%M{wzY}{;8KJCV4OWVjxsfX-S=k5#mkS_kWjQjER z2Y=@`KkV6e?ZN-VdCYM?viFr3N~Syynmd1~%0VZE&%)0$j|NJaWt_;maK7`-`oqU( z-dwv-?&8)jcczEs7_OVuv))hs?WVeA(YOB3I>DE7KW?5`&P)L(4#gH?i62FO7~Sih zeYxS1_ZOH}RZCnWN>UO_QmvAUQh^kMk%6J1u7QQFfk}v=v6YdLl?jk*Ze?JwR4-sL ziiX_$l+3hBObrI65DiPp4t)b^kObKfoS#-wo>-L1;Fyx1l&avFo0y&&l$w}QS$Hzl Q2B?U^)78&qol`;+01pw9`v3p{ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/overscroll_glow.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/overscroll_glow.png new file mode 100644 index 0000000000000000000000000000000000000000..428d8b758a9ed81b9ebebc016f9b19376122a01f GIT binary patch literal 13556 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 Mr>mdKI;Vst0908e$^ZZW literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/progress_bg_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/progress_bg_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..f2a2a77632782b280c4ef5d57b7e479640476f04 GIT binary patch literal 114 zcmeAS@N?(olHy`uVBq!ia0vp^Y(Ol;0U|59*B=E^mYyz-Ar-gwPCUrTV8C%CPyP9e ze~*ti$v@q|@mJ!6c7X!d1-9=ET3Z~Q74Jw-yWMVOTFD;&@TZ0Y=Nl=FJB2Ls#ejw| Nc)I$ztaD0e0sva5C1U^p literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/progress_primary_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/progress_primary_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..b86f4b51dd1490095a45f7b57ba78039fd67cb42 GIT binary patch literal 559 zcmV+~0?_@5P)R5*>jl|O5gK@i4&Gqd~VF2Ws& zCK^S=SZN`mb~ZK^mKK(N7AyTm_BL7xHiBRgiIRArA?EIq`}6MZSX>Uo+*t^(4@@%; z`|Lb3?5wyuBH}ay0cc7bz_mf~{{j#HbnK~f_aV}`1+Tv!%66TkzCNM-x#wK$@afx{ z^K8@MbO?(Cc#d4%-Icgh+P5=+)#mB%C!DH5#2y7&I^R_|;gZ`=wmRVa4cLBKk7P>!>@o>oaTF|YJBblrhN!5Y0q$*!l xy7}jls#*dQ4ocnnYs5(Ho`86 zCc27}|9XYy`m~5+%ukhBcc__T#ZfXox%C31axTjJ6sxguHmyGJ_SSf)K5>aisqkD^7-ItXY*uv(G^APB_+!~MbG zVC&iKbjHE@E0@iO2R8oRSCxhtJ*~$Y;;Mw@dKh{tv1AQac}ya)aw3!}h(^V$f)uj% z)~i-$3kU!Y-t2q;^n|;T5~hej(mcW-8-ispa8ng?+{95%Vk(X~D7XNc@Li@2<{fAb z%Vf1v{+XYy{Th?0|Awi^tk~(?tXp}Rm00000NkvXXu0mjf_HqHy literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/progress_secondary_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/progress_secondary_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..93fd44cc960e594045275ed59fab0b01d3d05ec2 GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^Y(Ol;0U|59*B=E^ww^AIAr-gwPCUrTV8FqA_oU^n zT=!RU*B@yI1id(Z!1jy71Qr2xjjgL6^7#wODn0jdJsPlP!*Z+t54>+IGE=+n(K#*t Rzb()p22WQ%mvv4FO#t>ED7F9q literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/progress_secondary_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/progress_secondary_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..c291be2007cd9b4cd0b3d61dd64e34f7d10ec640 GIT binary patch literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^Y(Ol;0U|59*B=E^cAhSdAr-gwPCUrTpuoetIrw=& zw0lwi<_F6o0{@s4%$E`IVmWcREo|oD&=pP*@?xEfT;r7Hulm!hUns+Mfkl0WYmevc S6BmIdF?hQAxvX1vuD%~)y<^CA$U(&Q zqM%48i*>7r<{7b=T^WJ}mg^2F)g?|yP>$e{v=H~xYUSCZv_Qpk5)56MKX-lq_R!S2 zdF*d^a%7?-PyDo(zt^VrM(gsE>iF|~Tj$M(N*ww5`Fn6o-$MT71|g3`e$~9sy^-?v zd*y+12aau=s`UK--@ndXr*(TC#?3UmUoBo1X>QMdL-K~jwoMa0_dlHU$S5?A<97~+ zFhuOYXM5X<#<`8X$=a=Qd;VPEC~NDzZLuxr#d5d$b?nxMkLAilYkqlNwSF=KjAO;A lAHWLbd|(Pic;VM(@hssl!eza}w}HXJ;OXk;vd$@?2>>1Kg=qi) literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/progressbar_indeterminate_holo2.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/progressbar_indeterminate_holo2.png new file mode 100644 index 0000000000000000000000000000000000000000..d2d775f6e0d62e64439007e4c81589cf33367beb GIT binary patch literal 370 zcmeAS@N?(olHy`uVBq!ia0y~yV2T5>1vuD%~)y>rm(u!BhJ z!w{_?-4|{LU8B$3a#ift(~78(nZKyJid&pBFK73T2VZ_aJg=nEEzCE)k>@fa&=?3f z(8;qtzFJ-PS9sc{9o1Fto2Ob8&a14K+rgFou(bJ{(S4IWCmvibOxv`idf~f^IZORa zW|kKP+^bpMecE{k$NWS4M2*iIeLj2mbjd$!;kV@Yp--RF^3@h`@m%%W4+PW(%TPPazG*A>FVdQ&MBb@01%v_ AAOHXW literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/progressbar_indeterminate_holo3.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/progressbar_indeterminate_holo3.png new file mode 100644 index 0000000000000000000000000000000000000000..2aad8894300dab655825e137fd0553c7d1fe4119 GIT binary patch literal 426 zcmV;b0agBqP)6|u;0(dcVn}}Cg`{Z! z00000000000N_BLUp|sQ^&hbtoBbGL4od3<<(B3w{C)lO^~baDJek|0;-yj1f5A>H z$N4yEoH_IyTQ4ZLtYNjFDSRH=;Hw9 zY`1<|?|Emf@KSh@{((_$sqpHl@UqottC6&2L%Ee(Ta7(!H9B1Ha6RdeGUZlo9j@=` zaJ}m!Tqi;LSw7`fZe1tQ({&OqP<4SS=^{$Xt=yWk9xhM?00000000000DuGe1V^{g UUjbF%+yDRo07*qoM6N<$f_w1Cg#Z8m literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/progressbar_indeterminate_holo4.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/progressbar_indeterminate_holo4.png new file mode 100644 index 0000000000000000000000000000000000000000..9a82f29cc05b5a6ba64864845e9b8eeeb98c75c6 GIT binary patch literal 427 zcmeAS@N?(olHy`uVBq!ia0y~yV2T5>1vuD%~)y>rov$x)=? z;o6=JOLiH4a&lh3o1>~k)A40t6_@^-9v&l(+#MH=9Q%HF|C)1pdh-rfBpka8GzAJA z+~e-sO-|SSSE2vjTz(a+$vx-;IJZ+V7fsV{6?#kOh*TgQ?Z(aBuAA&jtqVpyOY&mem- T{zgvp8<3c%tDnm{r-UW|(!0m< literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/progressbar_indeterminate_holo5.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/progressbar_indeterminate_holo5.png new file mode 100644 index 0000000000000000000000000000000000000000..faffb27a383cc9ddc7a2c6e11982f3b6d7673831 GIT binary patch literal 407 zcmeAS@N?(olHy`uVBq!ia0y~yV2T5>1vr?2Z;er7l`IcfkXo zxzZ&;e!&ckOf0PIoLt;IeEb4plCpC0ib^^L+qUo8z4!N~I8LCl>z*!-Ar-gY&N#_+ z*nr1HI{kj|>YK0r|34r0MCkFQIm-fU-fKu_8Za9bE4K(Zc{n_J82a!)+QU-qjVpPo z1vuD%~)y%X(qI6$KH zV#w>ITkpxO;fTv{Qz#KQciA#x;nj;Bk1xb_1ZZik;QX?|F5=*JhtHE`JZz?_cus<% zznfkjejT)))qdV&qng5*vB_NzD bzsI=x^KbP0l+XkK>s`c? literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/progressbar_indeterminate_holo7.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/progressbar_indeterminate_holo7.png new file mode 100644 index 0000000000000000000000000000000000000000..4064f319aad903815e78a028068cbdf0fb96ecd6 GIT binary patch literal 390 zcmeAS@N?(olHy`uVBq!ia0y~yV2T5>1vuD%~)y>rm(u!D%h zMGetR-B(^O7EL{O%T@9II;ZaWkIS!!&u}$au^>%rX7R(6i>^Y4l-Y!qPgL=o1VKyW zui5P@JID3&o6U;b>W>r6W~h93J`*l_{q@~*dWUUvxMn_2K3An~@_Ih|RH<{vE05O% zoZhorK4~A9#;+QqJLST&cW>akJ;7}o@9UZ~sXI7RU%2<(|94fq z^J{0_knvY(eXY}~{N>G|+-=#h{LAd$o67=Scm1SoPsQFz?D{qpjrKh=^to&+DzA2g z_dW;}c-HN-UaB^xzyI~Y1vuD%~)y>rm(u!D%h zMGetR-B)f4yTh!q#anB3t(frW`43UOSKK^8ET%02Z54WR^th%aRvd9S6f#N06N*eW z{Q9}KG;D(Xb*|dK242rPB8%Q0`6IGhJ-)s|a#~{Ogw(j}i#9)SEnjPpFzsA)TIYYG z_v_})nBVly{ZoGE$3ppSiSj{=-x6nE-^wR`^VjdFg~xT?*3DcxH!>;j^SfJ}KQ-Ug zE%_Z?9$K@fMQxAhl9R7*wS;baxlXjos_puOL!r|?l^?(L&){)oIndgkZR-5WZ#;$P zt@>dhs?+*fr&XAzgk$^7h1=xM)ZfdG0$Chr)3-%kK5tLKW7dC#O+RP8ICgrmn@tu= zf7gLOK3`T`JpHv|=RLcJPcsbch4;q1x8RgfXY6BU_-uT!P>3(!DC4RJ8{C0XG7Gd| fL7?Kv{F|jl`m1?OWnc#|co{rh{an^LB{Ts5gKn}I literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/rate_star_big_half_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/rate_star_big_half_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..ac15d6a8ff8898bf5533d134c21484fbdaba64ed GIT binary patch literal 1184 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 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/rate_star_big_on_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/rate_star_big_on_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..0cd2fdee0cd166b9863250a6f9b1b2f21f924226 GIT binary patch literal 1155 zcmV-}1bq96P)5000C^Nkl2UXAy}#wQG66ci4q7x+ob&? z3ALzcqhcOLW1=yd#x1L<@eyMl>%KGD-OTLHd&ckJ4Wt_tH?z(Dao~eYZsy$Yo^!tM z+zfd8{9li0nuCGyz&nX1l4O|XV#6>`;pYj7Ci7lE)_<<^OZOGs*opV#L=hp(tM-Vt zZ)^Rb7D2s;_q2rdil`Ys9=aRwd|K+#3!m~$x?ygj(j|h-#}7hE#j;9|IQ^2-+v`Ld4I)CAQQ|bS?+2Y| z>bJ{5$QTty7uMD29Dp#Ie=sKt*%O3A~JQU>*u+dJjzyvJQF zlm#LXjU`t-(s@U?@m@f#q;CjKUCO04#BqeRBEO^+!YF^?75%uZ8+)<$8ajMWGHFmp zVYOF$^xYkf+j7(2wGQ=PS>=taxaN&4t@KE=3E?yJ3HeHIA}l+sT%TWY%iZ6Q{8u8* zD#Y7>xMY%)!De2yWACGst^Y_Bm<-khIgO!b^C43T9Ct9XMDARh@KAhF&M`o5?*Kj$ zR3rCvi_o+bCrXbq5o-8M^x7@IbcfBd5x{GkI2E$C*@6*m4XjexA1D|L3_Y6uiT|sA+i{KhNf@zp$!mwcFd;8WH&Xa=y?TC`6o-L zY<(!p#v4Aq!WFrT{y5C6A<2sOj7Hh^T=R%_Qb;UhzCxKBgGv>$oXPwpF0MQFSy(Gx z4Qa+gW|xiYKt^(+`ol7r88ngSm&Yb~A`jENK!=IvbzytdEP5l%f%%m=Bli$vLA**d z9M^?k$u(bUVz@eFl(>xaR~X!phJaf^&ygVFL1yAVoLoa=AbPU}aB8ykGp$0?_PUP1 z%f4lSCK`(7#mYxKRhXw4zrK_H@G>c`44v~*3kM%68cbwGr zu=*#df`Zb-EouvchyD}RrUA)OSxmuIHg^)3Y=z7a2Fu3D?$v_^ynXucJO|$K VF&#QOdu;#!002ovPDHLkV1iFKI>Z0~ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/rate_star_big_on_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/rate_star_big_on_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..88d04908e65b7910604e732c377667e665d4a6a0 GIT binary patch literal 1207 zcmV;o1W5adP)5000DjNkl%d!;zNKfsQ@=yftvdc>QWhkrX880_)*RIw(**`vapS!*L?)&|I z_Wbxf&vxHEyNf0Or~tg!Qy~Z|!6U2Tl_u6y#KJ_~B2`gY8&5=)z%v<3GUkMtRjt<6 zPcKNb@?L>wb*zZ+Nm@R~w06%irh9Ni@2)=p;mXIr#e$4R&OE%-j1!)?qNLR7?B>J$NF;y{hW*CX z+m7%=;u#ZN=4qVpw8wyaelti6X)y_=4g|p60{gjnO;FFusd7 zlggj#fX`R~oQ-4^RRj0C)$a#zV5Q(luZ)9Mk*he|gXY8nqQ zzJZ%aAQTSo*&nr)%Xh~;Sh9Y6k1VI4jy5y3k_@|tN=bhngmSS!nNZ22B(ve}ysw*0(&=2&aPA6J37x?!%Gm(uJbpT_Xlr!3`;NXL6iL%MZ=clmz!tc>jP+KqQ~`QXa{99L+SX582QK`Ehu$Ul zkzC5twR=gaq9PE&FqX(ysH${}>h?Q2&tAig(IkQiZ)-m`s4A{#1_{7kM*mw9%OI9B z)sM_;vA*;90Mj#cI~qio?n@))jlPqRL+cI{K16? zg2_G_nL!aVH@^G8W#KZ<3pOq-R;;^Q5v{5QU#Bq zOA}@-Y;*2Ae?1a1wzi`e6?sML36jhYRt$HGlNfC)u{0wgV`=O@1s-{d&5x+rBq|gacQ*1iezQs>_%r-|BcYgP^nSYQx?A5mEH8wIcO6jp`U?jx-3q!)UX1_*(U3k ztnsnp7c5!mUE0bOy9LU`DhOmgr8m8Z4b)Z(_Z4YmE5NsNsc;y|7-um5hweba=2Tz%!%R zag!H#yaH9yGq7g(hddC1m+Vw(<_b{U53yro-dHyGp5e=t^8zyr2TN5K&uzj{!nnHq z2%VMtDtKcGJ0yiO0-%QeHcL76(aqS8Z0%nT!Z_*)3~LFT3fB2F~3cmmQ|0%z=aG0Zl8-f!9hi7cAA?H&~f{R0m0n}fG99y-?RT=e*^Us VUt^lk>`4Fs002ovPDHLkV1iK9P{9BI literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/rate_star_small_half_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/rate_star_small_half_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..09df0a45612db19859eaae0ce2b640f48fc362ec GIT binary patch literal 517 zcmV+g0{Z=lP)YxNe^^mG$Y8q-c5o-J1E&{pI6Qfr7x6j-5kWi%B7#h8 z6IUH=rL9yg9!fXVmDDAxx)`--nwTc<`K?q?aFLZg_>f=n-tWuHdyL(nl;$~@Vh5U= zp&g29egLB|4$fi%8jdr%Pgc}0>ehd4&U?48cajW$-xpC2g5z(COW+|?LoL)n%h`oB zI}jAp%j+AerfG}#=7M^tEv$V6rA(ptlq1yrQ_1;u?R;pRMJuKYIJJR*7N=II=}N;!@rUa!~m z`~4cv^9cmZpr;8OH~+Z`yBJADkzNO|EK37{KsJ?1#n3#0wKZ_(d6dKZ zg=A*m<+&Y@NF;d7eFW!yr{DAW$GPCb4&Hn{$Stn=bNPT+EOv;wA#m6QIL{4hsyF=S ztUn^j+mgN|$)}NMG%AHcp|q~+bNL&y3wR=C&2L|Dn5Vc#yuW}B!!V`=LD*GQHHi0T zb^)(ULRa7e>c_woR6rjggvGPVE}#yYpzMyhQg{lD%>NvhL}j`?doI^800000NkvXX Hu0mjfWaRDV literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/rate_star_small_half_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/rate_star_small_half_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..2f770bffda54a585b09e86973681eb154b7411a7 GIT binary patch literal 517 zcmV+g0{Z=lP)N^j+A*USMbSElk#L0wfCC8t2jBsj7&om~x_orKuk%ePJU!Mnj=@XFm8Df(}yzW)hoGo>zBK40uJgh;PH6;E|=@oZnr;aG#V$4 z<2}%m5&B#4FhwIr(Y_>JIq{M1yTG>qMNt8p&Gx8NDp%p_%}|>ZZXZmbhUgsKBKLeB z!2&v+ZWloi#cxhpojqhZB;CG`s_l!HHRta0mw?e|Jceu3(_@D6hY<#|7X0|2d@PJF0|vn-e-hx)=Rrds=o}v)fWNa(tka2+Gzc?*00000NkvXX Hu0mjfHR|+a literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/rate_star_small_off_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/rate_star_small_off_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..27cd0495b5c249f93bb009289c07339974d88572 GIT binary patch literal 538 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6I14-?i-EKU7`vU!wgU;46*#5? zX|QUBm}6@X1364d-tI08|J(b|>}OzLRPuCj43UuRJ$P38aG}hBkLS;;yxk;gvqmOt zmRhEUsycgpqrKzA#V1Zq?7kDb7L|?f0dZnq_^e z>ipBBR-f1)nAsy17I9do_raN;o0s!=D*GIJzfOLJ^JJ-68xjupH6NU0J;m~zc)7$f zc5AaWGg!2}kL6vP&$sN*#wU(PlVe`4^st)pHT-+T(%1_HVb{M#EO@ZCf~WORa)q}0 z(Ue8ITDg7qT}afii=X#IgsW94prR*i`pZdDQ8V}TYm0EXDxI`R``NitI`*OV?^9hb zgt;?<_=__izcHOuXX)RrAGGkyZ8Ncz?&S{y`uFaZOy06(<^5;PU%YLP_0}d&^ZV%{ zZQPdR^y=XO*UdGDUG!@|*~=e%z9;;d+nzLF*r}GdMwFx^mZVxG7o`Fz1|tJQLtO() zT|>(dLsKhbGbt)x7$D3!r6 iB|j-u!8128JvAsbF{QHbWU38N5re0zpUXO@geCy!oXx}l literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/rate_star_small_off_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/rate_star_small_off_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..f009e2775b45a83c9220200319afc4c19a5aee57 GIT binary patch literal 523 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6I14-?i-EKU7`vU!wgU;46*#5? zX|QUBm}6@X1364d-tI08|J(b|>}OzL6!vs+4ABTqPEZg$VW{zVa#|usYDa3q;k6D< zdn31ZJIZZmy1geilzqk>Nr{Q9l9CpZKO|iwjz~UnDSmb*{*TYX9!J3w!i-%-h6aWV zoeI~I=8CRvYP+I|8+yu!UO_QmvAUQh^kMk%6J1u7Rblp=F4nsg<#rm5GI}fw`4| z0i(s9P!tWh`6-!cmAEw&q_VsOYLEok5S*V@Ql40p%HWuipOmWLnVXoN8kCxtQdxL1 R)dr}D!PC{xWt~$(696OL#6AE3 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/rate_star_small_on_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/rate_star_small_on_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..bf0f4f1b0a4f3309ab4be0b8d1d3818610292c46 GIT binary patch literal 496 zcmV25JCxJ0u6|>fD!~G4gyN#_Mlgs3@gNZ-gKP)yo2=DZ*s2Y)`_UuL zqNV^TAklv|3WPBJq)U*<;+0F#9NKuT-s;s4pR>1x%O+8&GD`g?jtA6s4{ZDno}_v6 zNh)aiK+MOOKq`tO^Y`wHN{!i5q&A895auo#2_+9Xt(C7oy-wY5*St>}hbEJ1KfgH^ zx9Hq5zaCa^K66y~nF<)Mnmot&P&dvdfN%Q|4jN_*+@(VG)nMYvb&F=U(UJbv{rbT( z=Ys;Gl9flH6wtiq$o>R_4%t7Gx;x)|qm4R?qgijY?OMHi`!Bq{eecCuv;E9kyy7&S zn4Ce9(Ic+Sp_z7!5$j@50MoIBd-wSrCup(GkTWO~C87o`$m0OxCmPppk|eT(yh6?( m**~7pZ}vh!8c1jUGu{F9%CobYTPCgm00002_ zCg>>y_!uV|IXPF*#kx85^ue9RboR`cuiu!Jn-3N?)|k$p)iXyA(#j4KqIlKNUkvmpXVmXx>7GiJ-XwSiwv*D{9VX}?)% zQecx|gITe>YZgwQfJfFKxN~Y3wvo;~+onjuQ(P53vUw6Vw0O+Fh_bzYav$v!Gxzz4PB(0<%LA{LN5KuARGqSj5`u3>`<-F wU2%l8IC5x&nEA;-%&iA~bB6#LkYInQPeF}>bZxk)R{#J207*qoM6N<$f)aeR$PxbfVj258?Y;iLOs%91 WOadE{t7L%2F?hQAxvX3U&&iubK>)q`f#$Jx9sth;=U4gOLg=hjYkb?qDNWo_r-!UPDBPJbz64*Z| z`ECND5VKA>OWTkM|7(22Pr)2mN9N37T*{s*#I+{UM(tq#bY<7KBWY6l5wIa)PNSWD z*@A&mRRw;_wk0x6`EyOO=a=Q()9dO%kXUITuWbXj)IuYE|NgbS`q-`oiIpY_(Wo=f z)vSJ*^(BNaKEHni#M{TW)k0z5Ry6z#Kn$WAR|BD2uyJpJ{~}ySH9QvK?mt8AMl=mA z&Ya2r-->CX*TP}cYkC|HLLJA<6}enUhG6C)J_AGFTT$QRO4hFtSDO%Ga0aHz)qc)( z)Cqk%j#<(%xCS=@<1v4Wb^Z1?a|BKZVu&8bK8{}wX5-WF>WoSN0000_2#* z6!By-DzkCm1D%cL5&Eh&!;&yJ!5PtZh}MLfC{LCD1|!Bb?8}h6Y*o<(JG^i)PP4eOjU6oG(eB3_OL&@YQ85A z;I%nU-oPXJVu|W-fyHfq9{8N0XgI$)AI(34?)0bJnJxt4H~K!KVRD<|gijjm_6N+$ zV~GWyl^xuEaqUi;4g}safB uMCX;v0{SkcK;N}o=ZA@&PqTf?+I|6b=qpDQN$%GG0000}M{P)F%xz5=Q$H`T{hOhfu$h zd^Jr#doN8b$uA-I&-u>1_ng~vk92>%<;DOeu(GhtP&A`2N|8FSK?^vbLmal*9AnX$ z!oorgG(j7<&!90z^41z?5^^v|;LsTinh*R~CXu zlMr~cVbi9v_z4(+If#lt8zb7Z@*FUM%?S^M#R+YVXxscN(i@*V!joxBP1 zU)ogWQp2U@&-UA3tYYA5l{`W41A?FD%gvV{|D{d(6rC7T(@0aV1-$%~C$jRbi1xD3 z5$TgLD#1uiGd=$^5admSKrE}J=nmY8SiymSnwB_l47w`0kMn-Npx8d7PsS+T30=`n zcc24iRXX5Qc?4+?`nf^4QV7D8ZV>9H;j;+sNyDx59g>DZ9Sk)uqBwIA#hMq3if243gZrcStnwz;Gw$yk}<4%$yks`kUH37Q$d0Op-A$3Viu6 z5w$=RJO|652!4YaIRM-2v-w|ZP{NbIq2LwhfEG9hO@Zwe`>yz3hqjifcnG}W=&r#f zsDgEn0!tt%u$=}4{^yc5E=Yh-Q1J-JfD4YSOo0V3uVI1zEz|abz9K=ybD+)XUGosu z1(K(aHho6?OnZg~|JZ&VSe(!{O*@C)C_mm-vwvjgO@R;JU4^Us=_KV6S5p$KB#d< z&1iS~)wxd{O#r{9mC^T_1<4Cd01mb4qAdYTfEqt0?<0V5Zi{oUqzNGJV+mG*EP+uH zPWMT|ICh6g5?bI39Tl|OaJTUp* ihp>4teV*rG6Vd;M1& literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/scrubber_secondary_holo.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/scrubber_secondary_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..3a124084b6f0f2d414680b9f61c04f18f0cdde2d GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CH!3HFy_x^nYr0hLi978H@?VWUxlfi(4`R++e zt33BtGS?riKEEV^`MZFPfG0y?lhfO43)^0!$ZPtp1}d22@IaD KelF{r5}E*_XCfj1 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/scrubber_track_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/scrubber_track_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..1dbf2a76ed1681bc433e5a48ba684c5506e2d99e GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CH!3HFy_x^nYq|7~C978H@ot<=$lfi(8Y3|a) zJO8s?pTz02K;U5e16vl>7oA70uAR^=xS+M+?c^Q2I&x>j7u4?KzW&53@g$d`4A2M$ MPgg&ebxsLQ04>TU0RR91 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/spinner_16_inner_holo.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/spinner_16_inner_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..b2391ad796c94431e1d738f21f29d3a43efbf76b GIT binary patch literal 520 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6I14-?i-EKU7`vU!wgU;46*#5? zX|QUBm}6@X1364d-tI08|J(b|>}OzL6!3I$4AD5BoS-20C+*+i`oKkwTRK4)yuFJ&+6;prA62BWddFwJ4zhp+^ z`73R^YtHqoOKAJi(;^v@@J#ut`$T?2kuwu#Og4~S^kCnQy-Rl2yx$MxCmxTw)>};ydJd%`b@qO2!t5dvBJ%8YJZS&f)7{QG_-0L1_JyyN@S#$Z@eovVv zH_vYO%?$pq>%~MIN8gS0FENPkYDYxs4(W z3^zFwO3vxe*bWRS)e_f;l9a@fRIB8oR3OD*WMF8hYhbBsXc=N?YGrI@Wn!UgU~Xk# zz-X~26h%XBeoAIqC2kD`sVpyn8YDqB1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60 RwE-$(@O1TaS?83{1OR&0$`1el literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/spinner_16_outer_holo.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/spinner_16_outer_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..6c76362bed1bf8a90e2d51678f2ceacb19824e96 GIT binary patch literal 451 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6I14-?i-EKU7`vU!wgU;46*#5? zX|QUBm}6@X1364d-tI08|J(b|><98rd%8G=NJvgSxKZ1sP=?{d`}39WtZuZwO3ohDFZ!OhMC0U|lZ&11ci+^QxoMr4 zD3|`U#Y-|Tr-W$OM0ZWvweRJM4UbRyOi_t8TOy%Y{5GabQP(}p_lWq+<_#%5L~7P) v5@bVgep*R+Vo@rCV@iHfs)A>3VtQ&&YGO)d;mK4RpdtoOS3j3^P6imd(H)^$iJ^beVgrB?P{+WAP z_vLQRyu9{O^O`TVkKGshyTcrJN+^O1D38_YRu zuX}z-@&%kr-gdmRzffb&VJqu8GoOdf$JiCWGrvpPT4i_s&znlNf_Jf#t#5AMP?fgv z*P^D@4u)N-1;(#;9Trt9N!8vt?WitqOb^Gl**({J){Dd$S@a7{dTkM2z4lC$Uf-hc zT&GoUe{M~`zK^x(4P}1_q24dqPn({;<5~x8E uWJ7R%T1k0gQ7VIDN`6wRf@f}GdTLN=VoGJ<$y6JlA_h-aKbLh*2~7Yx-|$%g literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/spinner_20_outer_holo.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/spinner_20_outer_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..9287dd7c87b273af5567824c1dd72bc6ce6507ae GIT binary patch literal 548 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc0wmQNuC@UwrX+877l!}s{b%+Ad7K3vk;OpT z1B~5HX4`=T%L*LRfizez!(wZ#iwq2mI-V|$AsXkmPO|rQ3Y0ij|NiQw)oz_387it* z1RMndo3n#WzS#a^s+};4DU_`Jq3AQ%{96%lpY|$LWWW{jfuG16udu4eq-*wrM zL$t_rd5ccSoJ$keZC%^Awqui5`$oB{HIpVCl#NX?@jbktHXv!{RymCshZY-~O?96a z`QBPe@7@Y|2H&_7OfDbY-(O#{|HU_1*XdV0lJ*HLseIMQ#(PQSSd+I;vHYH0eeRAE zCsxFK(+K7~;J->|laQNe`h1(`*Q7GIEJbcSn9BaDq(Q>6Eb?iSw0-~l`x7=EP?L<> zGBagb<-HwC?)2;4Ni!^Za#G;oTq)D+&;7sHK5?XpJ~=0{6&Q%BC9V-ADTyViR>?)F zK#IZ0z|c_Fz*5)HGQ`l-%Gk`x#6s7=+{(a!(PB?1iiX_$l+3hB+!_i}SzZD)NP=t# s&QB{TPb^Aha7@WhN>%X8O-xS>N=;0uEIgTN160J|>FVdQ&MBb@0MPHqi~s-t literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/spinner_48_inner_holo.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/spinner_48_inner_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..b2ee33f8eb2a0a9c37159f28d2fbf014e112347f GIT binary patch literal 1076 zcmV-41k3x0P);u}yPQ4$hkjB#ON;?|9c4}8R!7>#jfOkBD$ zabduP#$X}=#RnjQwA5*#B}Da@&!>s%KCVSO{R9CJL)Z=A$`i}@gU2}Xdf5Y@;INDvc`JMb!765$<;-wp7Z7BWEsVes z1S>er?=b$F8UoA)v4Quq8K9Wu7*An>GpslR-f{>s$`1Bo8Jh_L8GgfGU#Zp&$cMRw z>)#>?)f+hUG!#gW=0dhfZ!(DU~&tgB%g>8Nhzw2Wcx3C>x zg$Hox#er09T-U0f1s!BPY{QU1&JwoMwt(fa^X8&F`X4wFydVAg)FMFI0Jyd4fyWF%RG` zpY_TK8b;Pr+?;S{2!`16A!`B@Q-`3EjU?p-@O+ggX#|%dR2z^~vq2gC?K$>ee|1$0ZtY*J90 z9!fQI9zKn^t&9;o%i#rcvNHNn6;XZKI2fo`{jMf%<5Ge%{Ql|L1p&QMO2;MnbdNUo z*JZ_LQ9i=kNnYYX{#Hlfm5OSIR*F{DkiJ!V{Q~LdbE?C(s#8v;pSAC)a$Tk4V2ieE zrJPBV`pJgxo~b4EB^A>h+F-4Ms`^Fyo-Ec~{0=m0v({QbP*oQ#Wn-GM(#C&n`I>67 zHtW_ZwV4xC&|w{VqTEpVemtPndO(Yef=NZ2QrfaA7%i;0B^9@@V36rg9nk5=t>Fgb z7?sdk-DYu7FkHE=+zDoy)PS9MEa$mLJ3=MYr5;!UK%rs{7HZyAaH@aKEfTQc z(CR%$S?96abl05G-F(|Si_LUV;?$6kux)>%v=)2DUfpwT%PQ8|6^&m$u}%%W*3rdf zl`oQNvN&>WhAa0khnps!G6EK_TCpZ6=uP_{^)H>%wyt5X^53?*IxN|0o#E77R`PdD zm%Wa|cNB9$z_AP5mH=4J^LP6!o!<(RyDvF+#7%B*F3D>^@) zG3au=^KjWsn^#jyew;NrnOPLU6Z$MNVeT*c)9TLijM8T&&Ec75wYjFybd#W68%QTW}f06Axoa$IU9~?Nqc5iru{em z%^e?{s+j1J=mX5HswJ)wB`Jv|saDBFsX&Us$iUE0*T7QO&@#l()XLb*%EUs~z}(8f zfYD-4D2j&M{FKbJO57R>QdwRCHAsSN2+mI{DNig)WpGT%PfAtr%uP&B4N6T+sVqF1 RY6Dcn;OXk;vd$@?2>^cl_{IPL literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/spinner_76_inner_holo.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/spinner_76_inner_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..e8778306070de2d3bfee51b24a744024f7669273 GIT binary patch literal 1787 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 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/spinner_default_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/spinner_default_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..c467daf6735aca576fc676737cd364b974740c69 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^5F!Z>MkMY%maTove3j zX9IV{&aQ8H54j$3y_+)kTz5pVlrP%4^vk#)zDZMDfE)(QT)y*dev z`&p8D=DnP$z@qT;z#1QQAa(4G6T>ulCx+?Xj1lWt9d^nwJgs7w@|w|Q9eaVLoP=?a x&4hLPX3khTVP>W`^I2}D$8+DlTvhMj*WlIpbL;e|JwS&sc)I$ztaD0e0sx|+OMCzT literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/spinner_default_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/spinner_default_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..8990f1589585fe599f663388d5f09bc26b7b3417 GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^5F!Z>MkMY%maTove3j zX9IVHr`g4Ox-pJ12Q$wbN3`vJp{`INANTv7<0=cKqM3nA(M7lS8LpDuuzZ@E*oFh~ zOondfzxW6+O{hr-TP6&olFJksPV*}^oLXNJlH-NoSP>gTe~DWM4f$3{jt literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/spinner_disabled_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/spinner_disabled_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..61a71a5b3194e6c0ad21d2dd9c708b9196b2cd35 GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^5F!Z>Jk_H5l-?au-+V`N*+E~=Rr8w??Dl-!>#$rc&CfiUb@s00`x4*zjs!F!Z>Jk_H8}9F@H2^t zJ!0n5S-a-b|LsR5-b{H~VkvOu&=%vy)$3+N?wrYb=g{2W$JUf9%$GWAG@)@nOUT!R z5*8MXpHJ4DV_=$6!|l*8Rh#ESk<5dq76(ojHcWrapnse(tdDum9R4%mmhv5|{a0-^ m36jm^J>l*3?&Gd{hq4n54Y}2SZ*B!ThQZU-&t;ucLK6TWgGgNf literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/spinner_focused_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/spinner_focused_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..ed914b79db7b19c4a2c92e13ba545b2b3f20ff01 GIT binary patch literal 315 zcmV-B0mS}^P)0X0 z9HI`sMUU@;8@ykE5F)%;gn?O+J7+!06osO5LJ6I(5_>SAXcQHR##~A~ptBburG-Rf zEL^khdOHX?c-~_N~D;z~sHvS)Oh7)7s+N<`{_N zh94NFADG+%N%?%ca}WVojtIbVL;#i}0$P+7kZo5Y5{3HMX N002ovPDHLkV1lCPh5Y~k literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/spinner_focused_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/spinner_focused_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..53e5acad1a8cb77dfa3011340dc31b90641f0fb5 GIT binary patch literal 303 zcmV+~0nq-5P)OClJrEE@3c1go(^< z5zNAClI16exhhPX>7A16q~?JP+i7zX=>41{)u2wz*X#2SDyF99FYeY<@9i24Z>9+%coE zCj=0=UOE#3xSSBc<%9q(Cj@XgA%M&20bGs;@EZ-6(*uKPCzi_$xJxIZ-5;`Mcan-$ zZ^YKuYPx{_ZBMMW zJ+a;X*m?US|D6vaci)fNeLrsZy|Vqc%J<)@J8-k-(6wntu1-I4Wx>(QK)nf%+~xx* zk&+<4U~DJP8^p%<>WEi#V0cs9rcg3Yku@_&cY3Xjn1ok R*?~4Qc)I$ztaD0e0svHfb({bI literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/spinner_pressed_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/spinner_pressed_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..3dc77679987984785ad80f2a1599dc49295df176 GIT binary patch literal 272 zcmV+r0q_2aP)7AlCaMVR`6Tzu?1jRvxKngA*NU4J@NEau;Nx?yoI@WW<5RfE^PuP-Wi;s-M=6JA>QiV5P%j(0ZNjhxi^<1Cm1gyzN6kTKc_J__+MKzrH(vfV=?r WErP_2X;*3h0000FBB`&iJvY<&ok|ps5U=u6{1-oD!Mu+eDKYb z%$eUb7cx)LdZD|sdtJfQ3XbdT0%s@BTzsk5DI(&BwZw7(F)_P?Z=Kh^)|_L}^y@); T;)6#(gBUzr{an^LB{Ts5I#DWV literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/switch_bg_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/switch_bg_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..bf63988ba559af365c510b78d8b141888e663fe1 GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8g%!3HEXp1%tNQnsEhjv*Dd-d@|t%b>u+d{E~^ z!_04*3z?^Az0lp+y{=$t1;_PvfwPlmF22<36cO>mT4K3?n3&zcx6W%{Yt9Mm4E`6{ SxI7nV5QC?ypUXO@geCwAZz#_I literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/switch_thumb_activated_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/switch_thumb_activated_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..69edbdc317bd583bb017b07dcba3ebe8424d5c2d GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^WaPgJPpCJ0rUCttL;il)7%v?{?X)_qw3(BcOIw z-|O{qUn(Q_$GB(iGx@mm#+%Fk4?MRDKl+7jFVdQ&MBb@0I6DQ A0ssI2 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/switch_thumb_activated_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/switch_thumb_activated_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..69edbdc317bd583bb017b07dcba3ebe8424d5c2d GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^WaPgJPpCJ0rUCttL;il)7%v?{?X)_qw3(BcOIw z-|O{qUn(Q_$GB(iGx@mm#+%Fk4?MRDKl+7jFVdQ&MBb@0I6DQ A0ssI2 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/switch_thumb_disabled_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/switch_thumb_disabled_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..ae5cfc38f87ece5d22e99c44c36dcc28ddb2b3e2 GIT binary patch literal 252 zcmeAS@N?(olHy`uVBq!ia0vp^W&C*@yV|#g>7Fi{ z2$WysE0NeD=!Q)EZj?-Zl_+s4bJmn27qV_|^W#0edX<&A@8>H~`&HV+X07~hQ&4g9 s(dNY$xJ-U7-SK|%{{#KedA%=rmu7vlKD~)c4CoyOPgg&ebxsLQ0L5W&`v3p{ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/switch_thumb_disabled_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/switch_thumb_disabled_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..ae5cfc38f87ece5d22e99c44c36dcc28ddb2b3e2 GIT binary patch literal 252 zcmeAS@N?(olHy`uVBq!ia0vp^W&C*@yV|#g>7Fi{ z2$WysE0NeD=!Q)EZj?-Zl_+s4bJmn27qV_|^W#0edX<&A@8>H~`&HV+X07~hQ&4g9 s(dNY$xJ-U7-SK|%{{#KedA%=rmu7vlKD~)c4CoyOPgg&ebxsLQ0L5W&`v3p{ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/switch_thumb_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/switch_thumb_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..15a57eb34c34ccce9d4935702d3a5ec97eea820f GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^Wl0hC@`_GynO|Sk14KB(|@pF;X8Gj_ P^df_&tDnm{r-UW|l|6J; literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/switch_thumb_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/switch_thumb_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..15a57eb34c34ccce9d4935702d3a5ec97eea820f GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^Wl0hC@`_GynO|Sk14KB(|@pF;X8Gj_ P^df_&tDnm{r-UW|l|6J; literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/switch_thumb_pressed_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/switch_thumb_pressed_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..244176c5643d3796dff65f38eec8e68ca415f017 GIT binary patch literal 263 zcmeAS@N?(olHy`uVBq!ia0vp^W5LY0L3}W{^j@|!QF00LY z^F1KSI`LX(?lF~yMFy*`8?3sKapH|y+bZL&PYu`IG1~OdeETz-9nXN;zx)bP1yW)q zL4Lsuj7%I{>gq=I4UH|my}kXj&YV4a_FU1DiPk_B(Vi}jAr*0NuUHE;DDW@@3WZGR zm!ERy|B5K#nP+ZzOne)^dzqx|Out3`9UCv^>)3npJS*CGiizp)*9y&rM}pq_%rr_> woWDj!g-!3>nimcUY;O;2I&to6_LUV(<~;0bebypRo`AgL>FVdQ&MBb@0Ed5Lw*UYD literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/switch_thumb_pressed_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/switch_thumb_pressed_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..244176c5643d3796dff65f38eec8e68ca415f017 GIT binary patch literal 263 zcmeAS@N?(olHy`uVBq!ia0vp^W5LY0L3}W{^j@|!QF00LY z^F1KSI`LX(?lF~yMFy*`8?3sKapH|y+bZL&PYu`IG1~OdeETz-9nXN;zx)bP1yW)q zL4Lsuj7%I{>gq=I4UH|my}kXj&YV4a_FU1DiPk_B(Vi}jAr*0NuUHE;DDW@@3WZGR zm!ERy|B5K#nP+ZzOne)^dzqx|Out3`9UCv^>)3npJS*CGiizp)*9y&rM}pq_%rr_> woWDj!g-!3>nimcUY;O;2I&to6_LUV(<~;0bebypRo`AgL>FVdQ&MBb@0Ed5Lw*UYD literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_activated_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_activated_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..c9f4377039741924af7a77cda742e16b4748e7cd GIT binary patch literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^GC-`v#0(@2g#&K^Db4_&5LX}#0yEESGz#MYG8jvO z{DK)Ap4~_Ta@0Lt9780+lM@mW1QHiW7+jiD=CIiCiY`M?49|=&S^^G>3Yh~e7#OZD V;f(2j=J69`lBcVm%Q~loCIGutAh7@d literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_bg_activated_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_bg_activated_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..40aa0d8e8ee26769129e96b0b8508c811a08c407 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^IzTMO!3HFEr`DYUQlXwMjv*Dd-d;E4V^H8=c8EW0 zUDNRYzu(s8#k1MGy@F)+8aOf+*sebC-Sr!LtRkCq4C9%k_euu~4>2eePD(6bn-SK` qyN*Y0=0xV|=>|6*_#Y^8f5EbaK|f{nKN%OG1q`09elF{r5}E*=11}K( literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_bg_default_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_bg_default_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..4ff75e4e80a65db93ea848f8f7b171c0df89c488 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^IzTMO!3HFEr`DYUQX!r$jv*Dd-d^9x%b>vF61Y5( zkGvF63AY_ zxIOXzQa??d+@3ZEyOW78xp^0QR?Q3j^xgd%`!vM{#&Cw}%Izu_3lB}IdZ1$cfMY{6 qBl9{QxrvFU%xpYA_~yLhm^*9cvCOL{Tl|6MGkCiCxvXvBE2 w*`R!28xvcN@sD1f<&p*o2htyu%)h`mv0|R+7bWBCKuZ`rUHx3vIVCg!0M#}&Z~y=R literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_default_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_default_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..b84c9b7d8e93fc19f7938aa038f9a9c0894ec719 GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^GC-`v!3HFKYIk}9DF;s%$B>F!Z?7NZWKiHadO`2S zzsD{Gj00*Z`O8f!og{s?IlcZ3aPik TDj%8x&0_F$^>bP0l+XkKE%YY% literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_default_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_default_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..c4212ce8fe97f09e6b1dc17186ba3eeac9327a59 GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^GC-`v!3HFKYIk}9DO*n$$B>F!Z?A9UWH8`ha1=lD z@3F)QCPqQUCvrJ^51rDOmaeilf~nC#VFUY_!VA3W2Sk^?v$kW4c6(LfVXk^fPKh&{ R;SA6q22WQ%mvv4FO#muRBRBv6 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_disabled_focused_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_disabled_focused_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d117f369983557d2cd2d613fd67e17deb3666d81 GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^GC-`v!3HFKYIk}9sZ387$B>F!Z?8CV9Z=wLxj3oS z{pH_$3sLbP4hw@BtwxRU0V?^|-DP@gRx<|7b!-;mXlCP;(qVu8Fs`5`kL_~mms{%} zbpPlRy-_6d(Awfhmco5UIc{0zysqZz#|a_{6A!#P$NbyjuWH?H_DRYmY9|f@EoJa@ L^>bP0l+XkK%dR;t literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_disabled_focused_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_disabled_focused_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..9bd4672e67dfaf71278c47ad9b6f3cd6b3357cd0 GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^GC-`v!3HFKYIk}9sT5Ba$B>F!Z>Jk_H5dr6998oF z_}@O}sY0(4TVIUJ%|=b8#O0oobvvDmor1RVSF!Z?7NZWKiHadcp7U zKWVoD#)UPkhK+H*`E0k&+IZ|t9FHRq9OOAsdO=!_y)kg@H)}gK;o!8+_7bK!Vo63N Tr|OJ>W-)lW`njxgN@xNA{n{n? literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_disabled_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_disabled_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..496866f63438c2b49f53dafe07fdae5c42c4a415 GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^GC-`v!3HFKYIk}9DO*n$$B>F!Z?A9UWH8`ha9n=! zpS08oCPqQUCvrJ^51rDOmaeilf~nC#VFUY_!VA3W2Sk^?v$kW4c6(LfVP1Vgs)~vE R#Z#a`44$rjF6*2UngB57BryO0 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_focused_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_focused_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..02376ed7a2420dae910e05897aa36962a100dba1 GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^GC-`v!3HFKYIk}9shOTGjv*Dd-cEPqI;d6-7(HD6s!1*r!jVOHw*91_$e>PVf6oC1GoRFBjy}Uf0C411e`b& zTWVWA-fy-1{L6^PaNf)r3%44cJ+WrGUa(-7PO_*|bV-2k3*pC)cb>SZ*|P4%hxy;D zoswddmxyI$ip|S^nDy>qQOlK$`cq0v+OnK3hijc@`uVKAgn8ReN&DQLzA->YGI+ZB KxvXd6-7(HD6s!1*r!jVOHw*91_$e>PVf6oC1GoRFBjy}Uf0C411e`b& zTWVWA-fy-1{L6^PaNf)r3%44cJ+WrGUa(-7PO_*|bV-2k3*pC)cb>SZ*|P4%hxy;D zoswddmxyI$ip|S^nDy>qQOlK$`cq0v+OnK3hijc@`uVKAgn8ReN&DQLzA->YGI+ZB KxvX3Yh~e7#OZD V;f(2j=J69`lBcVm%Q~loCIGutAh7@d literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_multiline_default_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_multiline_default_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..b84c9b7d8e93fc19f7938aa038f9a9c0894ec719 GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^GC-`v!3HFKYIk}9DF;s%$B>F!Z?7NZWKiHadO`2S zzsD{Gj00*Z`O8f!og{s?IlcZ3aPik TDj%8x&0_F$^>bP0l+XkKE%YY% literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_multiline_disabled_focused_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_multiline_disabled_focused_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d117f369983557d2cd2d613fd67e17deb3666d81 GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^GC-`v!3HFKYIk}9sZ387$B>F!Z?8CV9Z=wLxj3oS z{pH_$3sLbP4hw@BtwxRU0V?^|-DP@gRx<|7b!-;mXlCP;(qVu8Fs`5`kL_~mms{%} zbpPlRy-_6d(Awfhmco5UIc{0zysqZz#|a_{6A!#P$NbyjuWH?H_DRYmY9|f@EoJa@ L^>bP0l+XkK%dR;t literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_multiline_disabled_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_multiline_disabled_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..92de68034060ba8252a3042e1c5418b41342d63c GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^GC-`v!3HFKYIk}9DF;s%$B>F!Z?7NZWKiHadcp7U zKWVoD#)UPkhK+H*`E0k&+IZ|t9FHRq9OOAsdO=!_y)kg@H)}gK;o!8+_7bK!Vo63N Tr|OJ>W-)lW`njxgN@xNA{n{n? literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_multiline_focused_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-mdpi/textfield_multiline_focused_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..0536f38f3857e3688e2662fb3104c34b890a27f5 GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^GC-`v!VDz$1uv-rQv3lvA+A8$cj~O(aS~>jI*GARALPZW)ym*FPHDWq8I1(U46`4*`nM`D4nMO0(kX7~VWc8B1QAYMk#;(>=Ms+~!;%PV0Gr)z_q{C3C+FM>Baw?0{`#|j2Eey%`+L9N z|3EB+?_LjvCh`apVq4es)8TL!ErNlfs;X}Qej@gm6_n6K>hRD+9{hWJ42J2f4U2rolzf7QueV$hL*? zeq6Ps{oDTy*)c+Hc^mT++1otgPB0_q>{MgURD}oI*F)o7SLQ|BNQ`hyc?#qmEaNF@jv&1X-2A|B{*aCP2@CCrvu6{(w zNRVf+OW!EuQRD=m0q_Fg89)u-Pgg%9cu0fTL!$F&Ei5(YjZL1?AU%UM(r`{cJaB@_p?Zmwe8|2zaHPyRMb2tUt<#|N9Q^takF=<1YkybI$aT RjbH!(002ovPDHLkV1hAGdGG)L literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/activity_picker_bg_activated.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/activity_picker_bg_activated.9.png new file mode 100644 index 0000000000000000000000000000000000000000..f01a79e3bf44ced72d89e813da41d336d5d0a2ce GIT binary patch literal 413 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3EX7WqAsj$Z!;#Vf4nJ zaCd?*qxs3xYZ(|A?LA!_Lp(a4PB+XuWFX=Yue78~+T~Qkf*u}^l6R~{?eA<^PigM@ z&KI+wT7~TxLz2TO-T<+>_CGsRTs?Uuw4QoODp~(Oy7BYh-i`vspxtle#12|tH;8@{ z-zaFn%9M~JY0YYsz?m~il_d--`9B_tSXy%Xm$Z(x3Qz^wDoWBrX@_6?jL zN|tW$<6G14J?Pzh6Fynbi!+2v6OLFd->Cd@rA^p$$&VdLezC>@(*^x^)+zpN-M6d9 zVn_296^0iteQ(!GMYGK}-_pzYQQFF4>Fh_{Wu4I-@=oSQ)4xBd1~R@MNnPicdG5OJ z&g;`eDm2~a+%+hWmi$xmO4T*-*{tSWJr&M@yt~qtuk)Jvlc(mug#b`X3h9m^J}uJl3G85q6{p00i_>zopr E0KAQ$-2eap literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/activity_picker_bg_focused.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/activity_picker_bg_focused.9.png new file mode 100644 index 0000000000000000000000000000000000000000..7bea197d0c510cf6cf5cb7f37fdc624e88ff9b7c GIT binary patch literal 324 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3EX7WqAsj$Z!;#Vf4nJ zaCd?*qxs3xYk`8#JY5_^JUZV_v*l}Y5OBLM#hxSc(q-PXx@h2Qrv|wJY@Q`g< z5pz`Ub_wq70e2Xu%@;U2{lbPb-;IKKx;ri~uC%E;dUsC!KAy$0Ek8?nj~w8-QSofr z0a=eO=Yrze4J#(P9oW|_61|ySY4+EHL7F|eiSd00#4JMj=g5ARc^_c0c}w5@W6?5A zbNe;VtQXfktrT^9v9bS073u1Ei|6^QdG~tb(a8q(8@H|Yjw{Pa{r)S+>Yn7<$JP9S zt95+mFuY{AbR})8@a@-LY;y|xS9M;xmUipv^YibMU09N(u5W#BzuPRprGmk()a<7F T%n2+&A2WEm`njxgN@xNAyaj?H literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_label_background.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_label_background.9.png new file mode 100644 index 0000000000000000000000000000000000000000..182049a72c8129e29752dc18f38cadf3f1d31d78 GIT binary patch literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^{vgc63?#2d6^H^U&H$efS0MfW|9>D^e5|<;NHLWJ z`2{mDlubTs0pzK9x;Tbd_$LP>9AMDl;hoVWGs9_d69TfZ$QrPUGThn2oXhn{HwvhO N!PC{xWt~$(69BSRBF6v# literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_off_disable_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_off_disable_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..8f9d7040f0bc346fb64a11c4061e6b1266f50dd9 GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e=>VS)S0Mc#2YBskcL*rWSrX(I z%)qM1$ELw3rNg+@<1tXs(bL5-#KSu|L4s9TV8c$1MGVtfOjvc+dTA&eVvKd%VaTQ7 z8h&6!&na^uiBN-82_Xj)0vrrJ3!VAL!aX6-K#752W0y?-miRC4fQB)6y85}Sb4q9e E05je}`v3p{ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_off_disable_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_off_disable_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..d452480a72225d456eef08ae19587edac6e4831b GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|exd5LKS0IfCY}d%o0!nk01o;Is zDEe{7^71p;rWYlz^#F=Gd%8G=cz7o#NU$mkY*;R}xM2g632RR9lz@hGrddp3{Ei|Q zgc_DLL<&yTPcc}P5OQ!u)4>G|3C~n#{N)r=Se)R(z|g2HTYG4NRyW8Ep00i_>zopr E07GFb*#H0l literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_off_disabled_focused_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_off_disabled_focused_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..f45a6cb0a6f0225f2743e55ced2b9780609687d2 GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!JOX?|T!FOl)~CdvGuQxJ~sWO3puB89@urUA(vh4fpVgd zqU(9q36~~%huaAy>Q6X-t29k9;MG;Dbx}tgjAh@(Gf7=&U^7|3$a}{A`p@rn_6E|Gc+IBi|DrR+kvIP9XrfoeKET^vIy;@)0!6l+!B zXbTke?eZ~R{rCNswG1C+(rw?($v>5E=b_17$6)czPDjwSkaHU6fn66Ha@o}$C?^Uj zx}Im9aA~4OY$iW8z4jP|@&irHHo)BoD#K4dsC^a!LOkWUa7=x#)pUXO@geCwY CQa8N- literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_off_disabled_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_off_disabled_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..3ba8b6db8904516a0c4bcd1d661602c54073d5ae GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|ei2$DvS0HVS4NQAAeOY$iW8z4jP|@&irHHo)BoD#K4dsC^a!LOkWUa7=x#)pUXO@geCx) Cnk<_D literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_off_focused_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_off_focused_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..f525cb531fdf636cdcaa7b1391c4dd5dd7c249e1 GIT binary patch literal 322 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!`~rMJT!FOl)~CdvGuQx{MvG~o zoj?<%N`m}?85lVQ1SJ!jJ0#*~%uHkC;tq_qRB95BY2d%qHI)OXs?*cOF{C2y?KNwr zBMKa@fvoCAoNmcy^8ZWE6;)`BZM$3?J+E3Z*(M=CvEt)DW7nXgFSSJz;v$Zp=5bZAFY4+=9hkP$RBja*qBKsRWY1o;IsFfcMPv#@h=^RV$ssi9ot!LAWE5*tSI0}metko~4+08Kd++|M*;adX9ApDB-I9ggG`oSkh{FZ!KtLE5bK5(}>eW${Ox zad{G<@bcZ#H?j_;u`aG`4b@+3S8rw3S$#@r5`W{febslr#WPO*Q^a6nzMhcYTav#6@j_cti&Cg1% m_*z`o$eFKIr^EP1^8;_L?y3Oh(U`dc)FvA(~t&h)N6=T|RUSNve!&_$(T5~1< zC5t^>978JN-d@|u%V5aia`CA7zTfN1v<)JZHa~m5XUb1Go`sh-1)p9k^WHsu{ju6P zE!SSIy2t16%(~$-W5K+P>l$I^6U&(b(gkLRGA2cMX0)zg>TJ2x3^W-866)7|`<^E! m@vJjhF7nyTbh%mYTQBgda0?__?mL+TQsL?9=d#Wzp$P!+sdx_n literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_off_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_off_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..2eabddcc33ee16b2fab3c4977f2527e8b73375b8 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|ei2$DvS0H@`8+g1}?g&thqa?^L zm?4^5i7U{O(Pnd13sB6_)5S5w!#g=af>l{ygSF;DhN(;@tU8TN8V*+&eHkauFy!(G zaR^uFIb|*rYOpFHS&Bp$4lGLJmF%aM1WHbmkum_k=(LB?g8BL8*y}VfunV!x%hW{an^LB{Ts5 D3k5B| literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_off_normal_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_off_normal_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..d3d2fa481a15de1e1eedd094ff6f5684a409f121 GIT binary patch literal 683 zcmeAS@N?(olHy`uVBq!ia0vp^E+EXo0wgC%MOy+XrX+877l!}s{b%+Ad7K3vk;OpT z1B~5HX4^3^FrM&qaSX}0_jcyRye0<$*Yiyp9+#JR{$KF#zxY>qA0JnilwS)j&ax_r z*xYOyP=BNuZ(p(3*Vk!DE5?L!ZmHzHy_*t94#su zj&ywdd*QI){IwhRFJbC1?}+cavoxzlMsjbK8ne=t%bM}>6Q19l#c5gefobFMJ3lRx z>H}x3e)eFhGQ07q$4@)%AI$i&cIE`-hn7XUj(g6n`L@Enc**%&>lVAQ&-B=2HT`U@ z%*kixDsoJlj+{Jx>bo-MU=a z)HsPj%SKAb{Ay74bS2XicjHT6#7*C9ak}KtqWkoO2CwSvebLHSY7`fn*IZ?b2-p9| zr(1A+J8NCf|MT;i96`W;b^i72%|0(3?i*5^?|l literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_off_normal_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_off_normal_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..945f580d8aef60ec0d89262d365f6310eeb9f7e3 GIT binary patch literal 601 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 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_off_pressed_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_off_pressed_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..1ebfdb3193c91636ebb0a532693f756beb611fce GIT binary patch literal 2599 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 XMR3K3`S%jEK@nhTc+#L&4;TL@TD#io literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_on_disabled_focused_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_on_disabled_focused_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..1af697398afb10280435532bbf355cf9056a0ae6 GIT binary patch literal 1023 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+yeRz-SlX6XFWwGR!;!1V9oKG0i$F zu;_}|((6DZvFwJ_@|zrUFG#PrrMu~o;g%;xTb=+(=@mBx7hM607;k+FL`GYm0!74^ zT?a}55l~zYgdXc{eyk5hKyx5Af^0o=hIQ5%?ImX{mY=a&0YVNd&nPc~$Uw=32hVId zc4pi0Guw}!*?IiTvcqSNokme`_|%!Br_Ss@fg%XuoH_&23j{#Mfsau!KHlD5 zP68~<9E=j;A|k><+$_=>f=0$hMn*!+2FBX_azboU`n*~Kl6;I3+JekX+5#*B%<@`l z+=hINT%IvvyprNP%0iqj;hW>%zhGcsV)Jxy45_&Fc3NcgEe8I8 zE)xt87K~EWXp(a6z9ss7>Dqt)?GthqOlMC!^yBA@&voZ_s@!*9CnEUql0pk7e~;j! zbIFl`TP1{jCmKFFf4sd-I47>Z=hO`K36GN>3tP3DPv-J(n7VSiXY=vh-(wg9m#6pK z46!<_U~T^Y;1Qv}85>!moXmr`ch)Sl@Af{;<+yEgP>O`d8Sy2>tCtql+ttP?SKM8> z<0@~r?ujSfvrWaKPpk`%xxQ9RciV!1b)G&Mdmq{b-mUwp<9OlwO+iry`x*CZulaA- znV6^X>$&n@?#I`YZrt!8XUYoHDTGsC2Mcr`yQ_?&L$KgeKlcK(D$le&D<)h zZy0X5eL-CC03R|T1mc1T;RAdh{wu0A$S%-VVmSQL>`XUjgNK4bL%;Uyvq5&uOxK>z zbczAO>QilN=>;sGn>u! z@x4Y#1_s7Y|{;pqKRCH@! z9*2rI|Nh!}|9A6P9q#J#N?ohu@q7B$ePQ`8n)J5tEVz>+x#)`*TR^7tuYiEhMvNas zJ=sf=BaWJE^)tHk_A9#!OTuZN+$nFq=N#Xw#?&xt-h46FyM+fNiud+$dMuH;?;le^DJh3a=3KIhFNak&j0IM@P|Q(dHP2?^9}mU z2Y8VQRuGr_0PneZ?@u!o9G>^y8%T=3SAI>&QeU0*bxR^8ZsgTwFuC9HITR!FNie!2H7nFoO MUHx3vIVCg!00x^Q%K!iX literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_on_disabled_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_on_disabled_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..1d2d70d53aecfff305be402b00a5d251725f2d8f GIT binary patch literal 471 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!Vgr0aT!Hi%nt=;E=evOx$d?59 z1v4143F}%WQW5ud>g~K{ z0|D0SX6Kw1@Rd)x_wT>4_M~SS@e!4uubujQ?u?pr&2mLs z;X1y|&We?>m$TU7b02c}XRerA?AtL*LF2i+)%MFV_v3}${Iyo!?eOjH%ePCFm;AeV z+}DJ2$Mo9R1>euVh-Rq~{Ofbje?>5pO*IUa` z5&8X5E%SYs|DUx}Irlwx-@N-n$>hHQKXn{)X16btd-D0bcmU7-wo=i*IgNJ|eyK5< zEyx#6VE$zWVu%14VT@)EekY0oS!#?O&$WU44cuJ`++5Nu$L?FtaKF^KI9yWsZ!lNu aA$~J8-uBfG-F$%o$l&Sf=d#Wzp$P!6nBhDC literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_on_disabled_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_on_disabled_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..488dd8101ee8d0be04360675f3472792072bb890 GIT binary patch literal 583 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!rUm$fxB_Y0!3Wet=07gw|{Wla^4=eDxZs}{`G zRhu!1fq_xa)5S5QBJSEz)k3&1aJMT^yUxw*Y(OV literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_on_focused_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_on_focused_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..e921dbe7ab1cf3cdbaec2a850fad5dbd47781e7d GIT binary patch literal 3021 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 IM6N<$g5eCiGXMYp literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_on_holo.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_on_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..03fa8daa5aa42d37bb7656b283af2b3e9a8b37a7 GIT binary patch literal 2973 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 TTjWP&00000NkvXXu0mjf$7ZQE literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_on_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_on_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..e45fb986afd295548f6b928fa4e73081eefec515 GIT binary patch literal 2616 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 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_on_pressed_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_on_pressed_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..f9ed572a82f82e7b0f69025e1a80bc67aaac2f8b GIT binary patch literal 3787 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 BBRl{A literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_on_pressed_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_check_on_pressed_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..b325a6e866a6900c0cddfc5cd68242525cf04e4b GIT binary patch literal 3127 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 RB4q#o002ovPDHLkV1gAj2Y&zn literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_default_disabled_focused_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_default_disabled_focused_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..e628224c92a83b23358eecb83358506bf78712af GIT binary patch literal 394 zcmeAS@N?(olHy`uVBq!ia0vp^WHqluftBxnnqEHB^F(C!%l>0g+ARW3Cr+e){I)k}zxOn$xkpT_J{^9ZGw&~37!w;$M8FJIHXaFsgaZwX%s|Eldxp(G=HrKqNP_zR8vgo6{1>l1 zaOpdT^~^#% literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_default_disabled_focused_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_default_disabled_focused_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..e628224c92a83b23358eecb83358506bf78712af GIT binary patch literal 394 zcmeAS@N?(olHy`uVBq!ia0vp^WHqluftBxnnqEHB^F(C!%l>0g+ARW3Cr+e){I)k}zxOn$xkpT_J{^9ZGw&~37!w;$M8FJIHXaFsgaZwX%s|Eldxp(G=HrKqNP_zR8vgo6{1>l1 zaOpdT^~^#% literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_default_disabled_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_default_disabled_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..0cf24b1d4381d9a306d2156cdaa40f98b0467bb5 GIT binary patch literal 387 zcmeAS@N?(olHy`uVBq!ia0vp^W3#{W}V8dm8bRU@U8z-^yXH7y!1`R;=z~s@1tXc%B55P zhP5S1v?bQfTlae2u|gaD)1UN0KilL-gQ*R&A!3b zydma5iqo3~TlbxGte>^aeKu?Jh9?O|ie+n7d2P*oeN&8?IpRQy%NiZ;t0ujrh6Wtm zM>X6GeO{vuD=-2@5dbe9ceF=U%w*xx^;`CJ}__@ NJYD@<);T3K0RYiBpVa^W literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_default_disabled_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_default_disabled_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..0cf24b1d4381d9a306d2156cdaa40f98b0467bb5 GIT binary patch literal 387 zcmeAS@N?(olHy`uVBq!ia0vp^W3#{W}V8dm8bRU@U8z-^yXH7y!1`R;=z~s@1tXc%B55P zhP5S1v?bQfTlae2u|gaD)1UN0KilL-gQ*R&A!3b zydma5iqo3~TlbxGte>^aeKu?Jh9?O|ie+n7d2P*oeN&8?IpRQy%NiZ;t0ujrh6Wtm zM>X6GeO{vuD=-2@5dbe9ceF=U%w*xx^;`CJ}__@ NJYD@<);T3K0RYiBpVa^W literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_default_focused_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_default_focused_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..ff06bf7056b3a33461671e35ec39a287aa5bb4fe GIT binary patch literal 412 zcmeAS@N?(olHy`uVBq!ia0vp^W!W+_K}QZDq-4=S!DN5(A z+uEnQzbAZDlL}oY?0mTI$+nyay17A%B3}GF?4Hx;5&gf#;ear-CEn6$~& zOf%r0+_rCDZYI2L%lRV^_HXruU7mt%8~(H%<#3ibB+zEiqR5j7W=?C~AOT{@$)U=` z{ZV`qU&mKyH;40d(7iX1fz3toO$HZUctF1;zjN$7&hhvnwR}#@T~J7(8A5T-G@yGywoL>9KbJ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_default_focused_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_default_focused_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..ff06bf7056b3a33461671e35ec39a287aa5bb4fe GIT binary patch literal 412 zcmeAS@N?(olHy`uVBq!ia0vp^W!W+_K}QZDq-4=S!DN5(A z+uEnQzbAZDlL}oY?0mTI$+nyay17A%B3}GF?4Hx;5&gf#;ear-CEn6$~& zOf%r0+_rCDZYI2L%lRV^_HXruU7mt%8~(H%<#3ibB+zEiqR5j7W=?C~AOT{@$)U=` z{ZV`qU&mKyH;40d(7iX1fz3toO$HZUctF1;zjN$7&hhvnwR}#@T~J7(8A5T-G@yGywoL>9KbJ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_default_normal_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_default_normal_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..3d48d3f7b3313698744e9155ad5dfa7626f5a84a GIT binary patch literal 418 zcmeAS@N?(olHy`uVBq!ia0vp^Wbfin#GA@9>;=Injw_Sf&z z+CR^AbaW?Aw5XF-Y!Ps(^Sf-~cD?jSH*BB1gO`2BiC44a_}Wiz%U!%{ z-TYOnxK3@Vktp8LdAmSBFT7xqpxOCNIl&@F)ArwAAIis-* zka@tQE}7V^(e>_=O}HEz`;G&hi9E?OE^SagEOE@B&9Dc^lK?aSHbKPp*`P}N`*3{2 ze+jX+hqbeo^}RB9SimfvnKs&S5q?Y yFr%K(%&xQhswFXz(E-Yo$Wt|^|2I=Ju$hhnpZWlGrv^G)Ad^kliW$IY6@ zoc`7R{v)NV*z1|LOMYLA=kwt?Y`|0eY2~U@YhG8~+m@>|%gp!lz4Sui?Hd`RQ+BeY zM#jnVwQtbqdj7ZW{rj@r$L+dj@95=CI&Erpvf-uYB%Mz-@hOpJ;gLBVkALvZPC3w{ z(KYSSLGx9KHyU(rs4$yx9sXeF8~oHD=YUv_Qjfu*DTk~MaVP^BFk*u}!)p+GpAAd| zEGPeu<9GiC1rE7K7G4QKTE96rfx;g*= literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_default_pressed_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_default_pressed_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..35f8fbdb40659dc615c5065a53d640e176f5db07 GIT binary patch literal 653 zcmeAS@N?(olHy`uVBq!ia0vp^WWCd5jz;c%dty%i+~2p zM^dsQHkX>;nPDO~n=gLei=CGm75dJ?WpXwRYKwbliKd7i&w1iUaI?M>FQ}gX$5ajE!frXnEx&V zo!zRWb$JE{4$7XCO&2wZEms;f7^J#*{ ztJzmh3Ef*`_HO>&Ss%{l`21Qvmp3iR3~Y_-83t9Q*E)}aonG_&UaK^NmuTfjH&7T c$7-1-m3U7*8h1WCd5jz;c%dty%i+~2p zM^dsQHkX>;nPDO~n=gLei=CGm75dJ?WpXwRYKwbliKd7i&w1iUaI?M>FQ}gX$5ajE!frXnEx&V zo!zRWb$JE{4$7XCO&2wZEms;f7^J#*{ ztJzmh3Ef*`_HO>&Ss%{l`21Qvmp3iR3~Y_-83t9Q*E)}aonG_&UaK^NmuTfjH&7T c$7-1-m3U7*8h1Q$E3;;l+kR|X1+(To&!pjn5 P00000NkvXXu0mjfQY2a5 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_group_disabled_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_group_disabled_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..12a73ec93688c9e598f4808a933eb4952d59143e GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^azL!b!3HFk+)Mrv ztq++@h*412&^pc8)>O4LM%kjgSa#)-BP*AiN&WDzdgI+MF{7@9pNZk$yg8qp=Nw5t zzA|?`PrXZg_TQ{+zPIBf%NFS`Ju|ENMxeZ%^fxg!~%65+mwt52sWwtTpz!hG$6_hbeJ^~B~_vw6W4M>kun`3H0$gQu&X%Q~lo FCIEV|P;dYM literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_group_focused_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_group_focused_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..8965d110d4c3e0286455a63aa177e6a9770d675d GIT binary patch literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^T0k7c!3HFiHo1LgU|`hpba4!+xb^n7qZbpSMBBri zj=vKpn6b$@6i>TWx~nPSc*fK%mvT#b#CCQaFjhIZpquUAz6Z_I41Z}mzUO~mWG8=T zhh%q$Mqk0o#rNI%9$UO?DgPdGC`x!qgw>44ikF4NO3>ujw8Q-g%_*BLMDb^qOYVW0VI zpNt(wrtg_pxkNMq7C1D*8UG|RKJ>zQa7J0fHo3Jz6Q`QruK#Iu@y=rJ(wQu=RmJl- zWmmgjT{U%AShH=x^SZK!Yu$P;FE|z^*Egr`-f8bvDeI8nudD8TKk)X?o4rzHKQiKu mJh$kxzBqr@qaATWx~nPSc*fK%mvT#b#CCQaFjhIZpquUAz6Z_I41Z}mzUO~mWG8=T zhh%q$Mqk0o#rNI%9$UO?DgPdGC`x!qgw>44ikF4NO3>ujw8Q-g%_*BLMDb^qOYVW0VI zpNt(wrtg_pxkNMq7C1D*8UG|RKJ>zQa7J0fHo3Jz6Q`QruK#Iu@y=rJ(wQu=RmJl- zWmmgjT{U%AShH=x^SZK!Yu$P;FE|z^*Egr`-f8bvDeI8nudD8TKk)X?o4rzHKQiKu mJh$kxzBqr@qaAj-Xdv3f-vSj>t_H20%4si}YrO?TCQ$#auDGntI|k@6(~ z0JMlPs;bU8uRY&0RrSv>Rdq^f>G=s0=kjsGdPIZ~Mi}A4!v*2f!q{qr5k50aA%vT? z_R-Qgw;l29DewKAh@LHtG5f%KTLc#=BJ&!-KeNHd{ O0000 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_group_normal_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_group_normal_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..e47649ac77f8ecd0d4ac4ce4af48bc76b8eb729a GIT binary patch literal 206 zcmV;<05SiGP)dq<$COOVP4uK=ZCf*^kn5!rl0i`OxAImv8Mf>gygZ@ zqWCjeE48k!DlZK@81?I|-rTK$kqeh*t=r)fE41SbW6a8^)``}ut_ozVwF{ZC;Me-= zDJu^hF@5!2e?rM)6TS=nTemo@e%<>xAhmIumc`Ym1?uiEPBOifUAUK3%7&RsL?d8< zLn9L_j8WR`_Ad}c1SECA`ojAEOt#ie=fz&!6Wq1kA^Z5<<+qsbt_oLwagAy2>U8!e zerM&K^AFx_Igxk5?OoJfpN5*?*D|}$wF^#cpA-F*^}=(y)WK3f`7ktPb#8xHKzohs#{{f|*P^g0^zav|e#lB4h2n&>0JU zZU28VsI@bD%0t#g((a~w7x=esaaeu3_i;dK<2Eget5FNw-CtZ}dMmqdFRPRdGna@) zzygOxCRP}uwArmL5JdzebwPf?^!-e>mQMa+FU|?>+U$^h{OtyS|Fey+NvSvL2(rWq?)8>7HD4wh8}~btDnm{r-UW|J0h0~ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_label_background.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_label_background.9.png new file mode 100644 index 0000000000000000000000000000000000000000..f8600b5c04fa469592eba48a251e8525e7599b76 GIT binary patch literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^{vgc63?#2d6^H^U&H$efS0MfW|9>D^e5|<;NHLWJ z`2{mDlubTs0pzK9x;Tbd_$PZL9AMDl;hoVWGs9_d69TfZ$QrPUGE_$~ug!eb4zi8G M)78&qol`;+0Ig>ttpET3 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_off_disabled_focused_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_off_disabled_focused_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..f2d43a7f4bcca76e30ee37c8c5b9d951408520a8 GIT binary patch literal 1512 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+yeRz}OSu6XFWw8gG4i1_pp^2p7VD zlR$Ymn>+@QCJ?C%=mv;NIEkqdC;|r%^*}DN;~}zWQfPw6CZJgg=VF?PY!RFdHyNTH zE)Li3Vln{~Ni8Koe!)PRk&RbY%gn~bS%yha%_%G{F*zkI)KQg1+%hIQ#6paj-zXy1 z-%3+Tm`6I?fKNWiklWaoRW~wKfQg-lPtaVO!!#k@UW7|rSzSvE@^CCxb@#s`Bvd)y*sCW`Tafd?|uNlyK7V$DtwkVpg%36!pCu&^4A|O;(`4R zi~hX|u&C-437?VmTJ1SQ`sFL%r}oS$eYmCLqHJTq$B?z=6W?@Q_`qSZZ@bn zQoH!oSK<%P#h)^sE zLMO#5t1TqkX9pMdcwc+pnegsiLGi)o#VuZQCLLuyQ{&@3B{o(+-lsfh<;<7e2fm6f zRngVP6t?-AD+KjZ}Akt^~e97IJ$DzvWA;;{`T7* p|9RoU&gA?9dvfl}^H&_0e`wRGEzA3|zXOW~22WQ%mvv4FO#s2b|0nHOC&U%VHQxHv*47qCq9J5K zI2+C&MlnPUL<=sBc+5eQf^&gJ!A*lR;IcplL=a8_84!Rb1=oTs3ui+VLv_L^xCwAs zOa@RbP!O&XnTyOu)`+GUq70dY8wfXH$4<@;VB}3M3GxdD(u{1pvRY;~F3vJcf@)4- zaf!((X`zm)EaH|i(IFOM%=|_XvHn(?Qo=ma;Rby2L5AGMzO1^DsRGR0LSmBU+8m|{ z@%ADt{K}@*4o)uiCZY~{OoG~uDxBh+`f9d{cB&jIjC|@myc)*BmR6z`KDGkELP-G{ zI$Snd?D7gxo=RRuI_i?n))EqaCR|d1aw}RG1Q-~YH+i}^hE&A84SO9fjuKvoDJ*bLVI^SKamGG_$ZTKfSu|_n+Fo%*~Al9=!c$x8HXv zN1K^ckU-lX8@I#dY)WnCTNI0`QzQ~gwnwh8x3>~gJ(AVsDRAUC|Itp)j|Db-3sUCs z2tArBwbtC;cJiT5kM_zKzn-~&exQ}OnAPQ(Z}y~5JE^OCI%1z`?DL<-MrG@KoX!4U zn0HRh#ed_ANZpjn-`Xq1?DT$yu-+{fI2Lr{wyxn()6~D6>gQsFeC~XHvhvd#OXbKt z5qTFa*)2qlo?G8iWU+eB-K3fNEQj;z*T2b|&f3jiZN1>z-=Cc}YE$DazU@o<@4M;I zz1205S|^`KFP_$9aA@-1Otm)^Pc{Ef*A18H%YF7y$x)T_!bRbu?3@v2tZYj5O}bgj z$6j4n(0R_gwnJO;hN-L0W!6)xy&6qh_PI{JvbTX#`w9gzX-(k*{ z$-U$7-xnM z{r+BaL$^*aYfR%YmY$ME*GDGi-#9td>zx+HecH$0EB|Qgx{FTxk10ydl=?AoQ{fA@ zZGEr*opQTnv^6$!=8M;Rg7W7YN4<_Qo^t;@@6(yv7Oq+P+0=PqwAA^vE2gE@uTRZf zq!qW>M9c1q&sJ0a=i1e)R;uxt_=*v;k}@e`}YpaipfG`|gy#l3ro^W%5ib( zf*BYXxtO%HIn~uTc=-60*tjK>btQGgHP|%;rDR0KSOpYid6`v3q?f)t4^(RH>Eakt z5%)IirXRB*PtKfP^Y8b{-!uLH-|1napb}N>-NJI|-0KtPEH)m$`IkB8#s)>{x%1QC zAA7@oP-$}Q+R*DJb1#+Z8-I+knNl6Hk!zDi%8FN<-&JjjYc4)2m@xB4Nb#JIYN6GS zKd%tuj(6eSzHA3^Flp8Elk$)ESvY_`LYGVH=fOz^Pt>&hvM1yO+_cq&$#1pa;=Z^BWX(? zEq}S^CC(3Z-}*#JbuW_hx)o9xZN6pga(%Hl=iVn--tp^f4#XCA?LBXQty<+;^&$3V o_q5m<&mC$C{|T7o-1xwE)I&&mkHWhYV8}Cgy85}Sb4q9e00^}Xk^lez literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_off_disabled_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_off_disabled_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..a1d9f095d94f210c0299d491065b52d57ec03658 GIT binary patch literal 641 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!CI|S0xB_Y0K?bhGzx)bxmSIVd zUoZm`1HTxfi36t)v$CZ0|=Be%DH&<11|Nno@wS_fmf!WF<`nm}pPb!qi zT$BB2GXG}UZ}w+yv&?y~PyEfmaCXLa|CHI!b0={0r+%?xm?WkqV4Lo>F;|}{c*&D_ zA68BJ*tGM@>&vO#5oPMHRptboINNnWz9VJp#O)V0?pgo$*W2(zE!X#Lb6T+Q|DidI zcQ(IoHw)ExxH<9s&V6$W7%q9*OabD|=Hk6xqB z$si+^1KkV#E*pFk_}9UFL#;@_VDloD&IhW3FRnATGgd5c{Qqrd3*#xVz6(#d*a9kz zc@yTE2YcT*H{}!y-oF93dox7clyDxyR&n(a?xNY@Hk-f!x;$6>sFZH_Dy;{?x yGU4EjS{;d^?d)PaIY%w!8b#B$0YlCEx$Kl2(JfoAPmTaa8iS{+pUXO@geCxdjPFVS literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_off_focused_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_off_focused_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..6731eeffd07d0f6aab1b311c69ba3189b5a32768 GIT binary patch literal 1933 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+yeRz!V+e6XFWw8gG4i1`L1&<4TKwl-(-j^G6~d(RSQrMt2jhGvJ{*RXTa3}MIZoE1X&y?3s->20IGy2fRo62 z;cSR3L@`7V!iF0N=OU|wn+a#YO@NC48OVBpY&aLf01F@-3FpFT^;qo z3apG`-YqkF%EE0mWCexnBAPu#+4ZJWd#MZf)Rb_zv`Mh=OUNoI@-^}LPw0=6V-?YN z^$!V;^3xM$N#G7(61NNs=8-dS6LahCb7nLS4b;{#|#OHskkRo~2) zKO)+(yvim;H(IE4wjl!pi-f0(V@O5Z+pyo!LFF=b;sGUIEHZX+0Ur(p_OE#1G*K)k zc)});AeAc)N7X(HDOzpbBrmTQgjPQ?#Kg zK&zOT+SL>426e)&9JC=l~e-L@N=@S>z3a{GG(zEw&30G&w z{S95upwRR6Iji9esjpH7@9T2UuPo^L6ms^>>okRXCxSi;@40!!C-4)ebZuOH_u+sK zHy+%0?;a3acapJdm52F9!7Z{yO|Ku^4q9{h?$gZgW#7M)R9D-!*Up`>cguO!b)O#F z{I`F=lp8GF#V@BR^QlDg&cOw{lPgkId^n-ex2;#UHNf(@=bSAMZtQ1hJ3psy&P>Itn-(XWN!rW3 z#mB#O)|(}Vvufr4>r0rP(dU`8%TWC5J0x{tax~mWY1iN)st)bI@UREoWYpGBe*)_`H51Q zhcjM$mHzj^*XbiG^S7s6#{K_J9Ok&5aQJh)VzytZDRWtLa3$wX;g=2;>6IA*KX*-% zNNCUt_1T*~WOPr9$`94)qhh2|M@qbab!SH>EC4MZ-$5C*h-< zGUH!Pv&8uVmsc6hnEpd|uM6{kq5X@epQ!1*+|l}7>g9C3#p@@2Rjk$jpt#ZgDZALc z<$nZQy?zGX(#;|a6RDn752v%EdI=$X-!l^U-ZBY0I)GkrO|e>0|U-LkS} zsi10*S@2S!WmcaOrns_y-m>zTUh~E&XRpmy$-SE%`(VS@X01i@&R)A%Y8BCU^Q5)U z!KQq+)BQ0An_B7@EqW9BheBW9ycZ$o40@F}^)k9PD?>X7g=n=i-Zm~rh$yuqB>l}#I8-`pH~?_0{j3HQ#1Hm&|MXG529 z!e-^puFHV|2?bkJwEA*G{le!wS5s7dZO%KRe*X5)Ice%Lv5?Q#=IaP9 z=(5-OnS4Gb_ic>t*R$D$TpW*cB(-*Agq`GMaEja+X(GJ8JAeDC?E&R)H*U3mx^Qa9 z)w`Ov74H_^jQjKY=c}8&z5CTKT|Tmip=-~PoAciOWY5{4Z2$av*-~JE$KdJe=d#Wz Gp$PzF^X~ir literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_off_focused_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_off_focused_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..38415c4eef734cec86303b3b59c47b76f16fcef9 GIT binary patch literal 2153 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+yeRz;rFZC&U%VHQxHv*47qC4i5zM z3s!*DcUVi; zDa+)>-icGE&umDvkYrN|o7UA)AFRO2DCXTVqo*v~Rzp@$$S$JUQc zhfA9Thn#_xv!%Xl6R-b-{x~^CPK~(kc`Md!-7>c;Mx7;rJAhTMX!WwrcxwrpghCw_ zx9&b?@zh0O;fq%$iC@ufm0N42wdb_S)X7gu z^OzizlD@pcnyYlSbl#dE)%LuFQ3butY^@#aA(~F|v58ipMs}*5;+rBR?KM?w)#fYa zr-dr!FYt5KH&gTFFIl?Y#j(7~CPg>ebE?Az1_qV@PZ!6Kh{MSV60D0G+8QR#Y@OOW zw|R1R_vGf;?Z5z-X!5t_4^xxVA*Dr0j~*p0QaU6wDdV}?MojH&ShWv&aGM3mnPY0R2VEbr|{s4b&Esa z&AD^u?&aIzO?orm-Ly|k+MJa+;o6duJA5W=oGw1w$aKrna;G0AJ~uNjr=NMl@pb-E zRjX*xcE;joUFT1N;X_!>H5fMnXG+&HJ#eq0uti%^}}ZENqoHQ?2g4J zZL_>*yyDVbt(K-UNhju!o>tH0?RnY^oW|)y)Nm_hVpo;eM@%zKXA}FtKGG=KVhQvE}ej`hY?o__f)pN zWHIRQW9xd6IMG^ly>0u$l5DwucgobNl@3SdUNq4O+Pvl5+;ofLMC&@{WydRwJ+x26 zA5l80y6^CWgWBJO>X`dtcbqw}YQ$ zYK6E|i@B}}0_)eFP1w;(z{bSIU#7D zs$Qe6=H@$UO2&5?)0XYFKB8KA^31t?AHN@(RG6Bc(fH`%t%ltWk#fDu9T>$k&mB<8 zeVr;ZZ^pFiRZJmEI<-DO)C$?!(3(~EMuHe0% zwGrVz!H}LlGE?{%}d-}$W>0duiT)@V5Kgd%sfjL>L(07i>^%S-Q z;pNuvudcS?FAoqtUOH7^L+9sN3Bv4GPE;}Hr0ktrJDpX~c4hh5HIBVHW=c|#2X80Ah7I9Sp;WBCWNxRVtP8csw$hER)H` z#>Ti@E{#UpS(VG>JAi0SP0cRLD1CHluD&yu~^g7(}=CCtW>MjEiElXB5`JB2FXM&nw*@Rot^FI=y>$# z5fa$f*Qe2F6bi+}#6)RnX>V^Y5=*DknM|fut8H#>MiP)ZySlm<3`Sd98&Y0-d%H*^ zYHDhtQmJCGxU;j9L?SgdHdi4K-Z)M~wwFOV+IYg9@;B#^398p(nP(uh=gD8nI}2mmI;Ab;P8Tk(e4%NLJ^ zy;ry%+hB_$Il1^U&3r3M@@z8&j3i~hdl5VqBU22^IivaeB8}{ID9$U3k{R!f-+W`+ zOlG3D#!q>Ew($bjaq{3AF+>frea@_wJ;)MF%U;?iJ^my=_gbu?$4{AQ3=|o_J&yRa z2Sb}ql+OWRo=zc@5s6>Ryg&dPyGbj0rH}Fk@1{C33`*M3%-i|)L4=BF%eN^8a zri6l?RNf0+?uzRrp$ExIl{(%V1X8R3}xaGBu__4y z2MXlTVbkQgk<(GpX4M!A3?{`UDt1N9#+hTS4_JiV`2onjphTGhUu2#tm@)4L&}nvu z6YP#mlI(s~qy7{OFw(G$^N#7b_?I?z&uwPC7_?~kN$_tKXbBmjy9b7o(fe(ek}r7A zb?rSnm(`HX;YPG_{gponw_g1CFpnAYzD2O1I?T7Nau7NY7`=oWb^aC;=GkwgZmxAY zcjB&m^Y_OgirgG0rog@SX(axtG3Dsg#K0gfMoU!;UNXLIiL!%ZlWr(zECr+c9?Q~@ z)A8nhXim?1ieAz0XNa?RBXz?AawC>a(`e+bXF$Kh>907&*vaGZmG@p3I9;%RO+I_0 fEhM+gN@olLaHThDJHp92UA!1^;ViFyA3o20Nx literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_off_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_off_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..d985cd82bb1d09a348dbe3d93473d8b6ec987e2a GIT binary patch literal 741 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!&II^`xPs{60%r3?_yhgpQWE4B z%)r3J7%Iym;_4H|D$FA)7$W4)EDi>HfYNJZS+X_3WE4m`)dKM`UPbP)*&+4Fw! z+FQHt|FKm&c7tVdCR(X>*>FhK4FZ>!B8UalG`eApZwO^DKc;;rWGnV3U z^IP@xjF6kTqm=dHbz664MP><|eRXV|>jaxCSw{7%w4MiVT(s}EpZ&2*ueGJ3+nzkC z_j#kgZR^S>RsPrI>nvlQ-t}ufHFtgesxPO$Z@RZJbR7W8@IJoA|7|3HC*IUWZ@_^%i6 zG~RA5mMM)FIMSxdu_P@2z&B6V2~Pys->z7csabRGZq0eg>NW9aOCH<_aM69+oU(0;oukv5n=7YIoWIT|*!9X4 z>z%i(7R}B+$&mK*o^-n*ty+0Nc`xURk+ rrr`<#@G58@Uq*zfP?c+h;GkUZBR2Zsh={4#jD`njxgN@xNA)z5)Z literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_off_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_off_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..b205deec0298e065b6b97c892c1625c6a903a875 GIT binary patch literal 968 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+yeRz~~;}6XFWw+KvK>Lm>0oRU2SX z=9UEc1v9WRGO(;>Qq@?cWX;LUF|&IsmzJg6I_J)ny0ho$NQg@(bZxR)yi8qemR-EP z!t@m?amfaT`U}I-*2vF|39_(Bou*ybw!Al;ZEEQZHCa8Q%=ReB=EPPP_R#emMT@rN z#cJBlS4;_CkWsR9PCnz+&|AQ`JnZS>7*cWTZP@j&LkL-HCJ9NF1o+z`MJ zVAqz`O5cPde_9Sqaeol8Qb2P4`w!7inpQY$$rYZ;=>Iu)RVVl|ti@b$4hI6)Zv@sq&C*^TD3^P9`@~8a}1H)wFRu zDnEUW!>ktTmKH__laKpuwtwnumztu!r>y@-cZ%d;?=NEVg5i<3l4luAS@QhO>bgbq zjOQh9n(<+amu2A>5AEZuE(JQqB8mEXXS;(FR=7QP7FBC{GmFWe+Nsnadhft))#L?t-swqyKKtgb+qxYIFZPM^ zybf7CH)^%ii6+MQ!cT89jy&smWh!Zu@~5_j@xH5Z$i36gYk=v9!PC{xWt~$(696mC BXV(A# literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_off_pressed_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_off_pressed_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..5571c4245d6c254ebb8d7f51367d0d13db081551 GIT binary patch literal 2984 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 DZjU~y literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/raw/roboto_italic.ttf b/android/3rd_party/HoloEverywhere/library/res/raw/roboto_italic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9f49ffd869194a92c2e71895169488cb4d037a00 GIT binary patch literal 160736 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

    UOkX{JeL^_MR|z{(Zd%5AEK&*Y!7b{pb0P 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 Z9SQN7PxcvOCZ)&Yip?AcdH822_&*YtObh@3 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/raw/roboto_regular.ttf b/android/3rd_party/HoloEverywhere/library/res/raw/roboto_regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7d9a6c4c32d7e920b549caf531e390733496b6e0 GIT binary patch literal 158604 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
    v%Q*Qgy;tdJj4ZONjTx zQ>HOQriyD0-Xf!Pyn-IgkT~x^E`-Ff{cYQHZr`;19@RLo zVEz7%tvhsma>K%>4EAVYey6^jJ1^6xHfx;Kyipxv=**dS=M9dF9^USrdDHJP8Z>Ls zsCBaiVh@+LW!aB9LCV8$fXnK*--X!s#oURC)on{3}3yd2+dgYEQZ zVI!DHh&9+%gy)Z~H0Xb=^G!zYl z(kE4 zEVV|P{yR6?I~8>rkkmM^chBL|Cf{*KqjdWN7|$?u8(RfBXj77_#KwjY9?BCNn=DXe zaAM`Au~kPFviit^zxIAIE~&~a^$9HteUQHcsI6+TzLf2lrh+?I$%Hfs$`Jw@Sscjv z>6<=b)~OvkPd&F|=kt#j_3txqP~W~q`ixD_J-6w;%_mQ8E}AfLzL%z^4wB}40g#2;{EX%*_T7)*XY1D+C6U|A85YNl!=0G-m1T>YNdz+rqDzur{bTWm9qSj^Q za~hs2k?+IWOye`O$MqJV#kG}Xbn|W;i&a?K0DhWa90mqn5A7fN2Z>?OoC(r_myj3K zyothM2ge2cH1%)t2yGqC87VT>vruHjH4HYBEf7*gVnNa=E)gW2a*(LY)kb4R_n9(r z(Be~?`qdL<|6FxnZVUpr)Lk2<44$!IfG2=!;e~0r{fDrUcg4Dj7#({d@|~s9swi!h zpV*yZ3g14HGy_G{Z>8G!!O_A~sHp1*@gik*~ zRvTraa=+|Htva52tTsqykj)NKKWKAM>>y=DRO}Q7K>q6f&YIOT$5=AFGdG-YI20CY z_}RegAfRC(h`ad4hJZa`H$hMFy)c1fGR*-qGt_GsJMfn|v<&;Q^2H(U_s{-}M24@r zyVX>?yH7-^Fa3F#y_jfYLpf60l<)>6?w{FAwG5?nl^MJp#rt3`>0kpY7F&1JxU}ZF(ij~#+fl*W)Z>RCdHZzoVRmVdWX4L+68jonhdRMfs+7H!N zQs>%fJhGpO6-mD1p$micp|~TWbzR8I4xtgMYlm!e--$aw`()h#3QjDzrmw|7~?=7Y!kVxU_*kTf>2a>ImF{( zuTNyC@B^Q6q@!_qL&l_eTt$2>lp(pi{5S%ewU|hjePFN!jx{9ez`@ zJ8B#5EA=L}wxU5Y>lA<8_uCZ^?GX@?)8L^``(9qm-TgK+X4?|Gf+dMDy@+H(A^YmaCSbqNk4QqWj_;@XMFD_ z&O4}xe%amuZCZ-)%wPv_<|SP!qVt8@`zYFs!2PWO>9)NyDkumU3?hS|RpU1zp@dh& zW-{nH=rvtn3aNuX5Hbub?jn3oNRC4LvSM4v@)>~-LJ2@orJygF&da~#zqnj1Xe0h0 zi16cYpMT*S{wjWINJA-h`bC_j0hzIcCs32DMU|5W3lX=LgG$~1g6b|3VQH? zICWB>GC2k8HJLYQ2TtOJc>~l_FnS=cga8IjHnJw9eUic~m{enk!A{dnUR{3RGa(;gv?eNum&Mk#FDdCR83s{ z?5s2mj*xo5WNSd&0PF#%Hd*6>5uFa}Goc0uo*m=|m?I8JJcH-Vaw^!cP0}Ing|0TO zYQnuBz@dT~kh9VYYt1a2sIA6>?-Vq>wCmu>tDk%^e#E#rr&Qb37p5J}b{-w`!GGK> zRJNmJ-16>ib5E6b>H3eXE3+OLtqqyFB2Z=Jvm!?f>M`lamK}!&Oq_jp_i$syQ@y$s z_TlB9&$K;KmY1`lUiabw%|5uNXO}y*1_zeg66X|)Gcba;Biu69wu3kWb68#~h%z6Ug`6Yyk>z@w6Yc~z|;x)(c3&1N2}2f*@ozcY%_yRs760z8#+7G z2IpdeFa40;(>Ub!MWcP`hxlI55AnS+v7HzF0Bz`~JgL{$kK-rGM1cG-H_Sbjh410e z5Y{|Mho*#xBs(^;FI)N;sb$g=4x?Tg>K};>?i&Cmu-?f}xNvO`EF#!&w*Ef@9KcmLVsQLT(ark|SZ2uH1)5-WXMBKjA*u zu9GjU(lalbH_gj{Ozt~xte$?w_!Hkty?&~4kaaQT`YyD%=tJ;!+X=KG{%`l(Gl! zNqAiO9Q|G$Abv0MU)V{nk^1lqRG}ojhV&y#ufcuS{s|MO#j|Fx4uYnDGI?YY*$?SH zq94ewXNAr}{a8Ab?1$(M@jjfb4n#N53rRnizwCqb9@$4f)axTXtXdy}_D~;oO+XNdRoQFgGQ=3Wdn z`#?;OEy0LE8>}%bYNNDIZE3QNEsfgXtp7iwD`TXXkNzy~Wh~~r&l#1LLb!Pm`hpy9 zej@v#PkddAFy^m0l2ku`C1V}>(CakmOd_c1+BKJ}d~#((lm7Pg zJ7gqNqzr9h0VPL{l&|oPYr^>y_8f7?rLAVFvRd46I-k}Zr*n1Lb`ocT;Ld zcidl|acL8xdno$A9e+{Waq7dmwC|gvJWy4TH_El8rerb5*^cf>a5Wk7AZP;ew#cy%O@Jwt=+p?lisHA-_tWoxgf=N=(NY|1&lu=_$T9R$ z_KEvJW3cXroQI!h9)0@3)<C_Y z<(q1IEMlI7U7^rylZ4dP@*K#Cso=1RZ7pK%QW>Gc#kR`yqo!Alz9L zlZ$H{07)o-;AyZc*^x>_dW(e4Z|08#uO+ceIK%%qr>s9y?;aFqNN<4Dg**#y^NYT*UHaP~0@#a+ zS3$_<3mc-en-*0#tJ)AN_MlCX&5ivMx)Lj@h{xIqjuK#=v5FVbW}ToP(zZIaqFq(` zK^5!OyKH-{eqftRtoX0o(~AGf^88KS1la^nZwX>rPDNZ{`;A#K(yng`0$X zmA7VB)SuYvJXded^VnINo4elwn>Fb~uAOLXLmC^ZywqoL<~qcg z5$yW{hVYQg!4gviiX~O!J*1-gP%mr8q~cA8nN4U#$(%tz6qN zuYNw#Uy$$8U+@~w6@^B+^S^7=VKbo@Qtm@Ji4#@EZytMeIphq)ns=v**Gi zPZmx73ngWmJJ+QZ_WwtJ_pin3xQu^fs4%M1vuRlCV4T-LrJmCW41oXGqO7sx{_$NrHyaCuerOGI;+XPChB!_O|A)gFMJu$t$wa% zN0v4OlGVwEK>F91YO?x4oabv|ZACxW>kq2!<653dafVhuXw$h`8_A&#;c90nB#jEu%^2a|NK4nFh(hKhGNZ7vyXtg zl%daxd2}|227}NbVj@8=VD*uR=VCRn`j(wq;MY9}0vUPaZR%|WG$-9YB&yQCKU|#H zI3YNwU0BQZR>mqM^|(f{u@Bq)#tj;%o9V0et9pOA?`uJ)euX_WQCTW*BdBjH^Tm1R z5ft%g^+ag_q!dMnlxez#ZY9DX&9EbrpM?Wggv<+G%@KWviW=rac&~`J6Ol@lk4O}b z#8)GkoVPW*GOU^92Q}F>=E!MGG`Ci8P}}fU?WRrdH#Z%`_~Bjy-~6DwoaVaAW*=Il zDQjmHv?zZYw2kPE^n-<9zp};onhG6t81|g}*Tc+v3AsgN zstgzniVE;ptszN)=@AAMQI}otq<_^Xp(&ZF4LoPSHxrJ5j;`#3K9Tc6d@{Ehk+K2t z&W^G(Kc8XTtTRG!duHK*l)(=Q{LNmo#VM)=#chCi}4mbkCg^!L{n`UPIO zz~A}+VjtP-zA?VXok><2!HY1)Sv&g9}`_OJQyBjC7C6AB-G}i z%-^0Et7$epNdSNW?$T}k5DO9zC?d^t1ZtwZ9?}QN0&u-x?xkCAc@4}25>b_&0;w>< zQy^7G;HJ|l=%&(HF!+Ht@|~^)h&qNLZ_#T`=jkav2_~+$w}O%NC@a^*xM4%bBOEyj z!O4?`51-_nb3#q`1SzvsGW~=}pkX2|I}B2i4iOSF?kR#&|Bmb0hl! zjsM7p#w#M9ny@i7G3T_YnvF@s$cj0EpbEa#yxN>(Kcp{;exMU=s-~mKen?-Weqdv2 z?qwaqoF@bSf!uCZAE-IEt(yO39B)tYx@I4Cw8^jdUGlYx-%T1P$3iwHIhH=a-&D0R z$+6J7$g%Y4<-0Cv;KO?bAI_sWV~-|PTmMEpj^b|72kdp!M){QQl4C(WF{$4|=Fs;F zT!-ifd-RB}T#k7oepmB1aw_|Q6zP=x*qo-UB>DlL4M85)n(u$@J?BVN@h7Bp$$>RmL%0Q1i6bsVQiu>eSjOY>W6si)@r(;?1wO4vY-BJl)!v33-g6Bi++UsE&J)O ze6RE&9aAmsBaW0cuS$Fbcyu*<6ZNCFuJm1i-u>6xx-RDhTNUyS%JB$W)dBJQmH2(O z-dxT_*tLg=-{UMBFN!+>xrKB;wyD~k5V6z3H#x{`Q>U8Gg!G5Yf*uPz1!&FzUmFYN zD19E}GZDT4);rDDXCnI``;+KHnW!w2ePAtxod$i3z<4te11hfKq?Ouf_eBmD^#SBj3PBWG4ctjHdyR$jb;ij^U62hlCJ86RLL-yrl_Oyp zW)+Rdut%QW<3OIIn)PA_4Ax(v97*eK#^jOLF+SLlzJjiQ8t+O``ca)P%8^QTuAo4& zB6<9NP2ylaLYNc)u<#O7W+WJsh&s@lu>+tR2=0*yQM^QIax5W9fsZUrwj_ZY@s#<< zQAeCPRGic}KDb8P@Rsc=6FbEZ=!?8g*DE~wgU-B@JYoFE@kI6y<31sS7C399IBLa( zi5hJl?{+4o0>PM#iVq1>KVA@qW48dlSg&zL1*ut$CocoNxM--m=5{j%f_!gl~k~! zfA!2TI5$MQjR8g;*6|*pTgEH#baFz1P_oA4H-)8+B4-+S44?$a4S?Yzo*)X`M;Ht| zyFgi~kwd|!ovLKru${oPMMCxz$YT2q5~CXZhrFPvXP)s%ka}E=e{{a>rC*ZWtE*>9 z6?rgh6ZO|&7+o!LbWn_89Ldm>`N*(Yw?ODGjc@^s*eE-64P?7Pst(o2Lf#u>wx^^A zBK?VkRS`E8%8Rq{tsfyJrSe>2MNDlpiZZ5{XdPI%Oy5k7SOME;O*{7du^{g}8ph~; z`s>EA)4}D>R>`O_O|>st0Glk?_6lv6Jhr_)6`iZvNu@v4FAel5mFOj){B5M3sa5Kk z5^r?{ZQ98;sGU6(R7}-Mr&>HrV4DSPevsNIGt}>^$>fOjG>V0vV!zpDyTIdUtki?Y z5jacxa=fcpwgHBed;>tjGs`z1FbqgOm9CIzME0B3h*kDOo6;z2Jd=5-w+supaTb5r zlnEcEM&Kvoc$l{gi#D}={Scs;SVJ}idVPqJcSHJI+cKx9BC$85DWcSnrbJdTVI8YN z6xkFrqgb2p7VWKcV!~viZ^Tm=*Dh@{8w);eXwWBc{|@P&Yhku;aKzeI%|9#7smMV~ z<~h7tg`FBO00gVVJ0mDJtu)&yY8D+*voarwt=Lm?^K!JX-5WRT`fZl(j@`5=?mK$d zD!fa*)w?i5L7(bD#-*?!>s|DF5_@r~7&G6MmlJ7A$v|w2YvVy)F_ZtpHegfuufGr? zcCo%!{Yc2tjh#3@#QTB*eexv7f>OX63Sv(5AAunx<3ds~a~D(c$;yB!^*vSJ^Uw<5 zbhotY(y4>3)R?|u!*rvdcb_)s98d4k|HJ0seVTGRxim23ITtVL{~^P^s_fHep;D8K z14QgfwK%|A#;#Nk0^B#QbEh$5I&~R4x_)BqtgPBe^=!2|jTq6X^WY(!60_Zvx8NPPM$*)!Xy{3nKcNZ8EjdH z9`$qL8^k$M2eceEd-lS{!6cRW$BKGc4J=c*St306pTWe+e1w9^h2B4S&;nh7^ z4#bH=Nk6!}@M<+O0{Nn#M<6Q-tciHLz%@e%qn}}&p**pLrKv?uN(^1~5$Gb6#e+ib ztY?KiFXu*WDaMh4YViQY2vr8EibNoG8AUAQ4>C!}JRlU8qP3bisAF+XR`W?S1~=W` zIJ2eg{h>?lY||j_&WDD!X-IoJ8fU(X?R(g$0+h~H{ou+>%woo&5F~KeWw3?J$QwsT zoqk6@U{oUBo&JrH2|g%tE71wUugXNA+_K8>W@1_6dn92HX!&^JrTLct%hso@cv4yq6j+{$ADHTMnrl=Ti{(>7w<6C zrw1404;tt!7(B2}t+@2`xLS3-Zqu({oBZCr^W)Of;%jF>Do5$`tNM>zHF~g)O55_s z`P_Qj`z`_{MNAZ*E66R{xEJd`@SR3aw3*?q!)Ih2>wDU4BM|$dpH=$5D++L~p#7CY zA;ur(9;{#F8;u#b`)w^6AhPcu)ZFy8)|V*ERz>+c)m)--hWIi}j?mjPyz4`giE;4>$_;zPz6Pc}2MI-s7-);sE8| zd+jfiQIc^aSJGb75BNu%3;NgGdwU8)dS=Se%x&r+eqQ^6@f|;@=k>3E);0KVWOc(I z=5EQ4@~DcLn8DwS735JDFY=?W(IDQ^e`lu*JNl?j*W}>vDmt?yH0Ee2-@a4Q$FTFC zX#I90m%|w2W&A`q#N3BjX>h)N0CY8jBkvWpZddXl@7OPenW5R{@Tw5$z0!xX{i>`L|x z@^gSNqm_mP0GOQ!^7nP;Aw^4?gQchs98jHq9sz2p1D|40J*#3p&Kf&mVhr*eVlE>v z7v!K{ooqeM$t8ibRwU0DcMNZgWth!`0hIpQl& zdjuF6_A*V{A#UxiJ35#dd4*0xe@^Q~yIvG~JV)il8zUZC?M=794f=OldK2Km4- z(mOC#JJ#3^A7=GR_E3MIek#BUk^Vy@!YUk*!YBz`3UZC{5ogt?gKE@SedBek9)%9e z_fY*BtX(7Pv+zS2^hT`UTfxwn5+OA7mo)I+$hP~3GoJEE{DjT}FV;m}&r&mLV4`*!s-P*b zP(U&E+>WX<1lhyfa{U<@Ss_jS#@lMhImp>(JV|@UovyLx)z{q@Y$Y4j_G2oh27aeU3l6ToOG%IfiV(I(3HN||85v#82C_%($g7*47v%(XeFXLWdRPRSV%x; z{iMX`D4o(;k);LY1wmB^E`;SV$u75oM!@gj^JDj(lA3xa702jC8{W z{$>x0j%uPczRGg=n^#?5@;6z|moE2}W4jGw*Kuvy@g0V-<2dLG|Kj4O{EB|zg2rln z`Z24mUv@ioKL?rm36(v+^O5INcQ^b%^DDsoP)`H%Ya#XkmULS@<`=6_q;^brSdBnf zm@S?h9UT;4*4IF+01=VO6HXdC>8}d;is4!jx@sS6^45|+~V_2PE>GQ$&YBKE{&cYOoi|W&-D5%e!lI%bo1Ik9_hk}cy ze2@~1OGW|$w#6bEq@B}AH;Yoyil#N8qHW}^f}JEh8fPMha-GQ}Ca9rn$N5k%t={p{ z!2_pvujOIxSu5eY`-A1JoPp{?A&xty7xn-Dbm1A5+tYEgMbIL_IXGqCnEc$*F$vXt(Q?) zCa$FQWZX407pG zY65rp2xVlGb-QcDMb?d~OZHn}%xYRFK#|9^nSr%UMEa)?hUk9)0yV^LXcRSOS`%v|@+>hjDoJ^(4lFyCl?BKQ5(EusoEjlx9if()RV`$>?_sZeJ9@y( zeoB7_}%a7H{d8_xbFw|me~`B zty(*={N={YcP*N7xJ1yZ27H*v9UBN6dH~h>Ch5ULt7_Rm3uNMTQXxgT7h$G>1|{q> zIh4H!Oc|M4wfM9AAs4^@98-`@R&QRea|ioeyXLlaC1@SaxWsKxZoE_=ZED6u!xfhh zof?yh-$d02@T%BV7uy7z44iHdo;5_x(Bnjsgh|vBn~Ae6jM2oMMD8RdMO1DG&sWoO z;aCT?B9u1KF6|(1uCjZ_Op#XH_fOhY{vn&WdcE+e+e)_>{F}nx9yX1*Q6I9b+RXTN z2G=ehj57V`V!Z_2(7WO^-LeLJ0?rVkN$r8S9k`*e_ac;xO5)PoG8IZmpiiEWx8tt^HJRF*$>T_vi@1s#(z6;?)tb< z1BQQf_L)Cy>a#0HPoF*c-gnuj{RVU%J*BI$=g{L@1}{oVnbY~CX9Yzjo+oj*b z7|gxANJAw~#R2(&>`D&Bk(3w{8DRJ5l<71bnbVaj!I8KEH4^d)t&hAB5ZL6t0Pumq zw?MJ-NTj=v3T76gIfUo23`eeZjvrh+b;8)BN1jwmCif~B+IvvrCr++hhd504dRyrf z-gDcP_0#WLxagjJ4HqW%@6fpU2m5ESHV0TE8y#PaSI}tC%?RWt4#jV7mapD{eDtt? zK^3O;kB6RW`UPN67RlDhwr;kepirE0*%EyU|AEy`ChxHDPhO=QB(<`4{ ze_HRbc7EHIwvm!VeC4-m;)qR?vYwkA$Qsq)RfW#{p0!=3R(7 z6pp0khEWNb@JN(MGBG8HuBU^at4Ccw|GxYB`{&*6bTx9-qJ=BeNcT6Z7c5$#s@M2u zEa@6M{3}c5|N3?1lRKV%dIvvtWXFkTc4CDDU(=i2+;$5ph|E3sk7c`+TmXxSTWQ*E zMTmrHKMP|ka_h%73a?jxVD8L$py2O!ZWpj{G?NHe6U;Nug zwoaPWs>O%MqvE$@_|OR@+qcbnc;VuE_Ts+x>(IF6mDkq0>eX3Y)NOX15;`M-hX6Zc z5Z(?0?t%M6S1VeX=?t|Hbec_UZ%WBek8|F%8^y zsv(gIIu;5G1pKq|v{QZz58cf~x?&PT$iL}vX9|QSop5ww)qfDA*Au5m`L;Zju`C%v zPyN_6Vr!m@vC~(6axGgqcQHyotX#$Z`whR`vbnoL`;1*_ob=IKx324Yb&v_(K z_ArMGnL}A^_1sswdVJ2b6|46CJ^}Oo!?KwBLm@%z{@{b%VhwxYu2N3@ zo7ey_CNK(YshJkrGJgn@Rjxz(gcrN`E^Vc@yL_0o8$^@#Md%plGg6UtGm%#=JQVow zs&z9lQ<^oLY~ln9TbLBjk-j=3Cki?K!BS8pf%RT--$M^*1$l4fIREwCr#~Sb-1eh; z+@%Yc`ruvMU0lIW{Cr&?XCt2k6n6YR&9XuW8sbDvV`LOUisBHY z1`EY?MAC2u$%xsI4^*?;G*B6tNCI9&Q*HnqLB)Ap4+rUlHwUi%c2&DEZrP1t)R0sd z`zE?V!kfAxi zBG{bR*}27A>JBl!D&vRVaI~%)91x`iqy|l2nY+;7*WP6dA9eJXJWcPsYtp~i$L?0V zW?>Ii+iv(TS;OkNFKWSTNgu)1u=|5~x~&_|O#<1@u_M3}L`Q{%!i#CyC*o>_1B*v) zIub2O(nQ=m4vgugD`@(5juTl=FPB|Il9&VQ3`ibB z)aakK&u47;M93UJ@)x2I^YVHuPFXE>mB+mOafFIQcNiZqGsbX?ua43|@X$I+9jY)K z6&Z?*19lJI!I_pw&MZ3D(27` zp-X>#%B;HO|i*peL}I>ZOp8 z;}DhA&l#GQ3ba);<-7Neb#OL?w+`vPBGX|}LHbl1z`aH$<^?8+6GKKpA~0A1$j#ow zT_{x&S`{htQ^z7GLqbNi_(f9Z&POfB&9; zhnE<7jn;?XK6i{8{A+%U4PpN3Ce=Ohwes)Y@wIMlR(y@a(8u>^~v4-E+feyLKHMOMnpSV~|P77TYexIENdW>Zmp8)qL=A%2CqNING;39=^N zvb}IoApNEd?Q7gdd++{3Z==0;|KYdM-n;*rx6$6ae^gw(<$S&SM=ZoG+gJ8~>$aZ0 z2bzCi8AV23%IRVk1kx^yA@WD)y7UE=uu-q(%r~+)KU8k967!0 z-cbYkYCC&9J%;mVW>3Fw7J|FRJl$)%`}cuQ-#PT@A|hOW{&{rI_kupjxcA%2he)_n z;oAhpwF=G`H>6p`Tee-$d7>5g!%bZv1P*DBzUZujO7I{V{!H^ycIaNgJ8NRhMY=$- zCcu?LA_2)JyF~-Yaga>lKhsa}q^G`Nb<|g0$XPUnJ^k=gW)*WjxI+141;3iSDS5}e z8~3_%MNxCmR!}-UiSS*BN&w9R=1Rs~5N28iWCJ%+@hxoiWssmoI!Q!>-6b(WN+Xi) zSvE>%K2p&R3-z4gLA6RKl$q)IOT|l*M+YO zB%jVF)q%E)a$0nIi7P-e5Mo7Tc07j`fPmQz}(qzSkn0Mj~IVA?#V%C zOhiOPd_-JSO|!a50L;d?XV&NoOVf*-$@qo8AAFDG>_Q+1uxFIz2nGg-M6$9ym{MI3 zX>?Dw6rhy9ZV%?Wg$+5jKdHh4YYY23-l+^RdzY|G@>pNxqHjD0=CPk|6F%#|#JFg>Kr~{HVO#?y!rEhyn+TD+Axunh zzYB}b3tYT0-1cAFqWQf6q03 z+0t-_*5lRkbwRzlscU%-FJWUi^8T~C*ig0GpI@tI|KKHe>2u9-dvGV%Q(QJ<9>y67 z-39_gWtAck!H&UMciEW|;fLxcjI!_G*D!+O!Xb$VVIus=7z!dJ%)KHcOP0%{Y#qol zfckmbf0~@h=Ocb)Kk#N(*|Iignz3b9c{BFIuj+R9X!@(EATZ2L+yD)=GIOHRKx$5suAhBy)&pyixr<-sr%*SjY{&6) zC!T!fnIrq3I=1?yQ#gZndOfX76 z`3SEU_Y!MQG5iAVK(y0iL5mEaQ%jlY2^@e0_TXQTn=UMa3NM94>$xaM>~4$y5c);$ zuU_A8E4_XQ$_DmY-g~;!;@%@dr>^gvmgk`=CP&=y5Y)FOKZ=N@p?dc!Bn=ZSKv+{c ztEAE5o|_gN3=^huY4OKl)j|Q6CI%GG2(9und+UeX%oTIsOT|D1iALgP*}?@F9umVROazgaz~9U+}%i@rC$H1G*zU?}J6b+6#Io&i&u2(I}={X*LtY z#JfhLu$fSeMzv`dgAMuI{X^4T#cifKVjaU%dylN0!DBzw>@RBLujkKuFe+qSKv=)F zeRLl6Mn)VJ+}iluC=mp}~0}u>e&}NSH<0FxnN9 z`qJTX>?Z2_yzBZ&Y{oYL5&h`?Ll9rYso=eD;5`xWNtu2$Y31eB_x^Y64c>U)!dmg_N#d(} zF#*aY6sR;2ISv99uf&cX&Kiwdk2gzv6edoj6ZJ)yO5LXg zSBrF?mRt>eYQ)EkY>X)YCm> zcHkKhYQ>5JZ^leh{MC$c~g+ zoj<~VtrkNFG^*YN=Zbvq@VrwTil_<&>A-W6AeU(ncCc9}|A{L{9$`|q!1_FhOrrid zDKL&uxj`Y-GKWNIINa~D{%ba}@SoUwF8(}#w7+cM^XN7fqHfN4;lWow2HhK>KDlzv z+^xi$L~NMwWwsN0B5kZ;N)lxH9aO81uu6^w$qnLTqaq{1P!cnVC0Vpd)MaWG4O>9% zgkTMlBY6cy3R5rwl6mbg^hg^h<|hsR=0xD(g8u-ShrOPK3P$CaF<l62Vgk28B8+0uKHwYmuD5@bxEpru#}yB6QEi{RyY+;owK&mc^}2Oy zS8v#;cjxDRvcNZff%b1$W0n$R&ueS!T&U~2cGwDsm3Sd>G-Vz3G6l9UoFlAP4`)G$bSSfANoA>Q8jGah64nM}u-qV&2dtS8d5SFJLc-zpDET#x@#Q z&~I-K({=kL%se0z;c~;xqBVveNZ8-JRf{ID6IUL!s#=JebMNHY_l{lhtZMvu;*AmkI{9?=+6Cn z?K00C)vv#`zTsN|-Amul@}O$)y#|6-E2mt5>~m~2*$}oV z9VM1l<^seR;HLgRl)r8%^4H}ff8Ed3^Vi99r_tPRSFaIB06YilxQ|5ZK<@V}*iXoJ zr32STPI zw;{nKD48N|Q$Q5j2y=yyS)fDX3PR_Jzz+Y0eR%Rge#CHb(C?-wcmIRx4#87y z1+NqDrv11s_8ZlGy+r6rE*C?Ln&daKPFc=MXmKP&qh5uuIFMYcU3c-?Fp^z%k)#gy zdOda?uaNg!jlLX|4 zs$W}GyaA>ISQHlUC<|Fh5K^_(;0KRu`tN%`|NW0EPyI(%pRlTT8>{}wn*68k7cB3y zM-5NaZrXo@$Z7B1d_8ClJPU%w@geoVc)ZI?T)=p&sKj_+O++3Lf$T)NX>59nzm_g1SduI$N|R*Oj+r z_-mIw6TqV;s|S^RX4|@cb-!6@fF7+{cfCH~-S-0C-DCBGF!9=$GcQ+d;(oSOKBY>J z{F?upa7pZ16A<*TBTxR+qn-N~LM82ey;B=Cxs^bB)47B-R68%$Xt2Bse5bxh+=biG zpMhtI>20Q@x3_NcdP;m9CYR);@C$46*+MT)NnsRr+EI_@NhJ?Izjk(lFc=*=cD;pTdCUpC)`|Nr@nHAijN^)mEMSlc7UgZSz1>dl~Px1l$i?=5}h z&vTV;E+4=XSZ};%xh(I+-;dQp3XkKqrG?b?ORy|{z0wb`~}OaVd?h29(zA|+5$m#U^W8_4DdG27gF zik46L?xaBx69PLv=NTAkAdp-q#`QP!X2JZb z>CM)7D)o5y{p9+f=n^fCH44uNm@*3V`U>c^L*nEq-i$qpE&G)*e@l zihq0pI`Q!{-`mtD9vHn~g`dV3vW05EL)sH_1{ft8B%#rO)8( zZG*l{_{<2*=y7MbmH)@e-B?9m#>p^t8V*`TDo z$16fB!17k*a-3vP76`@ES(S2c#Yu=AeO>Km|!Qw4Yu4*9zr43mTmE*DeL&Z+?O7E%FllbWtY|1{fpYSF2A6^G4GvsEcrd3@_w;P zU?;#QC}**&UUB2tFH8P%C=*H3{EPeCkz_FB!O~GTkHGp2=tg*EY&zfx=o~9SC@mn% z?X(=8YfO@d=YHd~lb&>QvCK}9sYp0=BhhTxa)79o@CB-E+49*%RYbH?58+0yd{)S? zB7dTgG5d?pgj%Eg(+1@N2X1a3#`BkTqtNCB2R`>0Lb@=-B=^6{mxX^CJkbU@B zUs5V8HVYj?eN2v2-NUv@R;&8EuYuNBV`QMcARV}i|5tPQZ{nxL{c_1mHE*7aIrZoG z_f>NFKUebd%XF87o@;|&o?Vr93Hg<(=1vg066GV5`m)kiIf5G@?wcp}RObAn9Ey<5S!}z|YXc!~g5pBA_fqsc6c-8?>P*2nXjKn~*hlOK{%|2|kd7y`J&31$ zA=>hzE`C5tU)Rg{b~YL(Lil6tbzm!Qsf=>QG;f-72SQ1*>Sm@BE;A}jpcp+gur*Mb zy3#UUwd)P*fc^zRoCX0vup0rCaN`4TuF)sXHK7?H=?hXwZcZzjj|iV>|CW$g6R2dt z?2vU@1Qt<{MP!PpaG1HL^=`Ry+J1<<8J}Og_gL%vW79t7U$C%`3g$Fvo_1%GrMnL= zA2&O(OzmA(YtDqFNA@hq8FKYMAzIN8U5#J z{@zRF&ibrtaWQ|gUYqilScB7lMpMu4wZrfCryo$Z^13%}!`Zarnx5A(lwc<_O8NyJ|z3x%% zUYke?kB(RuR0o42FE3~_RsoDlKy5^XJ>@=z#!(5UNQv}#RZMQA!Eh?v=4$t=m5!bd zK5$*dM{@S)-99BxkKV21wb$I=Sq><*;$v~Q3Q-PL9C;7TR3G6l zT4d;j7hJ3jeG~$J6Fy$Z)=f%)UVO%#V+q$xd9mVKV*~s_natlAmsuw*#Q}N1v-hy{ zkW^r0lNBD6f<)#YfJib*?&lw12h__G2O20mD=L^FRy-g8x&eS*BI-(75b1o7hzqO~ z0IeNvvm?<#Kmhg*>52W|eevncKi=8pf7%iJ%2sc16<}mCd;r)%i5!FzfaFXck50DY zg)!8>;|{_QK5rom&yU;svYiMVAEZMH;FY<1izV02OC%cTd3Me3sGNlkWeU4y!FE_NMpW z>`;WUc{W?sHc}S|%OU;1WAK7xrN{D@RAbq4)9Q8Mw~%8l*Rhb_ zE||8j<;y|c^4XiVl_#Wp75W~}frQcEJyuiL!JdBzC?Vvg#GMA73%n^rasEZdXNO|f zNymd+2>pnGOW-OH#00qIN{6z*7YS;Z!W^KB%XgpIwDqhSbU;B#sKCUR7D*c){!B8g{icN zGsS|=JOdTfS=+(c0qnYcBujttfWL&0A?^ZUSPq=M}t+R+zX_8 zWl#tpeQweMn4jo8K;^OEde^8Q{&cO}Ha*rAwshM=u4_N0@!6MchW3X0kpNc9{esru z-LLs-cJH1Ab=_OkS@8?@(5J88RhRgycJ~7IA9+qNC&bgWfL%8k)^7NLWxDcc;DpKE zAgjE1=F}hwVnk>VBJnBDDlDfMH+VQP6Lc33NG&BQN6ODizMUhoC8P+Pn>C#ThR?`x zn1i`QIP_6-`IWMF%4RNW80a!uE}!8#|0e%@C(^NPE9JXz*Bt@xeY$7Qqw^zpFLoke z{-b;LTz<#SE-{qwaS|&BX4-EF_JwkzWx{ed#+f99#yZ#`Wc!IjCJw?I1fXV(^ow|E zH#bELDA-C(75>CX!krLJz$OI;!=MshBM=ZtdsI*W#cSicctoJeiy$%k7(E^S+uN`5 z^2yr9@(0Vx^om>ToVuyF{5`Os1-ITnopbxZW$3%*$Q;{@(yE**?bNWFwbd8K90h9o&64okb?YND7{k=R;`?Y*5%3@Xg z)ef_lOWcp%a+^WZx**PcuYDRKQgUJGLlk9ht?p(_P%tWhNvxU>fE-$(8)VRI%GD{b}cBMsbhkmseHr#v9;zgThF2BD- z+b1)z5?$|%HJEM0i8YvT%Qa|MZ4D5jgD@~P(`x}p1cW5(Sq5ReCg{ABxvDHfrT_S5 z%MjsNhT`Q5=1%ADvWBOB9XEKwJ-?j3qig%21wF+gWZu1S?TWQ$%r#Ia_9<-BZ~Oi= zooA*v=Jen4IM$$lf?R{aU3&K_(Q27%0KM1Dc?BHf5@Aa*V>|JA52#RO9=jmKV>cvU zRY-9CtaQ)loQDxwn-syNK>7J!MUyo`WOA;N`pOWh`%EFj@_Q)acPz6tO6io9X*A3c5e&C~&R z48TcL(*|Wv{;p@fy*jm59(-w&9+yb&Hw+KnEnBqh3~(P4oHa;}ph~X@YxLmDpwuKI@40Y< z3lRsJ5k8TbTx6b?+Ht%y9gWC%jF>0LL2wTc1X;GkHNhc}fm%mm-SB0iHSlOVN#1A{?TT>RH*-I^uk#I zAzL(CSQKcbcv_}LKKbkY9^Ug$R+XIjJq)9>|Fc(D$=_PvP1%@w?lu!XNW zO>7~_Exs`jg{4tNPQ*nSaDO-y4d%l{*p74zn7qJkhZ&>_Ay)g4mMYmZ6I}SizVIa`9;BjP z%9j7pnyq2|s?(1uSVbN7_7$KRPh0EA3U0BEm>BHEiI6-rJFO;gnpjPn4XcR&6Iw`- zU5X}&g%sIpNPR_2ZR4s>+BE~KdCNy}adW*NrJXQt^I2RRdM)h)jraB+r478{W7zwf z&XdA*i7QxJ=tCNPD?X?PXbasZyy>CK@`P#a*t9>-v#G3}5Bc+y*&;rN*cE%G{X0~( z>7w*h);m+1HS5v6S(j#=J9TJVkl(6h^CpcO*7voYhFaRm@SfeeYKnhh98#VsP2*KV z&$3LYwn!y7z&{|^A3CxQW(dD%4J81|0Qf)%3kqcZN)W^ca7b_KDnfR=t*b(6Ai8)v z)>Ra_790Y}r6}0D!}W!nYNRKCi{`M5yo{Vky+`hBkHt0LS!!8aXOqP>mn^Om zX4iHl%$`W*)+TqRvg`&+`GvYU&F-H!trJU~#yj?Gjw-RYXM`=N?{L&Fune&3^d<9} zyqh;&e(gxs*k;GC{_xDujk!%W z-g)BtFP>~Vre5>foic|{UpTVYz&Ka*;9esZ-8Zyur`oKeSo-YdK1;7B){Nrsf1CdW zztk!x2SD>L^1o&EqiSxi8GYfgHap&SHgq@|w0V0+o5wCdDOg~OJ@2Q;)ei0QTUl5nQ+Gwq41Dk9qX@T7eXmXpR3oT<4b|UBidF4? zEm*J}COPP^Sz$1GC|VXwrZ7bNql#*R0FwAe)qr?Rs~(C~55gYU0XwEW2*w|&BSdB( zKW|EI3jWF%eXCX_Fy@ZP91CY7E9?l_$n-Ka$)jU$-VjLTZy#k^ZfWsxRzGb>-jY2> zmQI*ctIU0*EOGX@<%f4KZE|N?^Coi&KH@*H_>ZR@%Wr+`-ixdj|Ng_ab8?NX3)t7+ zELgCBkF~rAZR$xcLVc%oh_TE!_dbB7Vts{=!S)o^FI9Qc34V_HL$zTIFl{ov>l*Bl ztdL*9nZ%G6KrUtwEv5pl;Ahk@{Az%J*o_+Y46&kiQlznpeo=t|Dwz|-2YWP(k@;1- zz<&Il9%LyRuibzs7J>gY3D;7h)DYH?X(`5Hb`B%5T) z4CMWM5pqkcGQ(Mea;TE6p)&iE$n;qck%MFeq>Nf-B)yMXfxAqYMFpgmz!#Y}XpR=t zsFv4rTC~mNHk80uAB*>yefRRkYzm-Gzv0|_2h{WHFoZ*n z9?2Jryj%a{`9RA2AI&G!Yd$vuN48+b_3- zxL^?;xeEEZ9{HT~fhkz9O}5ssEjD%_B)YGDr)n*;zP)KtG2V#&C2q7mT zylnO~oR_pboA{f9^j2x=5a#H}KYi-Rzxkz(EbScsS7(-T^3WG7tq>^=UpzejAV1C4 z9GZ8CO**vT5bMGx9GVB*3RBMOd$mVx<&a(;5PJ z?}^W~BWV=`sKg>?Eb)C&Ipzl6LsCVkKYb6m1^OCUaH%U%WG0!+kC>hKTJ#);IaBmB z+S0!y*+|U}XZ)gpdvE3+CdC#gF(c+1tEZYSFSJM>eu8L<#N>c>wm7T$VAF zrFNb=|Na(tWbq428rZhYyL(bt~Vo zFElYUF#!R}kr8;4S%s&LhYI6>Y(VaGrVi*89R?iCxDgo+-9KRF)Vw?Npx};e)Ua?{ zWD>{_^cSXQrXjnw-DWcoFz%O`9v_<=X!8$10A7vE)Ce>Ut5=ihQShY;dq@oPi(|Mi zBn8%DHEJ_h=)njRlu!k{0WfJgYP88%4trEaVnRxYEhxw@D7r?xbMyZ%gEIRJ#+eKK zUyo3Yt|1P4MmohrSP1M$R^>AyBYMVNI z_%vOe&?qOnK`-%%zQm`7{5_wK?g2iJy8GeV%AUCF$$GYxPrv#vMvrmhdKg*Fn`iNF zjPB#{bG>Hx*}w8<_aBu%|9{lIcVHI9^FO|Och5Z`5FmsQdPs-RQb zd+5Crdantc(5ncDR1t#GY={jN6%`N_6$>TLJ-^q?J0m$_xGb3XJ?J?^;UiRwnCa3l`JJazI{o0w1?(KFY6+#TVsd|OBt>1locU}r;}+bLPx4t z@>!sI@fJ4eXL_Sbs;yRVP%%WDEFV&~L;#dDtpj-@@JmE^nbL6OQ2l9%TA`kj%(Y~; zfw(!lO>7FR@gKg%R1?aM#wKuz_57BP-+^kw@E`)mqsRn{e;Cw#oJA&tVG}T%%Ob+m z2sOb^2KZT3tyTUB-5b>`0HBohka@>pyC~btf#~$u&g|uFd&qWdUd8l-7x#M$KQ}E3a<5O+3Yo82# zgO!5D^o`mF-}utWmb72S{Rzf?|G)9yz?vcZ8~;E1nXn@nwBhr9CQdKpJbos%zH+&5 z+`5(h75*US4K;8&J8K7KPMc;VxjZ+hqumBN5tj$QXy;&KTVYKL@b@hQJD(4NpS#aw zv_)ch1zQF&`X-+Z6;=}p=K_W5u^p5<8PhY*swS}0su^7*%;^LZq(v??78j7{UmZv|D(eJ}V$*0WW%g3os5K0CL8 zT|pAcl!l4eqCxqi;|6W2KgCKc3JUQD{Hu6xfjbJGD>|&Tl&#jwzT_|5%Pkl&=K0!- z6to4U4RZ&Wjb)Q^5#JD}XR2v6P$#cAxKeifCcF2Vxa>87aT^C*x|RKGyT{xF`FX-N z?CMBNv_G(Xv9Lu7ZSy$(OY=ngUx~@rXwASp*C$jrpsnI;6#3a{KXi@GFrMLY1f0jA zaiBkFafFS+u4QpJh{0wDA2%&D+sK!#oXWNol?Z%rNVXvSk8}7MP1%i}Xm_SE zIMb*K1jzFt%1ZlA|A#!?Wu~E8?mR~s-(;^}uN*S`WjXmJ)_%Xtl;_tQ&T;8B$0cnP z%IPm`rtKf?3}tfHU&M=|v4L95sK{K&yZF6SGn70kF>f$7irn+qGZfonKF!H!mpc$! zP0+ygZ8+2m;DJ9P3GiCPbMypz=fjF51VcgNp|>Sy( zeLe-TWywZEc6FF#V*O*KcEd=M$Nx6=wb;-zJGlaYxr`a%E81vY87_cEZJ3Dzp zAqSSoh5e$ua`vndhu;a;uggnBo8wcArzCh+43Qd(!FME&_l$e3FVYX*J(31dx>T$* zkixDJszcymdoFxZK)TBZoSl4dHZ-^e=T~?-1i)4kA|Fi4zJ5LX-o3#}>8}<0VPzb) zg)X-b)n;U_SdnS$QD#}d#rzoMfwq(2TYmUa7Zt5-*hl#yUVAA4Zrp$}1@N5%J zGUyIPVNu^!7|~HZJS5zDF$`uua}Nn7)Wjk5&!qZk3`)WAax)4(0&W(mJEmpZ?VKt!ocI5Qj=FuY*;U!qR_5Bdj7abZLww0%H|!r#HKE;8 zdqqeKv{&k8sJ-^$=S$FD7jk>OXFgZ^;V#8)BpL?({i}{gO0(A_&Y>}K*aNuQfq&4o z<`y*WQJmX=L-TP>?B&wO%UnQ5Pld?-)!p_V@Xsb6_vo^IFY7vzb} z0ZLV4HE%vv`pS>j=kzo;AakC(9Pe4luh28jCmj258j{OGP#&HFFdkuwOGXBa-7rF+ z^>Q%Q4D(6W4~!C=zFm2ueA1{v`{#4g=Wm~loi;)_w)%7PR?BZ7Pp(rfn`C+^fRT(F-(E<|d;~cfl(NM>{~hGP>BHlR!98jwCx0FwnGu-FJag3ul>WgASxDibN=HXn z$jQeHBZ3iToKoh!?c1->(y9S--YZY^eb=t-t2?CfuJcN{F0ER1T{EX_Ib~U`Lw9~S z+{*aDm@m5{4vY>L_HLSzVK}mlN0%HTI5_h69sX?w&7D8MHeqMMTFY9|@C|#Lu-4j) zd9=}1xN;>=F1a*M@*%`SuFa(l4x-J8WwFl-d%Q3x)$|}pnMF5Um)ym6G7B>q7qjZT z@Nuj3!cnwqli=KkuL7Yh^!IWWpMG_iY1oeC*^ zLfg@>0eWc+#v`z;LobD+anX2Wcb@S`52GXP*GHO0&NSh9(u6^eWwCxs0AlDjC5rJk zHrCPJd5mR#HJ{7R_&HXVo}D8II-F-$VXUzT=_D)}{GPpy-TkdOX>iq|Ere77MS;QT z9<&>ghI;5lXt?4UZ<0RB2Y*iVug-mTa2}a0Cw*&l8F$s|!o5{Smv5D;%J(@>G7A|( zDU_+|$R7E-&eHNl|HW%F1#lv_Yu4iSG!8)nQ8kNNfp&O#W08;|d(l~K7#NYq7mn7V z@rT9Pk%AC%X8}2C>+iEaJ7sLW%m-{ezGUop$Hy2fS7xgF=!`ApX%2$PQT@~hUw>o1 z(tLx)b65Cz6+F*Rd=;I{=gN;vcY?7&Uk`oihZCILt4f}|uY0T#F1##QhATm%IQ(A< zPKX%nS$U;19}0opjb8c888NzEj8S-MLZdrUU)ZF%LJrB6bB%EbL$^Eo={1XArlMp% zoeL%UyFEvudn3H%jE$Bu@Smh}jf*_*b?oM2C_8bOaqoy0G9Hv6UbETY-MJ3-J#phco{)9PN$gQ^CI>S}i=sY>N5X z1b4+9J5Pn?zhEn>!K9$!6p2Cw$@`epsEcNvQ$`ho3kqtTlq^T92*T71W0)Xk%qgjq zfrFRRy@~oLtTG_fdvxy45bcyU68-CUwwRZFgYcMUfU7*2xjiK$YV7%71Zvrh8|4Ad zP=2zua$3IeqHuoT%Ty3ZF%gI_r|EPa)8p6l0&=xT=1EmLzYjCsf8mMQTF@UkS%Q_B zsN7$@kR`c4vqit`6Hkuh`i2=2MkDRK{D@W3!H`#T1!(v|iO=~VZ-o@6nD?Qb z)wLCdKkSLQUfh&42{4;##XLo;X z!f%f+E?7I@t)7@DZ7)^&Q;Y=yFpQZ)gnTV{;LGA*IaO5|ve&{>`z_DR! zu!7wv7zSvKjbp~LjoUP3O`BIs$=3H|DH)klMX~&2AC!?C74z1wdp|0KxMfEJ0Rl*m9*0t0%{`k-m_})KYK5VPE(C@c~4_g`ZWAI%L zEGtDwaM|#{@Z!*d@Kdx>Y#DcX>*a@pQgKTbMR7}+#l;bS5M0{OoVVEKitBSFrt=9g zxPjM^X*Me(gUs;y30z<}Xi|ZdGxvyy~V{Wjhpu9MuHCyp%ASaz^Y`#Wcv zYI$NmZFBV3KIHLwbwu5BZ6?9#QLYiFjWnK8gnJcptZq){%+}8HgJRmVNc`AL%oYR8 zeUi9@=6f{O5;D2Jd53t2HH7Y158znd zymUZyQ z8GT_C*@}3)$5jtB-+oCw&>GGrt_RG$DUI4YPhDaBK(Tb6jUO;gAp96VP=EMr{Gf#L zbL6Z4%;PnTe+j4MwLCc2fwsq-?_DQtXY!x{bETc;c{Jap4dHD`3;< zYl?EHl!>Dtl#i)b=5l#c5lbb5<1Xwn%MUs$GM(j}be_$lXUte0L`M^o&S70lI++MX zbih8)Ao%-G+=aHbV#NdK6taN8;(@+}DEhi6CX2b{Ke{Mdw4b?S3d0n1tZ0WWcY2x$ z_+UVrYsN~=9etHQVzN?~6_gMU|2>@!2Jwq2g7`And7|`{Npgg-HOKhCcw5a;w8uGv z*Cj>Aoc(RjM~E1A?HxSH=$ z%_>?8Sx7V?+vZ!`M=P)@IC;(G)Nes|&m>-_GrS1l5}zUio5FA)bn(P6zh59`?VRfz~c-lj@xbxMw;_Z z+IGt{C!RDXZ5(USav5oEQ$31-VI@tE^OBT6iUH`8D?^8s7VT|?OO?PTF`Us%rxJVY zr>}|iE}Ye+U{^85lGq*Lj1&X|5YAIF4fix7z+{RQ8ir8LeKWi{gu(#@koLwo0MCb8 zRDBftJhhKB`rZ89`1Px|jQa?$yLSA7O1upsm@gEkTopRsUX`Nfx~N>jyR4$RXAzpk&<)hQ~>emO4+dF zjRL>?QwrUR4`9uA{mn z7cPGP=@otWhE-!S7H639vLEgBiT(t2c!BGAgm@&A%>GIyIqTVsagl{I-*Y{W==Z0Y z!tp1iV7X&FR+2jt&p?Fsd0y^JJS2A}o`H$E&n08~7Rel0ZMi)hXPKk+;F3AE@34MK zVOj<@$gQ8;G3J%BOqXd7!Wp9qR{qdF%sjl%=J1~Lcu%IHG%E5)b(Yu6;||i`8CQ$99v1QDIsjp5Xz9J`+R{yyUv zA$H~AyBRkGd^h8Uh!LTA`EH*1L3}sy3>35S@ZH1%zB};@^la@YkBNiM7GWH+gN%P6 zjvR_}!Z@t5gE;Jog?YOIvUHVY0CR2T%Yi(2cpk}T(_!9CybaGS1KZHwVm%eK42599 z-XT6_+_00=nkSy$az5Y0&$nS*8)Nkm;bd155u%cIz|32kXG&4My7V4o)Uwuc3~3)> zNEIO-qMb9HGMLMP8g|EQv0?m0c5%?rMTl^9+JU;Tj(rD;VcH?@j=H8S)WbMv3-Exh zo}BLBQc5TOMmlpux0ED;X{~Q0TS9njVA^uNQ(xofRgl*!R5qtA=R4&pK9Hh5_=)oa z;0p-b39aln9V&C#A#9;OuspzEf?b#t$sO87!`HBa(Q+NefwbDh!)~n5(fSQmndvwW zGD6+hC->hswi#Q0mHRUn8H0Y7DYEUa#=uQVroE3+A4ivEW-1fx?<&>pb3jiO*Z>eM z@qeL5VS3ylXchOUd>8ZY1*8c9d-@cc%4(~L+xPAM_AC1pf$*+xIxz6Y(zs{8B zj1h8)Q5PLOtX^6gctf$|Z4}`iVRJaXJ)Yzv2Dxk!wm|mxK-6}#GjW}|gdy=W)?f-A z6pV9@L+L~zGyJ!@KimHCJ;RXlC)v+f$0rF5S8PvO{e3a}fjv^GwR!ABEYgrp>52Gw ze{tNX#(2QA=~&+6GgO<~ikB!MMTwvirrIbFq1 zUI(M70N5Rk^$wn7JAEICB+Ny&(#S<~cAJ5tu#2ednV?Wb zdw9sWYZijYM=|b6xoArBoh^H>X>#?83|DCsl;xg23hRl%B9@}FR)PJTB5@-YHT$8u z$6eKQG=-4Tyi*-}g%ns1Q2=wt779`djG#>ubd)zO=(&%ZeinLEF9w@76#-8ASho$) zU1w%uPVHPPaIPL8FQdBCW;Z^f`;#j*7r+ zha--@QcFpETCdw^`O%v_uJn}?PItz^q2DX7c4^-MK}Thsnu$N1^v}v}TE9>*mX)N4 zcigpHN1au|e5-I|`4GfiCEr^diLAIKDaId-3vSG?g}~2^>I+o|$m^EoxCCPqEFsWu zT`#Dc8(4YovKefgH#$3a_?D4w4p1d}OX7fXcHXG7b9by*vX+igdSD+tY|H@JGI7*2 zE_ZOS)Qppx4|vJ6G0QTi%p9Md`SGO@+oQ`Ln%1CMH~H}!J+Ahh^Lj_bKDw=L*o!KV zBHD3VyN@Ac(9rU z!e9pCZB8a#!FF?%0fLA!@Mi4@SAiqk(bvmJL`CmMeQEI8?Fx@!I_P`oNyo zmE&Vaq>VM6=(50j-*xZOtHX`RO3J!<&9YkdUEcW9AJw$!$&FiPv}xYD+qyk#Tc?GV zp3tE=$ZcihsAP)>f-YZ8v*ZYDLdIX^N|r!7^EerujjlL*SQBBv#Z^cv>JSTv<;akt z=~RgbkVI}GrrRUxPNg9yucBhe7XRFr792kCUwlYoHb2+VL$t%)UGXp&`G-`IydOxy zCo(Q}@7A5GQ0KqOA`fy#4;womFziYN|9PX7q}8JvWh>({rp}l!H}m5w!*@iXuIDxw z99$w~X5(37mf4RXtZ8j@f~0pQ8h6!msO$fNAMl6zZ~1{*|KIrW{D=P+ew_Pg-0%@& zjk~h=wQqZL?c1SD@RhKl1A8jI#1HvKMw=F`yRO^4uJx$UGP8R0sNAlYUqG+eZml{Q zz1;keqM_ril{NqeiGwz{br;9Z5ybAs1O%%_Zl7-KTMfnV9aBdrFm!Nc#hZt_Nl1ii z`QO}N8TD^TsYBtVUk?R9aXw#w9p)H9&R^u#7^czQj0s3bFCkK^ue*^wQW!ea`6kz<^=_JfAXy0=!Z>J$x|H9Sco3wCIzW0q+Ha>#WtNjj?D(4k1JR9EcbD*?K6s*O|{&Z;h5iq7YxI5Tw4x~p&IUCrgO&Dd=i#ySN1^<*KV-+|>FDyD>JnYv?h{`2dfC~^S)35&tkTQ< zcYwL>|Vpl&H{eHk&{R-{x3I$1XF8YY)90@0e_C{BBKF-FGaHj$b^ zjS-86ot8@3D!w!&2|p})=<{j8uAtRfLesuWBNn$5d(@`QD2iRyKWEEM&8S}pEPERL zg7(K@l+zid9tS-*Yq8V09uxPuYLR4@&Ij8BJ5i8GqP;Su5q*Lp5{MufLHI&ia_Bhf25b?$t_z;r|33>%OuLs)N+{J0SF+3Y=!7TBnL(q9JQj9p< zpl;&QR}a4b{=vDZrc%YvMB*fQYeYjPeJYK_8*OZ95=fzu3Dw)ga-2#u9_{|w5>Uz zdV`U18?$81+mYYNnjwKJN(J7@h}`%C(Hx3#QggJO66_b_U$~I>^JgK1IEM}u&^GV^ zD>)2{(BBf#yjz`3?&uNW>*^MYXR1x+80EETh!x(cS^6pnf8g2R5X6`J`6`409$uL_ z4Oo|TzuezL@F}ZCj=S1v$ov0|Hs~ax4O073+MI)Is2{n@*r+Z*G|i69c^p%Q<@Mof zAWhw}Zk_!&NXwkpY-g)}E1P_F$Ejo2!=9-?P9w20g?PIaBFxBk6jvT|fk+wY(l@rm zGEg8z(LLpdDkZZL0_s?v#TTT|n*#oqG+xoE8za|R2(cN-4#lA0f@I$`r!Z!8I4z_c zW;X1GQ!Nx>cHDb$iWaLS{grD+-?)5u{X3_?;ZxrlhH-9j`nYr)GKlz3F&261{KCUW zb{;>erl4+^P*}`n6APzdL1rWYms6?|k;+FrN!#i09b&r#GRqnBfma^Y}5!2G}Kd)@`1}j5MG`ABMPL;n=}%rg;NvDLjJ@ z;E6fXgdxpYKC{}i2PDcbOuGea>n__tW$48(+5XXy@g%}N@qC$tXYYcOc26e${CWykIAFB+7UGxKw zCBOA|7an!E$Y4H@9gok*Ht}c&^n*@3x;nfL)e6=bs8;YE|3J$(ZXCnJUfG0b0gfgn zEskxNcR$oOx^WC^K^y=Mvf{YP<3)AP57woW7Ns~PYRcrc(~fA?8P*V-WjrfB!rG8o#}=aag0>IKCclHE~!y zafG>X+yai)P8_X0aplG`i^xJ*0i9zx@*h%Idl}(!>CP}>tS8B z6Wpfgym(ieGS|b>k%rd8sND^Ojg8xsuM5A4r>z@Ls+cExfH#Dvhm$uZ9zQ1@U8dG3 zXJRR5@`iBy%I%VALA#u6>L-tONw)8eI+c}ZLA$J6+~jX@#^JclExGa(lIoiY~N`89%~NF z6KcQGa=Qc`$V>{#WVTDHXWGkW_5-Bk zxWZlajgS&dAGOa{O0(>s)=i$5HhGS9T%68B^$()~)vY=_PyJ)>gZx@gLmIM)Q<`K) zj#;;k9HJ8W9Wjo}#Vms+p6=>6?4@EE%*O>mnpMV|av1E8;S}?ps8KtxoVv&+JR^*q zG!{Xc7&DE}gr^QnolbfnlULERn)+*~2cApZR}db^WNPldB8J9S*1z01 zhKaAZzofpx*?&85MkZ*XzQV*YY(Vb5g6Pn_O1g0j6*uzeFOtdS+*g=5hW5zYS1@0^ zXbccTWmboX&tITwg_)&$K4?n(C}L zmPynb_Zh%TGC9EPGpP1_NqDKx;19SKSw9U%xgFLxjL{N_UNJ^~BO5#Gkq>+$yeRiw z8be9a{gh?^kD-9kJ%%#z)NtcTl;LK%ArGGAzN_bR<4F_;F@j}1N0fQcLu-UgkL+qG zAZ<>1Y##i(OLAq>^Fp~Y>8bC=lPYe?mQFk^J@7>8MO-o=Q+p$z3h^lr2~h6A#zBii zA8q0woo>nR)b%^GyV^VM{JU#;+s6uHr}ibcSNNN9y%ox{hid`)44h|&{8OEMMhC_Z z{i%J)I>Y?7tHmpi&R75)o5MN--*Vepkw<3$kKUff$FiZb-frd@j{=WnAfFe~$eE^J zp7E%Oht>y8Jc%+W&-mEHL+2ovcoK1%((~hE6AyHui3fFSeNnkA1F2jl9@Op2%7wnr zi6<4~gy;K0lODSh5BkEM9z8bd7WJdI*Av`0x?5gYKbCL0f+^3uMgI+@W&YFaJ ztIa%16c1!)$QJbzG-Mz>Yp%Jv)=PDfILLz=cwZiU&UY*yj059^ukws3N*YB}#BN4D zow<&?TS6VZ%zPZZocWlvKo(6}z^@xTW+GZ#Vyr^adV9Fyi_uTrjGBnR%BXZ;2cW1A`vUvDIwWTx#WHo3Y;QRPn`?v( z+Xb*%;qsI#ifOW-AT;;}YKJP6!_Z*qQS}d5)~AQe)|$&+#+t)mw%80jeP4zLILO=1 zW!!LvvtdKN?8}HA7&~P93rMjGbPg4dK~L0k^kB(>@c;|{r(iKAU34o>3#1er2Wz!M z31La&j(N3%Lw@Z2e(@QWC1J-fk7QO+H{>u1tIV_IS+XI*Ttut1 zuzQclHpa;L*>VZ(jlxztImVceGD*=M=S)^ZK7JzkKkR)d5Az9~sjR_alDwGd{H=Vv zdBb^FsB`lM8PqCBXYNi4XoI#^ji?wa=g|d9cv-r;+?=6mOwRh89MCgQ2~Z-`Z?T6j z(xy{PShp+&fL!8ZNury~I3x<9I7LPB<1l83DyN48hsVtu-nH9^;oZ6oS4*T0AD&vf z!;qoS_o&w`SgHsTmqj>c3aD4a2ZA)1&$Vp#^9b`fy;r*-oi1#M@Aj&NVrfN)IFTq? zi&w=ETgjHqn>4Cdm(GLXShl4pj)J$Brnuw6H+r?L;+s4D;OT)-jE+} zTCoQ8*t$wbLBTYYKfl{FMX`?|F&x3bxnwBKIBo3m?kuJmxHisw<0^XYbImLqO3xWV z&p-D&zX-JC*sQrpqr<{RC(YZQH8*)oSlFnh^Rw(eS##%SWzC(pU7g)JIjL1jQc^4V zZtLWxty<&P(}wufnw~uxqP#Oi_L*{^ZhU;*{Zm^^+gB$cq0YW(>h!4x_D^d*b>F_J zIaibW^-FG%)W3gH3->SO$E1FJlba_E7?AYzlSC~IV;0oG6!i_+0J>cVf6TvkDdYKX zNE@npuviPZIEvbcu_1`3hmH!wc22DMla``{FVYIqF9bWmVr6;9O5<}Gu~G@gF6-HT zayC%oldfWq;-_wf%r&xkQ#=ClU30hUs@TE=Gq{-n+BcTGurXN4vU72jplH(<@3^`9w7AQ|FC!l*q z*$U%{pFngST5qv2%cL=;LxoEh7N5sA^k|>dT~wsj#&1Nvo&6`9;ck%?As~6s{N8$4s`|X zq1EDX2v$EaUzz5ZYD_izePgP#PbK}`9(7V)jIafRg!009b{;}yl??EAhAxDE2<^{v z$G@*%LVD$cBzxu4adHdJz0mW+#S=$niZTVHhH4@I0;;im`Jgpu&BzDtO2kXjhqT

    sDMz7$^SDZV4x`K*fov0l~+M89O^^Om^v{t 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 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/values-af/strings.xml b/android/3rd_party/HoloEverywhere/library/res/values-af/strings.xml new file mode 100644 index 0000000000..d333128a87 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values-af/strings.xml @@ -0,0 +1,34 @@ + + "Altyd" + "Net een keer" + "kandidate" + "AF" + "AAN" + "Kies \'n handeling" + "Verminder dag" + "Verminder maand" + "Verminder jaar" + "Stel datum" + "Vermeerder dag" + "Vermeerder maand" + "Vermeerder jaar" + "Klaar" + "Stel" + "Laai tans..." + "Geen programme kan hierdie handeling uitvoer nie." + "Verminder" + "Vermeerder" + "Gly op om te vermeeder en af om te verminder." + "%s raak en hou." + "Verstek luitoon" + "Luitone" + "Stil" + "Verminder uur" + "Verminder minute" + "Stel VM." + "Stel tyd" + "Vermeerder uur" + "Vermeerder minuut" + "Stel NM." + "Voltooi handeling met" + diff --git a/android/3rd_party/HoloEverywhere/library/res/values-am/strings.xml b/android/3rd_party/HoloEverywhere/library/res/values-am/strings.xml new file mode 100644 index 0000000000..209dd51779 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values-am/strings.xml @@ -0,0 +1,34 @@ + + "ዘወትር" + "አንዴ ብቻ" + "ዕጩዎች" + "ውጪ" + "በ" + "ድርጊት ምረጥ" + "ቀን ቀንስ" + "ወር ቀንስ" + "ዓመት ቀንስ" + "ውሂብ አዘጋጅ" + "ቀን ጨምር" + "ወር ጨምር" + "ዓመት ጨምር" + "ተጠናቋል" + "አዘጋጅ" + "በመጫን ላይ…" + "ምንም ትግበራዎች ይህን ድርጊት ማከናወን አይችሉም።" + "ቀንስ" + "ጨምር" + "ለመጨመር ወደ ላይ እና ለመቀነስ ወደ ታች አንሸራትት።" + "%s ንካ እና ያዝ።" + "ነባሪ የስልክ ላይ ጥሪ" + "ጥሪ ድምፆች" + "ፀጥታ" + "ሰዓት ቀንስ" + "ደቂቃ ቀንስ" + "AM አዘጋጅ" + "ጊዜ አዘጋጅ" + "ሰዓት ጨምር" + "ደቂቃ ጨምር" + "PM አዘጋጅ" + "... በመጠቀም ድርጊቱን አጠናቅ" + diff --git a/android/3rd_party/HoloEverywhere/library/res/values-ar/strings.xml b/android/3rd_party/HoloEverywhere/library/res/values-ar/strings.xml new file mode 100644 index 0000000000..a385bc2ae5 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values-ar/strings.xml @@ -0,0 +1,34 @@ + + "دومًا" + "مرة واحدة فقط" + "العناصر المرشحة" + "إيقاف" + "تشغيل" + "اختيار إجراء" + "تقليل الأيام" + "تقليل الشهور" + "تقليل الأعوام" + "تعيين التاريخ" + "زيادة الأيام" + "زيادة الشهور" + "زيادة الأعوام" + "تم" + "تعيين" + "جارٍ التحميل…" + "ليست هناك تطبيقات يمكنها تنفيذ هذا الإجراء." + "تقليل" + "زيادة" + "مرر لأعلى للزيادة ولأسفل للتقليل." + "%s المس مع الاستمرار." + "نغمة الرنين الافتراضية" + "نغمات الرنين" + "صامت" + "تقليل الساعات" + "تقليل الدقائق" + "تعيين الصباح" + "تعيين الوقت" + "زيادة الساعات" + "زيادة الدقائق" + "تعيين المساء" + "إكمال الإجراء باستخدام" + diff --git a/android/3rd_party/HoloEverywhere/library/res/values-be/strings.xml b/android/3rd_party/HoloEverywhere/library/res/values-be/strings.xml new file mode 100644 index 0000000000..6ff11a4693 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values-be/strings.xml @@ -0,0 +1,34 @@ + + "Заўсёды" + "Толькі адзін раз" + "кандыдат." + "Адключана" + "Уключыць" + "Выберыце дзеянне" + "Паменшыць лічбу дня" + "Паменшыць лічбу месяца" + "Паменшыць лічбу года" + "Усталяваць дату" + "Павялічыць лічбу дня" + "Павялічыць лічбу месяца" + "Павялічыць лічбу года" + "Гатова" + "Задаць" + "Загрузка..." + "Няма прыкладанняў, якія могуць выконваць гэты працэс." + "Паменшыць" + "Павялічыць" + "Правядзіце пальцам уверх, каб павялічыць, або ўніз, каб паменшыць." + "Націсніце і ўтрымлівайце %s." + "Рынгтон па змаўчаннi" + "Рынгтоны" + "Ціхі рэжым" + "Паменшыць лічбу гадзін." + "Паменшыць лічбу хвілін." + "Усталяваць час да паўдня" + "Усталяваць час" + "Павялічыць лічбу гадзін." + "Павялічыць лічбу хвілін." + "Усталяваць час пасля паўдня" + "Завяршыць дзеянне з дапамогай" + diff --git a/android/3rd_party/HoloEverywhere/library/res/values-bg/strings.xml b/android/3rd_party/HoloEverywhere/library/res/values-bg/strings.xml new file mode 100644 index 0000000000..2f81de3c6e --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values-bg/strings.xml @@ -0,0 +1,34 @@ + + "Винаги" + "Само веднъж" + "кандидати" + "ИЗКЛ" + "ВКЛ" + "Избиране на действие" + "Намаляване на дните" + "Намаляване на месеците" + "Намаляване на годините" + "Задаване на дата" + "Увеличаване на дните" + "Увеличаване на месеците" + "Увеличаване на годините" + "Готово" + "Задаване" + "Зарежда се..." + "Това действие не може да се изпълни от нито едно приложение." + "Намаляване" + "Увеличаване" + "Плъзнете нагоре за увеличаване и надолу за намаляване." + "Докоснете %s път/и и задръжте." + "Стандартна мелодия" + "Мелодии" + "Тишина" + "Намаляване на часовете" + "Намаляване на минутите" + "Задаване на AM" + "Задаване на часа" + "Увеличаване на часовете" + "Увеличаване на минутите" + "Задаване на PM" + "Изпълняване на действието чрез" + diff --git a/android/3rd_party/HoloEverywhere/library/res/values-ca/strings.xml b/android/3rd_party/HoloEverywhere/library/res/values-ca/strings.xml new file mode 100644 index 0000000000..f6c25c8233 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values-ca/strings.xml @@ -0,0 +1,34 @@ + + "Sempre" + "Només una" + "candidats" + "NO" + "SÍ" + "Tria una acció" + "Fes disminuir el dia" + "Fes disminuir el mes" + "Fes disminuir l\'any" + "Establiment de data" + "Fes augmentar el dia" + "Fes augmentar el mes" + "Fes augmentar l\'any" + "Fet" + "Defineix" + "S\'està carregant…" + "No hi ha cap aplicació que pugui dur a terme aquesta acció." + "Redueix" + "Incrementa" + "Fes lliscar el dit cap amunt per incrementar i cap avall per disminuir." + "Mantén premut %s." + "To predeterminat" + "Sons de trucada" + "Silenci" + "Fes disminuir l\'hora" + "Fes disminuir el minut" + "Estableix com a a. m." + "Estableix l\'hora" + "Fes augmentar l\'hora" + "Fes augmentar el minut" + "Estableix com a p. m." + "Completa l\'acció mitjançant" + diff --git a/android/3rd_party/HoloEverywhere/library/res/values-cs/strings.xml b/android/3rd_party/HoloEverywhere/library/res/values-cs/strings.xml new file mode 100644 index 0000000000..6f03dd45a0 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values-cs/strings.xml @@ -0,0 +1,34 @@ + + "Vždy" + "Pouze jednou" + "kandidáti" + "O" + "I" + "Vyberte činnost" + "Ubrat den" + "Ubrat měsíc" + "Ubrat rok" + "Nastavení data" + "Přidat den" + "Přidat měsíc" + "Přidat rok" + "Hotovo" + "Nastavit" + "Načítání..." + "Tuto činnost nemohou provádět žádné aplikace." + "Snížit" + "Zvýšit" + "Chcete-li hodnotu zvýšit, přijeďte prstem nahoru, chcete-li hodnotu snížit, přejeďte prstem dolů." + "%s dotkněte se a podržte." + "Výchozí vyzváněcí tón" + "Vyzváněcí tóny" + "Ticho" + "Ubrat hodinu" + "Ubrat minutu" + "Nastavit dop." + "Nastavení času" + "Přidat hodinu" + "Přidat minutu" + "Nastavit odp." + "Dokončit akci pomocí aplikace" + diff --git a/android/3rd_party/HoloEverywhere/library/res/values-da/strings.xml b/android/3rd_party/HoloEverywhere/library/res/values-da/strings.xml new file mode 100644 index 0000000000..26c34bd544 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values-da/strings.xml @@ -0,0 +1,34 @@ + + "Altid" + "Kun én gang" + "kandidater" + "FRA" + "TIL" + "Vælg en handling" + "Tidligere dag" + "Tidligere måned" + "Tidligere år" + "Angiv dato" + "Senere dag" + "Senere måned" + "Senere år" + "Udført" + "Angiv" + "Indlæser…" + "Der er ingen apps, der kan foretage denne handling." + "Lavere" + "Højere" + "Glid op for at øge og ned for at mindske." + "Tryk %s gange, og hold inde." + "Standardringetone" + "Ringetoner" + "Lydløs" + "Sænk timetal" + "Sænk minuttal" + "Indstil AM" + "Angiv tidspunkt" + "Forøg timetal" + "Forøg minuttal" + "Indstil PM" + "Fuldfør handling ved hjælp af" + diff --git a/android/3rd_party/HoloEverywhere/library/res/values-de/strings.xml b/android/3rd_party/HoloEverywhere/library/res/values-de/strings.xml new file mode 100644 index 0000000000..d8da28f331 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values-de/strings.xml @@ -0,0 +1,34 @@ + + "Immer" + "Nur einmal" + "Kandidaten" + "AUS" + "AN" + "Aktion auswählen" + "Tag verringern" + "Monat verringern" + "Jahr verringern" + "Datum festlegen" + "Tag verlängern" + "Monat verlängern" + "Jahr verlängern" + "Fertig" + "Speichern" + "Wird geladen…" + "Diese Aktion kann von keiner App ausgeführt werden." + "Verringern" + "Verlängern" + "Zum Verlängern nach oben und zum Verringern nach unten schieben" + "%s berühren und gedrückt halten" + "Standard-Klingelton" + "Klingeltöne" + "Lautlos" + "Stunden verringern" + "Minuten verringern" + "Zeit festlegen" + "Uhrzeit festlegen" + "Stunden verlängern" + "Minuten verlängern" + "Zeit festlegen" + "Aktion durchführen mit" + diff --git a/android/3rd_party/HoloEverywhere/library/res/values-el/strings.xml b/android/3rd_party/HoloEverywhere/library/res/values-el/strings.xml new file mode 100644 index 0000000000..706386f03e --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values-el/strings.xml @@ -0,0 +1,34 @@ + + "Πάντα" + "Μόνο μία φορά" + "υποψήφιοι" + "Ανενεργό" + "Ενεργό" + "Επιλέξτε μια ενέργεια" + "Μείωση ημέρας" + "Μείωση μήνα" + "Μείωση έτους" + "Ορισμός ημερομηνίας" + "Αύξηση ημέρας" + "Αύξηση μήνα" + "Αύξηση έτους" + "Τέλος" + "Ορισμός" + "Φόρτωση…" + "Δεν υπάρχουν εφαρμογές, οι οποίες μπορούν να εκτελέσουν αυτήν την ενέργεια." + "Μείωση" + "Αύξηση" + "Πραγματοποιήστε κύλιση προς τα πάνω για αύξηση και προς τα κάτω για μείωση." + "Πατήστε παρατεταμένα το %s." + "Προεπιλεγμένος ήχος κλήσης" + "Ήχοι κλήσης" + "Σίγαση" + "Μείωση ώρας" + "Μείωση λεπτού" + "Ορισμός ΠΜ" + "Ρύθμιση ώρας" + "Αύξηση ώρας" + "Αύξηση λεπτού" + "Ορισμός ΜΜ" + "Ολοκλήρωση ενέργειας με τη χρήση" + diff --git a/android/3rd_party/HoloEverywhere/library/res/values-en-rGB/strings.xml b/android/3rd_party/HoloEverywhere/library/res/values-en-rGB/strings.xml new file mode 100644 index 0000000000..efda1f5585 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values-en-rGB/strings.xml @@ -0,0 +1,34 @@ + + "Always" + "Just once" + "candidates" + "OFF" + "ON" + "Choose an action" + "Decrease day" + "Decrease month" + "Decrease year" + "Set date" + "Increase day" + "Increase month" + "Increase year" + "Done" + "Set" + "Loading…" + "No apps can perform this action." + "Decrease" + "Increase" + "Slide up to increase and down to decrease." + "%s touch and hold." + "Default ringtone" + "Ringtones" + "Silent" + "Decrease hour" + "Decrease minute" + "Set a.m." + "Set time" + "Increase hour" + "Increase minute" + "Set p.m." + "Complete action using" + diff --git a/android/3rd_party/HoloEverywhere/library/res/values-es-rUS/strings.xml b/android/3rd_party/HoloEverywhere/library/res/values-es-rUS/strings.xml new file mode 100644 index 0000000000..24a21f0d14 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values-es-rUS/strings.xml @@ -0,0 +1,34 @@ + + "Siempre" + "Solo una vez" + "candidatos" + "No" + "Sí" + "Seleccionar una acción" + "Reducir día" + "Reducir mes" + "Reducir año" + "Configurar fecha" + "Aumentar día" + "Aumentar mes" + "Aumentar año" + "Listo" + "Establecer" + "Cargando…" + "Ninguna aplicación puede realizar esta acción." + "Reducir" + "Aumentar" + "Desliza el dedo hacia arriba para aumentar los valores y hacia abajo para reducirlos." + "Mantén presionado %s." + "Tono de llamada predeterminado" + "Tonos de llamada" + "Silencioso" + "Reducir hora" + "Reducir minutos" + "Establecer a.m." + "Configurar hora" + "Aumentar hora" + "Aumentar minutos" + "Establecer p.m." + "Completar la acción mediante" + diff --git a/android/3rd_party/HoloEverywhere/library/res/values-es/strings.xml b/android/3rd_party/HoloEverywhere/library/res/values-es/strings.xml new file mode 100644 index 0000000000..aca9f3ffbb --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values-es/strings.xml @@ -0,0 +1,34 @@ + + "Siempre" + "Solo una vez" + "candidatos" + "NO" + "SÍ" + "Seleccionar una acción" + "Reducir días" + "Reducir mes" + "Reducir año" + "Establecer fecha" + "Aumentar días" + "Aumentar mes" + "Aumentar año" + "Listo" + "Establecer" + "Cargando..." + "Ninguna aplicación puede realizar esta acción." + "Reducir" + "Aumentar" + "Desliza el dedo hacia arriba para aumentar y hacia abajo para disminuir." + "Mantén pulsado %s." + "Tono predeterminado" + "Tonos" + "Silencio" + "Reducir horas" + "Reducir minutos" + "Establecer a.m." + "Establecer hora" + "Aumentar horas" + "Aumentar minutos" + "Establecer p.m." + "Completar acción utilizando" + diff --git a/android/3rd_party/HoloEverywhere/library/res/values-et/strings.xml b/android/3rd_party/HoloEverywhere/library/res/values-et/strings.xml new file mode 100644 index 0000000000..5066f579f4 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values-et/strings.xml @@ -0,0 +1,34 @@ + + "Alati" + "Ainult üks kord" + "kandidaadid" + "VÄLJAS" + "SEES" + "Toimingu valimine" + "Päeva vähendamine" + "Kuu vähendamine" + "Aasta vähendamine" + "Kuupäeva määramine" + "Päeva suurendamine" + "Kuu suurendamine" + "Aasta suurendamine" + "Valmis" + "Määra" + "Laadimine ..." + "Ükski rakendus ei saa seda toimingut teostada." + "Vähendamine" + "Suurendamine" + "Suurendamiseks lohistage üles, vähendamiseks alla." + "%s puudutage ja hoidke." + "Vaikehelin" + "Helinad" + "Hääletu" + "Tundide vähendamine" + "Minutite vähendamine" + "AM-i seadmine" + "Kellaaja määramine" + "Tundide suurendamine" + "Minutite suurendamine" + "PM-i seadmine" + "Lõpetage toiming rakendusega" + diff --git a/android/3rd_party/HoloEverywhere/library/res/values-fa/strings.xml b/android/3rd_party/HoloEverywhere/library/res/values-fa/strings.xml new file mode 100644 index 0000000000..3aa87dbc26 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values-fa/strings.xml @@ -0,0 +1,34 @@ + + "همیشه" + "فقط این بار" + "داوطلبین" + "خاموش" + "روشن" + "انتخاب عملکرد" + "کاهش روز" + "کاهش ماه" + "کاهش سال" + "تاریخ تنظیم" + "افزایش روز" + "افزایش ماه" + "افزایش سال" + "انجام شد" + "تنظیم" + "در حال بارگیری..." + "هیچ برنامه‌ای نمی‎تواند این کار را انجام دهد." + "کاهش" + "افزایش" + "برای افزایش به بالا بلغزانید و برای کاهش به پایین بلغزانید." + "%s لمس کرده و نگه دارید." + "آهنگ زنگ پیش‌فرض" + "آهنگ‌های زنگ" + "ساکت" + "کاهش ساعت" + "کاهش دقیقه" + "تنظیم ق.ظ" + "تنظیم زمان" + "افزایش ساعت" + "افزایش دقیقه" + "تنظیم ب.ظ" + "تکمیل عملکرد با استفاده از" + diff --git a/android/3rd_party/HoloEverywhere/library/res/values-fi/strings.xml b/android/3rd_party/HoloEverywhere/library/res/values-fi/strings.xml new file mode 100644 index 0000000000..fa56e531a0 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values-fi/strings.xml @@ -0,0 +1,34 @@ + + "Aina" + "Vain kerran" + "kandidaatit" + "POIS" + "PÄÄLLÄ" + "Valitse toiminto" + "Vähennä päivien määrää." + "Vähennä kuukausien määrää." + "Vähennä vuosien määrää." + "Aseta päivämäärä" + "Lisää päivien määrää." + "Lisää kuukausien määrää." + "Lisää vuosien määrää." + "Valmis" + "Aseta" + "Ladataan…" + "Yksikään sovellus ei voi suorittaa tätä toimintoa." + "Vähennä" + "Lisää" + "Lisää tai vähennä arvoa liu\'uttamalla ylös tai alas." + "%s kosketa pitkään." + "Oletussoittoääni" + "Soittoäänet" + "Äänetön" + "Vähennä tuntien määrää." + "Vähennä minuuttien määrää." + "Aseta ap" + "Aseta aika" + "Lisää tuntien määrää." + "Lisää minuuttien määrää." + "Aseta ip" + "Tee toiminto käyttäen sovellusta" + diff --git a/android/3rd_party/HoloEverywhere/library/res/values-fr/strings.xml b/android/3rd_party/HoloEverywhere/library/res/values-fr/strings.xml new file mode 100644 index 0000000000..95cb2c1c1a --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values-fr/strings.xml @@ -0,0 +1,34 @@ + + "Toujours" + "Une seule fois" + "candidats" + "NON" + "OUI" + "Sélectionnez une action" + "Jour précédent" + "Mois précédent" + "Année précédente" + "Définir la date" + "Jour suivant" + "Mois suivant" + "Année suivante" + "OK" + "Définir" + "Chargement…" + "Aucune application ne peut effectuer cette action." + "Diminuer" + "Augmenter" + "Faites glisser vers le haut pour augmenter et vers le bas pour diminuer." + "%s appuyez de manière prolongée." + "Sonnerie par défaut" + "Sonneries" + "Silencieux" + "Heure précédente" + "Minute précédente" + "Définir la valeur AM" + "Définir l\'heure" + "Heure suivante" + "Minute suivante" + "Définir la valeur PM" + "Continuer avec" + diff --git a/android/3rd_party/HoloEverywhere/library/res/values-h720dp/dimens.xml b/android/3rd_party/HoloEverywhere/library/res/values-h720dp/dimens.xml new file mode 100644 index 0000000000..867e95057e --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values-h720dp/dimens.xml @@ -0,0 +1,3 @@ + + 54dip + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/values-hi/strings.xml b/android/3rd_party/HoloEverywhere/library/res/values-hi/strings.xml new file mode 100644 index 0000000000..3ab6cca1d5 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values-hi/strings.xml @@ -0,0 +1,34 @@ + + "हमेशा" + "केवल एक बार" + "उम्‍मीदवार" + "बंद" + "चालू" + "कोई क्रिया चुनें" + "दिन कम करें" + "माह कम करें" + "वर्ष कम करें" + "दिनांक सेट करें" + "दिन बढ़ाएं" + "माह बढ़ाएं" + "वर्ष बढ़ाएं" + "पूर्ण" + "सेट करें" + "लोड हो रहे हैं..." + "कोई भी एप्‍लिकेशन यह कार्यवाही नहीं कर सकता." + "कम करें" + "बढ़ाएं" + "बढ़ाने के लिए ऊपर और कम करने के लिए नीचे स्‍लाइड करें." + "%s को स्‍पर्श करके रखें." + "डिफ़ॉल्‍ट रिंगटोन" + "रिंगटोन" + "मौन" + "घंटे कम करें" + "मिनट कम करें" + "प्रात: सेट करें" + "समय सेट करें" + "घंटे बढ़ाएं" + "मिनट बढ़ाएं" + "सायं सेट करें" + "इसका उपयोग करके क्रिया पूर्ण करें" + diff --git a/android/3rd_party/HoloEverywhere/library/res/values-hr/strings.xml b/android/3rd_party/HoloEverywhere/library/res/values-hr/strings.xml new file mode 100644 index 0000000000..9180aff97a --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values-hr/strings.xml @@ -0,0 +1,34 @@ + + "Uvijek" + "Samo jednom" + "kandidati" + "Isklj." + "Uklj." + "Odaberi radnju" + "Smanjenje dana" + "Smanjenje mjeseca" + "Smanjenje godine" + "Postavi datum" + "Povećanje dana" + "Povećanje mjeseca" + "Povećanje godine" + "Gotovo" + "Postavi" + "Učitavanje…" + "Tu radnju ne može izvesti nijedna aplikacija." + "Smanjivanje" + "Povećavanje" + "Kliznite prema gore za povećavanje i prema dolje za smanjivanje." + "%s pritisnite i držite." + "Zadana melodija zvona" + "Melodije zvona" + "Bešumno" + "Smanjenje sati" + "Smanjenje minuta" + "Postavi AM" + "Postavljanje vremena" + "Povećanje sati" + "Povećanje minuta" + "Postavi PM" + "Radnju dovrši pomoću stavke" + diff --git a/android/3rd_party/HoloEverywhere/library/res/values-hu/strings.xml b/android/3rd_party/HoloEverywhere/library/res/values-hu/strings.xml new file mode 100644 index 0000000000..c2a560d194 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values-hu/strings.xml @@ -0,0 +1,34 @@ + + "Mindig" + "Csak egyszer" + "jelöltek" + "Ki" + "Be" + "Válasszon egy műveletet" + "Dátum értékének csökkentése" + "Hónap értékének csökkentése" + "Év értékének csökkentése" + "Dátum beállítása" + "Dátum értékének növelése" + "Hónap értékének növelése" + "Év értékének növelése" + "Kész" + "Beállítás" + "Betöltés..." + "Egy alkalmazás sem tudja végrehajtani ezt a műveletet." + "Csökkentés" + "Növelés" + "A növeléshez csúsztassa felfelé, a csökkentéshez pedig lefelé." + "%s érintse meg és tartsa lenyomva." + "Alapértelmezett csengőhang" + "Csengőhangok" + "Néma" + "Óra értékének csökkentése" + "Perc értékének csökkentése" + "Állítsa de. értékre" + "Idő beállítása" + "Óra értékének növelése" + "Perc értékének növelése" + "Állítsa du. értékre" + "Művelet végrehajtása a következővel:" + diff --git a/android/3rd_party/HoloEverywhere/library/res/values-in/strings.xml b/android/3rd_party/HoloEverywhere/library/res/values-in/strings.xml new file mode 100644 index 0000000000..688f985583 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values-in/strings.xml @@ -0,0 +1,34 @@ + + "Selalu" + "Hanya sekali" + "calon" + "MATI" + "HIDUP" + "Pilih tindakan" + "Kurangi hari" + "Kurangi bulan" + "Kurangi tahun" + "Setel tanggal" + "Tambah hari" + "Tambah bulan" + "Tambah tahun" + "Selesai" + "Setel" + "Memuat..." + "Tidak ada apl yang dapat melakukan tindakan ini." + "Kurangi" + "Tambah" + "Geser ke atas untuk menambah dan ke bawah untuk mengurangi." + "%s sentuh dan tahan." + "Nada dering default" + "Nada dering" + "Senyap" + "Kurangi jam" + "Kurangi menit" + "Setel AM" + "Setel waktu" + "Tambah jam" + "Tambah menit" + "Menyetel PM" + "Tindakan lengkap menggunakan" + diff --git a/android/3rd_party/HoloEverywhere/library/res/values-it/strings.xml b/android/3rd_party/HoloEverywhere/library/res/values-it/strings.xml new file mode 100644 index 0000000000..15753ea279 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values-it/strings.xml @@ -0,0 +1,34 @@ + + "Sempre" + "Solo una volta" + "candidati" + "OFF" + "ON" + "Scegli un\'azione" + "Riduci giorno" + "Riduci mese" + "Riduci anno" + "Imposta data" + "Aumenta giorno" + "Aumenta mese" + "Aumenta anno" + "Fine" + "Imposta" + "Caricamento..." + "Nessuna applicazione è in grado di eseguire questa azione." + "Riduci" + "Aumenta" + "Scorri verso l\'alto per aumentare il valore e verso il basso per diminuirlo." + "Tocca e tieni premuto il numero %s." + "Suoneria predefinita" + "Suonerie" + "Silenzioso" + "Riduci ore" + "Riduci minuti" + "Imposta AM" + "Imposta ora" + "Aumenta ore" + "Aumenta minuti" + "Imposta PM" + "Completa l\'azione con" + diff --git a/android/3rd_party/HoloEverywhere/library/res/values-iw/strings.xml b/android/3rd_party/HoloEverywhere/library/res/values-iw/strings.xml new file mode 100644 index 0000000000..59fc986317 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values-iw/strings.xml @@ -0,0 +1,34 @@ + + "תמיד" + "רק פעם אחת" + "מועמדים" + "כבוי" + "מופעל" + "בחירת פעולה" + "הפחת יום" + "הפחת חודש" + "הפחת שנה" + "הגדר תאריך" + "הוסף יום" + "הוסף חודש" + "הוסף שנה" + "בוצע" + "הגדר" + "טוען..." + "אין יישומים שיכולים לבצע פעולה זו." + "הפחת" + "הוסף" + "הסט למעלה כדי להוסיף ולמטה כדי להפחית." + "%s גע והחזק." + "רינגטון ברירת מחדל" + "רינגטונים" + "שקט" + "הפחת שעה" + "הפחת דקה" + "הגדר AM" + "הגדרת שעה" + "הוסף שעה" + "הוסף דקה" + "הגדר PM" + "השלמת פעולה באמצעות" + diff --git a/android/3rd_party/HoloEverywhere/library/res/values-ja/strings.xml b/android/3rd_party/HoloEverywhere/library/res/values-ja/strings.xml new file mode 100644 index 0000000000..c351a34177 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values-ja/strings.xml @@ -0,0 +1,34 @@ + + "常時" + "1回のみ" + "候補" + "OFF" + "ON" + "操作の選択" + "1日戻します" + "1か月戻します" + "1年戻します" + "日付設定" + "1日進めます" + "1か月進めます" + "1年進めます" + "完了" + "設定" + "読み込んでいます..." + "この操作を実行できるアプリはありません。" + "戻します" + "進めます" + "上にスライドで進み、下にスライドで戻ります。" + "%s回タップして押し続けます。" + "プリセット着信音" + "着信音" + "サイレント" + "1時間戻します" + "1分戻します" + "午前に設定" + "時刻設定" + "1時間進めます" + "1分進めます" + "午後に設定" + "アプリケーションを選択" + diff --git a/android/3rd_party/HoloEverywhere/library/res/values-ko/strings.xml b/android/3rd_party/HoloEverywhere/library/res/values-ko/strings.xml new file mode 100644 index 0000000000..a37de4c65a --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values-ko/strings.xml @@ -0,0 +1,34 @@ + + "항상" + "한 번만" + "가능한 원인" + "OFF" + "ON" + "작업 선택" + "\'일\'을 줄입니다." + "\'월\'을 줄입니다." + "\'연도\'를 줄입니다." + "날짜 설정" + "\'일\'을 늘립니다." + "\'월\'을 늘립니다." + "\'연도\'를 늘립니다." + "완료" + "설정" + "로드 중.." + "작업을 수행할 수 있는 앱이 없습니다." + "줄이기" + "늘리기" + "늘리려면 위로 슬라이드하고 줄이려면 아래로 슬라이드합니다." + "%s 길게 터치하세요." + "기본 벨소리" + "벨소리" + "무음" + "\'시간\'을 줄입니다." + "\'분\'을 줄입니다." + "AM 설정" + "시간 설정" + "\'시간\'을 늘립니다." + "\'분\'을 늘립니다." + "PM 설정" + "작업을 수행할 때 사용하는 애플리케이션" + diff --git a/android/3rd_party/HoloEverywhere/library/res/values-large/config.xml b/android/3rd_party/HoloEverywhere/library/res/values-large/config.xml new file mode 100644 index 0000000000..b5c168bcc4 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values-large/config.xml @@ -0,0 +1,3 @@ + + 440dp + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/values-large/dimens.xml b/android/3rd_party/HoloEverywhere/library/res/values-large/dimens.xml new file mode 100644 index 0000000000..2b1f13865f --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values-large/dimens.xml @@ -0,0 +1,4 @@ + + 55% + 80% + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/values-large/themes.xml b/android/3rd_party/HoloEverywhere/library/res/values-large/themes.xml new file mode 100644 index 0000000000..fade8b5e81 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values-large/themes.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/android/3rd_party/HoloEverywhere/library/res/values-vi/strings.xml b/android/3rd_party/HoloEverywhere/library/res/values-vi/strings.xml new file mode 100644 index 0000000000..e7eed2dda1 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values-vi/strings.xml @@ -0,0 +1,34 @@ + + "Luôn chọn" + "Chỉ một lần" + "ứng viên" + "TẮT" + "BẬT" + "Chọn một tác vụ" + "Giảm ngày" + "Giảm tháng" + "Giảm năm" + "Đặt ngày" + "Tăng ngày" + "Tăng tháng" + "Tăng năm" + "Xong" + "Đặt" + "Đang tải…" + "Không ứng dụng nào có thể thực hiện tác vụ này." + "Giảm" + "Tăng" + "Trượt lên để tăng và trượt xuống để giảm." + "Chạm và giữ %s." + "Nhạc chuông mặc định" + "Nhạc chuông" + "Im lặng" + "Giảm giờ" + "Giảm phút" + "Đặt SA" + "Đặt giờ" + "Tăng giờ" + "Tăng phút" + "Đặt CH" + "Hoàn tất tác vụ đang sử dụng" + diff --git a/android/3rd_party/HoloEverywhere/library/res/values-xlarge/dimens.xml b/android/3rd_party/HoloEverywhere/library/res/values-xlarge/dimens.xml new file mode 100644 index 0000000000..ffbc252cc1 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values-xlarge/dimens.xml @@ -0,0 +1,5 @@ + + 580dp + 45% + 72% + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/values-zh-rCN/strings.xml b/android/3rd_party/HoloEverywhere/library/res/values-zh-rCN/strings.xml new file mode 100644 index 0000000000..ba8106dc5f --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values-zh-rCN/strings.xml @@ -0,0 +1,34 @@ + + "始终" + "仅此一次" + "候选" + "关闭" + "打开" + "选择操作" + "减小日期值" + "减小月份值" + "减小年份值" + "设置日期" + "增大日期值" + "增大月份值" + "增大年份值" + "完成" + "设置" + "正在加载..." + "没有应用可执行此操作。" + "减小" + "增大" + "向上滑动可增大数值,向下滑动可减小数值。" + "触摸 %s 次并按住。" + "默认铃声" + "铃声" + "静音" + "减小小时值" + "减小分钟值" + "设置上午时间" + "设置时间" + "增大小时值" + "增大分钟值" + "设置下午时间" + "选择要使用的应用:" + diff --git a/android/3rd_party/HoloEverywhere/library/res/values-zh-rTW/strings.xml b/android/3rd_party/HoloEverywhere/library/res/values-zh-rTW/strings.xml new file mode 100644 index 0000000000..e885572668 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values-zh-rTW/strings.xml @@ -0,0 +1,34 @@ + + "一律採用" + "僅限一次" + "待選項目" + "關閉" + "開啟" + "選擇一種動作" + "減少日數" + "減少月數" + "減少年數" + "日期設定" + "增加日數" + "增加月數" + "增加年數" + "完成" + "設定" + "載入中..." + "沒有應用程式可執行這項操作。" + "減少" + "增加" + "向上滑動即可增加,向下滑動即可減少。" + "%s 輕觸並按住。" + "預設鈴聲" + "鈴聲" + "靜音" + "減少小時數" + "減少分鐘數" + "設定 AM 值" + "設定時間" + "增加小時數" + "增加分鐘數" + "設定 PM 值" + "選擇要使用的應用程式" + diff --git a/android/3rd_party/HoloEverywhere/library/res/values-zu/strings.xml b/android/3rd_party/HoloEverywhere/library/res/values-zu/strings.xml new file mode 100644 index 0000000000..651aefa0cd --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values-zu/strings.xml @@ -0,0 +1,34 @@ + + "Njalo" + "Kanye nje" + "abahlanganyeli" + "VALIWE" + "VULIWE" + "Khetha okufanele kwenziwe" + "Yehlisa usuku" + "Yehlisa inyanga" + "Yehlisa unyaka" + "Setha idethi" + "Khulisa usuku" + "Khulisa inyanga" + "Khulisa unyaka" + "Kwenziwe" + "Hlela" + "Iyalayisha…" + "Azikho izinsiza ezingenza lokhu" + "Yehlisa" + "Khulisa" + "Shelelisela phezulu ukuze ungeze futhi phansi ukuze wehlise." + "%s thinta bese ucindezela." + "Iringithoni emisiwe" + "Amaringithoni" + "Thulile" + "Yehlisa ihora" + "Yehlisa iminithi" + "Setha Ekuseni" + "Hlela isikhathi" + "Khulisa ihora" + "Khulisa iminithi" + "Setha Ntambama" + "Qedela isenzo usebenzisa" + diff --git a/android/3rd_party/HoloEverywhere/library/res/values/attrs.xml b/android/3rd_party/HoloEverywhere/library/res/values/attrs.xml new file mode 100644 index 0000000000..dcfd500f2a --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values/attrs.xml @@ -0,0 +1,378 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/library/res/values/colors.xml b/android/3rd_party/HoloEverywhere/library/res/values/colors.xml new file mode 100644 index 0000000000..0f28d5f9cf --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values/colors.xml @@ -0,0 +1,55 @@ + + + #ff33b5e5 + + #ff99cc00 + + #ffff4444 + + #ff0099cc + + #ff669900 + + #ffcc0000 + + #ffaa66cc + + #ffffbb33 + + #ffff8800 + + #ff00ddff + #00000000 + #ff000000 + #ffffffff + @color/background_light + @color/background_dark + #80ffffff + #80000000 + @color/bright_foreground_light + @color/bright_foreground_dark + #bebebe + #323232 + #ff000000 + #fff3f3f3 + @color/background_holo_light + @color/background_holo_dark + #ff4c4c4c + #ffb2b2b2 + @color/bright_foreground_holo_light + @color/bright_foreground_holo_dark + #bebebe + #80bebebe + #323232 + #80323232 + #323232 + #80323232 + #bebebe + #80bebebe + #808080 + #808080 + #6633b5e5 + #6633b5e5 + #5c5cff + #0000ee + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/values/config.xml b/android/3rd_party/HoloEverywhere/library/res/values/config.xml new file mode 100644 index 0000000000..65220108ef --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values/config.xml @@ -0,0 +1,9 @@ + + 150 + 220 + 200 + 400 + 500 + 2 + 320dp + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/values/dialogs.xml b/android/3rd_party/HoloEverywhere/library/res/values/dialogs.xml new file mode 100644 index 0000000000..b5a66da954 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values/dialogs.xml @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/library/res/values/dimens.xml b/android/3rd_party/HoloEverywhere/library/res/values/dimens.xml new file mode 100644 index 0000000000..ede0eecf34 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values/dimens.xml @@ -0,0 +1,13 @@ + + 64dip + 48dip + 64dp + 52dp + 104dp + 65% + 95% + 320dp + 320dp + 80% + 100% + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/values/ids.xml b/android/3rd_party/HoloEverywhere/library/res/values/ids.xml new file mode 100644 index 0000000000..1151cfe049 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values/ids.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/values/strings.xml b/android/3rd_party/HoloEverywhere/library/res/values/strings.xml new file mode 100644 index 0000000000..0c6d7b7dbf --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values/strings.xml @@ -0,0 +1,35 @@ + + Always + Just once + candidates + OFF + ON + Choose an action + Decrease day + Decrease month + Decrease year + Set date + Increase day + Increase month + Increase year + Done + Set + Loading\u2026 + No apps can perform this action. + Decrease + Increase + Slide up to increase and down to decrease. + %s touch and hold. + Default ringtone + Ringtones + Silent + Decrease hour + Decrease minute + Set AM + Set time + Increase hour + Increase minute + Set PM + : + Complete action using + diff --git a/android/3rd_party/HoloEverywhere/library/res/values/styles.xml b/android/3rd_party/HoloEverywhere/library/res/values/styles.xml new file mode 100644 index 0000000000..b1a531accb --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values/styles.xml @@ -0,0 +1,404 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/library/res/values/text.xml b/android/3rd_party/HoloEverywhere/library/res/values/text.xml new file mode 100644 index 0000000000..f73986e9ad --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values/text.xml @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/library/res/values/themes-core.xml b/android/3rd_party/HoloEverywhere/library/res/values/themes-core.xml new file mode 100644 index 0000000000..69c379f26c --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values/themes-core.xml @@ -0,0 +1,263 @@ + + + + + diff --git a/android/3rd_party/HoloEverywhere/library/res/values/themes.xml b/android/3rd_party/HoloEverywhere/library/res/values/themes.xml new file mode 100644 index 0000000000..9a73e0b099 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/values/themes.xml @@ -0,0 +1,326 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/3rd_party/HoloEverywhere/library/src/android/support/v4/app/_HoloActivity.java b/android/3rd_party/HoloEverywhere/library/src/android/support/v4/app/_HoloActivity.java new file mode 100644 index 0000000000..05dd9c17d5 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/android/support/v4/app/_HoloActivity.java @@ -0,0 +1,696 @@ + +package android.support.v4.app; + +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.holoeverywhere.HoloEverywhere; +import org.holoeverywhere.HoloEverywhere.PreferenceImpl; +import org.holoeverywhere.IHoloActivity; +import org.holoeverywhere.LayoutInflater; +import org.holoeverywhere.SystemServiceManager; +import org.holoeverywhere.ThemeManager; +import org.holoeverywhere.addon.IAddonActivity; +import org.holoeverywhere.app.Activity; +import org.holoeverywhere.app.Application; +import org.holoeverywhere.app.ContextThemeWrapperPlus; +import org.holoeverywhere.internal.WindowDecorView; +import org.holoeverywhere.preference.PreferenceManagerHelper; +import org.holoeverywhere.preference.SharedPreferences; +import org.holoeverywhere.util.SparseIntArray; +import org.holoeverywhere.util.WeaklyMap; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.Intent; +import android.content.res.Resources.Theme; +import android.os.Build.VERSION; +import android.os.Bundle; +import android.os.Parcel; +import android.os.Parcelable; +import android.view.ContextMenu.ContextMenuInfo; +import android.view.View; +import android.view.View.OnCreateContextMenuListener; +import android.view.ViewGroup.LayoutParams; + +import com.actionbarsherlock.internal.view.menu.ContextMenuCallbackGetter; +import com.actionbarsherlock.internal.view.menu.ContextMenuDecorView.ContextMenuListenersProvider; +import com.actionbarsherlock.internal.view.menu.ContextMenuItemWrapper; +import com.actionbarsherlock.internal.view.menu.ContextMenuListener; +import com.actionbarsherlock.internal.view.menu.ContextMenuWrapper; +import com.actionbarsherlock.view.ContextMenu; +import com.actionbarsherlock.view.Menu; +import com.actionbarsherlock.view.MenuInflater; +import com.actionbarsherlock.view.MenuItem; + +public abstract class _HoloActivity extends Watson implements IHoloActivity, + ContextMenuListenersProvider { + public static final class Holo implements Parcelable { + public static final Parcelable.Creator CREATOR = new Creator() { + @Override + public Holo createFromParcel(Parcel source) { + return new Holo(source); + } + + @Override + public Holo[] newArray(int size) { + return new Holo[size]; + } + }; + + public static Holo defaultConfig() { + return new Holo(); + } + + public boolean applyImmediately = false; + public boolean forceThemeApply = false; + public boolean ignoreApplicationInstanceCheck = false; + public boolean ignoreThemeCheck = false; + public boolean requireRoboguice = false; + public boolean requireSherlock = true; + public boolean requireSlider = false; + private SparseIntArray windowFeatures; + + public Holo() { + + } + + private Holo(Parcel source) { + forceThemeApply = source.readInt() == 1; + ignoreThemeCheck = source.readInt() == 1; + ignoreApplicationInstanceCheck = source.readInt() == 1; + requireSherlock = source.readInt() == 1; + requireSlider = source.readInt() == 1; + requireRoboguice = source.readInt() == 1; + applyImmediately = source.readInt() == 1; + windowFeatures = source.readParcelable(SparseIntArray.class.getClassLoader()); + } + + @Override + public int describeContents() { + return 0; + } + + public void requestWindowFeature(int feature) { + if (windowFeatures == null) { + windowFeatures = new SparseIntArray(); + } + windowFeatures.put(feature, 1); + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(forceThemeApply ? 1 : 0); + dest.writeInt(ignoreThemeCheck ? 1 : 0); + dest.writeInt(ignoreApplicationInstanceCheck ? 1 : 0); + dest.writeInt(requireSherlock ? 1 : 0); + dest.writeInt(requireSlider ? 1 : 0); + dest.writeInt(requireRoboguice ? 1 : 0); + dest.writeInt(applyImmediately ? 1 : 0); + dest.writeParcelable(windowFeatures, flags); + } + } + + private static final class HoloThemeException extends RuntimeException { + private static final long serialVersionUID = -2346897999325868420L; + + public HoloThemeException(_HoloActivity activity) { + super("You must apply Holo.Theme, Holo.Theme.Light or " + + "Holo.Theme.Light.DarkActionBar theme on the activity (" + + activity.getClass().getSimpleName() + + ") for using HoloEverywhere"); + } + } + + private static final String CONFIG_KEY = "holo:config:activity"; + private Context mActionBarContext; + private Holo mConfig; + private Map mContextMenuListeners; + private WindowDecorView mDecorView; + private boolean mForceThemeApply = false; + private boolean mInited = false; + private int mLastThemeResourceId = 0; + private MenuInflater mMenuInflater; + + private final List> mOnWindowFocusChangeListeners = new ArrayList>(); + + @Override + public void addContentView(View view, LayoutParams params) { + if (requestDecorView(view, params, -1)) { + mDecorView.addView(view, params); + } + } + + @Override + public void addOnWindowFocusChangeListener(OnWindowFocusChangeListener listener) { + synchronized (mOnWindowFocusChangeListeners) { + Iterator> i = mOnWindowFocusChangeListeners + .iterator(); + while (i.hasNext()) { + WeakReference reference = i.next(); + if (reference == null) { + i.remove(); + continue; + } + OnWindowFocusChangeListener iListener = reference.get(); + if (iListener == null) { + i.remove(); + continue; + } + if (iListener == listener) { + return; + } + } + mOnWindowFocusChangeListeners + .add(new WeakReference(listener)); + } + } + + protected Holo createConfig(Bundle savedInstanceState) { + if (mConfig == null) { + mConfig = onCreateConfig(savedInstanceState); + } + if (mConfig == null) { + mConfig = Holo.defaultConfig(); + } + return mConfig; + } + + protected void forceInit(Bundle savedInstanceState) { + if (mInited) { + return; + } + if (mConfig == null && savedInstanceState != null + && savedInstanceState.containsKey(CONFIG_KEY)) { + mConfig = savedInstanceState.getParcelable(CONFIG_KEY); + } + onInit(mConfig, savedInstanceState); + } + + public Holo getConfig() { + return mConfig; + } + + @Override + public ContextMenuListener getContextMenuListener(View view) { + if (mContextMenuListeners == null) { + return null; + } + return mContextMenuListeners.get(view); + } + + @Override + public SharedPreferences getDefaultSharedPreferences() { + return PreferenceManagerHelper.getDefaultSharedPreferences(this); + } + + @Override + public SharedPreferences getDefaultSharedPreferences(PreferenceImpl impl) { + return PreferenceManagerHelper.getDefaultSharedPreferences(this, impl); + } + + public int getLastThemeResourceId() { + return mLastThemeResourceId; + } + + @Override + public LayoutInflater getLayoutInflater() { + return LayoutInflater.from(this); + } + + @Override + public SharedPreferences getSharedPreferences(PreferenceImpl impl, + String name, int mode) { + return PreferenceManagerHelper.wrap(this, impl, name, mode); + } + + @Override + public SharedPreferences getSharedPreferences(String name, int mode) { + return PreferenceManagerHelper.wrap(this, name, mode); + } + + /** + * @return Themed context for using in action bar + */ + public Context getSupportActionBarContext() { + if (mActionBarContext == null) { + int theme = ThemeManager.getThemeType(this); + if (theme != ThemeManager.LIGHT) { + theme = ThemeManager.DARK; + } + theme = ThemeManager.getThemeResource(theme, false); + if (mLastThemeResourceId == theme) { + mActionBarContext = this; + } else { + mActionBarContext = new ContextThemeWrapperPlus(this, theme); + } + } + return mActionBarContext; + } + + @Override + public Application getSupportApplication() { + return Application.getLastInstance(); + } + + @Override + public MenuInflater getSupportMenuInflater() { + if (mMenuInflater != null) { + return mMenuInflater; + } + mMenuInflater = new MenuInflater(getSupportActionBarContext(), this); + return mMenuInflater; + } + + @Override + public Object getSystemService(String name) { + return SystemServiceManager.getSystemService(this, name); + } + + @Override + public Theme getTheme() { + if (mLastThemeResourceId == 0) { + setTheme(ThemeManager.getDefaultTheme()); + } + return super.getTheme(); + } + + protected final WindowDecorView getWindowDecorView() { + return mDecorView; + } + + protected void init(Holo config) { + init(config, null); + } + + protected void init(Holo config, Bundle savedInstanceState) { + mConfig = config; + if (mConfig.applyImmediately) { + onInit(mConfig, savedInstanceState); + } + } + + @Override + public void invalidateOptionsMenu() { + supportInvalidateOptionsMenu(); + } + + @Override + public boolean isForceThemeApply() { + return mForceThemeApply; + } + + public boolean isInited() { + return mInited; + } + + @Override + @SuppressLint("NewApi") + public void onBackPressed() { + if (!getSupportFragmentManager().popBackStackImmediate()) { + finish(); + } + } + + @Override + public final boolean onContextItemSelected(android.view.MenuItem item) { + return onContextItemSelected(new ContextMenuItemWrapper(item)); + } + + @Override + public boolean onContextItemSelected(MenuItem item) { + if (item instanceof ContextMenuItemWrapper) { + return super.onContextItemSelected(((ContextMenuItemWrapper) item) + .unwrap()); + } + return false; + } + + @Override + public final void onContextMenuClosed(android.view.Menu menu) { + if (menu instanceof android.view.ContextMenu) { + onContextMenuClosed(new ContextMenuWrapper( + (android.view.ContextMenu) menu)); + } else { + super.onContextMenuClosed(menu); + } + } + + @Override + public void onContextMenuClosed(ContextMenu menu) { + if (menu instanceof ContextMenuWrapper) { + super.onContextMenuClosed(((ContextMenuWrapper) menu).unwrap()); + } + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + forceInit(savedInstanceState); + super.onCreate(savedInstanceState); + } + + protected Holo onCreateConfig(Bundle savedInstanceState) { + if (savedInstanceState != null && savedInstanceState.containsKey(CONFIG_KEY)) { + final Holo config = savedInstanceState.getParcelable(CONFIG_KEY); + if (config != null) { + return config; + } + } + return Holo.defaultConfig(); + } + + @Override + public final void onCreateContextMenu(android.view.ContextMenu menu, + View v, ContextMenuInfo menuInfo) { + onCreateContextMenu(new ContextMenuWrapper(menu), v, menuInfo); + } + + @Override + public void onCreateContextMenu(ContextMenu menu, View view, + ContextMenuInfo menuInfo) { + final android.view.ContextMenu nativeMenu; + if (menu instanceof ContextMenuWrapper) { + nativeMenu = ((ContextMenuWrapper) menu).unwrap(); + super.onCreateContextMenu(nativeMenu, view, menuInfo); + if (view instanceof ContextMenuCallbackGetter) { + final OnCreateContextMenuListener l = ((ContextMenuCallbackGetter) view) + .getOnCreateContextMenuListener(); + if (l != null) { + l.onCreateContextMenu(nativeMenu, view, menuInfo); + } + } + } + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + return false; + } + + @Override + protected void onDestroy() { + super.onDestroy(); + LayoutInflater.removeInstance(this); + } + + /** + * Do not override this method. Use {@link #onPreInit(Holo, Bundle)} and + * {@link #onPostInit(Holo, Bundle)} + */ + protected void onInit(Holo config, Bundle savedInstanceState) { + if (mInited) { + throw new IllegalStateException("This instance was already inited"); + } + mInited = true; + if (config == null) { + config = createConfig(savedInstanceState); + } + if (config == null) { + config = Holo.defaultConfig(); + } + onPreInit(config, savedInstanceState); + if (!config.ignoreApplicationInstanceCheck && !(getApplication() instanceof Application)) { + String text = "Application instance isn't HoloEverywhere.\n"; + if (getApplication().getClass() == android.app.Application.class) { + text += "Put attr 'android:name=\"org.holoeverywhere.app.Application\"'" + + " in tag of AndroidManifest.xml"; + } else { + text += "Please sure that you extend " + getApplication().getClass() + + " from a org.holoeverywhere.app.Application"; + } + throw new IllegalStateException(text); + } + getLayoutInflater().setFragmentActivity(this); + if (this instanceof Activity) { + Activity activity = (Activity) this; + if (config.requireRoboguice) { + activity.addon(Activity.ADDON_ROBOGUICE); + } + if (config.requireSlider) { + activity.addon(Activity.ADDON_SLIDER); + } + if (config.requireSherlock) { + activity.addonSherlock(); + } + final SparseIntArray windowFeatures = config.windowFeatures; + if (windowFeatures != null) { + for (int i = 0; i < windowFeatures.size(); i++) { + if (windowFeatures.valueAt(i) > 0) { + requestWindowFeature((long) windowFeatures.keyAt(i)); + } + } + } + boolean forceThemeApply = isForceThemeApply(); + if (config.forceThemeApply) { + setForceThemeApply(forceThemeApply = true); + } + if (mLastThemeResourceId == 0) { + forceThemeApply = true; + } + ThemeManager.applyTheme(activity, forceThemeApply); + if (!config.ignoreThemeCheck && ThemeManager.getThemeType(this) == ThemeManager.INVALID) { + throw new HoloThemeException(activity); + } + } + onPostInit(config, savedInstanceState); + lockAttaching(); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + return false; + } + + @Override + protected void onPostCreate(Bundle savedInstanceState) { + requestDecorView(null, null, -1); + super.onPostCreate(savedInstanceState); + } + + protected void onPostInit(Holo config, Bundle savedInstanceState) { + + } + + protected void onPreInit(Holo config, Bundle savedInstanceState) { + + } + + @Override + public boolean onPrepareOptionsMenu(Menu menu) { + return false; + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + if (mConfig != null) { + outState.putParcelable(CONFIG_KEY, mConfig); + } + } + + @Override + public void onWindowFocusChanged(boolean hasFocus) { + super.onWindowFocusChanged(hasFocus); + synchronized (mOnWindowFocusChangeListeners) { + Iterator> i = mOnWindowFocusChangeListeners + .iterator(); + while (i.hasNext()) { + WeakReference reference = i.next(); + if (reference == null) { + i.remove(); + continue; + } + OnWindowFocusChangeListener iListener = reference.get(); + if (iListener == null) { + i.remove(); + continue; + } + iListener.onWindowFocusChanged(hasFocus); + } + } + } + + @Override + public void registerForContextMenu(View view) { + if (HoloEverywhere.WRAP_TO_NATIVE_CONTEXT_MENU) { + super.registerForContextMenu(view); + } else { + registerForContextMenu(view, this); + } + } + + public void registerForContextMenu(View view, ContextMenuListener listener) { + if (mContextMenuListeners == null) { + mContextMenuListeners = new WeaklyMap(); + } + mContextMenuListeners.put(view, listener); + view.setLongClickable(true); + } + + private boolean requestDecorView(View view, LayoutParams params, int layoutRes) { + if (mDecorView != null) { + return true; + } + mDecorView = new WindowDecorView(this); + mDecorView.setId(android.R.id.content); + mDecorView.setProvider(this); + if (view != null) { + mDecorView.addView(view, params); + } else if (layoutRes > 0) { + getLayoutInflater().inflate(layoutRes, mDecorView, true); + } + final LayoutParams p = new LayoutParams( + LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); + performAddonAction(new AddonCallback() { + @Override + public boolean action(IAddonActivity addon) { + return addon.installDecorView(mDecorView, p); + } + + @Override + public void justPost() { + getWindow().setContentView(mDecorView, p); + } + }); + return false; + } + + @Override + public void requestWindowFeature(long featureId) { + if (!mInited) { + createConfig(null).requestWindowFeature((int) featureId); + } + } + + @Override + public void setContentView(int layoutResID) { + if (requestDecorView(null, null, layoutResID)) { + mDecorView.removeAllViewsInLayout(); + getLayoutInflater().inflate(layoutResID, mDecorView, true); + } + } + + @Override + public void setContentView(View view) { + setContentView(view, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); + } + + @Override + public void setContentView(View view, LayoutParams params) { + if (requestDecorView(view, params, -1)) { + mDecorView.removeAllViewsInLayout(); + mDecorView.addView(view, params); + } + } + + public void setForceThemeApply(boolean forceThemeApply) { + mForceThemeApply = forceThemeApply; + } + + @Override + public void setTheme(int resid) { + setTheme(resid, true); + } + + public synchronized void setTheme(int resid, boolean modifyGlobal) { + if (resid > ThemeManager._START_RESOURCES_ID) { + if (mLastThemeResourceId != resid) { + mActionBarContext = null; + mMenuInflater = null; + super.setTheme(mLastThemeResourceId = resid); + } + } else { + if ((resid & ThemeManager.COLOR_SCHEME_MASK) == 0) { + int theme = ThemeManager.getTheme(getIntent(), false); + if (theme == 0) { + theme = ThemeManager.getTheme(getParentActivityIntent(), false); + } + theme &= ThemeManager.COLOR_SCHEME_MASK; + if (theme != 0) { + resid |= theme; + } + } + setTheme(ThemeManager.getThemeResource(resid, modifyGlobal)); + } + } + + @Override + public void startActivities(Intent[] intents) { + startActivities(intents, null); + } + + @Override + public void startActivities(Intent[] intents, Bundle options) { + for (Intent intent : intents) { + startActivity(intent, options); + } + } + + @Override + public void startActivity(Intent intent) { + startActivity(intent, null); + } + + @Override + public void startActivity(Intent intent, Bundle options) { + startActivityForResult(intent, -1, options); + } + + @Override + public void startActivityForResult(Intent intent, int requestCode) { + startActivityForResult(intent, requestCode, null); + } + + @Override + public void startActivityForResult(Intent intent, int requestCode, + Bundle options) { + if (HoloEverywhere.ALWAYS_USE_PARENT_THEME) { + ThemeManager.startActivity(this, intent, requestCode, options); + } else { + superStartActivity(intent, requestCode, options); + } + } + + @Override + public android.content.SharedPreferences superGetSharedPreferences( + String name, int mode) { + return super.getSharedPreferences(name, mode); + } + + @Override + public Object superGetSystemService(String name) { + return super.getSystemService(name); + } + + @Override + @SuppressLint("NewApi") + public void superStartActivity(Intent intent, int requestCode, + Bundle options) { + if (VERSION.SDK_INT >= 16) { + super.startActivityForResult(intent, requestCode, options); + } else { + super.startActivityForResult(intent, requestCode); + } + } + + @Override + public void supportInvalidateOptionsMenu() { + if (VERSION.SDK_INT >= 11) { + super.invalidateOptionsMenu(); + } + } + + @Override + public void unregisterForContextMenu(View view) { + if (HoloEverywhere.WRAP_TO_NATIVE_CONTEXT_MENU) { + super.unregisterForContextMenu(view); + } else { + if (mContextMenuListeners != null) { + mContextMenuListeners.remove(view); + } + } + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/android/support/v4/app/_HoloFragment.java b/android/3rd_party/HoloEverywhere/library/src/android/support/v4/app/_HoloFragment.java new file mode 100644 index 0000000000..22b2d86095 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/android/support/v4/app/_HoloFragment.java @@ -0,0 +1,282 @@ + +package android.support.v4.app; + +import org.holoeverywhere.HoloEverywhere; +import org.holoeverywhere.HoloEverywhere.PreferenceImpl; +import org.holoeverywhere.IHoloFragment; +import org.holoeverywhere.LayoutInflater; +import org.holoeverywhere.app.Activity; +import org.holoeverywhere.app.Application; +import org.holoeverywhere.preference.SharedPreferences; + +import android.content.Context; +import android.os.Bundle; +import android.util.AttributeSet; +import android.view.ContextMenu.ContextMenuInfo; +import android.view.View; +import android.view.ViewGroup; + +import com.actionbarsherlock.app.ActionBar; +import com.actionbarsherlock.internal.view.menu.ContextMenuDecorView; +import com.actionbarsherlock.internal.view.menu.ContextMenuItemWrapper; +import com.actionbarsherlock.internal.view.menu.ContextMenuListener; +import com.actionbarsherlock.internal.view.menu.ContextMenuWrapper; +import com.actionbarsherlock.internal.view.menu.MenuItemWrapper; +import com.actionbarsherlock.internal.view.menu.MenuWrapper; +import com.actionbarsherlock.view.ContextMenu; +import com.actionbarsherlock.view.Menu; +import com.actionbarsherlock.view.MenuInflater; +import com.actionbarsherlock.view.MenuItem; + +public abstract class _HoloFragment extends android.support.v4.app.Fragment implements + IHoloFragment { + private Activity mActivity; + boolean mDetachChildFragments = true; + boolean mDontSaveMe = false; + + protected void dontSaveMe() { + mDontSaveMe = true; + } + + public final int getContainerId() { + return mContainerId; + } + + @Override + public ContextMenuListener getContextMenuListener(View view) { + return mActivity.getContextMenuListener(view); + } + + @Override + public SharedPreferences getDefaultSharedPreferences() { + return mActivity.getDefaultSharedPreferences(); + } + + @Override + public SharedPreferences getDefaultSharedPreferences(PreferenceImpl impl) { + return mActivity.getDefaultSharedPreferences(impl); + } + + @Override + public abstract LayoutInflater getLayoutInflater(); + + @Override + @Deprecated + /** + * It's method internal. Don't use or override it + */ + public LayoutInflater getLayoutInflater(Bundle savedInstanceState) { + return getLayoutInflater(); + } + + public MenuInflater getMenuInflater() { + return mActivity.getSupportMenuInflater(); + } + + @Override + public SharedPreferences getSharedPreferences(PreferenceImpl impl, + String name, int mode) { + return mActivity.getSharedPreferences(impl, name, mode); + } + + @Override + public SharedPreferences getSharedPreferences(String name, int mode) { + return mActivity.getSharedPreferences(name, mode); + } + + @Override + public ActionBar getSupportActionBar() { + return mActivity.getSupportActionBar(); + } + + public Context getSupportActionBarContext() { + return mActivity.getSupportActionBarContext(); + } + + @Override + public Activity getSupportActivity() { + return mActivity; + } + + @Override + public Application getSupportApplication() { + return mActivity.getSupportApplication(); + } + + @Override + public FragmentManager getSupportFragmentManager() { + if (mActivity != null) { + return mActivity.getSupportFragmentManager(); + } else { + return getFragmentManager(); + } + } + + public Object getSystemService(String name) { + return mActivity.getSystemService(name); + } + + public boolean isDetachChildFragments() { + return mDetachChildFragments; + } + + public void onAttach(Activity activity) { + super.onAttach(activity); + } + + @Override + public final void onAttach(android.app.Activity activity) { + if (!(activity instanceof Activity)) { + throw new RuntimeException( + "HoloEverywhere.Fragment must be attached to HoloEverywhere.Activity"); + } + mActivity = (Activity) activity; + onAttach((Activity) activity); + } + + @Override + public final boolean onContextItemSelected(android.view.MenuItem item) { + return onContextItemSelected(new ContextMenuItemWrapper(item)); + } + + @Override + public boolean onContextItemSelected(MenuItem item) { + return mActivity.onContextItemSelected(item); + } + + @Override + public void onContextMenuClosed(ContextMenu menu) { + mActivity.onContextMenuClosed(menu); + } + + @Override + public final void onCreateContextMenu(android.view.ContextMenu menu, + View v, ContextMenuInfo menuInfo) { + onCreateContextMenu(new ContextMenuWrapper(menu), v, menuInfo); + } + + @Override + public void onCreateContextMenu(ContextMenu menu, View v, + ContextMenuInfo menuInfo) { + mActivity.onCreateContextMenu(menu, v, menuInfo); + } + + @Override + public final void onCreateOptionsMenu(android.view.Menu menu, + android.view.MenuInflater inflater) { + onCreateOptionsMenu(new MenuWrapper(menu), getMenuInflater()); + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + + } + + @Override + public final View onCreateView(android.view.LayoutInflater inflater, + ViewGroup container, Bundle savedInstanceState) { + ContextMenuDecorView decorView = new ContextMenuDecorView(mActivity); + decorView.setProvider(this); + final View view = onCreateView(getLayoutInflater(), decorView, savedInstanceState); + if (view == null) { + return null; + } + decorView.addView(view); + return decorView; + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + return super.onCreateView(inflater, container, savedInstanceState); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (mChildFragmentManager != null && mChildFragmentManager.mActive != null + && mDetachChildFragments) { + for (Fragment fragment : mChildFragmentManager.mActive) { + if (fragment == null || !fragment.mFromLayout) { + continue; + } + mChildFragmentManager.detachFragment(fragment, 0, 0); + } + } + } + + @Override + public void onInflate(Activity activity, AttributeSet attrs, + Bundle savedInstanceState) { + super.onInflate(activity, attrs, savedInstanceState); + } + + @Override + public final void onInflate(android.app.Activity activity, + AttributeSet attrs, Bundle savedInstanceState) { + onInflate((Activity) activity, attrs, savedInstanceState); + } + + @Override + public final boolean onOptionsItemSelected(android.view.MenuItem item) { + return onOptionsItemSelected(new MenuItemWrapper(item)); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + return false; + } + + @Override + public final void onPrepareOptionsMenu(android.view.Menu menu) { + onPrepareOptionsMenu(new MenuWrapper(menu)); + } + + @Override + public void onPrepareOptionsMenu(Menu menu) { + } + + /** + * Use {@link #onViewCreated(View, Bundle)} instead + */ + @Deprecated + public void onViewCreated(View view) { + + } + + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + onViewCreated(view); + } + + public boolean openContextMenu(View v) { + return v.showContextMenu(); + } + + @Override + public void registerForContextMenu(View view) { + if (HoloEverywhere.WRAP_TO_NATIVE_CONTEXT_MENU) { + super.registerForContextMenu(view); + } else { + mActivity.registerForContextMenu(view, this); + } + } + + /** + * If true this fragment will be detach all inflated child fragments after + * destory view + */ + public void setDetachChildFragments(boolean detachChildFragments) { + mDetachChildFragments = detachChildFragments; + } + + @Override + public void unregisterForContextMenu(View view) { + if (HoloEverywhere.WRAP_TO_NATIVE_CONTEXT_MENU) { + super.unregisterForContextMenu(view); + } else { + mActivity.unregisterForContextMenu(view); + } + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/android/support/v4/app/_HoloFragmentInflater.java b/android/3rd_party/HoloEverywhere/library/src/android/support/v4/app/_HoloFragmentInflater.java new file mode 100644 index 0000000000..2b9dbe84bd --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/android/support/v4/app/_HoloFragmentInflater.java @@ -0,0 +1,119 @@ + +package android.support.v4.app; + +import org.holoeverywhere.LayoutInflater; + +import android.content.Context; +import android.content.ContextWrapper; +import android.content.res.TypedArray; +import android.support.v4.app.FragmentActivity.FragmentTag; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; + +public class _HoloFragmentInflater { + private static View inflate(AttributeSet attrs, View parent, FragmentActivity activity, + Fragment parentFragment) { + String fname = attrs.getAttributeValue(null, "class"); + TypedArray a = activity.obtainStyledAttributes(attrs, FragmentTag.Fragment); + if (fname == null) { + fname = a.getString(FragmentTag.Fragment_name); + } + if (fname.startsWith(".")) { + fname = activity.getPackageName() + fname; + } + int id = a.getResourceId(FragmentTag.Fragment_id, View.NO_ID); + String tag = a.getString(FragmentTag.Fragment_tag); + a.recycle(); + int containerId = parent != null ? parent.getId() : 0; + if (containerId == View.NO_ID && id == View.NO_ID && tag == null) { + throw new IllegalArgumentException( + attrs.getPositionDescription() + + ": Must specify unique android:id, android:tag, or have a parent with an id for " + + fname); + } + final FragmentManagerImpl fm = obtainFragmentManager(activity, parentFragment); + Fragment fragment = id != View.NO_ID ? fm.findFragmentById(id) : null; + if (fragment == null && tag != null) { + fragment = fm.findFragmentByTag(tag); + } + if (fragment == null && containerId != View.NO_ID) { + fragment = fm.findFragmentById(containerId); + } + if (fragment == null) { + fragment = Fragment.instantiate(activity, fname); + fragment.mParentFragment = parentFragment; + fragment.mFromLayout = true; + fragment.mFragmentId = id != 0 ? id : containerId; + fragment.mContainer = (ViewGroup) parent; + fragment.mContainerId = containerId; + fragment.mTag = tag; + fragment.mInLayout = true; + fragment.mFragmentManager = fm; + fragment.onInflate(activity, attrs, fragment.mSavedFragmentState); + fm.addFragment(fragment, false); + fm.moveToState(fragment, Fragment.CREATED, 0, 0, false); + } else if (fragment.mInLayout) { + throw new IllegalArgumentException(attrs.getPositionDescription() + + ": Duplicate id 0x" + Integer.toHexString(id) + + ", tag " + tag + ", or parent id 0x" + Integer.toHexString(containerId) + + " with another fragment for " + fname); + } else { + fragment.mInLayout = true; + if (!fragment.mRetaining) { + fragment.onInflate(activity, attrs, fragment.mSavedFragmentState); + } + fm.moveToState(fragment, Fragment.CREATED, 0, 0, false); + } + if (fragment.mView == null) { + throw new IllegalStateException("Fragment " + fname + + " did not create a view."); + } + if (id != 0) { + fragment.mView.setId(id); + } + if (fragment.mView.getTag() == null) { + fragment.mView.setTag(tag); + } + return fragment.mView; + } + + public static View inflate(LayoutInflater layoutInflater, AttributeSet attrs, View parent, + Fragment fragment) { + FragmentActivity activity = layoutInflater.getFragmentActivity(); + if (activity != null) { + return inflate(attrs, parent, activity, fragment); + } + Context context = layoutInflater.getContext(); + while (context instanceof ContextWrapper) { + if (context instanceof FragmentActivity) { + activity = (FragmentActivity) context; + break; + } + context = ((ContextWrapper) context).getBaseContext(); + } + if (activity == null) { + throw new IllegalStateException("Cannot find any reference to FragmentActivity"); + } + return inflate(attrs, parent, activity, fragment); + } + + private static FragmentManagerImpl obtainFragmentManager(FragmentActivity activity, + Fragment fragment) { + FragmentManagerImpl fm = null; + if (fragment != null) { + fm = fragment.mChildFragmentManager; + if (fm == null) { + try { + fm = (FragmentManagerImpl) fragment.getChildFragmentManager(); + } catch (ClassCastException e) { + fm = fragment.mChildFragmentManager; + } + } + } + if (fm == null && activity != null) { + fm = activity.mFragments; + } + return fm; + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/ContextMenuBuilder.java b/android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/ContextMenuBuilder.java new file mode 100644 index 0000000000..b505bd1bcb --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/ContextMenuBuilder.java @@ -0,0 +1,99 @@ + +package com.actionbarsherlock.internal.view.menu; + +import java.lang.reflect.Method; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.os.Build.VERSION; +import android.os.IBinder; +import android.util.EventLog; +import android.view.ContextMenu.ContextMenuInfo; +import android.view.View; + +import com.actionbarsherlock.view.ContextMenu; + +public class ContextMenuBuilder extends MenuBuilder implements ContextMenu { + public static interface ContextMenuInfoGetter { + public ContextMenuInfo getContextMenuInfo(); + } + + private ContextMenuInfo mContextMenuInfo; + private ContextMenuListener mListener; + + public ContextMenuBuilder(Context context, ContextMenuListener listener) { + super(context); + setContextMenuListener(listener); + } + + public ContextMenuInfo getContextMenuInfo() { + return mContextMenuInfo; + } + + protected ContextMenuInfo getContextMenuInfo(View view) { + if (view instanceof ContextMenuInfoGetter) { + return ((ContextMenuInfoGetter) view).getContextMenuInfo(); + } + ContextMenuInfo menuInfo = null; + try { + Method method = View.class.getDeclaredMethod("getContextMenuInfo"); + method.setAccessible(true); + menuInfo = (ContextMenuInfo) method.invoke(view); + } catch (Exception e) { + } + return menuInfo; + } + + public ContextMenuListener getContextMenuListener() { + return mListener; + } + + public void setContextMenuListener(ContextMenuListener listener) { + mListener = listener; + } + + @Override + public ContextMenu setHeaderIcon(Drawable icon) { + return (ContextMenu) super.setHeaderIconInt(icon); + } + + @Override + public ContextMenu setHeaderIcon(int iconRes) { + return (ContextMenu) super.setHeaderIconInt(iconRes); + } + + @Override + public ContextMenu setHeaderTitle(CharSequence title) { + return (ContextMenu) super.setHeaderTitleInt(title); + } + + @Override + public ContextMenu setHeaderTitle(int titleRes) { + return (ContextMenu) super.setHeaderTitleInt(titleRes); + } + + @Override + public ContextMenu setHeaderView(View view) { + return (ContextMenu) super.setHeaderViewInt(view); + } + + @SuppressLint("NewApi") + public MenuDialogHelper show(View originalView, IBinder token) { + if (mListener == null) { + throw new IllegalStateException( + "Cannot show context menu without reference on ContextMenuListener"); + } + mContextMenuInfo = getContextMenuInfo(originalView); + mListener.onCreateContextMenu(this, originalView, mContextMenuInfo); + if (getVisibleItems().size() > 0) { + if (VERSION.SDK_INT >= 8) { + EventLog.writeEvent(50001, 1); + } + MenuDialogHelper helper = new MenuDialogHelper(this); + helper.show(token); + return helper; + } + return null; + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/ContextMenuCallbackGetter.java b/android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/ContextMenuCallbackGetter.java new file mode 100644 index 0000000000..29338d1d8a --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/ContextMenuCallbackGetter.java @@ -0,0 +1,8 @@ + +package com.actionbarsherlock.internal.view.menu; + +import android.view.View.OnCreateContextMenuListener; + +public interface ContextMenuCallbackGetter { + public OnCreateContextMenuListener getOnCreateContextMenuListener(); +} diff --git a/android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/ContextMenuDecorView.java b/android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/ContextMenuDecorView.java new file mode 100644 index 0000000000..1f293ddc65 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/ContextMenuDecorView.java @@ -0,0 +1,101 @@ + +package com.actionbarsherlock.internal.view.menu; + +import org.holoeverywhere.HoloEverywhere; +import org.holoeverywhere.widget.FrameLayout; + +import android.content.Context; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; + +import com.actionbarsherlock.view.ContextMenu; +import com.actionbarsherlock.view.MenuItem; + +public class ContextMenuDecorView extends FrameLayout implements + MenuPresenter.Callback, MenuBuilder.Callback { + public interface ContextMenuListenersProvider { + public ContextMenuListener getContextMenuListener(View view); + } + + private ContextMenuBuilder mContextMenu; + private ContextMenuListener mListener; + private MenuDialogHelper mMenuDialogHelper; + private ContextMenuListenersProvider mProvider; + + public ContextMenuDecorView(Context context) { + super(context); + setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT)); + } + + @Override + public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { + if (mListener == null) { + return; + } + mListener.onContextMenuClosed((ContextMenu) menu); + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent ev) { + return false; + } + + @Override + public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) { + if (mListener == null) { + return false; + } + if (menu instanceof ContextMenuBuilder + && item instanceof MenuItemImpl) { + ((MenuItemImpl) item).setMenuInfo(((ContextMenuBuilder) menu) + .getContextMenuInfo()); + } + return mListener.onContextItemSelected(item); + } + + @Override + public void onMenuModeChange(MenuBuilder menu) { + + } + + @Override + public boolean onOpenSubMenu(MenuBuilder subMenu) { + return false; + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + return false; + } + + public void setProvider(ContextMenuListenersProvider provider) { + mProvider = provider; + } + + @Override + public boolean showContextMenuForChild(View originalView) { + if (HoloEverywhere.WRAP_TO_NATIVE_CONTEXT_MENU) { + return super.showContextMenuForChild(originalView); + } + mListener = mProvider.getContextMenuListener(originalView); + if (mListener == null) { + return false; + } + if (mContextMenu == null) { + mContextMenu = new ContextMenuBuilder(getContext(), mListener); + mContextMenu.setCallback(this); + } else { + mContextMenu.clearAll(); + mContextMenu.setContextMenuListener(mListener); + } + mMenuDialogHelper = mContextMenu.show(originalView, originalView.getWindowToken()); + if (mMenuDialogHelper != null) { + mMenuDialogHelper.setPresenterCallback(this); + return true; + } else { + return false; + } + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/ContextMenuItemWrapper.java b/android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/ContextMenuItemWrapper.java new file mode 100644 index 0000000000..dde084f3d9 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/ContextMenuItemWrapper.java @@ -0,0 +1,17 @@ + +package com.actionbarsherlock.internal.view.menu; + +import android.view.MenuItem; + +public class ContextMenuItemWrapper extends MenuItemWrapper { + private final MenuItem nativeItem; + + public ContextMenuItemWrapper(MenuItem nativeItem) { + super(nativeItem); + this.nativeItem = nativeItem; + } + + public MenuItem unwrap() { + return nativeItem; + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/ContextMenuListener.java b/android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/ContextMenuListener.java new file mode 100644 index 0000000000..63f24f5924 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/ContextMenuListener.java @@ -0,0 +1,16 @@ + +package com.actionbarsherlock.internal.view.menu; + +import android.view.ContextMenu.ContextMenuInfo; +import android.view.View; + +import com.actionbarsherlock.view.ContextMenu; +import com.actionbarsherlock.view.MenuItem; + +public interface ContextMenuListener { + public boolean onContextItemSelected(MenuItem item); + + public void onContextMenuClosed(ContextMenu menu); + + public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo); +} diff --git a/android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/ContextMenuWrapper.java b/android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/ContextMenuWrapper.java new file mode 100644 index 0000000000..d9b197b184 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/ContextMenuWrapper.java @@ -0,0 +1,56 @@ + +package com.actionbarsherlock.internal.view.menu; + +import android.graphics.drawable.Drawable; +import android.view.View; + +import com.actionbarsherlock.view.ContextMenu; + +public class ContextMenuWrapper extends MenuWrapper implements ContextMenu { + private android.view.ContextMenu nativeMenu; + + public ContextMenuWrapper(android.view.ContextMenu nativeMenu) { + super(nativeMenu); + this.nativeMenu = nativeMenu; + } + + @Override + public void clearHeader() { + nativeMenu.clearHeader(); + } + + @Override + public ContextMenu setHeaderIcon(Drawable icon) { + nativeMenu.setHeaderIcon(icon); + return this; + } + + @Override + public ContextMenu setHeaderIcon(int iconRes) { + nativeMenu.setHeaderIcon(iconRes); + return this; + } + + @Override + public ContextMenu setHeaderTitle(CharSequence title) { + nativeMenu.setHeaderTitle(title); + return this; + } + + @Override + public ContextMenu setHeaderTitle(int titleRes) { + nativeMenu.setHeaderTitle(titleRes); + return this; + } + + @Override + public ContextMenu setHeaderView(View view) { + nativeMenu.setHeaderView(view); + return this; + } + + @Override + public android.view.ContextMenu unwrap() { + return nativeMenu; + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/ExpandedMenuView.java b/android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/ExpandedMenuView.java new file mode 100644 index 0000000000..11c1647992 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/ExpandedMenuView.java @@ -0,0 +1,54 @@ + +package com.actionbarsherlock.internal.view.menu; + +import org.holoeverywhere.widget.ListView; + +import android.content.Context; +import android.util.AttributeSet; +import android.util.TypedValue; +import android.view.View; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemClickListener; + +import com.actionbarsherlock.internal.view.menu.MenuBuilder.ItemInvoker; + +public final class ExpandedMenuView extends ListView implements ItemInvoker, + MenuView, OnItemClickListener { + private int mAnimations; + private MenuBuilder mMenu; + + public ExpandedMenuView(Context context, AttributeSet attrs) { + super(context, attrs); + TypedValue value = new TypedValue(); + context.getTheme().resolveAttribute( + android.R.attr.windowAnimationStyle, value, true); + mAnimations = value.resourceId; + setOnItemClickListener(this); + } + + @Override + public int getWindowAnimations() { + return mAnimations; + } + + @Override + public void initialize(MenuBuilder menu) { + mMenu = menu; + } + + @Override + public boolean invokeItem(MenuItemImpl item) { + return mMenu.performItemAction(item, 0); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + setChildrenDrawingCacheEnabled(false); + } + + @Override + public void onItemClick(AdapterView parent, View v, int position, long id) { + invokeItem((MenuItemImpl) getAdapter().getItem(position)); + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/HoloListMenuItemView.java b/android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/HoloListMenuItemView.java new file mode 100644 index 0000000000..2fa871e719 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/HoloListMenuItemView.java @@ -0,0 +1,259 @@ + +package com.actionbarsherlock.internal.view.menu; + +import org.holoeverywhere.LayoutInflater; +import org.holoeverywhere.R; +import org.holoeverywhere.widget.LinearLayout; +import org.holoeverywhere.widget.TextView; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; +import android.widget.CheckBox; +import android.widget.CompoundButton; +import android.widget.ImageView; +import android.widget.RadioButton; + +public class HoloListMenuItemView extends LinearLayout implements + MenuView.ItemView { + private Drawable mBackground; + private CheckBox mCheckBox; + private boolean mForceShowIcon; + private ImageView mIconView; + private LayoutInflater mInflater; + private MenuItemImpl mItemData; + private boolean mPreserveIconSpacing; + private RadioButton mRadioButton; + private TextView mShortcutView; + private int mTextAppearance; + private Context mTextAppearanceContext; + private TextView mTitleView; + + public HoloListMenuItemView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public HoloListMenuItemView(Context context, AttributeSet attrs, + int defStyle) { + super(context, attrs); + TypedArray a = context.obtainStyledAttributes(attrs, + R.styleable.MenuView, defStyle, 0); + mBackground = a.getDrawable(R.styleable.MenuView_dialogItemBackground); + mTextAppearance = a.getResourceId( + R.styleable.MenuView_dialogItemTextAppearance, -1); + mPreserveIconSpacing = a.getBoolean( + R.styleable.MenuView_android_preserveIconSpacing, false); + mTextAppearanceContext = context; + a.recycle(); + } + + private LayoutInflater getInflater() { + if (mInflater == null) { + mInflater = LayoutInflater.from(getContext()); + } + return mInflater; + } + + @Override + public MenuItemImpl getItemData() { + return mItemData; + } + + @Override + public void initialize(MenuItemImpl itemData, int menuType) { + mItemData = itemData; + 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()); + } + + private void insertCheckBox() { + LayoutInflater inflater = getInflater(); + mCheckBox = (CheckBox) inflater.inflate( + R.layout.list_menu_item_checkbox, this, false); + addView(mCheckBox); + } + + private void insertIconView() { + LayoutInflater inflater = getInflater(); + mIconView = (ImageView) inflater.inflate(R.layout.list_menu_item_icon, + this, false); + addView(mIconView, 0); + } + + private void insertRadioButton() { + LayoutInflater inflater = getInflater(); + mRadioButton = (RadioButton) inflater.inflate( + R.layout.list_menu_item_radio, this, false); + addView(mRadioButton); + } + + @SuppressWarnings("deprecation") + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + setBackgroundDrawable(mBackground); + mTitleView = (TextView) findViewById(R.id.title); + if (mTextAppearance != -1) { + mTitleView.setTextAppearance(mTextAppearanceContext, + mTextAppearance); + } + mShortcutView = (TextView) findViewById(R.id.shortcut); + } + + @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); + } + + @Override + public boolean prefersCondensedTitle() { + return false; + } + + @Override + public void setCheckable(boolean checkable) { + if (!checkable && mRadioButton == null && mCheckBox == null) { + return; + } + + // 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()) { + if (mRadioButton == null) { + insertRadioButton(); + } + compoundButton = mRadioButton; + otherCompoundButton = mCheckBox; + } else { + if (mCheckBox == null) { + insertCheckBox(); + } + compoundButton = mCheckBox; + otherCompoundButton = mRadioButton; + } + + if (checkable) { + compoundButton.setChecked(mItemData.isChecked()); + + final int newVisibility = checkable ? View.VISIBLE : View.GONE; + if (compoundButton.getVisibility() != newVisibility) { + compoundButton.setVisibility(newVisibility); + } + + // Make sure the other compound button isn't visible + if (otherCompoundButton != null + && otherCompoundButton.getVisibility() != View.GONE) { + otherCompoundButton.setVisibility(View.GONE); + } + } else { + if (mCheckBox != null) { + mCheckBox.setVisibility(View.GONE); + } + if (mRadioButton != null) { + mRadioButton.setVisibility(View.GONE); + } + } + } + + @Override + 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 setForceShowIcon(boolean forceShow) { + mPreserveIconSpacing = mForceShowIcon = forceShow; + } + + @Override + 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() != View.VISIBLE) { + mIconView.setVisibility(View.VISIBLE); + } + } else { + mIconView.setVisibility(View.GONE); + } + } + + @Override + public void setShortcut(boolean showShortcut, char shortcutKey) { + final int newVisibility = showShortcut + && mItemData.shouldShowShortcut() ? View.VISIBLE : View.GONE; + + if (newVisibility == View.VISIBLE) { + mShortcutView.setText(mItemData.getShortcutLabel()); + } + + if (mShortcutView.getVisibility() != newVisibility) { + mShortcutView.setVisibility(newVisibility); + } + } + + @Override + public void setTitle(CharSequence title) { + if (title != null) { + mTitleView.setText(title); + + if (mTitleView.getVisibility() != View.VISIBLE) { + mTitleView.setVisibility(View.VISIBLE); + } + } else { + if (mTitleView.getVisibility() != View.GONE) { + mTitleView.setVisibility(View.GONE); + } + } + } + + @Override + public boolean showsIcon() { + return mForceShowIcon; + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/ListMenuPresenter.java b/android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/ListMenuPresenter.java new file mode 100644 index 0000000000..6f5a3c4475 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/ListMenuPresenter.java @@ -0,0 +1,254 @@ + +package com.actionbarsherlock.internal.view.menu; + +import java.util.ArrayList; + +import org.holoeverywhere.LayoutInflater; +import org.holoeverywhere.R; +import org.holoeverywhere.app.ContextThemeWrapperPlus; + +import android.content.Context; +import android.os.Bundle; +import android.os.Parcelable; +import android.util.SparseArray; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.BaseAdapter; +import android.widget.ListAdapter; + +public class ListMenuPresenter implements MenuPresenter, + AdapterView.OnItemClickListener { + private class MenuAdapter extends BaseAdapter { + private int mExpandedIndex = -1; + + public MenuAdapter() { + findExpandedIndex(); + } + + 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; + } + + @Override + public int getCount() { + ArrayList items = mMenu.getNonActionItems(); + int count = items.size() - mItemIndexOffset; + if (mExpandedIndex < 0) { + return count; + } + return count - 1; + } + + @Override + public MenuItemImpl getItem(int position) { + ArrayList items = mMenu.getNonActionItems(); + position += mItemIndexOffset; + if (mExpandedIndex >= 0 && position >= mExpandedIndex) { + position++; + } + return items.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + if (convertView == null) { + convertView = mInflater.inflate(mItemLayoutRes, parent, false); + } + + MenuView.ItemView itemView = (MenuView.ItemView) convertView; + itemView.initialize(getItem(position), 0); + return convertView; + } + + @Override + public void notifyDataSetChanged() { + findExpandedIndex(); + super.notifyDataSetChanged(); + } + } + + public static final String VIEWS_TAG = "android:menu:list"; + MenuAdapter mAdapter; + private Callback mCallback; + Context mContext; + private int mId; + LayoutInflater mInflater; + private int mItemIndexOffset; + int mItemLayoutRes; + MenuBuilder mMenu; + ExpandedMenuView mMenuView; + + int mThemeRes; + + public ListMenuPresenter(Context context, int itemLayoutRes) { + this(itemLayoutRes, 0); + mContext = context; + mInflater = LayoutInflater.from(mContext); + } + + public ListMenuPresenter(int itemLayoutRes, int themeRes) { + mItemLayoutRes = itemLayoutRes; + mThemeRes = themeRes; + } + + @Override + public boolean collapseItemActionView(MenuBuilder menu, MenuItemImpl item) { + return false; + } + + @Override + public boolean expandItemActionView(MenuBuilder menu, MenuItemImpl item) { + return false; + } + + @Override + public boolean flagActionItems() { + return false; + } + + public ListAdapter getAdapter() { + if (mAdapter == null) { + mAdapter = new MenuAdapter(); + } + return mAdapter; + } + + @Override + public int getId() { + return mId; + } + + int getItemIndexOffset() { + return mItemIndexOffset; + } + + @Override + public MenuView getMenuView(ViewGroup root) { + if (mMenuView == null) { + mMenuView = (ExpandedMenuView) mInflater.inflate( + R.layout.expanded_menu_layout, root, false); + if (mAdapter == null) { + mAdapter = new MenuAdapter(); + } + mMenuView.setAdapter(mAdapter); + mMenuView.setOnItemClickListener(this); + } + return mMenuView; + } + + @Override + public void initForMenu(Context context, MenuBuilder menu) { + if (mThemeRes != 0) { + mContext = new ContextThemeWrapperPlus(context, mThemeRes); + mInflater = LayoutInflater.from(mContext); + } else if (mContext != null) { + mContext = context; + if (mInflater == null) { + mInflater = LayoutInflater.from(mContext); + } + } + mMenu = menu; + if (mAdapter != null) { + mAdapter.notifyDataSetChanged(); + } + } + + @Override + public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { + if (mCallback != null) { + mCallback.onCloseMenu(menu, allMenusAreClosing); + } + } + + @Override + public void onItemClick(AdapterView parent, View view, int position, + long id) { + mMenu.performItemAction(mAdapter.getItem(position), 0); + } + + @Override + public void onRestoreInstanceState(Parcelable state) { + restoreHierarchyState((Bundle) state); + } + + @Override + public Parcelable onSaveInstanceState() { + if (mMenuView == null) { + return null; + } + + Bundle state = new Bundle(); + saveHierarchyState(state); + return state; + } + + @Override + public boolean onSubMenuSelected(SubMenuBuilder subMenu) { + if (!subMenu.hasVisibleItems()) { + return false; + } + new MenuDialogHelper(subMenu).show(null); + if (mCallback != null) { + mCallback.onOpenSubMenu(subMenu); + } + return true; + } + + public void restoreHierarchyState(Bundle inState) { + SparseArray viewStates = inState + .getSparseParcelableArray(ListMenuPresenter.VIEWS_TAG); + if (viewStates != null) { + ((View) mMenuView).restoreHierarchyState(viewStates); + } + } + + public void saveHierarchyState(Bundle outState) { + SparseArray viewStates = new SparseArray(); + if (mMenuView != null) { + ((View) mMenuView).saveHierarchyState(viewStates); + } + outState.putSparseParcelableArray(ListMenuPresenter.VIEWS_TAG, + viewStates); + } + + @Override + public void setCallback(Callback cb) { + mCallback = cb; + } + + public void setId(int id) { + mId = id; + } + + public void setItemIndexOffset(int offset) { + mItemIndexOffset = offset; + if (mMenuView != null) { + updateMenuView(false); + } + } + + @Override + public void updateMenuView(boolean cleared) { + if (mAdapter != null) { + mAdapter.notifyDataSetChanged(); + } + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/MenuDialogHelper.java b/android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/MenuDialogHelper.java new file mode 100644 index 0000000000..ed459e4871 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/MenuDialogHelper.java @@ -0,0 +1,131 @@ + +package com.actionbarsherlock.internal.view.menu; + +import org.holoeverywhere.R; +import org.holoeverywhere.app.AlertDialog; + +import android.content.DialogInterface; +import android.os.IBinder; +import android.view.KeyEvent; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; + +public class MenuDialogHelper implements DialogInterface.OnKeyListener, + DialogInterface.OnClickListener, DialogInterface.OnDismissListener, + MenuPresenter.Callback { + private AlertDialog mDialog; + private MenuBuilder mMenu; + ListMenuPresenter mPresenter; + private MenuPresenter.Callback mPresenterCallback; + + public MenuDialogHelper(MenuBuilder menu) { + mMenu = menu; + } + + public void dismiss() { + if (mDialog != null) { + mDialog.dismiss(); + } + } + + @Override + public void onClick(DialogInterface dialog, int which) { + mMenu.performItemAction( + (MenuItemImpl) mPresenter.getAdapter().getItem(which), 0); + } + + @Override + public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { + if (allMenusAreClosing || menu == mMenu) { + dismiss(); + } + if (mPresenterCallback != null) { + mPresenterCallback.onCloseMenu(menu, allMenusAreClosing); + } + } + + @Override + public void onDismiss(DialogInterface dialog) { + mPresenter.onCloseMenu(mMenu, true); + } + + @Override + public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_MENU + || keyCode == KeyEvent.KEYCODE_BACK) { + if (event.getAction() == KeyEvent.ACTION_DOWN + && event.getRepeatCount() == 0) { + Window win = mDialog.getWindow(); + if (win != null) { + View decor = win.getDecorView(); + if (decor != null) { + KeyEvent.DispatcherState ds = decor + .getKeyDispatcherState(); + if (ds != null) { + ds.startTracking(event, this); + return true; + } + } + } + } else if (event.getAction() == KeyEvent.ACTION_UP + && !event.isCanceled()) { + Window win = mDialog.getWindow(); + if (win != null) { + View decor = win.getDecorView(); + if (decor != null) { + KeyEvent.DispatcherState ds = decor + .getKeyDispatcherState(); + if (ds != null && ds.isTracking(event)) { + mMenu.close(true); + dialog.dismiss(); + return true; + } + } + } + } + } + return mMenu.performShortcut(keyCode, event, 0); + + } + + @Override + public boolean onOpenSubMenu(MenuBuilder subMenu) { + if (mPresenterCallback != null) { + return mPresenterCallback.onOpenSubMenu(subMenu); + } + return false; + } + + public void setPresenterCallback(MenuPresenter.Callback cb) { + mPresenterCallback = cb; + } + + public void show(IBinder windowToken) { + final MenuBuilder menu = mMenu; + final AlertDialog.Builder builder = new AlertDialog.Builder( + menu.getContext()); + mPresenter = new ListMenuPresenter(builder.getContext(), + R.layout.list_menu_item_layout); + mPresenter.setCallback(this); + mMenu.addMenuPresenter(mPresenter); + builder.setAdapter(mPresenter.getAdapter(), this); + final View headerView = menu.getHeaderView(); + if (headerView != null) { + builder.setCustomTitle(headerView); + } else { + builder.setIcon(menu.getHeaderIcon()).setTitle( + menu.getHeaderTitle()); + } + builder.setOnKeyListener(this); + builder.setOnDismissListener(this); + mDialog = builder.create(); + WindowManager.LayoutParams lp = mDialog.getWindow().getAttributes(); + lp.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG; + if (windowToken != null) { + lp.token = windowToken; + } + lp.flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; + mDialog.show(); + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/PopupMenuHelper.java b/android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/PopupMenuHelper.java new file mode 100644 index 0000000000..bd0abf1d45 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/PopupMenuHelper.java @@ -0,0 +1,356 @@ + +package com.actionbarsherlock.internal.view.menu; + +import java.util.ArrayList; + +import org.holoeverywhere.LayoutInflater; +import org.holoeverywhere.R; +import org.holoeverywhere.widget.FrameLayout; +import org.holoeverywhere.widget.ListPopupWindow; +import org.holoeverywhere.widget.PopupWindow; + +import android.content.Context; +import android.content.res.Resources; +import android.database.DataSetObserver; +import android.os.Parcelable; +import android.view.KeyEvent; +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.ListAdapter; + +import com.actionbarsherlock.internal.view.View_HasStateListenerSupport; +import com.actionbarsherlock.internal.view.View_OnAttachStateChangeListener; +import com.actionbarsherlock.view.MenuItem; + +public class PopupMenuHelper implements AdapterView.OnItemClickListener, + View.OnKeyListener, ViewTreeObserver.OnGlobalLayoutListener, + PopupWindow.OnDismissListener, View_OnAttachStateChangeListener, + MenuPresenter { + private class ExpandedIndexObserver extends DataSetObserver { + @Override + public void onChanged() { + mAdapter.findExpandedIndex(); + } + } + + private class MenuAdapter extends BaseAdapter { + private MenuBuilder mAdapterMenu; + private int mExpandedIndex = -1; + + public MenuAdapter(MenuBuilder menu) { + mAdapterMenu = menu; + registerDataSetObserver(new ExpandedIndexObserver()); + findExpandedIndex(); + } + + 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; + } + + @Override + public int getCount() { + ArrayList items = mAdapterMenu.getVisibleItems(); + if (mExpandedIndex < 0) { + return items.size(); + } + return items.size() - 1; + } + + @Override + public MenuItemImpl getItem(int position) { + ArrayList items = mAdapterMenu.getVisibleItems(); + if (mExpandedIndex >= 0 && position >= mExpandedIndex) { + position++; + } + return items.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + 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) { + ((HoloListMenuItemView) convertView).setForceShowIcon(true); + } + itemView.initialize(getItem(position), 0); + return convertView; + } + } + + static final int ITEM_LAYOUT = R.layout.popup_menu_item_layout; + private MenuAdapter mAdapter; + private View mAnchorView; + private Context mContext; + boolean mForceShowIcon; + private LayoutInflater mInflater; + private ViewGroup mMeasureParent; + private MenuBuilder mMenu; + private ListPopupWindow mPopup; + private int mPopupMaxWidth; + private Callback mPresenterCallback; + private ViewTreeObserver mTreeObserver; + + public PopupMenuHelper(Context context, MenuBuilder menu, View decorView) { + mContext = context; + mInflater = LayoutInflater.from(context); + mMenu = menu; + final Resources res = context.getResources(); + mPopupMaxWidth = Math.max(res.getDisplayMetrics().widthPixels / 2, + res.getDimensionPixelSize(R.dimen.config_prefDialogWidth)); + mAnchorView = decorView; + menu.addMenuPresenter(this); + } + + @Override + public boolean collapseItemActionView(MenuBuilder menu, MenuItemImpl item) { + return false; + } + + public void dismiss() { + if (isShowing()) { + mPopup.dismiss(); + } + } + + @Override + public boolean expandItemActionView(MenuBuilder menu, MenuItemImpl item) { + return false; + } + + @Override + public boolean flagActionItems() { + return false; + } + + @Override + public int getId() { + return 0; + } + + @Override + public MenuView getMenuView(ViewGroup root) { + throw new UnsupportedOperationException( + "MenuPopupHelpers manage their own views"); + } + + @Override + public void initForMenu(Context context, MenuBuilder menu) { + } + + public boolean isShowing() { + return mPopup != null && mPopup.isShowing(); + } + + private int measureContentWidth(ListAdapter adapter) { + 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 onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { + if (menu != mMenu) { + return; + } + dismiss(); + if (mPresenterCallback != null) { + mPresenterCallback.onCloseMenu(menu, allMenusAreClosing); + } + } + + @Override + @SuppressWarnings("deprecation") + public void onDismiss() { + mPopup = null; + mMenu.close(); + if (mTreeObserver != null) { + if (!mTreeObserver.isAlive()) { + mTreeObserver = mAnchorView.getViewTreeObserver(); + } + mTreeObserver.removeGlobalOnLayoutListener(this); + mTreeObserver = null; + } + if (mAnchorView instanceof View_HasStateListenerSupport) { + ((View_HasStateListenerSupport) mAnchorView) + .removeOnAttachStateChangeListener(this); + } + } + + @Override + public void onGlobalLayout() { + if (isShowing()) { + final View anchor = mAnchorView; + if (anchor == null || !anchor.isShown()) { + dismiss(); + } else if (isShowing()) { + mPopup.show(); + } + } + } + + @Override + public void onItemClick(AdapterView parent, View view, int position, + long id) { + MenuAdapter adapter = mAdapter; + adapter.mAdapterMenu.performItemAction(adapter.getItem(position), 0); + } + + @Override + public boolean onKey(View v, int keyCode, KeyEvent event) { + if (event.getAction() == KeyEvent.ACTION_UP + && keyCode == KeyEvent.KEYCODE_MENU) { + dismiss(); + return true; + } + return false; + } + + @Override + public void onRestoreInstanceState(Parcelable state) { + } + + @Override + public Parcelable onSaveInstanceState() { + return null; + } + + @Override + public boolean onSubMenuSelected(SubMenuBuilder subMenu) { + if (subMenu.hasVisibleItems()) { + PopupMenuHelper subPopup = new PopupMenuHelper(mContext, subMenu, + mAnchorView); + 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 onViewAttachedToWindow(View v) { + } + + @SuppressWarnings("deprecation") + @Override + public void onViewDetachedFromWindow(View v) { + if (mTreeObserver != null) { + if (!mTreeObserver.isAlive()) { + mTreeObserver = v.getViewTreeObserver(); + } + mTreeObserver.removeGlobalOnLayoutListener(this); + } + if (v instanceof View_HasStateListenerSupport) { + ((View_HasStateListenerSupport) v) + .removeOnAttachStateChangeListener(this); + } + } + + @Override + public void setCallback(Callback cb) { + mPresenterCallback = cb; + } + + public void setForceShowIcon(boolean forceShow) { + mForceShowIcon = forceShow; + } + + public void show() { + if (!tryShow()) { + throw new IllegalStateException( + "PopupMenuHelper cannot be used without an anchor"); + } + } + + public boolean tryShow() { + mPopup = new ListPopupWindow(mContext); + 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(); + if (addGlobalListener) { + mTreeObserver.addOnGlobalLayoutListener(this); + if (anchor instanceof View_HasStateListenerSupport) { + ((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; + } + + @Override + public void updateMenuView(boolean cleared) { + if (mAdapter != null) { + mAdapter.notifyDataSetChanged(); + } + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/view/ContextMenu.java b/android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/view/ContextMenu.java new file mode 100644 index 0000000000..10e09fa51b --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/view/ContextMenu.java @@ -0,0 +1,19 @@ + +package com.actionbarsherlock.view; + +import android.graphics.drawable.Drawable; +import android.view.View; + +public interface ContextMenu extends Menu { + public void clearHeader(); + + public ContextMenu setHeaderIcon(Drawable icon); + + public ContextMenu setHeaderIcon(int iconRes); + + public ContextMenu setHeaderTitle(CharSequence title); + + public ContextMenu setHeaderTitle(int titleRes); + + public ContextMenu setHeaderView(View view); +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/ArrayAdapter.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/ArrayAdapter.java new file mode 100644 index 0000000000..1a0a7153ec --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/ArrayAdapter.java @@ -0,0 +1,328 @@ + +package org.holoeverywhere; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import android.content.Context; +import android.util.Log; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.Filter; +import android.widget.Filterable; +import android.widget.TextView; + +public class ArrayAdapter extends BaseAdapter implements Filterable { + private class ArrayFilter extends Filter { + @Override + protected FilterResults performFiltering(CharSequence prefix) { + FilterResults results = new FilterResults(); + if (mOriginalValues == null) { + synchronized (mLock) { + mOriginalValues = new ArrayList(mObjects); + } + } + if (prefix == null || prefix.length() == 0) { + ArrayList list; + synchronized (mLock) { + list = new ArrayList(mOriginalValues); + } + results.values = list; + results.count = list.size(); + } else { + String prefixString = prefix.toString().toLowerCase(); + ArrayList values; + synchronized (mLock) { + values = new ArrayList(mOriginalValues); + } + final int count = values.size(); + final ArrayList newValues = new ArrayList(); + for (int i = 0; i < count; i++) { + final T value = values.get(i); + final String valueText = value.toString().toLowerCase(); + if (valueText.startsWith(prefixString)) { + newValues.add(value); + } else { + final String[] words = valueText.split(" "); + final int wordCount = words.length; + for (int k = 0; k < wordCount; k++) { + if (words[k].startsWith(prefixString)) { + newValues.add(value); + break; + } + } + } + } + results.values = newValues; + results.count = newValues.size(); + } + return results; + } + + @SuppressWarnings("unchecked") + @Override + protected void publishResults(CharSequence constraint, + FilterResults results) { + mObjects = (List) results.values; + if (results.count > 0) { + notifyDataSetChanged(); + } else { + notifyDataSetInvalidated(); + } + } + } + + public static ArrayAdapter createFromResource( + Context context, int textArrayResId, int textViewResId) { + CharSequence[] strings = context.getResources().getTextArray( + textArrayResId); + return new ArrayAdapter(context, textViewResId, strings); + } + + private boolean mAutoSetNotifyFlag = true; + private Context mContext; + private int mDropDownResource; + private int mFieldId = 0; + private ArrayFilter mFilter; + private LayoutInflater mInflater; + private final Object mLock = new Object(); + private boolean mNotifyOnChange = true; + private List mObjects; + private ArrayList mOriginalValues; + private int mResource; + + public ArrayAdapter(Context context, int textViewResourceId) { + init(context, textViewResourceId, 0, new ArrayList()); + } + + public ArrayAdapter(Context context, int resource, int textViewResourceId) { + init(context, resource, textViewResourceId, new ArrayList()); + } + + public ArrayAdapter(Context context, int resource, int textViewResourceId, + List objects) { + init(context, resource, textViewResourceId, objects); + } + + public ArrayAdapter(Context context, int resource, int textViewResourceId, + T[] objects) { + init(context, resource, textViewResourceId, Arrays.asList(objects)); + } + + public ArrayAdapter(Context context, int textViewResourceId, List objects) { + init(context, textViewResourceId, 0, objects); + } + + public ArrayAdapter(Context context, int textViewResourceId, T[] objects) { + init(context, textViewResourceId, 0, Arrays.asList(objects)); + } + + public void add(T object) { + synchronized (mLock) { + if (mOriginalValues != null) { + mOriginalValues.add(object); + } else { + mObjects.add(object); + } + } + if (mNotifyOnChange) { + notifyDataSetChanged(); + } + } + + public void addAll(Collection collection) { + synchronized (mLock) { + if (mOriginalValues != null) { + mOriginalValues.addAll(collection); + } else { + mObjects.addAll(collection); + } + } + if (mNotifyOnChange) { + notifyDataSetChanged(); + } + } + + public void addAll(T... items) { + synchronized (mLock) { + if (mOriginalValues != null) { + Collections.addAll(mOriginalValues, items); + } else { + Collections.addAll(mObjects, items); + } + } + if (mNotifyOnChange) { + notifyDataSetChanged(); + } + } + + public void clear() { + synchronized (mLock) { + if (mOriginalValues != null) { + mOriginalValues.clear(); + } else { + mObjects.clear(); + } + } + if (mNotifyOnChange) { + notifyDataSetChanged(); + } + } + + private View createViewFromResource(int position, View convertView, + ViewGroup parent, int resource) { + View view; + TextView text = null; + if (convertView == null) { + view = FontLoader.apply(mInflater.inflate(resource, parent, false)); + } else { + view = convertView; + } + try { + if (view != null) { + if (mFieldId > 0) { + text = (TextView) view.findViewById(mFieldId); + } else { + text = (TextView) view.findViewById(android.R.id.text1); + } + if (text == null && view instanceof TextView) { + text = (TextView) view; + } + } + if (text == null) { + throw new NullPointerException(); + } + } catch (RuntimeException e) { + Log.e("ArrayAdapter", + "You must supply a resource ID for a TextView"); + throw new IllegalStateException( + "ArrayAdapter requires the resource ID to be a TextView", e); + } + T item = getItem(position); + if (item instanceof CharSequence) { + text.setText((CharSequence) item); + } else { + text.setText(item.toString()); + } + return view; + } + + public Context getContext() { + return mContext; + } + + @Override + public int getCount() { + return mObjects.size(); + } + + @Override + public View getDropDownView(int position, View convertView, ViewGroup parent) { + return createViewFromResource(position, convertView, parent, + mDropDownResource); + } + + @Override + public Filter getFilter() { + if (mFilter == null) { + mFilter = new ArrayFilter(); + } + return mFilter; + } + + @Override + public T getItem(int position) { + return mObjects.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + public int getPosition(T item) { + return mObjects.indexOf(item); + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + return createViewFromResource(position, convertView, parent, mResource); + } + + private void init(Context context, int resource, int textViewResourceId, + List objects) { + mContext = context; + mInflater = LayoutInflater.from(context); + mResource = mDropDownResource = resource; + mObjects = objects; + mFieldId = textViewResourceId; + } + + public void insert(T object, int index) { + synchronized (mLock) { + if (mOriginalValues != null) { + mOriginalValues.add(index, object); + } else { + mObjects.add(index, object); + } + } + if (mNotifyOnChange) { + notifyDataSetChanged(); + } + } + + public boolean isAutoSetNotifyFlag() { + return mAutoSetNotifyFlag; + } + + @Override + public void notifyDataSetChanged() { + super.notifyDataSetChanged(); + if (mAutoSetNotifyFlag) { + mNotifyOnChange = true; + } + } + + public void remove(T object) { + synchronized (mLock) { + if (mOriginalValues != null) { + mOriginalValues.remove(object); + } else { + mObjects.remove(object); + } + } + if (mNotifyOnChange) { + notifyDataSetChanged(); + } + } + + public void setAutoSetNotifyFlag(boolean autoSetNotifyFlag) { + this.mAutoSetNotifyFlag = autoSetNotifyFlag; + } + + public void setDropDownViewResource(int resource) { + this.mDropDownResource = resource; + } + + public void setNotifyOnChange(boolean notifyOnChange) { + mNotifyOnChange = notifyOnChange; + } + + public void sort(Comparator comparator) { + synchronized (mLock) { + if (mOriginalValues != null) { + Collections.sort(mOriginalValues, comparator); + } else { + Collections.sort(mObjects, comparator); + } + } + if (mNotifyOnChange) { + notifyDataSetChanged(); + } + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/ChooserActivity.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/ChooserActivity.java new file mode 100644 index 0000000000..fddb647c3e --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/ChooserActivity.java @@ -0,0 +1,42 @@ + +package org.holoeverywhere; + +import org.holoeverywhere.app.ResolverActivity; + +import android.content.Intent; +import android.os.Bundle; +import android.os.Parcelable; +import android.util.Log; + +public class ChooserActivity extends ResolverActivity { + @Override + protected void onCreate(Bundle savedInstanceState) { + Intent intent = getIntent(); + Parcelable targetParcelable = intent.getParcelableExtra(Intent.EXTRA_INTENT); + if (!(targetParcelable instanceof Intent)) { + Log.w("ChooseActivity", "Target is not an intent: " + targetParcelable); + finish(); + return; + } + Intent target = (Intent) targetParcelable; + CharSequence title = intent.getCharSequenceExtra(Intent.EXTRA_TITLE); + if (title == null) { + title = getResources().getText(R.string.chooseActivity); + } + Parcelable[] pa = intent.getParcelableArrayExtra(Intent.EXTRA_INITIAL_INTENTS); + Intent[] initialIntents = null; + if (pa != null) { + initialIntents = new Intent[pa.length]; + for (int i = 0; i < pa.length; i++) { + if (!(pa[i] instanceof Intent)) { + Log.w("ChooseActivity", "Initial intent #" + i + + " not an Intent: " + pa[i]); + finish(); + return; + } + initialIntents[i] = (Intent) pa[i]; + } + } + onCreate(savedInstanceState, target, title, initialIntents, null, false); + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/ContentResolverCompat.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/ContentResolverCompat.java new file mode 100644 index 0000000000..4cd5103776 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/ContentResolverCompat.java @@ -0,0 +1,67 @@ + +package org.holoeverywhere; + +import java.io.FileNotFoundException; +import java.util.List; + +import android.content.Context; +import android.content.pm.PackageManager.NameNotFoundException; +import android.content.res.Resources; +import android.net.Uri; +import android.text.TextUtils; + +public class ContentResolverCompat { + + public static class OpenResourceIdResult { + public int id; + public Resources r; + } + + public static OpenResourceIdResult getResourceId(Context context, Uri uri) + throws FileNotFoundException { + String authority = uri.getAuthority(); + Resources r; + if (TextUtils.isEmpty(authority)) { + throw new FileNotFoundException("No authority: " + uri); + } else { + try { + r = context.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); + } + OpenResourceIdResult res = new OpenResourceIdResult(); + res.r = r; + res.id = id; + return res; + } + + private ContentResolverCompat() { + + } + +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/FontLoader.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/FontLoader.java new file mode 100644 index 0000000000..bf3db13508 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/FontLoader.java @@ -0,0 +1,277 @@ + +package org.holoeverywhere; + +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.io.OutputStream; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.res.Resources; +import android.graphics.Typeface; +import android.os.Build.VERSION; +import android.util.Log; +import android.util.SparseArray; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +public final class FontLoader { + public static interface FontSelector { + public HoloFont getFontForView(View view); + } + + public static class HoloFont implements FontSelector { + public static final HoloFont ROBOTO; + public static final HoloFont ROBOTO_BOLD; + public static final HoloFont ROBOTO_BOLD_ITALIC; + public static final HoloFont ROBOTO_ITALIC; + public static final HoloFont ROBOTO_REGULAR; + + static { + ROBOTO = makeFont( + ROBOTO_REGULAR = makeFont(R.raw.roboto_regular), + ROBOTO_BOLD = makeFont(R.raw.roboto_bold), + ROBOTO_ITALIC = makeFont(R.raw.roboto_italic), + ROBOTO_BOLD_ITALIC = makeFont(R.raw.roboto_bolditalic) + ); + } + + public static HoloFont makeFont(HoloFont regular, HoloFont bold, HoloFont italic, + HoloFont boldItalic) { + return new HoloFontMerger(regular, bold, italic, boldItalic); + } + + public static HoloFont makeFont(int rawResourceId) { + return new HoloFont(rawResourceId); + } + + public static HoloFont makeFont(int rawResourceId, boolean ignore) { + return new HoloFont(rawResourceId, ignore); + } + + public static HoloFont makeFont(Typeface typeface) { + return new HoloFont(typeface); + } + + /** + * Font raw resource id + */ + protected int mFontId; + /** + * If this flag setted this font doesn't modify any view + */ + protected boolean mIgnore; + /** + * Loaded typeface + */ + protected Typeface mTypeface; + + private HoloFont(int font) { + this(font, VERSION.SDK_INT >= 11); + } + + private HoloFont(int font, boolean ignore) { + mFontId = font; + mIgnore = ignore; + mTypeface = null; + } + + private HoloFont(Typeface typeface) { + mFontId = -1; + mIgnore = false; + mTypeface = typeface; + } + + public T apply(T view) { + if (mIgnore || mTypeface == null && mFontId <= 0 || view == null) { + return view; + } + return FontLoader.apply(view, obtainTypeface(view.getContext())); + } + + @Override + public HoloFont getFontForView(View view) { + return this; + } + + public Typeface obtainTypeface(Context context) { + if (mTypeface != null) { + return mTypeface; + } + if (mTypeface == null && mFontId > 0) { + mTypeface = loadTypeface(context, mFontId); + } + return mTypeface; + } + } + + private static final class HoloFontMerger extends HoloFont { + private HoloFont mBold; + private HoloFont mBoldItalic; + private HoloFont mItalic; + private HoloFont mRegular; + + public HoloFontMerger(HoloFont regular, HoloFont bold, HoloFont italic, HoloFont boldItalic) { + super(regular.mFontId, false); + mRegular = regular; + mBold = bold; + mItalic = italic; + mBoldItalic = boldItalic; + } + + @Override + public HoloFont getFontForView(View view) { + if (!(view instanceof TextView)) { + return super.getFontForView(view); + } + TextView textView = (TextView) view; + Typeface typeface = textView.getTypeface(); + if (typeface == null) { + return mRegular; + } + final boolean bold = typeface.isBold(), italic = typeface.isItalic(); + if (bold && italic) { + return mBoldItalic; + } else if (bold) { + return mBold; + } else if (italic) { + return mItalic; + } else { + return mRegular; + } + } + + } + + private static final SparseArray sFontCache = new SparseArray(); + + private static final String TAG = FontLoader.class.getSimpleName(); + + public static T apply(T view) { + return apply(view, HoloFont.ROBOTO); + } + + public static T apply(T view, FontSelector fontSelector) { + if (view == null || view.getContext() == null + || view.getContext().isRestricted()) { + Log.e(FontLoader.TAG, "View or context is invalid"); + return view; + } + return internalApply(view, fontSelector); + } + + public static T apply(T view, HoloFont font) { + return apply(view, (FontSelector) font); + } + + @SuppressLint("NewApi") + public static T apply(T view, int font) { + if (view == null || view.getContext() == null + || view.getContext().isRestricted()) { + Log.e(FontLoader.TAG, "View or context is invalid"); + return view; + } + Typeface typeface = FontLoader.loadTypeface(view.getContext(), font); + if (typeface == null) { + Log.v(FontLoader.TAG, "Font " + font + " not found in resources"); + return view; + } else { + return FontLoader.apply(view, typeface); + } + } + + public static T apply(T view, Typeface typeface) { + if (view == null || view.getContext() == null + || view.getContext().isRestricted()) { + return view; + } + if (typeface == null) { + Log.v(FontLoader.TAG, "Font is null"); + return view; + } + if (view instanceof TextView) { + ((TextView) view).setTypeface(typeface); + } + if (view instanceof ViewGroup) { + ViewGroup group = (ViewGroup) view; + for (int i = 0; i < group.getChildCount(); i++) { + FontLoader.apply(group.getChildAt(i), typeface); + } + } + return view; + } + + private static T internalApply(T view, FontSelector fontSelector) { + if (view instanceof TextView) { + TextView textView = (TextView) view; + HoloFont font = fontSelector.getFontForView(textView); + if (font != null && !font.mIgnore) { + Typeface typeface = font.obtainTypeface(view.getContext()); + if (typeface != null) { + textView.setTypeface(typeface); + } + } + } else if (view instanceof ViewGroup) { + ViewGroup group = (ViewGroup) view; + final int childCount = group.getChildCount(); + for (int i = 0; i < childCount; i++) { + internalApply(group.getChildAt(i), fontSelector); + } + } + return view; + } + + public static Typeface loadTypeface(Context context, int font) { + Typeface typeface = FontLoader.sFontCache.get(font); + if (typeface == null) { + try { + File file = new File(context.getCacheDir(), "fonts"); + if (!file.exists()) { + file.mkdirs(); + } + file = new File(file, "font_0x" + Integer.toHexString(font)); + FontLoader.sFontCache.put(font, + typeface = readTypeface(file, context.getResources(), font, true)); + } catch (Exception e) { + Log.e(FontLoader.TAG, "Error of loading font", e); + } + } + return typeface; + } + + private static Typeface readTypeface(File file, Resources res, int font, + boolean allowReadExistsFile) throws Exception { + try { + if (!allowReadExistsFile || !file.exists()) { + InputStream is = new BufferedInputStream(res.openRawResource(font)); + OutputStream os = new ByteArrayOutputStream(Math.max(is.available(), 1024)); + byte[] buffer = new byte[1024]; + int read; + while ((read = is.read(buffer)) > 0) { + os.write(buffer, 0, read); + } + is.close(); + os.flush(); + buffer = ((ByteArrayOutputStream) os).toByteArray(); + os.close(); + os = new FileOutputStream(file); + os.write(buffer); + os.flush(); + os.close(); + } + return Typeface.createFromFile(file); + } catch (Exception e) { + if (allowReadExistsFile) { + return readTypeface(file, res, font, false); + } + throw e; + } + } + + private FontLoader() { + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/HoloEverywhere.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/HoloEverywhere.java new file mode 100644 index 0000000000..61e8bd0e3d --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/HoloEverywhere.java @@ -0,0 +1,73 @@ + +package org.holoeverywhere; + +import android.os.Build.VERSION; +import android.os.Build.VERSION_CODES; + +public class HoloEverywhere { + public static enum PreferenceImpl { + JSON, XML + } + + /** + * When you call new activity it will be has parent activity theme + */ + public static boolean ALWAYS_USE_PARENT_THEME; + + /** + * Print some debug lines in Log + */ + public static boolean DEBUG; + + /** + * Disable any overscroll effects for views + */ + public static boolean DISABLE_OVERSCROLL_EFFECT; + + /** + * Since 1.5 to preferences can be assigned id instead of key. But for + * saving values in SharedPreferences using key, and it has next format: + * + *

    +     * preference_0x7fABCDEF
    +     * 
    + * + * If it options true - key for the preference will be name of id row: + * + *
    +     *  <Preference holo:id="@+id/myCoolPreference" />
    +     *  Key for SharedPreferences: myCoolPreference
    +     * 
    + */ + public static boolean NAMED_PREFERENCES; + + /** + * Main package of HoloEverywhere + */ + public static final String PACKAGE; + + /** + * Preference implementation using by default + */ + public static PreferenceImpl PREFERENCE_IMPL; + + /** + * Wrap any context menu calls by native classes. Like it do ABS on Android + * 4.0+ with options menu + */ + public static boolean WRAP_TO_NATIVE_CONTEXT_MENU; + + static { + PACKAGE = HoloEverywhere.class.getPackage().getName(); + + DEBUG = false; + ALWAYS_USE_PARENT_THEME = false; + NAMED_PREFERENCES = true; + DISABLE_OVERSCROLL_EFFECT = VERSION.SDK_INT < VERSION_CODES.HONEYCOMB; + WRAP_TO_NATIVE_CONTEXT_MENU = VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB; + PREFERENCE_IMPL = PreferenceImpl.XML; + } + + private HoloEverywhere() { + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/IHolo.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/IHolo.java new file mode 100644 index 0000000000..e341ab4bed --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/IHolo.java @@ -0,0 +1,21 @@ + +package org.holoeverywhere; + +import org.holoeverywhere.HoloEverywhere.PreferenceImpl; +import org.holoeverywhere.app.Application; +import org.holoeverywhere.preference.SharedPreferences; + +public interface IHolo { + public SharedPreferences getDefaultSharedPreferences(); + + public SharedPreferences getDefaultSharedPreferences(PreferenceImpl impl); + + public LayoutInflater getLayoutInflater(); + + public SharedPreferences getSharedPreferences(PreferenceImpl impl, + String name, int mode); + + public SharedPreferences getSharedPreferences(String name, int mode); + + public Application getSupportApplication(); +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/IHoloActivity.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/IHoloActivity.java new file mode 100644 index 0000000000..77aae2b9ba --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/IHoloActivity.java @@ -0,0 +1,67 @@ + +package org.holoeverywhere; + +import org.holoeverywhere.SystemServiceManager.SuperSystemService; +import org.holoeverywhere.ThemeManager.SuperStartActivity; +import org.holoeverywhere.addon.IAddonActivity; +import org.holoeverywhere.addon.IAddonAttacher; + +import android.support.v4.app.FragmentManager; + +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.app.ActionBar; +import com.actionbarsherlock.internal.view.menu.ContextMenuDecorView.ContextMenuListenersProvider; +import com.actionbarsherlock.internal.view.menu.ContextMenuListener; +import com.actionbarsherlock.view.ActionMode; +import com.actionbarsherlock.view.Menu; +import com.actionbarsherlock.view.MenuInflater; +import com.actionbarsherlock.view.MenuItem; + +public interface IHoloActivity extends IHolo, SuperStartActivity, + OnCreatePanelMenuListener, OnPreparePanelListener, + OnMenuItemSelectedListener, OnActionModeStartedListener, + OnActionModeFinishedListener, SuperSystemService, ContextMenuListener, + ContextMenuListenersProvider, IAddonAttacher { + public static interface OnWindowFocusChangeListener { + public void onWindowFocusChanged(boolean hasFocus); + } + + public void addOnWindowFocusChangeListener(OnWindowFocusChangeListener listener); + + public ActionBar getSupportActionBar(); + + public FragmentManager getSupportFragmentManager(); + + public MenuInflater getSupportMenuInflater(); + + public boolean isForceThemeApply(); + + public boolean onCreateOptionsMenu(Menu menu); + + public boolean onOptionsItemSelected(MenuItem item); + + public boolean onPrepareOptionsMenu(Menu menu); + + public void requestWindowFeature(long featureId); + + public void setSupportProgress(int progress); + + public void setSupportProgressBarIndeterminate(boolean indeterminate); + + public void setSupportProgressBarIndeterminateVisibility(boolean visible); + + public void setSupportProgressBarVisibility(boolean visible); + + public void setSupportSecondaryProgress(int secondaryProgress); + + public ActionMode startActionMode(ActionMode.Callback callback); + + public android.content.SharedPreferences superGetSharedPreferences( + String name, int mode); + + public void supportInvalidateOptionsMenu(); +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/IHoloFragment.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/IHoloFragment.java new file mode 100644 index 0000000000..28242ba1c5 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/IHoloFragment.java @@ -0,0 +1,47 @@ + +package org.holoeverywhere; + +import org.holoeverywhere.addon.IAddonAttacher; +import org.holoeverywhere.addon.IAddonFragment; +import org.holoeverywhere.app.Activity; +import org.holoeverywhere.preference.SharedPreferences; + +import android.os.Bundle; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.Watson.OnCreateOptionsMenuListener; +import android.support.v4.app.Watson.OnOptionsItemSelectedListener; +import android.support.v4.app.Watson.OnPrepareOptionsMenuListener; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; + +import com.actionbarsherlock.app.ActionBar; +import com.actionbarsherlock.internal.view.menu.ContextMenuDecorView.ContextMenuListenersProvider; +import com.actionbarsherlock.internal.view.menu.ContextMenuListener; +import com.actionbarsherlock.view.ActionMode; + +public interface IHoloFragment extends IHolo, OnPrepareOptionsMenuListener, + OnCreateOptionsMenuListener, OnOptionsItemSelectedListener, ContextMenuListener, + ContextMenuListenersProvider, IAddonAttacher { + @Override + public SharedPreferences getDefaultSharedPreferences(); + + public LayoutInflater getLayoutInflater(Bundle savedInstanceState); + + @Override + public SharedPreferences getSharedPreferences(String name, int mode); + + public ActionBar getSupportActionBar(); + + public Activity getSupportActivity(); + + public FragmentManager getSupportFragmentManager(); + + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState); + + public void onInflate(Activity activity, AttributeSet attrs, + Bundle savedInstanceState); + + public ActionMode startActionMode(ActionMode.Callback callback); +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/ITabSwipe.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/ITabSwipe.java new file mode 100644 index 0000000000..92cd738251 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/ITabSwipe.java @@ -0,0 +1,61 @@ + +package org.holoeverywhere; + +import org.holoeverywhere.ITabSwipe.TabInfo; +import org.holoeverywhere.app.Fragment; + +import android.os.Bundle; + +public interface ITabSwipe { + public static interface OnTabSelectedListener { + public void onTabSelected(int position); + } + + public static interface TabInfo { + public Bundle getFragmentArguments(); + + public Class getFragmentClass(); + + public CharSequence getTitle(); + + public void setFragmentArguments(Bundle fragmentArguments); + + public void setFragmentClass(Class fragmentClass); + + public void setTitle(CharSequence title); + } + + public T addTab(CharSequence title, Class fragmentClass); + + public T addTab(CharSequence title, Class fragmentClass, + Bundle fragmentArguments); + + public T addTab(int title, Class fragmentClass); + + public T addTab(int title, Class fragmentClass, + Bundle fragmentArguments); + + public T addTab(T tabInfo); + + public T addTab(T tabInfo, int position); + + public OnTabSelectedListener getOnTabSelectedListener(); + + public boolean isSmoothScroll(); + + public void reloadTabs(); + + public void removeAllTabs(); + + public T removeTab(int position); + + public T removeTab(T tabInfo); + + public void setCurrentTab(int position); + + public void setCustomLayout(int customLayout); + + public void setOnTabSelectedListener(OnTabSelectedListener onTabSelectedListener); + + public void setSmoothScroll(boolean smoothScroll); +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/IntentCompat.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/IntentCompat.java new file mode 100644 index 0000000000..25f7a29549 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/IntentCompat.java @@ -0,0 +1,59 @@ + +package org.holoeverywhere; + +import org.holoeverywhere.app.Application; + +import android.content.ClipData; +import android.content.Intent; +import android.os.Build.VERSION; +import android.os.Build.VERSION_CODES; + +public final class IntentCompat { + /** + * Declare chooser activity in manifest: + * + *
    +     *  <activity android:name="org.holoeverywhere.ChooserActivity"
    +     *      android:theme="@style/Holo.Theme.Dialog.Alert.Light"
    +     *      android:finishOnCloseSystemDialogs="true"
    +     *      android:excludeFromRecents="true"
    +     *      android:multiprocess="true" />
    +     * 
    + */ + public static Intent createChooser(Intent target, CharSequence title) { + if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN) { + return Intent.createChooser(target, title); + } + Intent intent = new Intent(); + intent.setClass(Application.getLastInstance(), ChooserActivity.class); + intent.putExtra(Intent.EXTRA_INTENT, target); + if (title != null) { + intent.putExtra(Intent.EXTRA_TITLE, title); + } + int permFlags = target.getFlags() + & (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); + if (permFlags != 0) { + ClipData targetClipData = target.getClipData(); + if (targetClipData == null && target.getData() != null) { + ClipData.Item item = new ClipData.Item(target.getData()); + String[] mimeTypes; + if (target.getType() != null) { + mimeTypes = new String[] { + target.getType() + }; + } else { + mimeTypes = new String[] {}; + } + targetClipData = new ClipData(null, mimeTypes, item); + } + if (targetClipData != null) { + intent.setClipData(targetClipData); + intent.addFlags(permFlags); + } + } + return intent; + } + + private IntentCompat() { + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/LayoutInflater.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/LayoutInflater.java new file mode 100644 index 0000000000..ca17257021 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/LayoutInflater.java @@ -0,0 +1,811 @@ + +package org.holoeverywhere; + +import java.io.IOException; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.holoeverywhere.SystemServiceManager.SystemServiceCreator; +import org.holoeverywhere.SystemServiceManager.SystemServiceCreator.SystemService; +import org.holoeverywhere.app.Fragment; +import org.holoeverywhere.internal.DialogTitle; +import org.holoeverywhere.internal.NumberPickerEditText; +import org.holoeverywhere.util.WeaklyMap; +import org.holoeverywhere.widget.FrameLayout; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.res.TypedArray; +import android.content.res.XmlResourceParser; +import android.graphics.Canvas; +import android.os.Build.VERSION; +import android.os.Build.VERSION_CODES; +import android.os.Handler; +import android.os.Message; +import android.support.v4.app.FragmentActivity; +import android.support.v4.app._HoloFragmentInflater; +import android.util.AttributeSet; +import android.util.Xml; +import android.view.InflateException; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewStub; + +import com.actionbarsherlock.internal.view.menu.ExpandedMenuView; +import com.actionbarsherlock.internal.view.menu.HoloListMenuItemView; +import com.actionbarsherlock.internal.widget.ActionBarContainer; +import com.actionbarsherlock.internal.widget.ActionBarView; + +public class LayoutInflater extends android.view.LayoutInflater implements Cloneable { + private static class BlinkLayout extends FrameLayout { + private static final int BLINK_DELAY = 500; + private static final int MESSAGE_BLINK = 0x42; + + private boolean mBlink; + private boolean mBlinkState; + private final Handler mHandler; + + public BlinkLayout(Context context, AttributeSet attrs) { + super(context, attrs); + mHandler = new Handler(new Handler.Callback() { + @Override + public boolean handleMessage(Message msg) { + if (msg.what == MESSAGE_BLINK) { + if (mBlink) { + mBlinkState = !mBlinkState; + makeBlink(); + } + invalidate(); + return true; + } + return false; + } + }); + } + + @Override + protected void dispatchDraw(Canvas canvas) { + if (mBlinkState) { + super.dispatchDraw(canvas); + } + } + + private void makeBlink() { + Message message = mHandler.obtainMessage(MESSAGE_BLINK); + mHandler.sendMessageDelayed(message, BLINK_DELAY); + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + mBlink = true; + mBlinkState = true; + makeBlink(); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + mBlink = false; + mBlinkState = true; + mHandler.removeMessages(MESSAGE_BLINK); + } + } + + public interface Factory { + public View onCreateView(View parent, String name, Context context, AttributeSet attrs); + } + + private static final class Factory2Wrapper implements Factory { + private Factory2 mFactory; + + public Factory2Wrapper(Factory2 factory) { + mFactory = factory; + } + + @Override + public View onCreateView(View parent, String name, Context context, AttributeSet attrs) { + return mFactory.onCreateView(parent, name, context, attrs); + } + } + + private static final class FactoryWrapper implements Factory { + private android.view.LayoutInflater.Factory mFactory; + + public FactoryWrapper(android.view.LayoutInflater.Factory factory) { + mFactory = factory; + } + + @Override + public View onCreateView(View parent, String name, Context context, AttributeSet attrs) { + return mFactory.onCreateView(name, context, attrs); + } + } + + @SystemService(Context.LAYOUT_INFLATER_SERVICE) + public static class LayoutInflaterCreator implements + SystemServiceCreator { + @Override + public LayoutInflater createService(Context context) { + return LayoutInflater.from(context); + } + } + + public static interface OnInitInflaterListener { + public void onInitInflater(LayoutInflater inflater); + } + + private static final HashMap> sConstructorMap = + new HashMap>(); + private static final Class[] sConstructorSignature = { + Context.class, AttributeSet.class + }; + private static final Map, Method> sFinishInflateMethods = + new HashMap, Method>(100); + private static final Map sInstances = new WeaklyMap(); + private static OnInitInflaterListener sListener; + private static final List sPackages = new ArrayList(); + private static final Map sRemaps = new HashMap(); + private static final String TAG_1995 = "blink"; + private static final String TAG_INCLUDE = "include"; + private static final String TAG_MERGE = "merge"; + private static final String TAG_REQUEST_FOCUS = "requestFocus"; + + static { + registerPackage("android.webkit"); + registerPackage("android.view"); + registerPackage("android.widget"); + registerPackage("android.support.v4.view"); + registerPackage(HoloEverywhere.PACKAGE + ".widget"); + + asInternal(ActionBarView.class); + asInternal(HoloListMenuItemView.class); + asInternal(ExpandedMenuView.class); + asInternal(ActionBarContainer.class); + asInternal(DialogTitle.class); + asInternal(NumberPickerEditText.class); + } + + private static void asInternal(Class clazz) { + register("Internal." + clazz.getSimpleName(), clazz.getName()); + } + + public static LayoutInflater from(android.view.LayoutInflater inflater) { + if (inflater instanceof LayoutInflater) { + return (LayoutInflater) inflater; + } + return LayoutInflater.from(inflater.getContext()).setParent(inflater); + } + + public static LayoutInflater from(Context context) { + LayoutInflater inflater = sInstances.get(context); + if (inflater == null) { + sInstances.put(context, inflater = new LayoutInflater(context)); + } + return inflater; + } + + public static View inflate(Context context, int resource) { + return from(context).inflate(resource, null); + } + + public static View inflate(Context context, int resource, ViewGroup root) { + return from(context).inflate(resource, root); + } + + public static View inflate(Context context, int resource, ViewGroup root, + boolean attachToRoot) { + return from(context).inflate(resource, root, attachToRoot); + } + + /** + * Iterate over classes and call {@link #register(Class)} for each + */ + public static void register(Class... classes) { + for (Class classe : classes) { + register(classe); + } + } + + /** + * Fast mapping views by name
    + *
    + * MyView -> com.myapppackage.widget.MyView
    + */ + public static void register(Class clazz) { + if (clazz != null) { + register(clazz.getSimpleName(), clazz.getName()); + } + } + + /** + * Manually register shortcuts for inflating
    + * Not recommend to use. You are warned.
    + *
    + * MyView -> com.myapppackage.widget.SuperPuperViewVeryCustom + */ + public static void register(String from, String to) { + LayoutInflater.sRemaps.put(from, to); + } + + public static void registerPackage(String packageName) { + packageName = Package.getPackage(packageName).getName(); + if (!sPackages.contains(packageName)) { + sPackages.add(packageName); + } + } + + /** + * @deprecated Use {@link #register(Class...)} instead + */ + @Deprecated + public static void remap(Class... classes) { + register(classes); + } + + /** + * @deprecated Use {@link #register(Class)} instead + */ + @Deprecated + public static void remap(Class clazz) { + register(clazz); + } + + @Deprecated + public static void remap(String prefix, String... classess) { + for (String clazz : classess) { + LayoutInflater.sRemaps.put(clazz, prefix + "." + clazz); + } + } + + /** + * @deprecated Use {@link #register(String,String)} instead + */ + @Deprecated + public static void remapHard(String from, String to) { + register(from, to); + } + + public static void removeInstance(Context context) { + sInstances.remove(context); + } + + public static void setOnInitInflaterListener(OnInitInflaterListener listener) { + sListener = listener; + } + + private final Fragment mChildFragment; + private Map mClonedInstances; + private final Object[] mConstructorArgs = new Object[2]; + private final Context mContext; + private List mFactories; + private Filter mFilter; + private HashMap mFilterMap; + private FragmentActivity mFragmentActivity; + private Map mFragmentChildInstances; + private LayoutInflater mParentInflater; + + protected LayoutInflater(android.view.LayoutInflater original, + Context newContext) { + this(original, newContext, null); + } + + protected LayoutInflater(android.view.LayoutInflater original, + Context newContext, Fragment childFragment) { + this(original.getContext(), childFragment); + setParent(original); + } + + protected LayoutInflater(Context context) { + this(context, null); + } + + protected LayoutInflater(Context context, Fragment childFragment) { + super(context); + mChildFragment = childFragment; + mContext = context; + if (LayoutInflater.sListener != null) { + LayoutInflater.sListener.onInitInflater(this); + } + } + + public View _createView(String name, String prefix, AttributeSet attrs) + throws ClassNotFoundException, InflateException { + Constructor constructor = sConstructorMap.get(name); + Class clazz = null; + try { + if (constructor == null) { + clazz = mContext.getClassLoader().loadClass( + prefix != null ? prefix + name : name).asSubclass(View.class); + if (mFilter != null && clazz != null) { + boolean allowed = mFilter.onLoadClass(clazz); + if (!allowed) { + failNotAllowed(name, prefix, attrs); + } + } + constructor = clazz.getConstructor(sConstructorSignature); + sConstructorMap.put(name, constructor); + } else { + if (mFilter != null) { + Boolean allowedState = mFilterMap.get(name); + if (allowedState == null) { + clazz = mContext.getClassLoader().loadClass( + prefix != null ? prefix + name : name).asSubclass(View.class); + boolean allowed = clazz != null && mFilter.onLoadClass(clazz); + mFilterMap.put(name, allowed); + if (!allowed) { + failNotAllowed(name, prefix, attrs); + } + } else if (allowedState.equals(Boolean.FALSE)) { + failNotAllowed(name, prefix, attrs); + } + } + } + Object[] args = mConstructorArgs; + args[1] = attrs; + final View view = constructor.newInstance(args); + if (view instanceof ViewStub) { + final ViewStub viewStub = (ViewStub) view; + if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN) { + viewStub.setLayoutInflater(this); + } + } + return view; + } catch (NoSuchMethodException e) { + InflateException ie = new InflateException(attrs.getPositionDescription() + + ": Error inflating class " + + (prefix != null ? prefix + name : name)); + ie.initCause(e); + throw ie; + + } catch (ClassCastException e) { + InflateException ie = new InflateException(attrs.getPositionDescription() + + ": Class is not a View " + + (prefix != null ? prefix + name : name)); + ie.initCause(e); + throw ie; + } catch (ClassNotFoundException e) { + throw e; + } catch (Exception e) { + InflateException ie = new InflateException(attrs.getPositionDescription() + + ": Error inflating class " + + (clazz == null ? "" : clazz.getName())); + ie.initCause(e); + throw ie; + } + } + + public void addFactory(Factory factory) { + checkFactoryOnNull(factory); + if (mFactories == null) { + mFactories = new ArrayList(); + } + mFactories.add(factory); + } + + public void addFactory(Factory factory, int index) { + checkFactoryOnNull(factory); + if (mFactories == null) { + mFactories = new ArrayList(); + } + mFactories.add(index, factory); + } + + private void checkFactoryOnNull(Factory factory) { + if (factory == null) { + throw new NullPointerException("Given factory can not be null"); + } + } + + @Override + public LayoutInflater cloneInContext(Context newContext) { + if (mClonedInstances == null) { + mClonedInstances = new HashMap(); + } + LayoutInflater inflater = mClonedInstances.get(newContext); + if (inflater == null) { + inflater = new LayoutInflater(this, newContext); + mClonedInstances.put(newContext, inflater); + } + return inflater; + } + + View createViewFromTag(View parent, String name, AttributeSet attrs) { + if ("fragment".equals(name)) { + return _HoloFragmentInflater + .inflate(LayoutInflater.this, attrs, parent, mChildFragment); + } + if (name.equals("view")) { + name = attrs.getAttributeValue(null, "class"); + } + try { + View view = null; + if (mFactories != null) { + for (int i = 0; i < mFactories.size(); i++) { + view = mFactories.get(i).onCreateView(parent, name, mContext, attrs); + if (view != null) { + break; + } + } + } + if (view == null) { + view = onCreateView(parent, name, attrs); + } + return prepareView(view); + } catch (InflateException e) { + throw e; + } catch (ClassNotFoundException e) { + InflateException ie = new InflateException(attrs.getPositionDescription() + + ": Error inflating class " + name); + ie.initCause(e); + throw ie; + } catch (Exception e) { + InflateException ie = new InflateException(attrs.getPositionDescription() + + ": Error inflating class " + name); + ie.initCause(e); + throw ie; + } + } + + private void failNotAllowed(String name, String prefix, AttributeSet attrs) { + throw new InflateException(attrs.getPositionDescription() + + ": Class not allowed to be inflated " + + (prefix != null ? prefix + name : name)); + } + + @Override + public Filter getFilter() { + return mFilter; + } + + public FragmentActivity getFragmentActivity() { + return mFragmentActivity; + } + + public View inflate(int resource) { + return inflate(resource, null, false); + } + + @Override + public View inflate(int resource, ViewGroup root) { + return inflate(resource, root, root != null); + } + + @Override + public View inflate(int resource, ViewGroup root, boolean attachToRoot) { + return inflate(getContext().getResources().getLayout(resource), root, attachToRoot); + } + + public View inflate(XmlPullParser parser) { + return inflate(parser, null, false); + } + + @Override + public View inflate(XmlPullParser parser, ViewGroup root) { + return inflate(parser, root, root != null); + } + + @Override + public View inflate(XmlPullParser parser, ViewGroup root, + boolean attachToRoot) { + synchronized (mConstructorArgs) { + final AttributeSet attrs = Xml.asAttributeSet(parser); + mConstructorArgs[0] = mContext; + View result = root; + try { + int type; + while ((type = parser.next()) != XmlPullParser.START_TAG && + type != XmlPullParser.END_DOCUMENT) { + ; + } + if (type != XmlPullParser.START_TAG) { + throw new InflateException(parser.getPositionDescription() + + ": No start tag found!"); + } + final String name = parser.getName(); + if (TAG_MERGE.equals(name)) { + if (root == null || !attachToRoot) { + throw new InflateException(" can be used only with a valid " + + "ViewGroup root and attachToRoot=true"); + } + rInflate(parser, root, attrs, false); + } else { + View temp; + if (TAG_1995.equals(name)) { + temp = new BlinkLayout(mContext, attrs); + } else { + temp = createViewFromTag(root, name, attrs); + } + ViewGroup.LayoutParams params = null; + if (root != null) { + params = root.generateLayoutParams(attrs); + if (!attachToRoot) { + temp.setLayoutParams(params); + } + } + rInflate(parser, temp, attrs, true); + if (root != null && attachToRoot) { + root.addView(temp, params); + } + if (root == null || !attachToRoot) { + result = temp; + } + } + } catch (XmlPullParserException e) { + InflateException ex = new InflateException(e.getMessage()); + ex.initCause(e); + throw ex; + } catch (IOException e) { + InflateException ex = new InflateException( + parser.getPositionDescription() + + ": " + e.getMessage()); + ex.initCause(e); + throw ex; + } finally { + mConstructorArgs[1] = null; + } + return FontLoader.apply(result); + } + } + + public LayoutInflater obtainFragmentChildInflater(Fragment fragment) { + if (mParentInflater != null) { + return mParentInflater.obtainFragmentChildInflater(fragment); + } + if (mFragmentChildInstances == null) { + mFragmentChildInstances = new WeaklyMap(); + } + LayoutInflater inflater = mFragmentChildInstances.get(fragment); + if (inflater == null) { + mFragmentChildInstances.put(fragment, + inflater = new LayoutInflater(this, mContext, fragment)); + } + return inflater; + } + + @Override + protected View onCreateView(View parent, String name, AttributeSet attrs) + throws ClassNotFoundException { + View view; + String newName = LayoutInflater.sRemaps.get(name); + if (newName != null) { + view = _createView(newName, null, attrs); + if (view != null) { + return view; + } + } + if (name.indexOf('.') > 0) { + return _createView(name, null, attrs); + } + for (int i = sPackages.size() - 1; i >= 0; i--) { + try { + view = _createView(name, sPackages.get(i) + ".", attrs); + if (view != null) { + return view; + } + } catch (ClassNotFoundException e) { + } + } + throw new ClassNotFoundException("Could not find class: " + name); + } + + private void parseInclude(XmlPullParser parser, View parent, AttributeSet attrs) + throws XmlPullParserException, IOException { + int type; + if (parent instanceof ViewGroup) { + final int layout = attrs.getAttributeResourceValue(null, "layout", 0); + if (layout == 0) { + final String value = attrs.getAttributeValue(null, "layout"); + if (value == null) { + throw new InflateException("You must specifiy a layout in the" + + " include tag: "); + } else { + throw new InflateException("You must specifiy a valid layout " + + "reference. The layout ID " + value + " is not valid."); + } + } else { + final XmlResourceParser childParser = + getContext().getResources().getLayout(layout); + try { + final AttributeSet childAttrs = Xml.asAttributeSet(childParser); + while ((type = childParser.next()) != XmlPullParser.START_TAG && + type != XmlPullParser.END_DOCUMENT) { + ; + } + if (type != XmlPullParser.START_TAG) { + throw new InflateException(childParser.getPositionDescription() + + ": No start tag found!"); + } + final String childName = childParser.getName(); + if (TAG_MERGE.equals(childName)) { + rInflate(childParser, parent, childAttrs, false); + } else { + final View view = createViewFromTag(parent, childName, childAttrs); + final ViewGroup group = (ViewGroup) parent; + ViewGroup.LayoutParams params = null; + try { + params = group.generateLayoutParams(attrs); + } catch (RuntimeException e) { + params = group.generateLayoutParams(childAttrs); + } finally { + if (params != null) { + view.setLayoutParams(params); + } + } + rInflate(childParser, view, childAttrs, true); + TypedArray a = mContext.obtainStyledAttributes(attrs, + new int[] { + android.R.attr.id, + android.R.attr.visibility + }, 0, 0); + int id = a.getResourceId(0, View.NO_ID); + int visibility = a.getInt(1, -1); + a.recycle(); + if (id != View.NO_ID) { + view.setId(id); + } + switch (visibility) { + case 0: + view.setVisibility(View.VISIBLE); + break; + case 1: + view.setVisibility(View.INVISIBLE); + break; + case 2: + view.setVisibility(View.GONE); + break; + } + group.addView(view); + } + } finally { + childParser.close(); + } + } + } else { + throw new InflateException(" can only be used inside of a ViewGroup"); + } + final int currentDepth = parser.getDepth(); + while (((type = parser.next()) != XmlPullParser.END_TAG || + parser.getDepth() > currentDepth) && type != XmlPullParser.END_DOCUMENT) { + ; + } + } + + private void parseRequestFocus(XmlPullParser parser, View parent) + throws XmlPullParserException, IOException { + int type; + parent.requestFocus(); + final int currentDepth = parser.getDepth(); + while (((type = parser.next()) != XmlPullParser.END_TAG || + parser.getDepth() > currentDepth) && type != XmlPullParser.END_DOCUMENT) { + ; + } + } + + @SuppressLint("NewApi") + private View prepareView(View view) { + if (HoloEverywhere.DISABLE_OVERSCROLL_EFFECT && VERSION.SDK_INT >= 9) { + view.setOverScrollMode(View.OVER_SCROLL_NEVER); + } + return view; + } + + void rInflate(XmlPullParser parser, View parent, final AttributeSet attrs, + boolean finishInflate) throws XmlPullParserException, IOException { + final int depth = parser.getDepth(); + int type; + while (((type = parser.next()) != XmlPullParser.END_TAG || + parser.getDepth() > depth) && type != XmlPullParser.END_DOCUMENT) { + if (type != XmlPullParser.START_TAG) { + continue; + } + final String name = parser.getName(); + if (TAG_REQUEST_FOCUS.equals(name)) { + parseRequestFocus(parser, parent); + } else if (TAG_INCLUDE.equals(name)) { + if (parser.getDepth() == 0) { + throw new InflateException(" cannot be the root element"); + } + parseInclude(parser, parent, attrs); + } else if (TAG_MERGE.equals(name)) { + throw new InflateException(" must be the root element"); + } else if (TAG_1995.equals(name)) { + final View view = new BlinkLayout(mContext, attrs); + final ViewGroup viewGroup = (ViewGroup) parent; + final ViewGroup.LayoutParams params = viewGroup.generateLayoutParams(attrs); + rInflate(parser, view, attrs, true); + viewGroup.addView(view, params); + } else { + final View view = createViewFromTag(parent, name, attrs); + final ViewGroup viewGroup = (ViewGroup) parent; + final ViewGroup.LayoutParams params = viewGroup.generateLayoutParams(attrs); + rInflate(parser, view, attrs, true); + viewGroup.addView(view, params); + } + } + if (finishInflate) { + Class clazz = parent.getClass(); + Method method = sFinishInflateMethods.get(clazz); + if (method == null) { + while (clazz != Object.class && method == null) { + try { + method = clazz.getDeclaredMethod("onFinishInflate", (Class[]) null); + } catch (Exception e) { + clazz = clazz.getSuperclass(); + } + } + if (method != null) { + method.setAccessible(true); + sFinishInflateMethods.put(parent.getClass(), method); + } + } + if (method != null) { + try { + method.invoke(parent, (Object[]) null); + } catch (Exception e) { + } + } + } + } + + @Override + public void setFactory(android.view.LayoutInflater.Factory factory) { + setFactory(new FactoryWrapper(factory)); + } + + public void setFactory(Factory factory) { + addFactory(factory, 0); + } + + @Override + public void setFactory2(Factory2 factory) { + setFactory(new Factory2Wrapper(factory)); + } + + @Override + public void setFilter(Filter filter) { + mFilter = filter; + if (filter != null) { + mFilterMap = new HashMap(); + } + } + + public void setFragmentActivity(FragmentActivity fragmentActivity) { + mFragmentActivity = fragmentActivity; + } + + protected LayoutInflater setParent(android.view.LayoutInflater original) { + if (original == this) { + return this; + } + if (original instanceof LayoutInflater) { + mParentInflater = (LayoutInflater) original; + mFilter = mParentInflater.mFilter; + mFilterMap = mParentInflater.mFilterMap; + mFactories = mParentInflater.mFactories; + } else { + mParentInflater = null; + if (VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB) { + final Factory2 factory = original.getFactory2(); + if (factory != null) { + setFactory2(factory); + } + } + final android.view.LayoutInflater.Factory factory = original.getFactory(); + if (factory != null) { + setFactory(factory); + } + final Filter filter = original.getFilter(); + if (filter != null) { + setFilter(filter); + } + } + return this; + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/SystemServiceManager.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/SystemServiceManager.java new file mode 100644 index 0000000000..993efb373e --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/SystemServiceManager.java @@ -0,0 +1,104 @@ + +package org.holoeverywhere; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; + +import org.holoeverywhere.SystemServiceManager.SystemServiceCreator.SystemService; + +import android.content.Context; + +/** + * Manager of system services + * + * @author prok (prototypegamez@gmail.com) + */ +public final class SystemServiceManager { + public static interface SuperSystemService { + public Object superGetSystemService(String name); + } + + public static interface SystemServiceCreator { + @Target(ElementType.TYPE) + @Retention(RetentionPolicy.RUNTIME) + public static @interface SystemService { + public String value(); + } + + public T createService(Context context); + } + + private static final Map>, SystemServiceCreator> CREATORS_MAP = new HashMap>, SystemServiceManager.SystemServiceCreator>(); + private static final Map>> MAP = new HashMap>>(); + + private static Object getSuperSystemService(Context context, String name) { + if (context instanceof SuperSystemService) { + return ((SuperSystemService) context).superGetSystemService(name); + } else { + return context.getSystemService(name); + } + } + + public static Object getSystemService(Context context, String name) { + if (context == null || context.isRestricted()) { + throw new RuntimeException("Invalid context"); + } else if (name == null || name.length() == 0) { + return null; + } + Class> clazz = MAP.get(name); + if (clazz == null) { + return getSuperSystemService(context, name); + } + SystemServiceCreator creator = CREATORS_MAP.get(clazz); + if (creator == null) { + try { + creator = clazz.newInstance(); + } catch (Exception e) { + e.printStackTrace(); + } + CREATORS_MAP.put(clazz, creator); + } + if (creator != null) { + Object o = creator.createService(context); + if (o != null) { + return o; + } + } + return getSuperSystemService(context, name); + } + + public static void register(Class> clazz) { + if (!clazz.isAnnotationPresent(SystemService.class)) { + throw new RuntimeException( + "SystemServiceCreator must be implement SystemService"); + } + SystemService systemService = clazz.getAnnotation(SystemService.class); + final String name = systemService.value(); + if (name == null || name.length() == 0) { + throw new RuntimeException("SystemService has incorrect name"); + } + MAP.put(name, clazz); + } + + public static synchronized void unregister( + Class> clazz) { + if (MAP.containsValue(clazz)) { + for (Entry>> e : MAP + .entrySet()) { + if (e.getValue() == clazz) { + MAP.remove(e.getKey()); + break; + } + } + } + CREATORS_MAP.remove(clazz); + } + + private SystemServiceManager() { + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/ThemeManager.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/ThemeManager.java new file mode 100644 index 0000000000..86a0af3ce8 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/ThemeManager.java @@ -0,0 +1,982 @@ + +package org.holoeverywhere; + +import static org.holoeverywhere.R.style.Holo_Theme; +import static org.holoeverywhere.R.style.Holo_Theme_Dialog; +import static org.holoeverywhere.R.style.Holo_Theme_DialogWhenLarge; +import static org.holoeverywhere.R.style.Holo_Theme_DialogWhenLarge_Light; +import static org.holoeverywhere.R.style.Holo_Theme_DialogWhenLarge_Light_DarkActionBar; +import static org.holoeverywhere.R.style.Holo_Theme_DialogWhenLarge_Light_DarkActionBar_NoActionBar; +import static org.holoeverywhere.R.style.Holo_Theme_DialogWhenLarge_Light_NoActionBar; +import static org.holoeverywhere.R.style.Holo_Theme_DialogWhenLarge_NoActionBar; +import static org.holoeverywhere.R.style.Holo_Theme_Dialog_Light; +import static org.holoeverywhere.R.style.Holo_Theme_Fullscreen; +import static org.holoeverywhere.R.style.Holo_Theme_Fullscreen_Wallpaper; +import static org.holoeverywhere.R.style.Holo_Theme_Light; +import static org.holoeverywhere.R.style.Holo_Theme_Light_DarkActionBar; +import static org.holoeverywhere.R.style.Holo_Theme_Light_DarkActionBar_Fullscreen; +import static org.holoeverywhere.R.style.Holo_Theme_Light_DarkActionBar_Fullscreen_Wallpaper; +import static org.holoeverywhere.R.style.Holo_Theme_Light_DarkActionBar_NoActionBar; +import static org.holoeverywhere.R.style.Holo_Theme_Light_DarkActionBar_NoActionBar_Fullscreen; +import static org.holoeverywhere.R.style.Holo_Theme_Light_DarkActionBar_NoActionBar_Fullscreen_Wallpaper; +import static org.holoeverywhere.R.style.Holo_Theme_Light_DarkActionBar_NoActionBar_Wallpaper; +import static org.holoeverywhere.R.style.Holo_Theme_Light_DarkActionBar_Wallpaper; +import static org.holoeverywhere.R.style.Holo_Theme_Light_Fullscreen; +import static org.holoeverywhere.R.style.Holo_Theme_Light_Fullscreen_Wallpaper; +import static org.holoeverywhere.R.style.Holo_Theme_Light_NoActionBar; +import static org.holoeverywhere.R.style.Holo_Theme_Light_NoActionBar_Fullscreen; +import static org.holoeverywhere.R.style.Holo_Theme_Light_NoActionBar_Fullscreen_Wallpaper; +import static org.holoeverywhere.R.style.Holo_Theme_Light_NoActionBar_Wallpaper; +import static org.holoeverywhere.R.style.Holo_Theme_Light_Wallpaper; +import static org.holoeverywhere.R.style.Holo_Theme_NoActionBar; +import static org.holoeverywhere.R.style.Holo_Theme_NoActionBar_Fullscreen; +import static org.holoeverywhere.R.style.Holo_Theme_NoActionBar_Fullscreen_Wallpaper; +import static org.holoeverywhere.R.style.Holo_Theme_NoActionBar_Wallpaper; +import static org.holoeverywhere.R.style.Holo_Theme_Wallpaper; + +import java.util.ArrayList; +import java.util.List; + +import org.holoeverywhere.ThemeManager.ThemeGetter.ThemeTag; +import org.holoeverywhere.app.Activity; +import org.holoeverywhere.app.Application; +import org.holoeverywhere.app.ContextThemeWrapperPlus; +import org.holoeverywhere.preference.PreferenceManagerHelper; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.Intent; +import android.content.res.TypedArray; +import android.os.Build.VERSION; +import android.os.Bundle; +import android.util.SparseIntArray; + +/** + * ThemeManager for using different themes in activity, dialogs, etc.
    + * It uses the principle of binary flags. For example, you can get a dark theme + * on the fullscreen mixing the two flags:
    + * {@link ThemeManager#DARK} | {@link ThemeManager#FULLSCREEN}
    + *
    + * Default themes map for different flags: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
    + * {@link #DARK}{@link #LIGHT}{@link #MIXED}
    no other flags{@link R.style#Holo_Theme}{@link R.style#Holo_Theme_Light}{@link R.style#Holo_Theme_Light_DarkActionBar}
    {@link #FULLSCREEN}{@link R.style#Holo_Theme_Fullscreen}{@link R.style#Holo_Theme_Light_Fullscreen}{@link R.style#Holo_Theme_Light_DarkActionBar_Fullscreen}
    {@link #NO_ACTION_BAR}{@link R.style#Holo_Theme_NoActionBar}{@link R.style#Holo_Theme_Light_NoActionBar}{@link R.style#Holo_Theme_Light_DarkActionBar_NoActionBar}
    {@link #NO_ACTION_BAR} | {@link #FULLSCREEN}{@link R.style#Holo_Theme_NoActionBar_Fullscreen}{@link R.style#Holo_Theme_Light_NoActionBar_Fullscreen}{@link R.style#Holo_Theme_Light_DarkActionBar_NoActionBar_Fullscreen}
    {@link #WALLPAPER}{@link R.style#Holo_Theme_Wallpaper}{@link R.style#Holo_Theme_Light_Wallpaper}{@link R.style#Holo_Theme_Light_DarkActionBar_Wallpaper}
    {@link #WALLPAPER} | {@link #FULLSCREEN}{@link R.style#Holo_Theme_Fullscreen_Wallpaper}{@link R.style#Holo_Theme_Light_Fullscreen_Wallpaper}{@link R.style#Holo_Theme_Light_DarkActionBar_Fullscreen_Wallpaper}
    {@link #WALLPAPER} | {@link #NO_ACTION_BAR}{@link R.style#Holo_Theme_NoActionBar_Wallpaper}{@link R.style#Holo_Theme_Light_NoActionBar_Wallpaper}{@link R.style#Holo_Theme_Light_DarkActionBar_NoActionBar_Wallpaper}
    {@link #WALLPAPER} | {@link #NO_ACTION_BAR} | {@link #FULLSCREEN}{@link R.style#Holo_Theme_NoActionBar_Fullscreen_Wallpaper}{@link R.style#Holo_Theme_Light_NoActionBar_Fullscreen_Wallpaper} + * {@link R.style#Holo_Theme_Light_DarkActionBar_NoActionBar_Fullscreen_Wallpaper} + *
    {@link #DIALOG}{@link R.style#Holo_Theme_Dialog}{@link R.style#Holo_Theme_Dialog_Light}{@link R.style#Holo_Theme_Dialog_Light}
    {@link #DIALOG_WHEN_LARGE}{@link R.style#Holo_Theme_DialogWhenLarge}{@link R.style#Holo_Theme_DialogWhenLarge_Light}{@link R.style#Holo_Theme_DialogWhenLarge_Light_DarkActionBar}
    {@link #DIALOG_WHEN_LARGE} | {@link #NO_ACTION_BAR}{@link R.style#Holo_Theme_DialogWhenLarge_NoActionBar}{@link R.style#Holo_Theme_DialogWhenLarge_Light_NoActionBar} + * {@link R.style#Holo_Theme_DialogWhenLarge_Light_DarkActionBar_NoActionBar}
    + *
    + * You may remap themes for certain flags with method {@link #map(int, int)} + * where first arg - flags, second - theme resource
    + *
    + * Part of HoloEverywhere + * + * @author prok (prototypegamez@gmail.com) + */ +public final class ThemeManager { + /** + * System interface for calling super.startActivity in the activities. + */ + public static interface SuperStartActivity { + public void superStartActivity(Intent intent, int requestCode, + Bundle options); + } + + /** + * Theme getter. This class should return theme resource for set of flags. + * If under the right ThemeTag no have theme, return a negative number or + * zero.
    + *
    + * Example: + * + *
    +     * ThemeGetter getter = new ThemeGetter() {
    +     *   public int getThemeResource(ThemeTag themeTag) {
    +     *     if(themeTag.fullscreen) { // theme has {@link ThemeManager#FULLSCREEN} flag
    +     *       return R.style.CustomThemeWithFullscreenFlag;
    +     *     }
    +     *     return 0; // default behavior
    +     *   }
    +     * }
    +     * 
    + */ + public static interface ThemeGetter { + /** + * Class-container for theme flags. + */ + public static final class ThemeTag { + public final boolean dark, fullscreen, light, mixed, noActionBar, wallpaper, dialog, + dialogWhenLarge; + public final int flags; + + private ThemeTag(int flags) { + this.flags = flags; + dark = isDark(flags); + light = isLight(flags); + mixed = isMixed(flags); + noActionBar = isNoActionBar(flags); + fullscreen = isFullScreen(flags); + wallpaper = isWallpaper(flags); + dialog = isDialog(flags); + dialogWhenLarge = isDialogWhenLarge(flags); + } + } + + public int getThemeResource(ThemeTag themeTag); + } + + public static interface ThemeSetter { + public void setupThemes(); + } + + private static int _DEFAULT_THEME; + public static final int _START_RESOURCES_ID = 0x01000000; + private static ThemeGetter _THEME_GETTER; + private static int _THEME_MASK = 0; + private static int _THEME_MODIFIER = 0; + private static final String _THEME_TAG = ":holoeverywhere:theme"; + + private static final SparseIntArray _THEMES_MAP = new SparseIntArray(); + + public static final int COLOR_SCHEME_MASK; + /** + * Flag indicates on the dark theme + */ + public static final int DARK; + /** + * Flag indicates on the dialog theme. + */ + public static final int DIALOG; + /** + * Flag indicates on the dialog-when-large theme. + */ + public static final int DIALOG_WHEN_LARGE; + /** + * Flag indicates on the fullscreen theme + */ + public static final int FULLSCREEN; + /** + * Invalid theme + */ + public static final int INVALID = 0; + /** + * Boolean flag indicates that activity was be created by theme manager + */ + public static final String KEY_CREATED_BY_THEME_MANAGER = ":holoeverywhere:createbythememanager"; + /** + * Key for saving activity instance state. Only for system use + */ + public static final String KEY_INSTANCE_STATE = ":holoeverywhere:instancestate"; + /** + * Flag indicates on the light theme. If you want light theme with dark + * action bar, use {@link #MIXED} flag + */ + public static final int LIGHT; + /** + * Flag indicates on the light theme with dark action bar + */ + public static final int MIXED; + + private static int NEXT_OFFSET = 0; + + /** + * Flag indicates on the theme without action bar + */ + public static final int NO_ACTION_BAR; + + private static List sThemeSetters; + + /** + * Flag indicates on the theme with wallpaper background + */ + public static final int WALLPAPER; + + static { + DARK = makeNewFlag(); + LIGHT = makeNewFlag(); + MIXED = DARK | LIGHT; + FULLSCREEN = makeNewFlag(); + NO_ACTION_BAR = makeNewFlag(); + WALLPAPER = makeNewFlag(); + DIALOG = makeNewFlag(); + DIALOG_WHEN_LARGE = makeNewFlag(); + + COLOR_SCHEME_MASK = DARK | LIGHT | MIXED; + + reset(); + } + + /** + * Apply theme from intent. Only system use, don't call it! + */ + public static void applyTheme(Activity activity) { + boolean force = activity instanceof IHoloActivity ? ((IHoloActivity) activity) + .isForceThemeApply() : false; + ThemeManager.applyTheme(activity, force); + } + + /** + * Apply theme from intent. Only system use, don't call it! + */ + public static void applyTheme(Activity activity, boolean force) { + if (force || ThemeManager.hasSpecifiedTheme(activity)) { + activity.setTheme(ThemeManager.getThemeResource(activity)); + } + } + + /** + * Synonym for {@link #cloneTheme(Intent, Intent, boolean)} with third arg - + * false + * + * @see #cloneTheme(Intent, Intent, boolean) + */ + public static void cloneTheme(Intent sourceIntent, Intent intent) { + ThemeManager.cloneTheme(sourceIntent, intent, false); + } + + /** + * Clone theme from sourceIntent to intent, if it specified for sourceIntent + * or set flag force + * + * @param sourceIntent Intent with specified {@link #_THEME_TAG} + * @param intent Intent into which will be put a theme + * @param force Clone theme even if sourceIntent not contain + * {@link #_THEME_TAG} + */ + public static void cloneTheme(Intent sourceIntent, Intent intent, + boolean force) { + final boolean hasSourceTheme = hasSpecifiedTheme(sourceIntent); + if (force || hasSourceTheme) { + intent.putExtra(_THEME_TAG, hasSourceTheme ? getTheme(sourceIntent) + : _DEFAULT_THEME); + } + } + + public static Context context(Context context, int theme) { + return context(context, theme, true); + } + + public static Context context(Context context, int theme, boolean applyModifier) { + while (context instanceof ContextThemeWrapperPlus) { + context = ((ContextThemeWrapperPlus) context).getBaseContext(); + } + return new ContextThemeWrapperPlus(context, getThemeResource(theme, applyModifier)); + } + + /** + * @return Default theme, which will be using if theme not specified for + * intent + * @see #setDefaultTheme(int) + * @see #modifyDefaultTheme(int) + * @see #modifyDefaultThemeClear(int) + */ + public static int getDefaultTheme() { + return _DEFAULT_THEME; + } + + /** + * @return Modifier, which applying on all themes. + * @see #modify(int) + * @see #setModifier(int) + */ + public static int getModifier() { + return _THEME_MODIFIER; + } + + /** + * Extract theme flags from activity intent + */ + public static int getTheme(Activity activity) { + return getTheme(activity.getIntent()); + } + + /** + * Extract theme flags from intent + */ + public static int getTheme(Intent intent) { + return getTheme(intent, true); + } + + /** + * Extract theme flags from intent + */ + public static int getTheme(Intent intent, boolean applyModifier) { + return prepareFlags(intent.getIntExtra(ThemeManager._THEME_TAG, + ThemeManager._DEFAULT_THEME), applyModifier); + } + + public static int getThemeMask() { + return _THEME_MASK; + } + + /** + * Resolve theme resource id by flags from activity intent + */ + public static int getThemeResource(Activity activity) { + return getThemeResource(getTheme(activity)); + } + + /** + * Resolve theme resource id by flags + */ + public static int getThemeResource(int themeTag) { + return getThemeResource(themeTag, true); + } + + /** + * Resolve theme resource id by flags + */ + public static int getThemeResource(int themeTag, boolean applyModifier) { + themeTag = prepareFlags(themeTag, applyModifier); + if (themeTag >= _START_RESOURCES_ID) { + return themeTag; + } + if (ThemeManager._THEME_GETTER != null) { + final int getterResource = ThemeManager._THEME_GETTER + .getThemeResource(new ThemeTag(themeTag)); + if (getterResource > 0) { + return getterResource; + } + } + final int i = _THEMES_MAP.get(themeTag, _DEFAULT_THEME); + if (i == _DEFAULT_THEME) { + return _THEMES_MAP.get(_DEFAULT_THEME, R.style.Holo_Theme); + } else { + return i; + } + } + + /** + * Resolve theme resource id by flags from intent + */ + public static int getThemeResource(Intent intent) { + return getThemeResource(getTheme(intent)); + } + + public static int getThemeType(Context context) { + TypedArray a = context.obtainStyledAttributes(new int[] { + R.attr.holoTheme + }); + final int holoTheme = a.getInt(0, 0); + a.recycle(); + switch (holoTheme) { + case 1: + return DARK; + case 2: + return LIGHT; + case 3: + return MIXED; + case 4: + return PreferenceManagerHelper.obtainThemeTag(); + case 0: + default: + return INVALID; + } + } + + /** + * @return true if activity has specified theme in intent + */ + public static boolean hasSpecifiedTheme(Activity activity) { + return activity == null ? false : ThemeManager + .hasSpecifiedTheme(activity.getIntent()); + } + + /** + * @return true if intent has specified theme + */ + public static boolean hasSpecifiedTheme(Intent intent) { + return intent != null && intent.hasExtra(ThemeManager._THEME_TAG) + && intent.getIntExtra(ThemeManager._THEME_TAG, 0) > 0; + } + + private static boolean is(int config, int key) { + return (config & key) == key; + } + + public static boolean isDark(Activity activity) { + return ThemeManager.isDark(ThemeManager.getTheme(activity)); + } + + public static boolean isDark(int i) { + return ThemeManager.is(i, ThemeManager.DARK); + } + + public static boolean isDark(Intent intent) { + return ThemeManager.isDark(ThemeManager.getTheme(intent)); + } + + public static boolean isDialog(Activity activity) { + return ThemeManager.isDialog(ThemeManager.getTheme(activity)); + } + + public static boolean isDialog(int i) { + return ThemeManager.is(i, ThemeManager.DIALOG); + } + + public static boolean isDialog(Intent intent) { + return ThemeManager.isDialog(ThemeManager.getTheme(intent)); + } + + public static boolean isDialogWhenLarge(Activity activity) { + return ThemeManager.isDialog(ThemeManager.getTheme(activity)); + } + + public static boolean isDialogWhenLarge(int i) { + return ThemeManager.is(i, ThemeManager.DIALOG_WHEN_LARGE); + } + + public static boolean isDialogWhenLarge(Intent intent) { + return ThemeManager.isDialog(ThemeManager.getTheme(intent)); + } + + public static boolean isFullScreen(Activity activity) { + return ThemeManager.isFullScreen(ThemeManager.getTheme(activity)); + } + + public static boolean isFullScreen(int i) { + return ThemeManager.is(i, ThemeManager.FULLSCREEN); + } + + public static boolean isFullScreen(Intent intent) { + return ThemeManager.isFullScreen(ThemeManager.getTheme(intent)); + } + + public static boolean isLight(Activity activity) { + return ThemeManager.isLight(ThemeManager.getTheme(activity)); + } + + public static boolean isLight(int i) { + return ThemeManager.is(i, ThemeManager.LIGHT); + } + + public static boolean isLight(Intent intent) { + return ThemeManager.isLight(ThemeManager.getTheme(intent)); + } + + public static boolean isMixed(Activity activity) { + return ThemeManager.isMixed(ThemeManager.getTheme(activity)); + } + + public static boolean isMixed(int i) { + return ThemeManager.is(i, ThemeManager.MIXED); + } + + public static boolean isMixed(Intent intent) { + return ThemeManager.isMixed(ThemeManager.getTheme(intent)); + } + + public static boolean isNoActionBar(Activity activity) { + return ThemeManager.isNoActionBar(ThemeManager.getTheme(activity)); + } + + public static boolean isNoActionBar(int i) { + return ThemeManager.is(i, ThemeManager.NO_ACTION_BAR); + } + + public static boolean isNoActionBar(Intent intent) { + return ThemeManager.isNoActionBar(ThemeManager.getTheme(intent)); + } + + public static boolean isWallpaper(Activity activity) { + return ThemeManager.isWallpaper(ThemeManager.getTheme(activity)); + } + + public static boolean isWallpaper(int i) { + return ThemeManager.is(i, ThemeManager.WALLPAPER); + } + + public static boolean isWallpaper(Intent intent) { + return ThemeManager.isWallpaper(ThemeManager.getTheme(intent)); + } + + /** + * Generate flag for using it in ThemeManager. Not more than 32 flags can be + * created. + */ + public static int makeNewFlag() { + if (NEXT_OFFSET > 32) { + throw new IllegalStateException(); + } + final int flag = 1 << NEXT_OFFSET++; + _THEME_MASK |= flag; + return flag; + } + + /** + * Remap default theme. + * + * @see #map(int, int) + */ + public static void map(int theme) { + map(_DEFAULT_THEME, theme); + } + + /** + * Remap themes.
    + *
    + * Example, you can remap {@link #LIGHT} theme on + * {@link R.style#Holo_Theme_Dialog_Light}:
    + * + *
    +     * ThemeManager.map({@link #LIGHT}, {@link R.style#Holo_Theme_Dialog_Light});
    +     * 
    + * + * If theme value negative - remove pair flags-theme + */ + public static void map(int flags, int theme) { + if (theme > 0) { + _THEMES_MAP.put(flags & _THEME_MASK, theme); + } else { + final int i = _THEMES_MAP.indexOfKey(flags & _THEME_MASK); + if (i > 0) { + _THEMES_MAP.removeAt(i); + } + } + } + + /** + * Add modifier to all themes, using in {@link ThemeManager}. If you call + * modify({@link #NO_ACTION_BAR}), then all themes will be without action + * bar by default, regardless of the flag is passed. + * + * @see #modifyClear(int) + * @see #modifyClear() + * @see #setModifier(int) + */ + public static void modify(int mod) { + ThemeManager._THEME_MODIFIER |= mod & ThemeManager._THEME_MASK; + } + + /** + * Clear all modifiers + * + * @see #modify(int) + * @see #modifyClear(int) + * @see #setModifier(int) + */ + public static void modifyClear() { + ThemeManager._THEME_MODIFIER = 0; + } + + /** + * Clear modifier + * + * @see #modify(int) + * @see #modifyClear() + * @see #setModifier(int) + */ + public static void modifyClear(int mod) { + mod &= ThemeManager._THEME_MASK; + ThemeManager._THEME_MODIFIER |= mod; + ThemeManager._THEME_MODIFIER ^= mod; + } + + /** + * Like {@link #modify(int)}, but applying only on default theme. + * + * @see #modifyDefaultThemeClear(int) + * @see #setDefaultTheme(int) + * @see #getDefaultTheme() + */ + public static void modifyDefaultTheme(int mod) { + ThemeManager._DEFAULT_THEME |= mod & ThemeManager._THEME_MASK; + } + + /** + * Clear modifier from default theme + * + * @see #modifyDefaultTheme(int) + * @see #setDefaultTheme(int) + * @see #getDefaultTheme() + */ + public static void modifyDefaultThemeClear(int mod) { + mod &= ThemeManager._THEME_MASK; + ThemeManager._DEFAULT_THEME |= mod; + ThemeManager._DEFAULT_THEME ^= mod; + } + + private static int prepareFlags(int i, boolean applyModifier) { + if (i >= _START_RESOURCES_ID) { + return i; + } + if (applyModifier && ThemeManager._THEME_MODIFIER > 0) { + i |= ThemeManager._THEME_MODIFIER; + } + return i & ThemeManager._THEME_MASK; + } + + public static void registerThemeSetter(ThemeSetter themeSetter) { + if (themeSetter == null) { + return; + } + if (sThemeSetters == null) { + sThemeSetters = new ArrayList(); + } + if (!sThemeSetters.contains(themeSetter)) { + sThemeSetters.add(themeSetter); + themeSetter.setupThemes(); + } + } + + /** + * Remove theme from the intent extras. + */ + public static void removeTheme(Activity activity) { + activity.getIntent().removeExtra(_THEME_TAG); + } + + /** + * Reset all themes to default + */ + public static void reset() { + if ((_DEFAULT_THEME & COLOR_SCHEME_MASK) == 0) { + _DEFAULT_THEME = DARK; + } + _THEME_MODIFIER = 0; + _THEMES_MAP.clear(); + + map(DARK, + Holo_Theme); + map(DARK | FULLSCREEN, + Holo_Theme_Fullscreen); + map(DARK | NO_ACTION_BAR, + Holo_Theme_NoActionBar); + map(DARK | NO_ACTION_BAR | FULLSCREEN, + Holo_Theme_NoActionBar_Fullscreen); + map(DARK | DIALOG, + Holo_Theme_Dialog); + map(DARK | DIALOG_WHEN_LARGE, + Holo_Theme_DialogWhenLarge); + map(DARK | DIALOG_WHEN_LARGE | NO_ACTION_BAR, + Holo_Theme_DialogWhenLarge_NoActionBar); + + map(DARK | WALLPAPER, + Holo_Theme_Wallpaper); + map(DARK | NO_ACTION_BAR | WALLPAPER, + Holo_Theme_NoActionBar_Wallpaper); + map(DARK | FULLSCREEN | WALLPAPER, + Holo_Theme_Fullscreen_Wallpaper); + map(DARK | NO_ACTION_BAR | FULLSCREEN | WALLPAPER, + Holo_Theme_NoActionBar_Fullscreen_Wallpaper); + + map(LIGHT, + Holo_Theme_Light); + map(LIGHT | FULLSCREEN, + Holo_Theme_Light_Fullscreen); + map(LIGHT | NO_ACTION_BAR, + Holo_Theme_Light_NoActionBar); + map(LIGHT | NO_ACTION_BAR | FULLSCREEN, + Holo_Theme_Light_NoActionBar_Fullscreen); + map(LIGHT | DIALOG, + Holo_Theme_Dialog_Light); + map(LIGHT | DIALOG_WHEN_LARGE, + Holo_Theme_DialogWhenLarge_Light); + map(LIGHT | DIALOG_WHEN_LARGE | NO_ACTION_BAR, + Holo_Theme_DialogWhenLarge_Light_NoActionBar); + + map(LIGHT | WALLPAPER, + Holo_Theme_Light_Wallpaper); + map(LIGHT | NO_ACTION_BAR | WALLPAPER, + Holo_Theme_Light_NoActionBar_Wallpaper); + map(LIGHT | FULLSCREEN | WALLPAPER, + Holo_Theme_Light_Fullscreen_Wallpaper); + map(LIGHT | NO_ACTION_BAR | FULLSCREEN | WALLPAPER, + Holo_Theme_Light_NoActionBar_Fullscreen_Wallpaper); + + map(MIXED, + Holo_Theme_Light_DarkActionBar); + map(MIXED | FULLSCREEN, + Holo_Theme_Light_DarkActionBar_Fullscreen); + map(MIXED | NO_ACTION_BAR, + Holo_Theme_Light_DarkActionBar_NoActionBar); + map(MIXED | NO_ACTION_BAR | FULLSCREEN, + Holo_Theme_Light_DarkActionBar_NoActionBar_Fullscreen); + map(MIXED | DIALOG, + Holo_Theme_Dialog_Light); + map(MIXED | DIALOG_WHEN_LARGE, + Holo_Theme_DialogWhenLarge_Light_DarkActionBar); + map(MIXED | DIALOG_WHEN_LARGE | NO_ACTION_BAR, + Holo_Theme_DialogWhenLarge_Light_DarkActionBar_NoActionBar); + + map(MIXED | WALLPAPER, + Holo_Theme_Light_DarkActionBar_Wallpaper); + map(MIXED | NO_ACTION_BAR | WALLPAPER, + Holo_Theme_Light_DarkActionBar_NoActionBar_Wallpaper); + map(MIXED | FULLSCREEN | WALLPAPER, + Holo_Theme_Light_DarkActionBar_Fullscreen_Wallpaper); + map(MIXED | NO_ACTION_BAR | FULLSCREEN | WALLPAPER, + Holo_Theme_Light_DarkActionBar_NoActionBar_Fullscreen_Wallpaper); + + if (sThemeSetters != null) { + for (ThemeSetter setter : sThemeSetters) { + setter.setupThemes(); + } + } + } + + /** + * Simply restart activity + * + * @param activity Activity + */ + public static void restart(Activity activity) { + restart(activity, true); + } + + public static void restart(Activity activity, boolean force) { + restartWithTheme(activity, -1, force); + } + + /** + * Check activity on dark theme and restart it if theme incorrect. + * + * @see #restartWithTheme(Activity, int) + */ + public static void restartWithDarkTheme(Activity activity) { + ThemeManager.restartWithTheme(activity, ThemeManager.DARK); + } + + /** + * Check activity on light theme and restart it if theme incorrect. + * + * @see #restartWithTheme(Activity, int) + */ + public static void restartWithLightTheme(Activity activity) { + ThemeManager.restartWithTheme(activity, ThemeManager.LIGHT); + } + + /** + * Check activity on light with dark action bar theme and restart it if + * theme incorrect. + * + * @see #restartWithTheme(Activity, int) + */ + public static void restartWithMixedTheme(Activity activity) { + ThemeManager.restartWithTheme(activity, ThemeManager.MIXED); + } + + /** + * Check activity on theme and restart it if theme incorrect. + * + * @param activity Activity + * @param theme Theme flags for check + */ + public static void restartWithTheme(Activity activity, int theme) { + ThemeManager.restartWithTheme(activity, theme, false); + } + + /** + * Like {@link #restartWithTheme(Activity, int)}, but if third arg is true - + * restart activity regardless theme. + * + * @param activity Activity + * @param theme Theme flags for check + * @param force Force restart activity + */ + public static void restartWithTheme(Activity activity, int theme, boolean force) { + if (theme < _START_RESOURCES_ID && theme > 0) { + if (ThemeManager._THEME_MODIFIER > 0) { + theme |= ThemeManager._THEME_MODIFIER; + } + theme &= ThemeManager._THEME_MASK; + } + if (force || ThemeManager.getTheme(activity) != theme) { + Intent intent = new Intent(activity.getIntent()); + intent.setClass(activity, activity.getClass()); + intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); + if (theme > 0) { + intent.putExtra(ThemeManager._THEME_TAG, theme); + } + intent.putExtra(KEY_INSTANCE_STATE, activity.saveInstanceState()); + intent.putExtra(KEY_CREATED_BY_THEME_MANAGER, true); + if (activity.isRestricted()) { + Application app = Application.getLastInstance(); + if (app != null && !app.isRestricted()) { + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + app.superStartActivity(intent, -1, null); + } + } else { + if (!activity.isFinishing()) { + activity.finish(); + activity.overridePendingTransition(0, 0); + } + if (activity instanceof SuperStartActivity) { + ((SuperStartActivity) activity).superStartActivity(intent, + -1, null); + } else { + activity.startActivity(intent); + } + } + } + } + + /** + * Set default theme. May be theme resource instead flags, but it not + * recommend. + * + * @param theme Theme + * @see #modifyDefaultTheme(int) + * @see #modifyDefaultThemeClear(int) + * @see #getDefaultTheme() + */ + public static void setDefaultTheme(int theme) { + ThemeManager._DEFAULT_THEME = theme; + if (theme < _START_RESOURCES_ID) { + ThemeManager._DEFAULT_THEME &= ThemeManager._THEME_MASK; + } + } + + /** + * Set theme modifiers. See {@link #modify(int)} + * + * @param mod Modififers + * @see #modify(int) + */ + public static void setModifier(int mod) { + ThemeManager._THEME_MODIFIER = mod & ThemeManager._THEME_MASK; + } + + /** + * Set {@link ThemeGetter} instance for getting theme resources. + * + * @param themeGetter ThemeGetter + */ + public static void setThemeGetter(ThemeGetter themeGetter) { + ThemeManager._THEME_GETTER = themeGetter; + } + + /** + * Only for system use + */ + public static void startActivity(Context context, Intent intent) { + ThemeManager.startActivity(context, intent, -1); + } + + /** + * Only for system use + */ + public static void startActivity(Context context, Intent intent, + Bundle options) { + ThemeManager.startActivity(context, intent, -1, options); + } + + /** + * Only for system use + */ + public static void startActivity(Context context, Intent intent, + int requestCode) { + ThemeManager.startActivity(context, intent, requestCode, null); + } + + /** + * Only for system use + */ + @SuppressLint("NewApi") + public static void startActivity(Context context, Intent intent, + int requestCode, Bundle options) { + final Activity activity = context instanceof Activity ? (Activity) context + : null; + if (activity != null) { + ThemeManager.cloneTheme(activity.getIntent(), intent, true); + } + if (context instanceof SuperStartActivity) { + ((SuperStartActivity) context).superStartActivity(intent, + requestCode, options); + } else { + if (activity != null) { + if (VERSION.SDK_INT >= 16) { + activity.startActivityForResult(intent, requestCode, + options); + } else { + activity.startActivityForResult(intent, requestCode); + } + } else { + if (VERSION.SDK_INT >= 16) { + context.startActivity(intent, options); + } else { + context.startActivity(intent); + } + } + } + } + + public static void unregisterThemeSetter(ThemeSetter themeSetter) { + if (sThemeSetters == null || themeSetter == null) { + return; + } + sThemeSetters.remove(themeSetter); + } + + private ThemeManager() { + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/addon/AddonSherlock.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/addon/AddonSherlock.java new file mode 100644 index 0000000000..08adda05a4 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/addon/AddonSherlock.java @@ -0,0 +1,239 @@ + +package org.holoeverywhere.addon; + +import org.holoeverywhere.addon.IAddon.Addon; +import org.holoeverywhere.app.Activity; +import org.holoeverywhere.app.Application; + +import android.content.Context; +import android.content.res.Configuration; +import android.os.Bundle; +import android.view.KeyEvent; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup.LayoutParams; +import android.view.Window; + +import com.actionbarsherlock.ActionBarSherlock; +import com.actionbarsherlock.app.ActionBar; +import com.actionbarsherlock.internal.ActionBarSherlockCompat; +import com.actionbarsherlock.internal.ActionBarSherlockNative; +import com.actionbarsherlock.view.ActionMode; +import com.actionbarsherlock.view.ActionMode.Callback; +import com.actionbarsherlock.view.MenuInflater; + +@Addon(inhert = true, weight = 50) +public class AddonSherlock extends IAddon { + public static class AddonSherlockA extends IAddonActivity { + private boolean mIgnoreNativeCreate = false; + private boolean mIgnoreNativePrepare = false; + private boolean mIgnoreNativeSelected = false; + private ActionBarSherlock mSherlock; + + @Override + public boolean closeOptionsMenu() { + return getSherlock().dispatchCloseOptionsMenu(); + } + + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + return getSherlock().dispatchKeyEvent(event); + } + + public ActionBar getActionBar() { + return getSherlock().getActionBar(); + } + + public MenuInflater getMenuInflater() { + return getSherlock().getMenuInflater(); + } + + protected ActionBarSherlock getSherlock() { + if (mSherlock == null) { + mSherlock = ActionBarSherlock.wrap(get(), ActionBarSherlock.FLAG_DELEGATE); + } + return mSherlock; + } + + @Override + public boolean installDecorView(View view, LayoutParams params) { + getSherlock().setContentView(view, params); + return true; + } + + @Override + public boolean invalidateOptionsMenu() { + getSherlock().dispatchInvalidateOptionsMenu(); + return true; + } + + @Override + public void onConfigurationChanged(Configuration oldConfig, Configuration newConfig) { + getSherlock().dispatchConfigurationChanged(newConfig); + } + + @Override + public boolean onCreatePanelMenu(int featureId, Menu menu) { + if (featureId == Window.FEATURE_OPTIONS_PANEL + && !mIgnoreNativeCreate) { + mIgnoreNativeCreate = true; + boolean result = getSherlock().dispatchCreateOptionsMenu(menu); + mIgnoreNativeCreate = false; + return result; + } + return false; + } + + @Override + public void onDestroy() { + getSherlock().dispatchDestroy(); + } + + @Override + public boolean onMenuItemSelected(int featureId, MenuItem item) { + if (featureId == Window.FEATURE_OPTIONS_PANEL + && !mIgnoreNativeSelected) { + mIgnoreNativeSelected = true; + boolean result = getSherlock().dispatchOptionsItemSelected(item); + mIgnoreNativeSelected = false; + return result; + } + return false; + } + + @Override + public boolean onMenuOpened(int featureId, Menu menu) { + return getSherlock().dispatchMenuOpened(featureId, menu); + } + + @Override + public void onPanelClosed(int featureId, Menu menu) { + getSherlock().dispatchPanelClosed(featureId, menu); + } + + @Override + public void onPause() { + getSherlock().dispatchPause(); + } + + @Override + public void onPostCreate(Bundle savedInstanceState) { + getSherlock().dispatchPostCreate(savedInstanceState); + } + + @Override + public void onPostResume() { + getSherlock().dispatchPostResume(); + } + + @Override + public boolean onPreparePanel(int featureId, View view, Menu menu) { + if (featureId == Window.FEATURE_OPTIONS_PANEL + && !mIgnoreNativePrepare) { + mIgnoreNativePrepare = true; + boolean result = getSherlock().dispatchPrepareOptionsMenu(menu); + mIgnoreNativePrepare = false; + return result; + } + return false; + } + + @Override + public void onStop() { + getSherlock().dispatchStop(); + } + + @Override + public void onTitleChanged(CharSequence title, int color) { + getSherlock().dispatchTitleChanged(title, color); + } + + @Override + public boolean openOptionsMenu() { + return getSherlock().dispatchOpenOptionsMenu(); + } + + @Override + public boolean requestWindowFeature(int featureId) { + return getSherlock().requestFeature(featureId); + } + + public void setProgress(int progress) { + getSherlock().setProgress(progress); + } + + public void setProgressBarIndeterminate(boolean indeterminate) { + getSherlock().setProgressBarIndeterminate(indeterminate); + } + + public void setProgressBarIndeterminateVisibility(boolean visible) { + getSherlock().setProgressBarIndeterminateVisibility(visible); + } + + public void setProgressBarVisibility(boolean visible) { + getSherlock().setProgressBarVisibility(visible); + } + + public void setSecondaryProgress(int secondaryProgress) { + getSherlock().setSecondaryProgress(secondaryProgress); + } + + public void setUiOptions(int uiOptions) { + getSherlock().setUiOptions(uiOptions); + } + + public void setUiOptions(int uiOptions, int mask) { + getSherlock().setUiOptions(uiOptions, mask); + } + + public ActionMode startActionMode(Callback callback) { + return getSherlock().startActionMode(callback); + } + } + + public static class AddonSherlockApplication extends IAddonApplication { + @Override + public void onCreate() { + ActionBarSherlock.unregisterImplementation(ActionBarSherlockNative.class); + ActionBarSherlock.unregisterImplementation(ActionBarSherlockCompat.class); + ActionBarSherlock.registerImplementation(HoloActionBarSherlockNative.class); + ActionBarSherlock.registerImplementation(HoloActionBarSherlockCompat.class); + } + } + + @ActionBarSherlock.Implementation(api = 7) + private static class HoloActionBarSherlockCompat extends ActionBarSherlockCompat { + public HoloActionBarSherlockCompat(android.app.Activity activity, int flags) { + super(activity, flags); + } + + @Override + protected Context getThemedContext() { + if (mActivity instanceof Activity) { + return ((Activity) mActivity).getSupportActionBarContext(); + } + return super.getThemedContext(); + } + } + + @ActionBarSherlock.Implementation(api = 14) + private static class HoloActionBarSherlockNative extends ActionBarSherlockNative { + public HoloActionBarSherlockNative(android.app.Activity activity, int flags) { + super(activity, flags); + } + + @Override + protected Context getThemedContext() { + if (mActivity instanceof Activity) { + return ((Activity) mActivity).getSupportActionBarContext(); + } + return super.getThemedContext(); + } + } + + public AddonSherlock() { + register(Activity.class, AddonSherlockA.class); + register(Application.class, AddonSherlockApplication.class); + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/addon/IAddon.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/addon/IAddon.java new file mode 100644 index 0000000000..fa7383ae8d --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/addon/IAddon.java @@ -0,0 +1,99 @@ + +package org.holoeverywhere.addon; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.util.HashMap; +import java.util.Map; + +import org.holoeverywhere.HoloEverywhere; +import org.holoeverywhere.util.WeaklyMap; + +public abstract class IAddon { + @Retention(RetentionPolicy.RUNTIME) + @Target(ElementType.TYPE) + public @interface Addon { + public boolean inhert() default false; + + public int weight() default -1; + } + + private static final Map, IAddon> sAddonsMap = new HashMap, IAddon>(); + + @SuppressWarnings("unchecked") + public static T addon(Class clazz) { + try { + T t = (T) sAddonsMap.get(clazz); + if (t == null) { + t = clazz.newInstance(); + sAddonsMap.put(clazz, t); + } + return t; + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public static T addon(String classname) { + Class clazz = makeAddonClass(classname); + return addon(clazz); + } + + @SuppressWarnings("unchecked") + public static Class makeAddonClass(String classname) { + if (classname.contains(".")) { + try { + return (Class) Class.forName(classname); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } else { + return makeAddonClass(HoloEverywhere.PACKAGE + ".addon.Addon" + classname); + } + } + + public static , V> Z obtain(Class clazz, V object) { + return addon(clazz).obtain(object); + } + + public static , V> Z obtain(String classname, V object) { + return addon(classname).obtain(object); + } + + private final Map mStatesMap = new WeaklyMap(); + private final Map, Class>> mTypesMap = new HashMap, Class>>(); + + @SuppressWarnings("unchecked") + public > V obtain(T object) { + try { + V addon = (V) mStatesMap.get(object); + if (addon != null) { + return addon; + } + Class clazz = object.getClass(); + while (!mTypesMap.containsKey(clazz)) { + if (clazz == Object.class) { + // Nothing was found + return null; + } + clazz = clazz.getSuperclass(); + } + addon = ((Class) mTypesMap.get(clazz)).newInstance(); + addon.attach(object, this); + mStatesMap.put(object, addon); + return addon; + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public void register(Class clazz, Class> addonClazz) { + mTypesMap.put(clazz, addonClazz); + } + + public void unregister(Class clazz) { + mTypesMap.remove(clazz); + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/addon/IAddonActivity.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/addon/IAddonActivity.java new file mode 100644 index 0000000000..ce841809d4 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/addon/IAddonActivity.java @@ -0,0 +1,124 @@ + +package org.holoeverywhere.addon; + +import org.holoeverywhere.app.Activity; + +import android.content.Intent; +import android.content.res.Configuration; +import android.os.Bundle; +import android.view.KeyEvent; +import android.view.View; +import android.view.ViewGroup.LayoutParams; + +public abstract class IAddonActivity extends IAddonBase { + public boolean closeOptionsMenu() { + return false; + } + + public boolean dispatchKeyEvent(KeyEvent event) { + return false; + } + + public View findViewById(int id) { + return null; + } + + public boolean installDecorView(View view, LayoutParams params) { + return false; + } + + public boolean invalidateOptionsMenu() { + return false; + } + + public void onActivityResult(int requestCode, int resultCode, Intent data) { + } + + public void onConfigurationChanged(Configuration oldConfig, Configuration newConfig) { + + } + + public void onContentChanged() { + + } + + public void onCreate(Bundle savedInstanceState) { + + } + + public boolean onCreatePanelMenu(int featureId, android.view.Menu menu) { + return false; + } + + public void onDestroy() { + + } + + public boolean onMenuItemSelected(int featureId, android.view.MenuItem item) { + return false; + } + + public boolean onMenuOpened(int featureId, android.view.Menu menu) { + return false; + } + + public void onNewIntent(Intent intent) { + + } + + public void onPanelClosed(int featureId, android.view.Menu menu) { + + } + + public void onPause() { + + } + + public void onPostCreate(Bundle savedInstanceState) { + + } + + public void onPostResume() { + + } + + public void onPreCreate(Bundle savedInstanceState) { + + } + + public boolean onPreparePanel(int featureId, View view, android.view.Menu menu) { + return false; + } + + public void onRestart() { + + } + + public void onResume() { + + } + + public void onSaveInstanceState(Bundle outState) { + + } + + public void onStart() { + + } + + public void onStop() { + + } + + public void onTitleChanged(CharSequence title, int color) { + + } + + public boolean openOptionsMenu() { + return false; + } + + public boolean requestWindowFeature(int featureId) { + return false; + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/addon/IAddonApplication.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/addon/IAddonApplication.java new file mode 100644 index 0000000000..ecefc3d63a --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/addon/IAddonApplication.java @@ -0,0 +1,14 @@ + +package org.holoeverywhere.addon; + +import org.holoeverywhere.app.Application; + +public abstract class IAddonApplication extends IAddonBase { + public void onCreate() { + + } + + public void onPreCreate() { + + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/addon/IAddonAttacher.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/addon/IAddonAttacher.java new file mode 100644 index 0000000000..57c9ed2a3a --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/addon/IAddonAttacher.java @@ -0,0 +1,66 @@ + +package org.holoeverywhere.addon; + +import java.util.Collection; + +public interface IAddonAttacher> { + public abstract static class AddonCallback { + public boolean mStopped = false; + + public boolean action(V addon) { + justAction(addon); + return false; + } + + public void justAction(V addon) { + + } + + public void justPost() { + + } + + public boolean performAction(V addon) { + if (action(addon)) { + stop(); + return true; + } + return false; + } + + public boolean post() { + justPost(); + return false; + } + + public void pre() { + + } + + public void stop() { + mStopped = true; + } + } + + public static class AttachException extends RuntimeException { + private static final long serialVersionUID = 4007240742116340485L; + + public AttachException(Object object, Class clazz) { + super("Couldn't attach addon " + clazz.getName() + " after init of object " + object); + } + } + + public T addon(Class clazz); + + public void addon(Collection> classes); + + public T addon(String classname); + + public boolean isAddonAttached(Class clazz); + + public void lockAttaching(); + + public Collection> obtainAddonsList(); + + public boolean performAddonAction(AddonCallback callback); +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/addon/IAddonBase.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/addon/IAddonBase.java new file mode 100644 index 0000000000..7daa1168b9 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/addon/IAddonBase.java @@ -0,0 +1,27 @@ + +package org.holoeverywhere.addon; + +public abstract class IAddonBase { + private T mObject; + private IAddon mParent; + + public final void attach(T object, IAddon parent) { + if (mObject != null || object == null || mParent != null || parent == null) { + throw new IllegalStateException(); + } + mParent = parent; + onAttach(mObject = object); + } + + public T get() { + return mObject; + } + + public final IAddon getParent() { + return mParent; + } + + protected void onAttach(T object) { + + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/addon/IAddonBasicAttacher.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/addon/IAddonBasicAttacher.java new file mode 100644 index 0000000000..fae4291ed1 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/addon/IAddonBasicAttacher.java @@ -0,0 +1,131 @@ + +package org.holoeverywhere.addon; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; + +import org.holoeverywhere.addon.IAddon.Addon; + +public final class IAddonBasicAttacher, Z> implements IAddonAttacher { + private final class AddonComparator implements Comparator { + @Override + public int compare(V lhs, V rhs) { + final int i1 = getWeight(lhs.getParent()); + final int i2 = getWeight(rhs.getParent()); + return i1 > i2 ? 1 : i1 < i2 ? -1 : 0; + } + + private int getWeight(IAddon addon) { + if (addon.getClass().isAnnotationPresent(Addon.class)) { + return addon.getClass().getAnnotation(Addon.class).weight(); + } + return -1; + } + } + + private final Map, V> mAddons = new HashMap, V>(); + private final Set mAddonsList = new TreeSet(new AddonComparator()); + private boolean mLockAttaching = false; + private Z mObject; + + public IAddonBasicAttacher(Z object) { + mObject = object; + } + + @Override + @SuppressWarnings("unchecked") + public T addon(Class clazz) { + T addon = (T) mAddons.get(clazz); + if (addon == null) { + if (mLockAttaching) { + throw new AttachException(mObject, clazz); + } + addon = IAddon.obtain(clazz, mObject); + if (addon == null) { + return null; + } + mAddons.put(clazz, addon); + mAddonsList.add(addon); + } + return addon; + } + + @Override + public void addon(Collection> classes) { + if (classes == null) { + return; + } + for (Class clazz : classes) { + addon(clazz); + } + } + + @Override + public T addon(String classname) { + return addon(IAddon.makeAddonClass(classname)); + } + + public void inhert(Collection> sourceClasses) { + if (sourceClasses == null || sourceClasses.size() == 0) { + return; + } + List> classes = new ArrayList>(); + for (Class clazz : sourceClasses) { + if (!clazz.isAnnotationPresent(Addon.class)) { + continue; + } + Addon addon = clazz.getAnnotation(Addon.class); + if (addon.inhert()) { + classes.add(clazz); + } + } + addon(classes); + } + + public void inhert(IAddonAttacher attacher) { + inhert(attacher == null ? null : attacher.obtainAddonsList()); + } + + @Override + public boolean isAddonAttached(Class clazz) { + return mAddons.containsKey(clazz); + } + + @Override + public void lockAttaching() { + mLockAttaching = true; + } + + @Override + public Collection> obtainAddonsList() { + return new ArrayList>(mAddons.keySet()); + } + + @Override + public boolean performAddonAction(AddonCallback callback) { + if (mAddons.size() == 0) { + return false; + } + callback.pre(); + boolean result = false; + for (V addon : mAddonsList) { + result = callback.performAction(addon); + if (callback.mStopped) { + return result; + } + } + return callback.post(); + } + + public void reset() { + mAddons.clear(); + mAddonsList.clear(); + mLockAttaching = false; + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/addon/IAddonFragment.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/addon/IAddonFragment.java new file mode 100644 index 0000000000..e18fe69ab0 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/addon/IAddonFragment.java @@ -0,0 +1,21 @@ + +package org.holoeverywhere.addon; + +import org.holoeverywhere.app.Fragment; + +import android.os.Bundle; +import android.view.View; + +public abstract class IAddonFragment extends IAddonBase { + public void onCreate(Bundle savedInstanceState) { + + } + + public void onPreCreate(Bundle savedInstanceState) { + + } + + public void onViewCreated(View view, Bundle savedInstanceState) { + + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/addon/IAddonThemes.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/addon/IAddonThemes.java new file mode 100644 index 0000000000..c6cd4d3603 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/addon/IAddonThemes.java @@ -0,0 +1,136 @@ + +package org.holoeverywhere.addon; + +import java.util.Map; + +import org.holoeverywhere.ThemeManager; +import org.holoeverywhere.ThemeManager.ThemeSetter; +import org.holoeverywhere.app.ContextThemeWrapperPlus; +import org.holoeverywhere.util.WeaklyMap; + +import android.content.Context; + +public class IAddonThemes implements ThemeSetter { + private static final class AddonThemeWrapper extends ContextThemeWrapperPlus { + public AddonThemeWrapper(Context base, int themeres) { + super(base, themeres); + } + } + + public interface ThemeResolver { + public int resolveThemeForContext(Context context, int invalidTheme); + } + + private Map mContexts; + private int mDarkTheme = -1; + private final ThemeResolver mDefaultThemeResolver = new ThemeResolver() { + @Override + public int resolveThemeForContext(Context context, int invalidTheme) { + int theme = ThemeManager.getThemeType(context); + if (theme == ThemeManager.INVALID) { + theme = invalidTheme & ThemeManager.getThemeMask(); + if (theme == 0) { + theme = ThemeManager.DARK; + } + } + theme |= mThemeFlag; + return ThemeManager.getThemeResource(theme, false); + } + }; + + private int mLightTheme = -1; + + private int mMixedTheme = -1; + + private final int mThemeFlag; + + public IAddonThemes() { + mThemeFlag = ThemeManager.makeNewFlag(); + ThemeManager.registerThemeSetter(this); + } + + public Context context(Context context) { + return context(context, ThemeManager.DARK); + } + + public Context context(Context context, int invalidTheme) { + return context(context, invalidTheme, mDefaultThemeResolver); + } + + public Context context(Context context, int invalidTheme, ThemeResolver themeResolver) { + if (context instanceof AddonThemeWrapper) { + return context; + } + AddonThemeWrapper wrapper = null; + if (mContexts != null) { + wrapper = mContexts.get(context); + } + if (wrapper == null) { + final int theme = themeResolver.resolveThemeForContext(context, invalidTheme); + if (theme <= 0) { + return null; + } + wrapper = new AddonThemeWrapper(context, theme); + if (mContexts == null) { + mContexts = new WeaklyMap(); + } + mContexts.put(context, wrapper); + } + return wrapper; + } + + public int getDarkTheme() { + return mDarkTheme; + } + + public int getLightTheme() { + return mLightTheme; + } + + public int getMixedTheme() { + return mMixedTheme; + } + + public int getThemeFlag() { + return mThemeFlag; + } + + public void map(int darkTheme, int lightTheme, int mixedTheme) { + mDarkTheme = darkTheme; + mLightTheme = lightTheme; + mMixedTheme = mixedTheme; + setupThemes(); + } + + public void setDarkTheme(int darkTheme) { + mDarkTheme = darkTheme; + setupThemes(); + } + + public void setLightTheme(int lightTheme) { + mLightTheme = lightTheme; + setupThemes(); + } + + public void setMixedTheme(int mixedTheme) { + mMixedTheme = mixedTheme; + setupThemes(); + } + + @Override + public void setupThemes() { + ThemeManager.map(mThemeFlag | ThemeManager.DARK, mDarkTheme); + ThemeManager.map(mThemeFlag | ThemeManager.LIGHT, mLightTheme); + ThemeManager.map(mThemeFlag | ThemeManager.MIXED, mMixedTheme); + } + + public Context unwrap(Context context) { + if (context == null) { + return null; + } + while (context instanceof AddonThemeWrapper) { + context = ((AddonThemeWrapper) context).getBaseContext(); + } + return context; + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/Activity.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/Activity.java new file mode 100644 index 0000000000..f07923a6b8 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/Activity.java @@ -0,0 +1,596 @@ + +package org.holoeverywhere.app; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.util.Collection; + +import org.holoeverywhere.FontLoader; +import org.holoeverywhere.ThemeManager; +import org.holoeverywhere.addon.AddonSherlock; +import org.holoeverywhere.addon.AddonSherlock.AddonSherlockA; +import org.holoeverywhere.addon.IAddon; +import org.holoeverywhere.addon.IAddonActivity; +import org.holoeverywhere.addon.IAddonBasicAttacher; + +import android.content.Intent; +import android.content.res.Configuration; +import android.os.Build.VERSION; +import android.os.Build.VERSION_CODES; +import android.os.Bundle; +import android.support.v4.app._HoloActivity; +import android.view.KeyEvent; +import android.view.View; + +import com.actionbarsherlock.app.ActionBar; +import com.actionbarsherlock.internal.view.menu.MenuItemWrapper; +import com.actionbarsherlock.internal.view.menu.MenuWrapper; +import com.actionbarsherlock.view.ActionMode; +import com.actionbarsherlock.view.Menu; +import com.actionbarsherlock.view.MenuItem; + +public abstract class Activity extends _HoloActivity { + @Retention(RetentionPolicy.RUNTIME) + @Target(ElementType.TYPE) + @Inherited + public static @interface Addons { + public String[] value(); + } + + private final class FindViewAction extends AddonCallback { + private int mId; + private View mView; + + @Override + public boolean action(IAddonActivity addon) { + return (mView = addon.findViewById(mId)) != null; + } + + @Override + public boolean post() { + return (mView = Activity.super.findViewById(mId)) != null; + } + } + + private final class KeyEventAction extends AddonCallback { + private KeyEvent mEvent; + + @Override + public boolean action(IAddonActivity addon) { + return addon.dispatchKeyEvent(mEvent); + } + + @Override + public boolean post() { + return Activity.super.dispatchKeyEvent(mEvent); + } + } + + public static final String ADDON_ROBOGUICE = "Roboguice"; + public static final String ADDON_SHERLOCK = "Sherlock"; + public static final String ADDON_SLIDER = "Slider"; + /** + * Use {@link #ADDON_SLIDER} instead + */ + @Deprecated + public static final String ADDON_SLIDING_MENU = ADDON_SLIDER; + private final IAddonBasicAttacher mAttacher = + new IAddonBasicAttacher(this); + private boolean mCreatedByThemeManager = false; + private final FindViewAction mFindViewAction = new FindViewAction(); + private boolean mFirstRun = true; + private final KeyEventAction mKeyEventAction = new KeyEventAction(); + + @Override + public T addon(Class clazz) { + return mAttacher.addon(clazz); + } + + @Override + public void addon(Collection> classes) { + mAttacher.addon(classes); + } + + @Override + public T addon(String classname) { + return mAttacher.addon(classname); + } + + public AddonSherlockA addonSherlock() { + return addon(AddonSherlock.class); + } + + @Override + public void closeOptionsMenu() { + performAddonAction(new AddonCallback() { + @Override + public boolean action(IAddonActivity addon) { + return addon.closeOptionsMenu(); + } + + @Override + public void justPost() { + Activity.super.closeOptionsMenu(); + } + }); + } + + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + mKeyEventAction.mEvent = event; + return performAddonAction(mKeyEventAction); + } + + @Override + public View findViewById(int id) { + mFindViewAction.mView = null; + mFindViewAction.mId = id; + performAddonAction(mFindViewAction); + return mFindViewAction.mView; + } + + @Override + public ActionBar getSupportActionBar() { + return addonSherlock().getActionBar(); + } + + public Bundle instanceState(Bundle savedInstanceState) { + if (savedInstanceState != null) { + return savedInstanceState; + } + Bundle extras = getIntent().getExtras(); + if (extras != null && extras.containsKey(ThemeManager.KEY_INSTANCE_STATE)) { + return extras.getBundle(ThemeManager.KEY_INSTANCE_STATE); + } + return null; + } + + @Override + public boolean isAddonAttached(Class clazz) { + return mAttacher.isAddonAttached(clazz); + } + + public boolean isCreatedByThemeManager() { + return mCreatedByThemeManager; + } + + public boolean isFirstRun() { + return mFirstRun; + } + + @Override + public void lockAttaching() { + mAttacher.lockAttaching(); + } + + @Override + public Collection> obtainAddonsList() { + return mAttacher.obtainAddonsList(); + } + + @Override + public void onActionModeFinished(ActionMode mode) { + } + + @Override + public void onActionModeStarted(ActionMode mode) { + } + + @Override + protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) { + super.onActivityResult(requestCode, resultCode, data); + performAddonAction(new AddonCallback() { + @Override + public void justAction(IAddonActivity addon) { + addon.onActivityResult(requestCode, resultCode, data); + } + }); + } + + @Override + public void onConfigurationChanged(final Configuration newConfig) { + final Configuration oldConfig = getResources().getConfiguration(); + super.onConfigurationChanged(newConfig); + performAddonAction(new AddonCallback() { + @Override + public void justAction(IAddonActivity addon) { + addon.onConfigurationChanged(oldConfig, newConfig); + } + }); + } + + @Override + public void onContentChanged() { + super.onContentChanged(); + performAddonAction(new AddonCallback() { + @Override + public void justAction(IAddonActivity addon) { + addon.onContentChanged(); + } + }); + FontLoader.apply(getWindow().getDecorView()); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + mFirstRun = savedInstanceState == null; + final Bundle state = instanceState(savedInstanceState); + mCreatedByThemeManager = getIntent().getBooleanExtra( + ThemeManager.KEY_CREATED_BY_THEME_MANAGER, false); + if (mCreatedByThemeManager) { + mFirstRun = false; + } + mAttacher.inhert(getSupportApplication()); + forceInit(state); + performAddonAction(new AddonCallback() { + @Override + public void justAction(IAddonActivity addon) { + addon.onPreCreate(state); + } + }); + super.onCreate(state); + performAddonAction(new AddonCallback() { + @Override + public void justAction(IAddonActivity addon) { + addon.onCreate(state); + } + }); + } + + @Override + public final boolean onCreateOptionsMenu(android.view.Menu menu) { + return onCreateOptionsMenu(new MenuWrapper(menu)); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + return true; + } + + @Override + public boolean onCreatePanelMenu(final int featureId, final android.view.Menu menu) { + return performAddonAction(new AddonCallback() { + @Override + public boolean action(IAddonActivity addon) { + return addon.onCreatePanelMenu(featureId, menu); + } + + @Override + public boolean post() { + return Activity.super.onCreatePanelMenu(featureId, menu); + } + }); + } + + @Override + protected void onDestroy() { + performAddonAction(new AddonCallback() { + @Override + public void justAction(IAddonActivity addon) { + addon.onDestroy(); + } + }); + super.onDestroy(); + } + + @Override + public boolean onMenuItemSelected(final int featureId, + final android.view.MenuItem item) { + return performAddonAction(new AddonCallback() { + @Override + public boolean action(IAddonActivity addon) { + return addon.onMenuItemSelected(featureId, item); + } + + @Override + public boolean post() { + return Activity.super.onMenuItemSelected(featureId, item); + } + }); + } + + @Override + public boolean onMenuOpened(final int featureId, final android.view.Menu menu) { + return performAddonAction(new AddonCallback() { + @Override + public boolean action(IAddonActivity addon) { + return addon.onMenuOpened(featureId, menu); + } + + @Override + public boolean post() { + return Activity.super.onMenuOpened(featureId, menu); + } + }); + } + + @Override + protected void onNewIntent(final Intent intent) { + super.onNewIntent(intent); + performAddonAction(new AddonCallback() { + @Override + public void justAction(IAddonActivity addon) { + addon.onNewIntent(intent); + } + }); + } + + @Override + public final boolean onOptionsItemSelected(android.view.MenuItem item) { + return onOptionsItemSelected(new MenuItemWrapper(item)); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + return false; + } + + @Override + public void onPanelClosed(final int featureId, final android.view.Menu menu) { + performAddonAction(new AddonCallback() { + @Override + public void justAction(IAddonActivity addon) { + addon.onPanelClosed(featureId, menu); + } + }); + super.onPanelClosed(featureId, menu); + } + + @Override + protected void onPause() { + performAddonAction(new AddonCallback() { + @Override + public void justAction(IAddonActivity addon) { + addon.onPause(); + } + }); + super.onPause(); + } + + @Override + protected void onPostCreate(Bundle sSavedInstanceState) { + final Bundle savedInstanceState = instanceState(sSavedInstanceState); + performAddonAction(new AddonCallback() { + @Override + public void justAction(IAddonActivity addon) { + addon.onPostCreate(savedInstanceState); + } + }); + super.onPostCreate(savedInstanceState); + } + + @Override + protected void onPostInit(Holo config, Bundle savedInstanceState) { + lockAttaching(); + } + + @Override + protected void onPostResume() { + super.onPostResume(); + performAddonAction(new AddonCallback() { + @Override + public void justAction(IAddonActivity addon) { + addon.onPostResume(); + } + }); + } + + @Override + protected void onPreInit(Holo config, Bundle savedInstanceState) { + if (getClass().isAnnotationPresent(Addons.class)) { + for (String addon : getClass().getAnnotation(Addons.class).value()) { + if (ADDON_SHERLOCK.equals(addon)) { + config.requireSherlock = true; + } else if (ADDON_SLIDER.equals(addon)) { + config.requireSlider = true; + } else if (ADDON_ROBOGUICE.equals(addon)) { + config.requireRoboguice = true; + } else { + addon(addon); + } + } + } + } + + @Override + public final boolean onPrepareOptionsMenu(android.view.Menu menu) { + return onPrepareOptionsMenu(new MenuWrapper(menu)); + } + + @Override + public boolean onPrepareOptionsMenu(Menu menu) { + return true; + } + + @Override + public boolean onPreparePanel(final int featureId, final View view, + final android.view.Menu menu) { + return performAddonAction(new AddonCallback() { + @Override + public boolean action(IAddonActivity addon) { + return addon.onPreparePanel(featureId, view, menu); + } + + @Override + public boolean post() { + return Activity.super.onPreparePanel(featureId, view, menu); + } + }); + } + + @Override + protected void onRestart() { + performAddonAction(new AddonCallback() { + @Override + public void justAction(IAddonActivity addon) { + addon.onRestart(); + } + }); + super.onRestart(); + } + + @Override + protected void onResume() { + super.onResume(); + performAddonAction(new AddonCallback() { + @Override + public void justAction(IAddonActivity addon) { + addon.onResume(); + } + }); + } + + @Override + protected void onSaveInstanceState(final Bundle outState) { + super.onSaveInstanceState(outState); + performAddonAction(new AddonCallback() { + @Override + public void justAction(IAddonActivity addon) { + addon.onSaveInstanceState(outState); + } + }); + } + + @Override + protected void onStart() { + super.onStart(); + performAddonAction(new AddonCallback() { + @Override + public void justAction(IAddonActivity addon) { + addon.onStart(); + } + }); + } + + @Override + protected void onStop() { + performAddonAction(new AddonCallback() { + @Override + public void justAction(IAddonActivity addon) { + addon.onStop(); + } + }); + super.onStop(); + } + + @Override + protected void onTitleChanged(final CharSequence title, final int color) { + performAddonAction(new AddonCallback() { + @Override + public void justAction(IAddonActivity addon) { + addon.onTitleChanged(title, color); + } + }); + super.onTitleChanged(title, color); + } + + @Override + public void openOptionsMenu() { + performAddonAction(new AddonCallback() { + @Override + public boolean action(IAddonActivity addon) { + return addon.openOptionsMenu(); + } + + @Override + public void justPost() { + Activity.super.openOptionsMenu(); + } + }); + } + + @Override + public boolean performAddonAction(AddonCallback callback) { + return mAttacher.performAddonAction(callback); + } + + @Override + public void requestWindowFeature(long featureIdLong) { + if (!super.isInited()) { + super.requestWindowFeature(featureIdLong); + return; + } + final int featureId = (int) featureIdLong; + performAddonAction(new AddonCallback() { + @Override + public boolean action(IAddonActivity addon) { + return addon.requestWindowFeature(featureId); + } + + @Override + public void justPost() { + requestWindowFeature(featureId); + } + }); + } + + public Bundle saveInstanceState() { + Bundle bundle = new Bundle(getClassLoader()); + onSaveInstanceState(bundle); + return bundle.size() > 0 ? bundle : null; + } + + @Override + public void setSupportProgress(int progress) { + addonSherlock().setProgress(progress); + } + + @Override + public void setSupportProgressBarIndeterminate(boolean indeterminate) { + addonSherlock().setProgressBarIndeterminate(indeterminate); + } + + @Override + public void setSupportProgressBarIndeterminateVisibility(boolean visible) { + addonSherlock().setProgressBarIndeterminateVisibility(visible); + } + + @Override + public void setSupportProgressBarVisibility(boolean visible) { + addonSherlock().setProgressBarVisibility(visible); + } + + @Override + public void setSupportSecondaryProgress(int secondaryProgress) { + addonSherlock().setSecondaryProgress(secondaryProgress); + } + + public void setUiOptions(int uiOptions) { + if (isAddonAttached(AddonSherlock.class)) { + addonSherlock().setUiOptions(uiOptions); + } else if (VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH) { + getWindow().setUiOptions(uiOptions); + } + } + + public void setUiOptions(int uiOptions, int mask) { + if (isAddonAttached(AddonSherlock.class)) { + addonSherlock().setUiOptions(uiOptions, mask); + } else if (VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH) { + getWindow().setUiOptions(uiOptions, mask); + } + } + + @Override + public ActionMode startActionMode(ActionMode.Callback callback) { + return addonSherlock().startActionMode(callback); + } + + @Override + public void supportInvalidateOptionsMenu() { + performAddonAction(new AddonCallback() { + @Override + public boolean action(IAddonActivity addon) { + return addon.invalidateOptionsMenu(); + } + + @Override + public void justPost() { + Activity.super.supportInvalidateOptionsMenu(); + } + }); + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/AlertActivity.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/AlertActivity.java new file mode 100644 index 0000000000..58dc288b90 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/AlertActivity.java @@ -0,0 +1,53 @@ + +package org.holoeverywhere.app; + +import org.holoeverywhere.internal.AlertController; + +import android.content.DialogInterface; +import android.os.Bundle; +import android.view.KeyEvent; + +public abstract class AlertActivity extends Activity implements DialogInterface { + protected AlertController mAlert; + protected AlertController.AlertParams mAlertParams; + + @Override + public void cancel() { + finish(); + } + + @Override + public void dismiss() { + if (!isFinishing()) { + finish(); + } + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mAlert = new AlertController(this, this, getWindow()); + mAlertParams = new AlertController.AlertParams(this); + } + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (mAlert.onKeyDown(keyCode, event)) { + return true; + } + return super.onKeyDown(keyCode, event); + } + + @Override + public boolean onKeyUp(int keyCode, KeyEvent event) { + if (mAlert.onKeyUp(keyCode, event)) { + return true; + } + return super.onKeyUp(keyCode, event); + } + + protected void setupAlert() { + mAlertParams.apply(mAlert); + mAlert.installContent(); + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/AlertDialog.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/AlertDialog.java new file mode 100644 index 0000000000..679a4a93a8 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/AlertDialog.java @@ -0,0 +1,514 @@ + +package org.holoeverywhere.app; + +import org.holoeverywhere.R; +import org.holoeverywhere.internal.AlertController; +import org.holoeverywhere.internal.AlertController.AlertDecorViewInstaller; +import org.holoeverywhere.internal.AlertController.AlertParams; +import org.holoeverywhere.internal.AlertController.AlertParams.OnPrepareListViewListener; +import org.holoeverywhere.widget.Button; +import org.holoeverywhere.widget.ListView; + +import android.content.Context; +import android.content.DialogInterface; +import android.database.Cursor; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.os.Message; +import android.util.TypedValue; +import android.view.KeyEvent; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ListAdapter; + +public class AlertDialog extends Dialog implements DialogInterface, + AlertDecorViewInstaller { + public static class Builder { + private static final Class[] CONSTRUCTOR_SIGNATURE = { + Context.class, int.class + }; + private Class mDialogClass; + private final AlertController.AlertParams mParams; + + public Builder(Context context) { + this(context, 0); + } + + public Builder(Context context, int theme) { + mParams = new AlertParams(context, theme); + } + + public Builder addButtonBehavior(int buttonBehavior) { + mParams.mButtonBehavior |= buttonBehavior; + return this; + } + + public AlertDialog create() { + AlertDialog dialog = null; + if (mDialogClass != null) { + try { + dialog = mDialogClass.getConstructor(CONSTRUCTOR_SIGNATURE).newInstance( + mParams.mContext, mParams.mTheme); + } catch (Exception e) { + e.printStackTrace(); + } + } + if (dialog == null) { + dialog = new AlertDialog(mParams.mContext, mParams.mTheme); + } + mParams.apply(dialog.mAlert); + dialog.setCancelable(mParams.mCancelable); + if (mParams.mCancelable) { + dialog.setCanceledOnTouchOutside(true); + } + if (mParams.mOnCancelListener != null) { + dialog.setOnCancelListener(mParams.mOnCancelListener); + } + if (mParams.mOnKeyListener != null) { + dialog.setOnKeyListener(mParams.mOnKeyListener); + } + if (mParams.mOnDismissListener != null) { + dialog.setOnDismissListener(mParams.mOnDismissListener); + } + return dialog; + } + + public Context getContext() { + return mParams.mContext; + } + + public Builder removeButtonBehavior(int buttonBehavior) { + mParams.mButtonBehavior |= buttonBehavior; + mParams.mButtonBehavior ^= buttonBehavior; + return this; + } + + public Builder setAdapter(final ListAdapter adapter, + final OnClickListener listener) { + mParams.mAdapter = adapter; + mParams.mOnClickListener = listener; + return this; + } + + public Builder setAlertDialogClass(Class clazz) { + mDialogClass = clazz; + return this; + } + + public Builder setBlockDismiss(boolean blockDismiss) { + return setButtonBehavior(blockDismiss ? 0 : DISMISS_ON_ALL); + } + + public Builder setButtonBehavior(int buttonBehavior) { + mParams.mButtonBehavior = buttonBehavior; + return this; + } + + public Builder setCancelable(boolean cancelable) { + mParams.mCancelable = cancelable; + return this; + } + + public Builder setCheckedItem(int checkedItem) { + mParams.mCheckedItem = checkedItem; + return this; + } + + public Builder setCursor(final Cursor cursor, + final OnClickListener listener, String labelColumn) { + mParams.mCursor = cursor; + mParams.mLabelColumn = labelColumn; + mParams.mOnClickListener = listener; + return this; + } + + public Builder setCustomTitle(View customTitleView) { + mParams.mCustomTitleView = customTitleView; + return this; + } + + public Builder setIcon(Drawable icon) { + mParams.mIcon = icon; + return this; + } + + public Builder setIcon(int iconId) { + mParams.mIconId = iconId; + return this; + } + + public Builder setIconAttribute(int attrId) { + TypedValue out = new TypedValue(); + mParams.mContext.getTheme().resolveAttribute(attrId, out, true); + mParams.mIconId = out.resourceId; + return this; + } + + public Builder setInverseBackgroundForced(boolean useInverseBackground) { + mParams.mForceInverseBackground = useInverseBackground; + return this; + } + + public Builder setItems(CharSequence[] items, + final OnClickListener listener) { + mParams.mItems = items; + mParams.mOnClickListener = listener; + return this; + } + + public Builder setItems(int itemsId, final OnClickListener listener) { + mParams.mItems = mParams.mContext.getResources().getTextArray(itemsId); + mParams.mOnClickListener = listener; + return this; + } + + public Builder setMessage(CharSequence message) { + mParams.mMessage = message; + return this; + } + + public Builder setMessage(int messageId) { + mParams.mMessage = mParams.mContext.getText(messageId); + return this; + } + + public Builder setMultiChoiceItems(CharSequence[] items, + boolean[] checkedItems, + final OnMultiChoiceClickListener listener) { + mParams.mItems = items; + mParams.mOnCheckboxClickListener = listener; + mParams.mCheckedItems = checkedItems; + mParams.mIsMultiChoice = true; + return this; + } + + public Builder setMultiChoiceItems(Cursor cursor, + String isCheckedColumn, String labelColumn, + final OnMultiChoiceClickListener listener) { + mParams.mCursor = cursor; + mParams.mOnCheckboxClickListener = listener; + mParams.mIsCheckedColumn = isCheckedColumn; + mParams.mLabelColumn = labelColumn; + mParams.mIsMultiChoice = true; + return this; + } + + public Builder setMultiChoiceItems(int itemsId, boolean[] checkedItems, + final OnMultiChoiceClickListener listener) { + mParams.mItems = mParams.mContext.getResources().getTextArray(itemsId); + mParams.mOnCheckboxClickListener = listener; + mParams.mCheckedItems = checkedItems; + mParams.mIsMultiChoice = true; + return this; + } + + public Builder setNegativeButton(CharSequence text, + final OnClickListener listener) { + mParams.mNegativeButtonText = text; + mParams.mNegativeButtonListener = listener; + return this; + } + + public Builder setNegativeButton(int textId, + final OnClickListener listener) { + mParams.mNegativeButtonText = mParams.mContext.getText(textId); + mParams.mNegativeButtonListener = listener; + return this; + } + + public Builder setNeutralButton(CharSequence text, + final OnClickListener listener) { + mParams.mNeutralButtonText = text; + mParams.mNeutralButtonListener = listener; + return this; + } + + public Builder setNeutralButton(int textId, + final OnClickListener listener) { + mParams.mNeutralButtonText = mParams.mContext.getText(textId); + mParams.mNeutralButtonListener = listener; + return this; + } + + public Builder setOnCancelListener(OnCancelListener onCancelListener) { + mParams.mOnCancelListener = onCancelListener; + return this; + } + + public Builder setOnDismissListener(OnDismissListener onDismissListener) { + mParams.mOnDismissListener = onDismissListener; + return this; + } + + public Builder setOnItemSelectedListener( + final AdapterView.OnItemSelectedListener listener) { + mParams.mOnItemSelectedListener = listener; + return this; + } + + public Builder setOnKeyListener(OnKeyListener onKeyListener) { + mParams.mOnKeyListener = onKeyListener; + return this; + } + + public Builder setOnPrepareListViewListener( + OnPrepareListViewListener listener) { + mParams.mOnPrepareListViewListener = listener; + return this; + } + + public Builder setPositiveButton(CharSequence text, + final OnClickListener listener) { + mParams.mPositiveButtonText = text; + mParams.mPositiveButtonListener = listener; + return this; + } + + public Builder setPositiveButton(int textId, + final OnClickListener listener) { + mParams.mPositiveButtonText = mParams.mContext.getText(textId); + mParams.mPositiveButtonListener = listener; + return this; + } + + public Builder setSingleChoiceItems(CharSequence[] items, + int checkedItem, final OnClickListener listener) { + mParams.mItems = items; + mParams.mOnClickListener = listener; + mParams.mCheckedItem = checkedItem; + mParams.mIsSingleChoice = true; + return this; + } + + public Builder setSingleChoiceItems(Cursor cursor, int checkedItem, + String labelColumn, final OnClickListener listener) { + mParams.mCursor = cursor; + mParams.mOnClickListener = listener; + mParams.mCheckedItem = checkedItem; + mParams.mLabelColumn = labelColumn; + mParams.mIsSingleChoice = true; + return this; + } + + public Builder setSingleChoiceItems(int itemsId, int checkedItem, + final OnClickListener listener) { + mParams.mItems = mParams.mContext.getResources().getTextArray(itemsId); + mParams.mOnClickListener = listener; + mParams.mCheckedItem = checkedItem; + mParams.mIsSingleChoice = true; + return this; + } + + public Builder setSingleChoiceItems(ListAdapter adapter, + int checkedItem, final OnClickListener listener) { + mParams.mAdapter = adapter; + mParams.mOnClickListener = listener; + mParams.mCheckedItem = checkedItem; + mParams.mIsSingleChoice = true; + return this; + } + + public Builder setTheme(int theme) { + mParams.mTheme = theme; + return this; + } + + public Builder setTitle(CharSequence title) { + mParams.mTitle = title; + return this; + } + + public Builder setTitle(int titleId) { + mParams.mTitle = mParams.mContext.getText(titleId); + return this; + } + + public Builder setView(View view) { + mParams.mView = view; + mParams.mViewSpacingSpecified = false; + return this; + } + + public Builder setView(View view, int viewSpacingLeft, + int viewSpacingTop, int viewSpacingRight, int viewSpacingBottom) { + mParams.mView = view; + mParams.mViewSpacingSpecified = true; + mParams.mViewSpacingLeft = viewSpacingLeft; + mParams.mViewSpacingTop = viewSpacingTop; + mParams.mViewSpacingRight = viewSpacingRight; + mParams.mViewSpacingBottom = viewSpacingBottom; + return this; + } + + public AlertDialog show() { + AlertDialog dialog = create(); + dialog.show(); + return dialog; + } + } + + public static final int DISMISS_ON_ALL = 7; // DO_NEG | DO_NEU | DO_POS + public static final int DISMISS_ON_NEGATIVE = 1 << 0; // -BUTTON_NEGATIVE; + public static final int DISMISS_ON_NEUTRAL = 1 << 1; // -BUTTON_NEUTRAL; + public static final int DISMISS_ON_POSITIVE = 1 << 2; // -BUTTON_POSITIVE; + + public static final int THEME_HOLO_DARK = 1; + public static final int THEME_HOLO_LIGHT = 2; + + static int resolveDialogTheme(Context context, int resid) { + if (resid == AlertDialog.THEME_HOLO_DARK) { + return R.style.Holo_Theme_Dialog_Alert; + } else if (resid == AlertDialog.THEME_HOLO_LIGHT) { + return R.style.Holo_Theme_Dialog_Alert_Light; + } else if (resid >= 0x01000000) { + return resid; + } else { + TypedValue outValue = new TypedValue(); + context.getTheme().resolveAttribute(R.attr.alertDialogTheme, outValue, true); + return outValue.resourceId; + } + } + + private final AlertController mAlert; + + protected AlertDialog(Context context) { + this(context, true, null, 0); + } + + protected AlertDialog(Context context, boolean cancelable, + OnCancelListener cancelListener) { + this(context, cancelable, cancelListener, 0); + } + + protected AlertDialog(Context context, boolean cancelable, + OnCancelListener cancelListener, int theme) { + super(context, AlertDialog.resolveDialogTheme(context, theme)); + setCancelable(cancelable); + setOnCancelListener(cancelListener); + mAlert = new AlertController(getContext(), this, getWindow(), this); + } + + protected AlertDialog(Context context, int theme) { + this(context, true, null, theme); + } + + public Button getButton(int whichButton) { + return mAlert.getButton(whichButton); + } + + public ListView getListView() { + return mAlert.getListView(); + } + + @Override + public void installDecorView(Context context, int layout) { + setContentView(layout); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mAlert.installContent(); + } + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (mAlert.onKeyDown(keyCode, event)) { + return true; + } + return super.onKeyDown(keyCode, event); + } + + @Override + public boolean onKeyUp(int keyCode, KeyEvent event) { + if (mAlert.onKeyUp(keyCode, event)) { + return true; + } + return super.onKeyUp(keyCode, event); + } + + @Deprecated + public void setButton(CharSequence text, Message msg) { + setButton(DialogInterface.BUTTON_POSITIVE, text, msg); + } + + @Deprecated + public void setButton(CharSequence text, final OnClickListener listener) { + setButton(DialogInterface.BUTTON_POSITIVE, text, listener); + } + + public void setButton(int whichButton, CharSequence text, Message msg) { + mAlert.setButton(whichButton, text, null, msg); + } + + public void setButton(int whichButton, CharSequence text, + OnClickListener listener) { + mAlert.setButton(whichButton, text, listener, null); + } + + @Deprecated + public void setButton2(CharSequence text, Message msg) { + setButton(DialogInterface.BUTTON_NEGATIVE, text, msg); + } + + @Deprecated + public void setButton2(CharSequence text, final OnClickListener listener) { + setButton(DialogInterface.BUTTON_NEGATIVE, text, listener); + } + + @Deprecated + public void setButton3(CharSequence text, Message msg) { + setButton(DialogInterface.BUTTON_NEUTRAL, text, msg); + } + + @Deprecated + public void setButton3(CharSequence text, final OnClickListener listener) { + setButton(DialogInterface.BUTTON_NEUTRAL, text, listener); + } + + public void setButtonBehavior(int buttonBehavior) { + mAlert.setButtonBehavior(buttonBehavior); + } + + public void setCustomTitle(View customTitleView) { + mAlert.setCustomTitle(customTitleView); + } + + public void setIcon(Drawable icon) { + mAlert.setIcon(icon); + } + + public void setIcon(int resId) { + mAlert.setIcon(resId); + } + + public void setIconAttribute(int attrId) { + TypedValue out = new TypedValue(); + getContext().getTheme().resolveAttribute(attrId, out, true); + mAlert.setIcon(out.resourceId); + } + + public void setInverseBackgroundForced(boolean forceInverseBackground) { + mAlert.setInverseBackgroundForced(forceInverseBackground); + } + + public void setMessage(CharSequence message) { + mAlert.setMessage(message); + } + + @Override + public void setTitle(CharSequence title) { + super.setTitle(title); + mAlert.setTitle(title); + } + + public void setView(View view) { + mAlert.setView(view); + } + + public void setView(View view, int viewSpacingLeft, int viewSpacingTop, + int viewSpacingRight, int viewSpacingBottom) { + mAlert.setView(view, viewSpacingLeft, viewSpacingTop, viewSpacingRight, + viewSpacingBottom); + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/AlertDialogFragment.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/AlertDialogFragment.java new file mode 100644 index 0000000000..47454cbf6c --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/AlertDialogFragment.java @@ -0,0 +1,21 @@ + +package org.holoeverywhere.app; + +import android.os.Bundle; + +public class AlertDialogFragment extends DialogFragment { + public AlertDialogFragment() { + setDialogType(DialogType.AlertDialog); + } + + protected void onCreateDialog(AlertDialog.Builder builder) { + + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + AlertDialog.Builder builder = new AlertDialog.Builder(getSupportActivity()); + onCreateDialog(builder); + return builder.create(); + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/Application.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/Application.java new file mode 100644 index 0000000000..2ef3aab126 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/Application.java @@ -0,0 +1,198 @@ + +package org.holoeverywhere.app; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import org.holoeverywhere.HoloEverywhere; +import org.holoeverywhere.HoloEverywhere.PreferenceImpl; +import org.holoeverywhere.IHolo; +import org.holoeverywhere.LayoutInflater; +import org.holoeverywhere.LayoutInflater.LayoutInflaterCreator; +import org.holoeverywhere.SystemServiceManager; +import org.holoeverywhere.SystemServiceManager.SuperSystemService; +import org.holoeverywhere.ThemeManager; +import org.holoeverywhere.ThemeManager.SuperStartActivity; +import org.holoeverywhere.addon.AddonSherlock; +import org.holoeverywhere.addon.IAddon; +import org.holoeverywhere.addon.IAddonApplication; +import org.holoeverywhere.addon.IAddonAttacher; +import org.holoeverywhere.addon.IAddonBasicAttacher; +import org.holoeverywhere.preference.PreferenceManagerHelper; +import org.holoeverywhere.preference.SharedPreferences; + +import android.annotation.SuppressLint; +import android.content.Intent; +import android.os.Build.VERSION; +import android.os.Bundle; + +public class Application extends android.app.Application implements + IHolo, SuperStartActivity, SuperSystemService, IAddonAttacher { + private static List> sInitialAddons; + private static Application sLastInstance; + static { + SystemServiceManager.register(LayoutInflaterCreator.class); + addInitialAddon(AddonSherlock.class); + } + + public static void addInitialAddon(Class clazz) { + if (sInitialAddons == null) { + sInitialAddons = new ArrayList>(); + } + sInitialAddons.add(clazz); + } + + public static Application getLastInstance() { + return Application.sLastInstance; + } + + public static void init() { + } + + private final IAddonBasicAttacher mAttacher = + new IAddonBasicAttacher(this); + + public Application() { + Application.sLastInstance = this; + } + + @Override + public T addon(Class clazz) { + return mAttacher.addon(clazz); + } + + @Override + public void addon(Collection> classes) { + mAttacher.addon(classes); + } + + @Override + public T addon(String classname) { + return mAttacher.addon(classname); + } + + @Override + public SharedPreferences getDefaultSharedPreferences() { + return PreferenceManagerHelper.getDefaultSharedPreferences(this); + } + + @Override + public SharedPreferences getDefaultSharedPreferences(PreferenceImpl impl) { + return PreferenceManagerHelper.getDefaultSharedPreferences(this, impl); + } + + @Override + public LayoutInflater getLayoutInflater() { + return LayoutInflater.from(this); + } + + @Override + public SharedPreferences getSharedPreferences(PreferenceImpl impl, String name, int mode) { + return PreferenceManagerHelper.wrap(this, impl, name, mode); + } + + @Override + public SharedPreferences getSharedPreferences(String name, int mode) { + return PreferenceManagerHelper.wrap(this, name, mode); + } + + @Override + public Application getSupportApplication() { + return this; + } + + @Override + public Object getSystemService(String name) { + return SystemServiceManager.getSystemService(this, name); + } + + @Override + public boolean isAddonAttached(Class clazz) { + return mAttacher.isAddonAttached(clazz); + } + + @Override + public void lockAttaching() { + mAttacher.lockAttaching(); + } + + @Override + public Collection> obtainAddonsList() { + return mAttacher.obtainAddonsList(); + } + + @Override + public void onCreate() { + addon(sInitialAddons); + performAddonAction(new AddonCallback() { + @Override + public void justAction(IAddonApplication addon) { + addon.onPreCreate(); + } + }); + lockAttaching(); + super.onCreate(); + performAddonAction(new AddonCallback() { + @Override + public void justAction(IAddonApplication addon) { + addon.onCreate(); + } + }); + } + + @Override + public boolean performAddonAction(AddonCallback callback) { + return mAttacher.performAddonAction(callback); + } + + @Override + @SuppressLint("NewApi") + public void startActivities(Intent[] intents) { + startActivities(intents, null); + } + + @Override + @SuppressLint("NewApi") + public void startActivities(Intent[] intents, Bundle options) { + for (Intent intent : intents) { + startActivity(intent, options); + } + } + + @Override + @SuppressLint("NewApi") + public void startActivity(Intent intent) { + startActivity(intent, null); + } + + @Override + public void startActivity(Intent intent, Bundle options) { + if (HoloEverywhere.ALWAYS_USE_PARENT_THEME) { + ThemeManager.startActivity(this, intent, options); + } else { + superStartActivity(intent, -1, options); + } + } + + public android.content.SharedPreferences superGetSharedPreferences( + String name, int mode) { + return super.getSharedPreferences(name, mode); + } + + @Override + public Object superGetSystemService(String name) { + return super.getSystemService(name); + } + + @Override + @SuppressLint("NewApi") + public void superStartActivity(Intent intent, int requestCode, + Bundle options) { + if (VERSION.SDK_INT >= 16) { + super.startActivity(intent, options); + } else { + super.startActivity(intent); + } + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/ContextThemeWrapperPlus.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/ContextThemeWrapperPlus.java new file mode 100644 index 0000000000..974cab7d60 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/ContextThemeWrapperPlus.java @@ -0,0 +1,24 @@ + +package org.holoeverywhere.app; + +import org.holoeverywhere.SystemServiceManager; +import org.holoeverywhere.SystemServiceManager.SuperSystemService; + +import android.content.Context; +import android.view.ContextThemeWrapper; + +public class ContextThemeWrapperPlus extends ContextThemeWrapper implements SuperSystemService { + public ContextThemeWrapperPlus(Context base, int themeres) { + super(base, themeres); + } + + @Override + public Object getSystemService(String name) { + return SystemServiceManager.getSystemService(this, name); + } + + @Override + public Object superGetSystemService(String name) { + return super.getSystemService(name); + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/DatePickerDialog.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/DatePickerDialog.java new file mode 100644 index 0000000000..f467d0b270 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/DatePickerDialog.java @@ -0,0 +1,125 @@ + +package org.holoeverywhere.app; + +import java.util.Calendar; + +import org.holoeverywhere.LayoutInflater; +import org.holoeverywhere.R; +import org.holoeverywhere.widget.DatePicker; +import org.holoeverywhere.widget.DatePicker.OnDateChangedListener; + +import android.content.Context; +import android.content.DialogInterface; +import android.content.DialogInterface.OnClickListener; +import android.os.Bundle; +import android.text.format.DateUtils; +import android.view.View; + +public class DatePickerDialog extends AlertDialog implements OnClickListener, + OnDateChangedListener { + public interface OnDateSetListener { + void onDateSet(DatePicker view, int year, int monthOfYear, + int dayOfMonth); + } + + private static final String DAY = "day"; + private static final String MONTH = "month"; + private static final String YEAR = "year"; + private final Calendar mCalendar; + private final OnDateSetListener mCallBack; + private final DatePicker mDatePicker; + + private boolean mTitleNeedsUpdate = true; + + public DatePickerDialog(Context context, int theme, + OnDateSetListener callBack, int year, int monthOfYear, + int dayOfMonth) { + super(context, theme); + mCallBack = callBack; + mCalendar = Calendar.getInstance(); + setButton(DialogInterface.BUTTON_POSITIVE, + getContext().getText(R.string.date_time_done), this); + setButton(DialogInterface.BUTTON_NEGATIVE, + getContext().getText(android.R.string.cancel), this); + setIcon(0); + LayoutInflater inflater = LayoutInflater.from(context); + View view = inflater.inflate(R.layout.date_picker_dialog, null); + setView(view); + mDatePicker = (DatePicker) view.findViewById(R.id.datePicker); + mDatePicker.init(year, monthOfYear, dayOfMonth, this); + updateTitle(year, monthOfYear, dayOfMonth); + } + + public DatePickerDialog(Context context, OnDateSetListener callBack, + int year, int monthOfYear, int dayOfMonth) { + this(context, 0, callBack, year, monthOfYear, dayOfMonth); + } + + public DatePicker getDatePicker() { + return mDatePicker; + } + + @Override + public void onClick(DialogInterface dialog, int which) { + if (which == DialogInterface.BUTTON_POSITIVE) { + tryNotifyDateSet(); + } + } + + @Override + public void onDateChanged(DatePicker view, int year, int month, int day) { + mDatePicker.init(year, month, day, this); + updateTitle(year, month, day); + } + + @Override + public void onRestoreInstanceState(Bundle savedInstanceState) { + super.onRestoreInstanceState(savedInstanceState); + int year = savedInstanceState.getInt(DatePickerDialog.YEAR); + int month = savedInstanceState.getInt(DatePickerDialog.MONTH); + int day = savedInstanceState.getInt(DatePickerDialog.DAY); + mDatePicker.init(year, month, day, this); + } + + @Override + public Bundle onSaveInstanceState() { + Bundle state = super.onSaveInstanceState(); + state.putInt(DatePickerDialog.YEAR, mDatePicker.getYear()); + state.putInt(DatePickerDialog.MONTH, mDatePicker.getMonth()); + state.putInt(DatePickerDialog.DAY, mDatePicker.getDayOfMonth()); + return state; + } + + private void tryNotifyDateSet() { + if (mCallBack != null) { + mDatePicker.clearFocus(); + mCallBack.onDateSet(mDatePicker, mDatePicker.getYear(), + mDatePicker.getMonth(), mDatePicker.getDayOfMonth()); + } + } + + public void updateDate(int year, int monthOfYear, int dayOfMonth) { + mDatePicker.updateDate(year, monthOfYear, dayOfMonth); + } + + private void updateTitle(int year, int month, int day) { + if (!mDatePicker.getCalendarViewShown()) { + mCalendar.set(Calendar.YEAR, year); + mCalendar.set(Calendar.MONTH, month); + mCalendar.set(Calendar.DAY_OF_MONTH, day); + String title = DateUtils.formatDateTime(getContext(), + mCalendar.getTimeInMillis(), DateUtils.FORMAT_SHOW_DATE + | DateUtils.FORMAT_SHOW_WEEKDAY + | DateUtils.FORMAT_SHOW_YEAR + | DateUtils.FORMAT_ABBREV_MONTH + | DateUtils.FORMAT_ABBREV_WEEKDAY); + setTitle(title); + mTitleNeedsUpdate = true; + } else { + if (mTitleNeedsUpdate) { + mTitleNeedsUpdate = false; + setTitle(R.string.date_picker_dialog_title); + } + } + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/Dialog.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/Dialog.java new file mode 100644 index 0000000000..34bc1b8c7e --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/Dialog.java @@ -0,0 +1,199 @@ + +package org.holoeverywhere.app; + +import java.util.Map; + +import org.holoeverywhere.HoloEverywhere; +import org.holoeverywhere.LayoutInflater; +import org.holoeverywhere.R; +import org.holoeverywhere.internal.WindowDecorView; +import org.holoeverywhere.util.WeaklyMap; + +import android.content.Context; +import android.util.TypedValue; +import android.view.ContextMenu.ContextMenuInfo; +import android.view.Menu; +import android.view.View; +import android.view.ViewGroup.LayoutParams; + +import com.actionbarsherlock.internal.view.menu.ContextMenuDecorView.ContextMenuListenersProvider; +import com.actionbarsherlock.internal.view.menu.ContextMenuItemWrapper; +import com.actionbarsherlock.internal.view.menu.ContextMenuListener; +import com.actionbarsherlock.internal.view.menu.ContextMenuWrapper; +import com.actionbarsherlock.view.ContextMenu; +import com.actionbarsherlock.view.MenuItem; + +public class Dialog extends android.app.Dialog implements ContextMenuListener, + ContextMenuListenersProvider { + private static final int checkTheme(Context context, int theme) { + if (theme >= 0x01000000) { + return theme; + } + TypedValue value = new TypedValue(); + context.getTheme().resolveAttribute(R.attr.dialogTheme, value, true); + if (value.resourceId > 0) { + return value.resourceId; + } + return R.style.Holo_Theme_Dialog; + } + + private Map mContextMenuListeners; + private WindowDecorView mDecorView; + + public Dialog(Context context) { + this(context, 0); + } + + public Dialog(Context context, boolean cancelable, + OnCancelListener cancelListener) { + this(context); + setCancelable(cancelable); + setOnCancelListener(cancelListener); + } + + public Dialog(Context context, int theme) { + this(context, checkTheme(context, theme), -1); + setCancelable(true); + } + + private Dialog(Context context, int theme, int fallback) { + super(new ContextThemeWrapperPlus(context, theme), theme); + } + + @Override + public void addContentView(View view, LayoutParams params) { + if (requestDecorView(view, params, -1)) { + mDecorView.addView(view, params); + } + } + + @Override + public ContextMenuListener getContextMenuListener(View view) { + if (mContextMenuListeners == null) { + return null; + } + return mContextMenuListeners.get(view); + } + + @Override + public LayoutInflater getLayoutInflater() { + return LayoutInflater.from(getContext()); + } + + @Override + public final boolean onContextItemSelected(android.view.MenuItem item) { + return onContextItemSelected(new ContextMenuItemWrapper(item)); + } + + @Override + public boolean onContextItemSelected(MenuItem item) { + if (item instanceof ContextMenuItemWrapper) { + return super.onContextItemSelected(((ContextMenuItemWrapper) item) + .unwrap()); + } + return false; + } + + @Override + public void onContextMenuClosed(ContextMenu menu) { + if (menu instanceof ContextMenuWrapper) { + super.onContextMenuClosed(((ContextMenuWrapper) menu).unwrap()); + } + } + + @Override + public final void onContextMenuClosed(Menu menu) { + if (menu instanceof android.view.ContextMenu) { + onContextMenuClosed(new ContextMenuWrapper( + (android.view.ContextMenu) menu)); + } else { + super.onContextMenuClosed(menu); + } + } + + @Override + public final void onCreateContextMenu(android.view.ContextMenu menu, + View view, ContextMenuInfo menuInfo) { + onCreateContextMenu(new ContextMenuWrapper(menu), view, menuInfo); + } + + @Override + public void onCreateContextMenu(ContextMenu menu, View view, + ContextMenuInfo menuInfo) { + if (menu instanceof ContextMenuWrapper) { + super.onCreateContextMenu(((ContextMenuWrapper) menu).unwrap(), + view, menuInfo); + } + } + + @Override + public void registerForContextMenu(View view) { + if (HoloEverywhere.WRAP_TO_NATIVE_CONTEXT_MENU) { + super.registerForContextMenu(view); + } else { + registerForContextMenu(view, this); + } + } + + public void registerForContextMenu(View view, ContextMenuListener listener) { + if (mContextMenuListeners == null) { + mContextMenuListeners = new WeaklyMap(); + } + mContextMenuListeners.put(view, listener); + } + + private boolean requestDecorView(View view, LayoutParams params, int layoutRes) { + if (mDecorView != null) { + return true; + } + mDecorView = new WindowDecorView(getContext()); + mDecorView.setId(android.R.id.content); + mDecorView.setProvider(this); + if (view != null) { + mDecorView.addView(view, params); + } else if (layoutRes > 0) { + getLayoutInflater().inflate(layoutRes, mDecorView, true); + } + getWindow().setContentView(mDecorView, new LayoutParams( + LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); + return false; + } + + @Override + public void setCancelable(boolean flag) { + super.setCancelable(flag); + setCanceledOnTouchOutside(flag); + } + + @Override + public void setContentView(int layoutResID) { + if (requestDecorView(null, null, layoutResID)) { + mDecorView.removeAllViewsInLayout(); + getLayoutInflater().inflate(layoutResID, mDecorView, true); + } + } + + @Override + public void setContentView(View view) { + setContentView(view, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); + } + + @Override + public void setContentView(View view, LayoutParams params) { + if (requestDecorView(view, params, -1)) { + mDecorView.removeAllViewsInLayout(); + mDecorView.addView(view, params); + } + } + + @Override + public void unregisterForContextMenu(View view) { + if (HoloEverywhere.WRAP_TO_NATIVE_CONTEXT_MENU) { + super.unregisterForContextMenu(view); + } else { + if (mContextMenuListeners != null) { + mContextMenuListeners.remove(view); + } + } + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/DialogFragment.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/DialogFragment.java new file mode 100644 index 0000000000..a58bfc49e6 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/DialogFragment.java @@ -0,0 +1,406 @@ + +package org.holoeverywhere.app; + +import org.holoeverywhere.LayoutInflater; + +import android.content.DialogInterface; +import android.os.Bundle; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentTransaction; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; + +public class DialogFragment extends Fragment implements + DialogInterface.OnCancelListener, DialogInterface.OnDismissListener { + public static final class DialogTransaction { + public String dialogTag; + public FragmentManager fragmentManager; + public int transactionId; + } + + public static enum DialogType { + AlertDialog, Dialog + } + + private static final String SAVED_BACK_STACK_ID = "android:backStackId"; + private static final String SAVED_CANCELABLE = "android:cancelable"; + private static final String SAVED_DIALOG_STATE_TAG = "android:savedDialogState"; + private static final String SAVED_SHOWS_DIALOG = "android:showsDialog"; + private static final String SAVED_STYLE = "android:style"; + private static final String SAVED_THEME = "android:theme"; + public static final int STYLE_NO_FRAME = 2; + public static final int STYLE_NO_INPUT = 3; + public static final int STYLE_NO_TITLE = 1; + public static final int STYLE_NORMAL = 0; + + public static final T findInstance(Activity activity, Class clazz) { + return findInstance(activity, clazz, false); + } + + public static final T findInstance(Activity activity, + Class clazz, boolean makeIfNeed) { + if (activity == null || clazz == null) { + throw new IllegalArgumentException("Activity of DialogFragment class is null"); + } + return findInstance(activity.getSupportFragmentManager(), clazz, makeIfNeed); + } + + @SuppressWarnings("unchecked") + public static final T findInstance(FragmentManager fm, + Class clazz, boolean makeIfNeed) { + if (fm == null || clazz == null) { + throw new IllegalArgumentException("FragmentManager of DialogFragment class is null"); + } + T fragment; + final String tag = makeTag(clazz); + try { + fragment = (T) fm.findFragmentByTag(tag); + if (fragment == null && makeIfNeed) { + fragment = Fragment.instantiate(clazz); + } + } catch (Exception e) { + throw new RuntimeException("Error of finding DialogFragment instance", e); + } + return fragment; + } + + private static final String makeTag(Class clazz) { + return clazz.getName() + "@" + clazz.hashCode(); + } + + int mBackStackId = -1; + boolean mCancelable = true; + Dialog mDialog; + boolean mDismissed = true; + boolean mShownByMe; + boolean mShowsDialog = true; + int mStyle = STYLE_NORMAL; + int mTheme = 0; + private CharSequence mTitle; + boolean mViewDestroyed; + private DialogType type = DialogType.Dialog; + + public void dismiss() { + dismissInternal(false); + } + + public void dismissAllowingStateLoss() { + dismissInternal(true); + } + + void dismissInternal(boolean allowStateLoss) { + if (mDismissed) { + return; + } + mDismissed = true; + mShownByMe = false; + if (mDialog != null) { + mDialog.dismiss(); + mDialog = null; + } + mViewDestroyed = true; + if (mBackStackId >= 0) { + getFragmentManager().popBackStack(mBackStackId, + FragmentManager.POP_BACK_STACK_INCLUSIVE); + mBackStackId = -1; + } else { + FragmentTransaction ft = getFragmentManager().beginTransaction(); + ft.remove(this); + if (allowStateLoss) { + ft.commitAllowingStateLoss(); + } else { + ft.commit(); + } + } + } + + public Dialog getDialog() { + return mDialog; + } + + public DialogType getDialogType() { + return type; + } + + @Override + @Deprecated + public LayoutInflater getLayoutInflater(Bundle savedInstanceState) { + if (!mShowsDialog) { + return super.getLayoutInflater(savedInstanceState); + } + mDialog = onCreateDialog(savedInstanceState); + if (mTitle != null) { + mDialog.setTitle(mTitle); + mTitle = null; + } + switch (mStyle) { + case STYLE_NO_INPUT: + mDialog.getWindow().addFlags( + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE + | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); + case STYLE_NO_FRAME: + case STYLE_NO_TITLE: + mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); + } + if (mDialog != null) { + return LayoutInflater.from(mDialog.getContext()); + } + return LayoutInflater.from(getActivity()); + } + + public boolean getShowsDialog() { + return mShowsDialog; + } + + public int getTheme() { + return mTheme; + } + + public boolean isCancelable() { + return mCancelable; + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + if (!mShowsDialog) { + return; + } + View view = getView(); + if (view != null) { + if (view.getParent() != null) { + throw new IllegalStateException( + "DialogFragment can not be attached to a container view"); + } + if (mDialog instanceof AlertDialog) { + ((AlertDialog) mDialog).setView(view); + } else { + mDialog.setContentView(view); + } + } + mDialog.setOwnerActivity(getActivity()); + mDialog.setCancelable(mCancelable); + mDialog.setOnCancelListener(this); + mDialog.setOnDismissListener(this); + if (savedInstanceState != null) { + Bundle dialogState = savedInstanceState + .getBundle(SAVED_DIALOG_STATE_TAG); + if (dialogState != null) { + mDialog.onRestoreInstanceState(dialogState); + } + } + } + + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + if (!mShownByMe) { + mDismissed = false; + } + } + + @Override + public void onCancel(DialogInterface dialog) { + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mShowsDialog = getContainerId() == 0; + if (savedInstanceState != null) { + mStyle = savedInstanceState.getInt(SAVED_STYLE, STYLE_NORMAL); + mTheme = savedInstanceState.getInt(SAVED_THEME, 0); + mCancelable = savedInstanceState.getBoolean(SAVED_CANCELABLE, true); + mShowsDialog = savedInstanceState.getBoolean(SAVED_SHOWS_DIALOG, + mShowsDialog); + mBackStackId = savedInstanceState.getInt(SAVED_BACK_STACK_ID, -1); + } + } + + public Dialog onCreateDialog(Bundle savedInstanceState) { + switch (type) { + case AlertDialog: + return new AlertDialog(getActivity(), getTheme()); + case Dialog: + default: + return new Dialog(getActivity(), getTheme()); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (mDialog != null) { + mViewDestroyed = true; + mDialog.dismiss(); + mDialog = null; + } + } + + @Override + public void onDetach() { + super.onDetach(); + if (!mShownByMe && !mDismissed) { + mDismissed = true; + } + } + + @Override + public void onDismiss(DialogInterface dialog) { + if (!mViewDestroyed) { + dismissInternal(true); + } + } + + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + if (mDialog != null) { + Bundle dialogState = mDialog.onSaveInstanceState(); + if (dialogState != null) { + outState.putBundle(SAVED_DIALOG_STATE_TAG, dialogState); + } + } + if (mStyle != STYLE_NORMAL) { + outState.putInt(SAVED_STYLE, mStyle); + } + if (mTheme != 0) { + outState.putInt(SAVED_THEME, mTheme); + } + if (!mCancelable) { + outState.putBoolean(SAVED_CANCELABLE, mCancelable); + } + if (!mShowsDialog) { + outState.putBoolean(SAVED_SHOWS_DIALOG, mShowsDialog); + } + if (mBackStackId != -1) { + outState.putInt(SAVED_BACK_STACK_ID, mBackStackId); + } + } + + @Override + public void onStart() { + super.onStart(); + if (mDialog != null) { + mViewDestroyed = false; + mDialog.show(); + } + } + + @Override + public void onStop() { + super.onStop(); + if (mDialog != null) { + mDialog.hide(); + } + } + + public void setCancelable(boolean cancelable) { + mCancelable = cancelable; + if (mDialog != null) { + mDialog.setCancelable(cancelable); + } + } + + public void setDialogType(DialogType type) { + this.type = type; + } + + public void setShowsDialog(boolean showsDialog) { + mShowsDialog = showsDialog; + } + + public void setStyle(int style, int theme) { + mStyle = style; + if (mStyle == STYLE_NO_FRAME || mStyle == STYLE_NO_INPUT) { + mTheme = android.R.style.Theme_Panel; + } + if (theme != 0) { + mTheme = theme; + } + } + + public void setTitle(CharSequence title) { + if (mDialog != null) { + mDialog.setTitle(title); + } else { + mTitle = title; + } + } + + public void setTitle(int resId) { + setTitle(getText(resId)); + } + + public DialogTransaction show() { + return show(getSupportFragmentManager()); + } + + public DialogTransaction show(Activity activity) { + return show(activity == null ? null : activity + .getSupportFragmentManager()); + } + + public DialogTransaction show(FragmentManager fm) { + return show(fm, fm == null ? null : fm.beginTransaction()); + } + + public DialogTransaction show(FragmentManager fm, FragmentTransaction ft) { + if (ft == null) { + if (fm == null) { + Activity activity = getSupportActivity(); + if (activity == null) { + throw new RuntimeException( + "DialogFragment don't have any reference to Context or FragmentManager"); + } + fm = activity.getSupportFragmentManager(); + } + ft = fm.beginTransaction(); + } + if (!mDismissed) { + dismiss(); + } + DialogTransaction dialogTransaction = new DialogTransaction(); + dialogTransaction.fragmentManager = fm; + dialogTransaction.dialogTag = makeTag(getClass()); + dialogTransaction.transactionId = show(ft, dialogTransaction.dialogTag); + return dialogTransaction; + } + + /** + * @deprecate This method was deprecated because there were problems at + * 2.1-2.3 on restore instance state when + * tag == null. Use {@link #show(FragmentManager)} + * instead. + * @see
    DialogFragment#show + * deprecated + */ + @Deprecated + public int show(FragmentManager manager, String tag) { + return show(manager.beginTransaction(), tag); + } + + public DialogTransaction show(FragmentTransaction ft) { + return show(null, ft); + } + + /** + * @deprecate This method was deprecated because there were problems at + * 2.1-2.3 on restore instance state when + * tag == null. Use + * {@link #show(FragmentTransaction)} instead. + * @see DialogFragment#show + * deprecated + */ + @Deprecated + public int show(FragmentTransaction transaction, String tag) { + mDismissed = false; + mShownByMe = true; + transaction.add(this, tag); + mViewDestroyed = false; + return mBackStackId = transaction.commit(); + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/ExpandableListActivity.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/ExpandableListActivity.java new file mode 100644 index 0000000000..ed88b31b4d --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/ExpandableListActivity.java @@ -0,0 +1,104 @@ + +package org.holoeverywhere.app; + +import org.holoeverywhere.R; +import org.holoeverywhere.widget.ExpandableListView; + +import android.os.Bundle; +import android.view.View; +import android.view.View.OnCreateContextMenuListener; +import android.widget.ExpandableListAdapter; + +public abstract class ExpandableListActivity extends Activity implements + OnCreateContextMenuListener, ExpandableListView.OnChildClickListener, + ExpandableListView.OnGroupCollapseListener, + ExpandableListView.OnGroupExpandListener { + ExpandableListAdapter mAdapter; + boolean mFinishedStart = false; + ExpandableListView mList; + + private void ensureList() { + if (mList != null) { + return; + } + setContentView(R.layout.expandable_list_content); + } + + public ExpandableListAdapter getExpandableListAdapter() { + return mAdapter; + } + + public ExpandableListView getExpandableListView() { + ensureList(); + return mList; + } + + public long getSelectedId() { + return mList.getSelectedId(); + } + + public long getSelectedPosition() { + return mList.getSelectedPosition(); + } + + @Override + public boolean onChildClick(ExpandableListView parent, View v, + int groupPosition, int childPosition, long id) { + return false; + } + + @Override + public void onContentChanged() { + super.onContentChanged(); + View emptyView = findViewById(R.id.empty); + mList = (ExpandableListView) findViewById(android.R.id.list); + if (mList == null) { + throw new RuntimeException( + "Your content must have a ExpandableListView whose id attribute is " + + "'android.R.id.list'"); + } + if (emptyView != null) { + mList.setEmptyView(emptyView); + } + mList.setOnChildClickListener(this); + mList.setOnGroupExpandListener(this); + mList.setOnGroupCollapseListener(this); + + if (mFinishedStart) { + setListAdapter(mAdapter); + } + mFinishedStart = true; + } + + @Override + public void onGroupCollapse(int groupPosition) { + } + + @Override + public void onGroupExpand(int groupPosition) { + } + + @Override + protected void onRestoreInstanceState(Bundle state) { + ensureList(); + super.onRestoreInstanceState(state); + } + + public void setListAdapter(ExpandableListAdapter adapter) { + synchronized (this) { + ensureList(); + mAdapter = adapter; + mList.setAdapter(adapter); + } + } + + public boolean setSelectedChild(int groupPosition, int childPosition, + boolean shouldExpandGroup) { + return mList.setSelectedChild(groupPosition, childPosition, + shouldExpandGroup); + } + + public void setSelectedGroup(int groupPosition) { + mList.setSelectedGroup(groupPosition); + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/Fragment.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/Fragment.java new file mode 100644 index 0000000000..94e0eb5fc0 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/Fragment.java @@ -0,0 +1,146 @@ + +package org.holoeverywhere.app; + +import java.util.Collection; + +import org.holoeverywhere.LayoutInflater; +import org.holoeverywhere.addon.IAddon; +import org.holoeverywhere.addon.IAddonBasicAttacher; +import org.holoeverywhere.addon.IAddonFragment; + +import android.content.Context; +import android.os.Bundle; +import android.support.v4.app._HoloFragment; +import android.view.View; + +import com.actionbarsherlock.view.ActionMode; +import com.actionbarsherlock.view.ActionMode.Callback; + +public class Fragment extends _HoloFragment { + public static T instantiate(Class clazz) { + return instantiate(clazz, null); + } + + public static T instantiate(Class clazz, Bundle args) { + try { + T fragment = clazz.newInstance(); + if (args != null) { + args.setClassLoader(clazz.getClassLoader()); + fragment.setArguments(args); + } + return fragment; + } catch (Exception e) { + throw new InstantiationException("Unable to instantiate fragment " + clazz + + ": make sure class name exists, is public, and has an" + + " empty constructor that is public", e); + } + } + + @Deprecated + public static Fragment instantiate(Context context, String fname) { + return instantiate(context, fname, null); + } + + @SuppressWarnings("unchecked") + @Deprecated + public static Fragment instantiate(Context context, String fname, Bundle args) { + try { + return instantiate((Class) Class.forName(fname, true, + context.getClassLoader()), args); + } catch (Exception e) { + throw new InstantiationException("Unable to instantiate fragment " + fname + + ": make sure class name exists, is public, and has an" + + " empty constructor that is public", e); + } + } + + private final IAddonBasicAttacher mAttacher = + new IAddonBasicAttacher(this); + + private LayoutInflater mLayoutInflater; + + @Override + public T addon(Class clazz) { + return mAttacher.addon(clazz); + } + + @Override + public void addon(Collection> classes) { + mAttacher.addon(classes); + } + + @Override + public T addon(String classname) { + return mAttacher.addon(classname); + } + + @Override + public LayoutInflater getLayoutInflater() { + if (mLayoutInflater == null) { + mLayoutInflater = getSupportActivity().getLayoutInflater(). + obtainFragmentChildInflater(this); + } + return mLayoutInflater; + } + + @Override + public boolean isAddonAttached(Class clazz) { + return mAttacher.isAddonAttached(clazz); + } + + @Override + public void lockAttaching() { + mAttacher.lockAttaching(); + } + + @Override + public Collection> obtainAddonsList() { + return mAttacher.obtainAddonsList(); + } + + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + mAttacher.reset(); + mAttacher.inhert(activity); + } + + @Override + public void onCreate(final Bundle savedInstanceState) { + lockAttaching(); + performAddonAction(new AddonCallback() { + @Override + public void justAction(IAddonFragment addon) { + addon.onPreCreate(savedInstanceState); + } + }); + super.onCreate(savedInstanceState); + performAddonAction(new AddonCallback() { + @Override + public void justAction(IAddonFragment addon) { + addon.onCreate(savedInstanceState); + } + }); + } + + @Override + public void onViewCreated(final View view, final Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + performAddonAction(new AddonCallback() { + @Override + public void justAction(IAddonFragment addon) { + addon.onViewCreated(view, savedInstanceState); + } + }); + } + + @Override + public boolean performAddonAction(AddonCallback callback) { + return mAttacher.performAddonAction(callback); + } + + @Override + public ActionMode startActionMode(Callback callback) { + return getSupportActivity().startActionMode(callback); + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/GridFragment.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/GridFragment.java new file mode 100644 index 0000000000..fd5ed611be --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/GridFragment.java @@ -0,0 +1,217 @@ + +package org.holoeverywhere.app; + +import org.holoeverywhere.LayoutInflater; +import org.holoeverywhere.R; +import org.holoeverywhere.widget.GridView; + +import android.os.Bundle; +import android.os.Handler; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.AnimationUtils; +import android.widget.AdapterView; +import android.widget.ListAdapter; +import android.widget.TextView; + +public class GridFragment extends Fragment { + private ListAdapter mAdapter; + private CharSequence mEmptyText; + private View mEmptyView; + private GridView mGrid; + private View mGridContainer; + private boolean mGridShown; + final private Handler mHandler = new Handler(); + final private AdapterView.OnItemClickListener mOnClickListener = new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View v, int position, + long id) { + onGridItemClick((GridView) parent, v, position, id); + } + }; + private View mProgressContainer; + final private Runnable mRequestFocus = new Runnable() { + @Override + public void run() { + mGrid.focusableViewAvailable(mGrid); + } + }; + private TextView mStandardEmptyView; + + private void ensureGrid() { + if (mGrid != null) { + return; + } + View root = getView(); + if (root == null) { + throw new IllegalStateException("Content view not yet created"); + } + if (root instanceof GridView) { + mGrid = (GridView) root; + } else { + mStandardEmptyView = (TextView) root + .findViewById(R.id.internalEmpty); + if (mStandardEmptyView == null) { + mEmptyView = root.findViewById(android.R.id.empty); + } else { + mStandardEmptyView.setVisibility(View.GONE); + } + mProgressContainer = root.findViewById(R.id.progressContainer); + mGridContainer = root.findViewById(R.id.listContainer); + View rawGridVIew = root.findViewById(android.R.id.list); + if (!(rawGridVIew instanceof GridView)) { + if (rawGridVIew == null) { + throw new RuntimeException( + "Your content must have a GridVIew whose id attribute is " + + "'android.R.id.list'"); + } + throw new RuntimeException( + "Content has view with id attribute 'android.R.id.list' " + + "that is not a GridVIew class"); + } + mGrid = (GridView) rawGridVIew; + if (mEmptyView != null) { + mGrid.setEmptyView(mEmptyView); + } else if (mEmptyText != null) { + mStandardEmptyView.setText(mEmptyText); + mGrid.setEmptyView(mStandardEmptyView); + } + } + mGridShown = true; + mGrid.setOnItemClickListener(mOnClickListener); + if (mAdapter != null) { + ListAdapter adapter = mAdapter; + mAdapter = null; + setGridAdapter(adapter); + } else { + if (mProgressContainer != null) { + setGridShown(false, false); + } + } + mHandler.post(mRequestFocus); + } + + protected View getEmptyView() { + return mEmptyView; + } + + public GridView getGridView() { + ensureGrid(); + return mGrid; + } + + public ListAdapter getListAdapter() { + return mAdapter; + } + + public long getSelectedItemId() { + ensureGrid(); + return mGrid.getSelectedItemId(); + } + + public int getSelectedItemPosition() { + ensureGrid(); + return mGrid.getSelectedItemPosition(); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + return inflater.inflate(R.layout.grid_content, container, false); + } + + @Override + public void onDestroyView() { + mHandler.removeCallbacks(mRequestFocus); + mGrid = null; + mGridShown = false; + mEmptyView = mProgressContainer = mGridContainer = null; + mStandardEmptyView = null; + super.onDestroyView(); + } + + public void onGridItemClick(GridView l, View v, int position, long id) { + } + + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + ensureGrid(); + } + + public void setEmptyText(CharSequence text) { + ensureGrid(); + if (mStandardEmptyView == null) { + throw new IllegalStateException( + "Can't be used with a custom content view"); + } + mStandardEmptyView.setText(text); + if (mEmptyText == null) { + mGrid.setEmptyView(mStandardEmptyView); + } + mEmptyText = text; + } + + public void setGridAdapter(ListAdapter adapter) { + boolean hadAdapter = mAdapter != null; + mAdapter = adapter; + if (mGrid != null) { + mGrid.setAdapter(adapter); + if (!mGridShown && !hadAdapter) { + // The list was hidden, and previously didn't have an + // adapter. It is now time to show it. + setGridShown(true, getView().getWindowToken() != null); + } + } + } + + public void setGridShown(boolean shown) { + setGridShown(shown, true); + } + + private void setGridShown(boolean shown, boolean animate) { + ensureGrid(); + if (mProgressContainer == null) { + throw new IllegalStateException( + "Can't be used with a custom content view"); + } + if (mGridShown == shown) { + return; + } + mGridShown = shown; + if (shown) { + if (animate) { + mProgressContainer.startAnimation(AnimationUtils.loadAnimation( + getActivity(), R.anim.fade_out)); + mGridContainer.startAnimation(AnimationUtils.loadAnimation( + getActivity(), R.anim.fade_in)); + } else { + mProgressContainer.clearAnimation(); + mGridContainer.clearAnimation(); + } + mProgressContainer.setVisibility(View.GONE); + mGridContainer.setVisibility(View.VISIBLE); + } else { + if (animate) { + mProgressContainer.startAnimation(AnimationUtils.loadAnimation( + getActivity(), R.anim.fade_in)); + mGridContainer.startAnimation(AnimationUtils.loadAnimation( + getActivity(), R.anim.fade_out)); + } else { + mProgressContainer.clearAnimation(); + mGridContainer.clearAnimation(); + } + mProgressContainer.setVisibility(View.VISIBLE); + mGridContainer.setVisibility(View.GONE); + } + } + + public void setGridShownNoAnimation(boolean shown) { + setGridShown(shown, false); + } + + public void setSelection(int position) { + ensureGrid(); + mGrid.setSelection(position); + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/ListActivity.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/ListActivity.java new file mode 100644 index 0000000000..c4cd849c32 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/ListActivity.java @@ -0,0 +1,106 @@ + +package org.holoeverywhere.app; + +import org.holoeverywhere.R; +import org.holoeverywhere.widget.ListView; + +import android.os.Bundle; +import android.os.Handler; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ListAdapter; + +public abstract class ListActivity extends Activity { + protected ListAdapter mAdapter; + private boolean mFinishedStart = false; + + private Handler mHandler = new Handler(); + protected ListView mList; + + private AdapterView.OnItemClickListener mOnClickListener = new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View v, int position, + long id) { + onListItemClick((ListView) parent, v, position, id); + } + }; + + private Runnable mRequestFocus = new Runnable() { + @Override + public void run() { + mList.focusableViewAvailable(mList); + } + }; + + private void ensureList() { + if (mList != null) { + return; + } + setContentView(R.layout.list_content); + } + + public ListAdapter getListAdapter() { + return mAdapter; + } + + public ListView getListView() { + ensureList(); + return mList; + } + + public long getSelectedItemId() { + return mList.getSelectedItemId(); + } + + public int getSelectedItemPosition() { + return mList.getSelectedItemPosition(); + } + + @Override + public void onContentChanged() { + super.onContentChanged(); + View emptyView = findViewById(android.R.id.empty); + mList = (ListView) findViewById(android.R.id.list); + if (mList == null) { + throw new RuntimeException( + "Your content must have a ListView whose id attribute is " + + "'android.R.id.list'"); + } + if (emptyView != null) { + mList.setEmptyView(emptyView); + } + mList.setOnItemClickListener(mOnClickListener); + if (mFinishedStart) { + setListAdapter(mAdapter); + } + mHandler.post(mRequestFocus); + mFinishedStart = true; + } + + @Override + protected void onDestroy() { + mHandler.removeCallbacks(mRequestFocus); + super.onDestroy(); + } + + protected void onListItemClick(ListView l, View v, int position, long id) { + } + + @Override + protected void onRestoreInstanceState(Bundle state) { + ensureList(); + super.onRestoreInstanceState(state); + } + + public void setListAdapter(ListAdapter adapter) { + synchronized (this) { + ensureList(); + mAdapter = adapter; + mList.setAdapter(adapter); + } + } + + public void setSelection(int position) { + mList.setSelection(position); + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/ListFragment.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/ListFragment.java new file mode 100644 index 0000000000..15899d22c7 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/ListFragment.java @@ -0,0 +1,217 @@ + +package org.holoeverywhere.app; + +import org.holoeverywhere.LayoutInflater; +import org.holoeverywhere.R; +import org.holoeverywhere.widget.ListView; + +import android.os.Bundle; +import android.os.Handler; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.AnimationUtils; +import android.widget.AdapterView; +import android.widget.ListAdapter; +import android.widget.TextView; + +public class ListFragment extends Fragment { + private ListAdapter mAdapter; + private CharSequence mEmptyText; + private View mEmptyView; + final private Handler mHandler = new Handler(); + private ListView mList; + private View mListContainer; + private boolean mListShown; + final private AdapterView.OnItemClickListener mOnClickListener = new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View v, int position, + long id) { + onListItemClick((ListView) parent, v, position, id); + } + }; + private View mProgressContainer; + final private Runnable mRequestFocus = new Runnable() { + @Override + public void run() { + mList.focusableViewAvailable(mList); + } + }; + private TextView mStandardEmptyView; + + private void ensureList() { + if (mList != null) { + return; + } + View root = getView(); + if (root == null) { + throw new IllegalStateException("Content view not yet created"); + } + if (root instanceof ListView) { + mList = (ListView) root; + } else { + mStandardEmptyView = (TextView) root + .findViewById(R.id.internalEmpty); + if (mStandardEmptyView == null) { + mEmptyView = root.findViewById(android.R.id.empty); + } else { + mStandardEmptyView.setVisibility(View.GONE); + } + mProgressContainer = root.findViewById(R.id.progressContainer); + mListContainer = root.findViewById(R.id.listContainer); + View rawListView = root.findViewById(android.R.id.list); + if (!(rawListView instanceof ListView)) { + if (rawListView == null) { + throw new RuntimeException( + "Your content must have a ListView whose id attribute is " + + "'android.R.id.list'"); + } + throw new RuntimeException( + "Content has view with id attribute 'android.R.id.list' " + + "that is not a ListView class"); + } + mList = (ListView) rawListView; + if (mEmptyView != null) { + mList.setEmptyView(mEmptyView); + } else if (mEmptyText != null) { + mStandardEmptyView.setText(mEmptyText); + mList.setEmptyView(mStandardEmptyView); + } + } + mListShown = true; + mList.setOnItemClickListener(mOnClickListener); + if (mAdapter != null) { + ListAdapter adapter = mAdapter; + mAdapter = null; + setListAdapter(adapter); + } else { + if (mProgressContainer != null) { + setListShown(false, false); + } + } + mHandler.post(mRequestFocus); + } + + protected View getEmptyView() { + return mEmptyView; + } + + public ListAdapter getListAdapter() { + return mAdapter; + } + + public ListView getListView() { + ensureList(); + return mList; + } + + public long getSelectedItemId() { + ensureList(); + return mList.getSelectedItemId(); + } + + public int getSelectedItemPosition() { + ensureList(); + return mList.getSelectedItemPosition(); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + return inflater.inflate(R.layout.list_content, container, false); + } + + @Override + public void onDestroyView() { + mHandler.removeCallbacks(mRequestFocus); + mList = null; + mListShown = false; + mEmptyView = mProgressContainer = mListContainer = null; + mStandardEmptyView = null; + super.onDestroyView(); + } + + public void onListItemClick(ListView l, View v, int position, long id) { + } + + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + ensureList(); + } + + public void setEmptyText(CharSequence text) { + ensureList(); + if (mStandardEmptyView == null) { + throw new IllegalStateException( + "Can't be used with a custom content view"); + } + mStandardEmptyView.setText(text); + if (mEmptyText == null) { + mList.setEmptyView(mStandardEmptyView); + } + mEmptyText = text; + } + + public void setListAdapter(ListAdapter adapter) { + boolean hadAdapter = mAdapter != null; + mAdapter = adapter; + if (mList != null) { + mList.setAdapter(adapter); + if (!mListShown && !hadAdapter) { + // The list was hidden, and previously didn't have an + // adapter. It is now time to show it. + setListShown(true, getView().getWindowToken() != null); + } + } + } + + public void setListShown(boolean shown) { + setListShown(shown, true); + } + + private void setListShown(boolean shown, boolean animate) { + ensureList(); + if (mProgressContainer == null) { + throw new IllegalStateException( + "Can't be used with a custom content view"); + } + if (mListShown == shown) { + return; + } + mListShown = shown; + if (shown) { + if (animate) { + mProgressContainer.startAnimation(AnimationUtils.loadAnimation( + getActivity(), R.anim.fade_out)); + mListContainer.startAnimation(AnimationUtils.loadAnimation( + getActivity(), R.anim.fade_in)); + } else { + mProgressContainer.clearAnimation(); + mListContainer.clearAnimation(); + } + mProgressContainer.setVisibility(View.GONE); + mListContainer.setVisibility(View.VISIBLE); + } else { + if (animate) { + mProgressContainer.startAnimation(AnimationUtils.loadAnimation( + getActivity(), R.anim.fade_in)); + mListContainer.startAnimation(AnimationUtils.loadAnimation( + getActivity(), R.anim.fade_out)); + } else { + mProgressContainer.clearAnimation(); + mListContainer.clearAnimation(); + } + mProgressContainer.setVisibility(View.VISIBLE); + mListContainer.setVisibility(View.GONE); + } + } + + public void setListShownNoAnimation(boolean shown) { + setListShown(shown, false); + } + + public void setSelection(int position) { + ensureList(); + mList.setSelection(position); + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/ProgressDialog.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/ProgressDialog.java new file mode 100644 index 0000000000..b06fac0e0c --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/ProgressDialog.java @@ -0,0 +1,314 @@ + +package org.holoeverywhere.app; + +import java.text.NumberFormat; + +import org.holoeverywhere.R; +import org.holoeverywhere.widget.ProgressBar; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.text.SpannableString; +import android.text.Spanned; +import android.text.style.StyleSpan; +import android.view.View; +import android.widget.TextView; + +public class ProgressDialog extends AlertDialog { + public static final int STYLE_HORIZONTAL = 1; + public static final int STYLE_SPINNER = 0; + + public static ProgressDialog show(Context context, CharSequence title, + CharSequence message) { + return ProgressDialog.show(context, title, message, false); + } + + public static ProgressDialog show(Context context, CharSequence title, + CharSequence message, boolean indeterminate) { + return ProgressDialog.show(context, title, message, indeterminate, + false, null); + } + + public static ProgressDialog show(Context context, CharSequence title, + CharSequence message, boolean indeterminate, boolean cancelable) { + return ProgressDialog.show(context, title, message, indeterminate, + cancelable, null); + } + + public static ProgressDialog show(Context context, CharSequence title, + CharSequence message, boolean indeterminate, boolean cancelable, + OnCancelListener cancelListener) { + ProgressDialog dialog = new ProgressDialog(context); + dialog.setTitle(title); + dialog.setMessage(message); + dialog.setIndeterminate(indeterminate); + dialog.setCancelable(cancelable); + dialog.setOnCancelListener(cancelListener); + dialog.show(); + return dialog; + } + + private boolean mHasStarted; + private int mIncrementBy; + private int mIncrementSecondaryBy; + private boolean mIndeterminate; + private Drawable mIndeterminateDrawable; + private int mMax; + private CharSequence mMessage; + private TextView mMessageView; + private ProgressBar mProgress; + private Drawable mProgressDrawable; + private TextView mProgressNumber; + private String mProgressNumberFormat; + private TextView mProgressPercent; + private NumberFormat mProgressPercentFormat; + private int mProgressStyle = ProgressDialog.STYLE_SPINNER; + private int mProgressVal; + private int mSecondaryProgressVal; + private Handler mViewUpdateHandler; + + public ProgressDialog(Context context) { + super(context); + initFormats(); + } + + public ProgressDialog(Context context, int theme) { + super(context, theme); + initFormats(); + } + + public int getMax() { + if (mProgress != null) { + return mProgress.getMax(); + } + return mMax; + } + + public int getProgress() { + if (mProgress != null) { + return mProgress.getProgress(); + } + return mProgressVal; + } + + public int getSecondaryProgress() { + if (mProgress != null) { + return mProgress.getSecondaryProgress(); + } + return mSecondaryProgressVal; + } + + public void incrementProgressBy(int diff) { + if (mProgress != null) { + mProgress.incrementProgress(diff); + onProgressChanged(); + } else { + mIncrementBy += diff; + } + } + + public void incrementSecondaryProgressBy(int diff) { + if (mProgress != null) { + mProgress.incrementSecondaryProgress(diff); + onProgressChanged(); + } else { + mIncrementSecondaryBy += diff; + } + } + + private void initFormats() { + mProgressNumberFormat = "%1d/%2d"; + mProgressPercentFormat = NumberFormat.getPercentInstance(); + mProgressPercentFormat.setMaximumFractionDigits(0); + } + + public boolean isIndeterminate() { + if (mProgress != null) { + return mProgress.isIndeterminate(); + } + return mIndeterminate; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + TypedArray a = getContext().obtainStyledAttributes(null, + R.styleable.AlertDialog, R.attr.alertDialogStyle, + R.style.Holo_AlertDialog); + View view; + if (mProgressStyle == ProgressDialog.STYLE_HORIZONTAL) { + mViewUpdateHandler = new Handler() { + @Override + public void handleMessage(Message msg) { + super.handleMessage(msg); + int progress = mProgress.getProgress(); + int max = mProgress.getMax(); + if (mProgressNumberFormat != null) { + String format = mProgressNumberFormat; + mProgressNumber.setText(String.format(format, progress, + max)); + } else { + mProgressNumber.setText(""); + } + if (mProgressPercentFormat != null) { + double percent = (double) progress / (double) max; + SpannableString tmp = new SpannableString( + mProgressPercentFormat.format(percent)); + tmp.setSpan(new StyleSpan( + android.graphics.Typeface.BOLD), 0, tmp + .length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + mProgressPercent.setText(tmp); + } else { + mProgressPercent.setText(""); + } + } + }; + view = getLayoutInflater().inflate( + a.getResourceId( + R.styleable.AlertDialog_horizontalProgressLayout, + R.layout.alert_dialog_progress_holo)); + mProgress = (ProgressBar) view.findViewById(R.id.progress); + mProgressNumber = (TextView) view + .findViewById(R.id.progress_number); + mProgressPercent = (TextView) view + .findViewById(R.id.progress_percent); + } else { + view = getLayoutInflater().inflate( + a.getResourceId(R.styleable.AlertDialog_progressLayout, + R.layout.progress_dialog_holo)); + mProgress = (ProgressBar) view.findViewById(R.id.progress); + mMessageView = (TextView) view.findViewById(R.id.message); + } + setView(view); + a.recycle(); + if (mMax > 0) { + setMax(mMax); + } + if (mProgressVal > 0) { + setProgress(mProgressVal); + } + if (mSecondaryProgressVal > 0) { + setSecondaryProgress(mSecondaryProgressVal); + } + if (mIncrementBy > 0) { + incrementProgressBy(mIncrementBy); + } + if (mIncrementSecondaryBy > 0) { + incrementSecondaryProgressBy(mIncrementSecondaryBy); + } + if (mProgressDrawable != null) { + setProgressDrawable(mProgressDrawable); + } + if (mIndeterminateDrawable != null) { + setIndeterminateDrawable(mIndeterminateDrawable); + } + if (mMessage != null) { + setMessage(mMessage); + } + setIndeterminate(mIndeterminate); + onProgressChanged(); + super.onCreate(savedInstanceState); + } + + private void onProgressChanged() { + if (mProgressStyle == ProgressDialog.STYLE_HORIZONTAL) { + if (mViewUpdateHandler != null + && !mViewUpdateHandler.hasMessages(0)) { + mViewUpdateHandler.sendEmptyMessage(0); + } + } + } + + @Override + public void onStart() { + super.onStart(); + mHasStarted = true; + } + + @Override + protected void onStop() { + super.onStop(); + mHasStarted = false; + } + + public void setIndeterminate(boolean indeterminate) { + if (mProgress != null) { + mProgress.setIndeterminate(indeterminate); + } else { + mIndeterminate = indeterminate; + } + } + + public void setIndeterminateDrawable(Drawable d) { + if (mProgress != null) { + mProgress.setIndeterminateDrawable(d); + } else { + mIndeterminateDrawable = d; + } + } + + public void setMax(int max) { + if (mProgress != null) { + mProgress.setMax(max); + onProgressChanged(); + } else { + mMax = max; + } + } + + @Override + public void setMessage(CharSequence message) { + if (mProgress != null) { + if (mProgressStyle == ProgressDialog.STYLE_HORIZONTAL) { + super.setMessage(message); + } else { + mMessageView.setText(message); + } + } else { + mMessage = message; + } + } + + public void setProgress(int value) { + if (mHasStarted) { + mProgress.setProgress(value); + onProgressChanged(); + } else { + mProgressVal = value; + } + } + + public void setProgressDrawable(Drawable d) { + if (mProgress != null) { + mProgress.setProgressDrawable(d); + } else { + mProgressDrawable = d; + } + } + + public void setProgressNumberFormat(String format) { + mProgressNumberFormat = format; + onProgressChanged(); + } + + public void setProgressPercentFormat(NumberFormat format) { + mProgressPercentFormat = format; + onProgressChanged(); + } + + public void setProgressStyle(int style) { + mProgressStyle = style; + } + + public void setSecondaryProgress(int secondaryProgress) { + if (mProgress != null) { + mProgress.setSecondaryProgress(secondaryProgress); + onProgressChanged(); + } else { + mSecondaryProgressVal = secondaryProgress; + } + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/ResolverActivity.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/ResolverActivity.java new file mode 100644 index 0000000000..6c38133d12 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/ResolverActivity.java @@ -0,0 +1,703 @@ + +package org.holoeverywhere.app; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + +import org.holoeverywhere.LayoutInflater; +import org.holoeverywhere.R; +import org.holoeverywhere.internal.AlertController; +import org.holoeverywhere.widget.Button; +import org.holoeverywhere.widget.GridView; +import org.holoeverywhere.widget.ListView; +import org.holoeverywhere.widget.TextView; + +import android.app.ActivityManager; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.ActivityInfo; +import android.content.pm.LabeledIntent; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.content.pm.ResolveInfo; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.os.Build.VERSION; +import android.os.Bundle; +import android.os.PatternMatcher; +import android.os.Process; +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.BaseAdapter; +import android.widget.ImageView; + +public abstract class ResolverActivity extends AlertActivity implements + AdapterView.OnItemClickListener { + private final class DisplayResolveInfo { + Drawable displayIcon; + CharSequence displayLabel; + CharSequence extendedInfo; + Intent origIntent; + ResolveInfo ri; + + DisplayResolveInfo(ResolveInfo pri, CharSequence pLabel, + CharSequence pInfo, Intent pOrigIntent) { + ri = pri; + displayLabel = pLabel; + extendedInfo = pInfo; + origIntent = pOrigIntent; + } + } + + class ItemLongClickListener implements AdapterView.OnItemLongClickListener { + @Override + public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { + ResolveInfo ri = mAdapter.resolveInfoForPosition(position); + showAppDetails(ri); + return true; + } + } + + private final class ResolveListAdapter extends BaseAdapter { + private final List mBaseResolveList; + private List mCurrentResolveList; + private final LayoutInflater mInflater; + private final Intent[] mInitialIntents; + private final Intent mIntent; + + private final int mLaunchedFromUid; + private List mList; + + public ResolveListAdapter(Context context, Intent intent, + Intent[] initialIntents, List rList, int launchedFromUid) { + mIntent = new Intent(intent); + mIntent.setComponent(null); + mInitialIntents = initialIntents; + mBaseResolveList = rList; + mLaunchedFromUid = launchedFromUid; + mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + rebuildList(); + } + + private final void bindView(View view, DisplayResolveInfo info) { + TextView text = (TextView) view.findViewById(android.R.id.text1); + TextView text2 = (TextView) view.findViewById(android.R.id.text2); + ImageView icon = (ImageView) view.findViewById(R.id.icon); + text.setText(info.displayLabel); + if (mShowExtended) { + text2.setVisibility(View.VISIBLE); + text2.setText(info.extendedInfo); + } else { + text2.setVisibility(View.GONE); + } + if (info.displayIcon == null) { + info.displayIcon = loadIconForResolveInfo(info.ri); + } + icon.setImageDrawable(info.displayIcon); + } + + @Override + public int getCount() { + return mList != null ? mList.size() : 0; + } + + @Override + public Object getItem(int position) { + return position; + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + View view; + if (convertView == null) { + view = mInflater.inflate(R.layout.resolve_list_item, parent, false); + ImageView icon = (ImageView) view.findViewById(R.id.icon); + ViewGroup.LayoutParams lp = icon.getLayoutParams(); + lp.width = lp.height = mIconSize; + } else { + view = convertView; + } + bindView(view, mList.get(position)); + return view; + } + + public void handlePackagesChanged() { + final int oldItemCount = getCount(); + rebuildList(); + notifyDataSetChanged(); + if (mList.size() == 0) { + finish(); + } + final int newItemCount = getCount(); + if (newItemCount != oldItemCount) { + resizeGrid(); + } + } + + public Intent intentForPosition(int position) { + if (mList == null) { + return null; + } + DisplayResolveInfo dri = mList.get(position); + Intent intent = new Intent(dri.origIntent != null + ? dri.origIntent : mIntent); + intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT + | Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP); + ActivityInfo ai = dri.ri.activityInfo; + intent.setComponent(new ComponentName( + ai.applicationInfo.packageName, ai.name)); + return intent; + } + + private void processGroup(List rList, int start, int end, ResolveInfo ro, + CharSequence roLabel) { + int num = end - start + 1; + if (num == 1) { + mList.add(new DisplayResolveInfo(ro, roLabel, null, null)); + } else { + mShowExtended = true; + boolean usePkg = false; + CharSequence startApp = ro.activityInfo.applicationInfo.loadLabel(mPm); + if (startApp == null) { + usePkg = true; + } + if (!usePkg) { + HashSet duplicates = + new HashSet(); + duplicates.add(startApp); + for (int j = start + 1; j <= end; j++) { + ResolveInfo jRi = rList.get(j); + CharSequence jApp = jRi.activityInfo.applicationInfo.loadLabel(mPm); + if (jApp == null || duplicates.contains(jApp)) { + usePkg = true; + break; + } else { + duplicates.add(jApp); + } + } + duplicates.clear(); + } + for (int k = start; k <= end; k++) { + ResolveInfo add = rList.get(k); + if (usePkg) { + mList.add(new DisplayResolveInfo(add, roLabel, + add.activityInfo.packageName, null)); + } else { + mList.add(new DisplayResolveInfo(add, roLabel, + add.activityInfo.applicationInfo.loadLabel(mPm), null)); + } + } + } + } + + private void rebuildList() { + if (mBaseResolveList != null) { + mCurrentResolveList = mBaseResolveList; + } else { + mCurrentResolveList = mPm.queryIntentActivities( + mIntent, PackageManager.MATCH_DEFAULT_ONLY + | (mAlwaysUseOption ? PackageManager.GET_RESOLVED_FILTER : 0)); + if (mCurrentResolveList != null) { + for (int i = mCurrentResolveList.size() - 1; i >= 0; i--) { + ActivityInfo ai = mCurrentResolveList.get(i).activityInfo; + int granted = checkComponentPermission( + ai.permission, mLaunchedFromUid, + ai.applicationInfo.uid, ai.exported); + if (granted != PackageManager.PERMISSION_GRANTED) { + mCurrentResolveList.remove(i); + } + } + } + } + int N; + if (mCurrentResolveList != null && (N = mCurrentResolveList.size()) > 0) { + ResolveInfo r0 = mCurrentResolveList.get(0); + for (int i = 1; i < N; i++) { + ResolveInfo ri = mCurrentResolveList.get(i); + if (r0.priority != ri.priority || + r0.isDefault != ri.isDefault) { + while (i < N) { + mCurrentResolveList.remove(i); + N--; + } + } + } + if (N > 1) { + ResolveInfo.DisplayNameComparator rComparator = + new ResolveInfo.DisplayNameComparator(mPm); + Collections.sort(mCurrentResolveList, rComparator); + } + mList = new ArrayList(); + if (mInitialIntents != null) { + for (Intent ii : mInitialIntents) { + if (ii == null) { + continue; + } + ActivityInfo ai = ii.resolveActivityInfo( + getPackageManager(), 0); + if (ai == null) { + Log.w("ResolverActivity", "No activity found for " + + ii); + continue; + } + ResolveInfo ri = new ResolveInfo(); + ri.activityInfo = ai; + if (ii instanceof LabeledIntent) { + LabeledIntent li = (LabeledIntent) ii; + ri.resolvePackageName = li.getSourcePackage(); + ri.labelRes = li.getLabelResource(); + ri.nonLocalizedLabel = li.getNonLocalizedLabel(); + ri.icon = li.getIconResource(); + } + mList.add(new DisplayResolveInfo(ri, + ri.loadLabel(getPackageManager()), null, ii)); + } + } + r0 = mCurrentResolveList.get(0); + int start = 0; + CharSequence r0Label = r0.loadLabel(mPm); + mShowExtended = false; + for (int i = 1; i < N; i++) { + if (r0Label == null) { + r0Label = r0.activityInfo.packageName; + } + ResolveInfo ri = mCurrentResolveList.get(i); + CharSequence riLabel = ri.loadLabel(mPm); + if (riLabel == null) { + riLabel = ri.activityInfo.packageName; + } + if (riLabel.equals(r0Label)) { + continue; + } + processGroup(mCurrentResolveList, start, i - 1, r0, r0Label); + r0 = ri; + r0Label = riLabel; + start = i; + } + processGroup(mCurrentResolveList, start, N - 1, r0, r0Label); + } + } + + public ResolveInfo resolveInfoForPosition(int position) { + if (mList == null) { + return null; + } + return mList.get(position).ri; + } + } + + public static final int FIRST_ISOLATED_UID = 99000; + public static final int LAST_ISOLATED_UID = 99999; + public static final int PER_USER_RANGE = 100000; + private static final String TAG = "ResolverActivity"; + + public static final int getAppId(int uid) { + return uid % PER_USER_RANGE; + } + + public static final boolean isIsolated(int uid) { + if (uid > 0) { + final int appId = getAppId(uid); + return appId >= FIRST_ISOLATED_UID && appId <= LAST_ISOLATED_UID; + } else { + return false; + } + } + + public static final boolean isSameApp(int uid1, int uid2) { + return getAppId(uid1) == getAppId(uid2); + } + + private ResolveListAdapter mAdapter; + private Button mAlwaysButton; + private boolean mAlwaysUseOption; + + private GridView mGrid; + + private int mIconDpi; + + private int mIconSize; + + private int mLastSelected = GridView.INVALID_POSITION; + + private int mLaunchedFromUid; + + private int mMaxColumns; + + private Button mOnceButton; + + private PackageManager mPm; + + private boolean mShowExtended; + + public int checkComponentPermission(String permission, int uid, + int owningUid, boolean exported) { + if (uid == 0 || uid == Process.SYSTEM_UID) { + return PackageManager.PERMISSION_GRANTED; + } + if (isIsolated(uid)) { + return PackageManager.PERMISSION_DENIED; + } + if (owningUid >= 0 && isSameApp(uid, owningUid)) { + return PackageManager.PERMISSION_GRANTED; + } + if (!exported) { + Log.w(TAG, "Permission denied: checkComponentPermission() owningUid=" + owningUid); + return PackageManager.PERMISSION_DENIED; + } + if (permission == null) { + return PackageManager.PERMISSION_GRANTED; + } + // TODO try { + // return AppGlobals.getPackageManager() + // .checkUidPermission(permission, uid); + // } catch (RemoteException e) { + // Log.e(TAG, "PackageManager is dead?!?", e); + // } + // return PackageManager.PERMISSION_DENIED; + return PackageManager.PERMISSION_GRANTED; + } + + Drawable getIcon(Resources res, int resId) { + try { + if (VERSION.SDK_INT >= 15) { + return res.getDrawableForDensity(resId, mIconDpi); + } else { + return res.getDrawable(resId); + } + } catch (Resources.NotFoundException e) { + return null; + } + } + + private int getLauncherLargeIconDensity(ActivityManager am) { + if (VERSION.SDK_INT >= 11) { + return am.getLauncherLargeIconDensity(); + } + final Resources res = getResources(); + final int density = res.getDisplayMetrics().densityDpi; + final Configuration conf = res.getConfiguration(); + final int sw; + if (VERSION.SDK_INT >= 13) { + sw = conf.smallestScreenWidthDp; + } else { + final DisplayMetrics metrics = res.getDisplayMetrics(); + sw = (int) (Math.min(metrics.widthPixels, metrics.heightPixels) / metrics.density); + } + if (sw < 600) { + return density; + } + switch (density) { + case DisplayMetrics.DENSITY_LOW: + return DisplayMetrics.DENSITY_MEDIUM; + case DisplayMetrics.DENSITY_MEDIUM: + return DisplayMetrics.DENSITY_HIGH; + case DisplayMetrics.DENSITY_TV: + return DisplayMetrics.DENSITY_XHIGH; + case DisplayMetrics.DENSITY_HIGH: + return DisplayMetrics.DENSITY_XHIGH; + case DisplayMetrics.DENSITY_XHIGH: + return DisplayMetrics.DENSITY_XXHIGH; + case DisplayMetrics.DENSITY_XXHIGH: + return DisplayMetrics.DENSITY_XHIGH * 2; + default: + return (int) (density * 1.5f + .5f); + } + } + + private int getLauncherLargeIconSize(ActivityManager am) { + if (VERSION.SDK_INT >= 11) { + return am.getLauncherLargeIconSize(); + } + final Resources res = getResources(); + final int size = res.getDimensionPixelSize(android.R.dimen.app_icon_size); + final Configuration conf = res.getConfiguration(); + final int sw; + if (VERSION.SDK_INT >= 13) { + sw = conf.smallestScreenWidthDp; + } else { + final DisplayMetrics metrics = res.getDisplayMetrics(); + sw = (int) (Math.min(metrics.widthPixels, metrics.heightPixels) / metrics.density); + } + if (sw < 600) { + return size; + } + final int density = res.getDisplayMetrics().densityDpi; + switch (density) { + case DisplayMetrics.DENSITY_LOW: + return size * DisplayMetrics.DENSITY_MEDIUM / DisplayMetrics.DENSITY_LOW; + case DisplayMetrics.DENSITY_MEDIUM: + return size * DisplayMetrics.DENSITY_HIGH / DisplayMetrics.DENSITY_MEDIUM; + case DisplayMetrics.DENSITY_TV: + return size * DisplayMetrics.DENSITY_XHIGH / DisplayMetrics.DENSITY_HIGH; + case DisplayMetrics.DENSITY_HIGH: + return size * DisplayMetrics.DENSITY_XHIGH / DisplayMetrics.DENSITY_HIGH; + case DisplayMetrics.DENSITY_XHIGH: + return size * DisplayMetrics.DENSITY_XXHIGH / DisplayMetrics.DENSITY_XHIGH; + case DisplayMetrics.DENSITY_XXHIGH: + return size * DisplayMetrics.DENSITY_XHIGH * 2 / DisplayMetrics.DENSITY_XXHIGH; + default: + return (int) (size * 1.5f + .5f); + } + } + + Drawable loadIconForResolveInfo(ResolveInfo ri) { + Drawable dr; + try { + if (ri.resolvePackageName != null && ri.icon != 0) { + dr = getIcon(mPm.getResourcesForApplication(ri.resolvePackageName), ri.icon); + if (dr != null) { + return dr; + } + } + final int iconRes = ri.getIconResource(); + if (iconRes != 0) { + dr = getIcon(mPm.getResourcesForApplication(ri.activityInfo.packageName), iconRes); + if (dr != null) { + return dr; + } + } + } catch (NameNotFoundException e) { + Log.e(TAG, "Couldn't find resources for package", e); + } + return ri.loadIcon(mPm); + } + + private Intent makeMyIntent() { + Intent intent = new Intent(getIntent()); + intent.setFlags(intent.getFlags() & ~Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); + return intent; + } + + public void onButtonClick(View v) { + final int id = v.getId(); + startSelected(mGrid.getCheckedItemPosition(), id == R.id.button_always); + dismiss(); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + onCreate(savedInstanceState, makeMyIntent(), + getResources().getText(R.string.whichApplication), + null, null, true); + } + + protected void onCreate(Bundle savedInstanceState, Intent intent, + CharSequence title, Intent[] initialIntents, List rList, + boolean alwaysUseOption) { + super.onCreate(savedInstanceState); + try { + mLaunchedFromUid = getPackageManager().getApplicationInfo(getPackageName(), 0).uid; + } catch (NameNotFoundException e) { + e.printStackTrace(); + mLaunchedFromUid = -1; + } + mPm = getPackageManager(); + mAlwaysUseOption = alwaysUseOption; + mMaxColumns = getResources().getInteger(R.integer.config_maxResolverActivityColumns); + intent.setComponent(null); + AlertController.AlertParams ap = mAlertParams; + ap.mTitle = title; + final ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE); + mIconDpi = getLauncherLargeIconDensity(am); + mIconSize = getLauncherLargeIconSize(am); + mAdapter = new ResolveListAdapter(this, intent, initialIntents, rList, + mLaunchedFromUid); + int count = mAdapter.getCount(); + if (mLaunchedFromUid < 0 || isIsolated(mLaunchedFromUid)) { + finish(); + return; + } else if (count > 1) { + ap.mView = getLayoutInflater().inflate(R.layout.resolver_grid, null); + mGrid = (GridView) ap.mView.findViewById(R.id.resolver_grid); + mGrid.setAdapter(mAdapter); + mGrid.setOnItemClickListener(this); + mGrid.setOnItemLongClickListener(new ItemLongClickListener()); + if (alwaysUseOption) { + mGrid.setChoiceMode(ListView.CHOICE_MODE_SINGLE); + } + resizeGrid(); + } else if (count == 1) { + startActivity(mAdapter.intentForPosition(0)); + finish(); + return; + } else { + ap.mMessage = getResources().getText(R.string.noApplications); + } + setupAlert(); + if (alwaysUseOption) { + final ViewGroup buttonLayout = (ViewGroup) findViewById(R.id.button_bar); + if (buttonLayout != null) { + buttonLayout.setVisibility(View.VISIBLE); + mAlwaysButton = (Button) buttonLayout.findViewById(R.id.button_always); + mOnceButton = (Button) buttonLayout.findViewById(R.id.button_once); + } else { + mAlwaysUseOption = false; + } + } + } + + @SuppressWarnings("deprecation") + protected void onIntentSelected(ResolveInfo ri, Intent intent, boolean alwaysCheck) { + if (alwaysCheck) { + IntentFilter filter = new IntentFilter(); + if (intent.getAction() != null) { + filter.addAction(intent.getAction()); + } + Set categories = intent.getCategories(); + if (categories != null) { + for (String cat : categories) { + filter.addCategory(cat); + } + } + filter.addCategory(Intent.CATEGORY_DEFAULT); + int cat = ri.match & IntentFilter.MATCH_CATEGORY_MASK; + Uri data = intent.getData(); + if (cat == IntentFilter.MATCH_CATEGORY_TYPE) { + String mimeType = intent.resolveType(this); + if (mimeType != null) { + try { + filter.addDataType(mimeType); + } catch (IntentFilter.MalformedMimeTypeException e) { + Log.w("ResolverActivity", e); + filter = null; + } + } + } + if (data != null && data.getScheme() != null) { + if (cat != IntentFilter.MATCH_CATEGORY_TYPE + || !"file".equals(data.getScheme()) + && !"content".equals(data.getScheme())) { + filter.addDataScheme(data.getScheme()); + Iterator aIt = ri.filter.authoritiesIterator(); + if (aIt != null) { + while (aIt.hasNext()) { + IntentFilter.AuthorityEntry a = aIt.next(); + if (a.match(data) >= 0) { + int port = a.getPort(); + filter.addDataAuthority(a.getHost(), + port >= 0 ? Integer.toString(port) : null); + break; + } + } + } + Iterator pIt = ri.filter.pathsIterator(); + if (pIt != null) { + String path = data.getPath(); + while (path != null && pIt.hasNext()) { + PatternMatcher p = pIt.next(); + if (p.match(path)) { + filter.addDataPath(p.getPath(), p.getType()); + break; + } + } + } + } + } + if (filter != null) { + final int N = mAdapter.mList.size(); + ComponentName[] set = new ComponentName[N]; + int bestMatch = 0; + for (int i = 0; i < N; i++) { + ResolveInfo r = mAdapter.mList.get(i).ri; + set[i] = new ComponentName(r.activityInfo.packageName, + r.activityInfo.name); + if (r.match > bestMatch) { + bestMatch = r.match; + } + } + try { + getPackageManager().addPreferredActivity(filter, bestMatch, set, + intent.getComponent()); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + if (intent != null) { + startActivity(intent); + } + } + + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + final int checkedPos = mGrid.getCheckedItemPosition(); + final boolean hasValidSelection = checkedPos != AdapterView.INVALID_POSITION; + if (mAlwaysUseOption && (!hasValidSelection || mLastSelected != checkedPos)) { + mAlwaysButton.setEnabled(hasValidSelection); + mOnceButton.setEnabled(hasValidSelection); + if (hasValidSelection) { + mGrid.smoothScrollToPosition(checkedPos); + } + mLastSelected = checkedPos; + } else { + startSelected(position, false); + } + } + + @Override + protected void onRestart() { + super.onRestart(); + mAdapter.handlePackagesChanged(); + } + + @Override + protected void onRestoreInstanceState(Bundle savedInstanceState) { + super.onRestoreInstanceState(savedInstanceState); + if (mAlwaysUseOption) { + final int checkedPos = mGrid.getCheckedItemPosition(); + final boolean enabled = checkedPos != AdapterView.INVALID_POSITION; + mLastSelected = checkedPos; + mAlwaysButton.setEnabled(enabled); + mOnceButton.setEnabled(enabled); + if (enabled) { + mGrid.setSelection(checkedPos); + } + } + } + + @Override + protected void onStop() { + super.onStop(); + if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { + if (!isChangingConfigurations()) { + finish(); + } + } + } + + void resizeGrid() { + final int itemCount = mAdapter.getCount(); + mGrid.setNumColumns(Math.min(itemCount, mMaxColumns)); + } + + void showAppDetails(ResolveInfo ri) { + Intent in = new Intent().setAction("android.settings.APPLICATION_DETAILS_SETTINGS") + .setData(Uri.fromParts("package", ri.activityInfo.packageName, null)) + .addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); + startActivity(in); + } + + void startSelected(int which, boolean always) { + ResolveInfo ri = mAdapter.resolveInfoForPosition(which); + Intent intent = mAdapter.intentForPosition(which); + onIntentSelected(ri, intent, always); + finish(); + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/TabSwipeActivity.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/TabSwipeActivity.java new file mode 100644 index 0000000000..7acd0c94e0 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/TabSwipeActivity.java @@ -0,0 +1,156 @@ + +package org.holoeverywhere.app; + +import org.holoeverywhere.ITabSwipe; +import org.holoeverywhere.R; +import org.holoeverywhere.widget.FrameLayout; + +import android.os.Bundle; + +/** + * This activity class implement tabs + swipe navigation pattern
    + *
    + * Part of HoloEverywhere + */ +public abstract class TabSwipeActivity extends Activity implements + ITabSwipe { + public static class InnerFragment extends TabSwipeFragment { + private TabSwipeActivity mActivity; + private boolean mTabsWasHandled = false; + + @Override + protected void onHandleTabs() { + mTabsWasHandled = true; + if (mActivity != null) { + mActivity.onHandleTabs(); + } + } + + public void setActivity(TabSwipeActivity activity) { + if (activity == null) { + return; + } + mActivity = activity; + if (mTabsWasHandled) { + mActivity.onHandleTabs(); + } + } + } + + private int mCustomLayout = -1; + + private InnerFragment mFragment; + + @Override + public TabSwipeFragment.TabInfo addTab(CharSequence title, + Class fragmentClass) { + return mFragment.addTab(title, fragmentClass); + } + + @Override + public TabSwipeFragment.TabInfo addTab(CharSequence title, + Class fragmentClass, Bundle fragmentArguments) { + return mFragment.addTab(title, fragmentClass, fragmentArguments); + } + + @Override + public TabSwipeFragment.TabInfo addTab(int title, + Class fragmentClass) { + return mFragment.addTab(title, fragmentClass); + } + + @Override + public TabSwipeFragment.TabInfo addTab(int title, + Class fragmentClass, Bundle fragmentArguments) { + return mFragment.addTab(title, fragmentClass, fragmentArguments); + } + + @Override + public TabSwipeFragment.TabInfo addTab( + TabSwipeFragment.TabInfo tabInfo) { + return mFragment.addTab(tabInfo); + } + + @Override + public TabSwipeFragment.TabInfo addTab( + TabSwipeFragment.TabInfo tabInfo, int position) { + return mFragment.addTab(tabInfo, position); + } + + @Override + public OnTabSelectedListener getOnTabSelectedListener() { + return mFragment.getOnTabSelectedListener(); + } + + @Override + public boolean isSmoothScroll() { + return mFragment.isSmoothScroll(); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mFragment = (InnerFragment) getSupportFragmentManager().findFragmentById(R.id.contentPanel); + if (mFragment == null) { + mFragment = new InnerFragment(); + } + mFragment.setActivity(this); + if (mCustomLayout > 0) { + mFragment.setCustomLayout(mCustomLayout); + } + if (mFragment.isDetached()) { + FrameLayout layout = new FrameLayout(this); + layout.setId(R.id.contentPanel); + setContentView(layout); + getSupportFragmentManager().beginTransaction() + .replace(R.id.contentPanel, mFragment).commit(); + getSupportFragmentManager().executePendingTransactions(); + } + } + + /** + * Add your tabs here + */ + protected abstract void onHandleTabs(); + + @Override + public void reloadTabs() { + mFragment.reloadTabs(); + } + + @Override + public void removeAllTabs() { + mFragment.removeAllTabs(); + } + + @Override + public TabSwipeFragment.TabInfo removeTab(int position) { + return mFragment.removeTab(position); + } + + @Override + public TabSwipeFragment.TabInfo removeTab( + TabSwipeFragment.TabInfo tabInfo) { + return mFragment.removeTab(tabInfo); + } + + @Override + public void setCurrentTab(int position) { + mFragment.setCurrentTab(position); + } + + @Override + public void setCustomLayout(int customLayout) { + mCustomLayout = customLayout; + } + + @Override + public void setOnTabSelectedListener(OnTabSelectedListener onTabSelectedListener) { + mFragment.setOnTabSelectedListener(onTabSelectedListener); + } + + @Override + public void setSmoothScroll(boolean smoothScroll) { + mFragment.setSmoothScroll(smoothScroll); + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/TabSwipeFragment.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/TabSwipeFragment.java new file mode 100644 index 0000000000..705a33b1c2 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/TabSwipeFragment.java @@ -0,0 +1,305 @@ + +package org.holoeverywhere.app; + +import java.util.ArrayList; +import java.util.List; + +import org.holoeverywhere.ITabSwipe; +import org.holoeverywhere.LayoutInflater; +import org.holoeverywhere.R; +import org.holoeverywhere.app.TabSwipeFragment.TabInfo; + +import android.os.Bundle; +import android.support.v4.app.FragmentStatePagerAdapter; +import android.support.v4.app.FragmentTransaction; +import android.support.v4.view.ViewPager; +import android.support.v4.view.ViewPager.OnPageChangeListener; +import android.view.View; +import android.view.ViewGroup; + +import com.actionbarsherlock.app.ActionBar; +import com.actionbarsherlock.app.ActionBar.Tab; +import com.actionbarsherlock.app.ActionBar.TabListener; + +/** + * This fragment class implement tabs + swipe navigation pattern
    + *
    + * Part of HoloEverywhere + */ +public abstract class TabSwipeFragment extends Fragment implements ITabSwipe { + public static class TabInfo implements ITabSwipe.TabInfo { + public Bundle fragmentArguments; + public Class fragmentClass; + public CharSequence title; + + @Override + public Bundle getFragmentArguments() { + return fragmentArguments; + } + + @Override + public Class getFragmentClass() { + return fragmentClass; + } + + @Override + public CharSequence getTitle() { + return title; + } + + @Override + public void setFragmentArguments(Bundle fragmentArguments) { + this.fragmentArguments = fragmentArguments; + } + + @Override + public void setFragmentClass(Class fragmentClass) { + this.fragmentClass = fragmentClass; + } + + @Override + public void setTitle(CharSequence title) { + this.title = title; + } + } + + private final class TabSwipeAdapter extends FragmentStatePagerAdapter implements + OnPageChangeListener, TabListener { + public TabSwipeAdapter() { + super(getChildFragmentManager()); + } + + @Override + public int getCount() { + return mTabs.size(); + } + + @Override + public Fragment getItem(int position) { + final TabInfo info = mTabs.get(position); + return Fragment.instantiate(info.fragmentClass, info.fragmentArguments); + } + + @Override + public void onPageScrolled(int position, float percent, int pixels) { + // Do nothing + } + + @Override + public void onPageScrollStateChanged(int scrollState) { + // Do nothing + } + + @Override + public void onPageSelected(int position) { + dispatchTabSelected(position); + } + + @Override + public void onTabReselected(Tab tab, FragmentTransaction ft) { + // Do nothing + } + + @Override + public void onTabSelected(Tab tab, FragmentTransaction ft) { + dispatchTabSelected(tab.getPosition()); + } + + @Override + public void onTabUnselected(Tab tab, FragmentTransaction ft) { + // Do nothing + } + } + + private TabSwipeAdapter mAdapter; + private int mCustomLayout = -1; + private OnTabSelectedListener mOnTabSelectedListener; + private int mPrevNavigationMode = ActionBar.NAVIGATION_MODE_STANDARD; + private boolean mSmoothScroll = true; + private List mTabs = new ArrayList(); + + private ViewPager mViewPager; + + @Override + public TabInfo addTab(CharSequence title, Class fragmentClass) { + return addTab(title, fragmentClass, null); + } + + @Override + public TabInfo addTab(CharSequence title, Class fragmentClass, + Bundle fragmentArguments) { + TabInfo info = new TabInfo(); + info.title = title; + info.fragmentClass = fragmentClass; + info.fragmentArguments = fragmentArguments; + return addTab(info); + } + + @Override + public TabInfo addTab(int title, Class fragmentClass) { + return addTab(getText(title), fragmentClass, null); + } + + @Override + public TabInfo addTab(int title, Class fragmentClass, + Bundle fragmentArguments) { + return addTab(getText(title), fragmentClass, fragmentArguments); + } + + @Override + public TabInfo addTab(TabInfo tabInfo) { + mTabs.add(tabInfo); + getSupportActionBar().addTab(makeActionBarTab(tabInfo)); + notifyChanged(); + return tabInfo; + } + + @Override + public TabInfo addTab(TabInfo tabInfo, int position) { + mTabs.add(position, tabInfo); + getSupportActionBar().addTab(makeActionBarTab(tabInfo), position); + notifyChanged(); + return tabInfo; + } + + private void dispatchTabSelected(int position) { + boolean notify = false; + if (mViewPager.getCurrentItem() != position) { + mViewPager.setCurrentItem(position, mSmoothScroll); + notify = true; + } + if (getSupportActionBar().getSelectedNavigationIndex() != position) { + getSupportActionBar().selectTab(getSupportActionBar().getTabAt(position)); + notify = true; + } + if (notify) { + onTabSelected(position); + } + } + + @Override + public OnTabSelectedListener getOnTabSelectedListener() { + return mOnTabSelectedListener; + } + + @Override + public boolean isSmoothScroll() { + return mSmoothScroll; + } + + protected Tab makeActionBarTab(TabInfo tabInfo) { + Tab tab = getSupportActionBar().newTab(); + tab.setText(tabInfo.title); + tab.setTabListener(mAdapter); + return tab; + } + + private void notifyChanged() { + if (mAdapter != null) { + mAdapter.notifyDataSetChanged(); + } + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + return inflater.inflate(mCustomLayout > 0 ? mCustomLayout : R.layout.tab_swipe, container, + false); + } + + @Override + public void onDestroyView() { + getSupportActionBar().removeAllTabs(); + getSupportActionBar().setNavigationMode(mPrevNavigationMode); + super.onDestroyView(); + } + + /** + * Add your tabs here + */ + protected abstract void onHandleTabs(); + + public void onTabSelected(int position) { + if (mOnTabSelectedListener != null) { + mOnTabSelectedListener.onTabSelected(position); + } + } + + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + mViewPager = (ViewPager) view.findViewById(R.id.tabSwipePager); + if (mViewPager == null) { + throw new IllegalStateException( + "Add ViewPager to your custom layout with id @id/tabSwipePager"); + } + if (getSupportActionBar().getTabCount() > 0) { + throw new IllegalStateException( + "TabSwipeFragment doesn't support multitabbed fragments"); + } + mAdapter = new TabSwipeAdapter(); + onHandleTabs(); + mViewPager.setAdapter(mAdapter); + mViewPager.setOnPageChangeListener(mAdapter); + mPrevNavigationMode = getSupportActionBar().getNavigationMode(); + getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); + } + + @Override + public void reloadTabs() { + removeAllTabs(); + onHandleTabs(); + } + + @Override + public void removeAllTabs() { + getSupportActionBar().removeAllTabs(); + mTabs.clear(); + notifyChanged(); + } + + @Override + public TabInfo removeTab(int position) { + TabInfo tabInfo = mTabs.remove(position); + getSupportActionBar().removeTabAt(position); + notifyChanged(); + return tabInfo; + } + + @Override + public TabInfo removeTab(TabInfo tabInfo) { + for (int i = 0; i < mTabs.size(); i++) { + if (mTabs.get(i) == tabInfo) { + return removeTab(i); + } + } + return tabInfo; + } + + @Override + public void setCurrentTab(int position) { + dispatchTabSelected(Math.min(0, Math.max(position, mTabs.size() - 1))); + } + + /** + * If you want custom layout for this activity - call this method before + * super.onCreate
    + * Your layout should be contains ViewPager with id @id/tabSwipePager + */ + @Override + public void setCustomLayout(int customLayout) { + mCustomLayout = customLayout; + } + + @Override + public void setOnTabSelectedListener(OnTabSelectedListener onTabSelectedListener) { + mOnTabSelectedListener = onTabSelectedListener; + } + + /** + * Smooth scroll of ViewPager when user click on tab + */ + @Override + public void setSmoothScroll(boolean smoothScroll) { + mSmoothScroll = smoothScroll; + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/TimePickerDialog.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/TimePickerDialog.java new file mode 100644 index 0000000000..c61325ba5c --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/TimePickerDialog.java @@ -0,0 +1,99 @@ + +package org.holoeverywhere.app; + +import org.holoeverywhere.LayoutInflater; +import org.holoeverywhere.R; +import org.holoeverywhere.widget.TimePicker; + +import android.content.Context; +import android.content.DialogInterface; +import android.content.DialogInterface.OnClickListener; +import android.os.Bundle; +import android.view.View; + +public class TimePickerDialog extends AlertDialog implements OnClickListener, + TimePicker.OnTimeChangedListener { + public interface OnTimeSetListener { + public void onTimeSet(TimePicker view, int hourOfDay, int minute); + } + + private static final String HOUR = "hour"; + private static final String IS_24_HOUR = "is24hour"; + private static final String MINUTE = "minute"; + + private final OnTimeSetListener mCallback; + int mInitialHourOfDay, mInitialMinute; + + boolean mIs24HourView; + private final TimePicker mTimePicker; + + public TimePickerDialog(Context context, int theme, + OnTimeSetListener callBack, int hourOfDay, int minute, + boolean is24HourView) { + super(context, theme); + mCallback = callBack; + mInitialHourOfDay = hourOfDay; + mInitialMinute = minute; + mIs24HourView = is24HourView; + setIcon(0); + setTitle(R.string.time_picker_dialog_title); + Context themeContext = getContext(); + setButton(DialogInterface.BUTTON_POSITIVE, + themeContext.getText(R.string.date_time_set), this); + setButton(DialogInterface.BUTTON_NEGATIVE, + themeContext.getText(android.R.string.cancel), + (OnClickListener) null); + View view = LayoutInflater.inflate(themeContext, + R.layout.time_picker_dialog); + setView(view); + mTimePicker = (TimePicker) view.findViewById(R.id.timePicker); + mTimePicker.setIs24HourView(mIs24HourView); + mTimePicker.setCurrentHour(mInitialHourOfDay); + mTimePicker.setCurrentMinute(mInitialMinute); + mTimePicker.setOnTimeChangedListener(this); + } + + public TimePickerDialog(Context context, OnTimeSetListener callBack, + int hourOfDay, int minute, boolean is24HourView) { + this(context, 0, callBack, hourOfDay, minute, is24HourView); + } + + @Override + public void onClick(DialogInterface dialog, int which) { + if (mCallback != null) { + mTimePicker.clearFocus(); + mCallback.onTimeSet(mTimePicker, mTimePicker.getCurrentHour(), + mTimePicker.getCurrentMinute()); + } + } + + @Override + public void onRestoreInstanceState(Bundle savedInstanceState) { + super.onRestoreInstanceState(savedInstanceState); + int hour = savedInstanceState.getInt(TimePickerDialog.HOUR); + int minute = savedInstanceState.getInt(TimePickerDialog.MINUTE); + mTimePicker.setIs24HourView(savedInstanceState + .getBoolean(TimePickerDialog.IS_24_HOUR)); + mTimePicker.setCurrentHour(hour); + mTimePicker.setCurrentMinute(minute); + } + + @Override + public Bundle onSaveInstanceState() { + Bundle state = super.onSaveInstanceState(); + state.putInt(TimePickerDialog.HOUR, mTimePicker.getCurrentHour()); + state.putInt(TimePickerDialog.MINUTE, mTimePicker.getCurrentMinute()); + state.putBoolean(TimePickerDialog.IS_24_HOUR, + mTimePicker.is24HourView()); + return state; + } + + @Override + public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { + } + + public void updateTime(int hourOfDay, int minutOfHour) { + mTimePicker.setCurrentHour(hourOfDay); + mTimePicker.setCurrentMinute(minutOfHour); + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/drawable/ColorDrawable.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/drawable/ColorDrawable.java new file mode 100644 index 0000000000..39db52525f --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/drawable/ColorDrawable.java @@ -0,0 +1,138 @@ + +package org.holoeverywhere.drawable; + +import java.io.IOException; + +import org.holoeverywhere.R; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.ColorFilter; +import android.graphics.Paint; +import android.graphics.PixelFormat; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; + +public class ColorDrawable extends android.graphics.drawable.ColorDrawable { + final static class ColorState extends ConstantState { + int mBaseColor; + int mChangingConfigurations; + int mUseColor; + + ColorState(ColorState state) { + if (state != null) { + mBaseColor = state.mBaseColor; + mUseColor = state.mUseColor; + } + } + + @Override + public int getChangingConfigurations() { + return mChangingConfigurations; + } + + @Override + public Drawable newDrawable() { + return new ColorDrawable(this); + } + + @Override + public Drawable newDrawable(Resources res) { + return new ColorDrawable(this); + } + } + + private final Paint mPaint = new Paint(); + private ColorState mState; + + public ColorDrawable() { + this(null); + } + + private ColorDrawable(ColorState state) { + mState = new ColorState(state); + } + + public ColorDrawable(int color) { + this(null); + setColor(color); + } + + @Override + public void draw(Canvas canvas) { + if (mState.mUseColor >>> 24 != 0) { + mPaint.setColor(mState.mUseColor); + canvas.drawRect(getBounds(), mPaint); + } + } + + @Override + public int getAlpha() { + return mState.mUseColor >>> 24; + } + + @Override + public int getChangingConfigurations() { + return super.getChangingConfigurations() | mState.mChangingConfigurations; + } + + @Override + public int getColor() { + return mState.mUseColor; + } + + @Override + public ConstantState getConstantState() { + mState.mChangingConfigurations = getChangingConfigurations(); + return mState; + } + + @Override + public int getOpacity() { + switch (mState.mUseColor >>> 24) { + case 255: + return PixelFormat.OPAQUE; + case 0: + return PixelFormat.TRANSPARENT; + } + return PixelFormat.TRANSLUCENT; + } + + @Override + public void inflate(Resources r, XmlPullParser parser, AttributeSet attrs) + throws XmlPullParserException, IOException { + super.inflate(r, parser, attrs); + TypedArray a = r.obtainAttributes(attrs, R.styleable.ColorDrawable); + int color = mState.mBaseColor; + color = a.getColor(R.styleable.ColorDrawable_android_color, color); + mState.mBaseColor = mState.mUseColor = color; + a.recycle(); + } + + @Override + public void setAlpha(int alpha) { + alpha += alpha >> 7; + int baseAlpha = mState.mBaseColor >>> 24; + int useAlpha = baseAlpha * alpha >> 8; + int oldUseColor = mState.mUseColor; + mState.mUseColor = mState.mBaseColor << 8 >>> 8 | useAlpha << 24; + if (oldUseColor != mState.mUseColor) { + invalidateSelf(); + } + } + + @Override + public void setColor(int color) { + if (mState.mBaseColor != color || mState.mUseColor != color) { + invalidateSelf(); + mState.mBaseColor = mState.mUseColor = color; + } + } + + @Override + public void setColorFilter(ColorFilter colorFilter) { + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/drawable/DrawableCompat.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/drawable/DrawableCompat.java new file mode 100644 index 0000000000..0d29fa1f16 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/drawable/DrawableCompat.java @@ -0,0 +1,172 @@ + +package org.holoeverywhere.drawable; + +import java.io.IOException; +import java.io.InputStream; +import java.lang.ref.WeakReference; +import java.util.HashMap; +import java.util.Map; + +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +import android.content.res.Resources; +import android.content.res.Resources.NotFoundException; +import android.content.res.TypedArray; +import android.content.res.XmlResourceParser; +import android.graphics.BitmapFactory; +import android.graphics.drawable.Drawable; +import android.support.v4.util.LongSparseArray; +import android.util.AttributeSet; +import android.util.TypedValue; +import android.util.Xml; + +public final class DrawableCompat { + private static final Map> CLASS_MAP = new HashMap>(); + private static final LongSparseArray> sDrawableCache = new LongSparseArray>(); + + static { + CLASS_MAP.put("rotate", RotateDrawable.class); + CLASS_MAP.put("layer-list", LayerDrawable.class); + CLASS_MAP.put("selector", StateListDrawable.class); + CLASS_MAP.put("color", ColorDrawable.class); + } + + public static Drawable createFromPath(String pathName) { + return Drawable.createFromPath(pathName); + } + + public static Drawable createFromResourceStream(Resources res, TypedValue value, + InputStream is, String srcName) { + return createFromResourceStream(res, value, is, srcName, null); + } + + public static Drawable createFromResourceStream(Resources res, TypedValue value, + InputStream is, String srcName, BitmapFactory.Options opts) { + return Drawable.createFromResourceStream(res, value, is, srcName, opts); + } + + public static Drawable createFromStream(InputStream is, String srcName) { + return createFromResourceStream(null, null, is, srcName, null); + } + + public static Drawable createFromXml(Resources r, XmlPullParser parser) + throws XmlPullParserException, IOException { + AttributeSet attrs = Xml.asAttributeSet(parser); + int type; + while ((type = parser.next()) != XmlPullParser.START_TAG && + type != XmlPullParser.END_DOCUMENT) { + } + if (type != XmlPullParser.START_TAG) { + throw new XmlPullParserException("No start tag found"); + } + Drawable drawable = createFromXmlInner(r, parser, attrs); + if (drawable == null) { + throw new RuntimeException("Unknown initial tag: " + parser.getName()); + } + return drawable; + } + + public static Drawable createFromXmlInner(Resources r, XmlPullParser parser, AttributeSet attrs) + throws XmlPullParserException, IOException { + Drawable drawable = null; + final String name = parser.getName(); + try { + Class clazz = CLASS_MAP.get(name); + if (clazz != null) { + drawable = clazz.newInstance(); + } else if (name.indexOf('.') > 0) { + drawable = (Drawable) Class.forName(name).newInstance(); + } + } catch (Exception e) { + throw new XmlPullParserException("Error while inflating drawable resource", parser, e); + } + if (drawable == null) { + return Drawable.createFromXmlInner(r, parser, attrs); + } + drawable.inflate(r, parser, attrs); + return drawable; + } + + private static Drawable getCachedDrawable(long key, Resources res) { + WeakReference wr = sDrawableCache.get(key); + if (wr != null) { + Drawable.ConstantState entry = wr.get(); + if (entry != null) { + return entry.newDrawable(res); + } else { + sDrawableCache.delete(key); + } + } + return null; + } + + public static Drawable getDrawable(Resources res, int resid) { + TypedValue value = new TypedValue(); + res.getValue(resid, value, true); + return loadDrawable(res, value); + } + + public static Drawable getDrawable(TypedArray array, int index) { + TypedValue value = new TypedValue(); + array.getValue(index, value); + return loadDrawable(array.getResources(), value); + } + + public static Drawable loadDrawable(Resources res, TypedValue value) + throws NotFoundException { + if (value == null || value.resourceId <= 0) { + return null; + } + final long key = (long) value.assetCookie << 32 | value.data; + Drawable dr = getCachedDrawable(key, res); + if (dr != null) { + return dr; + } + Drawable.ConstantState cs = null; + if (value.string == null) { + throw new NotFoundException("Resource is not a Drawable (color or path): " + value); + } + String file = value.string.toString(); + if (file.endsWith(".xml")) { + try { + XmlResourceParser rp = res.getAssets().openXmlResourceParser(value.assetCookie, + file); + dr = DrawableCompat.createFromXml(res, rp); + rp.close(); + } catch (Exception e) { + NotFoundException rnf = new NotFoundException( + "File " + file + " from drawable resource ID #0x" + + Integer.toHexString(value.resourceId)); + rnf.initCause(e); + throw rnf; + } + + } else { + try { + InputStream is = res.getAssets().openNonAssetFd(value.assetCookie, file) + .createInputStream(); + dr = DrawableCompat.createFromResourceStream(res, value, is, file, null); + is.close(); + } catch (Exception e) { + NotFoundException rnf = new NotFoundException("File " + file + + " from drawable resource ID #0x" + + Integer.toHexString(value.resourceId)); + rnf.initCause(e); + throw rnf; + } + } + if (dr != null) { + dr.setChangingConfigurations(value.changingConfigurations); + cs = dr.getConstantState(); + if (cs != null) { + sDrawableCache.put(key, new WeakReference(cs)); + } + } + return dr; + } + + private DrawableCompat() { + } + +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/drawable/DrawableContainer.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/drawable/DrawableContainer.java new file mode 100644 index 0000000000..aa2360bfac --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/drawable/DrawableContainer.java @@ -0,0 +1,643 @@ + +package org.holoeverywhere.drawable; + +import android.content.res.Resources; +import android.graphics.Canvas; +import android.graphics.ColorFilter; +import android.graphics.PixelFormat; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.os.SystemClock; + +public class DrawableContainer extends Drawable implements Drawable.Callback { + public abstract static class DrawableContainerState extends ConstantState { + boolean mCanConstantState; + int mChangingConfigurations; + boolean mCheckedConstantState; + int mChildrenChangingConfigurations; + boolean mComputedConstantSize = false; + int mConstantHeight; + int mConstantMinimumHeight; + int mConstantMinimumWidth; + Rect mConstantPadding = null; + boolean mConstantSize = false; + int mConstantWidth; + boolean mDither = DEFAULT_DITHER; + Drawable[] mDrawables; + int mEnterFadeDuration; + int mExitFadeDuration; + boolean mHaveOpacity = false; + boolean mHaveStateful = false; + int mNumChildren; + int mOpacity; + final DrawableContainer mOwner; + boolean mPaddingChecked = false; + boolean mStateful; + boolean mVariablePadding = false; + + DrawableContainerState(DrawableContainerState orig, DrawableContainer owner, + Resources res) { + mOwner = owner; + if (orig != null) { + mChangingConfigurations = orig.mChangingConfigurations; + mChildrenChangingConfigurations = orig.mChildrenChangingConfigurations; + final Drawable[] origDr = orig.mDrawables; + mDrawables = new Drawable[origDr.length]; + mNumChildren = orig.mNumChildren; + final int N = mNumChildren; + for (int i = 0; i < N; i++) { + if (res != null) { + mDrawables[i] = origDr[i].getConstantState().newDrawable(res); + } else { + mDrawables[i] = origDr[i].getConstantState().newDrawable(); + } + mDrawables[i].setCallback(owner); + } + mCheckedConstantState = mCanConstantState = true; + mVariablePadding = orig.mVariablePadding; + if (orig.mConstantPadding != null) { + mConstantPadding = new Rect(orig.mConstantPadding); + } + mConstantSize = orig.mConstantSize; + mComputedConstantSize = orig.mComputedConstantSize; + mConstantWidth = orig.mConstantWidth; + mConstantHeight = orig.mConstantHeight; + mHaveOpacity = orig.mHaveOpacity; + mOpacity = orig.mOpacity; + mHaveStateful = orig.mHaveStateful; + mStateful = orig.mStateful; + mDither = orig.mDither; + mEnterFadeDuration = orig.mEnterFadeDuration; + mExitFadeDuration = orig.mExitFadeDuration; + } else { + mDrawables = new Drawable[10]; + mNumChildren = 0; + mCheckedConstantState = mCanConstantState = false; + } + } + + public final int addChild(Drawable dr) { + final int pos = mNumChildren; + if (pos >= mDrawables.length) { + growArray(pos, pos + 10); + } + dr.setVisible(false, true); + dr.setCallback(mOwner); + mDrawables[pos] = dr; + mNumChildren++; + mChildrenChangingConfigurations |= dr.getChangingConfigurations(); + mHaveOpacity = false; + mHaveStateful = false; + mConstantPadding = null; + mPaddingChecked = false; + mComputedConstantSize = false; + return pos; + } + + public synchronized boolean canConstantState() { + if (!mCheckedConstantState) { + mCanConstantState = true; + final int N = mNumChildren; + for (int i = 0; i < N; i++) { + if (mDrawables[i].getConstantState() == null) { + mCanConstantState = false; + break; + } + } + mCheckedConstantState = true; + } + return mCanConstantState; + } + + protected void computeConstantSize() { + mComputedConstantSize = true; + final int N = getChildCount(); + final Drawable[] drawables = mDrawables; + mConstantWidth = mConstantHeight = -1; + mConstantMinimumWidth = mConstantMinimumHeight = 0; + for (int i = 0; i < N; i++) { + Drawable dr = drawables[i]; + int s = dr.getIntrinsicWidth(); + if (s > mConstantWidth) { + mConstantWidth = s; + } + s = dr.getIntrinsicHeight(); + if (s > mConstantHeight) { + mConstantHeight = s; + } + s = dr.getMinimumWidth(); + if (s > mConstantMinimumWidth) { + mConstantMinimumWidth = s; + } + s = dr.getMinimumHeight(); + if (s > mConstantMinimumHeight) { + mConstantMinimumHeight = s; + } + } + } + + @Override + public int getChangingConfigurations() { + return mChangingConfigurations; + } + + public final int getChildCount() { + return mNumChildren; + } + + public final Drawable[] getChildren() { + return mDrawables; + } + + public final int getConstantHeight() { + if (!mComputedConstantSize) { + computeConstantSize(); + } + + return mConstantHeight; + } + + public final int getConstantMinimumHeight() { + if (!mComputedConstantSize) { + computeConstantSize(); + } + + return mConstantMinimumHeight; + } + + public final int getConstantMinimumWidth() { + if (!mComputedConstantSize) { + computeConstantSize(); + } + + return mConstantMinimumWidth; + } + + public final Rect getConstantPadding() { + if (mVariablePadding) { + return null; + } + if (mConstantPadding != null || mPaddingChecked) { + return mConstantPadding; + } + Rect r = null; + final Rect t = new Rect(); + final int N = getChildCount(); + final Drawable[] drawables = mDrawables; + for (int i = 0; i < N; i++) { + if (drawables[i].getPadding(t)) { + if (r == null) { + r = new Rect(0, 0, 0, 0); + } + if (t.left > r.left) { + r.left = t.left; + } + if (t.top > r.top) { + r.top = t.top; + } + if (t.right > r.right) { + r.right = t.right; + } + if (t.bottom > r.bottom) { + r.bottom = t.bottom; + } + } + } + mPaddingChecked = true; + return mConstantPadding = r; + } + + public final int getConstantWidth() { + if (!mComputedConstantSize) { + computeConstantSize(); + } + return mConstantWidth; + } + + public final int getEnterFadeDuration() { + return mEnterFadeDuration; + } + + public final int getExitFadeDuration() { + return mExitFadeDuration; + } + + public final int getOpacity() { + if (mHaveOpacity) { + return mOpacity; + } + final int N = getChildCount(); + final Drawable[] drawables = mDrawables; + int op = N > 0 ? drawables[0].getOpacity() : PixelFormat.TRANSPARENT; + for (int i = 1; i < N; i++) { + op = Drawable.resolveOpacity(op, drawables[i].getOpacity()); + } + mOpacity = op; + mHaveOpacity = true; + return op; + } + + public void growArray(int oldSize, int newSize) { + Drawable[] newDrawables = new Drawable[newSize]; + System.arraycopy(mDrawables, 0, newDrawables, 0, oldSize); + mDrawables = newDrawables; + } + + public final boolean isConstantSize() { + return mConstantSize; + } + + public final boolean isStateful() { + if (mHaveStateful) { + return mStateful; + } + boolean stateful = false; + final int N = getChildCount(); + for (int i = 0; i < N; i++) { + if (mDrawables[i].isStateful()) { + stateful = true; + break; + } + } + mStateful = stateful; + mHaveStateful = true; + return stateful; + } + + public final void setConstantSize(boolean constant) { + mConstantSize = constant; + } + + public final void setEnterFadeDuration(int duration) { + mEnterFadeDuration = duration; + } + + public final void setExitFadeDuration(int duration) { + mExitFadeDuration = duration; + } + + public final void setVariablePadding(boolean variable) { + mVariablePadding = variable; + } + } + + private static final boolean DEFAULT_DITHER = true; + private int mAlpha = 0xFF; + private Runnable mAnimationRunnable; + private ColorFilter mColorFilter; + private int mCurIndex = -1; + private Drawable mCurrDrawable; + private DrawableContainerState mDrawableContainerState; + private long mEnterAnimationEnd; + private long mExitAnimationEnd; + private Drawable mLastDrawable; + private boolean mMutated; + + void animate(boolean schedule) { + final long now = SystemClock.uptimeMillis(); + boolean animating = false; + if (mCurrDrawable != null) { + if (mEnterAnimationEnd != 0) { + if (mEnterAnimationEnd <= now) { + mCurrDrawable.setAlpha(mAlpha); + mEnterAnimationEnd = 0; + } else { + int animAlpha = (int) ((mEnterAnimationEnd - now) * 255) + / mDrawableContainerState.mEnterFadeDuration; + mCurrDrawable.setAlpha((255 - animAlpha) * mAlpha / 255); + animating = true; + } + } + } else { + mEnterAnimationEnd = 0; + } + if (mLastDrawable != null) { + if (mExitAnimationEnd != 0) { + if (mExitAnimationEnd <= now) { + mLastDrawable.setVisible(false, false); + mLastDrawable = null; + mExitAnimationEnd = 0; + } else { + int animAlpha = (int) ((mExitAnimationEnd - now) * 255) + / mDrawableContainerState.mExitFadeDuration; + mLastDrawable.setAlpha(animAlpha * mAlpha / 255); + animating = true; + } + } + } else { + mExitAnimationEnd = 0; + } + if (schedule && animating) { + scheduleSelf(mAnimationRunnable, now + 1000 / 60); + } + } + + @Override + public void draw(Canvas canvas) { + if (mCurrDrawable != null) { + mCurrDrawable.draw(canvas); + } + if (mLastDrawable != null) { + mLastDrawable.draw(canvas); + } + } + + @Override + public int getChangingConfigurations() { + return super.getChangingConfigurations() + | mDrawableContainerState.mChangingConfigurations + | mDrawableContainerState.mChildrenChangingConfigurations; + } + + @Override + public ConstantState getConstantState() { + if (mDrawableContainerState.canConstantState()) { + mDrawableContainerState.mChangingConfigurations = getChangingConfigurations(); + return mDrawableContainerState; + } + return null; + } + + @Override + public Drawable getCurrent() { + return mCurrDrawable; + } + + @Override + public int getIntrinsicHeight() { + if (mDrawableContainerState.isConstantSize()) { + return mDrawableContainerState.getConstantHeight(); + } + return mCurrDrawable != null ? mCurrDrawable.getIntrinsicHeight() : -1; + } + + @Override + public int getIntrinsicWidth() { + if (mDrawableContainerState.isConstantSize()) { + return mDrawableContainerState.getConstantWidth(); + } + return mCurrDrawable != null ? mCurrDrawable.getIntrinsicWidth() : -1; + } + + @Override + public int getMinimumHeight() { + if (mDrawableContainerState.isConstantSize()) { + return mDrawableContainerState.getConstantMinimumHeight(); + } + return mCurrDrawable != null ? mCurrDrawable.getMinimumHeight() : 0; + } + + @Override + public int getMinimumWidth() { + if (mDrawableContainerState.isConstantSize()) { + return mDrawableContainerState.getConstantMinimumWidth(); + } + return mCurrDrawable != null ? mCurrDrawable.getMinimumWidth() : 0; + } + + @Override + public int getOpacity() { + return mCurrDrawable == null || !mCurrDrawable.isVisible() ? PixelFormat.TRANSPARENT : + mDrawableContainerState.getOpacity(); + } + + @Override + public boolean getPadding(Rect padding) { + final Rect r = mDrawableContainerState.getConstantPadding(); + if (r != null) { + padding.set(r); + return true; + } + if (mCurrDrawable != null) { + return mCurrDrawable.getPadding(padding); + } else { + return super.getPadding(padding); + } + } + + @Override + public void invalidateDrawable(Drawable who) { + if (who == mCurrDrawable && getCallback() != null) { + getCallback().invalidateDrawable(this); + } + } + + @Override + public boolean isStateful() { + return mDrawableContainerState.isStateful(); + } + + @Override + public void jumpToCurrentState() { + boolean changed = false; + if (mLastDrawable != null) { + mLastDrawable.jumpToCurrentState(); + mLastDrawable = null; + changed = true; + } + if (mCurrDrawable != null) { + mCurrDrawable.jumpToCurrentState(); + mCurrDrawable.setAlpha(mAlpha); + } + if (mExitAnimationEnd != 0) { + mExitAnimationEnd = 0; + changed = true; + } + if (mEnterAnimationEnd != 0) { + mEnterAnimationEnd = 0; + changed = true; + } + if (changed) { + invalidateSelf(); + } + } + + @Override + public Drawable mutate() { + if (!mMutated && super.mutate() == this) { + final int N = mDrawableContainerState.getChildCount(); + final Drawable[] drawables = mDrawableContainerState.getChildren(); + for (int i = 0; i < N; i++) { + if (drawables[i] != null) { + drawables[i].mutate(); + } + } + mMutated = true; + } + return this; + } + + @Override + protected void onBoundsChange(Rect bounds) { + if (mLastDrawable != null) { + mLastDrawable.setBounds(bounds); + } + if (mCurrDrawable != null) { + mCurrDrawable.setBounds(bounds); + } + } + + @Override + protected boolean onLevelChange(int level) { + if (mLastDrawable != null) { + return mLastDrawable.setLevel(level); + } + if (mCurrDrawable != null) { + return mCurrDrawable.setLevel(level); + } + return false; + } + + @Override + protected boolean onStateChange(int[] state) { + if (mLastDrawable != null) { + return mLastDrawable.setState(state); + } + if (mCurrDrawable != null) { + return mCurrDrawable.setState(state); + } + return false; + } + + @Override + public void scheduleDrawable(Drawable who, Runnable what, long when) { + if (who == mCurrDrawable && getCallback() != null) { + getCallback().scheduleDrawable(this, what, when); + } + } + + public boolean selectDrawable(int idx) { + if (idx == mCurIndex) { + return false; + } + final long now = SystemClock.uptimeMillis(); + if (mDrawableContainerState.mExitFadeDuration > 0) { + if (mLastDrawable != null) { + mLastDrawable.setVisible(false, false); + } + if (mCurrDrawable != null) { + mLastDrawable = mCurrDrawable; + mExitAnimationEnd = now + mDrawableContainerState.mExitFadeDuration; + } else { + mLastDrawable = null; + mExitAnimationEnd = 0; + } + } else if (mCurrDrawable != null) { + mCurrDrawable.setVisible(false, false); + } + + if (idx >= 0 && idx < mDrawableContainerState.mNumChildren) { + Drawable d = mDrawableContainerState.mDrawables[idx]; + mCurrDrawable = d; + mCurIndex = idx; + if (d != null) { + if (mDrawableContainerState.mEnterFadeDuration > 0) { + mEnterAnimationEnd = now + mDrawableContainerState.mEnterFadeDuration; + } else { + d.setAlpha(mAlpha); + } + d.setVisible(isVisible(), true); + d.setDither(mDrawableContainerState.mDither); + d.setColorFilter(mColorFilter); + d.setState(getState()); + d.setLevel(getLevel()); + d.setBounds(getBounds()); + } + } else { + mCurrDrawable = null; + mCurIndex = -1; + } + + if (mEnterAnimationEnd != 0 || mExitAnimationEnd != 0) { + if (mAnimationRunnable == null) { + mAnimationRunnable = new Runnable() { + @Override + public void run() { + animate(true); + invalidateSelf(); + } + }; + } else { + unscheduleSelf(mAnimationRunnable); + } + animate(true); + } + + invalidateSelf(); + + return true; + } + + /** + * TODO + * + * @Override public Insets getLayoutInsets() { return (mCurrDrawable == + * null) ? Insets.NONE : mCurrDrawable.getLayoutInsets(); } + */ + + @Override + public void setAlpha(int alpha) { + if (mAlpha != alpha) { + mAlpha = alpha; + if (mCurrDrawable != null) { + if (mEnterAnimationEnd == 0) { + mCurrDrawable.setAlpha(alpha); + } else { + animate(false); + } + } + } + } + + @Override + public void setColorFilter(ColorFilter cf) { + if (mColorFilter != cf) { + mColorFilter = cf; + if (mCurrDrawable != null) { + mCurrDrawable.setColorFilter(cf); + } + } + } + + protected void setConstantState(DrawableContainerState state) + { + mDrawableContainerState = state; + } + + @Override + public void setDither(boolean dither) { + if (mDrawableContainerState.mDither != dither) { + mDrawableContainerState.mDither = dither; + if (mCurrDrawable != null) { + mCurrDrawable.setDither(mDrawableContainerState.mDither); + } + } + } + + public void setEnterFadeDuration(int ms) { + mDrawableContainerState.mEnterFadeDuration = ms; + } + + public void setExitFadeDuration(int ms) { + mDrawableContainerState.mExitFadeDuration = ms; + } + + @Override + public boolean setVisible(boolean visible, boolean restart) { + boolean changed = super.setVisible(visible, restart); + if (mLastDrawable != null) { + mLastDrawable.setVisible(visible, restart); + } + if (mCurrDrawable != null) { + mCurrDrawable.setVisible(visible, restart); + } + return changed; + } + + @Override + public void unscheduleDrawable(Drawable who, Runnable what) { + if (who == mCurrDrawable && getCallback() != null) { + getCallback().unscheduleDrawable(this, what); + } + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/drawable/LayerDrawable.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/drawable/LayerDrawable.java new file mode 100644 index 0000000000..c663f2feb6 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/drawable/LayerDrawable.java @@ -0,0 +1,584 @@ + +package org.holoeverywhere.drawable; + +import java.io.IOException; + +import org.holoeverywhere.R; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.ColorFilter; +import android.graphics.PixelFormat; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.os.Build.VERSION; +import android.os.Build.VERSION_CODES; +import android.util.AttributeSet; +import android.view.View; + +public class LayerDrawable extends Drawable implements Drawable.Callback { + static class ChildDrawable { + public Drawable mDrawable; + public int mId; + public int mInsetL, mInsetT, mInsetR, mInsetB; + } + + static class LayerState extends ConstantState { + private boolean mCanConstantState; + int mChangingConfigurations; + private boolean mCheckedConstantState; + ChildDrawable[] mChildren; + int mChildrenChangingConfigurations; + private boolean mHaveOpacity = false; + private boolean mHaveStateful = false; + int mNum; + private int mOpacity; + private boolean mStateful; + + LayerState(LayerState orig, LayerDrawable owner, Resources res) { + if (orig != null) { + final ChildDrawable[] origChildDrawable = orig.mChildren; + final int N = orig.mNum; + mNum = N; + mChildren = new ChildDrawable[N]; + mChangingConfigurations = orig.mChangingConfigurations; + mChildrenChangingConfigurations = orig.mChildrenChangingConfigurations; + for (int i = 0; i < N; i++) { + final ChildDrawable r = mChildren[i] = new ChildDrawable(); + final ChildDrawable or = origChildDrawable[i]; + if (res != null) { + r.mDrawable = or.mDrawable.getConstantState().newDrawable(res); + } else { + r.mDrawable = or.mDrawable.getConstantState().newDrawable(); + } + r.mDrawable.setCallback(owner); + r.mInsetL = or.mInsetL; + r.mInsetT = or.mInsetT; + r.mInsetR = or.mInsetR; + r.mInsetB = or.mInsetB; + r.mId = or.mId; + } + mHaveOpacity = orig.mHaveOpacity; + mOpacity = orig.mOpacity; + mHaveStateful = orig.mHaveStateful; + mStateful = orig.mStateful; + mCheckedConstantState = mCanConstantState = true; + } else { + mNum = 0; + mChildren = null; + } + } + + public boolean canConstantState() { + if (!mCheckedConstantState && mChildren != null) { + mCanConstantState = true; + final int N = mNum; + for (int i = 0; i < N; i++) { + if (mChildren[i].mDrawable.getConstantState() == null) { + mCanConstantState = false; + break; + } + } + mCheckedConstantState = true; + } + return mCanConstantState; + } + + @Override + public int getChangingConfigurations() { + return mChangingConfigurations; + } + + public final int getOpacity() { + if (mHaveOpacity) { + return mOpacity; + } + final int N = mNum; + int op = N > 0 ? mChildren[0].mDrawable.getOpacity() : PixelFormat.TRANSPARENT; + for (int i = 1; i < N; i++) { + op = Drawable.resolveOpacity(op, mChildren[i].mDrawable.getOpacity()); + } + mOpacity = op; + mHaveOpacity = true; + return op; + } + + public final boolean isStateful() { + if (mHaveStateful) { + return mStateful; + } + boolean stateful = false; + final int N = mNum; + for (int i = 0; i < N; i++) { + if (mChildren[i].mDrawable.isStateful()) { + stateful = true; + break; + } + } + mStateful = stateful; + mHaveStateful = true; + return stateful; + } + + @Override + public Drawable newDrawable() { + return new LayerDrawable(this, null); + } + + @Override + public Drawable newDrawable(Resources res) { + return new LayerDrawable(this, res); + } + } + + LayerState mLayerState; + private boolean mMutated; + private int mOpacityOverride = PixelFormat.UNKNOWN; + private int[] mPaddingB; + private int[] mPaddingL; + private int[] mPaddingR; + + private int[] mPaddingT; + + private final Rect mTmpRect = new Rect(); + + LayerDrawable() { + this((LayerState) null, null); + } + + public LayerDrawable(Drawable[] layers) { + this(layers, null); + } + + LayerDrawable(Drawable[] layers, LayerState state) { + this(state, null); + int length = layers.length; + ChildDrawable[] r = new ChildDrawable[length]; + + for (int i = 0; i < length; i++) { + r[i] = new ChildDrawable(); + r[i].mDrawable = layers[i]; + layers[i].setCallback(this); + mLayerState.mChildrenChangingConfigurations |= layers[i].getChangingConfigurations(); + } + mLayerState.mNum = length; + mLayerState.mChildren = r; + + ensurePadding(); + } + + LayerDrawable(LayerState state, Resources res) { + LayerState as = createConstantState(state, res); + mLayerState = as; + if (as.mNum > 0) { + ensurePadding(); + } + } + + private void addLayer(Drawable layer, int id, int left, int top, int right, int bottom) { + final LayerState st = mLayerState; + int N = st.mChildren != null ? st.mChildren.length : 0; + int i = st.mNum; + if (i >= N) { + ChildDrawable[] nu = new ChildDrawable[N + 10]; + if (i > 0) { + System.arraycopy(st.mChildren, 0, nu, 0, i); + } + st.mChildren = nu; + } + mLayerState.mChildrenChangingConfigurations |= layer.getChangingConfigurations(); + ChildDrawable childDrawable = new ChildDrawable(); + st.mChildren[i] = childDrawable; + childDrawable.mId = id; + childDrawable.mDrawable = layer; + childDrawable.mInsetL = left; + childDrawable.mInsetT = top; + childDrawable.mInsetR = right; + childDrawable.mInsetB = bottom; + st.mNum++; + layer.setCallback(this); + } + + LayerState createConstantState(LayerState state, Resources res) { + return new LayerState(state, this, res); + } + + @Override + public void draw(Canvas canvas) { + final ChildDrawable[] array = mLayerState.mChildren; + final int N = mLayerState.mNum; + for (int i = 0; i < N; i++) { + array[i].mDrawable.draw(canvas); + } + } + + private void ensurePadding() { + final int N = mLayerState.mNum; + if (mPaddingL != null && mPaddingL.length >= N) { + return; + } + mPaddingL = new int[N]; + mPaddingT = new int[N]; + mPaddingR = new int[N]; + mPaddingB = new int[N]; + } + + public Drawable findDrawableByLayerId(int id) { + final ChildDrawable[] layers = mLayerState.mChildren; + for (int i = mLayerState.mNum - 1; i >= 0; i--) { + if (layers[i].mId == id) { + return layers[i].mDrawable; + } + } + return null; + } + + @Override + public Callback getCallback() { + if (VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB) { + return super.getCallback(); + } else { + return null; + } + } + + @Override + public int getChangingConfigurations() { + return super.getChangingConfigurations() + | mLayerState.mChangingConfigurations + | mLayerState.mChildrenChangingConfigurations; + } + + @Override + public ConstantState getConstantState() { + if (mLayerState.canConstantState()) { + mLayerState.mChangingConfigurations = getChangingConfigurations(); + return mLayerState; + } + return null; + } + + public Drawable getDrawable(int index) { + return mLayerState.mChildren[index].mDrawable; + } + + public int getId(int index) { + return mLayerState.mChildren[index].mId; + } + + @Override + public int getIntrinsicHeight() { + int height = -1; + final ChildDrawable[] array = mLayerState.mChildren; + final int N = mLayerState.mNum; + int padT = 0, padB = 0; + for (int i = 0; i < N; i++) { + final ChildDrawable r = array[i]; + int h = r.mDrawable.getIntrinsicHeight() + r.mInsetT + r.mInsetB + +padT + padB; + if (h > height) { + height = h; + } + padT += mPaddingT[i]; + padB += mPaddingB[i]; + } + return height; + } + + @Override + public int getIntrinsicWidth() { + int width = -1; + final ChildDrawable[] array = mLayerState.mChildren; + final int N = mLayerState.mNum; + int padL = 0, padR = 0; + for (int i = 0; i < N; i++) { + final ChildDrawable r = array[i]; + int w = r.mDrawable.getIntrinsicWidth() + + r.mInsetL + r.mInsetR + padL + padR; + if (w > width) { + width = w; + } + padL += mPaddingL[i]; + padR += mPaddingR[i]; + } + return width; + } + + public int getNumberOfLayers() { + return mLayerState.mNum; + } + + @Override + public int getOpacity() { + if (mOpacityOverride != PixelFormat.UNKNOWN) { + return mOpacityOverride; + } + return mLayerState.getOpacity(); + } + + @Override + public boolean getPadding(Rect padding) { + padding.left = 0; + padding.top = 0; + padding.right = 0; + padding.bottom = 0; + final ChildDrawable[] array = mLayerState.mChildren; + final int N = mLayerState.mNum; + for (int i = 0; i < N; i++) { + reapplyPadding(i, array[i]); + padding.left += mPaddingL[i]; + padding.top += mPaddingT[i]; + padding.right += mPaddingR[i]; + padding.bottom += mPaddingB[i]; + } + return true; + } + + @Override + public void inflate(Resources r, XmlPullParser parser, AttributeSet attrs) + throws XmlPullParserException, IOException { + super.inflate(r, parser, attrs); + int type; + TypedArray a = r.obtainAttributes(attrs, R.styleable.LayerDrawable); + mOpacityOverride = a.getInt(R.styleable.LayerDrawable_android_opacity, + PixelFormat.UNKNOWN); + a.recycle(); + final int innerDepth = parser.getDepth() + 1; + int depth; + while ((type = parser.next()) != XmlPullParser.END_DOCUMENT + && ((depth = parser.getDepth()) >= innerDepth || type != XmlPullParser.END_TAG)) { + if (type != XmlPullParser.START_TAG) { + continue; + } + if (depth > innerDepth || !parser.getName().equals("item")) { + continue; + } + a = r.obtainAttributes(attrs, R.styleable.LayerDrawableItem); + int left = a.getDimensionPixelOffset(R.styleable.LayerDrawableItem_android_left, 0); + int top = a.getDimensionPixelOffset(R.styleable.LayerDrawableItem_android_top, 0); + int right = a.getDimensionPixelOffset(R.styleable.LayerDrawableItem_android_right, 0); + int bottom = a.getDimensionPixelOffset(R.styleable.LayerDrawableItem_android_bottom, 0); + int drawableRes = a.getResourceId(R.styleable.LayerDrawableItem_android_drawable, 0); + int id = a.getResourceId(R.styleable.LayerDrawableItem_android_id, View.NO_ID); + a.recycle(); + Drawable dr; + if (drawableRes != 0) { + dr = DrawableCompat.getDrawable(r, drawableRes); + } else { + while ((type = parser.next()) == XmlPullParser.TEXT) { + } + if (type != XmlPullParser.START_TAG) { + throw new XmlPullParserException(parser.getPositionDescription() + + ": tag requires a 'drawable' attribute or " + + "child tag defining a drawable"); + } + dr = DrawableCompat.createFromXmlInner(r, parser, attrs); + } + addLayer(dr, id, left, top, right, bottom); + } + ensurePadding(); + onStateChange(getState()); + } + + @Override + public void invalidateDrawable(Drawable who) { + final Callback callback = getCallback(); + if (callback != null) { + callback.invalidateDrawable(this); + } + } + + @Override + public boolean isStateful() { + return mLayerState.isStateful(); + } + + @Override + public Drawable mutate() { + if (!mMutated && super.mutate() == this) { + if (!mLayerState.canConstantState()) { + throw new IllegalStateException("One or more children of this LayerDrawable does " + + "not have constant state; this drawable cannot be mutated."); + } + mLayerState = new LayerState(mLayerState, this, null); + final ChildDrawable[] array = mLayerState.mChildren; + final int N = mLayerState.mNum; + for (int i = 0; i < N; i++) { + array[i].mDrawable.mutate(); + } + mMutated = true; + } + return this; + } + + @Override + protected void onBoundsChange(Rect bounds) { + final ChildDrawable[] array = mLayerState.mChildren; + final int N = mLayerState.mNum; + int padL = 0, padT = 0, padR = 0, padB = 0; + for (int i = 0; i < N; i++) { + final ChildDrawable r = array[i]; + r.mDrawable.setBounds(bounds.left + r.mInsetL + padL, + bounds.top + r.mInsetT + padT, + bounds.right - r.mInsetR - padR, + bounds.bottom - r.mInsetB - padB); + padL += mPaddingL[i]; + padR += mPaddingR[i]; + padT += mPaddingT[i]; + padB += mPaddingB[i]; + } + } + + @Override + protected boolean onLevelChange(int level) { + final ChildDrawable[] array = mLayerState.mChildren; + final int N = mLayerState.mNum; + boolean paddingChanged = false; + boolean changed = false; + for (int i = 0; i < N; i++) { + final ChildDrawable r = array[i]; + if (r.mDrawable.setLevel(level)) { + changed = true; + } + if (reapplyPadding(i, r)) { + paddingChanged = true; + } + } + if (paddingChanged) { + onBoundsChange(getBounds()); + } + return changed; + } + + @Override + protected boolean onStateChange(int[] state) { + final ChildDrawable[] array = mLayerState.mChildren; + final int N = mLayerState.mNum; + boolean paddingChanged = false; + boolean changed = false; + for (int i = 0; i < N; i++) { + final ChildDrawable r = array[i]; + if (r.mDrawable.setState(state)) { + changed = true; + } + if (reapplyPadding(i, r)) { + paddingChanged = true; + } + } + if (paddingChanged) { + onBoundsChange(getBounds()); + } + if (changed) { + invalidateSelf(); + } + return changed; + } + + private boolean reapplyPadding(int i, ChildDrawable r) { + final Rect rect = mTmpRect; + r.mDrawable.getPadding(rect); + if (rect.left != mPaddingL[i] || rect.top != mPaddingT[i] || + rect.right != mPaddingR[i] || rect.bottom != mPaddingB[i]) { + mPaddingL[i] = rect.left; + mPaddingT[i] = rect.top; + mPaddingR[i] = rect.right; + mPaddingB[i] = rect.bottom; + return true; + } + return false; + } + + @Override + public void scheduleDrawable(Drawable who, Runnable what, long when) { + final Callback callback = getCallback(); + if (callback != null) { + callback.scheduleDrawable(this, what, when); + } + } + + @Override + public void setAlpha(int alpha) { + final ChildDrawable[] array = mLayerState.mChildren; + final int N = mLayerState.mNum; + for (int i = 0; i < N; i++) { + array[i].mDrawable.setAlpha(alpha); + } + } + + @Override + public void setColorFilter(ColorFilter cf) { + final ChildDrawable[] array = mLayerState.mChildren; + final int N = mLayerState.mNum; + for (int i = 0; i < N; i++) { + array[i].mDrawable.setColorFilter(cf); + } + } + + @Override + public void setDither(boolean dither) { + final ChildDrawable[] array = mLayerState.mChildren; + final int N = mLayerState.mNum; + for (int i = 0; i < N; i++) { + array[i].mDrawable.setDither(dither); + } + } + + public boolean setDrawableByLayerId(int id, Drawable drawable) { + final ChildDrawable[] layers = mLayerState.mChildren; + for (int i = mLayerState.mNum - 1; i >= 0; i--) { + if (layers[i].mId == id) { + if (layers[i].mDrawable != null) { + if (drawable != null) { + Rect bounds = layers[i].mDrawable.getBounds(); + drawable.setBounds(bounds); + } + layers[i].mDrawable.setCallback(null); + } + if (drawable != null) { + drawable.setCallback(this); + } + layers[i].mDrawable = drawable; + return true; + } + } + + return false; + } + + public void setId(int index, int id) { + mLayerState.mChildren[index].mId = id; + } + + public void setLayerInset(int index, int l, int t, int r, int b) { + ChildDrawable childDrawable = mLayerState.mChildren[index]; + childDrawable.mInsetL = l; + childDrawable.mInsetT = t; + childDrawable.mInsetR = r; + childDrawable.mInsetB = b; + } + + public void setOpacity(int opacity) { + mOpacityOverride = opacity; + } + + @Override + public boolean setVisible(boolean visible, boolean restart) { + boolean changed = super.setVisible(visible, restart); + final ChildDrawable[] array = mLayerState.mChildren; + final int N = mLayerState.mNum; + for (int i = 0; i < N; i++) { + array[i].mDrawable.setVisible(visible, restart); + } + return changed; + } + + @Override + public void unscheduleDrawable(Drawable who, Runnable what) { + final Callback callback = getCallback(); + if (callback != null) { + callback.unscheduleDrawable(this, what); + } + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/drawable/RotateDrawable.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/drawable/RotateDrawable.java new file mode 100644 index 0000000000..9c7ae86411 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/drawable/RotateDrawable.java @@ -0,0 +1,300 @@ + +package org.holoeverywhere.drawable; + +import java.io.IOException; + +import org.holoeverywhere.R; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.ColorFilter; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.util.Log; +import android.util.TypedValue; + +public class RotateDrawable extends Drawable implements Drawable.Callback { + /** + *

    + * Represents the state of a rotation for a given drawable. The same rotate + * drawable can be invoked with different states to drive several rotations + * at the same time. + *

    + */ + final static class RotateState extends Drawable.ConstantState { + private boolean mCanConstantState; + + int mChangingConfigurations; + + private boolean mCheckedConstantState; + float mCurrentDegrees; + Drawable mDrawable; + float mFromDegrees; + + float mPivotX; + boolean mPivotXRel; + + float mPivotY; + + boolean mPivotYRel; + float mToDegrees; + + public RotateState(RotateState source, RotateDrawable owner, Resources res) { + if (source != null) { + if (res != null) { + mDrawable = source.mDrawable.getConstantState().newDrawable(res); + } else { + mDrawable = source.mDrawable.getConstantState().newDrawable(); + } + mDrawable.setCallback(owner); + mPivotXRel = source.mPivotXRel; + mPivotX = source.mPivotX; + mPivotYRel = source.mPivotYRel; + mPivotY = source.mPivotY; + mFromDegrees = mCurrentDegrees = source.mFromDegrees; + mToDegrees = source.mToDegrees; + mCanConstantState = mCheckedConstantState = true; + } + } + + public boolean canConstantState() { + if (!mCheckedConstantState) { + mCanConstantState = mDrawable.getConstantState() != null; + mCheckedConstantState = true; + } + + return mCanConstantState; + } + + @Override + public int getChangingConfigurations() { + return mChangingConfigurations; + } + + @Override + public Drawable newDrawable() { + return new RotateDrawable(this, null); + } + + @Override + public Drawable newDrawable(Resources res) { + return new RotateDrawable(this, res); + } + } + + private static final float MAX_LEVEL = 10000.0f; + private boolean mMutated; + + private RotateState mState; + + public RotateDrawable() { + this(null, null); + } + + private RotateDrawable(RotateState rotateState, Resources res) { + mState = new RotateState(rotateState, this, res); + } + + @Override + public void draw(Canvas canvas) { + int saveCount = canvas.save(); + Rect bounds = mState.mDrawable.getBounds(); + int w = bounds.right - bounds.left; + int h = bounds.bottom - bounds.top; + final RotateState st = mState; + float px = st.mPivotXRel ? w * st.mPivotX : st.mPivotX; + float py = st.mPivotYRel ? h * st.mPivotY : st.mPivotY; + canvas.rotate(st.mCurrentDegrees, px + bounds.left, py + bounds.top); + st.mDrawable.draw(canvas); + canvas.restoreToCount(saveCount); + } + + @Override + public int getChangingConfigurations() { + return super.getChangingConfigurations() + | mState.mChangingConfigurations + | mState.mDrawable.getChangingConfigurations(); + } + + @Override + public ConstantState getConstantState() { + if (mState.canConstantState()) { + mState.mChangingConfigurations = getChangingConfigurations(); + return mState; + } + return null; + } + + public Drawable getDrawable() { + return mState.mDrawable; + } + + @Override + public int getIntrinsicHeight() { + return mState.mDrawable.getIntrinsicHeight(); + } + + @Override + public int getIntrinsicWidth() { + return mState.mDrawable.getIntrinsicWidth(); + } + + @Override + public int getOpacity() { + return mState.mDrawable.getOpacity(); + } + + @Override + public boolean getPadding(Rect padding) { + return mState.mDrawable.getPadding(padding); + } + + @Override + public void inflate(Resources r, XmlPullParser parser, AttributeSet attrs) + throws XmlPullParserException, IOException { + super.inflate(r, parser, attrs); + TypedArray a = r.obtainAttributes(attrs, + R.styleable.RotateDrawable); + super.setVisible(a.getBoolean(R.styleable.RotateDrawable_android_visible, true), false); + TypedValue tv = a.peekValue(R.styleable.RotateDrawable_android_pivotX); + boolean pivotXRel; + float pivotX; + if (tv == null) { + pivotXRel = true; + pivotX = 0.5f; + } else { + pivotXRel = tv.type == TypedValue.TYPE_FRACTION; + pivotX = pivotXRel ? tv.getFraction(1.0f, 1.0f) : tv.getFloat(); + } + tv = a.peekValue(R.styleable.RotateDrawable_android_pivotY); + boolean pivotYRel; + float pivotY; + if (tv == null) { + pivotYRel = true; + pivotY = 0.5f; + } else { + pivotYRel = tv.type == TypedValue.TYPE_FRACTION; + pivotY = pivotYRel ? tv.getFraction(1.0f, 1.0f) : tv.getFloat(); + } + float fromDegrees = a.getFloat(R.styleable.RotateDrawable_android_fromDegrees, 0.0f); + float toDegrees = a.getFloat(R.styleable.RotateDrawable_android_toDegrees, 360.0f); + int res = a.getResourceId(R.styleable.RotateDrawable_android_drawable, 0); + Drawable drawable = null; + if (res > 0) { + drawable = r.getDrawable(res); + } + a.recycle(); + int outerDepth = parser.getDepth(); + int type; + while ((type = parser.next()) != XmlPullParser.END_DOCUMENT && + (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { + + if (type != XmlPullParser.START_TAG) { + continue; + } + + if ((drawable = Drawable.createFromXmlInner(r, parser, attrs)) == null) { + Log.w("drawable", "Bad element under : " + + parser.getName()); + } + } + + if (drawable == null) { + Log.w("drawable", "No drawable specified for "); + } + + mState.mDrawable = drawable; + mState.mPivotXRel = pivotXRel; + mState.mPivotX = pivotX; + mState.mPivotYRel = pivotYRel; + mState.mPivotY = pivotY; + mState.mFromDegrees = mState.mCurrentDegrees = fromDegrees; + mState.mToDegrees = toDegrees; + + if (drawable != null) { + drawable.setCallback(this); + } + } + + @Override + public void invalidateDrawable(Drawable who) { + final Callback callback = getCallback(); + if (callback != null) { + callback.invalidateDrawable(this); + } + } + + @Override + public boolean isStateful() { + return mState.mDrawable.isStateful(); + } + + @Override + public Drawable mutate() { + if (!mMutated && super.mutate() == this) { + mState.mDrawable.mutate(); + mMutated = true; + } + return this; + } + + @Override + protected void onBoundsChange(Rect bounds) { + mState.mDrawable.setBounds(bounds.left, bounds.top, + bounds.right, bounds.bottom); + } + + @Override + protected boolean onLevelChange(int level) { + mState.mDrawable.setLevel(level); + onBoundsChange(getBounds()); + mState.mCurrentDegrees = mState.mFromDegrees + + (mState.mToDegrees - mState.mFromDegrees) * + (level / MAX_LEVEL); + invalidateSelf(); + return true; + } + + @Override + protected boolean onStateChange(int[] state) { + boolean changed = mState.mDrawable.setState(state); + onBoundsChange(getBounds()); + return changed; + } + + @Override + public void scheduleDrawable(Drawable who, Runnable what, long when) { + final Callback callback = getCallback(); + if (callback != null) { + callback.scheduleDrawable(this, what, when); + } + } + + @Override + public void setAlpha(int alpha) { + mState.mDrawable.setAlpha(alpha); + } + + @Override + public void setColorFilter(ColorFilter cf) { + mState.mDrawable.setColorFilter(cf); + } + + @Override + public boolean setVisible(boolean visible, boolean restart) { + mState.mDrawable.setVisible(visible, restart); + return super.setVisible(visible, restart); + } + + @Override + public void unscheduleDrawable(Drawable who, Runnable what) { + final Callback callback = getCallback(); + if (callback != null) { + callback.unscheduleDrawable(this, what); + } + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/drawable/StateListDrawable.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/drawable/StateListDrawable.java new file mode 100644 index 0000000000..e584fafa3d --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/drawable/StateListDrawable.java @@ -0,0 +1,236 @@ + +package org.holoeverywhere.drawable; + +import java.io.IOException; + +import org.holoeverywhere.R; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.util.StateSet; + +public class StateListDrawable extends DrawableContainer { + static final class StateListState extends DrawableContainerState { + int[][] mStateSets; + + StateListState(StateListState orig, StateListDrawable owner, Resources res) { + super(orig, owner, res); + + if (orig != null) { + mStateSets = orig.mStateSets; + } else { + mStateSets = new int[getChildren().length][]; + } + } + + int addStateSet(int[] stateSet, Drawable drawable) { + final int pos = addChild(drawable); + mStateSets[pos] = stateSet; + return pos; + } + + @Override + public void growArray(int oldSize, int newSize) { + super.growArray(oldSize, newSize); + final int[][] newStateSets = new int[newSize][]; + System.arraycopy(mStateSets, 0, newStateSets, 0, oldSize); + mStateSets = newStateSets; + } + + private int indexOfStateSet(int[] stateSet) { + final int[][] stateSets = mStateSets; + final int N = getChildCount(); + for (int i = 0; i < N; i++) { + if (StateSet.stateSetMatches(stateSets[i], stateSet)) { + return i; + } + } + return -1; + } + + @Override + public Drawable newDrawable() { + return new StateListDrawable(this, null); + } + + @Override + public Drawable newDrawable(Resources res) { + return new StateListDrawable(this, res); + } + } + + private static final boolean DEFAULT_DITHER = true; + private boolean mMutated; + private final StateListState mStateListState; + + public StateListDrawable() { + this(null, null); + } + + private StateListDrawable(StateListState state, Resources res) { + StateListState as = new StateListState(state, this, res); + mStateListState = as; + setConstantState(as); + onStateChange(getState()); + } + + public void addState(int[] stateSet, Drawable drawable) { + if (drawable != null) { + mStateListState.addStateSet(stateSet, drawable); + // in case the new state matches our current state... + onStateChange(getState()); + } + } + + /** + * Gets the number of states contained in this drawable. + * + * @return The number of states contained in this drawable. + * @hide pending API council + * @see #getStateSet(int) + * @see #getStateDrawable(int) + */ + public int getStateCount() { + return mStateListState.getChildCount(); + } + + /** + * Gets the drawable at an index. + * + * @param index The index of the drawable. + * @return The drawable at the index. + * @hide pending API council + * @see #getStateCount() + * @see #getStateSet(int) + */ + public Drawable getStateDrawable(int index) { + return mStateListState.getChildren()[index]; + } + + /** + * Gets the index of the drawable with the provided state set. + * + * @param stateSet the state set to look up + * @return the index of the provided state set, or -1 if not found + * @hide pending API council + * @see #getStateDrawable(int) + * @see #getStateSet(int) + */ + public int getStateDrawableIndex(int[] stateSet) { + return mStateListState.indexOfStateSet(stateSet); + } + + StateListState getStateListState() { + return mStateListState; + } + + /** + * Gets the state set at an index. + * + * @param index The index of the state set. + * @return The state set at the index. + * @hide pending API council + * @see #getStateCount() + * @see #getStateDrawable(int) + */ + public int[] getStateSet(int index) { + return mStateListState.mStateSets[index]; + } + + @Override + public void inflate(Resources r, XmlPullParser parser, + AttributeSet attrs) + throws XmlPullParserException, IOException { + TypedArray a = r.obtainAttributes(attrs, + R.styleable.StateListDrawable); + super.setVisible(a.getBoolean(R.styleable.StateListDrawable_android_visible, true), false); + mStateListState.setVariablePadding(a.getBoolean( + R.styleable.StateListDrawable_android_variablePadding, false)); + mStateListState.setConstantSize(a.getBoolean( + R.styleable.StateListDrawable_android_constantSize, false)); + mStateListState.setEnterFadeDuration(a.getInt( + R.styleable.StateListDrawable_android_enterFadeDuration, 0)); + mStateListState.setExitFadeDuration(a.getInt( + R.styleable.StateListDrawable_android_exitFadeDuration, 0)); + setDither(a.getBoolean(R.styleable.StateListDrawable_android_dither, DEFAULT_DITHER)); + a.recycle(); + int type; + final int innerDepth = parser.getDepth() + 1; + int depth; + while ((type = parser.next()) != XmlPullParser.END_DOCUMENT + && ((depth = parser.getDepth()) >= innerDepth + || type != XmlPullParser.END_TAG)) { + if (type != XmlPullParser.START_TAG) { + continue; + } + if (depth > innerDepth || !parser.getName().equals("item")) { + continue; + } + int drawableRes = 0; + int i; + int j = 0; + final int numAttrs = attrs.getAttributeCount(); + int[] states = new int[numAttrs]; + for (i = 0; i < numAttrs; i++) { + final int stateResId = attrs.getAttributeNameResource(i); + if (stateResId == 0) { + break; + } + if (stateResId == android.R.attr.drawable) { + drawableRes = attrs.getAttributeResourceValue(i, 0); + } else { + states[j++] = attrs.getAttributeBooleanValue(i, false) + ? stateResId + : -stateResId; + } + } + states = StateSet.trimStateSet(states, j); + Drawable dr; + if (drawableRes != 0) { + dr = DrawableCompat.getDrawable(r, drawableRes); + } else { + while ((type = parser.next()) == XmlPullParser.TEXT) { + } + if (type != XmlPullParser.START_TAG) { + throw new XmlPullParserException( + parser.getPositionDescription() + + ": tag requires a 'drawable' attribute or " + + "child tag defining a drawable"); + } + dr = DrawableCompat.createFromXmlInner(r, parser, attrs); + } + mStateListState.addStateSet(states, dr); + } + onStateChange(getState()); + } + + @Override + public boolean isStateful() { + return true; + } + + @Override + public Drawable mutate() { + if (!mMutated && super.mutate() == this) { + mStateListState.mStateSets = mStateListState.mStateSets.clone(); + mMutated = true; + } + return this; + } + + @Override + protected boolean onStateChange(int[] stateSet) { + int idx = mStateListState.indexOfStateSet(stateSet); + if (idx < 0) { + idx = mStateListState.indexOfStateSet(StateSet.WILD_CARD); + } + if (selectDrawable(idx)) { + return true; + } + return super.onStateChange(stateSet); + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/internal/AlertController.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/internal/AlertController.java new file mode 100644 index 0000000000..e17e1d5d4b --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/internal/AlertController.java @@ -0,0 +1,811 @@ + +package org.holoeverywhere.internal; + +import java.lang.ref.WeakReference; + +import org.holoeverywhere.ArrayAdapter; +import org.holoeverywhere.LayoutInflater; +import org.holoeverywhere.R; +import org.holoeverywhere.app.AlertDialog; +import org.holoeverywhere.widget.Button; +import org.holoeverywhere.widget.CheckedTextView; +import org.holoeverywhere.widget.FrameLayout; +import org.holoeverywhere.widget.LinearLayout; +import org.holoeverywhere.widget.ListView; +import org.holoeverywhere.widget.TextView; + +import android.content.Context; +import android.content.DialogInterface; +import android.content.res.TypedArray; +import android.database.Cursor; +import android.graphics.drawable.Drawable; +import android.os.Handler; +import android.os.Message; +import android.support.v4.widget.CursorAdapter; +import android.support.v4.widget.SimpleCursorAdapter; +import android.text.TextUtils; +import android.util.TypedValue; +import android.view.Gravity; +import android.view.KeyEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; +import android.widget.AbsListView; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemClickListener; +import android.widget.FrameLayout.LayoutParams; +import android.widget.ImageView; +import android.widget.ListAdapter; +import android.widget.ScrollView; + +public class AlertController { + public static interface AlertDecorViewInstaller { + public void installDecorView(Context context, int layout); + } + + public static class AlertParams { + public interface OnPrepareListViewListener { + void onPrepareListView(ListView listView); + } + + public ListAdapter mAdapter; + public int mButtonBehavior = AlertDialog.DISMISS_ON_ALL; + public boolean mCancelable; + public int mCheckedItem = -1; + public boolean[] mCheckedItems; + public final Context mContext; + public Cursor mCursor; + public View mCustomTitleView; + public boolean mForceInverseBackground; + public Drawable mIcon; + public int mIconId = 0; + public final LayoutInflater mInflater; + public String mIsCheckedColumn; + public boolean mIsMultiChoice; + public boolean mIsSingleChoice; + public CharSequence[] mItems; + public String mLabelColumn; + public CharSequence mMessage; + public DialogInterface.OnClickListener mNegativeButtonListener; + public CharSequence mNegativeButtonText; + public DialogInterface.OnClickListener mNeutralButtonListener; + public CharSequence mNeutralButtonText; + public DialogInterface.OnCancelListener mOnCancelListener; + public DialogInterface.OnMultiChoiceClickListener mOnCheckboxClickListener; + public DialogInterface.OnClickListener mOnClickListener; + public DialogInterface.OnDismissListener mOnDismissListener; + public AdapterView.OnItemSelectedListener mOnItemSelectedListener; + public DialogInterface.OnKeyListener mOnKeyListener; + public OnPrepareListViewListener mOnPrepareListViewListener; + public DialogInterface.OnClickListener mPositiveButtonListener; + public CharSequence mPositiveButtonText; + public int mTheme; + public CharSequence mTitle; + public View mView; + public int mViewSpacingBottom; + public int mViewSpacingLeft; + public int mViewSpacingRight; + public boolean mViewSpacingSpecified = false; + public int mViewSpacingTop; + + public AlertParams(Context context) { + this(context, 0); + } + + public AlertParams(Context context, int theme) { + mContext = context; + mTheme = theme; + mCancelable = true; + mInflater = LayoutInflater.from(context); + } + + public void apply(AlertController dialog) { + if (mCustomTitleView != null) { + dialog.setCustomTitle(mCustomTitleView); + } else { + if (mTitle != null) { + dialog.setTitle(mTitle); + } + if (mIcon != null) { + dialog.setIcon(mIcon); + } + if (mIconId >= 0) { + dialog.setIcon(mIconId); + } + } + if (mMessage != null) { + dialog.setMessage(mMessage); + } + if (mPositiveButtonText != null) { + dialog.setButton(DialogInterface.BUTTON_POSITIVE, + mPositiveButtonText, mPositiveButtonListener, null); + } + if (mNegativeButtonText != null) { + dialog.setButton(DialogInterface.BUTTON_NEGATIVE, + mNegativeButtonText, mNegativeButtonListener, null); + } + if (mNeutralButtonText != null) { + dialog.setButton(DialogInterface.BUTTON_NEUTRAL, + mNeutralButtonText, mNeutralButtonListener, null); + } + dialog.setButtonBehavior(mButtonBehavior); + if (mForceInverseBackground) { + dialog.setInverseBackgroundForced(true); + } + if (mItems != null || mCursor != null || mAdapter != null) { + createListView(dialog); + } + if (mView != null) { + if (mViewSpacingSpecified) { + dialog.setView(mView, mViewSpacingLeft, mViewSpacingTop, + mViewSpacingRight, mViewSpacingBottom); + } else { + dialog.setView(mView); + } + } + } + + private void createListView(final AlertController dialog) { + final ListView listView = (ListView) mInflater + .inflate(dialog.mListLayout, null); + ListAdapter adapter; + if (mIsMultiChoice) { + if (mCursor == null) { + adapter = new ArrayAdapter(mContext, + dialog.mMultiChoiceItemLayout, android.R.id.text1, mItems) { + @Override + public View getView(int position, View convertView, + ViewGroup parent) { + View view = super.getView(position, convertView, + parent); + if (mCheckedItems != null) { + boolean isItemChecked = mCheckedItems[position]; + if (isItemChecked) { + listView.setItemChecked(position, true); + } + } + return view; + } + }; + } else { + adapter = new CursorAdapter(mContext, mCursor, false) { + private final int mIsCheckedIndex; + private final int mLabelIndex; + + { + final Cursor cursor = getCursor(); + mLabelIndex = cursor + .getColumnIndexOrThrow(mLabelColumn); + mIsCheckedIndex = cursor + .getColumnIndexOrThrow(mIsCheckedColumn); + } + + @Override + public void bindView(View view, Context context, + Cursor cursor) { + CheckedTextView text = (CheckedTextView) view + .findViewById(android.R.id.text1); + text.setText(cursor.getString(mLabelIndex)); + listView.setItemChecked(cursor.getPosition(), + cursor.getInt(mIsCheckedIndex) == 1); + } + + @Override + public View newView(Context context, Cursor cursor, + ViewGroup parent) { + return mInflater.inflate( + dialog.mMultiChoiceItemLayout, parent, + false); + } + + }; + } + } else { + int layout = mIsSingleChoice ? dialog.mSingleChoiceItemLayout + : dialog.mListItemLayout; + if (mCursor == null) { + adapter = mAdapter != null ? mAdapter + : new ArrayAdapter(mContext, layout, + android.R.id.text1, mItems); + } else { + adapter = new SimpleCursorAdapter(mContext, layout, + mCursor, new String[] { + mLabelColumn + }, + new int[] { + android.R.id.text1 + }, + CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER); + } + } + if (mOnPrepareListViewListener != null) { + mOnPrepareListViewListener.onPrepareListView(listView); + } + dialog.mAdapter = adapter; + dialog.mCheckedItem = mCheckedItem; + if (mOnClickListener != null) { + listView.setOnItemClickListener(new OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View v, + int position, long id) { + mOnClickListener.onClick(dialog.mDialogInterface, + position); + if (!mIsSingleChoice) { + dialog.mDialogInterface.dismiss(); + } + } + }); + } else if (mOnCheckboxClickListener != null) { + listView.setOnItemClickListener(new OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View v, + int position, long id) { + if (mCheckedItems != null) { + mCheckedItems[position] = listView + .isItemChecked(position); + } + mOnCheckboxClickListener.onClick( + dialog.mDialogInterface, position, + listView.isItemChecked(position)); + } + }); + } + if (mOnItemSelectedListener != null) { + listView.setOnItemSelectedListener(mOnItemSelectedListener); + } + if (mIsSingleChoice) { + listView.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE); + } else if (mIsMultiChoice) { + listView.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE); + } + dialog.mListView = listView; + } + } + + private static final class ButtonHandler extends Handler { + private static final int MSG_DISMISS_DIALOG = 1; + private WeakReference mDialog; + + public ButtonHandler(DialogInterface dialog) { + mDialog = new WeakReference(dialog); + } + + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case DialogInterface.BUTTON_POSITIVE: + case DialogInterface.BUTTON_NEGATIVE: + case DialogInterface.BUTTON_NEUTRAL: + ((DialogInterface.OnClickListener) msg.obj).onClick( + mDialog.get(), msg.what); + break; + + case MSG_DISMISS_DIALOG: + ((DialogInterface) msg.obj).dismiss(); + } + } + } + + static boolean canTextInput(View v) { + if (v.onCheckIsTextEditor()) { + return true; + } + if (!(v instanceof ViewGroup)) { + return false; + } + ViewGroup vg = (ViewGroup) v; + int i = vg.getChildCount(); + while (i > 0) { + i--; + v = vg.getChildAt(i); + if (AlertController.canTextInput(v)) { + return true; + } + } + return false; + } + + private static boolean shouldCenterSingleButton(Context context) { + TypedValue outValue = new TypedValue(); + context.getTheme().resolveAttribute(R.attr.alertDialogCenterButtons, + outValue, true); + return outValue.data != 0; + } + + private ListAdapter mAdapter; + private int mAlertDialogLayout; + private int mButtonBehavior = AlertDialog.DISMISS_ON_ALL; + private View.OnClickListener mButtonHandler = new View.OnClickListener() { + private boolean needToDismiss(int flag) { + return (mButtonBehavior & flag) == flag; + } + + @Override + public void onClick(View v) { + int button; + if (v == mButtonPositive) { + button = DialogInterface.BUTTON_POSITIVE; + } else if (v == mButtonNegative) { + button = DialogInterface.BUTTON_NEGATIVE; + } else if (v == mButtonNeutral) { + button = DialogInterface.BUTTON_NEUTRAL; + } else { + return; + } + boolean dismiss = false; + switch (button) { + case DialogInterface.BUTTON_POSITIVE: + send(mButtonPositiveMessage); + dismiss = needToDismiss(AlertDialog.DISMISS_ON_POSITIVE); + break; + case DialogInterface.BUTTON_NEGATIVE: + send(mButtonNegativeMessage); + dismiss = needToDismiss(AlertDialog.DISMISS_ON_NEGATIVE); + break; + case DialogInterface.BUTTON_NEUTRAL: + send(mButtonNeutralMessage); + dismiss = needToDismiss(AlertDialog.DISMISS_ON_NEUTRAL); + break; + } + if (dismiss) { + mHandler.obtainMessage(ButtonHandler.MSG_DISMISS_DIALOG, + mDialogInterface).sendToTarget(); + } + } + + private void send(Message m) { + if (m == null) { + return; + } + Message.obtain(m).sendToTarget(); + } + }; + private Button mButtonNegative; + private Message mButtonNegativeMessage; + private CharSequence mButtonNegativeText; + private Button mButtonNeutral; + private Message mButtonNeutralMessage; + private CharSequence mButtonNeutralText; + private Button mButtonPositive; + private Message mButtonPositiveMessage; + private CharSequence mButtonPositiveText; + private int mCheckedItem = -1; + private final Context mContext; + private View mCustomTitleView; + private final AlertDecorViewInstaller mDecorViewInstaller; + private final DialogInterface mDialogInterface; + private boolean mForceInverseBackground; + private Handler mHandler; + private Drawable mIcon; + private int mIconId = -1; + private ImageView mIconView; + private int mListItemLayout; + private int mListLayout; + private ListView mListView; + private CharSequence mMessage; + private TextView mMessageView; + private int mMultiChoiceItemLayout; + private ScrollView mScrollView; + private int mSingleChoiceItemLayout; + private CharSequence mTitle; + private TextView mTitleView; + private View mView; + private int mViewSpacingBottom; + private int mViewSpacingLeft; + private int mViewSpacingRight; + private boolean mViewSpacingSpecified = false; + private int mViewSpacingTop; + private final Window mWindow; + + public AlertController(Context context, DialogInterface di, Window window) { + this(context, di, window, null); + } + + public AlertController(Context context, DialogInterface di, Window window, + AlertDecorViewInstaller decorViewInstaller) { + mDecorViewInstaller = decorViewInstaller; + mContext = context; + mDialogInterface = di; + mWindow = window; + mHandler = new ButtonHandler(di); + TypedArray a = context.obtainStyledAttributes(null, + R.styleable.AlertDialog, R.attr.alertDialogStyle, + R.style.Holo_AlertDialog); + mAlertDialogLayout = a.getResourceId(R.styleable.AlertDialog_layout, + R.layout.alert_dialog_holo); + mListLayout = a.getResourceId(R.styleable.AlertDialog_listLayout, + R.layout.select_dialog_holo); + mMultiChoiceItemLayout = a.getResourceId( + R.styleable.AlertDialog_multiChoiceItemLayout, + R.layout.select_dialog_multichoice_holo); + mSingleChoiceItemLayout = a.getResourceId( + R.styleable.AlertDialog_singleChoiceItemLayout, + R.layout.select_dialog_singlechoice_holo); + mListItemLayout = a.getResourceId( + R.styleable.AlertDialog_listItemLayout, + R.layout.select_dialog_item_holo); + a.recycle(); + } + + private void centerButton(Button button) { + LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) button + .getLayoutParams(); + params.gravity = Gravity.CENTER_HORIZONTAL; + params.weight = 0.5f; + button.setLayoutParams(params); + View leftSpacer = mWindow.findViewById(R.id.leftSpacer); + if (leftSpacer != null) { + leftSpacer.setVisibility(View.VISIBLE); + } + View rightSpacer = mWindow.findViewById(R.id.rightSpacer); + if (rightSpacer != null) { + rightSpacer.setVisibility(View.VISIBLE); + } + } + + public Button getButton(int whichButton) { + switch (whichButton) { + case DialogInterface.BUTTON_POSITIVE: + return mButtonPositive; + case DialogInterface.BUTTON_NEGATIVE: + return mButtonNegative; + case DialogInterface.BUTTON_NEUTRAL: + return mButtonNeutral; + default: + return null; + } + } + + public ListView getListView() { + return mListView; + } + + public void installContent() { + mWindow.requestFeature(Window.FEATURE_NO_TITLE); + if (mView == null || !AlertController.canTextInput(mView)) { + mWindow.setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, + WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); + } + if (mDecorViewInstaller == null) { + mWindow.setContentView(LayoutInflater.inflate(mWindow.getContext(), + mAlertDialogLayout)); + } else { + mDecorViewInstaller.installDecorView(mContext, mAlertDialogLayout); + } + setupView(); + } + + public boolean onKeyDown(int keyCode, KeyEvent event) { + return mScrollView != null && mScrollView.executeKeyEvent(event); + } + + public boolean onKeyUp(int keyCode, KeyEvent event) { + return mScrollView != null && mScrollView.executeKeyEvent(event); + } + + private void setBackground(LinearLayout topPanel, + LinearLayout contentPanel, View customPanel, boolean hasButtons, + TypedArray a, boolean hasTitle, View buttonPanel) { + int fullDark = a.getResourceId(R.styleable.AlertDialog_fullDark, + R.drawable.dialog_full_holo_dark); + int topDark = a.getResourceId(R.styleable.AlertDialog_topDark, + R.drawable.dialog_top_holo_dark); + int centerDark = a.getResourceId(R.styleable.AlertDialog_centerDark, + R.drawable.dialog_middle_holo_dark); + int bottomDark = a.getResourceId(R.styleable.AlertDialog_bottomDark, + R.drawable.dialog_bottom_holo_dark); + int fullBright = a.getResourceId(R.styleable.AlertDialog_fullBright, + R.drawable.dialog_full_holo_dark); + int topBright = a.getResourceId(R.styleable.AlertDialog_topBright, + R.drawable.dialog_top_holo_dark); + int centerBright = a.getResourceId( + R.styleable.AlertDialog_centerBright, + R.drawable.dialog_middle_holo_dark); + int bottomBright = a.getResourceId( + R.styleable.AlertDialog_bottomBright, + R.drawable.dialog_bottom_holo_dark); + int bottomMedium = a.getResourceId( + R.styleable.AlertDialog_bottomMedium, + R.drawable.dialog_bottom_holo_dark); + View[] views = new View[4]; + boolean[] light = new boolean[4]; + View lastView = null; + boolean lastLight = false; + + int pos = 0; + if (hasTitle) { + views[pos] = topPanel; + light[pos] = false; + pos++; + } + views[pos] = contentPanel.getVisibility() == View.GONE ? null + : contentPanel; + light[pos] = mListView != null; + pos++; + if (customPanel != null) { + views[pos] = customPanel; + light[pos] = mForceInverseBackground; + pos++; + } + if (hasButtons) { + views[pos] = buttonPanel; + light[pos] = true; + } + boolean setView = false; + for (pos = 0; pos < views.length; pos++) { + View v = views[pos]; + if (v == null) { + continue; + } + if (lastView != null) { + if (!setView) { + lastView.setBackgroundResource(lastLight ? topBright + : topDark); + } else { + lastView.setBackgroundResource(lastLight ? centerBright + : centerDark); + } + setView = true; + } + lastView = v; + lastLight = light[pos]; + } + if (lastView != null) { + if (setView) { + lastView.setBackgroundResource(lastLight ? hasButtons ? bottomMedium + : bottomBright + : bottomDark); + } else { + lastView.setBackgroundResource(lastLight ? fullBright + : fullDark); + } + } + if (mListView != null && mAdapter != null) { + mListView.setAdapter(mAdapter); + if (mCheckedItem > -1) { + mListView.setItemChecked(mCheckedItem, true); + mListView.setSelection(mCheckedItem); + } + } + } + + public void setButton(int whichButton, CharSequence text, + DialogInterface.OnClickListener listener, Message msg) { + if (msg == null && listener != null) { + msg = mHandler.obtainMessage(whichButton, listener); + } + switch (whichButton) { + case DialogInterface.BUTTON_POSITIVE: + mButtonPositiveText = text; + mButtonPositiveMessage = msg; + break; + case DialogInterface.BUTTON_NEGATIVE: + mButtonNegativeText = text; + mButtonNegativeMessage = msg; + break; + case DialogInterface.BUTTON_NEUTRAL: + mButtonNeutralText = text; + mButtonNeutralMessage = msg; + break; + default: + throw new IllegalArgumentException("Button does not exist"); + } + } + + public void setButtonBehavior(int buttonBehavior) { + mButtonBehavior = buttonBehavior; + } + + public void setCustomTitle(View customTitleView) { + mCustomTitleView = customTitleView; + } + + public void setIcon(Drawable icon) { + mIcon = icon; + if (mIconView != null && mIcon != null) { + mIconView.setImageDrawable(icon); + } + } + + public void setIcon(int resId) { + mIconId = resId; + if (mIconView != null) { + if (resId > 0) { + mIconView.setImageResource(mIconId); + } else if (resId == 0) { + mIconView.setVisibility(View.GONE); + } + } + } + + public void setInverseBackgroundForced(boolean forceInverseBackground) { + mForceInverseBackground = forceInverseBackground; + } + + public void setMessage(CharSequence message) { + mMessage = message; + if (mMessageView != null) { + mMessageView.setText(message); + } + } + + public void setTitle(CharSequence title) { + mTitle = title; + if (mTitleView != null) { + mTitleView.setText(title); + } + } + + private boolean setupButtons() { + int BIT_BUTTON_POSITIVE = 1; + int BIT_BUTTON_NEGATIVE = 2; + int BIT_BUTTON_NEUTRAL = 4; + int whichButtons = 0; + mButtonPositive = (Button) mWindow.findViewById(R.id.button1); + mButtonPositive.setOnClickListener(mButtonHandler); + if (TextUtils.isEmpty(mButtonPositiveText)) { + mButtonPositive.setVisibility(View.GONE); + } else { + mButtonPositive.setText(mButtonPositiveText); + mButtonPositive.setVisibility(View.VISIBLE); + whichButtons = whichButtons | BIT_BUTTON_POSITIVE; + } + mButtonNegative = (Button) mWindow.findViewById(R.id.button2); + mButtonNegative.setOnClickListener(mButtonHandler); + if (TextUtils.isEmpty(mButtonNegativeText)) { + mButtonNegative.setVisibility(View.GONE); + } else { + mButtonNegative.setText(mButtonNegativeText); + mButtonNegative.setVisibility(View.VISIBLE); + + whichButtons = whichButtons | BIT_BUTTON_NEGATIVE; + } + mButtonNeutral = (Button) mWindow.findViewById(R.id.button3); + mButtonNeutral.setOnClickListener(mButtonHandler); + if (TextUtils.isEmpty(mButtonNeutralText)) { + mButtonNeutral.setVisibility(View.GONE); + } else { + mButtonNeutral.setText(mButtonNeutralText); + mButtonNeutral.setVisibility(View.VISIBLE); + + whichButtons = whichButtons | BIT_BUTTON_NEUTRAL; + } + if (AlertController.shouldCenterSingleButton(mContext)) { + if (whichButtons == BIT_BUTTON_POSITIVE) { + centerButton(mButtonPositive); + } else if (whichButtons == BIT_BUTTON_NEGATIVE) { + centerButton(mButtonNeutral); + } else if (whichButtons == BIT_BUTTON_NEUTRAL) { + centerButton(mButtonNeutral); + } + } + return whichButtons != 0; + } + + private void setupContent(LinearLayout contentPanel) { + mScrollView = (ScrollView) mWindow.findViewById(R.id.scrollView); + mScrollView.setFocusable(false); + mMessageView = (TextView) mWindow.findViewById(R.id.message); + if (mMessageView == null) { + return; + } + if (mMessage != null) { + mMessageView.setText(mMessage); + } else { + mMessageView.setVisibility(View.GONE); + mScrollView.removeView(mMessageView); + if (mListView != null) { + contentPanel.removeView(mWindow.findViewById(R.id.scrollView)); + contentPanel.addView(mListView, new LinearLayout.LayoutParams( + android.view.ViewGroup.LayoutParams.MATCH_PARENT, + android.view.ViewGroup.LayoutParams.MATCH_PARENT)); + contentPanel.setLayoutParams(new LinearLayout.LayoutParams( + android.view.ViewGroup.LayoutParams.MATCH_PARENT, 0, + 1.0f)); + } else { + contentPanel.setVisibility(View.GONE); + } + } + } + + private boolean setupTitle(LinearLayout topPanel) { + boolean hasTitle = true; + if (mCustomTitleView != null) { + LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT); + + topPanel.addView(mCustomTitleView, 0, lp); + View titleTemplate = mWindow.findViewById(R.id.title_template); + titleTemplate.setVisibility(View.GONE); + } else { + final boolean hasTextTitle = !TextUtils.isEmpty(mTitle); + mIconView = (ImageView) mWindow.findViewById(R.id.icon); + if (hasTextTitle) { + mTitleView = (TextView) mWindow.findViewById(R.id.alertTitle); + mTitleView.setText(mTitle); + if (mIconId > 0) { + mIconView.setImageResource(mIconId); + } else if (mIcon != null) { + mIconView.setImageDrawable(mIcon); + } else if (mIconId == 0) { + mTitleView.setPadding(mIconView.getPaddingLeft(), + mIconView.getPaddingTop(), + mIconView.getPaddingRight(), + mIconView.getPaddingBottom()); + mIconView.setVisibility(View.GONE); + } + } else { + View titleTemplate = mWindow.findViewById(R.id.title_template); + titleTemplate.setVisibility(View.GONE); + mIconView.setVisibility(View.GONE); + topPanel.setVisibility(View.GONE); + hasTitle = false; + } + } + return hasTitle; + } + + private void setupView() { + LinearLayout contentPanel = (LinearLayout) mWindow.findViewById(R.id.contentPanel); + setupContent(contentPanel); + boolean hasButtons = setupButtons(); + LinearLayout topPanel = (LinearLayout) mWindow.findViewById(R.id.topPanel); + TypedArray a = mContext.obtainStyledAttributes(null, + R.styleable.AlertDialog, R.attr.alertDialogStyle, R.style.Holo_AlertDialog); + boolean hasTitle = setupTitle(topPanel); + View buttonPanel = mWindow.findViewById(R.id.buttonPanel); + if (!hasButtons) { + buttonPanel.setVisibility(View.GONE); + // mWindow.setCloseOnTouchOutsideIfNotSet(true); + } + FrameLayout customPanel = null; + if (mView != null) { + customPanel = (FrameLayout) mWindow.findViewById(R.id.customPanel); + FrameLayout custom = (FrameLayout) mWindow.findViewById(R.id.custom); + custom.addView(mView, new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT)); + if (mViewSpacingSpecified) { + custom.setPadding(mViewSpacingLeft, mViewSpacingTop, + mViewSpacingRight, mViewSpacingBottom); + } + if (mListView != null) { + ((LinearLayout.LayoutParams) customPanel.getLayoutParams()).weight = 0; + } + } else { + mWindow.findViewById(R.id.customPanel).setVisibility(View.GONE); + } + + if (hasTitle) { + View divider = null; + if (mMessage != null || mView != null || mListView != null) { + divider = mWindow.findViewById(R.id.titleDivider); + } else { + divider = mWindow.findViewById(R.id.titleDividerTop); + } + + if (divider != null) { + divider.setVisibility(View.VISIBLE); + } + } + setBackground(topPanel, contentPanel, customPanel, hasButtons, a, + hasTitle, buttonPanel); + a.recycle(); + } + + public void setView(View view) { + mView = view; + mViewSpacingSpecified = false; + } + + public void setView(View view, int viewSpacingLeft, int viewSpacingTop, + int viewSpacingRight, int viewSpacingBottom) { + mView = view; + mViewSpacingSpecified = true; + mViewSpacingLeft = viewSpacingLeft; + mViewSpacingTop = viewSpacingTop; + mViewSpacingRight = viewSpacingRight; + mViewSpacingBottom = viewSpacingBottom; + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/internal/DialogTitle.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/internal/DialogTitle.java new file mode 100644 index 0000000000..a266ce4da2 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/internal/DialogTitle.java @@ -0,0 +1,53 @@ + +package org.holoeverywhere.internal; + +import org.holoeverywhere.R; +import org.holoeverywhere.widget.TextView; + +import android.content.Context; +import android.content.res.TypedArray; +import android.text.Layout; +import android.util.AttributeSet; +import android.util.TypedValue; + +public class DialogTitle extends TextView { + public DialogTitle(Context context) { + super(context); + } + + public DialogTitle(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public DialogTitle(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + final Layout layout = getLayout(); + if (layout != null) { + final int lineCount = layout.getLineCount(); + if (lineCount > 0) { + final int ellipsisCount = layout + .getEllipsisCount(lineCount - 1); + if (ellipsisCount > 0) { + setSingleLine(false); + setMaxLines(2); + final TypedArray a = getContext().obtainStyledAttributes( + null, R.styleable.TextAppearance, + android.R.attr.textAppearanceMedium, + R.style.Holo_TextAppearance_Medium); + final int textSize = a.getDimensionPixelSize( + R.styleable.TextAppearance_android_textSize, 0); + if (textSize != 0) { + setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize); + } + a.recycle(); + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + } + } + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/internal/GenericInflater.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/internal/GenericInflater.java new file mode 100644 index 0000000000..bdd63461b1 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/internal/GenericInflater.java @@ -0,0 +1,278 @@ + +package org.holoeverywhere.internal; + +import java.io.IOException; +import java.lang.reflect.Constructor; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +import android.content.Context; +import android.content.res.XmlResourceParser; +import android.util.AttributeSet; +import android.util.Xml; +import android.view.InflateException; + +public abstract class GenericInflater> { + public interface Factory { + public T onCreateItem(String name, Context context, AttributeSet attrs); + } + + public interface Parent { + public void addItemFromInflater(T child); + } + + private static final HashMap, Constructor> sConstructorMap = new HashMap, Constructor>(); + private ClassLoader mClassLoader; + protected final Object[] mConstructorArgs = new Object[2]; + protected final Class[] mConstructorSignature = new Class[] { + Context.class, AttributeSet.class + }; + private final Context mContext; + private final List> mFactoryList; + private final List mPackages = new ArrayList(); + + protected GenericInflater(Context context) { + mContext = context; + mFactoryList = new ArrayList>(); + } + + protected GenericInflater(GenericInflater original, Context newContext) { + mContext = newContext; + mFactoryList = new ArrayList>(original.mFactoryList); + } + + public void addFactory(Factory factory) { + mFactoryList.add(factory); + } + + public abstract GenericInflater cloneInContext(Context newContext); + + @SuppressWarnings("unchecked") + public final T createItem(String name, String prefix, AttributeSet attrs) + throws ClassNotFoundException, InflateException { + if (prefix != null) { + name = prefix + name; + } + Constructor constructor = GenericInflater.sConstructorMap.get(name); + try { + if (constructor == null) { + if (mClassLoader == null) { + mClassLoader = getClassLoader(); + if (mClassLoader == null) { + mClassLoader = mContext.getClassLoader(); + } + } + Class clazz = mClassLoader.loadClass(name); + constructor = findConstructor(clazz); + GenericInflater.sConstructorMap.put(clazz, constructor); + } + return (T) constructor.newInstance(obtainConstructorArgs(name, attrs, + constructor)); + } catch (NoSuchMethodException e) { + InflateException ie = new InflateException( + attrs.getPositionDescription() + ": Error inflating class " + name); + ie.initCause(e); + throw ie; + } catch (Exception e) { + InflateException ie = new InflateException( + attrs.getPositionDescription() + ": Error inflating class " + + constructor.toString()); + ie.initCause(e); + throw ie; + } + } + + private final T createItemFromTag(XmlPullParser parser, String name, + AttributeSet attrs) { + try { + T item = null; + for (Factory factory : mFactoryList) { + try { + item = factory.onCreateItem(name, mContext, attrs); + if (item != null) { + break; + } + } catch (Exception e) { + } + } + if (item == null) { + if (name.indexOf('.') < 0) { + item = onCreateItem(name, attrs); + } else { + item = createItem(name, null, attrs); + } + } + return item; + } catch (InflateException e) { + throw e; + } catch (ClassNotFoundException e) { + InflateException ie = new InflateException( + attrs.getPositionDescription() + ": Error inflating class " + + name); + ie.initCause(e); + throw ie; + } catch (Exception e) { + InflateException ie = new InflateException( + attrs.getPositionDescription() + ": Error inflating class " + + name); + ie.initCause(e); + throw ie; + } + } + + protected Constructor findConstructor(Class clazz) + throws NoSuchMethodException { + return clazz.getConstructor(mConstructorSignature); + } + + public ClassLoader getClassLoader() { + return mClassLoader; + } + + public Context getContext() { + return mContext; + } + + @Deprecated + public final Factory getFactory() { + return getFactory(0); + } + + public final Factory getFactory(int position) { + return mFactoryList.get(position); + } + + public final int getFactoryCount() { + return mFactoryList.size(); + } + + public T inflate(int resource) { + return inflate(resource, null, false); + } + + public T inflate(int resource, P root) { + return inflate(resource, root, root != null); + } + + public T inflate(int resource, P root, boolean attachToRoot) { + XmlResourceParser parser = getContext().getResources().getXml(resource); + try { + return inflate(parser, root, attachToRoot); + } finally { + parser.close(); + } + } + + public T inflate(XmlPullParser parser) { + return inflate(parser, null, false); + } + + public T inflate(XmlPullParser parser, P root) { + return inflate(parser, root, root != null); + } + + @SuppressWarnings("unchecked") + public synchronized T inflate(XmlPullParser parser, P root, boolean attachToRoot) { + final AttributeSet attrs = Xml.asAttributeSet(parser); + T result = (T) root; + try { + int type; + while ((type = parser.next()) != XmlPullParser.START_TAG + && type != XmlPullParser.END_DOCUMENT) { + ; + } + if (type != XmlPullParser.START_TAG) { + throw new InflateException(parser.getPositionDescription() + + ": No start tag found!"); + } + T xmlRoot = createItemFromTag(parser, parser.getName(), attrs); + result = (T) onMergeRoots(root, attachToRoot, (P) xmlRoot); + rInflate(parser, result, attrs); + } catch (InflateException e) { + throw e; + } catch (XmlPullParserException e) { + InflateException ex = new InflateException(e.getMessage()); + ex.initCause(e); + throw ex; + } catch (IOException e) { + InflateException ex = new InflateException( + parser.getPositionDescription() + ": " + e.getMessage()); + ex.initCause(e); + throw ex; + } + return result; + } + + protected Object[] obtainConstructorArgs(String name, AttributeSet attrs, + Constructor constructor) { + final Object[] args = mConstructorArgs; + args[0] = mContext; + args[1] = attrs; + return args; + } + + protected boolean onCreateCustomFromTag(XmlPullParser parser, T parent, + final AttributeSet attrs) throws XmlPullParserException { + return false; + } + + protected T onCreateItem(String name, AttributeSet attrs) + throws ClassNotFoundException { + for (String sPackage : mPackages) { + return createItem(name, sPackage + ".", attrs); + } + return null; + } + + protected P onMergeRoots(P givenRoot, boolean attachToGivenRoot, P xmlRoot) { + return xmlRoot; + } + + public void registerPackage(String name) { + name = Package.getPackage(name).getName(); + if (!mPackages.contains(name)) { + mPackages.add(name); + } + } + + public void removeFactory(Factory factory) { + mFactoryList.remove(factory); + } + + @SuppressWarnings("unchecked") + private void rInflate(XmlPullParser parser, T parent, + final AttributeSet attrs) throws XmlPullParserException, + IOException { + final int depth = parser.getDepth(); + int type; + while (((type = parser.next()) != XmlPullParser.END_TAG || parser + .getDepth() > depth) && type != XmlPullParser.END_DOCUMENT) { + if (type != XmlPullParser.START_TAG) { + continue; + } + if (onCreateCustomFromTag(parser, parent, attrs)) { + continue; + } + String name = parser.getName(); + T item = createItemFromTag(parser, name, attrs); + ((P) parent).addItemFromInflater(item); + rInflate(parser, item, attrs); + } + } + + public void setClassLoader(ClassLoader classLoader) { + mClassLoader = classLoader; + } + + public void setFactory(Factory factory) { + mFactoryList.add(0, factory); + } + + public void unregisterPackage(String string) { + mPackages.remove(string); + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/internal/NumberPickerEditText.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/internal/NumberPickerEditText.java new file mode 100644 index 0000000000..2a0d6fe739 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/internal/NumberPickerEditText.java @@ -0,0 +1,22 @@ + +package org.holoeverywhere.internal; + +import org.holoeverywhere.widget.EditText; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.inputmethod.EditorInfo; + +public class NumberPickerEditText extends EditText { + public NumberPickerEditText(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + public void onEditorAction(int actionCode) { + super.onEditorAction(actionCode); + if (actionCode == EditorInfo.IME_ACTION_DONE) { + clearFocus(); + } + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/internal/WindowDecorView.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/internal/WindowDecorView.java new file mode 100644 index 0000000000..0d7042de8e --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/internal/WindowDecorView.java @@ -0,0 +1,163 @@ + +package org.holoeverywhere.internal; + +import static android.view.View.MeasureSpec.AT_MOST; +import static android.view.View.MeasureSpec.EXACTLY; + +import org.holoeverywhere.R; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Rect; +import android.util.DisplayMetrics; +import android.util.TypedValue; + +import com.actionbarsherlock.internal.view.menu.ContextMenuDecorView; + +public class WindowDecorView extends ContextMenuDecorView { + private TypedValue mFixedHeightMajor; + private TypedValue mFixedHeightMinor; + private TypedValue mFixedWidthMajor; + private TypedValue mFixedWidthMinor; + private TypedValue mMinHeightMajor; + private TypedValue mMinHeightMinor; + private TypedValue mMinWidthMajor; + private TypedValue mMinWidthMinor; + + public WindowDecorView(Context context) { + super(context); + TypedArray a = context.obtainStyledAttributes(R.styleable.WindowSizes); + if (a.hasValue(R.styleable.WindowSizes_windowMinWidthMajor)) { + a.getValue(R.styleable.WindowSizes_windowMinWidthMajor, + mMinWidthMajor = new TypedValue()); + } + if (a.hasValue(R.styleable.WindowSizes_windowMinWidthMinor)) { + a.getValue(R.styleable.WindowSizes_windowMinWidthMinor, + mMinWidthMinor = new TypedValue()); + } + if (a.hasValue(R.styleable.WindowSizes_windowMinHeightMajor)) { + a.getValue(R.styleable.WindowSizes_windowMinHeightMajor, + mMinHeightMajor = new TypedValue()); + } + if (a.hasValue(R.styleable.WindowSizes_windowMinHeightMinor)) { + a.getValue(R.styleable.WindowSizes_windowMinHeightMinor, + mMinHeightMinor = new TypedValue()); + } + if (a.hasValue(R.styleable.WindowSizes_windowFixedWidthMajor)) { + a.getValue(R.styleable.WindowSizes_windowFixedWidthMajor, + mFixedWidthMajor = new TypedValue()); + } + if (a.hasValue(R.styleable.WindowSizes_windowFixedWidthMinor)) { + a.getValue(R.styleable.WindowSizes_windowFixedWidthMinor, + mFixedWidthMinor = new TypedValue()); + } + if (a.hasValue(R.styleable.WindowSizes_windowFixedHeightMajor)) { + a.getValue(R.styleable.WindowSizes_windowFixedHeightMajor, + mFixedHeightMajor = new TypedValue()); + } + if (a.hasValue(R.styleable.WindowSizes_windowFixedHeightMinor)) { + a.getValue(R.styleable.WindowSizes_windowFixedHeightMinor, + mFixedHeightMinor = new TypedValue()); + } + a.recycle(); + } + + @Override + protected boolean fitSystemWindows(Rect insets) { + int left = Math.max(getPaddingLeft(), insets.left); + int top = Math.max(getPaddingTop(), insets.top); + int right = Math.max(getPaddingRight(), insets.right); + int bottom = Math.max(getPaddingBottom(), insets.bottom); + setPadding(left, top, right, bottom); + return true; + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + final DisplayMetrics metrics = getContext().getResources().getDisplayMetrics(); + final boolean isPortrait = metrics.widthPixels < metrics.heightPixels; + final int widthMode = MeasureSpec.getMode(widthMeasureSpec); + final int heightMode = MeasureSpec.getMode(heightMeasureSpec); + boolean fixedWidth = false, fixedHeight = false; + if (widthMode == AT_MOST) { + final TypedValue tvw = isPortrait ? mFixedWidthMinor : mFixedWidthMajor; + if (tvw != null && tvw.type != TypedValue.TYPE_NULL) { + final int w; + if (tvw.type == TypedValue.TYPE_DIMENSION) { + w = (int) tvw.getDimension(metrics); + } else if (tvw.type == TypedValue.TYPE_FRACTION) { + w = (int) tvw.getFraction(metrics.widthPixels, metrics.widthPixels); + } else { + w = 0; + } + if (w > 0) { + widthMeasureSpec = MeasureSpec.makeMeasureSpec( + Math.min(w, MeasureSpec.getSize(widthMeasureSpec)), EXACTLY); + fixedWidth = true; + } + } + } + if (heightMode == AT_MOST) { + final TypedValue tvh = isPortrait ? mFixedHeightMajor : mFixedHeightMinor; + if (tvh != null && tvh.type != TypedValue.TYPE_NULL) { + final int h; + if (tvh.type == TypedValue.TYPE_DIMENSION) { + h = (int) tvh.getDimension(metrics); + } else if (tvh.type == TypedValue.TYPE_FRACTION) { + h = (int) tvh.getFraction(metrics.heightPixels, metrics.heightPixels); + } else { + h = 0; + } + if (h > 0) { + heightMeasureSpec = MeasureSpec.makeMeasureSpec( + Math.min(h, MeasureSpec.getSize(heightMeasureSpec)), EXACTLY); + fixedHeight = true; + } + } + } + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + int width = getMeasuredWidth(); + int height = getMeasuredHeight(); + boolean measure = false; + widthMeasureSpec = MeasureSpec.makeMeasureSpec(width, EXACTLY); + heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, EXACTLY); + if (!fixedWidth && widthMode == AT_MOST) { + final TypedValue tv = isPortrait ? mMinWidthMinor : mMinWidthMajor; + if (tv != null && 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; + } + } + } + if (!fixedHeight && heightMode == AT_MOST) { + final TypedValue tv = isPortrait ? mMinHeightMinor : mMinHeightMajor; + if (tv != null && 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.heightPixels, metrics.heightPixels); + } else { + min = 0; + } + if (height < min) { + heightMeasureSpec = MeasureSpec.makeMeasureSpec(min, EXACTLY); + measure = true; + } + } + } + if (measure) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/internal/_View.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/internal/_View.java new file mode 100644 index 0000000000..3754d77544 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/internal/_View.java @@ -0,0 +1,236 @@ + +package org.holoeverywhere.internal; + +import org.holoeverywhere.IHoloActivity; + +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.view.KeyEvent; +import android.view.accessibility.AccessibilityEventSource; + +import com.actionbarsherlock.view.ActionMode; + +public class _View extends android.view.View implements Drawable.Callback, + KeyEvent.Callback, AccessibilityEventSource { + public static final int[] PRESSED_STATE_SET, SUPPORT_EMPTY_STATE_SET, + SUPPORT_WINDOW_FOCUSED_STATE_SET, SUPPORT_SELECTED_STATE_SET, + SUPPORT_SELECTED_WINDOW_FOCUSED_STATE_SET, + SUPPORT_FOCUSED_STATE_SET, + SUPPORT_FOCUSED_WINDOW_FOCUSED_STATE_SET, + SUPPORT_FOCUSED_SELECTED_STATE_SET, + SUPPORT_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET, + SUPPORT_ENABLED_STATE_SET, + SUPPORT_ENABLED_WINDOW_FOCUSED_STATE_SET, + SUPPORT_ENABLED_SELECTED_STATE_SET, + SUPPORT_ENABLED_SELECTED_WINDOW_FOCUSED_STATE_SET, + SUPPORT_ENABLED_FOCUSED_STATE_SET, + SUPPORT_ENABLED_FOCUSED_WINDOW_FOCUSED_STATE_SET, + SUPPORT_ENABLED_FOCUSED_SELECTED_STATE_SET, + SUPPORT_ENABLED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET, + SUPPORT_PRESSED_WINDOW_FOCUSED_STATE_SET, + SUPPORT_PRESSED_STATE_SET, SUPPORT_PRESSED_SELECTED_STATE_SET, + SUPPORT_PRESSED_SELECTED_WINDOW_FOCUSED_STATE_SET, + SUPPORT_PRESSED_FOCUSED_STATE_SET, + SUPPORT_PRESSED_FOCUSED_WINDOW_FOCUSED_STATE_SET, + SUPPORT_PRESSED_FOCUSED_SELECTED_STATE_SET, + SUPPORT_PRESSED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET, + SUPPORT_PRESSED_ENABLED_STATE_SET, + SUPPORT_PRESSED_ENABLED_WINDOW_FOCUSED_STATE_SET, + SUPPORT_PRESSED_ENABLED_SELECTED_STATE_SET, + SUPPORT_PRESSED_ENABLED_SELECTED_WINDOW_FOCUSED_STATE_SET, + SUPPORT_PRESSED_ENABLED_FOCUSED_STATE_SET, + SUPPORT_PRESSED_ENABLED_FOCUSED_WINDOW_FOCUSED_STATE_SET, + SUPPORT_PRESSED_ENABLED_FOCUSED_SELECTED_STATE_SET, + SUPPORT_PRESSED_ENABLED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET; + + static final int VIEW_STATE_ACCELERATED = 1 << 6; + static final int VIEW_STATE_ACTIVATED = 1 << 5; + static final int VIEW_STATE_DRAG_CAN_ACCEPT = 1 << 8; + static final int VIEW_STATE_DRAG_HOVERED = 1 << 9; + static final int VIEW_STATE_ENABLED = 1 << 3; + static final int VIEW_STATE_FOCUSED = 1 << 2; + static final int VIEW_STATE_HOVERED = 1 << 7; + static final int VIEW_STATE_PRESSED = 1 << 4; + static final int VIEW_STATE_SELECTED = 1 << 1; + private static final int[][] VIEW_STATE_SETS; + + static final int VIEW_STATE_WINDOW_FOCUSED = 1; + + private static final int[] ViewDrawableStates = { + android.R.attr.state_pressed, android.R.attr.state_focused, + android.R.attr.state_selected, android.R.attr.state_window_focused, + android.R.attr.state_enabled, android.R.attr.state_activated, + android.R.attr.state_accelerated, android.R.attr.state_hovered, + android.R.attr.state_drag_can_accept, + android.R.attr.state_drag_hovered + }; + static final int[] Z_VIEW_STATE_IDS = new int[] { + android.R.attr.state_window_focused, + _View.VIEW_STATE_WINDOW_FOCUSED, android.R.attr.state_selected, + _View.VIEW_STATE_SELECTED, android.R.attr.state_focused, + _View.VIEW_STATE_FOCUSED, android.R.attr.state_enabled, + _View.VIEW_STATE_ENABLED, android.R.attr.state_pressed, + _View.VIEW_STATE_PRESSED, android.R.attr.state_activated, + _View.VIEW_STATE_ACTIVATED, android.R.attr.state_accelerated, + _View.VIEW_STATE_ACCELERATED, android.R.attr.state_hovered, + _View.VIEW_STATE_HOVERED, android.R.attr.state_drag_can_accept, + _View.VIEW_STATE_DRAG_CAN_ACCEPT, + android.R.attr.state_drag_hovered, _View.VIEW_STATE_DRAG_HOVERED + }; + + static { + if (_View.Z_VIEW_STATE_IDS.length / 2 != _View.ViewDrawableStates.length) { + throw new IllegalStateException( + "VIEW_STATE_IDs array length does not match ViewDrawableStates style array"); + } + int[] orderedIds = new int[_View.Z_VIEW_STATE_IDS.length]; + for (int i = 0; i < _View.ViewDrawableStates.length; i++) { + int viewState = _View.ViewDrawableStates[i]; + for (int j = 0; j < _View.Z_VIEW_STATE_IDS.length; j += 2) { + if (_View.Z_VIEW_STATE_IDS[j] == viewState) { + orderedIds[i * 2] = viewState; + orderedIds[i * 2 + 1] = _View.Z_VIEW_STATE_IDS[j + 1]; + } + } + } + final int NUM_BITS = _View.Z_VIEW_STATE_IDS.length / 2; + VIEW_STATE_SETS = new int[1 << NUM_BITS][]; + for (int i = 0; i < _View.VIEW_STATE_SETS.length; i++) { + int numBits = Integer.bitCount(i); + int[] set = new int[numBits]; + int pos = 0; + for (int j = 0; j < orderedIds.length; j += 2) { + if ((i & orderedIds[j + 1]) != 0) { + set[pos++] = orderedIds[j]; + } + } + _View.VIEW_STATE_SETS[i] = set; + } + + SUPPORT_EMPTY_STATE_SET = _View.VIEW_STATE_SETS[0]; + SUPPORT_WINDOW_FOCUSED_STATE_SET = _View.VIEW_STATE_SETS[_View.VIEW_STATE_WINDOW_FOCUSED]; + SUPPORT_SELECTED_STATE_SET = _View.VIEW_STATE_SETS[_View.VIEW_STATE_SELECTED]; + SUPPORT_SELECTED_WINDOW_FOCUSED_STATE_SET = _View.VIEW_STATE_SETS[_View.VIEW_STATE_WINDOW_FOCUSED + | _View.VIEW_STATE_SELECTED]; + SUPPORT_FOCUSED_STATE_SET = _View.VIEW_STATE_SETS[_View.VIEW_STATE_FOCUSED]; + SUPPORT_FOCUSED_WINDOW_FOCUSED_STATE_SET = _View.VIEW_STATE_SETS[_View.VIEW_STATE_WINDOW_FOCUSED + | _View.VIEW_STATE_FOCUSED]; + SUPPORT_FOCUSED_SELECTED_STATE_SET = _View.VIEW_STATE_SETS[_View.VIEW_STATE_SELECTED + | _View.VIEW_STATE_FOCUSED]; + SUPPORT_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET = _View.VIEW_STATE_SETS[_View.VIEW_STATE_WINDOW_FOCUSED + | _View.VIEW_STATE_SELECTED | _View.VIEW_STATE_FOCUSED]; + SUPPORT_ENABLED_STATE_SET = _View.VIEW_STATE_SETS[_View.VIEW_STATE_ENABLED]; + SUPPORT_ENABLED_WINDOW_FOCUSED_STATE_SET = _View.VIEW_STATE_SETS[_View.VIEW_STATE_WINDOW_FOCUSED + | _View.VIEW_STATE_ENABLED]; + SUPPORT_ENABLED_SELECTED_STATE_SET = _View.VIEW_STATE_SETS[_View.VIEW_STATE_SELECTED + | _View.VIEW_STATE_ENABLED]; + SUPPORT_ENABLED_SELECTED_WINDOW_FOCUSED_STATE_SET = _View.VIEW_STATE_SETS[_View.VIEW_STATE_WINDOW_FOCUSED + | _View.VIEW_STATE_SELECTED | _View.VIEW_STATE_ENABLED]; + SUPPORT_ENABLED_FOCUSED_STATE_SET = _View.VIEW_STATE_SETS[_View.VIEW_STATE_FOCUSED + | _View.VIEW_STATE_ENABLED]; + SUPPORT_ENABLED_FOCUSED_WINDOW_FOCUSED_STATE_SET = _View.VIEW_STATE_SETS[_View.VIEW_STATE_WINDOW_FOCUSED + | _View.VIEW_STATE_FOCUSED | _View.VIEW_STATE_ENABLED]; + SUPPORT_ENABLED_FOCUSED_SELECTED_STATE_SET = _View.VIEW_STATE_SETS[_View.VIEW_STATE_SELECTED + | _View.VIEW_STATE_FOCUSED | _View.VIEW_STATE_ENABLED]; + SUPPORT_ENABLED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET = _View.VIEW_STATE_SETS[_View.VIEW_STATE_WINDOW_FOCUSED + | _View.VIEW_STATE_SELECTED + | _View.VIEW_STATE_FOCUSED + | _View.VIEW_STATE_ENABLED]; + + SUPPORT_PRESSED_STATE_SET = PRESSED_STATE_SET = _View.VIEW_STATE_SETS[_View.VIEW_STATE_PRESSED]; + SUPPORT_PRESSED_WINDOW_FOCUSED_STATE_SET = _View.VIEW_STATE_SETS[_View.VIEW_STATE_WINDOW_FOCUSED + | _View.VIEW_STATE_PRESSED]; + SUPPORT_PRESSED_SELECTED_STATE_SET = _View.VIEW_STATE_SETS[_View.VIEW_STATE_SELECTED + | _View.VIEW_STATE_PRESSED]; + SUPPORT_PRESSED_SELECTED_WINDOW_FOCUSED_STATE_SET = _View.VIEW_STATE_SETS[_View.VIEW_STATE_WINDOW_FOCUSED + | _View.VIEW_STATE_SELECTED | _View.VIEW_STATE_PRESSED]; + SUPPORT_PRESSED_FOCUSED_STATE_SET = _View.VIEW_STATE_SETS[_View.VIEW_STATE_FOCUSED + | _View.VIEW_STATE_PRESSED]; + SUPPORT_PRESSED_FOCUSED_WINDOW_FOCUSED_STATE_SET = _View.VIEW_STATE_SETS[_View.VIEW_STATE_WINDOW_FOCUSED + | _View.VIEW_STATE_FOCUSED | _View.VIEW_STATE_PRESSED]; + SUPPORT_PRESSED_FOCUSED_SELECTED_STATE_SET = _View.VIEW_STATE_SETS[_View.VIEW_STATE_SELECTED + | _View.VIEW_STATE_FOCUSED | _View.VIEW_STATE_PRESSED]; + SUPPORT_PRESSED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET = _View.VIEW_STATE_SETS[_View.VIEW_STATE_WINDOW_FOCUSED + | _View.VIEW_STATE_SELECTED + | _View.VIEW_STATE_FOCUSED + | _View.VIEW_STATE_PRESSED]; + SUPPORT_PRESSED_ENABLED_STATE_SET = _View.VIEW_STATE_SETS[_View.VIEW_STATE_ENABLED + | _View.VIEW_STATE_PRESSED]; + SUPPORT_PRESSED_ENABLED_WINDOW_FOCUSED_STATE_SET = _View.VIEW_STATE_SETS[_View.VIEW_STATE_WINDOW_FOCUSED + | _View.VIEW_STATE_ENABLED | _View.VIEW_STATE_PRESSED]; + SUPPORT_PRESSED_ENABLED_SELECTED_STATE_SET = _View.VIEW_STATE_SETS[_View.VIEW_STATE_SELECTED + | _View.VIEW_STATE_ENABLED | _View.VIEW_STATE_PRESSED]; + SUPPORT_PRESSED_ENABLED_SELECTED_WINDOW_FOCUSED_STATE_SET = _View.VIEW_STATE_SETS[_View.VIEW_STATE_WINDOW_FOCUSED + | _View.VIEW_STATE_SELECTED + | _View.VIEW_STATE_ENABLED + | _View.VIEW_STATE_PRESSED]; + SUPPORT_PRESSED_ENABLED_FOCUSED_STATE_SET = _View.VIEW_STATE_SETS[_View.VIEW_STATE_FOCUSED + | _View.VIEW_STATE_ENABLED | _View.VIEW_STATE_PRESSED]; + SUPPORT_PRESSED_ENABLED_FOCUSED_WINDOW_FOCUSED_STATE_SET = _View.VIEW_STATE_SETS[_View.VIEW_STATE_WINDOW_FOCUSED + | _View.VIEW_STATE_FOCUSED + | _View.VIEW_STATE_ENABLED + | _View.VIEW_STATE_PRESSED]; + SUPPORT_PRESSED_ENABLED_FOCUSED_SELECTED_STATE_SET = _View.VIEW_STATE_SETS[_View.VIEW_STATE_SELECTED + | _View.VIEW_STATE_FOCUSED + | _View.VIEW_STATE_ENABLED + | _View.VIEW_STATE_PRESSED]; + SUPPORT_PRESSED_ENABLED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET = _View.VIEW_STATE_SETS[_View.VIEW_STATE_WINDOW_FOCUSED + | _View.VIEW_STATE_SELECTED + | _View.VIEW_STATE_FOCUSED + | _View.VIEW_STATE_ENABLED | _View.VIEW_STATE_PRESSED]; + } + + public static int supportResolveSize(int size, int measureSpec) { + return _View.supportResolveSizeAndState(size, measureSpec, 0) + & android.view.View.MEASURED_SIZE_MASK; + } + + public static int supportResolveSizeAndState(int size, int measureSpec, + int childMeasuredState) { + int result = size; + int specMode = MeasureSpec.getMode(measureSpec); + int specSize = MeasureSpec.getSize(measureSpec); + switch (specMode) { + case MeasureSpec.UNSPECIFIED: + result = size; + break; + case MeasureSpec.AT_MOST: + if (specSize < size) { + result = specSize | android.view.View.MEASURED_STATE_TOO_SMALL; + } else { + result = size; + } + break; + case MeasureSpec.EXACTLY: + result = specSize; + break; + } + return result | childMeasuredState + & android.view.View.MEASURED_STATE_MASK; + } + + public _View(Context context) { + super(context); + } + + public _View(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public _View(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + public int getMeasuredStateInt() { + return getMeasuredWidth() + & android.view.View.MEASURED_STATE_MASK + | getMeasuredHeight() >> android.view.View.MEASURED_HEIGHT_STATE_SHIFT + & android.view.View.MEASURED_STATE_MASK >> android.view.View.MEASURED_HEIGHT_STATE_SHIFT; + } + + public ActionMode startActionMode(ActionMode.Callback actionModeCallback) { + return ((IHoloActivity) getContext()) + .startActionMode(actionModeCallback); + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/internal/_ViewGroup.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/internal/_ViewGroup.java new file mode 100644 index 0000000000..e1df16d7a5 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/internal/_ViewGroup.java @@ -0,0 +1,52 @@ + +package org.holoeverywhere.internal; + +import org.holoeverywhere.IHoloActivity; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; +import android.view.accessibility.AccessibilityManager; + +import com.actionbarsherlock.view.ActionMode; + +public abstract class _ViewGroup extends ViewGroup { + public static final int ACCESSIBILITY_FOCUS_BACKWARD = View.FOCUS_BACKWARD | 0x00000002; + public static final int ACCESSIBILITY_FOCUS_FORWARD = View.FOCUS_FORWARD | 0x00000002; + public static final int FLAG_DISALLOW_INTERCEPT = 0x80000; + public static final int FOCUS_ACCESSIBILITY = 0x00001000; + public static final int FOCUSABLES_ACCESSIBILITY = 0x00000002; + + public static boolean isAccessibilityManagerEnabled(Context context) { + boolean enabled = false; + try { + enabled = ((AccessibilityManager) context + .getSystemService(Context.ACCESSIBILITY_SERVICE)) + .isEnabled(); + } catch (Exception e) { + } + return enabled; + } + + public _ViewGroup(Context context) { + this(context, null); + } + + public _ViewGroup(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public _ViewGroup(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + public boolean isAccessibilityManagerEnabled() { + return _ViewGroup.isAccessibilityManagerEnabled(getContext()); + } + + public ActionMode startActionMode(ActionMode.Callback actionModeCallback) { + return ((IHoloActivity) getContext()) + .startActionMode(actionModeCallback); + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/preference/PreferenceManagerHelper.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/preference/PreferenceManagerHelper.java new file mode 100644 index 0000000000..bc4400b1d8 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/preference/PreferenceManagerHelper.java @@ -0,0 +1,70 @@ + +package org.holoeverywhere.preference; + +import org.holoeverywhere.HoloEverywhere; +import org.holoeverywhere.HoloEverywhere.PreferenceImpl; + +import android.content.Context; +import android.util.Log; + +public class PreferenceManagerHelper { + static interface PreferenceManagerImpl { + SharedPreferences getDefaultSharedPreferences(Context context, PreferenceImpl impl); + + int obtainThemeTag(); + + SharedPreferences wrap(Context context, PreferenceImpl impl, String name, int mode); + } + + private static PreferenceManagerImpl IMPL; + static { + try { + Class clazz = Class + .forName(HoloEverywhere.PACKAGE + ".preference._PreferenceManagerImpl"); + IMPL = (PreferenceManagerImpl) clazz.newInstance(); + } catch (Exception e) { + IMPL = null; + if (HoloEverywhere.DEBUG) { + Log.w("HoloEverywhere", + "Cannot find PreferenceManager class. Preference framework are disabled.", + e); + } + } + } + + private static void checkImpl() { + if (IMPL == null) { + throw new UnsatisfiedLinkError("HoloEverywhere: PreferenceFramework not found"); + } + } + + public static SharedPreferences getDefaultSharedPreferences(Context context) { + return getDefaultSharedPreferences(context, HoloEverywhere.PREFERENCE_IMPL); + } + + public static SharedPreferences getDefaultSharedPreferences(Context context, + PreferenceImpl impl) { + checkImpl(); + return IMPL.getDefaultSharedPreferences(context, impl); + } + + public static int obtainThemeTag() { + checkImpl(); + return IMPL.obtainThemeTag(); + } + + public static SharedPreferences wrap(Context context, PreferenceImpl impl, String name, + int mode) { + checkImpl(); + return IMPL.wrap(context, impl, name, mode); + } + + public static SharedPreferences wrap(Context context, String name, + int mode) { + return wrap(context, HoloEverywhere.PREFERENCE_IMPL, name, mode); + } + + private PreferenceManagerHelper() { + + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/preference/SharedPreferences.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/preference/SharedPreferences.java new file mode 100644 index 0000000000..edd1f772e8 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/preference/SharedPreferences.java @@ -0,0 +1,154 @@ + +package org.holoeverywhere.preference; + +import java.util.Map; +import java.util.Set; + +import org.json.JSONArray; +import org.json.JSONObject; + +import android.os.Bundle; + +public interface SharedPreferences extends android.content.SharedPreferences { + public static interface Editor extends + android.content.SharedPreferences.Editor { + @Override + public void apply(); + + @Override + public Editor clear(); + + @Override + public boolean commit(); + + public Editor putBoolean(int id, boolean value); + + @Override + public Editor putBoolean(String key, boolean value); + + public Editor putFloat(int id, float value); + + @Override + public Editor putFloat(String key, float value); + + public Editor putFloatSet(int id, Set value); + + public Editor putFloatSet(String key, Set value); + + public Editor putInt(int id, int value); + + @Override + public Editor putInt(String key, int value); + + public Editor putIntSet(int id, Set value); + + public Editor putIntSet(String key, Set value); + + public Editor putJSONArray(int id, JSONArray value); + + public Editor putJSONArray(String key, JSONArray value); + + public Editor putJSONObject(int id, JSONObject value); + + public Editor putJSONObject(String key, JSONObject value); + + public Editor putLong(int id, long value); + + @Override + public Editor putLong(String key, long value); + + public Editor putLongSet(int id, Set value); + + public Editor putLongSet(String key, Set value); + + public Editor putString(int id, String value); + + @Override + public Editor putString(String key, String value); + + public Editor putStringSet(int id, Set value); + + @Override + public Editor putStringSet(String key, Set value); + + public Editor remove(int id); + + @Override + public Editor remove(String key); + } + + public static interface OnSharedPreferenceChangeListener { + public void onSharedPreferenceChanged(SharedPreferences prefs, String key); + } + + public boolean contains(int id); + + @Override + public boolean contains(String key); + + @Override + public Editor edit(); + + @Override + public Map getAll(); + + public boolean getBoolean(int id, boolean defValue); + + @Override + public boolean getBoolean(String key, boolean defValue); + + public float getFloat(int id, float defValue); + + @Override + public float getFloat(String key, float defValue); + + public Set getFloatSet(int id, Set defValue); + + public Set getFloatSet(String key, Set defValue); + + public int getInt(int id, int defValue); + + @Override + public int getInt(String key, int defValue); + + public Set getIntSet(int id, Set defValue); + + public Set getIntSet(String key, Set defValue); + + public JSONArray getJSONArray(int id, JSONArray defValue); + + public JSONArray getJSONArray(String key, JSONArray defValue); + + public JSONObject getJSONObject(int id, JSONObject defValue); + + public JSONObject getJSONObject(String key, JSONObject defValue); + + public long getLong(int id, long defValue); + + @Override + public long getLong(String key, long defValue); + + public Set getLongSet(int id, Set defValue); + + public Set getLongSet(String key, Set defValue); + + public String getString(int id, String defValue); + + @Override + public String getString(String key, String defValue); + + public Set getStringSet(int id, Set defValue); + + @Override + public Set getStringSet(String key, Set defValue); + + public String makeNameById(int id); + + public void registerOnSharedPreferenceChangeListener( + OnSharedPreferenceChangeListener listener); + + public void setDefaultValues(Bundle bundle); + + public void unregisterOnSharedPreferenceChangeListener( + OnSharedPreferenceChangeListener listener); +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/text/AllCapsTransformationMethod.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/text/AllCapsTransformationMethod.java new file mode 100644 index 0000000000..9e52afaed9 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/text/AllCapsTransformationMethod.java @@ -0,0 +1,35 @@ + +package org.holoeverywhere.text; + +import java.util.Locale; + +import android.content.Context; +import android.graphics.Rect; +import android.view.View; + +public class AllCapsTransformationMethod implements TransformationMethod { + private boolean mEnabled; + private Locale mLocale; + + public AllCapsTransformationMethod(Context context) { + mLocale = context.getResources().getConfiguration().locale; + } + + @Override + public CharSequence getTransformation(CharSequence source, View view) { + if (mEnabled) { + return source != null ? source.toString().toUpperCase(mLocale) : null; + } + return source; + } + + @Override + public void onFocusChanged(View view, CharSequence sourceText, boolean focused, int direction, + Rect previouslyFocusedRect) { + } + + @Override + public void setLengthChangesAllowed(boolean allowLengthChanges) { + mEnabled = allowLengthChanges; + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/text/TransformationMethod.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/text/TransformationMethod.java new file mode 100644 index 0000000000..16abdad771 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/text/TransformationMethod.java @@ -0,0 +1,17 @@ + +package org.holoeverywhere.text; + +import android.graphics.Rect; +import android.view.View; + +public interface TransformationMethod extends android.text.method.TransformationMethod { + @Override + public CharSequence getTransformation(CharSequence source, View view); + + @Override + public void onFocusChanged(View view, CharSequence sourceText, + boolean focused, int direction, + Rect previouslyFocusedRect); + + public void setLengthChangesAllowed(boolean allowLengthChanges); +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/ArrayUtils.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/ArrayUtils.java new file mode 100644 index 0000000000..d806ec5992 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/ArrayUtils.java @@ -0,0 +1,187 @@ + +package org.holoeverywhere.util; + +import java.lang.reflect.Array; + +public class ArrayUtils { + private static final int CACHE_SIZE = 73; + private static Object[] EMPTY = new Object[0]; + private static Object[] sCache = new Object[ArrayUtils.CACHE_SIZE]; + + @SuppressWarnings("unchecked") + public static T[] appendElement(Class kind, T[] array, T element) { + final T[] result; + final int end; + if (array != null) { + end = array.length; + result = (T[]) Array.newInstance(kind, end + 1); + System.arraycopy(array, 0, result, 0, end); + } else { + end = 0; + result = (T[]) Array.newInstance(kind, 1); + } + result[end] = element; + return result; + } + + public static int[] appendInt(int[] cur, int val) { + if (cur == null) { + return new int[] { + val + }; + } + final int N = cur.length; + for (int i = 0; i < N; i++) { + if (cur[i] == val) { + return cur; + } + } + int[] ret = new int[N + 1]; + System.arraycopy(cur, 0, ret, 0, N); + ret[N] = val; + return ret; + } + + public static boolean contains(int[] array, int value) { + for (int element : array) { + if (element == value) { + return true; + } + } + return false; + } + + public static boolean contains(T[] array, T value) { + for (T element : array) { + if (element == null) { + if (value == null) { + return true; + } + } else { + if (value != null && element.equals(value)) { + return true; + } + } + } + return false; + } + + @SuppressWarnings("unchecked") + public static T[] emptyArray(Class kind) { + if (kind == Object.class) { + return (T[]) ArrayUtils.EMPTY; + } + int bucket = (System.identityHashCode(kind) / 8 & 0x7FFFFFFF) + % ArrayUtils.CACHE_SIZE; + Object cache = ArrayUtils.sCache[bucket]; + if (cache == null || cache.getClass().getComponentType() != kind) { + cache = Array.newInstance(kind, 0); + ArrayUtils.sCache[bucket] = cache; + } + return (T[]) cache; + } + + public static boolean equals(byte[] array1, byte[] array2, int length) { + if (array1 == array2) { + return true; + } + if (array1 == null || array2 == null || array1.length < length + || array2.length < length) { + return false; + } + for (int i = 0; i < length; i++) { + if (array1[i] != array2[i]) { + return false; + } + } + return true; + } + + public static int idealBooleanArraySize(int need) { + return ArrayUtils.idealByteArraySize(need); + } + + public static int idealByteArraySize(int need) { + for (int i = 4; i < 32; i++) { + if (need <= (1 << i) - 12) { + return (1 << i) - 12; + } + } + + return need; + } + + public static int idealCharArraySize(int need) { + return ArrayUtils.idealByteArraySize(need * 2) / 2; + } + + public static int idealFloatArraySize(int need) { + return ArrayUtils.idealByteArraySize(need * 4) / 4; + } + + public static int idealIntArraySize(int need) { + return ArrayUtils.idealByteArraySize(need * 4) / 4; + } + + public static int idealLongArraySize(int need) { + return ArrayUtils.idealByteArraySize(need * 8) / 8; + } + + public static int idealObjectArraySize(int need) { + return ArrayUtils.idealByteArraySize(need * 4) / 4; + } + + public static int idealShortArraySize(int need) { + return ArrayUtils.idealByteArraySize(need * 2) / 2; + } + + @SuppressWarnings("unchecked") + public static T[] removeElement(Class kind, T[] array, T element) { + if (array != null) { + final int length = array.length; + for (int i = 0; i < length; i++) { + if (array[i] == element) { + if (length == 1) { + return null; + } + T[] result = (T[]) Array.newInstance(kind, length - 1); + System.arraycopy(array, 0, result, 0, i); + System.arraycopy(array, i + 1, result, i, length - i - 1); + return result; + } + } + } + return array; + } + + public static int[] removeInt(int[] cur, int val) { + if (cur == null) { + return null; + } + final int N = cur.length; + for (int i = 0; i < N; i++) { + if (cur[i] == val) { + int[] ret = new int[N - 1]; + if (i > 0) { + System.arraycopy(cur, 0, ret, 0, i); + } + if (i < N - 1) { + System.arraycopy(cur, i + 1, ret, i, N - i - 1); + } + return ret; + } + } + return cur; + } + + public static long total(long[] array) { + long total = 0; + for (long value : array) { + total += value; + } + return total; + } + + private ArrayUtils() { + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/Arrays.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/Arrays.java new file mode 100644 index 0000000000..5459b41ae1 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/Arrays.java @@ -0,0 +1,27 @@ + +package org.holoeverywhere.util; + +import java.lang.reflect.Array; + +public class Arrays { + @SuppressWarnings("unchecked") + public static T[] copyOfRange(T[] original, int from, int to) { + return Arrays.copyOfRange(original, from, to, + (Class) original.getClass()); + } + + @SuppressWarnings("unchecked") + public static T[] copyOfRange(U[] original, int from, int to, + Class newType) { + int newSize = to - from; + if (newSize < 0) { + throw new IllegalArgumentException(from + " > " + to); + } + T[] copy = (Object) newType == (Object) Object[].class ? (T[]) new Object[newSize] + : (T[]) Array.newInstance(newType.getComponentType(), newSize); + System.arraycopy(original, from, copy, 0, + Math.min(original.length - from, newSize)); + return copy; + } + +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/CharSequences.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/CharSequences.java new file mode 100644 index 0000000000..797ee16b31 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/CharSequences.java @@ -0,0 +1,89 @@ + +package org.holoeverywhere.util; + +public class CharSequences { + public static int compareToIgnoreCase(CharSequence me, CharSequence another) { + int myLen = me.length(), anotherLen = another.length(); + int myPos = 0, anotherPos = 0, result; + int end = myLen < anotherLen ? myLen : anotherLen; + while (myPos < end) { + if ((result = Character.toLowerCase(me.charAt(myPos++)) + - Character.toLowerCase(another.charAt(anotherPos++))) != 0) { + return result; + } + } + return myLen - anotherLen; + } + + public static boolean equals(CharSequence a, CharSequence b) { + if (a.length() != b.length()) { + return false; + } + int length = a.length(); + for (int i = 0; i < length; i++) { + if (a.charAt(i) != b.charAt(i)) { + return false; + } + } + return true; + } + + public static CharSequence forAsciiBytes(final byte[] bytes) { + return new CharSequence() { + @Override + public char charAt(int index) { + return (char) bytes[index]; + } + + @Override + public int length() { + return bytes.length; + } + + @Override + public CharSequence subSequence(int start, int end) { + return CharSequences.forAsciiBytes(bytes, start, end); + } + + @Override + public String toString() { + return new String(bytes); + } + }; + } + + public static CharSequence forAsciiBytes(final byte[] bytes, + final int start, final int end) { + CharSequences.validate(start, end, bytes.length); + return new CharSequence() { + @Override + public char charAt(int index) { + return (char) bytes[index + start]; + } + + @Override + public int length() { + return end - start; + } + + @Override + public CharSequence subSequence(int newStart, int newEnd) { + newStart -= start; + newEnd -= start; + CharSequences.validate(newStart, newEnd, length()); + return CharSequences.forAsciiBytes(bytes, newStart, newEnd); + } + + @Override + public String toString() { + return new String(bytes, start, length()); + } + }; + } + + static void validate(int start, int end, int length) { + if (start < 0 || end < 0 || end > length || start > end) { + throw new IndexOutOfBoundsException(); + } + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/FastXmlSerializer.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/FastXmlSerializer.java new file mode 100644 index 0000000000..4f7f702dde --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/FastXmlSerializer.java @@ -0,0 +1,385 @@ + +package org.holoeverywhere.util; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.io.Writer; +import java.nio.ByteBuffer; +import java.nio.CharBuffer; +import java.nio.charset.Charset; +import java.nio.charset.CharsetEncoder; +import java.nio.charset.CoderResult; +import java.nio.charset.IllegalCharsetNameException; +import java.nio.charset.UnsupportedCharsetException; + +import org.xmlpull.v1.XmlSerializer; + +public class FastXmlSerializer implements XmlSerializer { + private static final int BUFFER_LEN = 8192; + + private static final String ESCAPE_TABLE[] = new String[] { + null, null, + null, null, null, null, null, null, // 0-7 + null, null, null, null, null, null, null, null, // 8-15 + null, null, null, null, null, null, null, null, // 16-23 + null, null, null, null, null, null, null, null, // 24-31 + null, null, """, null, null, null, "&", null, // 32-39 + null, null, null, null, null, null, null, null, // 40-47 + null, null, null, null, null, null, null, null, // 48-55 + null, null, null, null, "<", null, ">", null, // 56-63 + }; + + private ByteBuffer mBytes = ByteBuffer + .allocate(FastXmlSerializer.BUFFER_LEN); + private CharsetEncoder mCharset; + + private boolean mInTag; + + private OutputStream mOutputStream; + private int mPos; + private final char[] mText = new char[FastXmlSerializer.BUFFER_LEN]; + + private Writer mWriter; + + private void append(char c) throws IOException { + int pos = mPos; + if (pos >= FastXmlSerializer.BUFFER_LEN - 1) { + flush(); + pos = mPos; + } + mText[pos] = c; + mPos = pos + 1; + } + + private void append(char[] buf, int i, final int length) throws IOException { + if (length > FastXmlSerializer.BUFFER_LEN) { + final int end = i + length; + while (i < end) { + int next = i + FastXmlSerializer.BUFFER_LEN; + append(buf, i, next < end ? FastXmlSerializer.BUFFER_LEN : end + - i); + i = next; + } + return; + } + int pos = mPos; + if (pos + length > FastXmlSerializer.BUFFER_LEN) { + flush(); + pos = mPos; + } + System.arraycopy(buf, i, mText, pos, length); + mPos = pos + length; + } + + private void append(String str) throws IOException { + append(str, 0, str.length()); + } + + private void append(String str, int i, final int length) throws IOException { + if (length > FastXmlSerializer.BUFFER_LEN) { + final int end = i + length; + while (i < end) { + int next = i + FastXmlSerializer.BUFFER_LEN; + append(str, i, next < end ? FastXmlSerializer.BUFFER_LEN : end + - i); + i = next; + } + return; + } + int pos = mPos; + if (pos + length > FastXmlSerializer.BUFFER_LEN) { + flush(); + pos = mPos; + } + str.getChars(i, i + length, mText, pos); + mPos = pos + length; + } + + @Override + public XmlSerializer attribute(String namespace, String name, String value) + throws IOException, IllegalArgumentException, IllegalStateException { + append(' '); + if (namespace != null) { + append(namespace); + append(':'); + } + append(name); + append("=\""); + + escapeAndAppendString(value); + append('"'); + return this; + } + + @Override + public void cdsect(String text) throws IOException, + IllegalArgumentException, IllegalStateException { + throw new UnsupportedOperationException(); + } + + @Override + public void comment(String text) throws IOException, + IllegalArgumentException, IllegalStateException { + throw new UnsupportedOperationException(); + } + + @Override + public void docdecl(String text) throws IOException, + IllegalArgumentException, IllegalStateException { + throw new UnsupportedOperationException(); + } + + @Override + public void endDocument() throws IOException, IllegalArgumentException, + IllegalStateException { + flush(); + } + + @Override + public XmlSerializer endTag(String namespace, String name) + throws IOException, IllegalArgumentException, IllegalStateException { + if (mInTag) { + append(" />\n"); + } else { + append("\n"); + } + mInTag = false; + return this; + } + + @Override + public void entityRef(String text) throws IOException, + IllegalArgumentException, IllegalStateException { + throw new UnsupportedOperationException(); + } + + private void escapeAndAppendString(char[] buf, int start, int len) + throws IOException { + final char NE = (char) FastXmlSerializer.ESCAPE_TABLE.length; + final String[] escapes = FastXmlSerializer.ESCAPE_TABLE; + int end = start + len; + int lastPos = start; + int pos; + for (pos = start; pos < end; pos++) { + char c = buf[pos]; + if (c >= NE) { + continue; + } + String escape = escapes[c]; + if (escape == null) { + continue; + } + if (lastPos < pos) { + append(buf, lastPos, pos - lastPos); + } + lastPos = pos + 1; + append(escape); + } + if (lastPos < pos) { + append(buf, lastPos, pos - lastPos); + } + } + + private void escapeAndAppendString(final String string) throws IOException { + final int N = string.length(); + final char NE = (char) FastXmlSerializer.ESCAPE_TABLE.length; + final String[] escapes = FastXmlSerializer.ESCAPE_TABLE; + int lastPos = 0; + int pos; + for (pos = 0; pos < N; pos++) { + char c = string.charAt(pos); + if (c >= NE) { + continue; + } + String escape = escapes[c]; + if (escape == null) { + continue; + } + if (lastPos < pos) { + append(string, lastPos, pos - lastPos); + } + lastPos = pos + 1; + append(escape); + } + if (lastPos < pos) { + append(string, lastPos, pos - lastPos); + } + } + + @Override + public void flush() throws IOException { + // Log.i("PackageManager", "flush mPos=" + mPos); + if (mPos > 0) { + if (mOutputStream != null) { + CharBuffer charBuffer = CharBuffer.wrap(mText, 0, mPos); + CoderResult result = mCharset.encode(charBuffer, mBytes, true); + while (true) { + if (result.isError()) { + throw new IOException(result.toString()); + } else if (result.isOverflow()) { + flushBytes(); + result = mCharset.encode(charBuffer, mBytes, true); + continue; + } + break; + } + flushBytes(); + mOutputStream.flush(); + } else { + mWriter.write(mText, 0, mPos); + mWriter.flush(); + } + mPos = 0; + } + } + + private void flushBytes() throws IOException { + int position; + if ((position = mBytes.position()) > 0) { + mBytes.flip(); + mOutputStream.write(mBytes.array(), 0, position); + mBytes.clear(); + } + } + + @Override + public int getDepth() { + throw new UnsupportedOperationException(); + } + + @Override + public boolean getFeature(String name) { + throw new UnsupportedOperationException(); + } + + @Override + public String getName() { + throw new UnsupportedOperationException(); + } + + @Override + public String getNamespace() { + throw new UnsupportedOperationException(); + } + + @Override + public String getPrefix(String namespace, boolean generatePrefix) + throws IllegalArgumentException { + throw new UnsupportedOperationException(); + } + + @Override + public Object getProperty(String name) { + throw new UnsupportedOperationException(); + } + + @Override + public void ignorableWhitespace(String text) throws IOException, + IllegalArgumentException, IllegalStateException { + throw new UnsupportedOperationException(); + } + + @Override + public void processingInstruction(String text) throws IOException, + IllegalArgumentException, IllegalStateException { + throw new UnsupportedOperationException(); + } + + @Override + public void setFeature(String name, boolean state) + throws IllegalArgumentException, IllegalStateException { + if (name.equals("http://xmlpull.org/v1/doc/features.html#indent-output")) { + return; + } + throw new UnsupportedOperationException(); + } + + @Override + public void setOutput(OutputStream os, String encoding) throws IOException, + IllegalArgumentException, IllegalStateException { + if (os == null) { + throw new IllegalArgumentException(); + } + try { + mCharset = Charset.forName(encoding).newEncoder(); + } catch (IllegalCharsetNameException e) { + throw (UnsupportedEncodingException) new UnsupportedEncodingException( + encoding).initCause(e); + } catch (UnsupportedCharsetException e) { + throw (UnsupportedEncodingException) new UnsupportedEncodingException( + encoding).initCause(e); + } + mOutputStream = os; + } + + @Override + public void setOutput(Writer writer) throws IOException, + IllegalArgumentException, IllegalStateException { + mWriter = writer; + } + + @Override + public void setPrefix(String prefix, String namespace) throws IOException, + IllegalArgumentException, IllegalStateException { + throw new UnsupportedOperationException(); + } + + @Override + public void setProperty(String name, Object value) + throws IllegalArgumentException, IllegalStateException { + throw new UnsupportedOperationException(); + } + + @Override + public void startDocument(String encoding, Boolean standalone) + throws IOException, IllegalArgumentException, IllegalStateException { + append("\n"); + } + + @Override + public XmlSerializer startTag(String namespace, String name) + throws IOException, IllegalArgumentException, IllegalStateException { + if (mInTag) { + append(">\n"); + } + append('<'); + if (namespace != null) { + append(namespace); + append(':'); + } + append(name); + mInTag = true; + return this; + } + + @Override + public XmlSerializer text(char[] buf, int start, int len) + throws IOException, IllegalArgumentException, IllegalStateException { + if (mInTag) { + append(">"); + mInTag = false; + } + escapeAndAppendString(buf, start, len); + return this; + } + + @Override + public XmlSerializer text(String text) throws IOException, + IllegalArgumentException, IllegalStateException { + if (mInTag) { + append(">"); + mInTag = false; + } + escapeAndAppendString(text); + return this; + } + +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/FinitePool.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/FinitePool.java new file mode 100644 index 0000000000..d05a0aefdc --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/FinitePool.java @@ -0,0 +1,61 @@ + +package org.holoeverywhere.util; + +import android.util.Log; + +public class FinitePool> implements Pool { + private static final String TAG = "FinitePool"; + private final boolean mInfinite; + private final int mLimit; + private final PoolableManager mManager; + private int mPoolCount; + private T mRoot; + + public FinitePool(PoolableManager manager) { + mManager = manager; + mLimit = 0; + mInfinite = true; + } + + public FinitePool(PoolableManager manager, int limit) { + if (limit <= 0) { + throw new IllegalArgumentException("The pool limit must be > 0"); + } + mManager = manager; + mLimit = limit; + mInfinite = false; + } + + @Override + public T acquire() { + T element; + if (mRoot != null) { + element = mRoot; + mRoot = element.getNextPoolable(); + mPoolCount--; + } else { + element = mManager.newInstance(); + } + if (element != null) { + element.setNextPoolable(null); + element.setPooled(false); + mManager.onAcquired(element); + } + return element; + } + + @Override + public void release(T element) { + if (!element.isPooled()) { + if (mInfinite || mPoolCount < mLimit) { + mPoolCount++; + element.setNextPoolable(mRoot); + element.setPooled(true); + mRoot = element; + } + mManager.onReleased(element); + } else { + Log.w(FinitePool.TAG, "Element is already in pool: " + element); + } + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/Pair.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/Pair.java new file mode 100644 index 0000000000..55ddf5b1bb --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/Pair.java @@ -0,0 +1,42 @@ + +package org.holoeverywhere.util; + +public class Pair { + public static Pair create(A a, B b) { + return new Pair(a, b); + } + + public final F first; + + public final S second; + + public Pair(F first, S second) { + this.first = first; + this.second = second; + } + + @Override + @SuppressWarnings("unchecked") + public boolean equals(Object o) { + if (o == this) { + return true; + } + if (!(o instanceof Pair)) { + return false; + } + try { + Pair other = (Pair) o; + return first.equals(other.first) && second.equals(other.second); + } catch (ClassCastException e) { + return false; + } + } + + @Override + public int hashCode() { + int result = 17; + result = 31 * result + first.hashCode(); + result = 31 * result + second.hashCode(); + return result; + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/Pool.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/Pool.java new file mode 100644 index 0000000000..c57138026d --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/Pool.java @@ -0,0 +1,8 @@ + +package org.holoeverywhere.util; + +public interface Pool> { + public abstract T acquire(); + + public abstract void release(T element); +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/Poolable.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/Poolable.java new file mode 100644 index 0000000000..e979dd2e73 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/Poolable.java @@ -0,0 +1,12 @@ + +package org.holoeverywhere.util; + +public interface Poolable { + T getNextPoolable(); + + boolean isPooled(); + + void setNextPoolable(T element); + + void setPooled(boolean isPooled); +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/PoolableManager.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/PoolableManager.java new file mode 100644 index 0000000000..108ab8129e --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/PoolableManager.java @@ -0,0 +1,10 @@ + +package org.holoeverywhere.util; + +public interface PoolableManager> { + T newInstance(); + + void onAcquired(T element); + + void onReleased(T element); +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/Pools.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/Pools.java new file mode 100644 index 0000000000..3560910891 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/Pools.java @@ -0,0 +1,26 @@ + +package org.holoeverywhere.util; + +public class Pools { + public static > Pool finitePool( + PoolableManager manager, int limit) { + return new FinitePool(manager, limit); + } + + public static > Pool simplePool( + PoolableManager manager) { + return new FinitePool(manager); + } + + public static > Pool synchronizedPool(Pool pool) { + return new SynchronizedPool(pool); + } + + public static > Pool synchronizedPool( + Pool pool, Object lock) { + return new SynchronizedPool(pool, lock); + } + + private Pools() { + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/ReflectHelper.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/ReflectHelper.java new file mode 100644 index 0000000000..c1b22859c6 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/ReflectHelper.java @@ -0,0 +1,38 @@ + +package org.holoeverywhere.util; + +import java.lang.reflect.Method; + +public final class ReflectHelper { + + private static Class[] classess(Object[] args) { + Class[] result = new Class[args.length]; + for (int i = 0; i < args.length; i++) { + Object z = args[i]; + if (z != null) { + result[i] = z.getClass(); + } + } + return result; + } + + public static Result invoke(Object object, String methodName, + Class result, boolean superClass, Object... args) { + try { + Class[] argsClasses = ReflectHelper.classess(args); + Method method = (superClass ? object.getClass().getSuperclass() + : object.getClass()).getMethod(methodName, argsClasses); + method.setAccessible(true); + Object r = method.invoke(object, args); + return result != null ? result.cast(r) : null; + } catch (Exception e) { + return null; + } + } + + public static Result invoke(Object object, String methodName, + Class result, Object... args) { + return ReflectHelper.invoke(object, methodName, result, false, args); + } + +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/SparseArray.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/SparseArray.java new file mode 100644 index 0000000000..828a66f1cb --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/SparseArray.java @@ -0,0 +1,230 @@ + +package org.holoeverywhere.util; + +public class SparseArray implements Cloneable { + private static final Object DELETED = new Object(); + + private static int binarySearch(int[] a, int start, int len, int key) { + int high = start + len, low = start - 1, guess; + while (high - low > 1) { + guess = (high + low) / 2; + if (a[guess] < key) { + low = guess; + } else { + high = guess; + } + } + if (high == start + len) { + return ~(start + len); + } else if (a[high] == key) { + return high; + } else { + return ~high; + } + } + + private boolean mGarbage = false; + private int[] mKeys; + private int mSize; + + private Object[] mValues; + + public SparseArray() { + this(10); + } + + public SparseArray(int initialCapacity) { + initialCapacity = ArrayUtils.idealIntArraySize(initialCapacity); + mKeys = new int[initialCapacity]; + mValues = new Object[initialCapacity]; + mSize = 0; + } + + public void append(int key, E value) { + if (mSize != 0 && key <= mKeys[mSize - 1]) { + put(key, value); + return; + } + if (mGarbage && mSize >= mKeys.length) { + gc(); + } + int pos = mSize; + if (pos >= mKeys.length) { + int n = ArrayUtils.idealIntArraySize(pos + 1); + int[] nkeys = new int[n]; + Object[] nvalues = new Object[n]; + System.arraycopy(mKeys, 0, nkeys, 0, mKeys.length); + System.arraycopy(mValues, 0, nvalues, 0, mValues.length); + mKeys = nkeys; + mValues = nvalues; + } + mKeys[pos] = key; + mValues[pos] = value; + mSize = pos + 1; + } + + public void clear() { + int n = mSize; + Object[] values = mValues; + for (int i = 0; i < n; i++) { + values[i] = null; + } + mSize = 0; + mGarbage = false; + } + + @Override + @SuppressWarnings("unchecked") + public SparseArray clone() { + SparseArray clone = null; + try { + clone = (SparseArray) super.clone(); + clone.mKeys = mKeys.clone(); + clone.mValues = mValues.clone(); + } catch (CloneNotSupportedException cnse) { + } + return clone; + } + + public void delete(int key) { + int i = SparseArray.binarySearch(mKeys, 0, mSize, key); + + if (i >= 0) { + if (mValues[i] != SparseArray.DELETED) { + mValues[i] = SparseArray.DELETED; + mGarbage = true; + } + } + } + + private void gc() { + int n = mSize; + int o = 0; + int[] keys = mKeys; + Object[] values = mValues; + for (int i = 0; i < n; i++) { + Object val = values[i]; + if (val != SparseArray.DELETED) { + if (i != o) { + keys[o] = keys[i]; + values[o] = val; + values[i] = null; + } + o++; + } + } + mGarbage = false; + mSize = o; + } + + public E get(int key) { + return get(key, null); + } + + @SuppressWarnings("unchecked") + public E get(int key, E valueIfKeyNotFound) { + int i = SparseArray.binarySearch(mKeys, 0, mSize, key); + + if (i < 0 || mValues[i] == SparseArray.DELETED) { + return valueIfKeyNotFound; + } else { + return (E) mValues[i]; + } + } + + public int indexOfKey(int key) { + if (mGarbage) { + gc(); + } + return SparseArray.binarySearch(mKeys, 0, mSize, key); + } + + public int indexOfValue(E value) { + if (mGarbage) { + gc(); + } + for (int i = 0; i < mSize; i++) { + if (mValues[i] == value) { + return i; + } + } + return -1; + } + + public int keyAt(int index) { + if (mGarbage) { + gc(); + } + return mKeys[index]; + } + + public void put(int key, E value) { + int i = SparseArray.binarySearch(mKeys, 0, mSize, key); + if (i >= 0) { + mValues[i] = value; + } else { + i = ~i; + if (i < mSize && mValues[i] == SparseArray.DELETED) { + mKeys[i] = key; + mValues[i] = value; + return; + } + if (mGarbage && mSize >= mKeys.length) { + gc(); + i = ~SparseArray.binarySearch(mKeys, 0, mSize, key); + } + if (mSize >= mKeys.length) { + int n = ArrayUtils.idealIntArraySize(mSize + 1); + int[] nkeys = new int[n]; + Object[] nvalues = new Object[n]; + System.arraycopy(mKeys, 0, nkeys, 0, mKeys.length); + System.arraycopy(mValues, 0, nvalues, 0, mValues.length); + mKeys = nkeys; + mValues = nvalues; + } + if (mSize - i != 0) { + System.arraycopy(mKeys, i, mKeys, i + 1, mSize - i); + System.arraycopy(mValues, i, mValues, i + 1, mSize - i); + } + mKeys[i] = key; + mValues[i] = value; + mSize++; + } + } + + public void remove(int key) { + delete(key); + } + + public void removeAt(int index) { + if (mValues[index] != SparseArray.DELETED) { + mValues[index] = SparseArray.DELETED; + mGarbage = true; + } + } + + public void setValueAt(int index, E value) { + if (mGarbage) { + gc(); + } + + mValues[index] = value; + } + + public int size() { + if (mGarbage) { + gc(); + } + + return mSize; + } + + @SuppressWarnings("unchecked") + public E valueAt(int index) { + if (mGarbage) { + gc(); + } + + return (E) mValues[index]; + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/SparseIntArray.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/SparseIntArray.java new file mode 100644 index 0000000000..5e25b39e0d --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/SparseIntArray.java @@ -0,0 +1,197 @@ + +package org.holoeverywhere.util; + +import android.os.Parcel; +import android.os.Parcelable; + +public class SparseIntArray implements Cloneable, Parcelable { + public static final Creator CREATOR = new Creator() { + @Override + public SparseIntArray createFromParcel(Parcel source) { + final int size = source.readInt(); + SparseIntArray array = new SparseIntArray(size); + array.mSize = size; + array.mKeys = source.createIntArray(); + array.mValues = source.createIntArray(); + return array; + } + + @Override + public SparseIntArray[] newArray(int size) { + return new SparseIntArray[size]; + } + }; + + private static int binarySearch(int[] a, int start, int len, int key) { + int high = start + len, low = start - 1, guess; + while (high - low > 1) { + guess = (high + low) / 2; + if (a[guess] < key) { + low = guess; + } else { + high = guess; + } + } + if (high == start + len) { + return ~(start + len); + } else if (a[high] == key) { + return high; + } else { + return ~high; + } + } + + private int[] mKeys; + + private int mSize; + + private int[] mValues; + + public SparseIntArray() { + this(10); + } + + public SparseIntArray(int initialCapacity) { + initialCapacity = ArrayUtils.idealIntArraySize(initialCapacity); + mKeys = new int[initialCapacity]; + mValues = new int[initialCapacity]; + mSize = 0; + } + + public SparseIntArray(SparseIntArray arrayForCopy) { + if (arrayForCopy == null) { + int initialCapacity = ArrayUtils.idealIntArraySize(10); + mKeys = new int[initialCapacity]; + mValues = new int[initialCapacity]; + mSize = 0; + } else { + mKeys = arrayForCopy.mKeys.clone(); + mValues = arrayForCopy.mValues.clone(); + } + } + + public void append(int key, int value) { + if (mSize != 0 && key <= mKeys[mSize - 1]) { + put(key, value); + return; + } + int pos = mSize; + if (pos >= mKeys.length) { + int n = ArrayUtils.idealIntArraySize(pos + 1); + int[] nkeys = new int[n]; + int[] nvalues = new int[n]; + System.arraycopy(mKeys, 0, nkeys, 0, mKeys.length); + System.arraycopy(mValues, 0, nvalues, 0, mValues.length); + mKeys = nkeys; + mValues = nvalues; + } + mKeys[pos] = key; + mValues[pos] = value; + mSize = pos + 1; + } + + public void clear() { + mSize = 0; + } + + @Override + public SparseIntArray clone() { + SparseIntArray clone = null; + try { + clone = (SparseIntArray) super.clone(); + clone.mKeys = mKeys.clone(); + clone.mValues = mValues.clone(); + clone.mSize = mSize; + } catch (CloneNotSupportedException cnse) { + } + return clone; + } + + public void delete(int key) { + int i = binarySearch(mKeys, 0, mSize, key); + if (i >= 0) { + removeAt(i); + } + } + + @Override + public int describeContents() { + return 0; + } + + public int get(int key) { + return get(key, 0); + } + + public int get(int key, int valueIfKeyNotFound) { + int i = binarySearch(mKeys, 0, mSize, key); + if (i < 0) { + return valueIfKeyNotFound; + } else { + return mValues[i]; + } + } + + public int indexOfKey(int key) { + return binarySearch(mKeys, 0, mSize, key); + } + + public int indexOfValue(int value) { + for (int i = 0; i < mSize; i++) { + if (mValues[i] == value) { + return i; + } + } + return -1; + } + + public int keyAt(int index) { + return mKeys[index]; + } + + public void put(int key, int value) { + int i = binarySearch(mKeys, 0, mSize, key); + if (i >= 0) { + mValues[i] = value; + } else { + i = ~i; + if (mSize >= mKeys.length) { + int n = ArrayUtils.idealIntArraySize(mSize + 1); + int[] nkeys = new int[n]; + int[] nvalues = new int[n]; + System.arraycopy(mKeys, 0, nkeys, 0, mKeys.length); + System.arraycopy(mValues, 0, nvalues, 0, mValues.length); + mKeys = nkeys; + mValues = nvalues; + } + if (mSize - i != 0) { + System.arraycopy(mKeys, i, mKeys, i + 1, mSize - i); + System.arraycopy(mValues, i, mValues, i + 1, mSize - i); + } + mKeys[i] = key; + mValues[i] = value; + mSize++; + } + } + + public void removeAt(int index) { + System.arraycopy(mKeys, index + 1, mKeys, index, mSize - (index + 1)); + System.arraycopy(mValues, index + 1, mValues, index, mSize - (index + 1)); + mSize--; + } + + public int size() { + return mSize; + } + + public int valueAt(int index) { + return mValues[index]; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(mSize); + dest.writeIntArray(mKeys); + dest.writeIntArray(mValues); + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/SynchronizedPool.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/SynchronizedPool.java new file mode 100644 index 0000000000..d0875d828a --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/SynchronizedPool.java @@ -0,0 +1,31 @@ + +package org.holoeverywhere.util; + +public class SynchronizedPool> implements Pool { + private final Object mLock; + private final Pool mPool; + + public SynchronizedPool(Pool pool) { + mPool = pool; + mLock = this; + } + + public SynchronizedPool(Pool pool, Object lock) { + mPool = pool; + mLock = lock; + } + + @Override + public T acquire() { + synchronized (mLock) { + return mPool.acquire(); + } + } + + @Override + public void release(T element) { + synchronized (mLock) { + mPool.release(element); + } + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/WeaklyMap.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/WeaklyMap.java new file mode 100644 index 0000000000..26e6fa7fc4 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/WeaklyMap.java @@ -0,0 +1,183 @@ + +package org.holoeverywhere.util; + +import java.lang.ref.WeakReference; +import java.util.AbstractCollection; +import java.util.AbstractMap; +import java.util.AbstractSet; +import java.util.Collection; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; +import java.util.WeakHashMap; + +public class WeaklyMap extends AbstractMap { + private static final class WeaklyEntry implements Entry { + private final Entry> mEntry; + + public WeaklyEntry(Entry> entry) { + mEntry = entry; + } + + @Override + public K getKey() { + return mEntry.getKey(); + } + + @Override + public V getValue() { + final WeaklyReference ref = mEntry.getValue(); + return ref == null ? null : ref.get(); + } + + @Override + public V setValue(V object) { + final WeaklyReference ref = mEntry.setValue(new WeaklyReference(object)); + return ref == null ? null : ref.get(); + } + } + + private static final class WeaklyReference extends WeakReference { + public WeaklyReference(T r) { + super(r); + } + + @Override + public boolean equals(Object o) { + if (!(o instanceof WeaklyReference)) { + return false; + } + final Object o1 = ((WeaklyReference) o).get(); + final Object o2 = get(); + return o1 != null && o2 != null && o1 == o2; + } + } + + private final WeakHashMap> mMap; + + public WeaklyMap() { + mMap = new WeakHashMap>(); + } + + @Override + public void clear() { + mMap.clear(); + } + + @Override + public boolean containsKey(Object key) { + return mMap.containsKey(key); + } + + @Override + public boolean containsValue(Object value) { + return mMap.containsValue(new WeaklyReference(value)); + } + + @Override + public Set> entrySet() { + final Set>> entrySet = mMap.entrySet(); + return new AbstractSet>() { + @Override + public Iterator> iterator() { + final Iterator>> iterator = entrySet.iterator(); + return new Iterator>() { + + @Override + public boolean hasNext() { + return iterator.hasNext(); + } + + @Override + public Entry next() { + return new WeaklyEntry(iterator.next()); + } + + @Override + public void remove() { + iterator.remove(); + } + }; + } + + @Override + public int size() { + return entrySet.size(); + } + }; + } + + @Override + public V get(Object key) { + WeaklyReference ref = mMap.get(key); + return ref == null ? null : ref.get(); + } + + @Override + public boolean isEmpty() { + return mMap.isEmpty(); + } + + @Override + public Set keySet() { + return mMap.keySet(); + } + + @Override + public V put(K key, V value) { + WeaklyReference ref = mMap.put(key, new WeaklyReference(value)); + return ref == null ? null : ref.get(); + } + + @Override + public void putAll(Map map) { + for (Entry entry : map.entrySet()) { + mMap.put(entry.getKey(), new WeaklyReference(entry.getValue())); + } + } + + @Override + public V remove(Object key) { + WeaklyReference ref = mMap.remove(key); + return ref == null ? null : ref.get(); + } + + @Override + public int size() { + return mMap.size(); + } + + @Override + public Collection values() { + final Collection> values = mMap.values(); + return new AbstractCollection() { + @Override + public Iterator iterator() { + final Iterator> iterator = values.iterator(); + return new Iterator() { + + @Override + public boolean hasNext() { + return iterator.hasNext(); + } + + @Override + public V next() { + WeaklyReference ref = iterator.next(); + return ref == null ? null : ref.get(); + } + + @Override + public void remove() { + iterator.remove(); + } + }; + } + + @Override + public int size() { + return values.size(); + } + }; + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/XmlUtils.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/XmlUtils.java new file mode 100644 index 0000000000..8141c1f3c9 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/XmlUtils.java @@ -0,0 +1,658 @@ + +package org.holoeverywhere.util; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; +import org.xmlpull.v1.XmlSerializer; + +import android.util.Xml; + +@SuppressWarnings({ + "rawtypes", "unchecked" +}) +public class XmlUtils { + + public static final void beginDocument(XmlPullParser parser, + String firstElementName) throws XmlPullParserException, IOException { + int type; + while ((type = parser.next()) != XmlPullParser.START_TAG + && type != XmlPullParser.END_DOCUMENT) { + ; + } + + if (type != XmlPullParser.START_TAG) { + throw new XmlPullParserException("No start tag found"); + } + + if (!parser.getName().equals(firstElementName)) { + throw new XmlPullParserException("Unexpected start tag: found " + + parser.getName() + ", expected " + firstElementName); + } + } + + public static final boolean convertValueToBoolean(CharSequence value, + boolean defaultValue) { + boolean result = false; + + if (null == value) { + return defaultValue; + } + + if (value.equals("1") || value.equals("true") || value.equals("TRUE")) { + result = true; + } + + return result; + } + + public static final int convertValueToInt(CharSequence charSeq, + int defaultValue) { + if (null == charSeq) { + return defaultValue; + } + + String nm = charSeq.toString(); + + int sign = 1; + int index = 0; + int len = nm.length(); + int base = 10; + + if ('-' == nm.charAt(0)) { + sign = -1; + index++; + } + + if ('0' == nm.charAt(index)) { + // Quick check for a zero by itself + if (index == len - 1) { + return 0; + } + + char c = nm.charAt(index + 1); + + if ('x' == c || 'X' == c) { + index += 2; + base = 16; + } else { + index++; + base = 8; + } + } else if ('#' == nm.charAt(index)) { + index++; + base = 16; + } + + return Integer.parseInt(nm.substring(index), base) * sign; + } + + public static final int convertValueToList(CharSequence value, + String[] options, int defaultValue) { + if (null != value) { + for (int i = 0; i < options.length; i++) { + if (value.equals(options[i])) { + return i; + } + } + } + + return defaultValue; + } + + public static final int convertValueToUnsignedInt(String value, + int defaultValue) { + if (null == value) { + return defaultValue; + } + + return XmlUtils.parseUnsignedIntAttribute(value); + } + + public static final void nextElement(XmlPullParser parser) + throws XmlPullParserException, IOException { + int type; + while ((type = parser.next()) != XmlPullParser.START_TAG + && type != XmlPullParser.END_DOCUMENT) { + ; + } + } + + public static boolean nextElementWithin(XmlPullParser parser, int outerDepth) + throws IOException, XmlPullParserException { + for (;;) { + int type = parser.next(); + if (type == XmlPullParser.END_DOCUMENT + || type == XmlPullParser.END_TAG + && parser.getDepth() == outerDepth) { + return false; + } + if (type == XmlPullParser.START_TAG + && parser.getDepth() == outerDepth + 1) { + return true; + } + } + } + + public static final int parseUnsignedIntAttribute(CharSequence charSeq) { + String value = charSeq.toString(); + + int index = 0; + int len = value.length(); + int base = 10; + + if ('0' == value.charAt(index)) { + // Quick check for zero by itself + if (index == len - 1) { + return 0; + } + + char c = value.charAt(index + 1); + + if ('x' == c || 'X' == c) { // check for hex + index += 2; + base = 16; + } else { // check for octal + index++; + base = 8; + } + } else if ('#' == value.charAt(index)) { + index++; + base = 16; + } + + return (int) Long.parseLong(value.substring(index), base); + } + + public static final ArrayList readListXml(InputStream in) + throws XmlPullParserException, java.io.IOException { + XmlPullParser parser = Xml.newPullParser(); + parser.setInput(in, null); + return (ArrayList) XmlUtils.readValueXml(parser, new String[1]); + } + + public static final HashMap readMapXml(InputStream in) + throws XmlPullParserException, java.io.IOException { + XmlPullParser parser = Xml.newPullParser(); + parser.setInput(in, null); + return (HashMap) XmlUtils.readValueXml(parser, new String[1]); + } + + public static final HashSet readSetXml(InputStream in) + throws XmlPullParserException, java.io.IOException { + XmlPullParser parser = Xml.newPullParser(); + parser.setInput(in, null); + return (HashSet) XmlUtils.readValueXml(parser, new String[1]); + } + + public static final int[] readThisIntArrayXml(XmlPullParser parser, + String endTag, String[] name) throws XmlPullParserException, + java.io.IOException { + + int num; + try { + num = Integer.parseInt(parser.getAttributeValue(null, "num")); + } catch (NullPointerException e) { + throw new XmlPullParserException("Need num attribute in byte-array"); + } catch (NumberFormatException e) { + throw new XmlPullParserException( + "Not a number in num attribute in byte-array"); + } + + int[] array = new int[num]; + int i = 0; + + int eventType = parser.getEventType(); + do { + if (eventType == XmlPullParser.START_TAG) { + if (parser.getName().equals("item")) { + try { + array[i] = Integer.parseInt(parser.getAttributeValue( + null, "value")); + } catch (NullPointerException e) { + throw new XmlPullParserException( + "Need value attribute in item"); + } catch (NumberFormatException e) { + throw new XmlPullParserException( + "Not a number in value attribute in item"); + } + } else { + throw new XmlPullParserException("Expected item tag at: " + + parser.getName()); + } + } else if (eventType == XmlPullParser.END_TAG) { + if (parser.getName().equals(endTag)) { + return array; + } else if (parser.getName().equals("item")) { + i++; + } else { + throw new XmlPullParserException("Expected " + endTag + + " end tag at: " + parser.getName()); + } + } + eventType = parser.next(); + } while (eventType != XmlPullParser.END_DOCUMENT); + + throw new XmlPullParserException("Document ended before " + endTag + + " end tag"); + } + + public static final ArrayList readThisListXml(XmlPullParser parser, + String endTag, String[] name) throws XmlPullParserException, + java.io.IOException { + ArrayList list = new ArrayList(); + + int eventType = parser.getEventType(); + do { + if (eventType == XmlPullParser.START_TAG) { + Object val = XmlUtils.readThisValueXml(parser, name); + list.add(val); + // System.out.println("Adding to list: " + val); + } else if (eventType == XmlPullParser.END_TAG) { + if (parser.getName().equals(endTag)) { + return list; + } + throw new XmlPullParserException("Expected " + endTag + + " end tag at: " + parser.getName()); + } + eventType = parser.next(); + } while (eventType != XmlPullParser.END_DOCUMENT); + + throw new XmlPullParserException("Document ended before " + endTag + + " end tag"); + } + + public static final HashMap readThisMapXml(XmlPullParser parser, + String endTag, String[] name) throws XmlPullParserException, + java.io.IOException { + HashMap map = new HashMap(); + + int eventType = parser.getEventType(); + do { + if (eventType == XmlPullParser.START_TAG) { + Object val = XmlUtils.readThisValueXml(parser, name); + if (name[0] != null) { + map.put(name[0], val); + } else { + throw new XmlPullParserException( + "Map value without name attribute: " + + parser.getName()); + } + } else if (eventType == XmlPullParser.END_TAG) { + if (parser.getName().equals(endTag)) { + return map; + } + throw new XmlPullParserException("Expected " + endTag + + " end tag at: " + parser.getName()); + } + eventType = parser.next(); + } while (eventType != XmlPullParser.END_DOCUMENT); + + throw new XmlPullParserException("Document ended before " + endTag + + " end tag"); + } + + public static final HashSet readThisSetXml(XmlPullParser parser, + String endTag, String[] name) throws XmlPullParserException, + java.io.IOException { + HashSet set = new HashSet(); + + int eventType = parser.getEventType(); + do { + if (eventType == XmlPullParser.START_TAG) { + Object val = XmlUtils.readThisValueXml(parser, name); + set.add(val); + // System.out.println("Adding to set: " + val); + } else if (eventType == XmlPullParser.END_TAG) { + if (parser.getName().equals(endTag)) { + return set; + } + throw new XmlPullParserException("Expected " + endTag + + " end tag at: " + parser.getName()); + } + eventType = parser.next(); + } while (eventType != XmlPullParser.END_DOCUMENT); + + throw new XmlPullParserException("Document ended before " + endTag + + " end tag"); + } + + private static final Object readThisValueXml(XmlPullParser parser, + String[] name) throws XmlPullParserException, java.io.IOException { + final String valueName = parser.getAttributeValue(null, "name"); + final String tagName = parser.getName(); + Object res; + + if (tagName.equals("null")) { + res = null; + } else if (tagName.equals("string")) { + String value = ""; + int eventType; + while ((eventType = parser.next()) != XmlPullParser.END_DOCUMENT) { + if (eventType == XmlPullParser.END_TAG) { + if (parser.getName().equals("string")) { + name[0] = valueName; + // System.out.println("Returning value for " + valueName + // + ": " + value); + return value; + } + throw new XmlPullParserException( + "Unexpected end tag in : " + + parser.getName()); + } else if (eventType == XmlPullParser.TEXT) { + value += parser.getText(); + } else if (eventType == XmlPullParser.START_TAG) { + throw new XmlPullParserException( + "Unexpected start tag in : " + + parser.getName()); + } + } + throw new XmlPullParserException( + "Unexpected end of document in "); + } else if (tagName.equals("int")) { + res = Integer.parseInt(parser.getAttributeValue(null, "value")); + } else if (tagName.equals("long")) { + res = Long.valueOf(parser.getAttributeValue(null, "value")); + } else if (tagName.equals("float")) { + res = Float.valueOf(parser.getAttributeValue(null, "value")); + } else if (tagName.equals("double")) { + res = Double.valueOf(parser.getAttributeValue(null, "value")); + } else if (tagName.equals("boolean")) { + res = Boolean.valueOf(parser.getAttributeValue(null, "value")); + } else if (tagName.equals("int-array")) { + parser.next(); + res = XmlUtils.readThisIntArrayXml(parser, "int-array", name); + name[0] = valueName; + return res; + } else if (tagName.equals("map")) { + parser.next(); + res = XmlUtils.readThisMapXml(parser, "map", name); + name[0] = valueName; + return res; + } else if (tagName.equals("list")) { + parser.next(); + res = XmlUtils.readThisListXml(parser, "list", name); + name[0] = valueName; + return res; + } else if (tagName.equals("set")) { + parser.next(); + res = XmlUtils.readThisSetXml(parser, "set", name); + name[0] = valueName; + return res; + } else { + throw new XmlPullParserException("Unknown tag: " + tagName); + } + + int eventType; + while ((eventType = parser.next()) != XmlPullParser.END_DOCUMENT) { + if (eventType == XmlPullParser.END_TAG) { + if (parser.getName().equals(tagName)) { + name[0] = valueName; + return res; + } + throw new XmlPullParserException("Unexpected end tag in <" + + tagName + ">: " + parser.getName()); + } else if (eventType == XmlPullParser.TEXT) { + throw new XmlPullParserException("Unexpected text in <" + + tagName + ">: " + parser.getName()); + } else if (eventType == XmlPullParser.START_TAG) { + throw new XmlPullParserException("Unexpected start tag in <" + + tagName + ">: " + parser.getName()); + } + } + throw new XmlPullParserException("Unexpected end of document in <" + + tagName + ">"); + } + + public static final Object readValueXml(XmlPullParser parser, String[] name) + throws XmlPullParserException, java.io.IOException { + int eventType = parser.getEventType(); + do { + if (eventType == XmlPullParser.START_TAG) { + return XmlUtils.readThisValueXml(parser, name); + } else if (eventType == XmlPullParser.END_TAG) { + throw new XmlPullParserException("Unexpected end tag at: " + + parser.getName()); + } else if (eventType == XmlPullParser.TEXT) { + throw new XmlPullParserException("Unexpected text: " + + parser.getText()); + } + eventType = parser.next(); + } while (eventType != XmlPullParser.END_DOCUMENT); + + throw new XmlPullParserException("Unexpected end of document"); + } + + public static void skipCurrentTag(XmlPullParser parser) + throws XmlPullParserException, IOException { + int outerDepth = parser.getDepth(); + int type; + while ((type = parser.next()) != XmlPullParser.END_DOCUMENT + && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { + } + } + + public static final void writeByteArrayXml(byte[] val, String name, + XmlSerializer out) throws XmlPullParserException, + java.io.IOException { + + if (val == null) { + out.startTag(null, "null"); + out.endTag(null, "null"); + return; + } + + out.startTag(null, "byte-array"); + if (name != null) { + out.attribute(null, "name", name); + } + + final int N = val.length; + out.attribute(null, "num", Integer.toString(N)); + + StringBuilder sb = new StringBuilder(val.length * 2); + for (int i = 0; i < N; i++) { + int b = val[i]; + int h = b >> 4; + sb.append(h >= 10 ? 'a' + h - 10 : '0' + h); + h = b & 0xff; + sb.append(h >= 10 ? 'a' + h - 10 : '0' + h); + } + + out.text(sb.toString()); + + out.endTag(null, "byte-array"); + } + + public static final void writeIntArrayXml(int[] val, String name, + XmlSerializer out) throws XmlPullParserException, + java.io.IOException { + + if (val == null) { + out.startTag(null, "null"); + out.endTag(null, "null"); + return; + } + + out.startTag(null, "int-array"); + if (name != null) { + out.attribute(null, "name", name); + } + + final int N = val.length; + out.attribute(null, "num", Integer.toString(N)); + + for (int i = 0; i < N; i++) { + out.startTag(null, "item"); + out.attribute(null, "value", Integer.toString(val[i])); + out.endTag(null, "item"); + } + + out.endTag(null, "int-array"); + } + + public static final void writeListXml(List val, OutputStream out) + throws XmlPullParserException, java.io.IOException { + XmlSerializer serializer = Xml.newSerializer(); + serializer.setOutput(out, "utf-8"); + serializer.startDocument(null, true); + serializer.setFeature( + "http://xmlpull.org/v1/doc/features.html#indent-output", true); + XmlUtils.writeListXml(val, null, serializer); + serializer.endDocument(); + } + + public static final void writeListXml(List val, String name, + XmlSerializer out) throws XmlPullParserException, + java.io.IOException { + if (val == null) { + out.startTag(null, "null"); + out.endTag(null, "null"); + return; + } + + out.startTag(null, "list"); + if (name != null) { + out.attribute(null, "name", name); + } + + int N = val.size(); + int i = 0; + while (i < N) { + XmlUtils.writeValueXml(val.get(i), null, out); + i++; + } + + out.endTag(null, "list"); + } + + public static final void writeMapXml(Map val, OutputStream out) + throws XmlPullParserException, java.io.IOException { + XmlSerializer serializer = new FastXmlSerializer(); + serializer.setOutput(out, "utf-8"); + serializer.startDocument(null, true); + serializer.setFeature( + "http://xmlpull.org/v1/doc/features.html#indent-output", true); + XmlUtils.writeMapXml(val, null, serializer); + serializer.endDocument(); + } + + public static final void writeMapXml(Map val, String name, XmlSerializer out) + throws XmlPullParserException, java.io.IOException { + if (val == null) { + out.startTag(null, "null"); + out.endTag(null, "null"); + return; + } + + Set s = val.entrySet(); + Iterator i = s.iterator(); + + out.startTag(null, "map"); + if (name != null) { + out.attribute(null, "name", name); + } + + while (i.hasNext()) { + Map.Entry e = (Map.Entry) i.next(); + XmlUtils.writeValueXml(e.getValue(), (String) e.getKey(), out); + } + + out.endTag(null, "map"); + } + + public static final void writeSetXml(Set val, String name, XmlSerializer out) + throws XmlPullParserException, java.io.IOException { + if (val == null) { + out.startTag(null, "null"); + out.endTag(null, "null"); + return; + } + + out.startTag(null, "set"); + if (name != null) { + out.attribute(null, "name", name); + } + + for (Object v : val) { + XmlUtils.writeValueXml(v, null, out); + } + + out.endTag(null, "set"); + } + + public static final void writeValueXml(Object v, String name, + XmlSerializer out) throws XmlPullParserException, + java.io.IOException { + String typeStr; + if (v == null) { + out.startTag(null, "null"); + if (name != null) { + out.attribute(null, "name", name); + } + out.endTag(null, "null"); + return; + } else if (v instanceof String) { + out.startTag(null, "string"); + if (name != null) { + out.attribute(null, "name", name); + } + out.text(v.toString()); + out.endTag(null, "string"); + return; + } else if (v instanceof Integer) { + typeStr = "int"; + } else if (v instanceof Long) { + typeStr = "long"; + } else if (v instanceof Float) { + typeStr = "float"; + } else if (v instanceof Double) { + typeStr = "double"; + } else if (v instanceof Boolean) { + typeStr = "boolean"; + } else if (v instanceof byte[]) { + XmlUtils.writeByteArrayXml((byte[]) v, name, out); + return; + } else if (v instanceof int[]) { + XmlUtils.writeIntArrayXml((int[]) v, name, out); + return; + } else if (v instanceof Map) { + XmlUtils.writeMapXml((Map) v, name, out); + return; + } else if (v instanceof List) { + XmlUtils.writeListXml((List) v, name, out); + return; + } else if (v instanceof Set) { + XmlUtils.writeSetXml((Set) v, name, out); + return; + } else if (v instanceof CharSequence) { + out.startTag(null, "string"); + if (name != null) { + out.attribute(null, "name", name); + } + out.text(v.toString()); + out.endTag(null, "string"); + return; + } else { + throw new RuntimeException("writeValueXml: unable to write value " + + v); + } + + out.startTag(null, typeStr); + if (name != null) { + out.attribute(null, "name", name); + } + out.attribute(null, "value", v.toString()); + out.endTag(null, typeStr); + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/AbsSeekBar.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/AbsSeekBar.java new file mode 100644 index 0000000000..350a95b858 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/AbsSeekBar.java @@ -0,0 +1,414 @@ + +package org.holoeverywhere.widget; + +import org.holoeverywhere.R; +import org.holoeverywhere.internal._View; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.util.AttributeSet; +import android.view.KeyEvent; +import android.view.MotionEvent; +import android.view.ViewConfiguration; +import android.view.accessibility.AccessibilityEvent; +import android.view.accessibility.AccessibilityNodeInfo; + +public abstract class AbsSeekBar extends ProgressBar { + private static final int NO_ALPHA = 0xFF; + private float mDisabledAlpha; + private boolean mIsDragging; + boolean mIsUserSeekable = true; + private int mKeyProgressIncrement = 1; + private int mScaledTouchSlop; + private Drawable mThumb; + private int mThumbOffset; + private float mTouchDownX; + float mTouchProgressOffset; + + public AbsSeekBar(Context context) { + super(context); + } + + public AbsSeekBar(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public AbsSeekBar(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + TypedArray a = context.obtainStyledAttributes(attrs, + R.styleable.SeekBar, defStyle, 0); + Drawable thumb = a.getDrawable(R.styleable.SeekBar_android_thumb); + setThumb(thumb); + int thumbOffset = a.getDimensionPixelOffset( + R.styleable.SeekBar_android_thumbOffset, getThumbOffset()); + setThumbOffset(thumbOffset); + mDisabledAlpha = a.getFloat(R.styleable.SeekBar_android_disabledAlpha, + 0.5f); + a.recycle(); + mScaledTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); + } + + private void attemptClaimDrag() { + if (getParent() != null) { + getParent().requestDisallowInterceptTouchEvent(true); + } + } + + @Override + protected void drawableStateChanged() { + super.drawableStateChanged(); + Drawable progressDrawable = getProgressDrawable(); + if (progressDrawable != null) { + progressDrawable.setAlpha(isEnabled() ? AbsSeekBar.NO_ALPHA + : (int) (AbsSeekBar.NO_ALPHA * mDisabledAlpha)); + } + if (mThumb != null && mThumb.isStateful()) { + int[] state = getDrawableState(); + mThumb.setState(state); + } + } + + public int getKeyProgressIncrement() { + return mKeyProgressIncrement; + } + + public Drawable getThumb() { + return mThumb; + } + + public int getThumbOffset() { + return mThumbOffset; + } + + public boolean isInScrollingContainer() { + return false; + } + + @Override + @SuppressLint("NewApi") + public void jumpDrawablesToCurrentState() { + super.jumpDrawablesToCurrentState(); + if (mThumb != null) { + mThumb.jumpToCurrentState(); + } + } + + @Override + protected synchronized void onDraw(Canvas canvas) { + super.onDraw(canvas); + if (mThumb != null) { + canvas.save(); + canvas.translate(getPaddingLeft() - mThumbOffset, getPaddingTop()); + mThumb.draw(canvas); + canvas.restore(); + } + } + + @Override + @SuppressLint("NewApi") + public void onInitializeAccessibilityEvent(AccessibilityEvent event) { + super.onInitializeAccessibilityEvent(event); + event.setClassName(AbsSeekBar.class.getName()); + } + + @Override + @SuppressLint("NewApi") + public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { + super.onInitializeAccessibilityNodeInfo(info); + info.setClassName(AbsSeekBar.class.getName()); + if (isEnabled()) { + final int progress = getProgress(); + if (progress > 0) { + info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD); + } + if (progress < getMax()) { + info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD); + } + } + } + + void onKeyChange() { + } + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (isEnabled()) { + int progress = getProgress(); + switch (keyCode) { + case KeyEvent.KEYCODE_DPAD_LEFT: + if (progress <= 0) { + break; + } + setProgress(progress - mKeyProgressIncrement, true); + onKeyChange(); + return true; + case KeyEvent.KEYCODE_DPAD_RIGHT: + if (progress >= getMax()) { + break; + } + setProgress(progress + mKeyProgressIncrement, true); + onKeyChange(); + return true; + } + } + return super.onKeyDown(keyCode, event); + } + + @Override + protected synchronized void onMeasure(int widthMeasureSpec, + int heightMeasureSpec) { + Drawable d = getCurrentDrawable(); + int thumbHeight = mThumb == null ? 0 : mThumb.getIntrinsicHeight(); + 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())); + dh = Math.max(thumbHeight, dh); + } + dw += getPaddingLeft() + getPaddingRight(); + dh += getPaddingTop() + getPaddingBottom(); + setMeasuredDimension( + _View.supportResolveSizeAndState(dw, widthMeasureSpec, 0), + _View.supportResolveSizeAndState(dh, heightMeasureSpec, 0)); + } + + @Override + public void onProgressRefresh(float scale, boolean fromUser) { + super.onProgressRefresh(scale, fromUser); + Drawable thumb = mThumb; + if (thumb != null) { + setThumbPos(getWidth(), thumb, scale, Integer.MIN_VALUE); + invalidate(); + } + } + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + updateThumbPos(w, h); + } + + void onStartTrackingTouch() { + mIsDragging = true; + } + + void onStopTrackingTouch() { + mIsDragging = false; + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + if (!mIsUserSeekable || !isEnabled()) { + return false; + } + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + if (isInScrollingContainer()) { + mTouchDownX = event.getX(); + } else { + setPressed(true); + if (mThumb != null) { + invalidate(mThumb.getBounds()); + } + onStartTrackingTouch(); + trackTouchEvent(event); + attemptClaimDrag(); + } + break; + case MotionEvent.ACTION_MOVE: + if (mIsDragging) { + trackTouchEvent(event); + } else { + final float x = event.getX(); + if (Math.abs(x - mTouchDownX) > mScaledTouchSlop) { + setPressed(true); + if (mThumb != null) { + invalidate(mThumb.getBounds()); + } + onStartTrackingTouch(); + trackTouchEvent(event); + attemptClaimDrag(); + } + } + break; + case MotionEvent.ACTION_UP: + if (mIsDragging) { + trackTouchEvent(event); + onStopTrackingTouch(); + setPressed(false); + } else { + onStartTrackingTouch(); + trackTouchEvent(event); + onStopTrackingTouch(); + } + invalidate(); + break; + case MotionEvent.ACTION_CANCEL: + if (mIsDragging) { + onStopTrackingTouch(); + setPressed(false); + } + invalidate(); + break; + } + return true; + } + + @Override + public boolean performAccessibilityAction(int action, Bundle arguments) { + if (super.performAccessibilityAction(action, arguments)) { + return true; + } + if (!isEnabled()) { + return false; + } + final int progress = getProgress(); + final int increment = Math.max(1, Math.round((float) getMax() / 5)); + switch (action) { + case AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD: { + if (progress <= 0) { + return false; + } + setProgress(progress - increment, true); + onKeyChange(); + return true; + } + case AccessibilityNodeInfo.ACTION_SCROLL_FORWARD: { + if (progress >= getMax()) { + return false; + } + setProgress(progress + increment, true); + onKeyChange(); + return true; + } + } + return false; + } + + public void setKeyProgressIncrement(int increment) { + mKeyProgressIncrement = increment < 0 ? -increment : increment; + } + + @Override + public synchronized void setMax(int max) { + super.setMax(max); + if (mKeyProgressIncrement == 0 || getMax() / mKeyProgressIncrement > 20) { + setKeyProgressIncrement(Math.max(1, + Math.round((float) getMax() / 20))); + } + } + + public void setThumb(Drawable thumb) { + boolean needUpdate; + if (mThumb != null && thumb != mThumb) { + mThumb.setCallback(null); + needUpdate = true; + } else { + needUpdate = false; + } + if (thumb != null) { + thumb.setCallback(this); + mThumbOffset = thumb.getIntrinsicWidth() / 2; + if (needUpdate + && (thumb.getIntrinsicWidth() != mThumb.getIntrinsicWidth() || thumb + .getIntrinsicHeight() != mThumb + .getIntrinsicHeight())) { + requestLayout(); + } + } + mThumb = thumb; + invalidate(); + if (needUpdate) { + updateThumbPos(getWidth(), getHeight()); + if (thumb != null && thumb.isStateful()) { + int[] state = getDrawableState(); + thumb.setState(state); + } + } + } + + public void setThumbOffset(int thumbOffset) { + mThumbOffset = thumbOffset; + invalidate(); + } + + private void setThumbPos(int w, Drawable thumb, float scale, int gap) { + int available = w - getPaddingLeft() - getPaddingRight(); + int thumbWidth = thumb.getIntrinsicWidth(); + int thumbHeight = thumb.getIntrinsicHeight(); + available -= thumbWidth; + available += mThumbOffset * 2; + int thumbPos = (int) (scale * available); + int topBound, bottomBound; + if (gap == Integer.MIN_VALUE) { + Rect oldBounds = thumb.getBounds(); + topBound = oldBounds.top; + bottomBound = oldBounds.bottom; + } else { + topBound = gap; + bottomBound = gap + thumbHeight; + } + thumb.setBounds(thumbPos, topBound, thumbPos + thumbWidth, bottomBound); + } + + private void trackTouchEvent(MotionEvent event) { + final int width = getWidth(); + final int available = width - getPaddingLeft() - getPaddingRight(); + int x = (int) event.getX(); + float scale; + float progress = 0; + if (x < getPaddingLeft()) { + scale = 0.0f; + } else if (x > width - getPaddingRight()) { + scale = 1.0f; + } else { + scale = (float) (x - getPaddingLeft()) / (float) available; + progress = mTouchProgressOffset; + } + final int max = getMax(); + progress += scale * max; + setProgress((int) progress, true); + } + + private void updateThumbPos(int w, int h) { + Drawable d = getCurrentDrawable(); + Drawable thumb = mThumb; + int thumbHeight = thumb == null ? 0 : thumb.getIntrinsicHeight(); + int trackHeight = Math.min(mMaxHeight, h - getPaddingTop() + - getPaddingBottom()); + int max = getMax(); + float scale = max > 0 ? (float) getProgress() / (float) max : 0; + if (thumbHeight > trackHeight) { + if (thumb != null) { + setThumbPos(w, thumb, scale, 0); + } + int gapForCenteringTrack = (thumbHeight - trackHeight) / 2; + if (d != null) { + d.setBounds(0, gapForCenteringTrack, w - getPaddingRight() + - getPaddingLeft(), h - getPaddingBottom() + - gapForCenteringTrack - getPaddingTop()); + } + } else { + if (d != null) { + d.setBounds(0, 0, w - getPaddingRight() - getPaddingLeft(), h + - getPaddingBottom() - getPaddingTop()); + } + int gap = (trackHeight - thumbHeight) / 2; + if (thumb != null) { + setThumbPos(w, thumb, scale, gap); + } + } + } + + @Override + protected boolean verifyDrawable(Drawable who) { + return who == mThumb || super.verifyDrawable(who); + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/AbsSpinner.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/AbsSpinner.java new file mode 100644 index 0000000000..b789140d86 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/AbsSpinner.java @@ -0,0 +1,382 @@ + +package org.holoeverywhere.widget; + +import org.holoeverywhere.ArrayAdapter; +import org.holoeverywhere.R; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.res.TypedArray; +import android.database.DataSetObserver; +import android.graphics.Rect; +import android.os.Build.VERSION; +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.view.accessibility.AccessibilityEvent; +import android.view.accessibility.AccessibilityNodeInfo; +import android.widget.SpinnerAdapter; + +public abstract class AbsSpinner extends AdapterView { + class RecycleBin { + private final SparseArray mScrapHeap = new SparseArray(); + + 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(); + } + + View get(int position) { + View result = mScrapHeap.get(position); + if (result != null) { + mScrapHeap.delete(position); + } + return result; + } + + public void put(int position, View v) { + mScrapHeap.put(position, v); + } + } + + static class SavedState extends BaseSavedState { + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + @Override + public SavedState createFromParcel(Parcel in) { + return new SavedState(in); + } + + @Override + public SavedState[] newArray(int size) { + return new SavedState[size]; + } + }; + int position; + + long selectedId; + + private SavedState(Parcel in) { + super(in); + selectedId = in.readLong(); + position = in.readInt(); + } + + SavedState(Parcelable superState) { + super(superState); + } + + @Override + public String toString() { + return "AbsSpinner.SavedState{" + + Integer.toHexString(System.identityHashCode(this)) + + " selectedId=" + selectedId + " position=" + position + + "}"; + } + + @Override + public void writeToParcel(Parcel out, int flags) { + super.writeToParcel(out, flags); + out.writeLong(selectedId); + out.writeInt(position); + } + } + + SpinnerAdapter mAdapter; + private DataSetObserver mDataSetObserver; + int mHeightMeasureSpec; + final RecycleBin mRecycler = new RecycleBin(); + int mSelectionBottomPadding = 0; + int mSelectionLeftPadding = 0; + int mSelectionRightPadding = 0; + int mSelectionTopPadding = 0; + final Rect mSpinnerPadding = new Rect(); + + private Rect mTouchFrame; + + int mWidthMeasureSpec; + + public AbsSpinner(Context context) { + super(context); + initAbsSpinner(); + } + + public AbsSpinner(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public AbsSpinner(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + initAbsSpinner(); + TypedArray a = context.obtainStyledAttributes(attrs, + R.styleable.AbsSpinner, defStyle, 0); + CharSequence[] entries = a + .getTextArray(R.styleable.AbsSpinner_android_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(); + } + + @Override + protected ViewGroup.LayoutParams generateDefaultLayoutParams() { + return new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT); + } + + @Override + public SpinnerAdapter getAdapter() { + return mAdapter; + } + + int getChildHeight(View child) { + return child.getMeasuredHeight(); + } + + int getChildWidth(View child) { + return child.getMeasuredWidth(); + } + + @Override + public int getCount() { + return mItemCount; + } + + @Override + public View getSelectedView() { + if (mItemCount > 0 && mSelectedPosition >= 0) { + return getChildAt(mSelectedPosition - mFirstPosition); + } else { + return null; + } + } + + private void initAbsSpinner() { + setFocusable(true); + setWillNotDraw(false); + } + + abstract void layout(int delta, boolean animate); + + @Override + @SuppressLint("NewApi") + public void onInitializeAccessibilityEvent(AccessibilityEvent event) { + super.onInitializeAccessibilityEvent(event); + event.setClassName(AbsSpinner.class.getName()); + } + + @Override + @SuppressLint("NewApi") + public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { + super.onInitializeAccessibilityNodeInfo(info); + info.setClassName(AbsSpinner.class.getName()); + } + + @SuppressLint("NewApi") + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int widthMode = MeasureSpec.getMode(widthMeasureSpec); + int widthSize; + int heightSize; + mSpinnerPadding.left = getPaddingLeft() > mSelectionLeftPadding ? getPaddingLeft() + : mSelectionLeftPadding; + mSpinnerPadding.top = getPaddingTop() > mSelectionTopPadding ? getPaddingTop() + : mSelectionTopPadding; + mSpinnerPadding.right = getPaddingRight() > mSelectionRightPadding ? getPaddingRight() + : mSelectionRightPadding; + mSpinnerPadding.bottom = getPaddingBottom() > mSelectionBottomPadding ? getPaddingBottom() + : mSelectionBottomPadding; + if (mDataChanged) { + handleDataChanged(); + } + int preferredHeight = 0; + int preferredWidth = 0; + boolean needsMeasuring = true; + int selectedPosition = getSelectedItemPosition(); + if (selectedPosition >= 0 && mAdapter != null + && selectedPosition < mAdapter.getCount()) { + View view = mRecycler.get(selectedPosition); + if (view == null) { + view = mAdapter.getView(selectedPosition, null, this); + if (VERSION.SDK_INT >= 16 + && view.getImportantForAccessibility() == View.IMPORTANT_FOR_ACCESSIBILITY_AUTO) { + view.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES); + } + } + if (view != null) { + 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) { + preferredHeight = mSpinnerPadding.top + mSpinnerPadding.bottom; + if (widthMode == MeasureSpec.UNSPECIFIED) { + preferredWidth = mSpinnerPadding.left + mSpinnerPadding.right; + } + } + preferredHeight = Math + .max(preferredHeight, getSuggestedMinimumHeight()); + preferredWidth = Math.max(preferredWidth, getSuggestedMinimumWidth()); + heightSize = org.holoeverywhere.internal._View + .supportResolveSizeAndState(preferredHeight, heightMeasureSpec, + 0); + widthSize = org.holoeverywhere.internal._View + .supportResolveSizeAndState(preferredWidth, widthMeasureSpec, 0); + setMeasuredDimension(widthSize, heightSize); + mHeightMeasureSpec = heightMeasureSpec; + mWidthMeasureSpec = widthMeasureSpec; + } + + @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 = AdapterView.SYNC_SELECTED_POSITION; + requestLayout(); + } + } + + @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 = AdapterView.INVALID_POSITION; + } + return ss; + } + + 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 AdapterView.INVALID_POSITION; + } + + void recycleAllViews() { + final int childCount = getChildCount(); + final AbsSpinner.RecycleBin recycleBin = mRecycler; + final int position = mFirstPosition; + for (int i = 0; i < childCount; i++) { + View v = getChildAt(i); + int index = position + i; + recycleBin.put(index, v); + } + } + + @Override + public void requestLayout() { + if (!mBlockLayoutRequests) { + super.requestLayout(); + } + } + + void resetList() { + mDataChanged = false; + mNeedSync = false; + removeAllViewsInLayout(); + mOldSelectedPosition = AdapterView.INVALID_POSITION; + mOldSelectedRowId = AdapterView.INVALID_ROW_ID; + setSelectedPositionInt(AdapterView.INVALID_POSITION); + setNextSelectedPositionInt(AdapterView.INVALID_POSITION); + invalidate(); + } + + @Override + public void setAdapter(SpinnerAdapter adapter) { + if (null != mAdapter) { + mAdapter.unregisterDataSetObserver(mDataSetObserver); + resetList(); + } + mAdapter = adapter; + mOldSelectedPosition = AdapterView.INVALID_POSITION; + mOldSelectedRowId = AdapterView.INVALID_ROW_ID; + if (mAdapter != null) { + mOldItemCount = mItemCount; + mItemCount = mAdapter.getCount(); + checkFocus(); + mDataSetObserver = new AdapterDataSetObserver(); + mAdapter.registerDataSetObserver(mDataSetObserver); + int position = mItemCount > 0 ? 0 : AdapterView.INVALID_POSITION; + setSelectedPositionInt(position); + setNextSelectedPositionInt(position); + if (mItemCount == 0) { + checkSelectionChanged(); + } + } else { + checkFocus(); + resetList(); + checkSelectionChanged(); + } + requestLayout(); + } + + @Override + public void setSelection(int position) { + setNextSelectedPositionInt(position); + requestLayout(); + invalidate(); + } + + public void setSelection(int position, boolean animate) { + boolean shouldAnimate = animate && mFirstPosition <= position + && position <= mFirstPosition + getChildCount() - 1; + setSelectionInt(position, shouldAnimate); + } + + void setSelectionInt(int position, boolean animate) { + if (position != mOldSelectedPosition) { + mBlockLayoutRequests = true; + int delta = position - mSelectedPosition; + setNextSelectedPositionInt(position); + layout(delta, animate); + mBlockLayoutRequests = false; + } + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/AdapterView.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/AdapterView.java new file mode 100644 index 0000000000..cb4c10703c --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/AdapterView.java @@ -0,0 +1,677 @@ + +package org.holoeverywhere.widget; + +import org.holoeverywhere.internal._ViewGroup; +import org.holoeverywhere.util.ReflectHelper; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.database.DataSetObserver; +import android.os.Build.VERSION; +import android.os.Parcelable; +import android.os.SystemClock; +import android.util.AttributeSet; +import android.util.SparseArray; +import android.view.SoundEffectConstants; +import android.view.View; +import android.view.ViewDebug; +import android.view.accessibility.AccessibilityEvent; +import android.view.accessibility.AccessibilityNodeInfo; +import android.widget.Adapter; + +public abstract class AdapterView extends _ViewGroup { + class AdapterDataSetObserver extends DataSetObserver { + private Parcelable mInstanceState = null; + + public void clearSavedState() { + mInstanceState = null; + } + + @Override + public void onChanged() { + mDataChanged = true; + mOldItemCount = mItemCount; + mItemCount = getAdapter().getCount(); + if (AdapterView.this.getAdapter().hasStableIds() + && mInstanceState != null && mOldItemCount == 0 + && mItemCount > 0) { + onRestoreInstanceState(mInstanceState); + mInstanceState = null; + } else { + rememberSyncState(); + } + checkFocus(); + requestLayout(); + } + + @Override + public void onInvalidated() { + mDataChanged = true; + if (AdapterView.this.getAdapter().hasStableIds()) { + mInstanceState = onSaveInstanceState(); + } + mOldItemCount = mItemCount; + mItemCount = 0; + mSelectedPosition = AdapterView.INVALID_POSITION; + mSelectedRowId = AdapterView.INVALID_ROW_ID; + mNextSelectedPosition = AdapterView.INVALID_POSITION; + mNextSelectedRowId = AdapterView.INVALID_ROW_ID; + mNeedSync = false; + checkFocus(); + requestLayout(); + } + } + + public interface OnItemClickListener { + void onItemClick(AdapterView parent, View view, int position, long id); + } + + public interface OnItemLongClickListener { + boolean onItemLongClick(AdapterView parent, View view, int position, + long id); + } + + public interface OnItemSelectedListener { + void onItemSelected(AdapterView parent, View view, int position, + long id); + + void onNothingSelected(AdapterView parent); + } + + private class SelectionNotifier implements Runnable { + @Override + public void run() { + if (mDataChanged) { + if (getAdapter() != null) { + post(this); + } + } else { + fireOnSelected(); + performAccessibilityActionsOnSelected(); + } + } + } + + public static final int INVALID_POSITION = -1; + public static final long INVALID_ROW_ID = Long.MIN_VALUE; + public static final int ITEM_VIEW_TYPE_HEADER_OR_FOOTER = -2; + public static final int ITEM_VIEW_TYPE_IGNORE = -1; + static final int SYNC_FIRST_POSITION = 1; + static final int SYNC_MAX_DURATION_MILLIS = 100; + static final int SYNC_SELECTED_POSITION = 0; + boolean mBlockLayoutRequests = false; + boolean mDataChanged; + private boolean mDesiredFocusableInTouchModeState; + private boolean mDesiredFocusableState; + private View mEmptyView; + @ViewDebug.ExportedProperty(category = "scrolling") + int mFirstPosition = 0; + boolean mInLayout = false; + @ViewDebug.ExportedProperty(category = "list") + int mItemCount; + private int mLayoutHeight; + boolean mNeedSync = false; + @ViewDebug.ExportedProperty(category = "list") + int mNextSelectedPosition = AdapterView.INVALID_POSITION; + long mNextSelectedRowId = AdapterView.INVALID_ROW_ID; + int mOldItemCount; + int mOldSelectedPosition = AdapterView.INVALID_POSITION; + long mOldSelectedRowId = AdapterView.INVALID_ROW_ID; + OnItemClickListener mOnItemClickListener; + OnItemLongClickListener mOnItemLongClickListener; + OnItemSelectedListener mOnItemSelectedListener; + @ViewDebug.ExportedProperty(category = "list") + int mSelectedPosition = AdapterView.INVALID_POSITION; + long mSelectedRowId = AdapterView.INVALID_ROW_ID; + + private SelectionNotifier mSelectionNotifier; + + int mSpecificTop; + + long mSyncHeight; + + int mSyncMode; + + int mSyncPosition; + + long mSyncRowId = AdapterView.INVALID_ROW_ID; + + public AdapterView(Context context) { + super(context); + } + + public AdapterView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @SuppressLint("NewApi") + public AdapterView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + if (VERSION.SDK_INT >= 16 + && getImportantForAccessibility() == View.IMPORTANT_FOR_ACCESSIBILITY_AUTO) { + setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES); + } + } + + @Override + public void addView(View child) { + throw new UnsupportedOperationException( + "addView(View) is not supported in AdapterView"); + } + + @Override + public void addView(View child, int index) { + throw new UnsupportedOperationException( + "addView(View, int) is not supported in AdapterView"); + } + + @Override + public void addView(View child, int index, LayoutParams params) { + throw new UnsupportedOperationException( + "addView(View, int, LayoutParams) " + + "is not supported in AdapterView"); + } + + @Override + public void addView(View child, LayoutParams params) { + throw new UnsupportedOperationException("addView(View, LayoutParams) " + + "is not supported in AdapterView"); + } + + @Override + protected boolean canAnimate() { + return super.canAnimate() && mItemCount > 0; + } + + void checkFocus() { + final T adapter = getAdapter(); + final boolean empty = adapter == null || adapter.getCount() == 0; + final boolean focusable = !empty || isInFilterMode(); + super.setFocusableInTouchMode(focusable + && mDesiredFocusableInTouchModeState); + super.setFocusable(focusable && mDesiredFocusableState); + if (mEmptyView != null) { + updateEmptyStatus(adapter == null || adapter.isEmpty()); + } + } + + void checkSelectionChanged() { + if (mSelectedPosition != mOldSelectedPosition + || mSelectedRowId != mOldSelectedRowId) { + selectionChanged(); + mOldSelectedPosition = mSelectedPosition; + mOldSelectedRowId = mSelectedRowId; + } + } + + @Override + public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { + View selectedView = getSelectedView(); + if (selectedView != null + && selectedView.getVisibility() == View.VISIBLE + && selectedView.dispatchPopulateAccessibilityEvent(event)) { + return true; + } + return false; + } + + @Override + protected void dispatchRestoreInstanceState( + SparseArray container) { + dispatchThawSelfOnly(container); + } + + @Override + protected void dispatchSaveInstanceState(SparseArray container) { + dispatchFreezeSelfOnly(container); + } + + int findSyncPosition() { + int count = mItemCount; + if (count == 0) { + return AdapterView.INVALID_POSITION; + } + long idToMatch = mSyncRowId; + int seed = mSyncPosition; + if (idToMatch == AdapterView.INVALID_ROW_ID) { + return AdapterView.INVALID_POSITION; + } + seed = Math.max(0, seed); + seed = Math.min(count - 1, seed); + long endTime = SystemClock.uptimeMillis() + + AdapterView.SYNC_MAX_DURATION_MILLIS; + long rowId; + int first = seed; + int last = seed; + boolean next = false; + boolean hitFirst; + boolean hitLast; + T adapter = getAdapter(); + if (adapter == null) { + return AdapterView.INVALID_POSITION; + } + while (SystemClock.uptimeMillis() <= endTime) { + rowId = adapter.getItemId(seed); + if (rowId == idToMatch) { + return seed; + } + hitLast = last == count - 1; + hitFirst = first == 0; + if (hitLast && hitFirst) { + break; + } + if (hitFirst || next && !hitLast) { + last++; + seed = last; + next = false; + } else if (hitLast || !next && !hitFirst) { + first--; + seed = first; + next = true; + } + } + return AdapterView.INVALID_POSITION; + } + + private void fireOnSelected() { + if (mOnItemSelectedListener == null) { + return; + } + final int selection = getSelectedItemPosition(); + if (selection >= 0) { + View v = getSelectedView(); + mOnItemSelectedListener.onItemSelected(this, v, selection, + getAdapter().getItemId(selection)); + } else { + mOnItemSelectedListener.onNothingSelected(this); + } + } + + public abstract T getAdapter(); + + @ViewDebug.CapturedViewProperty + public int getCount() { + return mItemCount; + } + + public View getEmptyView() { + return mEmptyView; + } + + public int getFirstVisiblePosition() { + return mFirstPosition; + } + + 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 ? AdapterView.INVALID_ROW_ID + : adapter.getItemId(position); + } + + public int getLastVisiblePosition() { + return mFirstPosition + getChildCount() - 1; + } + + public final OnItemClickListener getOnItemClickListener() { + return mOnItemClickListener; + } + + public final OnItemLongClickListener getOnItemLongClickListener() { + return mOnItemLongClickListener; + } + + public final OnItemSelectedListener getOnItemSelectedListener() { + return mOnItemSelectedListener; + } + + public int getPositionForView(View view) { + View listItem = view; + try { + View v; + while (!(v = (View) listItem.getParent()).equals(this)) { + listItem = v; + } + } catch (ClassCastException e) { + return AdapterView.INVALID_POSITION; + } + final int childCount = getChildCount(); + for (int i = 0; i < childCount; i++) { + if (getChildAt(i).equals(listItem)) { + return mFirstPosition + i; + } + } + return AdapterView.INVALID_POSITION; + } + + public Object getSelectedItem() { + T adapter = getAdapter(); + int selection = getSelectedItemPosition(); + if (adapter != null && adapter.getCount() > 0 && selection >= 0) { + return adapter.getItem(selection); + } else { + return null; + } + } + + @ViewDebug.CapturedViewProperty + public long getSelectedItemId() { + return mNextSelectedRowId; + } + + @ViewDebug.CapturedViewProperty + public int getSelectedItemPosition() { + return mNextSelectedPosition; + } + + public abstract View getSelectedView(); + + void handleDataChanged() { + final int count = mItemCount; + boolean found = false; + if (count > 0) { + int newPos; + if (mNeedSync) { + mNeedSync = false; + newPos = findSyncPosition(); + if (newPos >= 0) { + int selectablePos = lookForSelectablePosition(newPos, true); + if (selectablePos == newPos) { + setNextSelectedPositionInt(newPos); + found = true; + } + } + } + if (!found) { + newPos = getSelectedItemPosition(); + if (newPos >= count) { + newPos = count - 1; + } + if (newPos < 0) { + newPos = 0; + } + int selectablePos = lookForSelectablePosition(newPos, true); + if (selectablePos < 0) { + selectablePos = lookForSelectablePosition(newPos, false); + } + if (selectablePos >= 0) { + setNextSelectedPositionInt(selectablePos); + checkSelectionChanged(); + found = true; + } + } + } + if (!found) { + mSelectedPosition = AdapterView.INVALID_POSITION; + mSelectedRowId = AdapterView.INVALID_ROW_ID; + mNextSelectedPosition = AdapterView.INVALID_POSITION; + mNextSelectedRowId = AdapterView.INVALID_ROW_ID; + mNeedSync = false; + checkSelectionChanged(); + } + ReflectHelper.invoke(this, "notifyAccessibilityStateChanged", null); + } + + boolean isInFilterMode() { + return false; + } + + private boolean isScrollableForAccessibility() { + T adapter = getAdapter(); + if (adapter != null) { + final int itemCount = adapter.getCount(); + return itemCount > 0 + && (getFirstVisiblePosition() > 0 || getLastVisiblePosition() < itemCount - 1); + } + return false; + } + + int lookForSelectablePosition(int position, boolean lookDown) { + return position; + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + removeCallbacks(mSelectionNotifier); + } + + @SuppressLint("NewApi") + @Override + public void onInitializeAccessibilityEvent(AccessibilityEvent event) { + super.onInitializeAccessibilityEvent(event); + event.setClassName(AdapterView.class.getName()); + 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()); + } + + @SuppressLint("NewApi") + @Override + public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { + super.onInitializeAccessibilityNodeInfo(info); + info.setClassName(AdapterView.class.getName()); + info.setScrollable(isScrollableForAccessibility()); + View selectedView = getSelectedView(); + if (selectedView != null) { + info.setEnabled(selectedView.isEnabled()); + } + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, + int bottom) { + mLayoutHeight = getHeight(); + } + + @SuppressLint("NewApi") + @Override + public boolean onRequestSendAccessibilityEvent(View child, + AccessibilityEvent event) { + if (super.onRequestSendAccessibilityEvent(child, event)) { + AccessibilityEvent record = AccessibilityEvent.obtain(); + onInitializeAccessibilityEvent(record); + child.dispatchPopulateAccessibilityEvent(record); + event.appendRecord(record); + return true; + } + return false; + } + + private void performAccessibilityActionsOnSelected() { + if (!isAccessibilityManagerEnabled()) { + return; + } + final int position = getSelectedItemPosition(); + if (position >= 0) { + sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED); + } + } + + 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, view, position, id); + return true; + } + + return false; + } + + void rememberSyncState() { + if (getChildCount() > 0) { + mNeedSync = true; + mSyncHeight = mLayoutHeight; + if (mSelectedPosition >= 0) { + View v = getChildAt(mSelectedPosition - mFirstPosition); + mSyncRowId = mNextSelectedRowId; + mSyncPosition = mNextSelectedPosition; + if (v != null) { + mSpecificTop = v.getTop(); + } + mSyncMode = AdapterView.SYNC_SELECTED_POSITION; + } else { + View v = getChildAt(0); + T adapter = getAdapter(); + if (mFirstPosition >= 0 && mFirstPosition < adapter.getCount()) { + mSyncRowId = adapter.getItemId(mFirstPosition); + } else { + mSyncRowId = View.NO_ID; + } + mSyncPosition = mFirstPosition; + if (v != null) { + mSpecificTop = v.getTop(); + } + mSyncMode = AdapterView.SYNC_FIRST_POSITION; + } + } + } + + @Override + public void removeAllViews() { + throw new UnsupportedOperationException( + "removeAllViews() is not supported in AdapterView"); + } + + @Override + public void removeView(View child) { + throw new UnsupportedOperationException( + "removeView(View) is not supported in AdapterView"); + } + + @Override + public void removeViewAt(int index) { + throw new UnsupportedOperationException( + "removeViewAt(int) is not supported in AdapterView"); + } + + void selectionChanged() { + if (mOnItemSelectedListener != null || isAccessibilityManagerEnabled()) { + if (mInLayout || mBlockLayoutRequests) { + if (mSelectionNotifier == null) { + mSelectionNotifier = new SelectionNotifier(); + } + post(mSelectionNotifier); + } else { + fireOnSelected(); + performAccessibilityActionsOnSelected(); + } + } + } + + public abstract void setAdapter(T adapter); + + @SuppressLint("NewApi") + public void setEmptyView(View emptyView) { + mEmptyView = emptyView; + if (VERSION.SDK_INT >= 16 + && emptyView != null + && emptyView.getImportantForAccessibility() == View.IMPORTANT_FOR_ACCESSIBILITY_AUTO) { + emptyView + .setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES); + } + final T adapter = getAdapter(); + final boolean empty = adapter == null || adapter.isEmpty(); + updateEmptyStatus(empty); + } + + @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 setNextSelectedPositionInt(int position) { + mNextSelectedPosition = position; + mNextSelectedRowId = getItemIdAtPosition(position); + if (mNeedSync && mSyncMode == AdapterView.SYNC_SELECTED_POSITION + && position >= 0) { + mSyncPosition = position; + mSyncRowId = mNextSelectedRowId; + } + } + + @Override + public void setOnClickListener(OnClickListener l) { + throw new RuntimeException( + "Don't call setOnClickListener for an AdapterView. " + + "You probably want setOnItemClickListener instead"); + } + + public void setOnItemClickListener(OnItemClickListener listener) { + mOnItemClickListener = listener; + } + + public void setOnItemLongClickListener(OnItemLongClickListener listener) { + if (!isLongClickable()) { + setLongClickable(true); + } + mOnItemLongClickListener = listener; + } + + public void setOnItemSelectedListener(OnItemSelectedListener listener) { + mOnItemSelectedListener = listener; + } + + void setSelectedPositionInt(int position) { + mSelectedPosition = position; + mSelectedRowId = getItemIdAtPosition(position); + } + + public abstract void setSelection(int position); + + private void updateEmptyStatus(boolean empty) { + if (isInFilterMode()) { + empty = false; + } + if (empty) { + if (mEmptyView != null) { + mEmptyView.setVisibility(View.VISIBLE); + setVisibility(View.GONE); + } else { + setVisibility(View.VISIBLE); + } + if (mDataChanged) { + this.onLayout(false, getLeft(), getTop(), getRight(), + getBottom()); + } + } else { + if (mEmptyView != null) { + mEmptyView.setVisibility(View.GONE); + } + setVisibility(View.VISIBLE); + } + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/AutoCompleteTextView.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/AutoCompleteTextView.java new file mode 100644 index 0000000000..8a2778b7d1 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/AutoCompleteTextView.java @@ -0,0 +1,722 @@ + +package org.holoeverywhere.widget; + +import org.holoeverywhere.ArrayAdapter; +import org.holoeverywhere.LayoutInflater; +import org.holoeverywhere.R; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.res.TypedArray; +import android.database.DataSetObserver; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.os.Build.VERSION; +import android.text.Editable; +import android.text.InputType; +import android.text.Selection; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.util.AttributeSet; +import android.util.Log; +import android.view.KeyEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.view.inputmethod.CompletionInfo; +import android.view.inputmethod.InputMethodManager; +import android.widget.AdapterView; +import android.widget.Filter; +import android.widget.Filterable; +import android.widget.ListAdapter; + +public class AutoCompleteTextView extends EditText implements + Filter.FilterListener { + private class DropDownItemClickListener implements + AdapterView.OnItemClickListener { + @Override + public void onItemClick(AdapterView parent, View v, int position, + long id) { + performCompletion(v, position, id); + } + } + + private class MyWatcher implements TextWatcher { + @Override + public void afterTextChanged(Editable s) { + doAfterTextChanged(); + } + + @Override + public void beforeTextChanged(CharSequence s, int start, int count, + int after) { + doBeforeTextChanged(); + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, + int count) { + } + } + + private class PassThroughClickListener implements OnClickListener { + private View.OnClickListener mWrapped; + + @Override + public void onClick(View v) { + onClickImpl(); + + if (mWrapped != null) { + mWrapped.onClick(v); + } + } + } + + private class PopupDataSetObserver extends DataSetObserver { + @Override + public void onChanged() { + if (mAdapter != null) { + post(new Runnable() { + @Override + public void run() { + final ListAdapter adapter = mAdapter; + if (adapter != null) { + updateDropDownForFilter(adapter.getCount()); + } + } + }); + } + } + } + + public interface Validator { + CharSequence fixText(CharSequence invalidText); + + boolean isValid(CharSequence text); + } + + static final int EXPAND_MAX = 3; + static final String TAG = "AutoCompleteTextView"; + private ListAdapter mAdapter; + private boolean mBlockCompletion; + private int mDropDownAnchorId; + private boolean mDropDownDismissedOnCompletion = true; + private Filter mFilter; + private int mHintResource; + private CharSequence mHintText; + private TextView mHintView; + private AdapterView.OnItemClickListener mItemClickListener; + private AdapterView.OnItemSelectedListener mItemSelectedListener; + private int mLastKeyCode = KeyEvent.KEYCODE_UNKNOWN; + private PopupDataSetObserver mObserver; + private boolean mOpenBefore; + + private PassThroughClickListener mPassThroughClickListener; + + private ListPopupWindow mPopup; + + private boolean mPopupCanBeUpdated = true; + + private int mThreshold; + + private Validator mValidator = null; + + public AutoCompleteTextView(Context context) { + this(context, null); + } + + public AutoCompleteTextView(Context context, AttributeSet attrs) { + this(context, attrs, R.attr.autoCompleteTextViewStyle); + } + + public AutoCompleteTextView(Context context, AttributeSet attrs, + int defStyle) { + super(context, attrs, defStyle); + mPopup = new ListPopupWindow(context, attrs, + R.attr.autoCompleteTextViewStyle); + mPopup.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); + mPopup.setPromptPosition(ListPopupWindow.POSITION_PROMPT_BELOW); + TypedArray a = context.obtainStyledAttributes(attrs, + R.styleable.AutoCompleteTextView, defStyle, 0); + mThreshold = a + .getInt(R.styleable.AutoCompleteTextView_android_completionThreshold, + 2); + mPopup.setListSelector(a + .getDrawable(R.styleable.AutoCompleteTextView_android_dropDownSelector)); + mPopup.setVerticalOffset((int) a.getDimension( + R.styleable.AutoCompleteTextView_dropDownVerticalOffset, 0.0f)); + mPopup.setHorizontalOffset((int) a + .getDimension( + R.styleable.AutoCompleteTextView_dropDownHorizontalOffset, + 0.0f)); + mDropDownAnchorId = a.getResourceId( + R.styleable.AutoCompleteTextView_android_dropDownAnchor, + View.NO_ID); + mPopup.setWidth(a.getLayoutDimension( + R.styleable.AutoCompleteTextView_android_dropDownWidth, + ViewGroup.LayoutParams.WRAP_CONTENT)); + mPopup.setHeight(a.getLayoutDimension( + R.styleable.AutoCompleteTextView_android_dropDownHeight, + ViewGroup.LayoutParams.WRAP_CONTENT)); + mHintResource = a.getResourceId( + R.styleable.AutoCompleteTextView_android_completionHintView, + R.layout.simple_dropdown_hint); + mPopup.setOnItemClickListener(new DropDownItemClickListener()); + setCompletionHint(a + .getText(R.styleable.AutoCompleteTextView_android_completionHint)); + int inputType = getInputType(); + if ((inputType & InputType.TYPE_MASK_CLASS) == InputType.TYPE_CLASS_TEXT) { + inputType |= InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE; + setRawInputType(inputType); + } + CharSequence[] entries = null; + if (a.hasValue(R.styleable.AutoCompleteTextView_android_entries)) { + entries = a + .getTextArray(R.styleable.AutoCompleteTextView_android_entries); + } + a.recycle(); + setFocusable(true); + addTextChangedListener(new MyWatcher()); + mPassThroughClickListener = new PassThroughClickListener(); + super.setOnClickListener(mPassThroughClickListener); + if (entries != null) { + onLoadEntries(entries); + } + } + + private void buildImeCompletions() { + final ListAdapter adapter = mAdapter; + if (adapter != null) { + InputMethodManager imm = (InputMethodManager) getContext() + .getSystemService(Context.INPUT_METHOD_SERVICE); + if (imm != null) { + final int count = Math.min(adapter.getCount(), 20); + CompletionInfo[] completions = new CompletionInfo[count]; + int realCount = 0; + for (int i = 0; i < count; i++) { + if (adapter.isEnabled(i)) { + Object item = adapter.getItem(i); + long id = adapter.getItemId(i); + completions[realCount] = new CompletionInfo(id, + realCount, convertSelectionToString(item)); + realCount++; + } + } + if (realCount != count) { + CompletionInfo[] tmp = new CompletionInfo[realCount]; + System.arraycopy(completions, 0, tmp, 0, realCount); + completions = tmp; + } + + imm.displayCompletions(this, completions); + } + } + } + + public void clearListSelection() { + mPopup.clearListSelection(); + } + + protected CharSequence convertSelectionToString(Object selectedItem) { + return mFilter.convertResultToString(selectedItem); + } + + public void dismissDropDown() { + InputMethodManager imm = (InputMethodManager) getContext() + .getSystemService(Context.INPUT_METHOD_SERVICE); + if (imm != null) { + imm.displayCompletions(this, null); + } + mPopup.dismiss(); + mPopupCanBeUpdated = false; + } + + void doAfterTextChanged() { + if (mBlockCompletion) { + return; + } + if (mOpenBefore && !isPopupShowing()) { + return; + } + if (enoughToFilter()) { + if (mFilter != null) { + mPopupCanBeUpdated = true; + performFiltering(getText(), mLastKeyCode); + } + } else { + if (!mPopup.isDropDownAlwaysVisible()) { + dismissDropDown(); + } + if (mFilter != null) { + mFilter.filter(null); + } + } + } + + void doBeforeTextChanged() { + if (mBlockCompletion) { + return; + } + mOpenBefore = isPopupShowing(); + } + + public boolean enoughToFilter() { + return getText().length() >= mThreshold; + } + + public void ensureImeVisible(boolean visible) { + mPopup.setInputMethodMode(visible ? ListPopupWindow.INPUT_METHOD_NEEDED + : ListPopupWindow.INPUT_METHOD_NOT_NEEDED); + if (mPopup.isDropDownAlwaysVisible() || mFilter != null + && enoughToFilter()) { + showDropDown(); + } + } + + public ListAdapter getAdapter() { + return mAdapter; + } + + public CharSequence getCompletionHint() { + return mHintText; + } + + public int getDropDownAnchor() { + return mDropDownAnchorId; + } + + public int getDropDownAnimationStyle() { + return mPopup.getAnimationStyle(); + } + + public Drawable getDropDownBackground() { + return mPopup.getBackground(); + } + + public int getDropDownHeight() { + return mPopup.getHeight(); + } + + public int getDropDownHorizontalOffset() { + return mPopup.getHorizontalOffset(); + } + + public int getDropDownVerticalOffset() { + return mPopup.getVerticalOffset(); + } + + public int getDropDownWidth() { + return mPopup.getWidth(); + } + + protected Filter getFilter() { + return mFilter; + } + + public int getListSelection() { + return mPopup.getSelectedItemPosition(); + } + + public AdapterView.OnItemClickListener getOnItemClickListener() { + return mItemClickListener; + } + + public AdapterView.OnItemSelectedListener getOnItemSelectedListener() { + return mItemSelectedListener; + } + + public int getThreshold() { + return mThreshold; + } + + public Validator getValidator() { + return mValidator; + } + + public boolean isDropDownAlwaysVisible() { + return mPopup.isDropDownAlwaysVisible(); + } + + public boolean isDropDownDismissedOnCompletion() { + return mDropDownDismissedOnCompletion; + } + + public boolean isInputMethodNotNeeded() { + return mPopup.getInputMethodMode() == ListPopupWindow.INPUT_METHOD_NOT_NEEDED; + } + + public boolean isPerformingCompletion() { + return mBlockCompletion; + } + + public boolean isPopupShowing() { + return mPopup.isShowing(); + } + + private void onClickImpl() { + if (isPopupShowing()) { + ensureImeVisible(true); + } + } + + @Override + public void onCommitCompletion(CompletionInfo completion) { + if (isPopupShowing()) { + mPopup.performItemClick(completion.getPosition()); + } + } + + @Override + protected void onDetachedFromWindow() { + dismissDropDown(); + super.onDetachedFromWindow(); + } + + @Override + protected void onDisplayHint(int hint) { + super.onDisplayHint(hint); + switch (hint) { + case INVISIBLE: + if (!mPopup.isDropDownAlwaysVisible()) { + dismissDropDown(); + } + break; + } + } + + @Override + public void onFilterComplete(int count) { + updateDropDownForFilter(count); + } + + @Override + protected void onFocusChanged(boolean focused, int direction, + Rect previouslyFocusedRect) { + super.onFocusChanged(focused, direction, previouslyFocusedRect); + if (!focused) { + performValidation(); + } + if (!focused && !mPopup.isDropDownAlwaysVisible()) { + dismissDropDown(); + } + } + + @Override + @SuppressLint("NewApi") + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (mPopup.onKeyDown(keyCode, event)) { + return true; + } + if (!isPopupShowing()) { + switch (keyCode) { + case KeyEvent.KEYCODE_DPAD_DOWN: + if (VERSION.SDK_INT < 11 || event.hasNoModifiers()) { + performValidation(); + } + } + } + if (isPopupShowing() && keyCode == KeyEvent.KEYCODE_TAB + && (VERSION.SDK_INT < 11 || event.hasNoModifiers())) { + return true; + } + mLastKeyCode = keyCode; + boolean handled = super.onKeyDown(keyCode, event); + mLastKeyCode = KeyEvent.KEYCODE_UNKNOWN; + if (handled && isPopupShowing()) { + clearListSelection(); + } + return handled; + } + + @Override + @SuppressLint("NewApi") + public boolean onKeyPreIme(int keyCode, KeyEvent event) { + if (VERSION.SDK_INT < 5) { + return false; + } + if (keyCode == KeyEvent.KEYCODE_BACK && isPopupShowing() + && !mPopup.isDropDownAlwaysVisible()) { + 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()) { + dismissDropDown(); + return true; + } + } + } + return super.onKeyPreIme(keyCode, event); + } + + @Override + @SuppressLint("NewApi") + public boolean onKeyUp(int keyCode, KeyEvent event) { + boolean consumed = mPopup.onKeyUp(keyCode, event); + if (consumed) { + switch (keyCode) { + case KeyEvent.KEYCODE_ENTER: + case KeyEvent.KEYCODE_DPAD_CENTER: + case KeyEvent.KEYCODE_TAB: + if (VERSION.SDK_INT < 11 || event.hasNoModifiers()) { + performCompletion(); + } + return true; + } + } + if (isPopupShowing() && keyCode == KeyEvent.KEYCODE_TAB + && (VERSION.SDK_INT < 11 || event.hasNoModifiers())) { + performCompletion(); + return true; + } + return super.onKeyUp(keyCode, event); + } + + protected void onLoadEntries(CharSequence[] entries) { + setAdapter(new ArrayAdapter(getContext(), + R.layout.simple_dropdown_item_1line, entries)); + } + + @Override + public void onWindowFocusChanged(boolean hasWindowFocus) { + super.onWindowFocusChanged(hasWindowFocus); + if (!hasWindowFocus && !mPopup.isDropDownAlwaysVisible()) { + dismissDropDown(); + } + } + + public void performCompletion() { + performCompletion(null, -1, -1); + } + + private void performCompletion(View selectedView, int position, long id) { + if (isPopupShowing()) { + Object selectedItem; + if (position < 0) { + selectedItem = mPopup.getSelectedItem(); + } else { + selectedItem = mAdapter.getItem(position); + } + if (selectedItem == null) { + Log.w(AutoCompleteTextView.TAG, + "performCompletion: no selected item"); + return; + } + mBlockCompletion = true; + replaceText(convertSelectionToString(selectedItem)); + mBlockCompletion = false; + if (mItemClickListener != null) { + final ListPopupWindow list = mPopup; + if (selectedView == null || position < 0) { + selectedView = list.getSelectedView(); + position = list.getSelectedItemPosition(); + id = list.getSelectedItemId(); + } + mItemClickListener.onItemClick(list.getListView(), + selectedView, position, id); + } + } + if (mDropDownDismissedOnCompletion && !mPopup.isDropDownAlwaysVisible()) { + dismissDropDown(); + } + } + + protected void performFiltering(CharSequence text, int keyCode) { + mFilter.filter(text, this); + } + + public void performValidation() { + if (mValidator == null) { + return; + } + CharSequence text = getText(); + if (!TextUtils.isEmpty(text) && !mValidator.isValid(text)) { + setText(mValidator.fixText(text)); + } + } + + protected void replaceText(CharSequence text) { + clearComposingText(); + setText(text); + Editable spannable = getText(); + Selection.setSelection(spannable, spannable.length()); + } + + public void setAdapter(T adapter) { + if (mObserver == null) { + mObserver = new PopupDataSetObserver(); + } else if (mAdapter != null) { + mAdapter.unregisterDataSetObserver(mObserver); + } + mAdapter = adapter; + if (mAdapter != null) { + mFilter = ((Filterable) mAdapter).getFilter(); + adapter.registerDataSetObserver(mObserver); + } else { + mFilter = null; + } + mPopup.setAdapter(mAdapter); + } + + public void setCompletionHint(CharSequence hint) { + mHintText = hint; + if (hint != null) { + if (mHintView == null) { + final TextView hintView = (TextView) LayoutInflater.inflate( + getContext(), mHintResource).findViewById( + android.R.id.text1); + hintView.setText(mHintText); + mHintView = hintView; + mPopup.setPromptView(hintView); + } else { + mHintView.setText(hint); + } + } else { + mPopup.setPromptView(null); + mHintView = null; + } + } + + public void setDropDownAlwaysVisible(boolean dropDownAlwaysVisible) { + mPopup.setDropDownAlwaysVisible(dropDownAlwaysVisible); + } + + public void setDropDownAnchor(int id) { + mDropDownAnchorId = id; + mPopup.setAnchorView(null); + } + + public void setDropDownAnimationStyle(int animationStyle) { + mPopup.setAnimationStyle(animationStyle); + } + + public void setDropDownBackgroundDrawable(Drawable d) { + mPopup.setBackgroundDrawable(d); + } + + public void setDropDownBackgroundResource(int id) { + mPopup.setBackgroundDrawable(getResources().getDrawable(id)); + } + + public void setDropDownDismissedOnCompletion( + boolean dropDownDismissedOnCompletion) { + mDropDownDismissedOnCompletion = dropDownDismissedOnCompletion; + } + + public void setDropDownHeight(int height) { + mPopup.setHeight(height); + } + + public void setDropDownHorizontalOffset(int offset) { + mPopup.setHorizontalOffset(offset); + } + + public void setDropDownVerticalOffset(int offset) { + mPopup.setVerticalOffset(offset); + } + + public void setDropDownWidth(int width) { + mPopup.setWidth(width); + } + + public void setForceIgnoreOutsideTouch(boolean forceIgnoreOutsideTouch) { + mPopup.setForceIgnoreOutsideTouch(forceIgnoreOutsideTouch); + } + + @Override + protected boolean setFrame(final int l, int t, final int r, int b) { + boolean result = super.setFrame(l, t, r, b); + if (isPopupShowing()) { + showDropDown(); + } + return result; + } + + public void setListSelection(int position) { + mPopup.setSelection(position); + } + + @Override + public void setOnClickListener(OnClickListener listener) { + mPassThroughClickListener.mWrapped = listener; + } + + public void setOnItemClickListener(AdapterView.OnItemClickListener l) { + mItemClickListener = l; + } + + public void setOnItemSelectedListener(AdapterView.OnItemSelectedListener l) { + mItemSelectedListener = l; + } + + public void setText(CharSequence text, boolean filter) { + if (filter) { + setText(text); + } else { + mBlockCompletion = true; + setText(text); + mBlockCompletion = false; + } + } + + public void setThreshold(int threshold) { + if (threshold <= 0) { + threshold = 1; + } + + mThreshold = threshold; + } + + public void setValidator(Validator validator) { + mValidator = validator; + } + + @SuppressLint("NewApi") + public void showDropDown() { + buildImeCompletions(); + if (mPopup.getAnchorView() == null) { + if (mDropDownAnchorId != View.NO_ID) { + mPopup.setAnchorView(getRootView().findViewById( + mDropDownAnchorId)); + } else { + mPopup.setAnchorView(this); + } + } + if (!isPopupShowing()) { + mPopup.setInputMethodMode(ListPopupWindow.INPUT_METHOD_NEEDED); + mPopup.setListItemExpandMax(AutoCompleteTextView.EXPAND_MAX); + } + mPopup.show(); + if (VERSION.SDK_INT >= 9) { + mPopup.getListView().setOverScrollMode(View.OVER_SCROLL_ALWAYS); + } + } + + public void showDropDownAfterLayout() { + mPopup.postShow(); + } + + private void updateDropDownForFilter(int count) { + if (getWindowVisibility() == View.GONE) { + return; + } + final boolean dropDownAlwaysVisible = mPopup.isDropDownAlwaysVisible(); + final boolean enoughToFilter = enoughToFilter(); + if ((count > 0 || dropDownAlwaysVisible) && enoughToFilter) { + if (hasFocus() && hasWindowFocus() && mPopupCanBeUpdated) { + showDropDown(); + } + } else if (!dropDownAlwaysVisible && isPopupShowing()) { + dismissDropDown(); + mPopupCanBeUpdated = true; + } + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/BaseExpandableListAdapter.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/BaseExpandableListAdapter.java new file mode 100644 index 0000000000..e94a1c9c08 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/BaseExpandableListAdapter.java @@ -0,0 +1,77 @@ + +package org.holoeverywhere.widget; + +import android.database.DataSetObservable; +import android.database.DataSetObserver; +import android.widget.ExpandableListAdapter; + +public abstract class BaseExpandableListAdapter implements ExpandableListAdapter, + HeterogeneousExpandableList { + private final DataSetObservable mDataSetObservable = new DataSetObservable(); + + @Override + public boolean areAllItemsEnabled() { + return true; + } + + @Override + public int getChildType(int groupPosition, int childPosition) { + return 0; + } + + @Override + public int getChildTypeCount() { + return 1; + } + + @Override + public long getCombinedChildId(long groupId, long childId) { + return 0x8000000000000000L | (groupId & 0x7FFFFFFF) << 32 | childId & 0xFFFFFFFF; + } + + @Override + public long getCombinedGroupId(long groupId) { + return (groupId & 0x7FFFFFFF) << 32; + } + + @Override + public int getGroupType(int groupPosition) { + return 0; + } + + @Override + public int getGroupTypeCount() { + return 1; + } + + @Override + public boolean isEmpty() { + return getGroupCount() == 0; + } + + public void notifyDataSetChanged() { + mDataSetObservable.notifyChanged(); + } + + public void notifyDataSetInvalidated() { + mDataSetObservable.notifyInvalidated(); + } + + @Override + public void onGroupCollapsed(int groupPosition) { + } + + @Override + public void onGroupExpanded(int groupPosition) { + } + + @Override + public void registerDataSetObserver(DataSetObserver observer) { + mDataSetObservable.registerObserver(observer); + } + + @Override + public void unregisterDataSetObserver(DataSetObserver observer) { + mDataSetObservable.unregisterObserver(observer); + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/Button.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/Button.java new file mode 100644 index 0000000000..4f57a73210 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/Button.java @@ -0,0 +1,84 @@ + +package org.holoeverywhere.widget; + +import org.holoeverywhere.R; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.res.TypedArray; +import android.os.Build.VERSION; +import android.util.AttributeSet; + +public class Button extends android.widget.Button { + private boolean allCaps = false; + private CharSequence originalText; + private BufferType originalType; + + public Button(Context context) { + this(context, null); + } + + public Button(Context context, AttributeSet attrs) { + this(context, attrs, android.R.attr.buttonStyle); + } + + public Button(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + TypedArray a = getContext().obtainStyledAttributes(attrs, + R.styleable.TextView, defStyle, 0); + if (a.hasValue(R.styleable.TextView_android_textAllCaps)) { + allCaps = a.getBoolean(R.styleable.TextView_android_textAllCaps, + false); + } else { + allCaps = a.getBoolean(R.styleable.TextView_textAllCaps, false); + } + CharSequence text = null; + if (a.hasValue(R.styleable.TextView_android_text)) { + text = a.getText(R.styleable.TextView_android_text); + } + a.recycle(); + if (text != null) { + setText(text); + } + } + + @Override + @SuppressLint("NewApi") + public void dispatchDisplayHint(int hint) { + onDisplayHint(hint); + } + + public boolean isAllCaps() { + return allCaps; + } + + @Override + @SuppressLint("NewApi") + protected void onDisplayHint(int hint) { + if (VERSION.SDK_INT >= 8) { + super.onDisplayHint(hint); + } + } + + @Override + public void setAllCaps(boolean allCaps) { + this.allCaps = allCaps; + updateTextState(); + } + + @Override + public void setText(CharSequence text, BufferType type) { + originalText = text; + originalType = type; + updateTextState(); + } + + private void updateTextState() { + if (originalText == null) { + super.setText(null, originalType); + return; + } + super.setText(allCaps ? originalText.toString().toUpperCase() + : originalText, originalType); + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/CalendarView.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/CalendarView.java new file mode 100644 index 0000000000..4441869351 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/CalendarView.java @@ -0,0 +1,906 @@ + +package org.holoeverywhere.widget; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Locale; + +import org.holoeverywhere.FontLoader; +import org.holoeverywhere.LayoutInflater; +import org.holoeverywhere.R; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.res.Configuration; +import android.content.res.TypedArray; +import android.database.DataSetObserver; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Paint.Align; +import android.graphics.Paint.Style; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.os.Build.VERSION; +import android.text.TextUtils; +import android.text.format.DateUtils; +import android.util.AttributeSet; +import android.util.DisplayMetrics; +import android.util.Log; +import android.util.TypedValue; +import android.view.GestureDetector; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AbsListView; +import android.widget.AbsListView.OnScrollListener; +import android.widget.BaseAdapter; + +public class CalendarView extends FrameLayout { + public interface OnDateChangeListener { + public void onSelectedDayChange(CalendarView view, int year, int month, + int dayOfMonth); + } + + private class ScrollStateRunnable implements Runnable { + private int mNewState; + private AbsListView mView; + + public void doScrollStateChange(AbsListView view, int scrollState) { + mView = view; + mNewState = scrollState; + removeCallbacks(this); + postDelayed(this, CalendarView.SCROLL_CHANGE_DELAY); + } + + @Override + @SuppressLint("NewApi") + public void run() { + mCurrentScrollState = mNewState; + if (mNewState == OnScrollListener.SCROLL_STATE_IDLE + && mPreviousScrollState != OnScrollListener.SCROLL_STATE_IDLE) { + View child = mView.getChildAt(0); + if (child == null) { + return; + } + int dist = child.getBottom() - mListScrollTopOffset; + if (dist > mListScrollTopOffset) { + int y = dist - (mIsScrollingUp ? child.getHeight() : 0); + if (VERSION.SDK_INT >= 11) { + mView.smoothScrollBy(y, + CalendarView.ADJUSTMENT_SCROLL_DURATION); + } else { + mView.scrollBy(0, y); + } + } + } + mPreviousScrollState = mNewState; + } + } + + private class WeeksAdapter extends BaseAdapter implements OnTouchListener { + class CalendarGestureListener extends + GestureDetector.SimpleOnGestureListener { + @Override + public boolean onSingleTapUp(MotionEvent e) { + return true; + } + } + + private Context context; + private int mFocusedMonth; + private GestureDetector mGestureDetector; + private final Calendar mSelectedDate = Calendar.getInstance(); + private int mSelectedWeek; + private int mTotalWeekCount; + + public WeeksAdapter(Context context) { + this.context = context; + mGestureDetector = new GestureDetector(context, + new CalendarGestureListener()); + init(); + } + + @Override + public int getCount() { + return mTotalWeekCount; + } + + @Override + public Object getItem(int position) { + return null; + } + + @Override + public long getItemId(int position) { + return position; + } + + public Calendar getSelectedDay() { + return mSelectedDate; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + WeekView weekView = null; + if (convertView != null) { + weekView = (WeekView) convertView; + } else { + weekView = new WeekView(context); + android.widget.AbsListView.LayoutParams params = new android.widget.AbsListView.LayoutParams( + android.view.ViewGroup.LayoutParams.WRAP_CONTENT, + android.view.ViewGroup.LayoutParams.WRAP_CONTENT); + weekView.setLayoutParams(params); + weekView.setClickable(true); + weekView.setOnTouchListener(this); + } + + int selectedWeekDay = mSelectedWeek == position ? mSelectedDate + .get(Calendar.DAY_OF_WEEK) : -1; + weekView.init(position, selectedWeekDay, mFocusedMonth); + + return weekView; + } + + private void init() { + mSelectedWeek = getWeeksSinceMinDate(mSelectedDate); + mTotalWeekCount = getWeeksSinceMinDate(mMaxDate); + if (mMinDate.get(Calendar.DAY_OF_WEEK) != mFirstDayOfWeek + || mMaxDate.get(Calendar.DAY_OF_WEEK) != mFirstDayOfWeek) { + mTotalWeekCount++; + } + } + + private void onDateTapped(Calendar day) { + setSelectedDay(day); + setMonthDisplayed(day); + } + + @Override + public boolean onTouch(View v, MotionEvent event) { + if (mListView.isEnabled() && mGestureDetector.onTouchEvent(event)) { + WeekView weekView = (WeekView) v; + if (!weekView.getDayFromLocation(event.getX(), mTempDate)) { + return true; + } + if (mTempDate.before(mMinDate) || mTempDate.after(mMaxDate)) { + return true; + } + onDateTapped(mTempDate); + return true; + } + return false; + } + + public void setFocusMonth(int month) { + if (mFocusedMonth == month) { + return; + } + mFocusedMonth = month; + notifyDataSetChanged(); + } + + public void setSelectedDay(Calendar selectedDay) { + if (selectedDay.get(Calendar.DAY_OF_YEAR) == mSelectedDate + .get(Calendar.DAY_OF_YEAR) + && selectedDay.get(Calendar.YEAR) == mSelectedDate + .get(Calendar.YEAR)) { + return; + } + mSelectedDate.setTimeInMillis(selectedDay.getTimeInMillis()); + mSelectedWeek = getWeeksSinceMinDate(mSelectedDate); + mFocusedMonth = mSelectedDate.get(Calendar.MONTH); + notifyDataSetChanged(); + } + } + + private class WeekView extends View { + private String[] mDayNumbers; + private final Paint mDrawPaint = new Paint(); + private Calendar mFirstDay; + private boolean[] mFocusDay; + private boolean mHasSelectedDay = false; + private int mHeight; + private int mLastWeekDayMonth = -1; + private final Paint mMonthNumDrawPaint = new Paint(); + private int mMonthOfFirstWeekDay = -1; + private int mNumCells; + private int mSelectedDay = -1; + private int mSelectedLeft = -1; + private int mSelectedRight = -1; + private final Rect mTempRect = new Rect(); + private int mWeek = -1; + private int mWidth; + + public WeekView(Context context) { + super(context); + + mHeight = (mListView.getHeight() - mListView.getPaddingTop() - mListView + .getPaddingBottom()) / mShownWeekCount; + setPaintProperties(); + } + + private void drawBackground(Canvas canvas) { + if (!mHasSelectedDay) { + return; + } + mDrawPaint.setColor(mSelectedWeekBackgroundColor); + mTempRect.top = mWeekSeperatorLineWidth; + mTempRect.bottom = mHeight; + mTempRect.left = mShowWeekNumber ? mWidth / mNumCells : 0; + mTempRect.right = mSelectedLeft - 2; + canvas.drawRect(mTempRect, mDrawPaint); + mTempRect.left = mSelectedRight + 3; + mTempRect.right = mWidth; + canvas.drawRect(mTempRect, mDrawPaint); + } + + private void drawSelectedDateVerticalBars(Canvas canvas) { + if (!mHasSelectedDay) { + return; + } + mSelectedDateVerticalBar.setBounds(mSelectedLeft + - mSelectedDateVerticalBarWidth / 2, + mWeekSeperatorLineWidth, mSelectedLeft + + mSelectedDateVerticalBarWidth / 2, mHeight); + mSelectedDateVerticalBar.draw(canvas); + mSelectedDateVerticalBar.setBounds(mSelectedRight + - mSelectedDateVerticalBarWidth / 2, + mWeekSeperatorLineWidth, mSelectedRight + + mSelectedDateVerticalBarWidth / 2, mHeight); + mSelectedDateVerticalBar.draw(canvas); + } + + private void drawWeekNumbers(Canvas canvas) { + float textHeight = mDrawPaint.getTextSize(); + int y = (int) ((mHeight + textHeight) / 2) + - mWeekSeperatorLineWidth; + int nDays = mNumCells; + + mDrawPaint.setTextAlign(Align.CENTER); + int i = 0; + int divisor = 2 * nDays; + if (mShowWeekNumber) { + mDrawPaint.setColor(mWeekNumberColor); + int x = mWidth / divisor; + canvas.drawText(mDayNumbers[0], x, y, mDrawPaint); + i++; + } + for (; i < nDays; i++) { + mMonthNumDrawPaint + .setColor(mFocusDay[i] ? mFocusedMonthDateColor + : mUnfocusedMonthDateColor); + int x = (2 * i + 1) * mWidth / divisor; + canvas.drawText(mDayNumbers[i], x, y, mMonthNumDrawPaint); + } + } + + private void drawWeekSeparators(Canvas canvas) { + int firstFullyVisiblePosition = mListView.getFirstVisiblePosition(); + if (mListView.getChildAt(0).getTop() < 0) { + firstFullyVisiblePosition++; + } + if (firstFullyVisiblePosition == mWeek) { + return; + } + mDrawPaint.setColor(mWeekSeparatorLineColor); + mDrawPaint.setStrokeWidth(mWeekSeperatorLineWidth); + float x = mShowWeekNumber ? mWidth / mNumCells : 0; + canvas.drawLine(x, 0, mWidth, 0, mDrawPaint); + } + + public boolean getDayFromLocation(float x, Calendar outCalendar) { + int dayStart = mShowWeekNumber ? mWidth / mNumCells : 0; + if (x < dayStart || x > mWidth) { + outCalendar.clear(); + return false; + } + int dayPosition = (int) ((x - dayStart) * mDaysPerWeek / (mWidth - dayStart)); + outCalendar.setTimeInMillis(mFirstDay.getTimeInMillis()); + outCalendar.add(Calendar.DAY_OF_MONTH, dayPosition); + return true; + } + + public Calendar getFirstDay() { + return mFirstDay; + } + + public int getMonthOfFirstWeekDay() { + return mMonthOfFirstWeekDay; + } + + public int getMonthOfLastWeekDay() { + return mLastWeekDayMonth; + } + + public void init(int weekNumber, int selectedWeekDay, int focusedMonth) { + mSelectedDay = selectedWeekDay; + mHasSelectedDay = mSelectedDay != -1; + mNumCells = mShowWeekNumber ? mDaysPerWeek + 1 : mDaysPerWeek; + mWeek = weekNumber; + mTempDate.setTimeInMillis(mMinDate.getTimeInMillis()); + mTempDate.add(Calendar.WEEK_OF_YEAR, mWeek); + mTempDate.setFirstDayOfWeek(mFirstDayOfWeek); + mDayNumbers = new String[mNumCells]; + mFocusDay = new boolean[mNumCells]; + int i = 0; + if (mShowWeekNumber) { + mDayNumbers[0] = Integer.toString(mTempDate + .get(Calendar.WEEK_OF_YEAR)); + i++; + } + int diff = mFirstDayOfWeek - mTempDate.get(Calendar.DAY_OF_WEEK); + mTempDate.add(Calendar.DAY_OF_MONTH, diff); + mFirstDay = (Calendar) mTempDate.clone(); + mMonthOfFirstWeekDay = mTempDate.get(Calendar.MONTH); + for (; i < mNumCells; i++) { + mFocusDay[i] = mTempDate.get(Calendar.MONTH) == focusedMonth; + if (mTempDate.before(mMinDate) || mTempDate.after(mMaxDate)) { + mDayNumbers[i] = ""; + } else { + mDayNumbers[i] = Integer.toString(mTempDate + .get(Calendar.DAY_OF_MONTH)); + } + mTempDate.add(Calendar.DAY_OF_MONTH, 1); + } + if (mTempDate.get(Calendar.DAY_OF_MONTH) == 1) { + mTempDate.add(Calendar.DAY_OF_MONTH, -1); + } + mLastWeekDayMonth = mTempDate.get(Calendar.MONTH); + updateSelectionPositions(); + } + + @Override + protected void onDraw(Canvas canvas) { + drawBackground(canvas); + drawWeekNumbers(canvas); + drawWeekSeparators(canvas); + drawSelectedDateVerticalBars(canvas); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), mHeight); + } + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + mWidth = w; + updateSelectionPositions(); + } + + private void setPaintProperties() { + mDrawPaint.setFakeBoldText(false); + mDrawPaint.setAntiAlias(true); + mDrawPaint.setTextSize(mDateTextSize); + mDrawPaint.setStyle(Style.FILL); + + mMonthNumDrawPaint.setFakeBoldText(true); + mMonthNumDrawPaint.setAntiAlias(true); + mMonthNumDrawPaint.setTextSize(mDateTextSize); + mMonthNumDrawPaint.setColor(mFocusedMonthDateColor); + mMonthNumDrawPaint.setStyle(Style.FILL); + mMonthNumDrawPaint.setTextAlign(Align.CENTER); + } + + private void updateSelectionPositions() { + if (mHasSelectedDay) { + int selectedPosition = mSelectedDay - mFirstDayOfWeek; + if (selectedPosition < 0) { + selectedPosition += 7; + } + if (mShowWeekNumber) { + selectedPosition++; + } + mSelectedLeft = selectedPosition * mWidth / mNumCells; + mSelectedRight = (selectedPosition + 1) * mWidth / mNumCells; + } + } + } + + private static final int ADJUSTMENT_SCROLL_DURATION = 500; + private static final String DATE_FORMAT = "MM/dd/yyyy"; + private static final int DAYS_PER_WEEK = 7; + private static final String DEFAULT_MAX_DATE = "01/01/2100"; + private static final String DEFAULT_MIN_DATE = "01/01/1900"; + private static final boolean DEFAULT_SHOW_WEEK_NUMBER = true; + private static final int DEFAULT_SHOWN_WEEK_COUNT = 6; + private static final int DEFAULT_WEEK_DAY_TEXT_APPEARANCE_RES_ID = -1; + private static final int GOTO_SCROLL_DURATION = 1000; + private static final String LOG_TAG = CalendarView.class.getSimpleName(); + private static final long MILLIS_IN_DAY = 86400000L; + private static final long MILLIS_IN_WEEK = CalendarView.DAYS_PER_WEEK + * CalendarView.MILLIS_IN_DAY; + private static final int SCROLL_CHANGE_DELAY = 40; + private static final int SCROLL_HYST_WEEKS = 2; + private static final int UNSCALED_BOTTOM_BUFFER = 20; + private static final int UNSCALED_LIST_SCROLL_TOP_OFFSET = 2; + private static final int UNSCALED_SELECTED_DATE_VERTICAL_BAR_WIDTH = 6; + private static final int UNSCALED_WEEK_MIN_VISIBLE_HEIGHT = 12; + private static final int UNSCALED_WEEK_SEPARATOR_LINE_WIDTH = 1; + private WeeksAdapter mAdapter; + private int mBottomBuffer = 20; + private Locale mCurrentLocale; + private int mCurrentMonthDisplayed; + private int mCurrentScrollState = OnScrollListener.SCROLL_STATE_IDLE; + private int mCurrentYearDisplayed; + private final java.text.DateFormat mDateFormat = new SimpleDateFormat( + CalendarView.DATE_FORMAT); + private final int mDateTextSize; + private String[] mDayLabels; + private ViewGroup mDayNamesHeader; + private int mDaysPerWeek = 7; + private Calendar mFirstDayOfMonth; + private int mFirstDayOfWeek; + private final int mFocusedMonthDateColor; + private float mFriction = .05f; + private boolean mIsScrollingUp = false; + private int mListScrollTopOffset = 2; + private ListView mListView; + private Calendar mMaxDate; + private Calendar mMinDate; + private TextView mMonthName; + private OnDateChangeListener mOnDateChangeListener; + private long mPreviousScrollPosition; + private int mPreviousScrollState = OnScrollListener.SCROLL_STATE_IDLE; + private ScrollStateRunnable mScrollStateChangedRunnable = new ScrollStateRunnable(); + private final Drawable mSelectedDateVerticalBar; + private final int mSelectedDateVerticalBarWidth; + private final int mSelectedWeekBackgroundColor; + private int mShownWeekCount; + private boolean mShowWeekNumber; + private Calendar mTempDate; + private final int mUnfocusedMonthDateColor; + private float mVelocityScale = 0.333f; + private int mWeekMinVisibleHeight = 12; + private final int mWeekNumberColor; + private final int mWeekSeparatorLineColor; + private final int mWeekSeperatorLineWidth; + + public CalendarView(Context context) { + this(context, null); + } + + public CalendarView(Context context, AttributeSet attrs) { + this(context, attrs, R.attr.calendarViewStyle); + } + + public CalendarView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + setCurrentLocale(Locale.getDefault()); + TypedArray attributesArray = context.obtainStyledAttributes(attrs, + R.styleable.CalendarView, defStyle, R.style.Holo_CalendarView); + mShowWeekNumber = attributesArray.getBoolean( + R.styleable.CalendarView_showWeekNumber, + CalendarView.DEFAULT_SHOW_WEEK_NUMBER); + mFirstDayOfWeek = attributesArray.getInt( + R.styleable.CalendarView_firstDayOfWeek, 1); + String minDate = attributesArray + .getString(R.styleable.CalendarView_minDate); + if (TextUtils.isEmpty(minDate) || !parseDate(minDate, mMinDate)) { + parseDate(CalendarView.DEFAULT_MIN_DATE, mMinDate); + } + String maxDate = attributesArray + .getString(R.styleable.CalendarView_maxDate); + if (TextUtils.isEmpty(maxDate) || !parseDate(maxDate, mMaxDate)) { + parseDate(CalendarView.DEFAULT_MAX_DATE, mMaxDate); + } + if (mMaxDate.before(mMinDate)) { + throw new IllegalArgumentException( + "Max date cannot be before min date."); + } + mShownWeekCount = attributesArray.getInt( + R.styleable.CalendarView_shownWeekCount, + CalendarView.DEFAULT_SHOWN_WEEK_COUNT); + mSelectedWeekBackgroundColor = attributesArray.getColor( + R.styleable.CalendarView_selectedWeekBackgroundColor, 0); + mFocusedMonthDateColor = attributesArray.getColor( + R.styleable.CalendarView_focusedMonthDateColor, 0); + mUnfocusedMonthDateColor = attributesArray.getColor( + R.styleable.CalendarView_unfocusedMonthDateColor, 0); + mWeekSeparatorLineColor = attributesArray.getColor( + R.styleable.CalendarView_weekSeparatorLineColor, 0); + mWeekNumberColor = attributesArray.getColor( + R.styleable.CalendarView_weekNumberColor, 0); + mSelectedDateVerticalBar = attributesArray + .getDrawable(R.styleable.CalendarView_selectedDateVerticalBar); + attributesArray.getResourceId( + R.styleable.CalendarView_dateTextAppearance, + android.R.style.TextAppearance_Small); + mDateTextSize = (int) (12 * getContext().getResources() + .getDisplayMetrics().density); + int weekDayTextAppearanceResId = attributesArray.getResourceId( + R.styleable.CalendarView_weekDayTextAppearance, + CalendarView.DEFAULT_WEEK_DAY_TEXT_APPEARANCE_RES_ID); + attributesArray.recycle(); + DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); + mWeekMinVisibleHeight = (int) TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_DIP, + CalendarView.UNSCALED_WEEK_MIN_VISIBLE_HEIGHT, displayMetrics); + mListScrollTopOffset = (int) TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_DIP, + CalendarView.UNSCALED_LIST_SCROLL_TOP_OFFSET, displayMetrics); + mBottomBuffer = (int) TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_DIP, + CalendarView.UNSCALED_BOTTOM_BUFFER, displayMetrics); + mSelectedDateVerticalBarWidth = (int) TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_DIP, + CalendarView.UNSCALED_SELECTED_DATE_VERTICAL_BAR_WIDTH, + displayMetrics); + mWeekSeperatorLineWidth = (int) TypedValue + .applyDimension(TypedValue.COMPLEX_UNIT_DIP, + CalendarView.UNSCALED_WEEK_SEPARATOR_LINE_WIDTH, + displayMetrics); + LayoutInflater.inflate(context, R.layout.calendar_view, this, true); + FontLoader.apply(this); + mListView = (ListView) findViewById(R.id.list); + mDayNamesHeader = (ViewGroup) findViewById(R.id.day_names); + mMonthName = (TextView) findViewById(R.id.month_name); + setUpHeader(weekDayTextAppearanceResId); + setUpListView(); + setUpAdapter(); + mTempDate.setTimeInMillis(System.currentTimeMillis()); + if (mTempDate.before(mMinDate)) { + goTo(mMinDate, false, true, true); + } else if (mMaxDate.before(mTempDate)) { + goTo(mMaxDate, false, true, true); + } else { + goTo(mTempDate, false, true, true); + } + invalidate(); + } + + private Calendar getCalendarForLocale(Calendar oldCalendar, Locale locale) { + if (oldCalendar == null) { + return Calendar.getInstance(locale); + } else { + final long currentTimeMillis = oldCalendar.getTimeInMillis(); + Calendar newCalendar = Calendar.getInstance(locale); + newCalendar.setTimeInMillis(currentTimeMillis); + return newCalendar; + } + } + + public long getDate() { + return mAdapter.mSelectedDate.getTimeInMillis(); + } + + public int getFirstDayOfWeek() { + return mFirstDayOfWeek; + } + + public long getMaxDate() { + return mMaxDate.getTimeInMillis(); + } + + public long getMinDate() { + return mMinDate.getTimeInMillis(); + } + + public boolean getShowWeekNumber() { + return mShowWeekNumber; + } + + private int getWeeksSinceMinDate(Calendar date) { + if (date.before(mMinDate)) { + throw new IllegalArgumentException("fromDate: " + + mMinDate.getTime() + " does not precede toDate: " + + date.getTime()); + } + long endTimeMillis = date.getTimeInMillis() + + date.getTimeZone().getOffset(date.getTimeInMillis()); + long startTimeMillis = mMinDate.getTimeInMillis() + + mMinDate.getTimeZone().getOffset(mMinDate.getTimeInMillis()); + long dayOffsetMillis = (mMinDate.get(Calendar.DAY_OF_WEEK) - mFirstDayOfWeek) + * CalendarView.MILLIS_IN_DAY; + return (int) ((endTimeMillis - startTimeMillis + dayOffsetMillis) / CalendarView.MILLIS_IN_WEEK); + } + + @SuppressLint("NewApi") + private void goTo(Calendar date, boolean animate, boolean setSelected, + boolean forceScroll) { + if (date.before(mMinDate) || date.after(mMaxDate)) { + throw new IllegalArgumentException("Time not between " + + mMinDate.getTime() + " and " + mMaxDate.getTime()); + } + int firstFullyVisiblePosition = mListView.getFirstVisiblePosition(); + View firstChild = mListView.getChildAt(0); + if (firstChild != null && firstChild.getTop() < 0) { + firstFullyVisiblePosition++; + } + int lastFullyVisiblePosition = firstFullyVisiblePosition + + mShownWeekCount - 1; + if (firstChild != null && firstChild.getTop() > mBottomBuffer) { + lastFullyVisiblePosition--; + } + if (setSelected) { + mAdapter.setSelectedDay(date); + } + int position = getWeeksSinceMinDate(date); + if (position < firstFullyVisiblePosition + || position > lastFullyVisiblePosition || forceScroll) { + mFirstDayOfMonth.setTimeInMillis(date.getTimeInMillis()); + mFirstDayOfMonth.set(Calendar.DAY_OF_MONTH, 1); + setMonthDisplayed(mFirstDayOfMonth); + if (mFirstDayOfMonth.before(mMinDate)) { + position = 0; + } else { + position = getWeeksSinceMinDate(mFirstDayOfMonth); + } + mPreviousScrollState = OnScrollListener.SCROLL_STATE_FLING; + if (animate && VERSION.SDK_INT >= 11) { + mListView + .smoothScrollToPositionFromTop(position, + mListScrollTopOffset, + CalendarView.GOTO_SCROLL_DURATION); + } else { + mListView.setSelectionFromTop(position, mListScrollTopOffset); + onScrollStateChanged(mListView, + OnScrollListener.SCROLL_STATE_IDLE); + } + } else if (setSelected) { + setMonthDisplayed(date); + } + } + + @Override + public boolean isEnabled() { + return mListView.isEnabled(); + } + + private boolean isSameDate(Calendar firstDate, Calendar secondDate) { + return firstDate.get(Calendar.DAY_OF_YEAR) == secondDate + .get(Calendar.DAY_OF_YEAR) + && firstDate.get(Calendar.YEAR) == secondDate + .get(Calendar.YEAR); + } + + @SuppressLint("NewApi") + @Override + protected void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + setCurrentLocale(newConfig.locale); + } + + private void onScroll(AbsListView view, int firstVisibleItem, + int visibleItemCount, int totalItemCount) { + WeekView child = (WeekView) view.getChildAt(0); + if (child == null) { + return; + } + long currScroll = view.getFirstVisiblePosition() * child.getHeight() + - child.getBottom(); + if (currScroll < mPreviousScrollPosition) { + mIsScrollingUp = true; + } else if (currScroll > mPreviousScrollPosition) { + mIsScrollingUp = false; + } else { + return; + } + int offset = child.getBottom() < mWeekMinVisibleHeight ? 1 : 0; + if (mIsScrollingUp) { + child = (WeekView) view.getChildAt(CalendarView.SCROLL_HYST_WEEKS + + offset); + } else if (offset != 0) { + child = (WeekView) view.getChildAt(offset); + } + int month; + if (mIsScrollingUp) { + month = child.getMonthOfFirstWeekDay(); + } else { + month = child.getMonthOfLastWeekDay(); + } + int monthDiff; + if (mCurrentMonthDisplayed == 11 && month == 0) { + monthDiff = 1; + } else if (mCurrentMonthDisplayed == 0 && month == 11) { + monthDiff = -1; + } else { + monthDiff = month - mCurrentMonthDisplayed; + } + if (!mIsScrollingUp && monthDiff > 0 || mIsScrollingUp && monthDiff < 0) { + Calendar firstDay = child.getFirstDay(); + if (mIsScrollingUp) { + firstDay.add(Calendar.DAY_OF_MONTH, -CalendarView.DAYS_PER_WEEK); + } else { + firstDay.add(Calendar.DAY_OF_MONTH, CalendarView.DAYS_PER_WEEK); + } + setMonthDisplayed(firstDay); + } + mPreviousScrollPosition = currScroll; + mPreviousScrollState = mCurrentScrollState; + } + + private void onScrollStateChanged(AbsListView view, int scrollState) { + mScrollStateChangedRunnable.doScrollStateChange(view, scrollState); + } + + private boolean parseDate(String date, Calendar outDate) { + try { + outDate.setTime(mDateFormat.parse(date)); + return true; + } catch (ParseException e) { + Log.w(CalendarView.LOG_TAG, "Date: " + date + " not in format: " + + CalendarView.DATE_FORMAT); + return false; + } + } + + private void setCurrentLocale(Locale locale) { + if (locale.equals(mCurrentLocale)) { + return; + } + + mCurrentLocale = locale; + mTempDate = getCalendarForLocale(mTempDate, locale); + mFirstDayOfMonth = getCalendarForLocale(mFirstDayOfMonth, locale); + mMinDate = getCalendarForLocale(mMinDate, locale); + mMaxDate = getCalendarForLocale(mMaxDate, locale); + } + + public void setDate(long date) { + setDate(date, false, false); + } + + public void setDate(long date, boolean animate, boolean center) { + mTempDate.setTimeInMillis(date); + if (isSameDate(mTempDate, mAdapter.mSelectedDate)) { + return; + } + goTo(mTempDate, animate, true, center); + } + + @Override + public void setEnabled(boolean enabled) { + mListView.setEnabled(enabled); + } + + public void setFirstDayOfWeek(int firstDayOfWeek) { + if (mFirstDayOfWeek == firstDayOfWeek) { + return; + } + mFirstDayOfWeek = firstDayOfWeek; + mAdapter.init(); + mAdapter.notifyDataSetChanged(); + setUpHeader(CalendarView.DEFAULT_WEEK_DAY_TEXT_APPEARANCE_RES_ID); + } + + public void setMaxDate(long maxDate) { + mTempDate.setTimeInMillis(maxDate); + if (isSameDate(mTempDate, mMaxDate)) { + return; + } + mMaxDate.setTimeInMillis(maxDate); + mAdapter.init(); + Calendar date = mAdapter.mSelectedDate; + if (date.after(mMaxDate)) { + setDate(mMaxDate.getTimeInMillis()); + } else { + goTo(date, false, true, false); + } + } + + public void setMinDate(long minDate) { + mTempDate.setTimeInMillis(minDate); + if (isSameDate(mTempDate, mMinDate)) { + return; + } + mMinDate.setTimeInMillis(minDate); + Calendar date = mAdapter.mSelectedDate; + if (date.before(mMinDate)) { + mAdapter.setSelectedDay(mMinDate); + } + mAdapter.init(); + if (date.before(mMinDate)) { + setDate(mTempDate.getTimeInMillis()); + } else { + goTo(date, false, true, false); + } + } + + private void setMonthDisplayed(Calendar calendar) { + final int newMonthDisplayed = calendar.get(Calendar.MONTH); + final int newYearDisplayed = calendar.get(Calendar.YEAR); + if (mCurrentMonthDisplayed != newMonthDisplayed + || mCurrentYearDisplayed != newYearDisplayed) { + mCurrentMonthDisplayed = newMonthDisplayed; + mCurrentYearDisplayed = newYearDisplayed; + mAdapter.setFocusMonth(mCurrentMonthDisplayed); + final int flags = DateUtils.FORMAT_SHOW_DATE + | DateUtils.FORMAT_NO_MONTH_DAY + | DateUtils.FORMAT_SHOW_YEAR; + final long millis = calendar.getTimeInMillis(); + String newMonthName = DateUtils.formatDateRange(getContext(), + millis, millis, flags); + mMonthName.setText(newMonthName); + mMonthName.invalidate(); + } + } + + public void setOnDateChangeListener(OnDateChangeListener listener) { + mOnDateChangeListener = listener; + } + + public void setShowWeekNumber(boolean showWeekNumber) { + if (mShowWeekNumber == showWeekNumber) { + return; + } + mShowWeekNumber = showWeekNumber; + mAdapter.notifyDataSetChanged(); + setUpHeader(CalendarView.DEFAULT_WEEK_DAY_TEXT_APPEARANCE_RES_ID); + } + + private void setUpAdapter() { + if (mAdapter == null) { + mAdapter = new WeeksAdapter(getContext()); + mAdapter.registerDataSetObserver(new DataSetObserver() { + @Override + public void onChanged() { + if (mOnDateChangeListener != null) { + Calendar selectedDay = mAdapter.getSelectedDay(); + mOnDateChangeListener.onSelectedDayChange( + CalendarView.this, + selectedDay.get(Calendar.YEAR), + selectedDay.get(Calendar.MONTH), + selectedDay.get(Calendar.DAY_OF_MONTH)); + } + } + }); + mListView.setAdapter(mAdapter); + } + mAdapter.notifyDataSetChanged(); + } + + private void setUpHeader(int weekDayTextAppearanceResId) { + mDayLabels = new String[mDaysPerWeek]; + for (int i = mFirstDayOfWeek, count = mFirstDayOfWeek + mDaysPerWeek; i < count; i++) { + int calendarDay = i > Calendar.SATURDAY ? i - Calendar.SATURDAY : i; + mDayLabels[i - mFirstDayOfWeek] = DateUtils.getDayOfWeekString( + calendarDay, DateUtils.LENGTH_SHORTEST); + } + TextView label = (TextView) mDayNamesHeader.getChildAt(0); + if (mShowWeekNumber) { + label.setVisibility(View.VISIBLE); + } else { + label.setVisibility(View.GONE); + } + for (int i = 1, count = mDayNamesHeader.getChildCount(); i < count; i++) { + label = (TextView) mDayNamesHeader.getChildAt(i); + if (weekDayTextAppearanceResId > -1) { + label.setTextAppearance(getContext(), + weekDayTextAppearanceResId); + } + if (i < mDaysPerWeek + 1) { + label.setText(mDayLabels[i - 1]); + label.setVisibility(View.VISIBLE); + } else { + label.setVisibility(View.GONE); + } + } + mDayNamesHeader.invalidate(); + } + + @SuppressLint("NewApi") + private void setUpListView() { + mListView.setDivider(null); + mListView.setItemsCanFocus(true); + mListView.setVerticalScrollBarEnabled(false); + mListView.setOnScrollListener(new OnScrollListener() { + @Override + public void onScroll(AbsListView view, int firstVisibleItem, + int visibleItemCount, int totalItemCount) { + CalendarView.this.onScroll(view, firstVisibleItem, + visibleItemCount, totalItemCount); + } + + @Override + public void onScrollStateChanged(AbsListView view, int scrollState) { + CalendarView.this.onScrollStateChanged(view, scrollState); + } + }); + if (VERSION.SDK_INT >= 11) { + mListView.setFriction(mFriction); + mListView.setVelocityScale(mVelocityScale); + } + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/CheckBox.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/CheckBox.java new file mode 100644 index 0000000000..4a85ddcadf --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/CheckBox.java @@ -0,0 +1,84 @@ + +package org.holoeverywhere.widget; + +import org.holoeverywhere.R; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.res.TypedArray; +import android.os.Build.VERSION; +import android.util.AttributeSet; + +public class CheckBox extends android.widget.CheckBox { + private boolean allCaps = false; + private CharSequence originalText; + private BufferType originalType; + + public CheckBox(Context context) { + this(context, null); + } + + public CheckBox(Context context, AttributeSet attrs) { + this(context, attrs, android.R.attr.checkboxStyle); + } + + public CheckBox(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + TypedArray a = getContext().obtainStyledAttributes(attrs, + R.styleable.TextView, defStyle, 0); + if (a.hasValue(R.styleable.TextView_android_textAllCaps)) { + allCaps = a.getBoolean(R.styleable.TextView_android_textAllCaps, + false); + } else { + allCaps = a.getBoolean(R.styleable.TextView_textAllCaps, false); + } + CharSequence text = null; + if (a.hasValue(R.styleable.TextView_android_text)) { + text = a.getText(R.styleable.TextView_android_text); + } + a.recycle(); + if (text != null) { + setText(text); + } + } + + @Override + @SuppressLint("NewApi") + public void dispatchDisplayHint(int hint) { + onDisplayHint(hint); + } + + public boolean isAllCaps() { + return allCaps; + } + + @Override + @SuppressLint("NewApi") + protected void onDisplayHint(int hint) { + if (VERSION.SDK_INT >= 8) { + super.onDisplayHint(hint); + } + } + + @Override + public void setAllCaps(boolean allCaps) { + this.allCaps = allCaps; + updateTextState(); + } + + @Override + public void setText(CharSequence text, BufferType type) { + originalText = text; + originalType = type; + updateTextState(); + } + + private void updateTextState() { + if (originalText == null) { + super.setText(null, originalType); + return; + } + super.setText(allCaps ? originalText.toString().toUpperCase() + : originalText, originalType); + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/CheckedTextView.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/CheckedTextView.java new file mode 100644 index 0000000000..bde009d58d --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/CheckedTextView.java @@ -0,0 +1,85 @@ + +package org.holoeverywhere.widget; + +import org.holoeverywhere.R; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.res.TypedArray; +import android.os.Build.VERSION; +import android.util.AttributeSet; + +public class CheckedTextView extends android.widget.CheckedTextView { + private boolean allCaps = false; + private CharSequence originalText; + private BufferType originalType; + + public CheckedTextView(Context context) { + this(context, null); + } + + public CheckedTextView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public CheckedTextView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + TypedArray a = getContext().obtainStyledAttributes(attrs, + R.styleable.TextView, defStyle, 0); + if (a.hasValue(R.styleable.TextView_android_textAllCaps)) { + allCaps = a.getBoolean(R.styleable.TextView_android_textAllCaps, + false); + } else { + allCaps = a.getBoolean(R.styleable.TextView_textAllCaps, false); + } + CharSequence text = null; + if (a.hasValue(R.styleable.TextView_android_text)) { + text = a.getText(R.styleable.TextView_android_text); + } + a.recycle(); + if (text != null) { + setText(text); + } + } + + @Override + @SuppressLint("NewApi") + public void dispatchDisplayHint(int hint) { + onDisplayHint(hint); + } + + public boolean isAllCaps() { + return allCaps; + } + + @Override + @SuppressLint("NewApi") + protected void onDisplayHint(int hint) { + if (VERSION.SDK_INT >= 8) { + super.onDisplayHint(hint); + } + } + + @Override + public void setAllCaps(boolean allCaps) { + this.allCaps = allCaps; + updateTextState(); + } + + @Override + public void setText(CharSequence text, BufferType type) { + originalText = text; + originalType = type; + updateTextState(); + } + + private void updateTextState() { + if (originalText == null) { + super.setText(null, originalType); + return; + } + super.setText(allCaps ? originalText.toString().toUpperCase() + : originalText, originalType); + } + +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/DatePicker.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/DatePicker.java new file mode 100644 index 0000000000..b0250917d0 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/DatePicker.java @@ -0,0 +1,559 @@ + +package org.holoeverywhere.widget; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Locale; + +import org.holoeverywhere.LayoutInflater; +import org.holoeverywhere.R; +import org.holoeverywhere.internal.NumberPickerEditText; +import org.holoeverywhere.util.Arrays; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.res.Configuration; +import android.content.res.TypedArray; +import android.os.Build.VERSION; +import android.os.Parcel; +import android.os.Parcelable; +import android.text.TextUtils; +import android.text.format.DateFormat; +import android.text.format.DateUtils; +import android.util.AttributeSet; +import android.util.Log; +import android.util.SparseArray; +import android.view.View; +import android.view.ViewGroup; +import android.view.accessibility.AccessibilityEvent; +import android.view.accessibility.AccessibilityManager; +import android.view.inputmethod.EditorInfo; +import android.view.inputmethod.InputMethodManager; + +public class DatePicker extends FrameLayout { + private final class Callback implements NumberPicker.OnValueChangeListener, + CalendarView.OnDateChangeListener { + @Override + public void onSelectedDayChange(CalendarView view, int year, int month, + int monthDay) { + setDate(year, month, monthDay); + updateSpinners(); + notifyDateChanged(); + } + + @Override + public void onValueChange(NumberPicker picker, int oldVal, int newVal) { + updateInputState(); + tempDate.setTimeInMillis(currentDate.getTimeInMillis()); + if (picker == daySpinner) { + int maxDayOfMonth = tempDate + .getActualMaximum(Calendar.DAY_OF_MONTH); + if (oldVal == maxDayOfMonth && newVal == 1) { + tempDate.add(Calendar.DAY_OF_MONTH, 1); + } else if (oldVal == 1 && newVal == maxDayOfMonth) { + tempDate.add(Calendar.DAY_OF_MONTH, -1); + } else { + tempDate.add(Calendar.DAY_OF_MONTH, newVal - oldVal); + } + } else if (picker == monthSpinner) { + if (oldVal == 11 && newVal == 0) { + tempDate.add(Calendar.MONTH, 1); + } else if (oldVal == 0 && newVal == 11) { + tempDate.add(Calendar.MONTH, -1); + } else { + tempDate.add(Calendar.MONTH, newVal - oldVal); + } + } else if (picker == yearSpinner) { + tempDate.set(Calendar.YEAR, newVal); + } else { + return; + } + setDate(tempDate.get(Calendar.YEAR), tempDate.get(Calendar.MONTH), + tempDate.get(Calendar.DAY_OF_MONTH)); + updateSpinners(); + updateCalendarView(); + notifyDateChanged(); + } + + } + + public interface OnDateChangedListener { + void onDateChanged(DatePicker view, int year, int monthOfYear, + int dayOfMonth); + } + + private static class SavedState extends BaseSavedState { + @SuppressWarnings("all") + public static final Creator CREATOR = new Creator() { + public SavedState createFromParcel(Parcel in) { + return new SavedState(in); + } + + public SavedState[] newArray(int size) { + return new SavedState[size]; + } + }; + + private final int year, month, day; + + private SavedState(Parcel in) { + super(in); + year = in.readInt(); + month = in.readInt(); + day = in.readInt(); + } + + private SavedState(Parcelable superState, int year, int month, int day) { + super(superState); + this.year = year; + this.month = month; + this.day = day; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + super.writeToParcel(dest, flags); + dest.writeInt(year); + dest.writeInt(month); + dest.writeInt(day); + } + } + + private static final String DATE_FORMAT = "MM/dd/yyyy"; + private static final String LOG_TAG = DatePicker.class.getSimpleName(); + + private static Calendar getCalendarForLocale(Calendar oldCalendar, + Locale locale) { + if (oldCalendar == null) { + return Calendar.getInstance(locale); + } else { + final long currentTimeMillis = oldCalendar.getTimeInMillis(); + Calendar newCalendar = Calendar.getInstance(locale); + newCalendar.setTimeInMillis(currentTimeMillis); + return newCalendar; + } + } + + private static void setContentDescription(View parent, int childId, + int textId) { + if (parent == null) { + return; + } + View child = parent.findViewById(childId); + if (child != null) { + child.setContentDescription(parent.getContext().getText(textId)); + } + } + + private final Callback callback = new Callback(); + private final java.text.DateFormat dateFormat = new SimpleDateFormat( + DatePicker.DATE_FORMAT); + private final NumberPicker daySpinner, monthSpinner, yearSpinner; + private final InputMethodManager inputMethodManager; + private Locale locale; + private final CalendarView mCalendarView; + private int numberOfMonths; + private OnDateChangedListener onDateChangedListener; + private String[] shortMonths; + private final LinearLayout spinners; + private Calendar tempDate, minDate, maxDate, currentDate; + + public DatePicker(Context context) { + this(context, null); + } + + public DatePicker(Context context, AttributeSet attrs) { + this(context, attrs, R.attr.datePickerStyle); + } + + public DatePicker(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + TypedArray a = context.obtainStyledAttributes(attrs, + R.styleable.DatePicker, defStyle, R.style.Holo_DatePicker); + boolean spinnersShown = a.getBoolean( + R.styleable.DatePicker_spinnersShown, true); + boolean calendarViewShown = a.getBoolean( + R.styleable.DatePicker_calendarViewShown, true); + boolean forceShownState = a.getBoolean( + R.styleable.DatePicker_forceShownState, false); + int startYear = a.getInt(R.styleable.DatePicker_startYear, 1900); + int endYear = a.getInt(R.styleable.DatePicker_endYear, 2100); + String minDate = a.getString(R.styleable.DatePicker_minDate); + String maxDate = a.getString(R.styleable.DatePicker_maxDate); + int layoutResourceId = a.getResourceId(R.styleable.DatePicker_layout, + R.layout.date_picker_holo); + a.recycle(); + inputMethodManager = (InputMethodManager) context + .getSystemService(Context.INPUT_METHOD_SERVICE); + setLocale(Locale.getDefault()); + LayoutInflater.inflate(context, layoutResourceId, this, true); + spinners = (LinearLayout) findViewById(R.id.pickers); + mCalendarView = (CalendarView) findViewById(R.id.calendar_view); + daySpinner = (NumberPicker) findViewById(R.id.day); + monthSpinner = (NumberPicker) findViewById(R.id.month); + yearSpinner = (NumberPicker) findViewById(R.id.year); + if (((AccessibilityManager) getContext().getSystemService( + Context.ACCESSIBILITY_SERVICE)).isEnabled()) { + setContentDescriptions(); + } + mCalendarView.setOnDateChangeListener(callback); + daySpinner.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER); + daySpinner.setOnLongPressUpdateInterval(100); + daySpinner.setOnValueChangedListener(callback); + monthSpinner.setMinValue(0); + monthSpinner.setMaxValue(numberOfMonths - 1); + monthSpinner.setDisplayedValues(shortMonths); + monthSpinner.setOnLongPressUpdateInterval(200); + monthSpinner.setOnValueChangedListener(callback); + yearSpinner.setOnLongPressUpdateInterval(100); + yearSpinner.setOnValueChangedListener(callback); + if (spinnersShown || calendarViewShown || forceShownState) { + setSpinnersShown(spinnersShown); + setCalendarViewShown(calendarViewShown); + } else { + setSpinnersShown(true); + setCalendarViewShown(false); + } + tempDate.clear(); + if (TextUtils.isEmpty(minDate) || !parseDate(minDate, tempDate)) { + tempDate.set(startYear, 0, 1); + } + setMinDate(tempDate.getTimeInMillis()); + tempDate.clear(); + if (TextUtils.isEmpty(maxDate) || !parseDate(maxDate, tempDate)) { + tempDate.set(endYear, 11, 31); + } + setMaxDate(tempDate.getTimeInMillis()); + currentDate.setTimeInMillis(System.currentTimeMillis()); + init(currentDate.get(Calendar.YEAR), currentDate.get(Calendar.MONTH), + currentDate.get(Calendar.DAY_OF_MONTH), null); + reorderSpinners(); + } + + private void checkInputState(NumberPicker... spinners) { + for (NumberPicker spinner : spinners) { + NumberPickerEditText input = spinner.getInputField(); + if (inputMethodManager.isActive(input)) { + input.clearFocus(); + inputMethodManager.hideSoftInputFromWindow(getWindowToken(), 0); + } + } + } + + @SuppressLint("NewApi") + @Override + public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { + onPopulateAccessibilityEvent(event); + return true; + } + + @Override + protected void dispatchRestoreInstanceState( + SparseArray container) { + dispatchThawSelfOnly(container); + } + + public CalendarView getCalendarView() { + return mCalendarView; + } + + public boolean getCalendarViewShown() { + return mCalendarView.isShown(); + } + + public int getDayOfMonth() { + return currentDate.get(Calendar.DAY_OF_MONTH); + } + + public long getMaxDate() { + return mCalendarView.getMaxDate(); + } + + public long getMinDate() { + return mCalendarView.getMinDate(); + } + + public int getMonth() { + return currentDate.get(Calendar.MONTH); + } + + public OnDateChangedListener getOnDateChangedListener() { + return onDateChangedListener; + } + + public boolean getSpinnersShown() { + return spinners.isShown(); + } + + public int getYear() { + return currentDate.get(Calendar.YEAR); + } + + public void init(int year, int monthOfYear, int dayOfMonth, + OnDateChangedListener onDateChangedListener) { + setOnDateChangedListener(onDateChangedListener); + setDate(year, monthOfYear, dayOfMonth); + updateSpinners(); + updateCalendarView(); + } + + private boolean isNewDate(int year, int month, int dayOfMonth) { + return currentDate.get(Calendar.YEAR) != year + || currentDate.get(Calendar.MONTH) != dayOfMonth + || currentDate.get(Calendar.DAY_OF_MONTH) != month; + } + + private void notifyDateChanged() { + sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED); + if (onDateChangedListener != null) { + onDateChangedListener.onDateChanged(this, getYear(), getMonth(), + getDayOfMonth()); + } + } + + @Override + @SuppressLint("NewApi") + protected void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + setLocale(newConfig.locale); + } + + @SuppressLint("NewApi") + @Override + public void onPopulateAccessibilityEvent(AccessibilityEvent event) { + if (VERSION.SDK_INT >= 14) { + super.onPopulateAccessibilityEvent(event); + } + final int flags = DateUtils.FORMAT_SHOW_DATE + | DateUtils.FORMAT_SHOW_YEAR; + String selectedDateUtterance = DateUtils.formatDateTime(getContext(), + currentDate.getTimeInMillis(), flags); + event.getText().add(selectedDateUtterance); + } + + @Override + protected void onRestoreInstanceState(Parcelable state) { + SavedState ss = (SavedState) state; + super.onRestoreInstanceState(ss.getSuperState()); + setDate(ss.year, ss.month, ss.day); + updateSpinners(); + updateCalendarView(); + } + + @Override + protected Parcelable onSaveInstanceState() { + return new SavedState(super.onSaveInstanceState(), getYear(), + getMonth(), getDayOfMonth()); + } + + private boolean parseDate(String date, Calendar outDate) { + try { + outDate.setTime(dateFormat.parse(date)); + return true; + } catch (ParseException e) { + Log.w(DatePicker.LOG_TAG, "Date: " + date + " not in format: " + + DatePicker.DATE_FORMAT); + return false; + } + } + + private void pushSpinner(NumberPicker spinner, int spinnerCount, int i) { + if (spinner.getParent() != null + && spinner.getParent() instanceof ViewGroup) { + ViewGroup parent = (ViewGroup) spinner.getParent(); + if (parent.getChildAt(i) != spinner) { + parent.removeView(spinner); + parent.addView(spinner); + setImeOptions(spinner, spinnerCount, i); + } + } + } + + private void reorderSpinners() { + char[] order = DateFormat.getDateFormatOrder(getContext()); + final int spinnerCount = order.length; + for (int i = 0; i < spinnerCount; i++) { + switch (order[i]) { + case DateFormat.DATE: + pushSpinner(daySpinner, spinnerCount, i); + break; + case DateFormat.MONTH: + pushSpinner(monthSpinner, spinnerCount, i); + break; + case DateFormat.YEAR: + pushSpinner(yearSpinner, spinnerCount, i); + break; + } + } + } + + public void setCalendarViewShown(boolean shown) { + mCalendarView.setVisibility(shown ? View.VISIBLE : View.GONE); + } + + private void setContentDescriptions() { + DatePicker.setContentDescription(daySpinner, R.id.increment, + R.string.date_picker_increment_day_button); + DatePicker.setContentDescription(daySpinner, R.id.decrement, + R.string.date_picker_decrement_day_button); + DatePicker.setContentDescription(monthSpinner, R.id.increment, + R.string.date_picker_increment_month_button); + DatePicker.setContentDescription(monthSpinner, R.id.decrement, + R.string.date_picker_decrement_month_button); + DatePicker.setContentDescription(yearSpinner, R.id.increment, + R.string.date_picker_increment_year_button); + DatePicker.setContentDescription(yearSpinner, R.id.decrement, + R.string.date_picker_decrement_year_button); + } + + private void setDate(int year, int month, int dayOfMonth) { + currentDate.set(year, month, dayOfMonth); + if (currentDate.before(minDate)) { + currentDate.setTimeInMillis(minDate.getTimeInMillis()); + } else if (currentDate.after(maxDate)) { + currentDate.setTimeInMillis(maxDate.getTimeInMillis()); + } + } + + @Override + public void setEnabled(boolean enabled) { + if (isEnabled() == enabled) { + return; + } + super.setEnabled(enabled); + daySpinner.setEnabled(enabled); + monthSpinner.setEnabled(enabled); + yearSpinner.setEnabled(enabled); + mCalendarView.setEnabled(enabled); + } + + private void setImeOptions(NumberPicker spinner, int spinnerCount, + int spinnerIndex) { + final int imeOptions; + if (spinnerIndex < spinnerCount - 1) { + imeOptions = EditorInfo.IME_ACTION_NEXT; + } else { + imeOptions = EditorInfo.IME_ACTION_DONE; + } + spinner.getInputField().setImeOptions(imeOptions); + } + + public void setLocale(Locale locale) { + if (locale == null || locale.equals(this.locale)) { + return; + } + this.locale = locale; + tempDate = DatePicker.getCalendarForLocale(tempDate, locale); + minDate = DatePicker.getCalendarForLocale(minDate, locale); + maxDate = DatePicker.getCalendarForLocale(maxDate, locale); + currentDate = DatePicker.getCalendarForLocale(currentDate, locale); + numberOfMonths = tempDate.getActualMaximum(Calendar.MONTH) + 1; + shortMonths = new String[numberOfMonths]; + for (int i = 0; i < numberOfMonths; i++) { + shortMonths[i] = DateUtils.getMonthString(Calendar.JANUARY + i, + DateUtils.LENGTH_MEDIUM); + } + } + + public void setMaxDate(long maxDateL) { + tempDate.setTimeInMillis(maxDateL); + if (tempDate.get(Calendar.YEAR) == maxDate.get(Calendar.YEAR) + && tempDate.get(Calendar.DAY_OF_YEAR) == maxDate + .get(Calendar.DAY_OF_YEAR)) { + return; + } + maxDate.setTimeInMillis(maxDateL); + mCalendarView.setMaxDate(maxDateL); + if (currentDate.after(maxDate)) { + currentDate.setTimeInMillis(maxDate.getTimeInMillis()); + updateCalendarView(); + } + updateSpinners(); + } + + public void setMinDate(long minDateL) { + tempDate.setTimeInMillis(minDateL); + if (tempDate.get(Calendar.YEAR) == minDate.get(Calendar.YEAR) + && tempDate.get(Calendar.DAY_OF_YEAR) == minDate + .get(Calendar.DAY_OF_YEAR)) { + return; + } + minDate.setTimeInMillis(minDateL); + mCalendarView.setMinDate(minDateL); + if (currentDate.before(minDate)) { + currentDate.setTimeInMillis(minDate.getTimeInMillis()); + updateCalendarView(); + } + updateSpinners(); + } + + public void setOnDateChangedListener( + OnDateChangedListener onDateChangedListener) { + this.onDateChangedListener = onDateChangedListener; + } + + public void setSpinnersShown(boolean shown) { + spinners.setVisibility(shown ? View.VISIBLE : View.GONE); + } + + private void updateCalendarView() { + mCalendarView.setDate(currentDate.getTimeInMillis(), false, false); + } + + public void updateDate(int year, int month, int dayOfMonth) { + if (!isNewDate(year, month, dayOfMonth)) { + return; + } + setDate(year, month, dayOfMonth); + updateSpinners(); + updateCalendarView(); + notifyDateChanged(); + } + + private void updateInputState() { + if (inputMethodManager != null) { + checkInputState(yearSpinner, monthSpinner, daySpinner); + } + } + + private void updateSpinners() { + monthSpinner.setDisplayedValues(null); + if (currentDate.equals(minDate)) { + daySpinner.setMinValue(currentDate.get(Calendar.DAY_OF_MONTH)); + daySpinner.setMaxValue(currentDate + .getActualMaximum(Calendar.DAY_OF_MONTH)); + daySpinner.setWrapSelectorWheel(false); + monthSpinner.setMinValue(currentDate.get(Calendar.MONTH)); + monthSpinner.setMaxValue(currentDate + .getActualMaximum(Calendar.MONTH)); + monthSpinner.setWrapSelectorWheel(false); + } else if (currentDate.equals(maxDate)) { + daySpinner.setMinValue(currentDate + .getActualMinimum(Calendar.DAY_OF_MONTH)); + daySpinner.setMaxValue(currentDate.get(Calendar.DAY_OF_MONTH)); + daySpinner.setWrapSelectorWheel(false); + monthSpinner.setMinValue(currentDate + .getActualMinimum(Calendar.MONTH)); + monthSpinner.setMaxValue(currentDate.get(Calendar.MONTH)); + monthSpinner.setWrapSelectorWheel(false); + } else { + daySpinner.setMinValue(1); + daySpinner.setMaxValue(currentDate + .getActualMaximum(Calendar.DAY_OF_MONTH)); + daySpinner.setWrapSelectorWheel(true); + monthSpinner.setMinValue(0); + monthSpinner.setMaxValue(11); + monthSpinner.setWrapSelectorWheel(true); + } + String[] displayedValues = Arrays.copyOfRange(shortMonths, + monthSpinner.getMinValue(), monthSpinner.getMaxValue() + 1); + monthSpinner.setDisplayedValues(displayedValues); + yearSpinner.setMinValue(minDate.get(Calendar.YEAR)); + yearSpinner.setMaxValue(maxDate.get(Calendar.YEAR)); + yearSpinner.setWrapSelectorWheel(false); + yearSpinner.setValue(currentDate.get(Calendar.YEAR)); + monthSpinner.setValue(currentDate.get(Calendar.MONTH)); + daySpinner.setValue(currentDate.get(Calendar.DAY_OF_MONTH)); + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/Divider.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/Divider.java new file mode 100644 index 0000000000..eb641a9570 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/Divider.java @@ -0,0 +1,42 @@ + +package org.holoeverywhere.widget; + +import org.holoeverywhere.R; +import org.holoeverywhere.internal._View; + +import android.content.Context; +import android.content.res.TypedArray; +import android.util.AttributeSet; +import android.util.TypedValue; + +public class Divider extends _View { + public Divider(Context context) { + super(context); + init(context, null, 0); + } + + public Divider(Context context, AttributeSet attrs) { + super(context, attrs); + init(context, attrs, 0); + } + + public Divider(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + init(context, attrs, defStyle); + } + + protected void init(Context context, AttributeSet attrs, int defStyle) { + TypedArray a = context.obtainStyledAttributes(attrs, + R.styleable.Divider, defStyle, 0); + boolean vertical = a.getInt(R.styleable.Divider_android_orientation, + android.widget.LinearLayout.VERTICAL) == android.widget.LinearLayout.VERTICAL; + a.recycle(); + TypedValue value = new TypedValue(); + context.getTheme().resolveAttribute( + vertical ? R.attr.dividerVertical : R.attr.dividerHorizontal, + value, true); + if (value.resourceId > 0) { + setBackgroundResource(value.resourceId); + } + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/EditText.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/EditText.java new file mode 100644 index 0000000000..e766925317 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/EditText.java @@ -0,0 +1,98 @@ + +package org.holoeverywhere.widget; + +import org.holoeverywhere.R; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.res.TypedArray; +import android.os.Build.VERSION; +import android.util.AttributeSet; + +import com.actionbarsherlock.internal.view.menu.ContextMenuCallbackGetter; + +public class EditText extends android.widget.EditText implements ContextMenuCallbackGetter { + private boolean allCaps = false; + private OnCreateContextMenuListener mOnCreateContextMenuListener; + private CharSequence originalText; + + private BufferType originalType; + + public EditText(Context context) { + this(context, null); + } + + public EditText(Context context, AttributeSet attrs) { + this(context, attrs, android.R.attr.editTextStyle); + } + + public EditText(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + TypedArray a = getContext().obtainStyledAttributes(attrs, + R.styleable.TextView, defStyle, 0); + if (a.hasValue(R.styleable.TextView_android_textAllCaps)) { + allCaps = a.getBoolean(R.styleable.TextView_android_textAllCaps, + false); + } else { + allCaps = a.getBoolean(R.styleable.TextView_textAllCaps, false); + } + CharSequence text = null; + if (a.hasValue(R.styleable.TextView_android_text)) { + text = a.getText(R.styleable.TextView_android_text); + } + a.recycle(); + if (text != null) { + setText(text); + } + } + + @Override + @SuppressLint("NewApi") + public void dispatchDisplayHint(int hint) { + onDisplayHint(hint); + } + + @Override + public OnCreateContextMenuListener getOnCreateContextMenuListener() { + return mOnCreateContextMenuListener; + } + + public boolean isAllCaps() { + return allCaps; + } + + @Override + @SuppressLint("NewApi") + protected void onDisplayHint(int hint) { + if (VERSION.SDK_INT >= 8) { + super.onDisplayHint(hint); + } + } + + @Override + public void setAllCaps(boolean allCaps) { + this.allCaps = allCaps; + updateTextState(); + } + + @Override + public void setOnCreateContextMenuListener(OnCreateContextMenuListener l) { + super.setOnCreateContextMenuListener(mOnCreateContextMenuListener = l); + } + + @Override + public void setText(CharSequence text, BufferType type) { + originalText = text; + originalType = type; + updateTextState(); + } + + private void updateTextState() { + if (originalText == null) { + super.setText(null, originalType); + return; + } + super.setText(allCaps ? originalText.toString().toUpperCase() + : originalText, originalType); + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/ExpandableListConnector.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/ExpandableListConnector.java new file mode 100644 index 0000000000..65c28c2e9a --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/ExpandableListConnector.java @@ -0,0 +1,594 @@ + +package org.holoeverywhere.widget; + +import java.util.ArrayList; +import java.util.Collections; + +import android.database.DataSetObserver; +import android.os.Parcel; +import android.os.Parcelable; +import android.os.SystemClock; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ExpandableListAdapter; +import android.widget.Filter; +import android.widget.Filterable; + +public class ExpandableListConnector extends BaseAdapter implements Filterable { + static class GroupMetadata implements Parcelable, Comparable { + public static final Parcelable.Creator CREATOR = + new Parcelable.Creator() { + @Override + public GroupMetadata createFromParcel(Parcel in) { + GroupMetadata gm = GroupMetadata.obtain( + in.readInt(), + in.readInt(), + in.readInt(), + in.readLong()); + return gm; + } + + @Override + public GroupMetadata[] newArray(int size) { + return new GroupMetadata[size]; + } + }; + + final static int REFRESH = -1; + + static GroupMetadata obtain(int flPos, int lastChildFlPos, int gPos, long gId) { + GroupMetadata gm = new GroupMetadata(); + gm.flPos = flPos; + gm.lastChildFlPos = lastChildFlPos; + gm.gPos = gPos; + gm.gId = gId; + return gm; + } + + int flPos; + long gId; + int gPos; + int lastChildFlPos; + + private GroupMetadata() { + } + + @Override + public int compareTo(GroupMetadata another) { + if (another == null) { + throw new IllegalArgumentException(); + } + + return gPos - another.gPos; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(flPos); + dest.writeInt(lastChildFlPos); + dest.writeInt(gPos); + dest.writeLong(gId); + } + } + + protected class MyDataSetObserver extends DataSetObserver { + @Override + public void onChanged() { + refreshExpGroupMetadataList(true, true); + notifyDataSetChanged(); + } + + @Override + public void onInvalidated() { + refreshExpGroupMetadataList(true, true); + notifyDataSetInvalidated(); + } + } + + static public class PositionMetadata { + private static final int MAX_POOL_SIZE = 5; + private static ArrayList sPool = + new ArrayList(MAX_POOL_SIZE); + + private static PositionMetadata getRecycledOrCreate() { + PositionMetadata pm; + synchronized (sPool) { + if (sPool.size() > 0) { + pm = sPool.remove(0); + } else { + return new PositionMetadata(); + } + } + pm.resetState(); + return pm; + } + + static PositionMetadata obtain(int flatListPos, int type, int groupPos, + int childPos, GroupMetadata groupMetadata, int groupInsertIndex) { + PositionMetadata pm = getRecycledOrCreate(); + pm.position = ExpandableListPosition.obtain(type, groupPos, childPos, flatListPos); + pm.groupMetadata = groupMetadata; + pm.groupInsertIndex = groupInsertIndex; + return pm; + } + + public int groupInsertIndex; + public GroupMetadata groupMetadata; + public ExpandableListPosition position; + + private PositionMetadata() { + } + + public boolean isExpanded() { + return groupMetadata != null; + } + + public void recycle() { + resetState(); + synchronized (sPool) { + if (sPool.size() < MAX_POOL_SIZE) { + sPool.add(this); + } + } + } + + private void resetState() { + if (position != null) { + position.recycle(); + position = null; + } + groupMetadata = null; + groupInsertIndex = 0; + } + } + + private final DataSetObserver mDataSetObserver = new MyDataSetObserver(); + private ExpandableListAdapter mExpandableListAdapter; + private ArrayList mExpGroupMetadataList; + private int mMaxExpGroupCount = Integer.MAX_VALUE; + private int mTotalExpChildrenCount; + + public ExpandableListConnector(ExpandableListAdapter expandableListAdapter) { + mExpGroupMetadataList = new ArrayList(); + setExpandableListAdapter(expandableListAdapter); + } + + @Override + public boolean areAllItemsEnabled() { + return mExpandableListAdapter.areAllItemsEnabled(); + } + + boolean collapseGroup(int groupPos) { + ExpandableListPosition elGroupPos = ExpandableListPosition.obtain( + ExpandableListPosition.GROUP, groupPos, -1, -1); + PositionMetadata pm = getFlattenedPos(elGroupPos); + elGroupPos.recycle(); + if (pm == null) { + return false; + } + boolean retValue = collapseGroup(pm); + pm.recycle(); + return retValue; + } + + boolean collapseGroup(PositionMetadata posMetadata) { + if (posMetadata.groupMetadata == null) { + return false; + } + mExpGroupMetadataList.remove(posMetadata.groupMetadata); + refreshExpGroupMetadataList(false, false); + notifyDataSetChanged(); + mExpandableListAdapter.onGroupCollapsed(posMetadata.groupMetadata.gPos); + return true; + } + + boolean expandGroup(int groupPos) { + ExpandableListPosition elGroupPos = ExpandableListPosition.obtain( + ExpandableListPosition.GROUP, groupPos, -1, -1); + PositionMetadata pm = getFlattenedPos(elGroupPos); + elGroupPos.recycle(); + boolean retValue = expandGroup(pm); + pm.recycle(); + return retValue; + } + + boolean expandGroup(PositionMetadata posMetadata) { + if (posMetadata.position.groupPos < 0) { + throw new RuntimeException("Need group"); + } + if (mMaxExpGroupCount == 0) { + return false; + } + if (posMetadata.groupMetadata != null) { + return false; + } + if (mExpGroupMetadataList.size() >= mMaxExpGroupCount) { + GroupMetadata collapsedGm = mExpGroupMetadataList.get(0); + int collapsedIndex = mExpGroupMetadataList.indexOf(collapsedGm); + collapseGroup(collapsedGm.gPos); + if (posMetadata.groupInsertIndex > collapsedIndex) { + posMetadata.groupInsertIndex--; + } + } + GroupMetadata expandedGm = GroupMetadata.obtain( + GroupMetadata.REFRESH, + GroupMetadata.REFRESH, + posMetadata.position.groupPos, + mExpandableListAdapter.getGroupId(posMetadata.position.groupPos)); + mExpGroupMetadataList.add(posMetadata.groupInsertIndex, expandedGm); + refreshExpGroupMetadataList(false, false); + notifyDataSetChanged(); + mExpandableListAdapter.onGroupExpanded(expandedGm.gPos); + return true; + } + + int findGroupPosition(long groupIdToMatch, int seedGroupPosition) { + int count = mExpandableListAdapter.getGroupCount(); + if (count == 0) { + return AdapterView.INVALID_POSITION; + } + if (groupIdToMatch == AdapterView.INVALID_ROW_ID) { + return AdapterView.INVALID_POSITION; + } + seedGroupPosition = Math.max(0, seedGroupPosition); + seedGroupPosition = Math.min(count - 1, seedGroupPosition); + long endTime = SystemClock.uptimeMillis() + AdapterView.SYNC_MAX_DURATION_MILLIS; + long rowId; + int first = seedGroupPosition; + int last = seedGroupPosition; + boolean next = false; + boolean hitFirst; + boolean hitLast; + ExpandableListAdapter adapter = getAdapter(); + if (adapter == null) { + return AdapterView.INVALID_POSITION; + } + while (SystemClock.uptimeMillis() <= endTime) { + rowId = adapter.getGroupId(seedGroupPosition); + if (rowId == groupIdToMatch) { + return seedGroupPosition; + } + hitLast = last == count - 1; + hitFirst = first == 0; + if (hitLast && hitFirst) { + break; + } + if (hitFirst || next && !hitLast) { + last++; + seedGroupPosition = last; + next = false; + } else if (hitLast || !next && !hitFirst) { + first--; + seedGroupPosition = first; + next = true; + } + } + return AdapterView.INVALID_POSITION; + } + + ExpandableListAdapter getAdapter() { + return mExpandableListAdapter; + } + + @Override + public int getCount() { + return mExpandableListAdapter.getGroupCount() + mTotalExpChildrenCount; + } + + ArrayList getExpandedGroupMetadataList() { + return mExpGroupMetadataList; + } + + @Override + public Filter getFilter() { + ExpandableListAdapter adapter = getAdapter(); + if (adapter instanceof Filterable) { + return ((Filterable) adapter).getFilter(); + } else { + return null; + } + } + + PositionMetadata getFlattenedPos(final ExpandableListPosition pos) { + final ArrayList egml = mExpGroupMetadataList; + final int numExpGroups = egml.size(); + int leftExpGroupIndex = 0; + int rightExpGroupIndex = numExpGroups - 1; + int midExpGroupIndex = 0; + GroupMetadata midExpGm; + if (numExpGroups == 0) { + return PositionMetadata.obtain(pos.groupPos, pos.type, + pos.groupPos, pos.childPos, null, 0); + } + while (leftExpGroupIndex <= rightExpGroupIndex) { + midExpGroupIndex = (rightExpGroupIndex - leftExpGroupIndex) / 2 + leftExpGroupIndex; + midExpGm = egml.get(midExpGroupIndex); + if (pos.groupPos > midExpGm.gPos) { + leftExpGroupIndex = midExpGroupIndex + 1; + } else if (pos.groupPos < midExpGm.gPos) { + rightExpGroupIndex = midExpGroupIndex - 1; + } else if (pos.groupPos == midExpGm.gPos) { + if (pos.type == ExpandableListPosition.GROUP) { + return PositionMetadata.obtain(midExpGm.flPos, pos.type, + pos.groupPos, pos.childPos, midExpGm, midExpGroupIndex); + } else if (pos.type == ExpandableListPosition.CHILD) { + return PositionMetadata.obtain(midExpGm.flPos + pos.childPos + + 1, pos.type, pos.groupPos, pos.childPos, + midExpGm, midExpGroupIndex); + } else { + return null; + } + } + } + if (pos.type != ExpandableListPosition.GROUP) { + return null; + } + if (leftExpGroupIndex > midExpGroupIndex) { + final GroupMetadata leftExpGm = egml.get(leftExpGroupIndex - 1); + final int flPos = + leftExpGm.lastChildFlPos + + pos.groupPos - leftExpGm.gPos; + + return PositionMetadata.obtain(flPos, pos.type, pos.groupPos, + pos.childPos, null, leftExpGroupIndex); + } else if (rightExpGroupIndex < midExpGroupIndex) { + final GroupMetadata rightExpGm = egml.get(++rightExpGroupIndex); + final int flPos = + rightExpGm.flPos + - (rightExpGm.gPos - pos.groupPos); + return PositionMetadata.obtain(flPos, pos.type, pos.groupPos, + pos.childPos, null, rightExpGroupIndex); + } else { + return null; + } + } + + @Override + public Object getItem(int flatListPos) { + final PositionMetadata posMetadata = getUnflattenedPos(flatListPos); + Object retValue; + if (posMetadata.position.type == ExpandableListPosition.GROUP) { + retValue = mExpandableListAdapter + .getGroup(posMetadata.position.groupPos); + } else if (posMetadata.position.type == ExpandableListPosition.CHILD) { + retValue = mExpandableListAdapter.getChild(posMetadata.position.groupPos, + posMetadata.position.childPos); + } else { + throw new RuntimeException("Flat list position is of unknown type"); + } + posMetadata.recycle(); + return retValue; + } + + @Override + public long getItemId(int flatListPos) { + final PositionMetadata posMetadata = getUnflattenedPos(flatListPos); + final long groupId = mExpandableListAdapter.getGroupId(posMetadata.position.groupPos); + long retValue; + if (posMetadata.position.type == ExpandableListPosition.GROUP) { + retValue = mExpandableListAdapter.getCombinedGroupId(groupId); + } else if (posMetadata.position.type == ExpandableListPosition.CHILD) { + final long childId = mExpandableListAdapter.getChildId(posMetadata.position.groupPos, + posMetadata.position.childPos); + retValue = mExpandableListAdapter.getCombinedChildId(groupId, childId); + } else { + throw new RuntimeException("Flat list position is of unknown type"); + } + posMetadata.recycle(); + return retValue; + } + + @Override + public int getItemViewType(int flatListPos) { + final PositionMetadata metadata = getUnflattenedPos(flatListPos); + final ExpandableListPosition pos = metadata.position; + int retValue; + if (mExpandableListAdapter instanceof HeterogeneousExpandableList) { + HeterogeneousExpandableList adapter = + (HeterogeneousExpandableList) mExpandableListAdapter; + if (pos.type == ExpandableListPosition.GROUP) { + retValue = adapter.getGroupType(pos.groupPos); + } else { + final int childType = adapter.getChildType(pos.groupPos, pos.childPos); + retValue = adapter.getGroupTypeCount() + childType; + } + } else { + if (pos.type == ExpandableListPosition.GROUP) { + retValue = 0; + } else { + retValue = 1; + } + } + metadata.recycle(); + return retValue; + } + + PositionMetadata getUnflattenedPos(final int flPos) { + final ArrayList egml = mExpGroupMetadataList; + final int numExpGroups = egml.size(); + int leftExpGroupIndex = 0; + int rightExpGroupIndex = numExpGroups - 1; + int midExpGroupIndex = 0; + GroupMetadata midExpGm; + if (numExpGroups == 0) { + return PositionMetadata.obtain(flPos, ExpandableListPosition.GROUP, flPos, + -1, null, 0); + } + while (leftExpGroupIndex <= rightExpGroupIndex) { + midExpGroupIndex = + (rightExpGroupIndex - leftExpGroupIndex) / 2 + + leftExpGroupIndex; + midExpGm = egml.get(midExpGroupIndex); + if (flPos > midExpGm.lastChildFlPos) { + leftExpGroupIndex = midExpGroupIndex + 1; + } else if (flPos < midExpGm.flPos) { + rightExpGroupIndex = midExpGroupIndex - 1; + } else if (flPos == midExpGm.flPos) { + return PositionMetadata.obtain(flPos, ExpandableListPosition.GROUP, + midExpGm.gPos, -1, midExpGm, midExpGroupIndex); + } else if (flPos <= midExpGm.lastChildFlPos) { + final int childPos = flPos - (midExpGm.flPos + 1); + return PositionMetadata.obtain(flPos, ExpandableListPosition.CHILD, + midExpGm.gPos, childPos, midExpGm, midExpGroupIndex); + } + } + int insertPosition = 0; + int groupPos = 0; + if (leftExpGroupIndex > midExpGroupIndex) { + final GroupMetadata leftExpGm = egml.get(leftExpGroupIndex - 1); + insertPosition = leftExpGroupIndex; + groupPos = + flPos - leftExpGm.lastChildFlPos + leftExpGm.gPos; + } else if (rightExpGroupIndex < midExpGroupIndex) { + final GroupMetadata rightExpGm = egml.get(++rightExpGroupIndex); + insertPosition = rightExpGroupIndex; + groupPos = rightExpGm.gPos - (rightExpGm.flPos - flPos); + } else { + throw new RuntimeException("Unknown state"); + } + return PositionMetadata.obtain(flPos, ExpandableListPosition.GROUP, groupPos, -1, + null, insertPosition); + } + + @Override + public View getView(int flatListPos, View convertView, ViewGroup parent) { + final PositionMetadata posMetadata = getUnflattenedPos(flatListPos); + View retValue; + if (posMetadata.position.type == ExpandableListPosition.GROUP) { + retValue = mExpandableListAdapter.getGroupView(posMetadata.position.groupPos, + posMetadata.isExpanded(), convertView, parent); + } else if (posMetadata.position.type == ExpandableListPosition.CHILD) { + final boolean isLastChild = posMetadata.groupMetadata.lastChildFlPos == flatListPos; + + retValue = mExpandableListAdapter.getChildView(posMetadata.position.groupPos, + posMetadata.position.childPos, isLastChild, convertView, parent); + } else { + throw new RuntimeException("Flat list position is of unknown type"); + } + posMetadata.recycle(); + return retValue; + } + + @Override + public int getViewTypeCount() { + if (mExpandableListAdapter instanceof HeterogeneousExpandableList) { + HeterogeneousExpandableList adapter = + (HeterogeneousExpandableList) mExpandableListAdapter; + return adapter.getGroupTypeCount() + adapter.getChildTypeCount(); + } else { + return 2; + } + } + + @Override + public boolean hasStableIds() { + return mExpandableListAdapter.hasStableIds(); + } + + @Override + public boolean isEmpty() { + ExpandableListAdapter adapter = getAdapter(); + return adapter != null ? adapter.isEmpty() : true; + } + + @Override + public boolean isEnabled(int flatListPos) { + final PositionMetadata metadata = getUnflattenedPos(flatListPos); + final ExpandableListPosition pos = metadata.position; + boolean retValue; + if (pos.type == ExpandableListPosition.CHILD) { + retValue = mExpandableListAdapter.isChildSelectable(pos.groupPos, pos.childPos); + } else { + retValue = true; + } + metadata.recycle(); + return retValue; + } + + public boolean isGroupExpanded(int groupPosition) { + GroupMetadata groupMetadata; + for (int i = mExpGroupMetadataList.size() - 1; i >= 0; i--) { + groupMetadata = mExpGroupMetadataList.get(i); + if (groupMetadata.gPos == groupPosition) { + return true; + } + } + return false; + } + + private void refreshExpGroupMetadataList(boolean forceChildrenCountRefresh, + boolean syncGroupPositions) { + final ArrayList egml = mExpGroupMetadataList; + int egmlSize = egml.size(); + int curFlPos = 0; + mTotalExpChildrenCount = 0; + if (syncGroupPositions) { + boolean positionsChanged = false; + for (int i = egmlSize - 1; i >= 0; i--) { + GroupMetadata curGm = egml.get(i); + int newGPos = findGroupPosition(curGm.gId, curGm.gPos); + if (newGPos != curGm.gPos) { + if (newGPos == AdapterView.INVALID_POSITION) { + egml.remove(i); + egmlSize--; + } + curGm.gPos = newGPos; + if (!positionsChanged) { + positionsChanged = true; + } + } + } + if (positionsChanged) { + Collections.sort(egml); + } + } + int gChildrenCount; + int lastGPos = 0; + for (int i = 0; i < egmlSize; i++) { + GroupMetadata curGm = egml.get(i); + if (curGm.lastChildFlPos == GroupMetadata.REFRESH || forceChildrenCountRefresh) { + gChildrenCount = mExpandableListAdapter.getChildrenCount(curGm.gPos); + } else { + gChildrenCount = curGm.lastChildFlPos - curGm.flPos; + } + mTotalExpChildrenCount += gChildrenCount; + curFlPos += curGm.gPos - lastGPos; + lastGPos = curGm.gPos; + curGm.flPos = curFlPos; + curFlPos += gChildrenCount; + curGm.lastChildFlPos = curFlPos; + } + } + + public void setExpandableListAdapter(ExpandableListAdapter expandableListAdapter) { + if (mExpandableListAdapter != null) { + mExpandableListAdapter.unregisterDataSetObserver(mDataSetObserver); + } + mExpandableListAdapter = expandableListAdapter; + expandableListAdapter.registerDataSetObserver(mDataSetObserver); + } + + void setExpandedGroupMetadataList(ArrayList expandedGroupMetadataList) { + if (expandedGroupMetadataList == null || mExpandableListAdapter == null) { + return; + } + int numGroups = mExpandableListAdapter.getGroupCount(); + for (int i = expandedGroupMetadataList.size() - 1; i >= 0; i--) { + if (expandedGroupMetadataList.get(i).gPos >= numGroups) { + return; + } + } + mExpGroupMetadataList = expandedGroupMetadataList; + refreshExpGroupMetadataList(true, false); + } + + public void setMaxExpGroupCount(int maxExpGroupCount) { + mMaxExpGroupCount = maxExpGroupCount; + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/ExpandableListPosition.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/ExpandableListPosition.java new file mode 100644 index 0000000000..95ce097168 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/ExpandableListPosition.java @@ -0,0 +1,92 @@ + +package org.holoeverywhere.widget; + +import java.util.ArrayList; + +public class ExpandableListPosition { + public final static int CHILD = 1; + public final static int GROUP = 2; + private static final int MAX_POOL_SIZE = 5; + private static ArrayList sPool = + new ArrayList(MAX_POOL_SIZE); + + private static ExpandableListPosition getRecycledOrCreate() { + ExpandableListPosition elp; + synchronized (sPool) { + if (sPool.size() > 0) { + elp = sPool.remove(0); + } else { + return new ExpandableListPosition(); + } + } + elp.resetState(); + return elp; + } + + static ExpandableListPosition obtain(int type, int groupPos, int childPos, int flatListPos) { + ExpandableListPosition elp = getRecycledOrCreate(); + elp.type = type; + elp.groupPos = groupPos; + elp.childPos = childPos; + elp.flatListPos = flatListPos; + return elp; + } + + static ExpandableListPosition obtainChildPosition(int groupPosition, int childPosition) { + return obtain(CHILD, groupPosition, childPosition, 0); + } + + static ExpandableListPosition obtainGroupPosition(int groupPosition) { + return obtain(GROUP, groupPosition, 0, 0); + } + + static ExpandableListPosition obtainPosition(long packedPosition) { + if (packedPosition == ExpandableListView.PACKED_POSITION_VALUE_NULL) { + return null; + } + + ExpandableListPosition elp = getRecycledOrCreate(); + elp.groupPos = ExpandableListView.getPackedPositionGroup(packedPosition); + if (ExpandableListView.getPackedPositionType(packedPosition) == ExpandableListView.PACKED_POSITION_TYPE_CHILD) { + elp.type = CHILD; + elp.childPos = ExpandableListView.getPackedPositionChild(packedPosition); + } else { + elp.type = GROUP; + } + return elp; + } + + public int childPos; + + int flatListPos; + + public int groupPos; + + public int type; + + private ExpandableListPosition() { + } + + long getPackedPosition() { + if (type == CHILD) { + return ExpandableListView.getPackedPositionForChild(groupPos, childPos); + } else { + return ExpandableListView.getPackedPositionForGroup(groupPos); + } + } + + public void recycle() { + synchronized (sPool) { + if (sPool.size() < MAX_POOL_SIZE) { + sPool.add(this); + } + } + } + + private void resetState() { + groupPos = 0; + childPos = 0; + flatListPos = 0; + type = 0; + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/ExpandableListView.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/ExpandableListView.java new file mode 100644 index 0000000000..923d4b0679 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/ExpandableListView.java @@ -0,0 +1,645 @@ + +package org.holoeverywhere.widget; + +import java.util.ArrayList; + +import org.holoeverywhere.R; +import org.holoeverywhere.widget.ExpandableListConnector.PositionMetadata; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.os.Build.VERSION; +import android.os.Build.VERSION_CODES; +import android.os.Parcel; +import android.os.Parcelable; +import android.util.AttributeSet; +import android.view.ContextMenu; +import android.view.ContextMenu.ContextMenuInfo; +import android.view.SoundEffectConstants; +import android.view.View; +import android.view.accessibility.AccessibilityEvent; +import android.view.accessibility.AccessibilityNodeInfo; +import android.widget.ExpandableListAdapter; +import android.widget.ListAdapter; + +public class ExpandableListView extends ListView { + public static class ExpandableListContextMenuInfo implements ContextMenu.ContextMenuInfo { + public long id; + public long packedPosition; + public View targetView; + + public ExpandableListContextMenuInfo(View targetView, long packedPosition, long id) { + this.targetView = targetView; + this.packedPosition = packedPosition; + this.id = id; + } + } + + public interface OnChildClickListener { + boolean onChildClick(ExpandableListView parent, View v, int groupPosition, + int childPosition, long id); + } + + public interface OnGroupClickListener { + boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, + long id); + } + + public interface OnGroupCollapseListener { + void onGroupCollapse(int groupPosition); + } + + public interface OnGroupExpandListener { + void onGroupExpand(int groupPosition); + } + + static class SavedState extends BaseSavedState { + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + @Override + public SavedState createFromParcel(Parcel in) { + return new SavedState(in); + } + + @Override + public SavedState[] newArray(int size) { + return new SavedState[size]; + } + }; + ArrayList expandedGroupMetadataList; + + private SavedState(Parcel in) { + super(in.readParcelable(ListView.SavedState.class.getClassLoader())); + expandedGroupMetadataList = new ArrayList(); + in.readList(expandedGroupMetadataList, ExpandableListConnector.class.getClassLoader()); + } + + SavedState( + Parcelable superState, + ArrayList expandedGroupMetadataList) { + super(superState); + this.expandedGroupMetadataList = expandedGroupMetadataList; + } + + @Override + public void writeToParcel(Parcel out, int flags) { + super.writeToParcel(out, flags); + out.writeList(expandedGroupMetadataList); + } + } + + public static final int CHILD_INDICATOR_INHERIT = -1; + private static final int[] CHILD_LAST_STATE_SET = + { + android.R.attr.state_last + }; + + private static final int[] EMPTY_STATE_SET = {}; + private static final int[] GROUP_EMPTY_STATE_SET = + { + android.R.attr.state_empty + }; + private static final int[] GROUP_EXPANDED_EMPTY_STATE_SET = + { + android.R.attr.state_expanded, android.R.attr.state_empty + }; + private static final int[] GROUP_EXPANDED_STATE_SET = + { + android.R.attr.state_expanded + }; + private static final int[][] GROUP_STATE_SETS = { + EMPTY_STATE_SET, + GROUP_EXPANDED_STATE_SET, + GROUP_EMPTY_STATE_SET, + GROUP_EXPANDED_EMPTY_STATE_SET + }; + + private static final long PACKED_POSITION_INT_MASK_CHILD = 0xFFFFFFFF; + private static final long PACKED_POSITION_INT_MASK_GROUP = 0x7FFFFFFF; + private static final long PACKED_POSITION_MASK_CHILD = 0x00000000FFFFFFFFL; + private static final long PACKED_POSITION_MASK_GROUP = 0x7FFFFFFF00000000L; + private static final long PACKED_POSITION_MASK_TYPE = 0x8000000000000000L; + private static final long PACKED_POSITION_SHIFT_GROUP = 32; + private static final long PACKED_POSITION_SHIFT_TYPE = 63; + public static final int PACKED_POSITION_TYPE_CHILD = 1; + public static final int PACKED_POSITION_TYPE_GROUP = 0; + public static final int PACKED_POSITION_TYPE_NULL = 2; + public static final long PACKED_POSITION_VALUE_NULL = 0x00000000FFFFFFFFL; + + public static int getPackedPositionChild(long packedPosition) { + if (packedPosition == PACKED_POSITION_VALUE_NULL) { + return -1; + } + if ((packedPosition & PACKED_POSITION_MASK_TYPE) != PACKED_POSITION_MASK_TYPE) { + return -1; + } + return (int) (packedPosition & PACKED_POSITION_MASK_CHILD); + } + + public static long getPackedPositionForChild(int groupPosition, int childPosition) { + return (long) PACKED_POSITION_TYPE_CHILD << PACKED_POSITION_SHIFT_TYPE + | (groupPosition & PACKED_POSITION_INT_MASK_GROUP) + << PACKED_POSITION_SHIFT_GROUP + | childPosition & PACKED_POSITION_INT_MASK_CHILD; + } + + public static long getPackedPositionForGroup(int groupPosition) { + return (groupPosition & PACKED_POSITION_INT_MASK_GROUP) + << PACKED_POSITION_SHIFT_GROUP; + } + + public static int getPackedPositionGroup(long packedPosition) { + if (packedPosition == PACKED_POSITION_VALUE_NULL) { + return -1; + } + return (int) ((packedPosition & PACKED_POSITION_MASK_GROUP) >> PACKED_POSITION_SHIFT_GROUP); + } + + public static int getPackedPositionType(long packedPosition) { + if (packedPosition == PACKED_POSITION_VALUE_NULL) { + return PACKED_POSITION_TYPE_NULL; + } + return (packedPosition & PACKED_POSITION_MASK_TYPE) == PACKED_POSITION_MASK_TYPE + ? PACKED_POSITION_TYPE_CHILD + : PACKED_POSITION_TYPE_GROUP; + } + + private ExpandableListAdapter mAdapter; + private Drawable mChildDivider; + private Drawable mChildIndicator; + private int mChildIndicatorLeft; + private int mChildIndicatorRight; + private boolean mClipToPadding = false; + private ExpandableListConnector mConnector; + private Drawable mGroupIndicator; + private int mIndicatorLeft; + private final Rect mIndicatorRect = new Rect(); + private int mIndicatorRight; + private OnChildClickListener mOnChildClickListener; + private OnGroupClickListener mOnGroupClickListener; + private OnGroupCollapseListener mOnGroupCollapseListener; + private OnGroupExpandListener mOnGroupExpandListener; + + public ExpandableListView(Context context) { + this(context, null); + } + + public ExpandableListView(Context context, AttributeSet attrs) { + this(context, attrs, android.R.attr.expandableListViewStyle); + } + + public ExpandableListView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ExpandableListView, + defStyle, R.style.Holo_ExpandableListView); + mGroupIndicator = a + .getDrawable(R.styleable.ExpandableListView_android_groupIndicator); + mChildIndicator = a + .getDrawable(R.styleable.ExpandableListView_android_childIndicator); + mIndicatorLeft = a + .getDimensionPixelSize( + R.styleable.ExpandableListView_android_indicatorLeft, 0); + mIndicatorRight = a + .getDimensionPixelSize( + R.styleable.ExpandableListView_android_indicatorRight, 0); + if (mIndicatorRight == 0 && mGroupIndicator != null) { + mIndicatorRight = mIndicatorLeft + mGroupIndicator.getIntrinsicWidth(); + } + mChildIndicatorLeft = a.getDimensionPixelSize( + R.styleable.ExpandableListView_android_childIndicatorLeft, + CHILD_INDICATOR_INHERIT); + mChildIndicatorRight = a.getDimensionPixelSize( + R.styleable.ExpandableListView_android_childIndicatorRight, + CHILD_INDICATOR_INHERIT); + mChildDivider = a + .getDrawable(R.styleable.ExpandableListView_android_childDivider); + + a.recycle(); + } + + public boolean collapseGroup(int groupPos) { + boolean retValue = mConnector.collapseGroup(groupPos); + if (mOnGroupCollapseListener != null) { + mOnGroupCollapseListener.onGroupCollapse(groupPos); + } + return retValue; + } + + @Override + protected ContextMenuInfo createContextMenuInfo(View view, int flatListPosition, long id) { + if (isHeaderOrFooterPosition(flatListPosition)) { + return super.createContextMenuInfo(view, flatListPosition, id); + } + final int adjustedPosition = getFlatPositionForConnector(flatListPosition); + PositionMetadata pm = mConnector.getUnflattenedPos(adjustedPosition); + ExpandableListPosition pos = pm.position; + id = getChildOrGroupId(pos); + long packedPosition = pos.getPackedPosition(); + pm.recycle(); + return new ExpandableListContextMenuInfo(view, packedPosition, id); + } + + @Override + protected void dispatchDraw(Canvas canvas) { + super.dispatchDraw(canvas); + if (mChildIndicator == null && mGroupIndicator == null) { + return; + } + int saveCount = 0; + final boolean clipToPadding = mClipToPadding; + if (clipToPadding) { + saveCount = canvas.save(); + final int scrollX = getScrollX(); + final int scrollY = getScrollY(); + canvas.clipRect(scrollX + getPaddingLeft(), scrollY + getPaddingTop(), + scrollX + getRight() - getLeft() - getPaddingRight(), + scrollY + getBottom() - getTop() - getPaddingBottom()); + } + final int headerViewsCount = getHeaderViewsCount(); + final int lastChildFlPos = getCount() - getFooterViewsCount() - headerViewsCount - 1; + final int myB = getBottom(); + PositionMetadata pos; + View item; + Drawable indicator; + int t, b; + int lastItemType = ~(ExpandableListPosition.CHILD | ExpandableListPosition.GROUP); + final Rect indicatorRect = mIndicatorRect; + final int childCount = getChildCount(); + for (int i = 0, childFlPos = getFirstVisiblePosition() - headerViewsCount; i < childCount; i++, childFlPos++) { + if (childFlPos < 0) { + continue; + } else if (childFlPos > lastChildFlPos) { + break; + } + item = getChildAt(i); + t = item.getTop(); + b = item.getBottom(); + if (b < 0 || t > myB) { + continue; + } + pos = mConnector.getUnflattenedPos(childFlPos); + if (pos.position.type != lastItemType) { + if (pos.position.type == ExpandableListPosition.CHILD) { + indicatorRect.left = mChildIndicatorLeft == CHILD_INDICATOR_INHERIT ? + mIndicatorLeft : mChildIndicatorLeft; + indicatorRect.right = mChildIndicatorRight == CHILD_INDICATOR_INHERIT ? + mIndicatorRight : mChildIndicatorRight; + } else { + indicatorRect.left = mIndicatorLeft; + indicatorRect.right = mIndicatorRight; + } + indicatorRect.left += getPaddingLeft(); + indicatorRect.right += getPaddingLeft(); + lastItemType = pos.position.type; + } + + if (indicatorRect.left != indicatorRect.right) { + if (isStackFromBottom()) { + indicatorRect.top = t; + indicatorRect.bottom = b; + } else { + indicatorRect.top = t; + indicatorRect.bottom = b; + } + indicator = getIndicator(pos); + if (indicator != null) { + indicator.setBounds(indicatorRect); + indicator.draw(canvas); + } + } + pos.recycle(); + } + + if (clipToPadding) { + canvas.restoreToCount(saveCount); + } + } + + @Override + void drawDivider(Canvas canvas, Rect bounds, int childIndex) { + int flatListPosition = childIndex + getFirstVisiblePosition(); + if (flatListPosition >= 0) { + final int adjustedPosition = + getFlatPositionForConnector(flatListPosition); + PositionMetadata pos = mConnector.getUnflattenedPos(adjustedPosition); + if (pos.position.type == + ExpandableListPosition.CHILD || pos.isExpanded() && + pos.groupMetadata.lastChildFlPos != pos.groupMetadata.flPos) { + Drawable divider = mChildDivider; + divider.setBounds(bounds); + divider.draw(canvas); + pos.recycle(); + return; + } + pos.recycle(); + } + super.drawDivider(canvas, bounds, flatListPosition); + } + + public boolean expandGroup(int groupPos) { + return expandGroup(groupPos, false); + } + + public boolean expandGroup(int groupPos, boolean animate) { + ExpandableListPosition elGroupPos = ExpandableListPosition.obtain( + ExpandableListPosition.GROUP, groupPos, -1, -1); + PositionMetadata pm = mConnector.getFlattenedPos(elGroupPos); + elGroupPos.recycle(); + boolean retValue = mConnector.expandGroup(pm); + if (mOnGroupExpandListener != null) { + mOnGroupExpandListener.onGroupExpand(groupPos); + } + // TODO Make it works on Eclair + if (animate && VERSION.SDK_INT >= VERSION_CODES.FROYO) { + final int groupFlatPos = pm.position.flatListPos; + final int shiftedGroupPosition = groupFlatPos + getHeaderViewsCount(); + smoothScrollToPosition(shiftedGroupPosition + mAdapter.getChildrenCount(groupPos), + shiftedGroupPosition); + } + pm.recycle(); + return retValue; + } + + private int getAbsoluteFlatPosition(int flatListPosition) { + return flatListPosition + getHeaderViewsCount(); + } + + private long getChildOrGroupId(ExpandableListPosition position) { + if (position.type == ExpandableListPosition.CHILD) { + return mAdapter.getChildId(position.groupPos, position.childPos); + } else { + return mAdapter.getGroupId(position.groupPos); + } + } + + public ExpandableListAdapter getExpandableListAdapter() { + return mAdapter; + } + + public long getExpandableListPosition(int flatListPosition) { + if (isHeaderOrFooterPosition(flatListPosition)) { + return PACKED_POSITION_VALUE_NULL; + } + final int adjustedPosition = getFlatPositionForConnector(flatListPosition); + PositionMetadata pm = mConnector.getUnflattenedPos(adjustedPosition); + long packedPos = pm.position.getPackedPosition(); + pm.recycle(); + return packedPos; + } + + public int getFlatListPosition(long packedPosition) { + ExpandableListPosition elPackedPos = ExpandableListPosition + .obtainPosition(packedPosition); + PositionMetadata pm = mConnector.getFlattenedPos(elPackedPos); + elPackedPos.recycle(); + final int flatListPosition = pm.position.flatListPos; + pm.recycle(); + return getAbsoluteFlatPosition(flatListPosition); + } + + private int getFlatPositionForConnector(int flatListPosition) { + return flatListPosition - getHeaderViewsCount(); + } + + private Drawable getIndicator(PositionMetadata pos) { + Drawable indicator; + if (pos.position.type == ExpandableListPosition.GROUP) { + indicator = mGroupIndicator; + if (indicator != null && indicator.isStateful()) { + boolean isEmpty = pos.groupMetadata == null || + pos.groupMetadata.lastChildFlPos == pos.groupMetadata.flPos; + final int stateSetIndex = + (pos.isExpanded() ? 1 : 0) | // Expanded? + (isEmpty ? 2 : 0); // Empty? + indicator.setState(GROUP_STATE_SETS[stateSetIndex]); + } + } else { + indicator = mChildIndicator; + if (indicator != null && indicator.isStateful()) { + final int stateSet[] = pos.position.flatListPos == pos.groupMetadata.lastChildFlPos + ? CHILD_LAST_STATE_SET + : EMPTY_STATE_SET; + indicator.setState(stateSet); + } + } + return indicator; + } + + public long getSelectedId() { + long packedPos = getSelectedPosition(); + if (packedPos == PACKED_POSITION_VALUE_NULL) { + return -1; + } + int groupPos = getPackedPositionGroup(packedPos); + if (getPackedPositionType(packedPos) == PACKED_POSITION_TYPE_GROUP) { + return mAdapter.getGroupId(groupPos); + } else { + return mAdapter.getChildId(groupPos, getPackedPositionChild(packedPos)); + } + } + + public long getSelectedPosition() { + final int selectedPos = getSelectedItemPosition(); + return getExpandableListPosition(selectedPos); + } + + boolean handleItemClick(View v, int position, long id) { + final PositionMetadata posMetadata = mConnector.getUnflattenedPos(position); + id = getChildOrGroupId(posMetadata.position); + boolean returnValue; + if (posMetadata.position.type == ExpandableListPosition.GROUP) { + if (mOnGroupClickListener != null) { + if (mOnGroupClickListener.onGroupClick(this, v, + posMetadata.position.groupPos, id)) { + posMetadata.recycle(); + return true; + } + } + if (posMetadata.isExpanded()) { + mConnector.collapseGroup(posMetadata); + playSoundEffect(SoundEffectConstants.CLICK); + if (mOnGroupCollapseListener != null) { + mOnGroupCollapseListener.onGroupCollapse(posMetadata.position.groupPos); + } + } else { + mConnector.expandGroup(posMetadata); + playSoundEffect(SoundEffectConstants.CLICK); + if (mOnGroupExpandListener != null) { + mOnGroupExpandListener.onGroupExpand(posMetadata.position.groupPos); + } + // TODO Make it works on Eclair + if (VERSION.SDK_INT >= VERSION_CODES.FROYO) { + final int groupPos = posMetadata.position.groupPos; + final int groupFlatPos = posMetadata.position.flatListPos; + final int shiftedGroupPosition = groupFlatPos + getHeaderViewsCount(); + smoothScrollToPosition( + shiftedGroupPosition + mAdapter.getChildrenCount(groupPos), + shiftedGroupPosition); + } + } + returnValue = true; + } else { + if (mOnChildClickListener != null) { + playSoundEffect(SoundEffectConstants.CLICK); + return mOnChildClickListener.onChildClick(this, v, posMetadata.position.groupPos, + posMetadata.position.childPos, id); + } + returnValue = false; + } + posMetadata.recycle(); + return returnValue; + } + + public boolean isGroupExpanded(int groupPosition) { + return mConnector.isGroupExpanded(groupPosition); + } + + private boolean isHeaderOrFooterPosition(int position) { + final int footerViewsStart = getCount() - getFooterViewsCount(); + return position < getHeaderViewsCount() || position >= footerViewsStart; + } + + @Override + public void onInitializeAccessibilityEvent(AccessibilityEvent event) { + super.onInitializeAccessibilityEvent(event); + event.setClassName(ExpandableListView.class.getName()); + } + + @Override + public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { + super.onInitializeAccessibilityNodeInfo(info); + info.setClassName(ExpandableListView.class.getName()); + } + + @Override + public void onRestoreInstanceState(Parcelable state) { + if (!(state instanceof SavedState)) { + super.onRestoreInstanceState(state); + return; + } + SavedState ss = (SavedState) state; + super.onRestoreInstanceState(ss.getSuperState()); + if (mConnector != null && ss.expandedGroupMetadataList != null) { + mConnector.setExpandedGroupMetadataList(ss.expandedGroupMetadataList); + } + } + + @Override + public Parcelable onSaveInstanceState() { + Parcelable superState = super.onSaveInstanceState(); + return new SavedState(superState, + mConnector != null ? mConnector.getExpandedGroupMetadataList() : null); + } + + @Override + public boolean performItemClick(View v, int position, long id) { + if (isHeaderOrFooterPosition(position)) { + return super.performItemClick(v, position, id); + } + final int adjustedPosition = getFlatPositionForConnector(position); + return handleItemClick(v, adjustedPosition, id); + } + + public void setAdapter(ExpandableListAdapter adapter) { + mAdapter = adapter; + if (adapter != null) { + mConnector = new ExpandableListConnector(adapter); + } else { + mConnector = null; + } + super.setAdapter(mConnector); + } + + @Override + public void setAdapter(ListAdapter adapter) { + throw new RuntimeException( + "For ExpandableListView, use setAdapter(ExpandableListAdapter) instead of " + + "setAdapter(ListAdapter)"); + } + + public void setChildDivider(Drawable childDivider) { + mChildDivider = childDivider; + } + + public void setChildIndicator(Drawable childIndicator) { + mChildIndicator = childIndicator; + } + + public void setChildIndicatorBounds(int left, int right) { + mChildIndicatorLeft = left; + mChildIndicatorRight = right; + } + + @Override + public void setClipToPadding(boolean clipToPadding) { + super.setClipToPadding(mClipToPadding = clipToPadding); + } + + public void setGroupIndicator(Drawable groupIndicator) { + mGroupIndicator = groupIndicator; + if (mIndicatorRight == 0 && mGroupIndicator != null) { + mIndicatorRight = mIndicatorLeft + mGroupIndicator.getIntrinsicWidth(); + } + } + + public void setIndicatorBounds(int left, int right) { + mIndicatorLeft = left; + mIndicatorRight = right; + } + + public void setOnChildClickListener(OnChildClickListener onChildClickListener) { + mOnChildClickListener = onChildClickListener; + } + + public void setOnGroupClickListener(OnGroupClickListener onGroupClickListener) { + mOnGroupClickListener = onGroupClickListener; + } + + public void setOnGroupCollapseListener( + OnGroupCollapseListener onGroupCollapseListener) { + mOnGroupCollapseListener = onGroupCollapseListener; + } + + public void setOnGroupExpandListener( + OnGroupExpandListener onGroupExpandListener) { + mOnGroupExpandListener = onGroupExpandListener; + } + + @Override + public void setOnItemClickListener(OnItemClickListener l) { + super.setOnItemClickListener(l); + } + + public boolean setSelectedChild(int groupPosition, int childPosition, boolean shouldExpandGroup) { + ExpandableListPosition elChildPos = ExpandableListPosition.obtainChildPosition( + groupPosition, childPosition); + PositionMetadata flatChildPos = mConnector.getFlattenedPos(elChildPos); + if (flatChildPos == null) { + if (!shouldExpandGroup) { + return false; + } + expandGroup(groupPosition); + flatChildPos = mConnector.getFlattenedPos(elChildPos); + if (flatChildPos == null) { + throw new IllegalStateException("Could not find child"); + } + } + int absoluteFlatPosition = getAbsoluteFlatPosition(flatChildPos.position.flatListPos); + super.setSelection(absoluteFlatPosition); + elChildPos.recycle(); + flatChildPos.recycle(); + return true; + } + + public void setSelectedGroup(int groupPosition) { + ExpandableListPosition elGroupPos = ExpandableListPosition + .obtainGroupPosition(groupPosition); + PositionMetadata pm = mConnector.getFlattenedPos(elGroupPos); + elGroupPos.recycle(); + final int absoluteFlatPosition = getAbsoluteFlatPosition(pm.position.flatListPos); + super.setSelection(absoluteFlatPosition); + pm.recycle(); + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/FastScroller.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/FastScroller.java new file mode 100644 index 0000000000..a36c7f1ee8 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/FastScroller.java @@ -0,0 +1,754 @@ + +package org.holoeverywhere.widget; + +import org.holoeverywhere.R; + +import android.content.Context; +import android.content.res.ColorStateList; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.RectF; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.NinePatchDrawable; +import android.os.Handler; +import android.os.SystemClock; +import android.support.v4.view.MotionEventCompat; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewConfiguration; +import android.widget.AbsListView; +import android.widget.AbsListView.OnScrollListener; +import android.widget.ExpandableListAdapter; +import android.widget.ListAdapter; +import android.widget.SectionIndexer; +import android.widget.WrapperListAdapter; + +class FastScroller { + public class ScrollFade implements Runnable { + static final int ALPHA_MAX = 208; + static final long FADE_DURATION = 200; + long mFadeDuration; + long mStartTime; + + int getAlpha() { + if (getState() != STATE_EXIT) { + return ALPHA_MAX; + } + int alpha; + long now = SystemClock.uptimeMillis(); + if (now > mStartTime + mFadeDuration) { + alpha = 0; + } else { + alpha = (int) (ALPHA_MAX - (now - mStartTime) * ALPHA_MAX / mFadeDuration); + } + return alpha; + } + + @Override + public void run() { + if (getState() != STATE_EXIT) { + startFade(); + return; + } + if (getAlpha() > 0) { + mList.invalidate(); + } else { + setState(STATE_NONE); + } + } + + void startFade() { + mFadeDuration = FADE_DURATION; + mStartTime = SystemClock.uptimeMillis(); + setState(STATE_EXIT); + } + } + + private static final int[] DEFAULT_STATES = new int[0]; + private static final int FADE_TIMEOUT = 1500; + private static int MIN_PAGES = 4; + private static final int OVERLAY_AT_THUMB = 1; + private static final int OVERLAY_FLOATING = 0; + private static final int PENDING_DRAG_DELAY = 180; + private static final int[] PRESSED_STATES = new int[] { + android.R.attr.state_pressed + }; + private static final int STATE_DRAGGING = 2; + private static final int STATE_EXIT = 3; + private static final int STATE_NONE = 0; + private static final int STATE_VISIBLE = 1; + private boolean mAlwaysShow; + private boolean mChangedBounds; + private final Runnable mDeferStartDrag = new Runnable() { + @Override + public void run() { + if (mList.isAttached()) { + beginDrag(); + final int viewHeight = mList.getHeight(); + int newThumbY = (int) mInitialTouchY - mThumbH + 10; + if (newThumbY < 0) { + newThumbY = 0; + } else if (newThumbY + mThumbH > viewHeight) { + newThumbY = viewHeight - mThumbH; + } + mThumbY = newThumbY; + scrollTo((float) mThumbY / (viewHeight - mThumbH)); + } + mPendingDrag = false; + } + }; + private boolean mDrawOverlay; + private Handler mHandler = new Handler(); + float mInitialTouchY; + private int mItemCount = -1; + ListView mList; + ListAdapter mListAdapter; + private int mListOffset; + private boolean mLongList; + private boolean mMatchDragPosition; + private Drawable mOverlayDrawable; + private Drawable mOverlayDrawableLeft; + private Drawable mOverlayDrawableRight; + private RectF mOverlayPos; + private int mOverlayPosition; + private int mOverlaySize; + private Paint mPaint; + boolean mPendingDrag; + private int mPosition; + private int mScaledTouchSlop; + boolean mScrollCompleted; + private ScrollFade mScrollFade; + private SectionIndexer mSectionIndexer; + private Object[] mSections; + private String mSectionText; + private int mState; + private Drawable mThumbDrawable; + int mThumbH; + int mThumbW; + int mThumbY; + private final Rect mTmpRect = new Rect(); + private Drawable mTrackDrawable; + private int mVisibleItem; + + public FastScroller(Context context, ListView listView) { + mList = listView; + init(context); + } + + void beginDrag() { + setState(STATE_DRAGGING); + if (mListAdapter == null && mList != null) { + getSectionsFromIndexer(); + } + if (mList != null) { + mList.requestDisallowInterceptTouchEvent(true); + mList.reportScrollStateChange(OnScrollListener.SCROLL_STATE_TOUCH_SCROLL); + } + cancelFling(); + } + + private void cancelFling() { + MotionEvent cancelFling = MotionEvent.obtain(0, 0, MotionEvent.ACTION_CANCEL, 0, 0, 0); + mList.onTouchEvent(cancelFling); + cancelFling.recycle(); + } + + void cancelPendingDrag() { + mList.removeCallbacks(mDeferStartDrag); + mPendingDrag = false; + } + + public void draw(Canvas canvas) { + if (mState == STATE_NONE) { + return; + } + final int y = mThumbY; + final int viewWidth = mList.getWidth(); + final FastScroller.ScrollFade scrollFade = mScrollFade; + int alpha = -1; + if (mState == STATE_EXIT) { + alpha = scrollFade.getAlpha(); + if (alpha < ScrollFade.ALPHA_MAX / 2) { + mThumbDrawable.setAlpha(alpha * 2); + } + int left = 0; + switch (mPosition) { + case View.SCROLLBAR_POSITION_DEFAULT: + case View.SCROLLBAR_POSITION_RIGHT: + left = viewWidth - mThumbW * alpha / ScrollFade.ALPHA_MAX; + break; + case View.SCROLLBAR_POSITION_LEFT: + left = -mThumbW + mThumbW * alpha / ScrollFade.ALPHA_MAX; + break; + } + mThumbDrawable.setBounds(left, 0, left + mThumbW, mThumbH); + mChangedBounds = true; + } + if (mTrackDrawable != null) { + final Rect thumbBounds = mThumbDrawable.getBounds(); + final int left = thumbBounds.left; + final int halfThumbHeight = (thumbBounds.bottom - thumbBounds.top) / 2; + final int trackWidth = mTrackDrawable.getIntrinsicWidth(); + final int trackLeft = left + mThumbW / 2 - trackWidth / 2; + mTrackDrawable.setBounds(trackLeft, halfThumbHeight, + trackLeft + trackWidth, mList.getHeight() - halfThumbHeight); + mTrackDrawable.draw(canvas); + } + canvas.translate(0, y); + mThumbDrawable.draw(canvas); + canvas.translate(0, -y); + if (mState == STATE_DRAGGING && mDrawOverlay) { + if (mOverlayPosition == OVERLAY_AT_THUMB) { + int left = 0; + switch (mPosition) { + default: + case View.SCROLLBAR_POSITION_DEFAULT: + case View.SCROLLBAR_POSITION_RIGHT: + left = Math.max(0, + mThumbDrawable.getBounds().left - mThumbW - mOverlaySize); + break; + case View.SCROLLBAR_POSITION_LEFT: + left = Math.min(mThumbDrawable.getBounds().right + mThumbW, + mList.getWidth() - mOverlaySize); + break; + } + int top = Math + .max(0, + Math.min(y + (mThumbH - mOverlaySize) / 2, mList.getHeight() + - mOverlaySize)); + final RectF pos = mOverlayPos; + pos.left = left; + pos.right = pos.left + mOverlaySize; + pos.top = top; + pos.bottom = pos.top + mOverlaySize; + if (mOverlayDrawable != null) { + mOverlayDrawable.setBounds((int) pos.left, (int) pos.top, + (int) pos.right, (int) pos.bottom); + } + } + mOverlayDrawable.draw(canvas); + final Paint paint = mPaint; + float descent = paint.descent(); + final RectF rectF = mOverlayPos; + final Rect tmpRect = mTmpRect; + mOverlayDrawable.getPadding(tmpRect); + final int hOff = (tmpRect.right - tmpRect.left) / 2; + final int vOff = (tmpRect.bottom - tmpRect.top) / 2; + canvas.drawText(mSectionText, (int) (rectF.left + rectF.right) / 2 - hOff, + (int) (rectF.bottom + rectF.top) / 2 + mOverlaySize / 4 - descent - vOff, + paint); + } else if (mState == STATE_EXIT) { + if (alpha == 0) { + setState(STATE_NONE); + } else if (mTrackDrawable != null) { + mList.invalidate(viewWidth - mThumbW, 0, viewWidth, mList.getHeight()); + } else { + mList.invalidate(viewWidth - mThumbW, y, viewWidth, y + mThumbH); + } + } + } + + SectionIndexer getSectionIndexer() { + return mSectionIndexer; + } + + Object[] getSections() { + if (mListAdapter == null && mList != null) { + getSectionsFromIndexer(); + } + return mSections; + } + + void getSectionsFromIndexer() { + ListAdapter adapter = mList.getAdapter(); + mSectionIndexer = null; + if (adapter instanceof HeaderViewListAdapter) { + mListOffset = ((HeaderViewListAdapter) adapter).getHeadersCount(); + } + if (adapter instanceof ListAdapterWrapper) { + adapter = ((ListAdapterWrapper) adapter).getWrappedAdapter(); + } + if (adapter instanceof WrapperListAdapter) { + adapter = ((WrapperListAdapter) adapter).getWrappedAdapter(); + } + if (adapter instanceof ExpandableListConnector) { + ExpandableListAdapter expAdapter = ((ExpandableListConnector) adapter).getAdapter(); + if (expAdapter instanceof SectionIndexer) { + mSectionIndexer = (SectionIndexer) expAdapter; + mListAdapter = adapter; + mSections = mSectionIndexer.getSections(); + } + } else { + if (adapter instanceof SectionIndexer) { + mSectionIndexer = (SectionIndexer) adapter; + mSections = mSectionIndexer.getSections(); + if (mSections == null) { + mSections = new String[] { + " " + }; + } + } else { + mSections = new String[] { + " " + }; + } + } + mListAdapter = adapter; + } + + public int getState() { + return mState; + } + + private int getThumbPositionForListPosition(int firstVisibleItem, int visibleItemCount, + int totalItemCount) { + if (mSectionIndexer == null || mListAdapter == null) { + getSectionsFromIndexer(); + } + if (mSectionIndexer == null || !mMatchDragPosition) { + return (mList.getHeight() - mThumbH) * firstVisibleItem + / (totalItemCount - visibleItemCount); + } + firstVisibleItem -= mListOffset; + if (firstVisibleItem < 0) { + return 0; + } + totalItemCount -= mListOffset; + final int trackHeight = mList.getHeight() - mThumbH; + final int section = mSectionIndexer.getSectionForPosition(firstVisibleItem); + final int sectionPos = mSectionIndexer.getPositionForSection(section); + final int nextSectionPos = mSectionIndexer.getPositionForSection(section + 1); + final int sectionCount = mSections.length; + final int positionsInSection = nextSectionPos - sectionPos; + final View child = mList.getChildAt(0); + final float incrementalPos = child == null ? 0 : firstVisibleItem + + (float) (mList.getPaddingTop() - child.getTop()) / child.getHeight(); + final float posWithinSection = (incrementalPos - sectionPos) / positionsInSection; + int result = (int) ((section + posWithinSection) / sectionCount * trackHeight); + if (firstVisibleItem > 0 && firstVisibleItem + visibleItemCount == totalItemCount) { + final View lastChild = mList.getChildAt(visibleItemCount - 1); + final float lastItemVisible = (float) (mList.getHeight() - mList.getPaddingBottom() + - lastChild.getTop()) / lastChild.getHeight(); + result += (trackHeight - result) * lastItemVisible; + } + return result; + } + + public int getWidth() { + return mThumbW; + } + + private void init(Context context) { + TypedArray ta = context.getTheme().obtainStyledAttributes(R.styleable.FastScroll); + useThumbDrawable(context, ta.getDrawable(R.styleable.FastScroll_fastScrollThumbDrawable)); + mTrackDrawable = ta.getDrawable(R.styleable.FastScroll_fastScrollTrackDrawable); + mOverlayDrawableLeft = ta + .getDrawable(R.styleable.FastScroll_fastScrollPreviewBackgroundLeft); + mOverlayDrawableRight = ta + .getDrawable(R.styleable.FastScroll_fastScrollPreviewBackgroundRight); + mOverlayPosition = ta.getInt(R.styleable.FastScroll_fastScrollOverlayPosition, + OVERLAY_FLOATING); + mScrollCompleted = true; + getSectionsFromIndexer(); + mOverlaySize = context.getResources().getDimensionPixelSize( + R.dimen.fastscroll_overlay_size); + mOverlayPos = new RectF(); + mScrollFade = new ScrollFade(); + mPaint = new Paint(); + mPaint.setAntiAlias(true); + mPaint.setTextAlign(Paint.Align.CENTER); + mPaint.setTextSize(mOverlaySize / 2); + ColorStateList textColor = ta.getColorStateList(R.styleable.FastScroll_fastScrollTextColor); + int textColorNormal = textColor.getDefaultColor(); + mPaint.setColor(textColorNormal); + mPaint.setStyle(Paint.Style.FILL_AND_STROKE); + if (mList.getWidth() > 0 && mList.getHeight() > 0) { + onSizeChanged(mList.getWidth(), mList.getHeight(), 0, 0); + } + mState = STATE_NONE; + refreshDrawableState(); + ta.recycle(); + mScaledTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); + mMatchDragPosition = context.getApplicationInfo().targetSdkVersion >= + android.os.Build.VERSION_CODES.HONEYCOMB; + setScrollbarPosition(mList.getVerticalScrollbarPosition()); + } + + public boolean isAlwaysShowEnabled() { + return mAlwaysShow; + } + + boolean isPointInside(float x, float y) { + boolean inTrack = false; + switch (mPosition) { + default: + case View.SCROLLBAR_POSITION_DEFAULT: + case View.SCROLLBAR_POSITION_RIGHT: + inTrack = x > mList.getWidth() - mThumbW; + break; + case View.SCROLLBAR_POSITION_LEFT: + inTrack = x < mThumbW; + break; + } + return inTrack && (mTrackDrawable != null || y >= mThumbY && y <= mThumbY + mThumbH); + } + + boolean isVisible() { + return !(mState == STATE_NONE); + } + + boolean onInterceptTouchEvent(MotionEvent ev) { + switch (MotionEventCompat.getActionMasked(ev)) { + case MotionEvent.ACTION_DOWN: + if (mState > STATE_NONE && isPointInside(ev.getX(), ev.getY())) { + if (!mList.isInScrollingContainer()) { + beginDrag(); + return true; + } + mInitialTouchY = ev.getY(); + startPendingDrag(); + } + break; + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: + cancelPendingDrag(); + break; + } + return false; + } + + void onItemCountChanged(int oldCount, int newCount) { + if (mAlwaysShow) { + mLongList = true; + } + } + + void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, + int totalItemCount) { + if (mItemCount != totalItemCount && visibleItemCount > 0) { + mItemCount = totalItemCount; + mLongList = mItemCount / visibleItemCount >= MIN_PAGES; + } + if (mAlwaysShow) { + mLongList = true; + } + if (!mLongList) { + if (mState != STATE_NONE) { + setState(STATE_NONE); + } + return; + } + if (totalItemCount - visibleItemCount > 0 && mState != STATE_DRAGGING) { + mThumbY = getThumbPositionForListPosition(firstVisibleItem, visibleItemCount, + totalItemCount); + if (mChangedBounds) { + resetThumbPos(); + mChangedBounds = false; + } + } + mScrollCompleted = true; + if (firstVisibleItem == mVisibleItem) { + return; + } + mVisibleItem = firstVisibleItem; + if (mState != STATE_DRAGGING) { + setState(STATE_VISIBLE); + if (!mAlwaysShow) { + mHandler.postDelayed(mScrollFade, FADE_TIMEOUT); + } + } + } + + public void onSectionsChanged() { + mListAdapter = null; + } + + void onSizeChanged(int w, int h, int oldw, int oldh) { + if (mThumbDrawable != null) { + switch (mPosition) { + default: + case View.SCROLLBAR_POSITION_DEFAULT: + case View.SCROLLBAR_POSITION_RIGHT: + mThumbDrawable.setBounds(w - mThumbW, 0, w, mThumbH); + break; + case View.SCROLLBAR_POSITION_LEFT: + mThumbDrawable.setBounds(0, 0, mThumbW, mThumbH); + break; + } + } + if (mOverlayPosition == OVERLAY_FLOATING) { + final RectF pos = mOverlayPos; + pos.left = (w - mOverlaySize) / 2; + pos.right = pos.left + mOverlaySize; + pos.top = h / 10; + pos.bottom = pos.top + mOverlaySize; + if (mOverlayDrawable != null) { + mOverlayDrawable.setBounds((int) pos.left, (int) pos.top, + (int) pos.right, (int) pos.bottom); + } + } + } + + boolean onTouchEvent(MotionEvent me) { + if (mState == STATE_NONE) { + return false; + } + final int action = me.getAction(); + if (action == MotionEvent.ACTION_DOWN) { + if (isPointInside(me.getX(), me.getY())) { + if (!mList.isInScrollingContainer()) { + beginDrag(); + return true; + } + mInitialTouchY = me.getY(); + startPendingDrag(); + } + } else if (action == MotionEvent.ACTION_UP) { + if (mPendingDrag) { + beginDrag(); + final int viewHeight = mList.getHeight(); + int newThumbY = (int) me.getY() - mThumbH + 10; + if (newThumbY < 0) { + newThumbY = 0; + } else if (newThumbY + mThumbH > viewHeight) { + newThumbY = viewHeight - mThumbH; + } + mThumbY = newThumbY; + scrollTo((float) mThumbY / (viewHeight - mThumbH)); + cancelPendingDrag(); + } + if (mState == STATE_DRAGGING) { + if (mList != null) { + mList.requestDisallowInterceptTouchEvent(false); + mList.reportScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE); + } + setState(STATE_VISIBLE); + final Handler handler = mHandler; + handler.removeCallbacks(mScrollFade); + if (!mAlwaysShow) { + handler.postDelayed(mScrollFade, 1000); + } + mList.invalidate(); + return true; + } + } else if (action == MotionEvent.ACTION_MOVE) { + if (mPendingDrag) { + final float y = me.getY(); + if (Math.abs(y - mInitialTouchY) > mScaledTouchSlop) { + setState(STATE_DRAGGING); + if (mListAdapter == null && mList != null) { + getSectionsFromIndexer(); + } + if (mList != null) { + mList.requestDisallowInterceptTouchEvent(true); + mList.reportScrollStateChange(OnScrollListener.SCROLL_STATE_TOUCH_SCROLL); + } + cancelFling(); + cancelPendingDrag(); + } + } + if (mState == STATE_DRAGGING) { + final int viewHeight = mList.getHeight(); + int newThumbY = (int) me.getY() - mThumbH + 10; + if (newThumbY < 0) { + newThumbY = 0; + } else if (newThumbY + mThumbH > viewHeight) { + newThumbY = viewHeight - mThumbH; + } + if (Math.abs(mThumbY - newThumbY) < 2) { + return true; + } + mThumbY = newThumbY; + if (mScrollCompleted) { + scrollTo((float) mThumbY / (viewHeight - mThumbH)); + } + return true; + } + } else if (action == MotionEvent.ACTION_CANCEL) { + cancelPendingDrag(); + } + return false; + } + + private void refreshDrawableState() { + int[] state = mState == STATE_DRAGGING ? PRESSED_STATES : DEFAULT_STATES; + if (mThumbDrawable != null && mThumbDrawable.isStateful()) { + mThumbDrawable.setState(state); + } + if (mTrackDrawable != null && mTrackDrawable.isStateful()) { + mTrackDrawable.setState(state); + } + } + + private void resetThumbPos() { + final int viewWidth = mList.getWidth(); + switch (mPosition) { + case View.SCROLLBAR_POSITION_DEFAULT: + case View.SCROLLBAR_POSITION_RIGHT: + mThumbDrawable.setBounds(viewWidth - mThumbW, 0, viewWidth, mThumbH); + break; + case View.SCROLLBAR_POSITION_LEFT: + mThumbDrawable.setBounds(0, 0, mThumbW, mThumbH); + break; + } + mThumbDrawable.setAlpha(ScrollFade.ALPHA_MAX); + } + + void scrollTo(float position) { + int count = mList.getCount(); + mScrollCompleted = false; + float fThreshold = 1.0f / count / 8; + final Object[] sections = mSections; + int sectionIndex; + if (sections != null && sections.length > 1) { + final int nSections = sections.length; + int section = (int) (position * nSections); + if (section >= nSections) { + section = nSections - 1; + } + int exactSection = section; + sectionIndex = section; + int index = mSectionIndexer.getPositionForSection(section); + int nextIndex = count; + int prevIndex = index; + int prevSection = section; + int nextSection = section + 1; + if (section < nSections - 1) { + nextIndex = mSectionIndexer.getPositionForSection(section + 1); + } + if (nextIndex == index) { + while (section > 0) { + section--; + prevIndex = mSectionIndexer.getPositionForSection(section); + if (prevIndex != index) { + prevSection = section; + sectionIndex = section; + break; + } else if (section == 0) { + sectionIndex = 0; + break; + } + } + } + int nextNextSection = nextSection + 1; + while (nextNextSection < nSections && + mSectionIndexer.getPositionForSection(nextNextSection) == nextIndex) { + nextNextSection++; + nextSection++; + } + float fPrev = (float) prevSection / nSections; + float fNext = (float) nextSection / nSections; + if (prevSection == exactSection && position - fPrev < fThreshold) { + index = prevIndex; + } else { + index = prevIndex + (int) ((nextIndex - prevIndex) * (position - fPrev) + / (fNext - fPrev)); + } + if (index > count - 1) { + index = count - 1; + } + if (mList instanceof ExpandableListView) { + ExpandableListView expList = (ExpandableListView) mList; + expList.setSelectionFromTop(expList.getFlatListPosition( + ExpandableListView.getPackedPositionForGroup(index + mListOffset)), 0); + } else if (mList instanceof ListView) { + mList.setSelectionFromTop(index + mListOffset, 0); + } else { + mList.setSelection(index + mListOffset); + } + } else { + int index = (int) (position * count); + if (index > count - 1) { + index = count - 1; + } + if (mList instanceof ExpandableListView) { + ExpandableListView expList = (ExpandableListView) mList; + expList.setSelectionFromTop(expList.getFlatListPosition( + ExpandableListView.getPackedPositionForGroup(index + mListOffset)), 0); + } else if (mList instanceof ListView) { + mList.setSelectionFromTop(index + mListOffset, 0); + } else { + mList.setSelection(index + mListOffset); + } + sectionIndex = -1; + } + if (sectionIndex >= 0) { + String text = mSectionText = sections[sectionIndex].toString(); + mDrawOverlay = (text.length() != 1 || text.charAt(0) != ' ') && + sectionIndex < sections.length; + } else { + mDrawOverlay = false; + } + } + + public void setAlwaysShow(boolean alwaysShow) { + mAlwaysShow = alwaysShow; + if (alwaysShow) { + mHandler.removeCallbacks(mScrollFade); + setState(STATE_VISIBLE); + } else if (mState == STATE_VISIBLE) { + mHandler.postDelayed(mScrollFade, FADE_TIMEOUT); + } + } + + public void setScrollbarPosition(int position) { + mPosition = position; + switch (position) { + default: + case View.SCROLLBAR_POSITION_DEFAULT: + case View.SCROLLBAR_POSITION_RIGHT: + mOverlayDrawable = mOverlayDrawableRight; + break; + case View.SCROLLBAR_POSITION_LEFT: + mOverlayDrawable = mOverlayDrawableLeft; + break; + } + } + + public void setState(int state) { + switch (state) { + case STATE_NONE: + mHandler.removeCallbacks(mScrollFade); + mList.invalidate(); + break; + case STATE_VISIBLE: + if (mState != STATE_VISIBLE) { + resetThumbPos(); + } + case STATE_DRAGGING: + mHandler.removeCallbacks(mScrollFade); + break; + case STATE_EXIT: + int viewWidth = mList.getWidth(); + mList.invalidate(viewWidth - mThumbW, mThumbY, viewWidth, mThumbY + mThumbH); + break; + } + mState = state; + refreshDrawableState(); + } + + void startPendingDrag() { + mPendingDrag = true; + mList.postDelayed(mDeferStartDrag, PENDING_DRAG_DELAY); + } + + void stop() { + setState(STATE_NONE); + } + + private void useThumbDrawable(Context context, Drawable drawable) { + mThumbDrawable = drawable; + if (drawable instanceof NinePatchDrawable) { + mThumbW = context.getResources().getDimensionPixelSize( + R.dimen.fastscroll_thumb_width); + mThumbH = context.getResources().getDimensionPixelSize( + R.dimen.fastscroll_thumb_height); + } else { + mThumbW = drawable.getIntrinsicWidth(); + mThumbH = drawable.getIntrinsicHeight(); + } + mChangedBounds = true; + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/FrameLayout.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/FrameLayout.java new file mode 100644 index 0000000000..28c271e01a --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/FrameLayout.java @@ -0,0 +1,19 @@ + +package org.holoeverywhere.widget; + +import android.content.Context; +import android.util.AttributeSet; + +public class FrameLayout extends android.widget.FrameLayout { + public FrameLayout(Context context) { + super(context); + } + + public FrameLayout(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public FrameLayout(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/GridView.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/GridView.java new file mode 100644 index 0000000000..e8cf4b553d --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/GridView.java @@ -0,0 +1,688 @@ + +package org.holoeverywhere.widget; + +import java.util.ArrayList; +import java.util.List; + +import org.holoeverywhere.HoloEverywhere; +import org.holoeverywhere.IHoloActivity.OnWindowFocusChangeListener; +import org.holoeverywhere.app.Activity; +import org.holoeverywhere.widget.HeaderViewListAdapter.ViewInfo; +import org.holoeverywhere.widget.ListAdapterWrapper.ListAdapterCallback; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Rect; +import android.os.Build.VERSION; +import android.os.Build.VERSION_CODES; +import android.support.v4.util.LongSparseArray; +import android.util.AttributeSet; +import android.util.SparseBooleanArray; +import android.view.ContextMenu.ContextMenuInfo; +import android.view.HapticFeedbackConstants; +import android.view.KeyEvent; +import android.view.View; +import android.view.ViewDebug.ExportedProperty; +import android.view.ViewGroup; +import android.view.ViewParent; +import android.widget.AbsListView; +import android.widget.AdapterView; +import android.widget.Checkable; +import android.widget.ListAdapter; + +import com.actionbarsherlock.internal.view.menu.ContextMenuBuilder.ContextMenuInfoGetter; +import com.actionbarsherlock.view.ActionMode; +import com.actionbarsherlock.view.Menu; +import com.actionbarsherlock.view.MenuItem; + +public class GridView extends android.widget.GridView implements OnWindowFocusChangeListener, + ContextMenuInfoGetter, ListAdapterCallback { + private final class MultiChoiceModeWrapper implements + org.holoeverywhere.widget.ListView.MultiChoiceModeListener { + private org.holoeverywhere.widget.ListView.MultiChoiceModeListener mWrapped; + + @Override + public boolean onActionItemClicked(ActionMode mode, MenuItem item) { + return mWrapped.onActionItemClicked(mode, item); + } + + @Override + public boolean onCreateActionMode(ActionMode mode, Menu menu) { + if (mWrapped.onCreateActionMode(mode, menu)) { + setLongClickable(false); + return true; + } + return false; + } + + @Override + public void onDestroyActionMode(ActionMode mode) { + mWrapped.onDestroyActionMode(mode); + mChoiceActionMode = null; + clearChoices(); + invalidateViews(); + setLongClickable(true); + } + + @Override + public void onItemCheckedStateChanged(ActionMode mode, + int position, long id, boolean checked) { + mWrapped.onItemCheckedStateChanged(mode, position, id, checked); + if (getCheckedItemCount() == 0) { + mode.finish(); + } + } + + @Override + public boolean onPrepareActionMode(ActionMode mode, Menu menu) { + return mWrapped.onPrepareActionMode(mode, menu); + } + + public void setWrapped(org.holoeverywhere.widget.ListView.MultiChoiceModeListener wrapped) { + mWrapped = wrapped; + } + } + + private final class OnItemLongClickListenerWrapper implements OnItemLongClickListener { + private OnItemLongClickListener wrapped; + + @Override + public boolean onItemLongClick(AdapterView adapterView, View view, int position, long id) { + return performItemLongClick(view, position, id); + } + + public void setWrapped(OnItemLongClickListener wrapped) { + this.wrapped = wrapped; + if (wrapped != null) { + setLongClickable(true); + } + } + } + + public static final int CHOICE_MODE_MULTIPLE_MODAL = AbsListView.CHOICE_MODE_MULTIPLE_MODAL; + + private static final boolean USE_ACTIVATED = VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB; + + private Activity mActivity; + private ListAdapterWrapper mAdapter; + private boolean mAdapterHasStableIds; + private LongSparseArray mCheckedIdStates; + private int mCheckedItemCount; + private SparseBooleanArray mCheckStates; + private ActionMode mChoiceActionMode; + private int mChoiceMode; + private ContextMenuInfo mContextMenuInfo; + private boolean mEnableModalBackgroundWrapper; + private boolean mFastScrollEnabled; + private final List mFooterViewInfos = new ArrayList(), + mHeaderViewInfos = new ArrayList(); + private boolean mForceHeaderListAdapter = false; + private boolean mIsAttached; + private int mLastScrollState = OnScrollListener.SCROLL_STATE_IDLE; + private MultiChoiceModeWrapper mMultiChoiceModeCallback; + private final OnItemLongClickListenerWrapper mOnItemLongClickListenerWrapper; + private OnScrollListener mOnScrollListener; + + public GridView(Context context) { + this(context, null); + } + + public GridView(Context context, AttributeSet attrs) { + this(context, attrs, android.R.attr.gridViewStyle); + } + + @SuppressLint("NewApi") + public GridView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + if (context instanceof Activity) { + setActivity((Activity) context); + } + if (HoloEverywhere.DISABLE_OVERSCROLL_EFFECT && VERSION.SDK_INT >= 9) { + setOverScrollMode(OVER_SCROLL_NEVER); + } + + mOnItemLongClickListenerWrapper = new OnItemLongClickListenerWrapper(); + super.setOnItemLongClickListener(mOnItemLongClickListenerWrapper); + setLongClickable(false); + } + + public void addFooterView(View v) { + addFooterView(v, null, true); + } + + public void addFooterView(View v, Object data, boolean isSelectable) { + if (mAdapter != null && !(mAdapter instanceof HeaderViewListAdapter)) { + throw new IllegalStateException( + "Cannot add footer view to list -- setAdapter has already been called."); + } + ViewInfo info = new ViewInfo(); + info.view = v; + info.data = data; + info.isSelectable = isSelectable; + mFooterViewInfos.add(info); + if (mAdapter != null) { + invalidateViews(); + } + } + + public void addHeaderView(View v) { + addHeaderView(v, null, true); + } + + public void addHeaderView(View v, Object data, boolean isSelectable) { + if (mAdapter != null && !(mAdapter instanceof HeaderViewListAdapter)) { + throw new IllegalStateException( + "Cannot add header view to list -- setAdapter has already been called."); + } + ViewInfo info = new ViewInfo(); + info.view = v; + info.data = data; + info.isSelectable = isSelectable; + mHeaderViewInfos.add(info); + if (mAdapter != null) { + invalidateViews(); + } + } + + @Override + public void clearChoices() { + if (mCheckStates != null) { + mCheckStates.clear(); + } + if (mCheckedIdStates != null) { + mCheckedIdStates.clear(); + } + mCheckedItemCount = 0; + } + + protected ContextMenuInfo createContextMenuInfo(View view, int position, + long id) { + return new AdapterContextMenuInfo(view, position, id); + } + + public Activity getActivity() { + return mActivity; + } + + @Override + public int getCheckedItemCount() { + return mCheckedItemCount; + } + + @Override + public long[] getCheckedItemIds() { + if (mChoiceMode == CHOICE_MODE_NONE || mCheckedIdStates == null || mAdapter == null) { + return new long[0]; + } + final LongSparseArray idStates = mCheckedIdStates; + final int count = idStates.size(); + final long[] ids = new long[count]; + for (int i = 0; i < count; i++) { + ids[i] = idStates.keyAt(i); + } + return ids; + } + + @Override + public int getCheckedItemPosition() { + if (mChoiceMode == CHOICE_MODE_SINGLE && mCheckStates != null && mCheckStates.size() == 1) { + return mCheckStates.keyAt(0); + } + return INVALID_POSITION; + } + + @Override + public SparseBooleanArray getCheckedItemPositions() { + if (mChoiceMode != CHOICE_MODE_NONE) { + return mCheckStates; + } + return null; + } + + @Deprecated + public long[] getCheckItemIds() { + return getCheckedItemIds(); + } + + @Override + public int getChoiceMode() { + return mChoiceMode; + } + + @Override + public ContextMenuInfo getContextMenuInfo() { + return mContextMenuInfo; + } + + public int getFooterViewsCount() { + return mFooterViewInfos.size(); + } + + public int getHeaderViewsCount() { + return mHeaderViewInfos.size(); + } + + public boolean isAttached() { + return mIsAttached; + } + + @Override + @ExportedProperty + public boolean isFastScrollEnabled() { + return mFastScrollEnabled; + } + + public boolean isForceHeaderListAdapter() { + return mForceHeaderListAdapter; + } + + public boolean isInScrollingContainer() { + ViewParent p = getParent(); + while (p != null && p instanceof ViewGroup) { + if (((ViewGroup) p).shouldDelayChildPressedState()) { + return true; + } + p = p.getParent(); + } + return false; + } + + @Override + public boolean isItemChecked(int position) { + if (mChoiceMode != CHOICE_MODE_NONE && mCheckStates != null) { + return mCheckStates.get(position); + } + return false; + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + mIsAttached = true; + } + + @Override + public void onChanged() { + + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + mIsAttached = false; + } + + @Override + protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) { + super.onFocusChanged(gainFocus, direction, previouslyFocusedRect); + if (gainFocus && getSelectedItemPosition() < 0 && !isInTouchMode()) { + if (!mIsAttached && mAdapter != null) { + invalidateViews(); + } + } + } + + @Override + public void onInvalidated() { + + } + + @Override + public boolean onKeyUp(int keyCode, KeyEvent event) { + switch (keyCode) { + case KeyEvent.KEYCODE_DPAD_CENTER: + case KeyEvent.KEYCODE_ENTER: + if (!isEnabled()) { + return true; + } + if (isClickable() && isPressed() && + getSelectedItemPosition() >= 0 && mAdapter != null && + getSelectedItemPosition() < mAdapter.getCount()) { + final View view = getChildAt(getSelectedItemPosition() + - getFirstVisiblePosition()); + if (view != null) { + performItemClick(view, getSelectedItemPosition(), getSelectedItemId()); + view.setPressed(false); + } + setPressed(false); + return true; + } + break; + } + return super.onKeyUp(keyCode, event); + } + + @Override + public View onPrepareView(View view, int position) { + if (mCheckStates != null) { + setStateOnView(view, mCheckStates.get(position)); + } else { + setStateOnView(view, false); + } + return view; + } + + @Override + public void onWindowFocusChanged(boolean hasWindowFocus) { + super.onWindowFocusChanged(hasWindowFocus); + if (hasWindowFocus) { + invalidate(); + invalidateViews(); + } + } + + @Override + public boolean performItemClick(View view, int position, long id) { + boolean handled = false; + boolean dispatchItemClick = true; + if (mChoiceMode != CHOICE_MODE_NONE) { + handled = true; + boolean checkedStateChanged = false; + if (mChoiceMode == CHOICE_MODE_MULTIPLE || + mChoiceMode == CHOICE_MODE_MULTIPLE_MODAL && mChoiceActionMode != null) { + boolean newValue = !mCheckStates.get(position, false); + mCheckStates.put(position, newValue); + if (mCheckedIdStates != null && mAdapter.hasStableIds()) { + if (newValue) { + mCheckedIdStates.put(mAdapter.getItemId(position), position); + } else { + mCheckedIdStates.delete(mAdapter.getItemId(position)); + } + } + if (newValue) { + mCheckedItemCount++; + } else { + mCheckedItemCount--; + } + if (mChoiceActionMode != null) { + mMultiChoiceModeCallback.onItemCheckedStateChanged(mChoiceActionMode, + position, id, newValue); + dispatchItemClick = false; + } + checkedStateChanged = true; + } else if (mChoiceMode == CHOICE_MODE_SINGLE) { + boolean newValue = !mCheckStates.get(position, false); + if (newValue) { + mCheckStates.clear(); + mCheckStates.put(position, true); + if (mCheckedIdStates != null && mAdapter.hasStableIds()) { + mCheckedIdStates.clear(); + mCheckedIdStates.put(mAdapter.getItemId(position), position); + } + mCheckedItemCount = 1; + } else if (mCheckStates.size() == 0 || !mCheckStates.valueAt(0)) { + mCheckedItemCount = 0; + } + checkedStateChanged = true; + } + if (checkedStateChanged) { + updateOnScreenCheckedViews(); + } + } + if (dispatchItemClick) { + handled |= super.performItemClick(view, position, id); + } + return handled; + } + + public boolean performItemLongClick(final View child, + final int longPressPosition, final long longPressId) { + if (mChoiceMode == CHOICE_MODE_MULTIPLE_MODAL) { + if (mChoiceActionMode == null && + (mChoiceActionMode = startActionMode(mMultiChoiceModeCallback)) != null) { + setItemChecked(longPressPosition, true); + performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); + } + return true; + } + boolean handled = false; + if (mOnItemLongClickListenerWrapper.wrapped != null) { + handled = mOnItemLongClickListenerWrapper.wrapped.onItemLongClick(GridView.this, child, + longPressPosition, longPressId); + } + if (!handled) { + mContextMenuInfo = createContextMenuInfo(child, longPressPosition, longPressId); + handled = super.showContextMenuForChild(GridView.this); + } + if (handled) { + performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); + } + return handled; + } + + public boolean removeFooterView(View v) { + if (mFooterViewInfos.size() > 0) { + boolean result = false; + if (mAdapter != null && ((HeaderViewListAdapter) mAdapter).removeFooter(v)) { + invalidateViews(); + result = true; + } + removeViewInfo(v, mFooterViewInfos); + return result; + } + return false; + } + + public boolean removeHeaderView(View v) { + if (mHeaderViewInfos.size() > 0) { + boolean result = false; + if (mAdapter != null && ((HeaderViewListAdapter) mAdapter).removeHeader(v)) { + invalidateViews(); + result = true; + } + removeViewInfo(v, mHeaderViewInfos); + return result; + } + return false; + } + + private void removeViewInfo(View v, List where) { + int len = where.size(); + for (int i = 0; i < len; ++i) { + ViewInfo info = where.get(i); + if (info.view == v) { + where.remove(i); + break; + } + } + } + + protected void reportScrollStateChange(int newState) { + if (newState != mLastScrollState) { + if (mOnScrollListener != null) { + mLastScrollState = newState; + mOnScrollListener.onScrollStateChanged(this, newState); + } + } + } + + public final void setActivity(Activity activity) { + mActivity = activity; + if (mActivity != null) { + mActivity.addOnWindowFocusChangeListener(this); + } + } + + @Override + public void setAdapter(ListAdapter adapter) { + if (adapter == null) { + mAdapter = null; + } else if (mForceHeaderListAdapter || mHeaderViewInfos.size() > 0 + || mFooterViewInfos.size() > 0) { + mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, adapter, + this); + } else { + mAdapter = new ListAdapterWrapper(adapter, this); + } + if (mAdapter != null) { + mAdapterHasStableIds = mAdapter.hasStableIds(); + if (mChoiceMode != CHOICE_MODE_NONE && mAdapterHasStableIds && + mCheckedIdStates == null) { + mCheckedIdStates = new LongSparseArray(); + } + } + if (mCheckStates != null) { + mCheckStates.clear(); + } + if (mCheckedIdStates != null) { + mCheckedIdStates.clear(); + } + super.setAdapter(mAdapter); + } + + @Override + public void setChoiceMode(int choiceMode) { + mChoiceMode = choiceMode; + if (mChoiceActionMode != null) { + mChoiceActionMode.finish(); + mChoiceActionMode = null; + } + if (mChoiceMode != CHOICE_MODE_NONE) { + if (mCheckStates == null) { + mCheckStates = new SparseBooleanArray(); + } + if (mCheckedIdStates == null && mAdapter != null && mAdapter.hasStableIds()) { + mCheckedIdStates = new LongSparseArray(); + } + if (mChoiceMode == CHOICE_MODE_MULTIPLE_MODAL) { + clearChoices(); + setLongClickable(true); + setEnableModalBackgroundWrapper(true); + } + } + } + + public void setEnableModalBackgroundWrapper(boolean enableModalBackgroundWrapper) { + if (enableModalBackgroundWrapper == mEnableModalBackgroundWrapper) { + return; + } + mEnableModalBackgroundWrapper = enableModalBackgroundWrapper; + if (mAdapter != null) { + mAdapter.notifyDataSetChanged(); + } + } + + public void setForceHeaderListAdapter(boolean forceHeaderListAdapter) { + mForceHeaderListAdapter = forceHeaderListAdapter; + } + + @Override + public void setItemChecked(int position, boolean value) { + if (mChoiceMode == CHOICE_MODE_NONE) { + return; + } + if (value && mChoiceMode == CHOICE_MODE_MULTIPLE_MODAL && mChoiceActionMode == null) { + mChoiceActionMode = startActionMode(mMultiChoiceModeCallback); + } + if (mChoiceMode == CHOICE_MODE_MULTIPLE || mChoiceMode == CHOICE_MODE_MULTIPLE_MODAL) { + boolean oldValue = mCheckStates.get(position); + mCheckStates.put(position, value); + if (mCheckedIdStates != null && mAdapter.hasStableIds()) { + if (value) { + mCheckedIdStates.put(mAdapter.getItemId(position), position); + } else { + mCheckedIdStates.delete(mAdapter.getItemId(position)); + } + } + if (oldValue != value) { + if (value) { + mCheckedItemCount++; + } else { + mCheckedItemCount--; + } + } + if (mChoiceActionMode != null) { + final long id = mAdapter.getItemId(position); + mMultiChoiceModeCallback.onItemCheckedStateChanged(mChoiceActionMode, + position, id, value); + } + } else { + boolean updateIds = mCheckedIdStates != null && mAdapter.hasStableIds(); + if (value || isItemChecked(position)) { + mCheckStates.clear(); + if (updateIds) { + mCheckedIdStates.clear(); + } + } + if (value) { + mCheckStates.put(position, true); + if (updateIds) { + mCheckedIdStates.put(mAdapter.getItemId(position), position); + } + mCheckedItemCount = 1; + } else if (mCheckStates.size() == 0 || !mCheckStates.valueAt(0)) { + mCheckedItemCount = 0; + } + } + updateOnScreenCheckedViews(); + invalidateViews(); + } + + public void setMultiChoiceModeListener( + org.holoeverywhere.widget.ListView.MultiChoiceModeListener listener) { + if (mMultiChoiceModeCallback == null) { + mMultiChoiceModeCallback = new MultiChoiceModeWrapper(); + } + mMultiChoiceModeCallback.setWrapped(listener); + } + + @Override + public void setOnItemLongClickListener(OnItemLongClickListener listener) { + mOnItemLongClickListenerWrapper.setWrapped(listener); + } + + @Override + public void setOnScrollListener(OnScrollListener l) { + super.setOnScrollListener(mOnScrollListener = l); + } + + protected final void setStateOnView(View child, boolean value) { + if (child instanceof Checkable) { + ((Checkable) child).setChecked(value); + } else if (USE_ACTIVATED) { + child.setActivated(value); + } + } + + @Override + public boolean showContextMenuForChild(View originalView) { + final int longPressPosition = getPositionForView(originalView); + if (longPressPosition >= 0) { + final long longPressId = mAdapter.getItemId(longPressPosition); + boolean handled = false; + if (mOnItemLongClickListenerWrapper.wrapped != null) { + handled = mOnItemLongClickListenerWrapper.wrapped.onItemLongClick(GridView.this, + originalView, longPressPosition, longPressId); + } + if (!handled) { + mContextMenuInfo = createContextMenuInfo(getChildAt(longPressPosition + - getFirstVisiblePosition()), longPressPosition, longPressId); + handled = super.showContextMenuForChild(originalView); + } + return handled; + } + return false; + } + + public ActionMode startActionMode(ActionMode.Callback callback) { + if (mActivity != null) { + return mActivity.startActionMode(callback); + } + throw new RuntimeException("HoloEverywhere.ListView (" + this + + ") don't have reference on Activity"); + } + + private void updateOnScreenCheckedViews() { + if (mCheckStates == null) { + return; + } + final int firstPos = getFirstVisiblePosition(); + final int count = getChildCount(); + for (int i = 0; i < count; i++) { + final View child = getChildAt(i); + final int position = firstPos + i; + final boolean value = mCheckStates.get(position); + setStateOnView(child, value); + } + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/HeaderViewListAdapter.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/HeaderViewListAdapter.java new file mode 100644 index 0000000000..b633c23715 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/HeaderViewListAdapter.java @@ -0,0 +1,180 @@ + +package org.holoeverywhere.widget; + +import java.util.ArrayList; +import java.util.List; + +import android.view.View; +import android.view.ViewGroup; +import android.widget.Filter; +import android.widget.Filterable; +import android.widget.ListAdapter; + +public class HeaderViewListAdapter extends ListAdapterWrapper implements Filterable { + public static final class ViewInfo { + public Object data; + public boolean isSelectable; + public View view; + } + + private static final List EMPTY_INFO_LIST = new ArrayList(); + boolean mAreAllFixedViewsSelectable; + private final List mFooterViewInfos; + private final List mHeaderViewInfos; + private final boolean mIsFilterable; + + public HeaderViewListAdapter(List headerViewInfos, + List footerViewInfos, ListAdapter adapter, ListAdapterCallback listener) { + super(adapter, listener); + mIsFilterable = adapter instanceof Filterable; + if (headerViewInfos == null) { + mHeaderViewInfos = EMPTY_INFO_LIST; + } else { + mHeaderViewInfos = headerViewInfos; + } + if (footerViewInfos == null) { + mFooterViewInfos = EMPTY_INFO_LIST; + } else { + mFooterViewInfos = footerViewInfos; + } + mAreAllFixedViewsSelectable = + areAllListInfosSelectable(mHeaderViewInfos) + && areAllListInfosSelectable(mFooterViewInfos); + } + + @Override + public boolean areAllItemsEnabled() { + return mAreAllFixedViewsSelectable && getWrappedAdapter().areAllItemsEnabled(); + } + + private boolean areAllListInfosSelectable(List infos) { + if (infos != null) { + for (ViewInfo info : infos) { + if (!info.isSelectable) { + return false; + } + } + } + return true; + } + + @Override + public int getCount() { + return getFootersCount() + getHeadersCount() + getWrappedAdapter().getCount(); + } + + @Override + public Filter getFilter() { + if (mIsFilterable) { + return ((Filterable) getWrappedAdapter()).getFilter(); + } + return null; + } + + public int getFootersCount() { + return mFooterViewInfos.size(); + } + + public int getHeadersCount() { + return mHeaderViewInfos.size(); + } + + @Override + public Object getItem(int position) { + int numHeaders = getHeadersCount(); + if (position < numHeaders) { + return mHeaderViewInfos.get(position).data; + } + final int adjPosition = position - numHeaders; + int adapterCount = getWrappedAdapter().getCount(); + if (adjPosition < adapterCount) { + return super.getItem(adjPosition); + } + return mFooterViewInfos.get(adjPosition - adapterCount).data; + } + + @Override + public long getItemId(int position) { + int numHeaders = getHeadersCount(); + if (position >= numHeaders) { + int adjPosition = position - numHeaders; + int adapterCount = getWrappedAdapter().getCount(); + if (adjPosition < adapterCount) { + return super.getItemId(adjPosition); + } + } + return AdapterView.INVALID_ROW_ID; + } + + @Override + public int getItemViewType(int position) { + int numHeaders = getHeadersCount(); + if (getWrappedAdapter() != null && position >= numHeaders) { + int adjPosition = position - numHeaders; + int adapterCount = getWrappedAdapter().getCount(); + if (adjPosition < adapterCount) { + return super.getItemViewType(adjPosition); + } + } + return AdapterView.ITEM_VIEW_TYPE_HEADER_OR_FOOTER; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + int numHeaders = getHeadersCount(); + if (position < numHeaders) { + convertView = mHeaderViewInfos.get(position).view; + } else { + final int adjPosition = position - numHeaders; + int adapterCount = getWrappedAdapter().getCount(); + if (adjPosition < adapterCount) { + convertView = getWrappedAdapter().getView(adjPosition, convertView, parent); + } else { + convertView = mFooterViewInfos.get(adjPosition - adapterCount).view; + } + } + return onPrepareView(convertView, position); + } + + @Override + public boolean isEnabled(int position) { + int numHeaders = getHeadersCount(); + if (position < numHeaders) { + return mHeaderViewInfos.get(position).isSelectable; + } + final int adjPosition = position - numHeaders; + int adapterCount = getWrappedAdapter().getCount(); + if (adjPosition < adapterCount) { + return super.isEnabled(adjPosition); + } + return mFooterViewInfos.get(adjPosition - adapterCount).isSelectable; + } + + public boolean removeFooter(View v) { + for (int i = 0; i < mFooterViewInfos.size(); i++) { + ViewInfo info = mFooterViewInfos.get(i); + if (info.view == v) { + mFooterViewInfos.remove(i); + mAreAllFixedViewsSelectable = + areAllListInfosSelectable(mHeaderViewInfos) + && areAllListInfosSelectable(mFooterViewInfos); + return true; + } + } + return false; + } + + public boolean removeHeader(View v) { + for (int i = 0; i < mHeaderViewInfos.size(); i++) { + ViewInfo info = mHeaderViewInfos.get(i); + if (info.view == v) { + mHeaderViewInfos.remove(i); + mAreAllFixedViewsSelectable = + areAllListInfosSelectable(mHeaderViewInfos) + && areAllListInfosSelectable(mFooterViewInfos); + return true; + } + } + return false; + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/HeterogeneousExpandableList.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/HeterogeneousExpandableList.java new file mode 100644 index 0000000000..2589d0144a --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/HeterogeneousExpandableList.java @@ -0,0 +1,12 @@ + +package org.holoeverywhere.widget; + +public interface HeterogeneousExpandableList { + int getChildType(int groupPosition, int childPosition); + + int getChildTypeCount(); + + int getGroupType(int groupPosition); + + int getGroupTypeCount(); +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/LinearLayout.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/LinearLayout.java new file mode 100644 index 0000000000..a288b3a6de --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/LinearLayout.java @@ -0,0 +1,1220 @@ + +package org.holoeverywhere.widget; + +import org.holoeverywhere.R; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.drawable.Drawable; +import android.os.Build.VERSION; +import android.util.AttributeSet; +import android.view.Gravity; +import android.view.View; +import android.view.ViewDebug; +import android.view.ViewGroup; +import android.view.accessibility.AccessibilityEvent; +import android.view.accessibility.AccessibilityNodeInfo; + +public class LinearLayout extends android.widget.LinearLayout { + public static final int HORIZONTAL = 0; + private static final int INDEX_BOTTOM = 2; + private static final int INDEX_CENTER_VERTICAL = 0; + private static final int INDEX_FILL = 3; + private static final int INDEX_TOP = 1; + public static final int LAYOUT_DIRECTION_LTR = 0; + public static final int LAYOUT_DIRECTION_RTL = 1; + public static final int SHOW_DIVIDER_ALL = 7; + public static final int SHOW_DIVIDER_BEGINNING = 1; + public static final int SHOW_DIVIDER_END = 4; + public static final int SHOW_DIVIDER_MIDDLE = 2; + public static final int SHOW_DIVIDER_NONE = 0; + public static final int VERTICAL = 1; + private static final int VERTICAL_GRAVITY_COUNT = 4; + + public static int getAbsoluteGravity(int gravity, int layoutDirection) { + int result = gravity; + if ((result & Gravity.RELATIVE_LAYOUT_DIRECTION) > 0) { + if ((result & Gravity.START) == Gravity.START) { + result &= ~Gravity.START; + if (layoutDirection == LAYOUT_DIRECTION_RTL) { + result |= Gravity.RIGHT; + } else { + result |= Gravity.LEFT; + } + } else if ((result & Gravity.END) == Gravity.END) { + result &= ~Gravity.END; + if (layoutDirection == LAYOUT_DIRECTION_RTL) { + result |= Gravity.LEFT; + } else { + result |= Gravity.RIGHT; + } + } + result &= ~Gravity.RELATIVE_LAYOUT_DIRECTION; + } + return result; + } + + public static int resolveSizeAndState(int size, int measureSpec, int childMeasuredState) { + int result = size; + int specMode = MeasureSpec.getMode(measureSpec); + int specSize = MeasureSpec.getSize(measureSpec); + switch (specMode) { + case MeasureSpec.UNSPECIFIED: + result = size; + break; + case MeasureSpec.AT_MOST: + if (specSize < size) { + result = specSize | MEASURED_STATE_TOO_SMALL; + } else { + result = size; + } + break; + case MeasureSpec.EXACTLY: + result = specSize; + break; + } + return result | childMeasuredState & MEASURED_STATE_MASK; + } + + @ViewDebug.ExportedProperty(category = "layout") + private boolean mBaselineAligned = true; + @ViewDebug.ExportedProperty(category = "layout") + private int mBaselineAlignedChildIndex = -1; + @ViewDebug.ExportedProperty(category = "measurement") + private int mBaselineChildTop = 0; + private Drawable mDivider; + private int mDividerHeight; + private int mDividerPadding; + private int mDividerWidth; + @ViewDebug.ExportedProperty(category = "measurement", flagMapping = { + @ViewDebug.FlagToString(mask = -1, + equals = -1, name = "NONE"), + @ViewDebug.FlagToString(mask = Gravity.NO_GRAVITY, + equals = Gravity.NO_GRAVITY, name = "NONE"), + @ViewDebug.FlagToString(mask = Gravity.TOP, + equals = Gravity.TOP, name = "TOP"), + @ViewDebug.FlagToString(mask = Gravity.BOTTOM, + equals = Gravity.BOTTOM, name = "BOTTOM"), + @ViewDebug.FlagToString(mask = Gravity.LEFT, + equals = Gravity.LEFT, name = "LEFT"), + @ViewDebug.FlagToString(mask = Gravity.RIGHT, + equals = Gravity.RIGHT, name = "RIGHT"), + @ViewDebug.FlagToString(mask = Gravity.START, + equals = Gravity.START, name = "START"), + @ViewDebug.FlagToString(mask = Gravity.END, + equals = Gravity.END, name = "END"), + @ViewDebug.FlagToString(mask = Gravity.CENTER_VERTICAL, + equals = Gravity.CENTER_VERTICAL, name = "CENTER_VERTICAL"), + @ViewDebug.FlagToString(mask = Gravity.FILL_VERTICAL, + equals = Gravity.FILL_VERTICAL, name = "FILL_VERTICAL"), + @ViewDebug.FlagToString(mask = Gravity.CENTER_HORIZONTAL, + equals = Gravity.CENTER_HORIZONTAL, name = "CENTER_HORIZONTAL"), + @ViewDebug.FlagToString(mask = Gravity.FILL_HORIZONTAL, + equals = Gravity.FILL_HORIZONTAL, name = "FILL_HORIZONTAL"), + @ViewDebug.FlagToString(mask = Gravity.CENTER, + equals = Gravity.CENTER, name = "CENTER"), + @ViewDebug.FlagToString(mask = Gravity.FILL, + equals = Gravity.FILL, name = "FILL"), + @ViewDebug.FlagToString(mask = Gravity.RELATIVE_LAYOUT_DIRECTION, + equals = Gravity.RELATIVE_LAYOUT_DIRECTION, name = "RELATIVE") + }) + private int mGravity = Gravity.START | Gravity.TOP; + private int[] mMaxAscent; + private int[] mMaxDescent; + @ViewDebug.ExportedProperty(category = "measurement") + private int mOrientation; + private int mShowDividers; + @ViewDebug.ExportedProperty(category = "measurement") + private int mTotalLength; + @ViewDebug.ExportedProperty(category = "layout") + private boolean mUseLargestChild; + + @ViewDebug.ExportedProperty(category = "layout") + private float mWeightSum; + + public LinearLayout(Context context) { + this(context, null); + } + + public LinearLayout(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public LinearLayout(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs); + TypedArray a = context.obtainStyledAttributes(attrs, + R.styleable.LinearLayout, defStyle, 0); + int index = a.getInt(R.styleable.LinearLayout_android_orientation, -1); + if (index >= 0) { + setOrientation(index); + } + index = a.getInt(R.styleable.LinearLayout_android_gravity, -1); + if (index >= 0) { + setGravity(index); + } + boolean baselineAligned = a.getBoolean(R.styleable.LinearLayout_android_baselineAligned, + true); + if (!baselineAligned) { + setBaselineAligned(baselineAligned); + } + mWeightSum = a.getFloat(R.styleable.LinearLayout_android_weightSum, -1.0f); + mBaselineAlignedChildIndex = a.getInt( + R.styleable.LinearLayout_android_baselineAlignedChildIndex, -1); + mUseLargestChild = a.getBoolean(R.styleable.LinearLayout_android_measureWithLargestChild, + false); + setDividerDrawable(a.getDrawable(R.styleable.LinearLayout_android_divider)); + + if (a.hasValue(R.styleable.LinearLayout_showDividers)) { + mShowDividers = a.getInt(R.styleable.LinearLayout_showDividers, SHOW_DIVIDER_NONE); + } else { + mShowDividers = a.getInt(R.styleable.LinearLayout_android_showDividers, + SHOW_DIVIDER_NONE); + } + + if (a.hasValue(R.styleable.LinearLayout_dividerPadding)) { + mDividerPadding = a.getDimensionPixelSize(R.styleable.LinearLayout_dividerPadding, 0); + } else { + mDividerPadding = a.getDimensionPixelSize( + R.styleable.LinearLayout_android_dividerPadding, 0); + } + + a.recycle(); + } + + @Override + protected boolean checkLayoutParams(ViewGroup.LayoutParams p) { + return p instanceof LinearLayout.LayoutParams; + } + + void drawDividersHorizontal(Canvas canvas) { + final int count = getVirtualChildCount(); + final boolean isLayoutRtl = isLayoutRtl(); + for (int i = 0; i < count; i++) { + final View child = getVirtualChildAt(i); + if (child != null && child.getVisibility() != GONE) { + if (hasDividerBeforeChildAt(i)) { + final LayoutParams lp = (LayoutParams) child.getLayoutParams(); + final int position; + if (isLayoutRtl) { + position = child.getRight() + lp.rightMargin; + } else { + position = child.getLeft() - lp.leftMargin - mDividerWidth; + } + drawVerticalDivider(canvas, position); + } + } + } + if (hasDividerBeforeChildAt(count)) { + final View child = getVirtualChildAt(count - 1); + int position; + if (child == null) { + if (isLayoutRtl) { + position = getPaddingLeft(); + } else { + position = getWidth() - getPaddingRight() - mDividerWidth; + } + } else { + final LayoutParams lp = (LayoutParams) child.getLayoutParams(); + if (isLayoutRtl) { + position = child.getLeft() - lp.leftMargin - mDividerWidth; + } else { + position = child.getRight() + lp.rightMargin; + } + } + drawVerticalDivider(canvas, position); + } + } + + void drawDividersVertical(Canvas canvas) { + final int count = getVirtualChildCount(); + for (int i = 0; i < count; i++) { + final View child = getVirtualChildAt(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 = getVirtualChildAt(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 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); + } + + private void forceUniformHeight(int count, int widthMeasureSpec) { + int uniformMeasureSpec = MeasureSpec.makeMeasureSpec(getMeasuredHeight(), + MeasureSpec.EXACTLY); + for (int i = 0; i < count; ++i) { + final View child = getVirtualChildAt(i); + if (child.getVisibility() != GONE) { + LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) child.getLayoutParams(); + if (lp.height == android.view.ViewGroup.LayoutParams.MATCH_PARENT) { + int oldWidth = lp.width; + lp.width = child.getMeasuredWidth(); + measureChildWithMargins(child, widthMeasureSpec, 0, uniformMeasureSpec, 0); + lp.width = oldWidth; + } + } + } + } + + private void forceUniformWidth(int count, int heightMeasureSpec) { + int uniformMeasureSpec = MeasureSpec.makeMeasureSpec(getMeasuredWidth(), + MeasureSpec.EXACTLY); + for (int i = 0; i < count; ++i) { + final View child = getVirtualChildAt(i); + if (child.getVisibility() != GONE) { + LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) child.getLayoutParams(); + if (lp.width == android.view.ViewGroup.LayoutParams.MATCH_PARENT) { + int oldHeight = lp.height; + lp.height = child.getMeasuredHeight(); + measureChildWithMargins(child, uniformMeasureSpec, 0, heightMeasureSpec, 0); + lp.height = oldHeight; + } + } + } + } + + @Override + protected LayoutParams generateDefaultLayoutParams() { + if (mOrientation == HORIZONTAL) { + return new LayoutParams(android.view.ViewGroup.LayoutParams.WRAP_CONTENT, + android.view.ViewGroup.LayoutParams.WRAP_CONTENT); + } else if (mOrientation == VERTICAL) { + return new LayoutParams(android.view.ViewGroup.LayoutParams.MATCH_PARENT, + android.view.ViewGroup.LayoutParams.WRAP_CONTENT); + } + return null; + } + + @Override + public LayoutParams generateLayoutParams(AttributeSet attrs) { + return new LinearLayout.LayoutParams(getContext(), attrs); + } + + @Override + protected LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) { + return new LayoutParams(p); + } + + @Override + public int getBaseline() { + if (mBaselineAlignedChildIndex < 0) { + return super.getBaseline(); + } + if (getChildCount() <= mBaselineAlignedChildIndex) { + throw new RuntimeException("mBaselineAlignedChildIndex of LinearLayout " + + "set to an index that is out of bounds."); + } + final View child = getChildAt(mBaselineAlignedChildIndex); + final int childBaseline = child.getBaseline(); + if (childBaseline == -1) { + if (mBaselineAlignedChildIndex == 0) { + return -1; + } + throw new RuntimeException("mBaselineAlignedChildIndex of LinearLayout " + + "points to a View that doesn't know how to get its baseline."); + } + int childTop = mBaselineChildTop; + if (mOrientation == VERTICAL) { + final int majorGravity = mGravity & Gravity.VERTICAL_GRAVITY_MASK; + if (majorGravity != Gravity.TOP) { + switch (majorGravity) { + case Gravity.BOTTOM: + childTop = getBottom() - getTop() - getPaddingBottom() - mTotalLength; + break; + case Gravity.CENTER_VERTICAL: + childTop += (getBottom() - getTop() - getPaddingTop() - getPaddingBottom() - + mTotalLength) / 2; + break; + } + } + } + LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) child.getLayoutParams(); + return childTop + lp.topMargin + childBaseline; + } + + @Override + public int getBaselineAlignedChildIndex() { + return mBaselineAlignedChildIndex; + } + + int getChildrenSkipCount(View child, int index) { + return 0; + } + + @Override + public Drawable getDividerDrawable() { + return mDivider; + } + + @Override + public int getDividerPadding() { + return mDividerPadding; + } + + public int getDividerWidth() { + return mDividerWidth; + } + + public int getLayoutDirection() { + return LAYOUT_DIRECTION_LTR; + } + + int getLocationOffset(View child) { + return 0; + } + + int getNextLocationOffset(View child) { + return 0; + } + + @Override + public int getOrientation() { + return mOrientation; + } + + @Override + public int getShowDividers() { + return mShowDividers; + } + + View getVirtualChildAt(int index) { + return getChildAt(index); + } + + int getVirtualChildCount() { + return getChildCount(); + } + + @Override + public float getWeightSum() { + return mWeightSum; + } + + 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; + } + + @Override + public boolean isBaselineAligned() { + return mBaselineAligned; + } + + protected boolean isLayoutRtl() { + return getLayoutDirection() == LAYOUT_DIRECTION_RTL; + } + + @Override + public boolean isMeasureWithLargestChildEnabled() { + return mUseLargestChild; + } + + void layoutHorizontal() { + final boolean isLayoutRtl = isLayoutRtl(); + final int paddingTop = getPaddingTop(); + int childTop; + int childLeft; + final int height = getBottom() - getTop(); + int childBottom = height - getPaddingBottom(); + int childSpace = height - paddingTop - getPaddingBottom(); + final int count = getVirtualChildCount(); + final int majorGravity = mGravity & Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK; + final int minorGravity = mGravity & Gravity.VERTICAL_GRAVITY_MASK; + final boolean baselineAligned = mBaselineAligned; + final int[] maxAscent = mMaxAscent; + final int[] maxDescent = mMaxDescent; + final int layoutDirection = getLayoutDirection(); + switch (getAbsoluteGravity(majorGravity, layoutDirection)) { + case Gravity.RIGHT: + childLeft = getPaddingLeft() + getRight() - getLeft() - mTotalLength; + break; + case Gravity.CENTER_HORIZONTAL: + childLeft = getPaddingLeft() + (getRight() - getLeft() - mTotalLength) / 2; + break; + case Gravity.LEFT: + default: + childLeft = getPaddingLeft(); + break; + } + int start = 0; + int dir = 1; + if (isLayoutRtl) { + start = count - 1; + dir = -1; + } + for (int i = 0; i < count; i++) { + int childIndex = start + dir * i; + final View child = getVirtualChildAt(childIndex); + if (child == null) { + childLeft += measureNullChild(childIndex); + } else if (child.getVisibility() != GONE) { + final int childWidth = child.getMeasuredWidth(); + final int childHeight = child.getMeasuredHeight(); + int childBaseline = -1; + final LinearLayout.LayoutParams lp = + (LinearLayout.LayoutParams) child.getLayoutParams(); + if (baselineAligned + && lp.height != android.view.ViewGroup.LayoutParams.MATCH_PARENT) { + childBaseline = child.getBaseline(); + } + int gravity = lp.gravity; + if (gravity < 0) { + gravity = minorGravity; + } + switch (gravity & Gravity.VERTICAL_GRAVITY_MASK) { + case Gravity.TOP: + childTop = paddingTop + lp.topMargin; + if (childBaseline != -1) { + childTop += maxAscent[INDEX_TOP] - childBaseline; + } + break; + case Gravity.CENTER_VERTICAL: + childTop = paddingTop + (childSpace - childHeight) / 2 + + lp.topMargin - lp.bottomMargin; + break; + case Gravity.BOTTOM: + childTop = childBottom - childHeight - lp.bottomMargin; + if (childBaseline != -1) { + int descent = child.getMeasuredHeight() - childBaseline; + childTop -= maxDescent[INDEX_BOTTOM] - descent; + } + break; + default: + childTop = paddingTop; + break; + } + if (hasDividerBeforeChildAt(childIndex)) { + childLeft += mDividerWidth; + } + childLeft += lp.leftMargin; + setChildFrame(child, childLeft + getLocationOffset(child), childTop, + childWidth, childHeight); + childLeft += childWidth + lp.rightMargin + + getNextLocationOffset(child); + i += getChildrenSkipCount(child, childIndex); + } + } + } + + void layoutVertical() { + final int paddingLeft = getPaddingLeft(); + int childTop; + int childLeft; + final int width = getRight() - getLeft(); + int childRight = width - getPaddingRight(); + int childSpace = width - paddingLeft - getPaddingRight(); + final int count = getVirtualChildCount(); + final int majorGravity = mGravity & Gravity.VERTICAL_GRAVITY_MASK; + final int minorGravity = mGravity & Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK; + switch (majorGravity) { + case Gravity.BOTTOM: + childTop = getPaddingTop() + getBottom() - getTop() - mTotalLength; + break; + case Gravity.CENTER_VERTICAL: + childTop = getPaddingTop() + (getBottom() - getTop() - mTotalLength) / 2; + break; + case Gravity.TOP: + default: + childTop = getPaddingTop(); + break; + } + for (int i = 0; i < count; i++) { + final View child = getVirtualChildAt(i); + if (child == null) { + childTop += measureNullChild(i); + } else if (child.getVisibility() != GONE) { + final int childWidth = child.getMeasuredWidth(); + final int childHeight = child.getMeasuredHeight(); + final LinearLayout.LayoutParams lp = + (LinearLayout.LayoutParams) child.getLayoutParams(); + int gravity = lp.gravity; + if (gravity < 0) { + gravity = minorGravity; + } + final int layoutDirection = getLayoutDirection(); + final int absoluteGravity = getAbsoluteGravity(gravity, layoutDirection); + switch (absoluteGravity & Gravity.HORIZONTAL_GRAVITY_MASK) { + case Gravity.CENTER_HORIZONTAL: + childLeft = paddingLeft + (childSpace - childWidth) / 2 + + lp.leftMargin - lp.rightMargin; + break; + case Gravity.RIGHT: + childLeft = childRight - childWidth - lp.rightMargin; + break; + case Gravity.LEFT: + default: + childLeft = paddingLeft + lp.leftMargin; + break; + } + if (hasDividerBeforeChildAt(i)) { + childTop += mDividerHeight; + } + childTop += lp.topMargin; + setChildFrame(child, childLeft, childTop + getLocationOffset(child), + childWidth, childHeight); + childTop += childHeight + lp.bottomMargin + getNextLocationOffset(child); + i += getChildrenSkipCount(child, i); + } + } + } + + void measureChildBeforeLayout(View child, int childIndex, + int widthMeasureSpec, int totalWidth, int heightMeasureSpec, + int totalHeight) { + measureChildWithMargins(child, widthMeasureSpec, totalWidth, + heightMeasureSpec, totalHeight); + } + + void measureHorizontal(int widthMeasureSpec, int heightMeasureSpec) { + mTotalLength = 0; + int maxHeight = 0; + int childState = 0; + int alternativeMaxHeight = 0; + int weightedMaxHeight = 0; + boolean allFillParent = true; + float totalWeight = 0; + final int count = getVirtualChildCount(); + final int widthMode = MeasureSpec.getMode(widthMeasureSpec); + final int heightMode = MeasureSpec.getMode(heightMeasureSpec); + boolean matchHeight = false; + if (mMaxAscent == null || mMaxDescent == null) { + mMaxAscent = new int[VERTICAL_GRAVITY_COUNT]; + mMaxDescent = new int[VERTICAL_GRAVITY_COUNT]; + } + final int[] maxAscent = mMaxAscent; + final int[] maxDescent = mMaxDescent; + maxAscent[0] = maxAscent[1] = maxAscent[2] = maxAscent[3] = -1; + maxDescent[0] = maxDescent[1] = maxDescent[2] = maxDescent[3] = -1; + final boolean baselineAligned = mBaselineAligned; + final boolean useLargestChild = mUseLargestChild; + final boolean isExactly = widthMode == MeasureSpec.EXACTLY; + int largestChildWidth = Integer.MIN_VALUE; + for (int i = 0; i < count; ++i) { + final View child = getVirtualChildAt(i); + if (child == null) { + mTotalLength += measureNullChild(i); + continue; + } + if (child.getVisibility() == GONE) { + i += getChildrenSkipCount(child, i); + continue; + } + if (hasDividerBeforeChildAt(i)) { + mTotalLength += mDividerWidth; + } + final LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) + child.getLayoutParams(); + totalWeight += lp.weight; + if (widthMode == MeasureSpec.EXACTLY && lp.width == 0 && lp.weight > 0) { + if (isExactly) { + mTotalLength += lp.leftMargin + lp.rightMargin; + } else { + final int totalLength = mTotalLength; + mTotalLength = Math.max(totalLength, totalLength + + lp.leftMargin + lp.rightMargin); + } + if (baselineAligned) { + final int freeSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); + child.measure(freeSpec, freeSpec); + } + } else { + int oldWidth = Integer.MIN_VALUE; + if (lp.width == 0 && lp.weight > 0) { + oldWidth = 0; + lp.width = android.view.ViewGroup.LayoutParams.WRAP_CONTENT; + } + measureChildBeforeLayout(child, i, widthMeasureSpec, + totalWeight == 0 ? mTotalLength : 0, + heightMeasureSpec, 0); + if (oldWidth != Integer.MIN_VALUE) { + lp.width = oldWidth; + } + final int childWidth = child.getMeasuredWidth(); + if (isExactly) { + mTotalLength += childWidth + lp.leftMargin + lp.rightMargin + + getNextLocationOffset(child); + } else { + final int totalLength = mTotalLength; + mTotalLength = Math.max(totalLength, totalLength + childWidth + lp.leftMargin + + lp.rightMargin + getNextLocationOffset(child)); + } + if (useLargestChild) { + largestChildWidth = Math.max(childWidth, largestChildWidth); + } + } + boolean matchHeightLocally = false; + if (heightMode != MeasureSpec.EXACTLY + && lp.height == android.view.ViewGroup.LayoutParams.MATCH_PARENT) { + matchHeight = true; + matchHeightLocally = true; + } + final int margin = lp.topMargin + lp.bottomMargin; + final int childHeight = child.getMeasuredHeight() + margin; + if (VERSION.SDK_INT >= 11) { + childState |= child.getMeasuredState(); + } + if (baselineAligned) { + final int childBaseline = child.getBaseline(); + if (childBaseline != -1) { + final int gravity = (lp.gravity < 0 ? mGravity : lp.gravity) + & Gravity.VERTICAL_GRAVITY_MASK; + final int index = (gravity >> Gravity.AXIS_Y_SHIFT + & ~Gravity.AXIS_SPECIFIED) >> 1; + maxAscent[index] = Math.max(maxAscent[index], childBaseline); + maxDescent[index] = Math.max(maxDescent[index], childHeight - childBaseline); + } + } + maxHeight = Math.max(maxHeight, childHeight); + allFillParent = allFillParent + && lp.height == android.view.ViewGroup.LayoutParams.MATCH_PARENT; + if (lp.weight > 0) { + weightedMaxHeight = Math.max(weightedMaxHeight, + matchHeightLocally ? margin : childHeight); + } else { + alternativeMaxHeight = Math.max(alternativeMaxHeight, + matchHeightLocally ? margin : childHeight); + } + i += getChildrenSkipCount(child, i); + } + if (mTotalLength > 0 && hasDividerBeforeChildAt(count)) { + mTotalLength += mDividerWidth; + } + if (maxAscent[INDEX_TOP] != -1 || + maxAscent[INDEX_CENTER_VERTICAL] != -1 || + maxAscent[INDEX_BOTTOM] != -1 || + maxAscent[INDEX_FILL] != -1) { + final int ascent = Math.max(maxAscent[INDEX_FILL], + Math.max(maxAscent[INDEX_CENTER_VERTICAL], + Math.max(maxAscent[INDEX_TOP], maxAscent[INDEX_BOTTOM]))); + final int descent = Math.max(maxDescent[INDEX_FILL], + Math.max(maxDescent[INDEX_CENTER_VERTICAL], + Math.max(maxDescent[INDEX_TOP], maxDescent[INDEX_BOTTOM]))); + maxHeight = Math.max(maxHeight, ascent + descent); + } + if (useLargestChild && + (widthMode == MeasureSpec.AT_MOST || widthMode == MeasureSpec.UNSPECIFIED)) { + mTotalLength = 0; + for (int i = 0; i < count; ++i) { + final View child = getVirtualChildAt(i); + if (child == null) { + mTotalLength += measureNullChild(i); + continue; + } + if (child.getVisibility() == GONE) { + i += getChildrenSkipCount(child, i); + continue; + } + final LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) + child.getLayoutParams(); + if (isExactly) { + mTotalLength += largestChildWidth + lp.leftMargin + lp.rightMargin + + getNextLocationOffset(child); + } else { + final int totalLength = mTotalLength; + mTotalLength = Math.max(totalLength, totalLength + largestChildWidth + + lp.leftMargin + lp.rightMargin + getNextLocationOffset(child)); + } + } + } + mTotalLength += getPaddingLeft() + getPaddingRight(); + int widthSize = mTotalLength; + widthSize = Math.max(widthSize, getSuggestedMinimumWidth()); + int widthSizeAndState = resolveSizeAndState(widthSize, widthMeasureSpec, 0); + widthSize = widthSizeAndState & MEASURED_SIZE_MASK; + int delta = widthSize - mTotalLength; + if (delta != 0 && totalWeight > 0.0f) { + float weightSum = mWeightSum > 0.0f ? mWeightSum : totalWeight; + maxAscent[0] = maxAscent[1] = maxAscent[2] = maxAscent[3] = -1; + maxDescent[0] = maxDescent[1] = maxDescent[2] = maxDescent[3] = -1; + maxHeight = -1; + mTotalLength = 0; + for (int i = 0; i < count; ++i) { + final View child = getVirtualChildAt(i); + if (child == null || child.getVisibility() == View.GONE) { + continue; + } + final LinearLayout.LayoutParams lp = + (LinearLayout.LayoutParams) child.getLayoutParams(); + float childExtra = lp.weight; + if (childExtra > 0) { + int share = (int) (childExtra * delta / weightSum); + weightSum -= childExtra; + delta -= share; + final int childHeightMeasureSpec = getChildMeasureSpec( + heightMeasureSpec, getPaddingTop() + getPaddingBottom() + lp.topMargin + + lp.bottomMargin, + lp.height); + if (lp.width != 0 || widthMode != MeasureSpec.EXACTLY) { + int childWidth = child.getMeasuredWidth() + share; + if (childWidth < 0) { + childWidth = 0; + } + child.measure( + MeasureSpec.makeMeasureSpec(childWidth, MeasureSpec.EXACTLY), + childHeightMeasureSpec); + } else { + child.measure(MeasureSpec.makeMeasureSpec( + share > 0 ? share : 0, MeasureSpec.EXACTLY), + childHeightMeasureSpec); + } + if (VERSION.SDK_INT >= 11) { + childState |= child.getMeasuredState() & MEASURED_STATE_MASK; + } + } + if (isExactly) { + mTotalLength += child.getMeasuredWidth() + lp.leftMargin + lp.rightMargin + + getNextLocationOffset(child); + } else { + final int totalLength = mTotalLength; + mTotalLength = Math.max(totalLength, totalLength + child.getMeasuredWidth() + + lp.leftMargin + lp.rightMargin + getNextLocationOffset(child)); + } + boolean matchHeightLocally = heightMode != MeasureSpec.EXACTLY && + lp.height == android.view.ViewGroup.LayoutParams.MATCH_PARENT; + final int margin = lp.topMargin + lp.bottomMargin; + int childHeight = child.getMeasuredHeight() + margin; + maxHeight = Math.max(maxHeight, childHeight); + alternativeMaxHeight = Math.max(alternativeMaxHeight, + matchHeightLocally ? margin : childHeight); + allFillParent = allFillParent + && lp.height == android.view.ViewGroup.LayoutParams.MATCH_PARENT; + if (baselineAligned) { + final int childBaseline = child.getBaseline(); + if (childBaseline != -1) { + final int gravity = (lp.gravity < 0 ? mGravity : lp.gravity) + & Gravity.VERTICAL_GRAVITY_MASK; + final int index = (gravity >> Gravity.AXIS_Y_SHIFT + & ~Gravity.AXIS_SPECIFIED) >> 1; + maxAscent[index] = Math.max(maxAscent[index], childBaseline); + maxDescent[index] = Math.max(maxDescent[index], + childHeight - childBaseline); + } + } + } + mTotalLength += getPaddingLeft() + getPaddingRight(); + if (maxAscent[INDEX_TOP] != -1 || + maxAscent[INDEX_CENTER_VERTICAL] != -1 || + maxAscent[INDEX_BOTTOM] != -1 || + maxAscent[INDEX_FILL] != -1) { + final int ascent = Math.max(maxAscent[INDEX_FILL], + Math.max(maxAscent[INDEX_CENTER_VERTICAL], + Math.max(maxAscent[INDEX_TOP], maxAscent[INDEX_BOTTOM]))); + final int descent = Math.max(maxDescent[INDEX_FILL], + Math.max(maxDescent[INDEX_CENTER_VERTICAL], + Math.max(maxDescent[INDEX_TOP], maxDescent[INDEX_BOTTOM]))); + maxHeight = Math.max(maxHeight, ascent + descent); + } + } else { + alternativeMaxHeight = Math.max(alternativeMaxHeight, weightedMaxHeight); + if (useLargestChild && widthMode != MeasureSpec.EXACTLY) { + for (int i = 0; i < count; i++) { + final View child = getVirtualChildAt(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)); + } + } + } + } + if (!allFillParent && heightMode != MeasureSpec.EXACTLY) { + maxHeight = alternativeMaxHeight; + } + maxHeight += getPaddingTop() + getPaddingBottom(); + maxHeight = Math.max(maxHeight, getSuggestedMinimumHeight()); + setMeasuredDimension(widthSizeAndState | childState & MEASURED_STATE_MASK, + resolveSizeAndState(maxHeight, heightMeasureSpec, + childState << MEASURED_HEIGHT_STATE_SHIFT)); + if (matchHeight) { + forceUniformHeight(count, widthMeasureSpec); + } + } + + int measureNullChild(int childIndex) { + return 0; + } + + void measureVertical(int widthMeasureSpec, int heightMeasureSpec) { + mTotalLength = 0; + int maxWidth = 0; + int childState = 0; + int alternativeMaxWidth = 0; + int weightedMaxWidth = 0; + boolean allFillParent = true; + float totalWeight = 0; + final int count = getVirtualChildCount(); + final int widthMode = MeasureSpec.getMode(widthMeasureSpec); + final int heightMode = MeasureSpec.getMode(heightMeasureSpec); + boolean matchWidth = false; + final int baselineChildIndex = mBaselineAlignedChildIndex; + final boolean useLargestChild = mUseLargestChild; + int largestChildHeight = Integer.MIN_VALUE; + for (int i = 0; i < count; ++i) { + final View child = getVirtualChildAt(i); + if (child == null) { + mTotalLength += measureNullChild(i); + continue; + } + if (child.getVisibility() == View.GONE) { + i += getChildrenSkipCount(child, i); + continue; + } + if (hasDividerBeforeChildAt(i)) { + mTotalLength += mDividerHeight; + } + LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) child.getLayoutParams(); + totalWeight += lp.weight; + if (heightMode == MeasureSpec.EXACTLY && lp.height == 0 && lp.weight > 0) { + final int totalLength = mTotalLength; + mTotalLength = Math.max(totalLength, totalLength + lp.topMargin + lp.bottomMargin); + } else { + int oldHeight = Integer.MIN_VALUE; + if (lp.height == 0 && lp.weight > 0) { + oldHeight = 0; + lp.height = android.view.ViewGroup.LayoutParams.WRAP_CONTENT; + } + measureChildBeforeLayout( + child, i, widthMeasureSpec, 0, heightMeasureSpec, + totalWeight == 0 ? mTotalLength : 0); + if (oldHeight != Integer.MIN_VALUE) { + lp.height = oldHeight; + } + final int childHeight = child.getMeasuredHeight(); + final int totalLength = mTotalLength; + mTotalLength = Math.max(totalLength, totalLength + childHeight + lp.topMargin + + lp.bottomMargin + getNextLocationOffset(child)); + if (useLargestChild) { + largestChildHeight = Math.max(childHeight, largestChildHeight); + } + } + if (baselineChildIndex >= 0 && baselineChildIndex == i + 1) { + mBaselineChildTop = mTotalLength; + } + if (i < baselineChildIndex && lp.weight > 0) { + throw new RuntimeException("A child of LinearLayout with index " + + "less than mBaselineAlignedChildIndex has weight > 0, which " + + "won't work. Either remove the weight, or don't set " + + "mBaselineAlignedChildIndex."); + } + boolean matchWidthLocally = false; + if (widthMode != MeasureSpec.EXACTLY + && lp.width == android.view.ViewGroup.LayoutParams.MATCH_PARENT) { + matchWidth = true; + matchWidthLocally = true; + } + final int margin = lp.leftMargin + lp.rightMargin; + final int measuredWidth = child.getMeasuredWidth() + margin; + maxWidth = Math.max(maxWidth, measuredWidth); + if (VERSION.SDK_INT >= 11) { + childState |= child.getMeasuredState(); + } + allFillParent = allFillParent + && lp.width == android.view.ViewGroup.LayoutParams.MATCH_PARENT; + if (lp.weight > 0) { + weightedMaxWidth = Math.max(weightedMaxWidth, + matchWidthLocally ? margin : measuredWidth); + } else { + alternativeMaxWidth = Math.max(alternativeMaxWidth, + matchWidthLocally ? margin : measuredWidth); + } + + i += getChildrenSkipCount(child, i); + } + if (mTotalLength > 0 && hasDividerBeforeChildAt(count)) { + mTotalLength += mDividerHeight; + } + if (useLargestChild && + (heightMode == MeasureSpec.AT_MOST || heightMode == MeasureSpec.UNSPECIFIED)) { + mTotalLength = 0; + for (int i = 0; i < count; ++i) { + final View child = getVirtualChildAt(i); + if (child == null) { + mTotalLength += measureNullChild(i); + continue; + } + if (child.getVisibility() == GONE) { + i += getChildrenSkipCount(child, i); + continue; + } + final LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) + child.getLayoutParams(); + final int totalLength = mTotalLength; + mTotalLength = Math.max(totalLength, totalLength + largestChildHeight + + lp.topMargin + lp.bottomMargin + getNextLocationOffset(child)); + } + } + mTotalLength += getPaddingTop() + getPaddingBottom(); + int heightSize = mTotalLength; + heightSize = Math.max(heightSize, getSuggestedMinimumHeight()); + int heightSizeAndState = resolveSizeAndState(heightSize, heightMeasureSpec, 0); + heightSize = heightSizeAndState & MEASURED_SIZE_MASK; + int delta = heightSize - mTotalLength; + if (delta != 0 && totalWeight > 0.0f) { + float weightSum = mWeightSum > 0.0f ? mWeightSum : totalWeight; + mTotalLength = 0; + for (int i = 0; i < count; ++i) { + final View child = getVirtualChildAt(i); + if (child.getVisibility() == View.GONE) { + continue; + } + LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) child.getLayoutParams(); + float childExtra = lp.weight; + if (childExtra > 0) { + int share = (int) (childExtra * delta / weightSum); + weightSum -= childExtra; + delta -= share; + final int childWidthMeasureSpec = getChildMeasureSpec(widthMeasureSpec, + getPaddingLeft() + getPaddingRight() + + lp.leftMargin + lp.rightMargin, lp.width); + if (lp.height != 0 || heightMode != MeasureSpec.EXACTLY) { + int childHeight = child.getMeasuredHeight() + share; + if (childHeight < 0) { + childHeight = 0; + } + child.measure(childWidthMeasureSpec, + MeasureSpec.makeMeasureSpec(childHeight, MeasureSpec.EXACTLY)); + } else { + child.measure(childWidthMeasureSpec, + MeasureSpec.makeMeasureSpec(share > 0 ? share : 0, + MeasureSpec.EXACTLY)); + } + if (VERSION.SDK_INT >= 11) { + childState |= child.getMeasuredState() + & MEASURED_STATE_MASK >> MEASURED_HEIGHT_STATE_SHIFT; + } + } + final int margin = lp.leftMargin + lp.rightMargin; + final int measuredWidth = child.getMeasuredWidth() + margin; + maxWidth = Math.max(maxWidth, measuredWidth); + boolean matchWidthLocally = widthMode != MeasureSpec.EXACTLY && + lp.width == android.view.ViewGroup.LayoutParams.MATCH_PARENT; + alternativeMaxWidth = Math.max(alternativeMaxWidth, + matchWidthLocally ? margin : measuredWidth); + allFillParent = allFillParent + && lp.width == android.view.ViewGroup.LayoutParams.MATCH_PARENT; + final int totalLength = mTotalLength; + mTotalLength = Math.max(totalLength, totalLength + child.getMeasuredHeight() + + lp.topMargin + lp.bottomMargin + getNextLocationOffset(child)); + } + mTotalLength += getPaddingTop() + getPaddingBottom(); + } else { + alternativeMaxWidth = Math.max(alternativeMaxWidth, + weightedMaxWidth); + if (useLargestChild && heightMode != MeasureSpec.EXACTLY) { + for (int i = 0; i < count; i++) { + final View child = getVirtualChildAt(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)); + } + } + } + } + if (!allFillParent && widthMode != MeasureSpec.EXACTLY) { + maxWidth = alternativeMaxWidth; + } + maxWidth += getPaddingLeft() + getPaddingRight(); + maxWidth = Math.max(maxWidth, getSuggestedMinimumWidth()); + setMeasuredDimension(resolveSizeAndState(maxWidth, widthMeasureSpec, childState), + heightSizeAndState); + if (matchWidth) { + forceUniformWidth(count, heightMeasureSpec); + } + } + + @Override + protected void onDraw(Canvas canvas) { + if (mDivider == null) { + return; + } + if (mOrientation == VERTICAL) { + drawDividersVertical(canvas); + } else { + drawDividersHorizontal(canvas); + } + } + + @Override + public void onInitializeAccessibilityEvent(AccessibilityEvent event) { + super.onInitializeAccessibilityEvent(event); + event.setClassName(LinearLayout.class.getName()); + } + + @Override + public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { + super.onInitializeAccessibilityNodeInfo(info); + info.setClassName(LinearLayout.class.getName()); + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + if (mOrientation == VERTICAL) { + layoutVertical(); + } else { + layoutHorizontal(); + } + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + if (mOrientation == VERTICAL) { + measureVertical(widthMeasureSpec, heightMeasureSpec); + } else { + measureHorizontal(widthMeasureSpec, heightMeasureSpec); + } + } + + @Override + public void setBaselineAligned(boolean baselineAligned) { + mBaselineAligned = baselineAligned; + } + + @Override + public void setBaselineAlignedChildIndex(int i) { + if (i < 0 || i >= getChildCount()) { + throw new IllegalArgumentException("base aligned child index out " + + "of range (0, " + getChildCount() + ")"); + } + mBaselineAlignedChildIndex = i; + } + + private void setChildFrame(View child, int left, int top, int width, int height) { + child.layout(left, top, left + width, top + height); + } + + @Override + 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(); + } + + @Override + public void setDividerPadding(int padding) { + mDividerPadding = padding; + } + + @Override + public void setGravity(int gravity) { + if (mGravity != gravity) { + if ((gravity & Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK) == 0) { + gravity |= Gravity.START; + } + if ((gravity & Gravity.VERTICAL_GRAVITY_MASK) == 0) { + gravity |= Gravity.TOP; + } + mGravity = gravity; + requestLayout(); + } + } + + @Override + public void setHorizontalGravity(int horizontalGravity) { + final int gravity = horizontalGravity & Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK; + if ((mGravity & Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK) != gravity) { + mGravity = mGravity & ~Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK | gravity; + requestLayout(); + } + } + + @Override + public void setMeasureWithLargestChildEnabled(boolean enabled) { + mUseLargestChild = enabled; + } + + @Override + public void setOrientation(int orientation) { + if (mOrientation != orientation) { + mOrientation = orientation; + requestLayout(); + } + } + + @Override + public void setShowDividers(int showDividers) { + if (showDividers != mShowDividers) { + requestLayout(); + } + mShowDividers = showDividers; + } + + @Override + public void setVerticalGravity(int verticalGravity) { + final int gravity = verticalGravity & Gravity.VERTICAL_GRAVITY_MASK; + if ((mGravity & Gravity.VERTICAL_GRAVITY_MASK) != gravity) { + mGravity = mGravity & ~Gravity.VERTICAL_GRAVITY_MASK | gravity; + requestLayout(); + } + } + + @Override + public void setWeightSum(float weightSum) { + mWeightSum = Math.max(0.0f, weightSum); + } + + @Override + public boolean shouldDelayChildPressedState() { + return false; + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/ListAdapterWrapper.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/ListAdapterWrapper.java new file mode 100644 index 0000000000..aa6dd0a870 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/ListAdapterWrapper.java @@ -0,0 +1,135 @@ + +package org.holoeverywhere.widget; + +import android.database.DataSetObserver; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ListAdapter; +import android.widget.WrapperListAdapter; + +public class ListAdapterWrapper implements WrapperListAdapter { + public static interface ListAdapterCallback { + public void onChanged(); + + public void onInvalidated(); + + public View onPrepareView(View view, int position); + } + + private final class WrapperDataSetObserver extends DataSetObserver { + private DataSetObserver mDataSetObserver; + + public WrapperDataSetObserver(DataSetObserver dataSetObserver) { + mDataSetObserver = dataSetObserver; + } + + @Override + public void onChanged() { + mDataSetObserver.onChanged(); + if (mCallback != null) { + mCallback.onChanged(); + } + } + + @Override + public void onInvalidated() { + mDataSetObserver.onInvalidated(); + if (mCallback != null) { + mCallback.onInvalidated(); + } + } + } + + private final ListAdapterCallback mCallback; + private DataSetObserver mLastDataSetObserver; + private final ListAdapter mWrapped; + + public ListAdapterWrapper(ListAdapter wrapped) { + this(wrapped, null); + } + + public ListAdapterWrapper(ListAdapter wrapped, ListAdapterCallback callback) { + mWrapped = wrapped; + mCallback = callback; + } + + @Override + public boolean areAllItemsEnabled() { + return mWrapped.areAllItemsEnabled(); + } + + @Override + public int getCount() { + return mWrapped.getCount(); + } + + @Override + public Object getItem(int position) { + return mWrapped.getItem(position); + } + + @Override + public long getItemId(int position) { + return mWrapped.getItemId(position); + } + + @Override + public int getItemViewType(int position) { + return mWrapped.getItemViewType(position); + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + return onPrepareView(mWrapped.getView(position, convertView, parent), position); + } + + @Override + public int getViewTypeCount() { + return mWrapped.getViewTypeCount(); + } + + @Override + public ListAdapter getWrappedAdapter() { + return mWrapped; + } + + @Override + public boolean hasStableIds() { + return mWrapped.hasStableIds(); + } + + @Override + public boolean isEmpty() { + return mWrapped.isEmpty(); + } + + @Override + public boolean isEnabled(int position) { + return mWrapped.isEnabled(position); + } + + public void notifyDataSetChanged() { + if (mLastDataSetObserver != null) { + mLastDataSetObserver.onChanged(); + } + } + + public View onPrepareView(View view, int position) { + if (mCallback != null) { + return mCallback.onPrepareView(view, position); + } + return view; + } + + @Override + public void registerDataSetObserver(DataSetObserver dataSetObserver) { + mWrapped.registerDataSetObserver(mLastDataSetObserver = new WrapperDataSetObserver( + dataSetObserver)); + } + + @Override + public void unregisterDataSetObserver(DataSetObserver dataSetObserver) { + mWrapped.unregisterDataSetObserver(mLastDataSetObserver); + mLastDataSetObserver = null; + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/ListPopupWindow.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/ListPopupWindow.java new file mode 100644 index 0000000000..de3f287e62 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/ListPopupWindow.java @@ -0,0 +1,858 @@ + +package org.holoeverywhere.widget; + +import org.holoeverywhere.R; + +import android.annotation.SuppressLint; +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.VERSION; +import android.os.Handler; +import android.util.AttributeSet; +import android.util.Log; +import android.view.KeyEvent; +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.AbsListView.OnScrollListener; +import android.widget.AdapterView; +import android.widget.ListAdapter; + +public class ListPopupWindow { + private static class DropDownListView extends ListView { + private boolean mHijackFocus; + private boolean mListSelectionHidden; + + public DropDownListView(Context context, boolean hijackFocus) { + super(context, null, R.attr.dropDownListViewStyle); + mHijackFocus = hijackFocus; + } + + @Override + public boolean hasFocus() { + return mHijackFocus || super.hasFocus(); + } + + @Override + public boolean hasWindowFocus() { + return mHijackFocus || super.hasWindowFocus(); + } + + @Override + public boolean isFocused() { + return mHijackFocus || super.isFocused(); + } + + @Override + public boolean isInTouchMode() { + return mHijackFocus && mListSelectionHidden + || super.isInTouchMode(); + } + + @Override + public View onPrepareView(View view, int position) { + if (view instanceof android.widget.TextView) { + ((android.widget.TextView) view).setHorizontallyScrolling(true); + } + return view; + } + } + + private class ListSelectorHider implements Runnable { + @Override + public void run() { + clearListSelection(); + } + } + + private class PopupDataSetObserver extends DataSetObserver { + @Override + public void onChanged() { + if (isShowing()) { + show(); + } + } + + @Override + public void onInvalidated() { + dismiss(); + } + } + + private class PopupScrollListener implements ListView.OnScrollListener { + @Override + public void onScroll(AbsListView view, int firstVisibleItem, + int visibleItemCount, int totalItemCount) { + } + + @Override + public void onScrollStateChanged(AbsListView view, int scrollState) { + if (scrollState == OnScrollListener.SCROLL_STATE_TOUCH_SCROLL + && !isInputMethodNotNeeded() + && mPopup.getContentView() != null) { + mHandler.removeCallbacks(mResizePopupRunnable); + mResizePopupRunnable.run(); + } + } + } + + private class PopupTouchInterceptor implements OnTouchListener { + @Override + 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, + ListPopupWindow.EXPAND_LIST_TIMEOUT); + } else if (action == MotionEvent.ACTION_UP) { + mHandler.removeCallbacks(mResizePopupRunnable); + } + return false; + } + } + + private class ResizePopupRunnable implements Runnable { + @Override + public void run() { + if (mDropDownList != null + && mDropDownList.getCount() > mDropDownList.getChildCount() + && mDropDownList.getChildCount() <= mListItemExpandMaximum) { + mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NOT_NEEDED); + show(); + } + } + } + + private static final boolean DEBUG = false; + private static final int EXPAND_LIST_TIMEOUT = 250; + public static final int INPUT_METHOD_FROM_FOCUSABLE = PopupWindow.INPUT_METHOD_FROM_FOCUSABLE; + public static final int INPUT_METHOD_NEEDED = PopupWindow.INPUT_METHOD_NEEDED; + public static final int INPUT_METHOD_NOT_NEEDED = PopupWindow.INPUT_METHOD_NOT_NEEDED; + public static final int MATCH_PARENT = ViewGroup.LayoutParams.MATCH_PARENT; + public static final int POSITION_PROMPT_ABOVE = 0; + public static final int POSITION_PROMPT_BELOW = 1; + private static final String TAG = "ListPopupWindow"; + public static final int WRAP_CONTENT = ViewGroup.LayoutParams.WRAP_CONTENT; + private ListAdapter mAdapter; + private Context mContext; + private boolean mDropDownAlwaysVisible = false; + private View mDropDownAnchorView; + private int mDropDownHeight = ViewGroup.LayoutParams.WRAP_CONTENT; + private int mDropDownHorizontalOffset; + private DropDownListView mDropDownList; + private Drawable mDropDownListHighlight; + private int mDropDownVerticalOffset; + private boolean mDropDownVerticalOffsetSet; + private int mDropDownWidth = ViewGroup.LayoutParams.WRAP_CONTENT; + private boolean mForceIgnoreOutsideTouch = false; + private Handler mHandler = new Handler(); + private final ListSelectorHider mHideSelector = new ListSelectorHider(); + private AdapterView.OnItemClickListener mItemClickListener; + private AdapterView.OnItemSelectedListener mItemSelectedListener; + int mListItemExpandMaximum = Integer.MAX_VALUE; + private boolean mModal; + private DataSetObserver mObserver; + private PopupWindow mPopup; + private int mPromptPosition = ListPopupWindow.POSITION_PROMPT_ABOVE; + private View mPromptView; + private final ResizePopupRunnable mResizePopupRunnable = new ResizePopupRunnable(); + private final PopupScrollListener mScrollListener = new PopupScrollListener(); + private Runnable mShowDropDownRunnable; + private Rect mTempRect = new Rect(); + private final PopupTouchInterceptor mTouchInterceptor = new PopupTouchInterceptor(); + + public ListPopupWindow(Context context) { + this(context, null, R.attr.listPopupWindowStyle, 0); + } + + public ListPopupWindow(Context context, AttributeSet attrs) { + this(context, attrs, R.attr.listPopupWindowStyle, 0); + } + + public ListPopupWindow(Context context, AttributeSet attrs, int defStyleAttr) { + this(context, attrs, defStyleAttr, 0); + } + + public ListPopupWindow(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + mPopup = new PopupWindow(mContext = context, attrs, defStyleAttr, defStyleRes); + mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED); + } + + private int buildDropDown() { + ViewGroup dropDownView; + int otherHeights = 0; + if (mDropDownList == null) { + Context context = mContext; + mShowDropDownRunnable = new Runnable() { + @Override + public void run() { + View view = getAnchorView(); + if (view != null && view.getWindowToken() != null) { + show(); + } + } + }; + 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() { + @Override + public void onItemSelected(AdapterView parent, + View view, int position, long id) { + + if (position != -1) { + DropDownListView dropDownList = mDropDownList; + + if (dropDownList != null) { + dropDownList.mListSelectionHidden = false; + } + } + } + + @Override + public void onNothingSelected(AdapterView parent) { + } + }); + mDropDownList.setOnScrollListener(mScrollListener); + if (mItemSelectedListener != null) { + mDropDownList.setOnItemSelectedListener(mItemSelectedListener); + } + dropDownView = mDropDownList; + View hintView = mPromptView; + if (hintView != null) { + LinearLayout hintContainer = new LinearLayout(context); + hintContainer + .setOrientation(android.widget.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: + Log.e(ListPopupWindow.TAG, "Invalid hint position " + + mPromptPosition); + break; + } + 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; + } + } + int padding = 0; + Drawable background = mPopup.getBackground(); + if (background != null) { + background.getPadding(mTempRect); + padding = mTempRect.top + mTempRect.bottom; + if (!mDropDownVerticalOffsetSet) { + mDropDownVerticalOffset = -mTempRect.top; + } + } else { + mTempRect.setEmpty(); + } + boolean ignoreBottomDecorations = mPopup.getInputMethodMode() == PopupWindow.INPUT_METHOD_NOT_NEEDED; + final int maxHeight = getMaxAvailableHeight(getAnchorView(), + mDropDownVerticalOffset, ignoreBottomDecorations); + if (mDropDownAlwaysVisible + || mDropDownHeight == ViewGroup.LayoutParams.MATCH_PARENT) { + return maxHeight + padding; + } + final int childWidthSpec; + switch (mDropDownWidth) { + case ViewGroup.LayoutParams.WRAP_CONTENT: + childWidthSpec = MeasureSpec.makeMeasureSpec(mContext + .getResources().getDisplayMetrics().widthPixels + - (mTempRect.left + mTempRect.right), MeasureSpec.AT_MOST); + break; + case ViewGroup.LayoutParams.MATCH_PARENT: + childWidthSpec = MeasureSpec.makeMeasureSpec(mContext + .getResources().getDisplayMetrics().widthPixels + - (mTempRect.left + mTempRect.right), MeasureSpec.EXACTLY); + break; + default: + childWidthSpec = MeasureSpec.makeMeasureSpec(mDropDownWidth, + MeasureSpec.EXACTLY); + break; + } + final int listContent = measureHeightOfChildren(childWidthSpec, 0, -1, + maxHeight - otherHeights, -1); + if (listContent > 0) { + otherHeights += padding; + } + return listContent + otherHeights; + } + + public void clearListSelection() { + final DropDownListView list = mDropDownList; + if (list != null) { + list.mListSelectionHidden = true; + // TODO list.hideSelector(); + list.requestLayout(); + } + } + + public void dismiss() { + mPopup.dismiss(); + removePromptView(); + mPopup.setContentView(null); + mDropDownList = null; + mHandler.removeCallbacks(mResizePopupRunnable); + } + + public View getAnchorView() { + return mDropDownAnchorView; + } + + public int getAnimationStyle() { + return mPopup.getAnimationStyle(); + } + + public Drawable getBackground() { + return mPopup.getBackground(); + } + + public int getHeight() { + return mDropDownHeight; + } + + public int getHorizontalOffset() { + return mDropDownHorizontalOffset; + } + + public int getInputMethodMode() { + return mPopup.getInputMethodMode(); + } + + public ListView getListView() { + return mDropDownList; + } + + 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; + int returnedHeight = Math.max(distanceToBottom, distanceToTop); + if (mPopup.getBackground() != null) { + mPopup.getBackground().getPadding(mTempRect); + returnedHeight -= mTempRect.top + mTempRect.bottom; + } + return returnedHeight; + } + + public int getPromptPosition() { + return mPromptPosition; + } + + public Object getSelectedItem() { + if (!isShowing()) { + return null; + } + return mDropDownList.getSelectedItem(); + } + + public long getSelectedItemId() { + if (!isShowing()) { + return AdapterView.INVALID_ROW_ID; + } + return mDropDownList.getSelectedItemId(); + } + + public int getSelectedItemPosition() { + if (!isShowing()) { + return AdapterView.INVALID_POSITION; + } + return mDropDownList.getSelectedItemPosition(); + } + + public View getSelectedView() { + if (!isShowing()) { + return null; + } + return mDropDownList.getSelectedView(); + } + + public int getSoftInputMode() { + return mPopup.getSoftInputMode(); + } + + public int getVerticalOffset() { + if (!mDropDownVerticalOffsetSet) { + return 0; + } + return mDropDownVerticalOffset; + } + + public int getWidth() { + return mDropDownWidth; + } + + public boolean isDropDownAlwaysVisible() { + return mDropDownAlwaysVisible; + } + + public boolean isInputMethodNotNeeded() { + return mPopup.getInputMethodMode() == ListPopupWindow.INPUT_METHOD_NOT_NEEDED; + } + + public boolean isModal() { + return mModal; + } + + public boolean isShowing() { + return mPopup.isShowing(); + } + + 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(); + } + int returnedHeight = mDropDownList.getListPaddingTop() + + mDropDownList.getListPaddingBottom(); + final int dividerHeight = mDropDownList.getDividerHeight() > 0 + && mDropDownList.getDivider() != null ? mDropDownList + .getDividerHeight() : 0; + int prevHeightWithoutPartialChild = 0; + int i; + View child; + endPosition = endPosition == -1 ? 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) { + returnedHeight += dividerHeight; + } + returnedHeight += child.getMeasuredHeight(); + if (returnedHeight >= maxHeight) { + return disallowPartialChildPosition >= 0 + && i > disallowPartialChildPosition + && prevHeightWithoutPartialChild > 0 + && returnedHeight != maxHeight ? prevHeightWithoutPartialChild + : maxHeight; + } + if (disallowPartialChildPosition >= 0 + && i >= disallowPartialChildPosition) { + prevHeightWithoutPartialChild = 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); + } + // TODO p.viewType = mAdapter.getItemViewType(position); + // TODO 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); + } + + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (isShowing()) { + if (keyCode != KeyEvent.KEYCODE_SPACE + && (mDropDownList.getSelectedItemPosition() >= 0 || keyCode != KeyEvent.KEYCODE_ENTER + && keyCode != KeyEvent.KEYCODE_DPAD_CENTER)) { + int curIndex = mDropDownList.getSelectedItemPosition(); + boolean consumed; + final boolean below = !mPopup.isAboveAnchor(); + final ListAdapter adapter = mAdapter; + @SuppressWarnings("unused") + boolean allEnabled; + int firstItem = Integer.MAX_VALUE; + int lastItem = Integer.MIN_VALUE; + if (adapter != null) { + allEnabled = adapter.areAllItemsEnabled(); + firstItem = 0; + lastItem = adapter.getCount() - 1; + /* + * TODO firstItem = allEnabled ? 0 : mDropDownList + * .lookForSelectablePosition(0, true); lastItem = + * allEnabled ? adapter.getCount() - 1 : + * mDropDownList.lookForSelectablePosition( + * adapter.getCount() - 1, false); + */ + } + if (below && keyCode == KeyEvent.KEYCODE_DPAD_UP + && curIndex <= firstItem || !below + && keyCode == KeyEvent.KEYCODE_DPAD_DOWN + && curIndex >= lastItem) { + clearListSelection(); + mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED); + show(); + return true; + } else { + mDropDownList.mListSelectionHidden = false; + } + consumed = mDropDownList.onKeyDown(keyCode, event); + if (ListPopupWindow.DEBUG) { + Log.v(ListPopupWindow.TAG, "Key down: code=" + keyCode + + " list consumed=" + consumed); + } + + if (consumed) { + mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NOT_NEEDED); + mDropDownList.requestFocusFromTouch(); + show(); + switch (keyCode) { + case KeyEvent.KEYCODE_ENTER: + case KeyEvent.KEYCODE_DPAD_CENTER: + case KeyEvent.KEYCODE_DPAD_DOWN: + case KeyEvent.KEYCODE_DPAD_UP: + return true; + } + } else { + if (below && keyCode == KeyEvent.KEYCODE_DPAD_DOWN) { + if (curIndex == lastItem) { + return true; + } + } else if (!below && keyCode == KeyEvent.KEYCODE_DPAD_UP + && curIndex == firstItem) { + return true; + } + } + } + } + return false; + } + + @SuppressLint("NewApi") + public boolean onKeyPreIme(int keyCode, KeyEvent event) { + if (VERSION.SDK_INT < 5) { + return false; + } + if (keyCode == KeyEvent.KEYCODE_BACK && isShowing()) { + final View anchorView = mDropDownAnchorView; + if (event.getAction() == KeyEvent.ACTION_DOWN + && event.getRepeatCount() == 0) { + KeyEvent.DispatcherState state = anchorView + .getKeyDispatcherState(); + if (state != null) { + state.startTracking(event, this); + } + return true; + } else if (event.getAction() == KeyEvent.ACTION_UP) { + KeyEvent.DispatcherState state = anchorView + .getKeyDispatcherState(); + if (state != null) { + state.handleUpEvent(event); + } + if (event.isTracking() && !event.isCanceled()) { + dismiss(); + return true; + } + } + } + return false; + } + + public boolean onKeyUp(int keyCode, KeyEvent event) { + if (isShowing() && mDropDownList.getSelectedItemPosition() >= 0) { + boolean consumed = mDropDownList.onKeyUp(keyCode, event); + if (consumed) { + switch (keyCode) { + case KeyEvent.KEYCODE_ENTER: + case KeyEvent.KEYCODE_DPAD_CENTER: + dismiss(); + break; + } + } + return consumed; + } + return false; + } + + public boolean performItemClick(int position) { + if (isShowing()) { + if (mItemClickListener != null) { + final DropDownListView list = mDropDownList; + final View child = list.getChildAt(position + - list.getFirstVisiblePosition()); + final ListAdapter adapter = list.getAdapter(); + mItemClickListener.onItemClick(list, child, position, + adapter.getItemId(position)); + } + return true; + } + return false; + } + + public void postShow() { + mHandler.post(mShowDropDownRunnable); + } + + private void removePromptView() { + if (mPromptView != null) { + final ViewParent parent = mPromptView.getParent(); + if (parent instanceof ViewGroup) { + final ViewGroup group = (ViewGroup) parent; + group.removeView(mPromptView); + } + } + } + + public void setAdapter(ListAdapter adapter) { + if (mObserver == null) { + mObserver = new PopupDataSetObserver(); + } else if (mAdapter != null) { + mAdapter.unregisterDataSetObserver(mObserver); + } + mAdapter = adapter; + if (mAdapter != null) { + mAdapter.registerDataSetObserver(mObserver); + } + if (mDropDownList != null) { + mDropDownList.setAdapter(mAdapter); + } + } + + public void setAnchorView(View anchor) { + mDropDownAnchorView = anchor; + } + + public void setAnimationStyle(int animationStyle) { + mPopup.setAnimationStyle(animationStyle); + } + + public void setBackgroundDrawable(Drawable d) { + mPopup.setBackgroundDrawable(d); + } + + public void setContentWidth(int width) { + Drawable popupBackground = mPopup.getBackground(); + if (popupBackground != null) { + popupBackground.getPadding(mTempRect); + mDropDownWidth = mTempRect.left + mTempRect.right + width; + } else { + setWidth(width); + } + } + + public void setDropDownAlwaysVisible(boolean dropDownAlwaysVisible) { + mDropDownAlwaysVisible = dropDownAlwaysVisible; + } + + public void setForceIgnoreOutsideTouch(boolean forceIgnoreOutsideTouch) { + mForceIgnoreOutsideTouch = forceIgnoreOutsideTouch; + } + + public void setHeight(int height) { + mDropDownHeight = height; + } + + public void setHorizontalOffset(int offset) { + mDropDownHorizontalOffset = offset; + } + + public void setInputMethodMode(int mode) { + mPopup.setInputMethodMode(mode); + } + + void setListItemExpandMax(int max) { + mListItemExpandMaximum = max; + } + + public void setListSelector(Drawable selector) { + mDropDownListHighlight = selector; + } + + public void setModal(boolean modal) { + mModal = true; + mPopup.setFocusable(modal); + } + + public void setOnDismissListener(PopupWindow.OnDismissListener listener) { + mPopup.setOnDismissListener(listener); + } + + public void setOnItemClickListener( + AdapterView.OnItemClickListener clickListener) { + mItemClickListener = clickListener; + } + + public void setOnItemSelectedListener( + AdapterView.OnItemSelectedListener selectedListener) { + mItemSelectedListener = selectedListener; + } + + public void setPromptPosition(int position) { + mPromptPosition = position; + } + + public void setPromptView(View prompt) { + boolean showing = isShowing(); + if (showing) { + removePromptView(); + } + mPromptView = prompt; + if (showing) { + show(); + } + } + + public void setSelection(int position) { + DropDownListView list = mDropDownList; + if (isShowing() && list != null) { + list.mListSelectionHidden = false; + list.setSelection(position); + if (list.getChoiceMode() != AbsListView.CHOICE_MODE_NONE) { + list.setItemChecked(position, true); + } + } + } + + public void setSoftInputMode(int mode) { + mPopup.setSoftInputMode(mode); + } + + public void setVerticalOffset(int offset) { + mDropDownVerticalOffset = offset; + mDropDownVerticalOffsetSet = true; + } + + public void setWidth(int width) { + mDropDownWidth = width; + } + + public void show() { + int height = buildDropDown(); + int widthSpec = 0; + int heightSpec = 0; + boolean noInputMethod = isInputMethodNotNeeded(); + mPopup.setAllowScrollingAnchorParent(!noInputMethod); + if (mPopup.isShowing()) { + if (mDropDownWidth == ViewGroup.LayoutParams.MATCH_PARENT) { + widthSpec = -1; + } else if (mDropDownWidth == ViewGroup.LayoutParams.WRAP_CONTENT) { + widthSpec = getAnchorView().getWidth(); + } else { + widthSpec = mDropDownWidth; + } + if (mDropDownHeight == ViewGroup.LayoutParams.MATCH_PARENT) { + 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(!mForceIgnoreOutsideTouch + && !mDropDownAlwaysVisible); + mPopup.update(getAnchorView(), 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(getAnchorView().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); + mPopup.setClipToScreenEnabled(true); + mPopup.setOutsideTouchable(!mForceIgnoreOutsideTouch + && !mDropDownAlwaysVisible); + mPopup.setTouchInterceptor(mTouchInterceptor); + mPopup.showAsDropDown(getAnchorView(), mDropDownHorizontalOffset, + mDropDownVerticalOffset); + mDropDownList.setSelection(AdapterView.INVALID_POSITION); + if (!mModal || mDropDownList.isInTouchMode()) { + clearListSelection(); + } + if (!mModal) { + mHandler.post(mHideSelector); + } + } + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/ListView.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/ListView.java new file mode 100644 index 0000000000..a91a85160c --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/ListView.java @@ -0,0 +1,1029 @@ + +package org.holoeverywhere.widget; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; + +import org.holoeverywhere.HoloEverywhere; +import org.holoeverywhere.IHoloActivity.OnWindowFocusChangeListener; +import org.holoeverywhere.R; +import org.holoeverywhere.app.Activity; +import org.holoeverywhere.drawable.DrawableCompat; +import org.holoeverywhere.widget.HeaderViewListAdapter.ViewInfo; +import org.holoeverywhere.widget.ListAdapterWrapper.ListAdapterCallback; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.os.Build.VERSION; +import android.os.Build.VERSION_CODES; +import android.os.Parcel; +import android.os.Parcelable; +import android.support.v4.util.LongSparseArray; +import android.util.AttributeSet; +import android.util.SparseBooleanArray; +import android.view.ContextMenu.ContextMenuInfo; +import android.view.HapticFeedbackConstants; +import android.view.KeyEvent; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewDebug.ExportedProperty; +import android.view.ViewGroup; +import android.view.ViewParent; +import android.widget.AbsListView; +import android.widget.AdapterView; +import android.widget.Checkable; +import android.widget.ListAdapter; + +import com.actionbarsherlock.internal.view.menu.ContextMenuBuilder.ContextMenuInfoGetter; +import com.actionbarsherlock.view.ActionMode; +import com.actionbarsherlock.view.Menu; +import com.actionbarsherlock.view.MenuItem; + +public class ListView extends android.widget.ListView implements OnWindowFocusChangeListener, + ContextMenuInfoGetter { + public interface MultiChoiceModeListener extends ActionMode.Callback { + public void onItemCheckedStateChanged(ActionMode mode, int position, + long id, boolean checked); + } + + private final class MultiChoiceModeWrapper implements MultiChoiceModeListener { + private MultiChoiceModeListener mWrapped; + + @Override + public boolean onActionItemClicked(ActionMode mode, MenuItem item) { + return mWrapped.onActionItemClicked(mode, item); + } + + @Override + public boolean onCreateActionMode(ActionMode mode, Menu menu) { + if (mWrapped.onCreateActionMode(mode, menu)) { + setLongClickable(false); + return true; + } + return false; + } + + @Override + public void onDestroyActionMode(ActionMode mode) { + mWrapped.onDestroyActionMode(mode); + mChoiceActionMode = null; + clearChoices(); + updateOnScreenCheckedViews(); + setLongClickable(true); + } + + @Override + public void onItemCheckedStateChanged(ActionMode mode, + int position, long id, boolean checked) { + mWrapped.onItemCheckedStateChanged(mode, position, id, checked); + if (getCheckedItemCount() == 0) { + mode.finish(); + } + } + + @Override + public boolean onPrepareActionMode(ActionMode mode, Menu menu) { + return mWrapped.onPrepareActionMode(mode, menu); + } + + public void setWrapped(MultiChoiceModeListener wrapped) { + mWrapped = wrapped; + } + } + + private final class OnItemLongClickListenerWrapper implements OnItemLongClickListener { + private OnItemLongClickListener wrapped; + + @Override + public boolean onItemLongClick(AdapterView adapterView, View view, int position, long id) { + return performItemLongClick(view, position, id); + } + + public void setWrapped(OnItemLongClickListener wrapped) { + this.wrapped = wrapped; + if (wrapped != null) { + setLongClickable(true); + } + } + } + + static final class SavedState extends BaseSavedState { + public static final Creator CREATOR = new Creator() { + @Override + public SavedState createFromParcel(Parcel parcel) { + return new SavedState(parcel); + } + + @Override + public SavedState[] newArray(int size) { + return new SavedState[size]; + } + }; + int checkedItemCount; + LongSparseArray checkIdState; + SparseBooleanArray checkState; + boolean inActionMode; + + public SavedState(Parcel in) { + super(in); + inActionMode = in.readByte() != 0; + checkedItemCount = in.readInt(); + checkState = in.readSparseBooleanArray(); + final int N = in.readInt(); + if (N > 0) { + checkIdState = new LongSparseArray(); + for (int i = 0; i < N; i++) { + final long key = in.readLong(); + final int value = in.readInt(); + checkIdState.put(key, value); + } + } + } + + public SavedState(Parcelable superState) { + super(superState); + } + + @Override + public void writeToParcel(Parcel out, int flags) { + super.writeToParcel(out, flags); + out.writeByte((byte) (inActionMode ? 1 : 0)); + out.writeInt(checkedItemCount); + out.writeSparseBooleanArray(checkState); + final int N = checkIdState != null ? checkIdState.size() : 0; + out.writeInt(N); + for (int i = 0; i < N; i++) { + out.writeLong(checkIdState.keyAt(i)); + out.writeInt(checkIdState.valueAt(i)); + } + } + } + + public static final int CHOICE_MODE_MULTIPLE = AbsListView.CHOICE_MODE_MULTIPLE; + public static final int CHOICE_MODE_MULTIPLE_MODAL = AbsListView.CHOICE_MODE_MULTIPLE_MODAL; + public static final int CHOICE_MODE_NONE = AbsListView.CHOICE_MODE_NONE; + public static final int CHOICE_MODE_SINGLE = AbsListView.CHOICE_MODE_SINGLE; + private static final boolean USE_ACTIVATED = VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB; + private Activity mActivity; + private ListAdapterWrapper mAdapter; + private boolean mAdapterHasStableIds; + private LongSparseArray mCheckedIdStates; + private int mCheckedItemCount; + private SparseBooleanArray mCheckStates; + private ActionMode mChoiceActionMode; + private int mChoiceMode; + private ContextMenuInfo mContextMenuInfo; + private boolean mEnableModalBackgroundWrapper; + private boolean mFastScrollEnabled; + private FastScroller mFastScroller; + private final List mFooterViewInfos = new ArrayList(), + mHeaderViewInfos = new ArrayList(); + private boolean mForceFastScrollAlwaysVisibleDisable = false; + private boolean mForceHeaderListAdapter = false; + private boolean mIsAttached; + private int mLastScrollState = OnScrollListener.SCROLL_STATE_IDLE; + private final ListAdapterCallback mListAdapterCallback = new ListAdapterCallback() { + @Override + public void onChanged() { + if (mFastScroller != null) { + mFastScroller.onSectionsChanged(); + } + } + + @Override + public void onInvalidated() { + if (mFastScroller != null) { + mFastScroller.onSectionsChanged(); + } + } + + @Override + public View onPrepareView(View view, int position) { + return ListView.this.onPrepareView(view, position); + } + }; + private MultiChoiceModeWrapper mMultiChoiceModeCallback; + private final OnItemLongClickListenerWrapper mOnItemLongClickListenerWrapper; + private OnScrollListener mOnScrollListener; + private boolean mPaddingFromScroller = false; + private int mVerticalScrollbarPosition = SCROLLBAR_POSITION_DEFAULT; + + public ListView(Context context) { + this(context, null); + } + + public ListView(Context context, AttributeSet attrs) { + this(context, attrs, android.R.attr.listViewStyle); + } + + @SuppressLint("NewApi") + public ListView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + if (context instanceof Activity) { + setActivity((Activity) context); + } + if (HoloEverywhere.DISABLE_OVERSCROLL_EFFECT && VERSION.SDK_INT >= 9) { + setOverScrollMode(OVER_SCROLL_NEVER); + } + + mOnItemLongClickListenerWrapper = new OnItemLongClickListenerWrapper(); + super.setOnItemLongClickListener(mOnItemLongClickListenerWrapper); + setLongClickable(false); + + if (VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB) { + super.setFastScrollAlwaysVisible(false); + } + super.setFastScrollEnabled(false); + super.setChoiceMode(CHOICE_MODE_NONE); + TypedArray a = context.obtainStyledAttributes(attrs, new int[] { + android.R.attr.fastScrollEnabled, + android.R.attr.fastScrollAlwaysVisible, + android.R.attr.choiceMode, + android.R.attr.overScrollFooter, + android.R.attr.overScrollHeader + }, defStyle, R.style.Holo_ListView); + setFastScrollEnabled(a.getBoolean(0, false)); + setFastScrollAlwaysVisible(a.getBoolean(1, false)); + setChoiceMode(a.getInt(2, CHOICE_MODE_NONE)); + if (!a.hasValue(3) && VERSION.SDK_INT >= VERSION_CODES.GINGERBREAD) { + super.setOverscrollFooter(null); + } + if (!a.hasValue(4) && VERSION.SDK_INT >= VERSION_CODES.GINGERBREAD) { + super.setOverscrollHeader(null); + } + a.recycle(); + } + + @Override + public void addFooterView(View v) { + addFooterView(v, null, true); + } + + @Override + public void addFooterView(View v, Object data, boolean isSelectable) { + if (mAdapter != null && !(mAdapter instanceof HeaderViewListAdapter)) { + throw new IllegalStateException( + "Cannot add footer view to list -- setAdapter has already been called."); + } + ViewInfo info = new ViewInfo(); + info.view = v; + info.data = data; + info.isSelectable = isSelectable; + mFooterViewInfos.add(info); + if (mAdapter != null) { + invalidateViews(); + } + } + + @Override + public void addHeaderView(View v) { + addHeaderView(v, null, true); + } + + @Override + public void addHeaderView(View v, Object data, boolean isSelectable) { + if (mAdapter != null && !(mAdapter instanceof HeaderViewListAdapter)) { + throw new IllegalStateException( + "Cannot add header view to list -- setAdapter has already been called."); + } + ViewInfo info = new ViewInfo(); + info.view = v; + info.data = data; + info.isSelectable = isSelectable; + mHeaderViewInfos.add(info); + if (mAdapter != null) { + invalidateViews(); + } + } + + @Override + public void clearChoices() { + if (mCheckStates != null) { + mCheckStates.clear(); + } + if (mCheckedIdStates != null) { + mCheckedIdStates.clear(); + } + mCheckedItemCount = 0; + } + + protected ContextMenuInfo createContextMenuInfo(View view, int position, + long id) { + return new AdapterContextMenuInfo(view, position, id); + } + + @Override + public void draw(Canvas canvas) { + super.draw(canvas); + if (mFastScroller != null) { + final int scrollY = getScrollY(); + if (scrollY != 0) { + int restoreCount = canvas.save(); + canvas.translate(0, scrollY); + mFastScroller.draw(canvas); + canvas.restoreToCount(restoreCount); + } else { + mFastScroller.draw(canvas); + } + } + + } + + /** + * O_O This method doesn't override super method, but super class invoke it + * instead of android.widget.ListView.drawDivider. It's fucking magic of + * dalvik? + */ + void drawDivider(Canvas canvas, Rect bounds, int childIndex) { + final Drawable divider = getDivider(); + divider.setBounds(bounds); + divider.draw(canvas); + } + + public Activity getActivity() { + return mActivity; + } + + public ListAdapter getAdapterSource() { + return mAdapter == null ? null : mAdapter.getWrappedAdapter(); + } + + @Override + public int getCheckedItemCount() { + return mCheckedItemCount; + } + + @Override + public long[] getCheckedItemIds() { + if (mChoiceMode == CHOICE_MODE_NONE || mCheckedIdStates == null || mAdapter == null) { + return new long[0]; + } + final LongSparseArray idStates = mCheckedIdStates; + final int count = idStates.size(); + final long[] ids = new long[count]; + for (int i = 0; i < count; i++) { + ids[i] = idStates.keyAt(i); + } + return ids; + } + + @Override + public int getCheckedItemPosition() { + if (mChoiceMode == CHOICE_MODE_SINGLE && mCheckStates != null && mCheckStates.size() == 1) { + return mCheckStates.keyAt(0); + } + return INVALID_POSITION; + } + + @Override + public SparseBooleanArray getCheckedItemPositions() { + if (mChoiceMode != CHOICE_MODE_NONE) { + return mCheckStates; + } + return null; + } + + @Override + @Deprecated + public long[] getCheckItemIds() { + return getCheckedItemIds(); + } + + @Override + public int getChoiceMode() { + return mChoiceMode; + } + + @Override + public ContextMenuInfo getContextMenuInfo() { + return mContextMenuInfo; + } + + @Override + public int getFooterViewsCount() { + return mFooterViewInfos.size(); + } + + @Override + public int getHeaderViewsCount() { + return mHeaderViewInfos.size(); + } + + @Override + public int getVerticalScrollbarPosition() { + return mVerticalScrollbarPosition; + } + + @Override + public int getVerticalScrollbarWidth() { + mForceFastScrollAlwaysVisibleDisable = true; + final int superWidth = super.getVerticalScrollbarWidth(); + mForceFastScrollAlwaysVisibleDisable = false; + if (isFastScrollAlwaysVisible()) { + return Math.max(superWidth, mFastScroller.getWidth()); + } + return superWidth; + } + + void invokeOnItemScrollListener() { + final int mFirstPosition = getFirstVisiblePosition(); + final int mItemCount = getCount(); + if (mFastScroller != null) { + mFastScroller.onScroll(this, mFirstPosition, getChildCount(), mItemCount); + } + if (mOnScrollListener != null) { + mOnScrollListener.onScroll(this, mFirstPosition, getChildCount(), mItemCount); + } + onScrollChanged(0, 0, 0, 0); + } + + public boolean isAttached() { + return mIsAttached; + } + + @Override + public boolean isFastScrollAlwaysVisible() { + if (mForceFastScrollAlwaysVisibleDisable) { + return false; + } + return mFastScrollEnabled && mFastScroller.isAlwaysShowEnabled(); + } + + @Override + @ExportedProperty + public boolean isFastScrollEnabled() { + return mFastScrollEnabled; + } + + public boolean isForceHeaderListAdapter() { + return mForceHeaderListAdapter; + } + + public boolean isInScrollingContainer() { + ViewParent p = getParent(); + while (p != null && p instanceof ViewGroup) { + if (VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH + && ((ViewGroup) p).shouldDelayChildPressedState()) { + return true; + } + p = p.getParent(); + } + return false; + } + + @Override + public boolean isItemChecked(int position) { + if (mChoiceMode != CHOICE_MODE_NONE && mCheckStates != null) { + return mCheckStates.get(position); + } + return false; + } + + public boolean isPaddingFromScroller() { + return mPaddingFromScroller; + } + + protected boolean isVerticalScrollBarHidden() { + return mFastScroller != null && mFastScroller.isVisible(); + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + mIsAttached = true; + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + mIsAttached = false; + } + + @Override + protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) { + super.onFocusChanged(gainFocus, direction, previouslyFocusedRect); + if (gainFocus && getSelectedItemPosition() < 0 && !isInTouchMode()) { + if (!mIsAttached && mAdapter != null) { + updateOnScreenCheckedViews(); + } + } + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent ev) { + if (!mIsAttached) { + return false; + } + if (mFastScroller != null && mFastScroller.onInterceptTouchEvent(ev)) { + return true; + } + return super.onInterceptTouchEvent(ev); + } + + @Override + public boolean onKeyUp(int keyCode, KeyEvent event) { + switch (keyCode) { + case KeyEvent.KEYCODE_DPAD_CENTER: + case KeyEvent.KEYCODE_ENTER: + if (!isEnabled()) { + return true; + } + if (isClickable() && isPressed() && + getSelectedItemPosition() >= 0 && mAdapter != null && + getSelectedItemPosition() < mAdapter.getCount()) { + final View view = getChildAt(getSelectedItemPosition() + - getFirstVisiblePosition()); + if (view != null) { + performItemClick(view, getSelectedItemPosition(), getSelectedItemId()); + view.setPressed(false); + } + setPressed(false); + return true; + } + break; + } + return super.onKeyUp(keyCode, event); + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + final int mOldItemCount = getCount(); + super.onLayout(changed, l, t, r, b); + final int mItemCount = getCount(); + if (mFastScroller != null && mItemCount != mOldItemCount) { + mFastScroller.onItemCountChanged(mOldItemCount, mItemCount); + } + } + + public View onPrepareView(View view, int position) { + if (mChoiceMode != CHOICE_MODE_NONE) { + if (mCheckStates != null) { + setStateOnView(view, mCheckStates.get(position)); + } else { + setStateOnView(view, false); + } + } + return view; + } + + @Override + public void onRestoreInstanceState(Parcelable state) { + SavedState ss = (SavedState) state; + super.onRestoreInstanceState(ss.getSuperState()); + if (ss.checkState != null) { + mCheckStates = ss.checkState; + } + if (ss.checkIdState != null) { + mCheckedIdStates = ss.checkIdState; + } + mCheckedItemCount = ss.checkedItemCount; + if (ss.inActionMode && mChoiceMode == CHOICE_MODE_MULTIPLE_MODAL + && mMultiChoiceModeCallback != null) { + mChoiceActionMode = startActionMode(mMultiChoiceModeCallback); + } + requestLayout(); + } + + @Override + public Parcelable onSaveInstanceState() { + SavedState ss = new SavedState(super.onSaveInstanceState()); + ss.inActionMode = mChoiceMode == CHOICE_MODE_MULTIPLE_MODAL && mChoiceActionMode != null; + ss.checkState = mCheckStates; + ss.checkIdState = mCheckedIdStates; + ss.checkedItemCount = mCheckedItemCount; + return ss; + } + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + if (mFastScroller != null) { + mFastScroller.onSizeChanged(w, h, oldw, oldh); + } + } + + @Override + public boolean onTouchEvent(MotionEvent ev) { + if (!isEnabled()) { + return isClickable() || isLongClickable(); + } + if (!mIsAttached) { + return false; + } + if (mFastScroller != null && mFastScroller.onTouchEvent(ev)) { + return true; + } + return super.onTouchEvent(ev); + } + + @Override + public void onWindowFocusChanged(boolean hasWindowFocus) { + super.onWindowFocusChanged(hasWindowFocus); + if (hasWindowFocus) { + updateOnScreenCheckedViews(); + } + } + + @Override + public boolean performItemClick(View view, int position, long id) { + boolean handled = false; + boolean dispatchItemClick = true; + if (mChoiceMode != CHOICE_MODE_NONE) { + handled = true; + boolean checkedStateChanged = false; + if (mChoiceMode == CHOICE_MODE_MULTIPLE || + mChoiceMode == CHOICE_MODE_MULTIPLE_MODAL && mChoiceActionMode != null) { + boolean newValue = !mCheckStates.get(position, false); + mCheckStates.put(position, newValue); + if (mCheckedIdStates != null && mAdapter.hasStableIds()) { + if (newValue) { + mCheckedIdStates.put(mAdapter.getItemId(position), position); + } else { + mCheckedIdStates.delete(mAdapter.getItemId(position)); + } + } + if (newValue) { + mCheckedItemCount++; + } else { + mCheckedItemCount--; + } + if (mChoiceActionMode != null) { + mMultiChoiceModeCallback.onItemCheckedStateChanged(mChoiceActionMode, + position, id, newValue); + dispatchItemClick = false; + } + checkedStateChanged = true; + } else if (mChoiceMode == CHOICE_MODE_SINGLE) { + boolean newValue = !mCheckStates.get(position, false); + if (newValue) { + mCheckStates.clear(); + mCheckStates.put(position, true); + if (mCheckedIdStates != null && mAdapter.hasStableIds()) { + mCheckedIdStates.clear(); + mCheckedIdStates.put(mAdapter.getItemId(position), position); + } + mCheckedItemCount = 1; + } else if (mCheckStates.size() == 0 || !mCheckStates.valueAt(0)) { + mCheckedItemCount = 0; + } + checkedStateChanged = true; + } + if (checkedStateChanged) { + updateOnScreenCheckedViews(); + } + } + if (dispatchItemClick) { + handled |= super.performItemClick(view, position, id); + } + return handled; + } + + public boolean performItemLongClick(final View child, + final int longPressPosition, final long longPressId) { + if (mChoiceMode == CHOICE_MODE_MULTIPLE_MODAL) { + if (mChoiceActionMode == null && + (mChoiceActionMode = startActionMode(mMultiChoiceModeCallback)) != null) { + setItemChecked(longPressPosition, true); + performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); + } + return true; + } + boolean handled = false; + if (mOnItemLongClickListenerWrapper.wrapped != null) { + handled = mOnItemLongClickListenerWrapper.wrapped.onItemLongClick(ListView.this, child, + longPressPosition, longPressId); + } + if (!handled) { + mContextMenuInfo = createContextMenuInfo(child, longPressPosition, longPressId); + handled = super.showContextMenuForChild(ListView.this); + } + if (handled) { + performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); + } + return handled; + } + + protected void recomputePaddingFromScroller() { + final int left = getPaddingLeft(); + final int top = getPaddingTop(); + final int right = getPaddingRight(); + final int bottom = getPaddingBottom(); + if (mPaddingFromScroller) { + final int scrollbarWidth = getVerticalScrollbarWidth(); + switch (mVerticalScrollbarPosition) { + case SCROLLBAR_POSITION_LEFT: + setPadding(scrollbarWidth, top, right, bottom); + break; + case SCROLLBAR_POSITION_RIGHT: + case SCROLLBAR_POSITION_DEFAULT: + default: + setPadding(left, top, scrollbarWidth, bottom); + break; + } + } else { + setPadding(0, top, 0, bottom); + } + } + + @Override + public boolean removeFooterView(View v) { + if (mFooterViewInfos.size() > 0) { + boolean result = false; + if (mAdapter != null && ((HeaderViewListAdapter) mAdapter).removeFooter(v)) { + invalidateViews(); + result = true; + } + removeViewInfo(v, mFooterViewInfos); + return result; + } + return false; + } + + @Override + public boolean removeHeaderView(View v) { + if (mHeaderViewInfos.size() > 0) { + boolean result = false; + if (mAdapter != null && ((HeaderViewListAdapter) mAdapter).removeHeader(v)) { + invalidateViews(); + result = true; + } + removeViewInfo(v, mHeaderViewInfos); + return result; + } + return false; + } + + private void removeViewInfo(View v, List where) { + int len = where.size(); + for (int i = 0; i < len; ++i) { + ViewInfo info = where.get(i); + if (info.view == v) { + where.remove(i); + break; + } + } + } + + protected void reportScrollStateChange(int newState) { + if (newState != mLastScrollState) { + if (mOnScrollListener != null) { + mLastScrollState = newState; + mOnScrollListener.onScrollStateChanged(this, newState); + } + } + } + + public final void setActivity(Activity activity) { + mActivity = activity; + if (mActivity != null) { + mActivity.addOnWindowFocusChangeListener(this); + } + } + + @Override + public void setAdapter(ListAdapter adapter) { + if (adapter == null) { + mAdapter = null; + } else if (mForceHeaderListAdapter || mHeaderViewInfos.size() > 0 + || mFooterViewInfos.size() > 0) { + mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, adapter, + mListAdapterCallback); + } else { + mAdapter = new ListAdapterWrapper(adapter, mListAdapterCallback); + } + if (mAdapter != null) { + mAdapterHasStableIds = mAdapter.hasStableIds(); + if (mChoiceMode != CHOICE_MODE_NONE && mAdapterHasStableIds && + mCheckedIdStates == null) { + mCheckedIdStates = new LongSparseArray(); + } + } + if (mCheckStates != null) { + mCheckStates.clear(); + } + if (mCheckedIdStates != null) { + mCheckedIdStates.clear(); + } + super.setAdapter(mAdapter); + } + + @Override + public void setChoiceMode(int choiceMode) { + mChoiceMode = choiceMode; + if (mChoiceActionMode != null) { + mChoiceActionMode.finish(); + mChoiceActionMode = null; + } + if (mChoiceMode != CHOICE_MODE_NONE) { + if (mCheckStates == null) { + mCheckStates = new SparseBooleanArray(); + } + if (mCheckedIdStates == null && mAdapter != null && mAdapter.hasStableIds()) { + mCheckedIdStates = new LongSparseArray(); + } + if (mChoiceMode == CHOICE_MODE_MULTIPLE_MODAL) { + clearChoices(); + setLongClickable(true); + setEnableModalBackgroundWrapper(true); + } + } + } + + public void setEnableModalBackgroundWrapper(boolean enableModalBackgroundWrapper) { + if (enableModalBackgroundWrapper == mEnableModalBackgroundWrapper) { + return; + } + mEnableModalBackgroundWrapper = enableModalBackgroundWrapper; + if (mAdapter != null) { + mAdapter.notifyDataSetChanged(); + } + } + + @Override + public void setFastScrollAlwaysVisible(boolean alwaysShow) { + if (alwaysShow && !mFastScrollEnabled) { + setFastScrollEnabled(true); + } + if (mFastScroller != null) { + mFastScroller.setAlwaysShow(alwaysShow); + } + try { + Method method = View.class.getDeclaredMethod("computeOpaqueFlags"); + method.setAccessible(true); + method.invoke(this); + method = View.class.getDeclaredMethod("recomputePadding"); + method.setAccessible(true); + method.invoke(this); + } catch (Exception e) { + } + if (alwaysShow) { + setPaddingFromScroller(true); + } + } + + @Override + public void setFastScrollEnabled(boolean enabled) { + mFastScrollEnabled = enabled; + if (enabled) { + if (mFastScroller == null) { + mFastScroller = new FastScroller(getContext(), this); + } + } else { + if (mFastScroller != null) { + mFastScroller.stop(); + mFastScroller = null; + } + } + } + + public void setForceHeaderListAdapter(boolean forceHeaderListAdapter) { + mForceHeaderListAdapter = forceHeaderListAdapter; + } + + @Override + public void setItemChecked(int position, boolean value) { + if (mChoiceMode == CHOICE_MODE_NONE) { + return; + } + if (value && mChoiceMode == CHOICE_MODE_MULTIPLE_MODAL && mChoiceActionMode == null) { + mChoiceActionMode = startActionMode(mMultiChoiceModeCallback); + } + if (mChoiceMode == CHOICE_MODE_MULTIPLE || mChoiceMode == CHOICE_MODE_MULTIPLE_MODAL) { + boolean oldValue = mCheckStates.get(position); + mCheckStates.put(position, value); + if (mCheckedIdStates != null && mAdapter.hasStableIds()) { + if (value) { + mCheckedIdStates.put(mAdapter.getItemId(position), position); + } else { + mCheckedIdStates.delete(mAdapter.getItemId(position)); + } + } + if (oldValue != value) { + if (value) { + mCheckedItemCount++; + } else { + mCheckedItemCount--; + } + } + if (mChoiceActionMode != null) { + final long id = mAdapter.getItemId(position); + mMultiChoiceModeCallback.onItemCheckedStateChanged(mChoiceActionMode, + position, id, value); + } + } else { + boolean updateIds = mCheckedIdStates != null && mAdapter.hasStableIds(); + if (value || isItemChecked(position)) { + mCheckStates.clear(); + if (updateIds) { + mCheckedIdStates.clear(); + } + } + if (value) { + mCheckStates.put(position, true); + if (updateIds) { + mCheckedIdStates.put(mAdapter.getItemId(position), position); + } + mCheckedItemCount = 1; + } else if (mCheckStates.size() == 0 || !mCheckStates.valueAt(0)) { + mCheckedItemCount = 0; + } + } + updateOnScreenCheckedViews(); + } + + public void setMultiChoiceModeListener(MultiChoiceModeListener listener) { + if (mMultiChoiceModeCallback == null) { + mMultiChoiceModeCallback = new MultiChoiceModeWrapper(); + } + mMultiChoiceModeCallback.setWrapped(listener); + } + + @Override + public void setOnItemLongClickListener(OnItemLongClickListener listener) { + mOnItemLongClickListenerWrapper.setWrapped(listener); + } + + @Override + public void setOnScrollListener(OnScrollListener l) { + super.setOnScrollListener(mOnScrollListener = l); + } + + public void setPaddingFromScroller(boolean paddingFromScroller) { + mPaddingFromScroller = paddingFromScroller; + recomputePaddingFromScroller(); + } + + @Override + public void setSelectionAfterHeaderView() { + setSelection(mHeaderViewInfos.size()); + } + + @Override + public void setSelector(int resID) { + setSelector(DrawableCompat.getDrawable(getResources(), resID)); + } + + protected final void setStateOnView(View child, boolean value) { + if (child instanceof Checkable) { + ((Checkable) child).setChecked(value); + } else if (USE_ACTIVATED) { + child.setActivated(value); + } + } + + @Override + public void setVerticalScrollbarPosition(int position) { + mVerticalScrollbarPosition = position; + if (mFastScroller != null) { + mFastScroller.setScrollbarPosition(position); + } + recomputePaddingFromScroller(); + } + + @Override + public boolean showContextMenuForChild(View originalView) { + final int longPressPosition = getPositionForView(originalView); + if (longPressPosition >= 0) { + final long longPressId = mAdapter.getItemId(longPressPosition); + boolean handled = false; + if (mOnItemLongClickListenerWrapper.wrapped != null) { + handled = mOnItemLongClickListenerWrapper.wrapped.onItemLongClick(ListView.this, + originalView, longPressPosition, longPressId); + } + if (!handled) { + mContextMenuInfo = createContextMenuInfo(getChildAt(longPressPosition + - getFirstVisiblePosition()), longPressPosition, longPressId); + handled = super.showContextMenuForChild(originalView); + } + return handled; + } + return false; + } + + public ActionMode startActionMode(ActionMode.Callback callback) { + if (mActivity != null) { + return mActivity.startActionMode(callback); + } + throw new RuntimeException("HoloEverywhere.ListView (" + this + + ") don't have reference on Activity"); + } + + private void updateOnScreenCheckedViews() { + if (mCheckStates == null) { + return; + } + final int firstPos = getFirstVisiblePosition(); + final int count = getChildCount(); + for (int i = 0; i < count; i++) { + final View child = getChildAt(i); + final int position = firstPos + i; + final boolean value = mCheckStates.get(position); + setStateOnView(child, value); + } + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/MultiAutoCompleteTextView.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/MultiAutoCompleteTextView.java new file mode 100644 index 0000000000..39800cf444 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/MultiAutoCompleteTextView.java @@ -0,0 +1,179 @@ + +package org.holoeverywhere.widget; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.text.Editable; +import android.text.SpannableString; +import android.text.Spanned; +import android.text.TextUtils; +import android.text.method.QwertyKeyListener; +import android.util.AttributeSet; +import android.view.accessibility.AccessibilityEvent; +import android.view.accessibility.AccessibilityNodeInfo; +import android.widget.Filter; + +public class MultiAutoCompleteTextView extends AutoCompleteTextView { + public static class CommaTokenizer implements Tokenizer { + @Override + public int findTokenEnd(CharSequence text, int cursor) { + int i = cursor; + int len = text.length(); + while (i < len) { + if (text.charAt(i) == ',') { + return i; + } else { + i++; + } + } + return len; + } + + @Override + public int findTokenStart(CharSequence text, int cursor) { + int i = cursor; + while (i > 0 && text.charAt(i - 1) != ',') { + i--; + } + while (i < cursor && text.charAt(i) == ' ') { + i++; + } + return i; + } + + @Override + public CharSequence terminateToken(CharSequence text) { + int i = text.length(); + while (i > 0 && text.charAt(i - 1) == ' ') { + i--; + } + if (i > 0 && text.charAt(i - 1) == ',') { + return text; + } else { + if (text instanceof Spanned) { + SpannableString sp = new SpannableString(text + ", "); + TextUtils.copySpansFrom((Spanned) text, 0, text.length(), + Object.class, sp, 0); + return sp; + } else { + return text + ", "; + } + } + } + } + + public static interface Tokenizer { + public int findTokenEnd(CharSequence text, int cursor); + + public int findTokenStart(CharSequence text, int cursor); + + public CharSequence terminateToken(CharSequence text); + } + + private Tokenizer mTokenizer; + + public MultiAutoCompleteTextView(Context context) { + super(context); + } + + public MultiAutoCompleteTextView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public MultiAutoCompleteTextView(Context context, AttributeSet attrs, + int defStyle) { + super(context, attrs, defStyle); + } + + @Override + public boolean enoughToFilter() { + Editable text = getText(); + int end = getSelectionEnd(); + if (end < 0 || mTokenizer == null) { + return false; + } + int start = mTokenizer.findTokenStart(text, end); + if (end - start >= getThreshold()) { + return true; + } else { + return false; + } + } + + @Override + public void onInitializeAccessibilityEvent(AccessibilityEvent event) { + super.onInitializeAccessibilityEvent(event); + event.setClassName(MultiAutoCompleteTextView.class.getName()); + } + + @Override + @SuppressLint("NewApi") + public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { + super.onInitializeAccessibilityNodeInfo(info); + info.setClassName(MultiAutoCompleteTextView.class.getName()); + } + + @Override + protected void onLoadEntries(CharSequence[] entries) { + super.onLoadEntries(entries); + if (mTokenizer == null) { + setTokenizer(new CommaTokenizer()); + } + } + + @Override + protected void performFiltering(CharSequence text, int keyCode) { + if (enoughToFilter()) { + int end = getSelectionEnd(); + int start = mTokenizer.findTokenStart(text, end); + performFiltering(text, start, end, keyCode); + } else { + dismissDropDown(); + Filter f = getFilter(); + if (f != null) { + f.filter(null); + } + } + } + + protected void performFiltering(CharSequence text, int start, int end, + int keyCode) { + getFilter().filter(text.subSequence(start, end), this); + } + + @Override + public void performValidation() { + Validator v = getValidator(); + if (v == null || mTokenizer == null) { + return; + } + Editable e = getText(); + int i = getText().length(); + while (i > 0) { + int start = mTokenizer.findTokenStart(e, i); + int end = mTokenizer.findTokenEnd(e, start); + CharSequence sub = e.subSequence(start, end); + if (TextUtils.isEmpty(sub)) { + e.replace(start, i, ""); + } else if (!v.isValid(sub)) { + e.replace(start, i, mTokenizer.terminateToken(v.fixText(sub))); + } + i = start; + } + } + + @Override + protected void replaceText(CharSequence text) { + clearComposingText(); + int end = getSelectionEnd(); + int start = mTokenizer.findTokenStart(getText(), end); + Editable editable = getText(); + String original = TextUtils.substring(editable, start, end); + QwertyKeyListener.markAsReplaced(editable, start, end, original); + editable.replace(start, end, mTokenizer.terminateToken(text)); + } + + public void setTokenizer(Tokenizer t) { + mTokenizer = t; + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/NumberPicker.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/NumberPicker.java new file mode 100644 index 0000000000..69e846c16b --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/NumberPicker.java @@ -0,0 +1,1388 @@ + +package org.holoeverywhere.widget; + +import java.util.ArrayList; + +import org.holoeverywhere.LayoutInflater; +import org.holoeverywhere.R; +import org.holoeverywhere.internal.NumberPickerEditText; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.res.ColorStateList; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Paint.Align; +import android.graphics.drawable.Drawable; +import android.os.Build.VERSION; +import android.text.InputFilter; +import android.text.InputType; +import android.text.Spanned; +import android.text.TextUtils; +import android.text.method.NumberKeyListener; +import android.util.AttributeSet; +import android.util.SparseArray; +import android.util.TypedValue; +import android.view.KeyEvent; +import android.view.MotionEvent; +import android.view.VelocityTracker; +import android.view.View; +import android.view.ViewConfiguration; +import android.view.accessibility.AccessibilityEvent; +import android.view.accessibility.AccessibilityManager; +import android.view.accessibility.AccessibilityNodeInfo; +import android.view.animation.DecelerateInterpolator; +import android.view.inputmethod.EditorInfo; +import android.view.inputmethod.InputMethodManager; +import android.widget.ImageButton; + +public class NumberPicker extends LinearLayout { + class BeginSoftInputOnLongPressCommand implements Runnable { + @Override + public void run() { + showSoftInput(); + mIngonreMoveEvents = true; + } + } + + class ChangeCurrentByOneFromLongPressCommand implements Runnable { + private boolean mIncrement; + + @Override + public void run() { + changeValueByOne(mIncrement); + postDelayed(this, mLongPressUpdateInterval); + } + + private void setStep(boolean increment) { + mIncrement = increment; + } + } + + public interface Formatter { + public String format(int value); + } + + class InputTextFilter extends NumberKeyListener { + @Override + public CharSequence filter(CharSequence source, int start, int end, + Spanned dest, int dstart, int dend) { + if (mDisplayedValues == null) { + CharSequence filtered = super.filter(source, start, end, dest, + dstart, dend); + if (filtered == null) { + filtered = source.subSequence(start, end); + } + String result = String.valueOf(dest.subSequence(0, dstart)) + + filtered + dest.subSequence(dend, dest.length()); + + if ("".equals(result)) { + return result; + } + int val = getSelectedPos(result); + if (val > mMaxValue) { + return ""; + } else { + return filtered; + } + } else { + CharSequence filtered = String.valueOf(source.subSequence( + start, end)); + if (TextUtils.isEmpty(filtered)) { + return ""; + } + String result = String.valueOf(dest.subSequence(0, dstart)) + + filtered + dest.subSequence(dend, dest.length()); + String str = String.valueOf(result).toLowerCase(); + for (String val : mDisplayedValues) { + String valLowerCase = val.toLowerCase(); + if (valLowerCase.startsWith(str)) { + postSetSelectionCommand(result.length(), val.length()); + return val.subSequence(dstart, val.length()); + } + } + return ""; + } + } + + @Override + protected char[] getAcceptedChars() { + return NumberPicker.DIGIT_CHARACTERS; + } + + @Override + public int getInputType() { + return InputType.TYPE_CLASS_TEXT; + } + } + + public interface OnScrollListener { + public static int SCROLL_STATE_FLING = 2; + public static int SCROLL_STATE_IDLE = 0; + public static int SCROLL_STATE_TOUCH_SCROLL = 1; + + public void onScrollStateChange(NumberPicker view, int scrollState); + } + + public interface OnValueChangeListener { + void onValueChange(NumberPicker picker, int oldVal, int newVal); + } + + class PressedStateHelper implements Runnable { + public static final int BUTTON_DECREMENT = 2; + public static final int BUTTON_INCREMENT = 1; + private static final int MODE_PRESS = 1; + private static final int MODE_TAPPED = 2; + private int mManagedButton; + private int mMode; + + public void buttonPressDelayed(int button) { + cancel(); + mMode = MODE_PRESS; + mManagedButton = button; + postDelayed(this, ViewConfiguration.getTapTimeout()); + } + + public void buttonTapped(int button) { + cancel(); + mMode = MODE_TAPPED; + mManagedButton = button; + post(this); + } + + public void cancel() { + mMode = 0; + mManagedButton = 0; + removeCallbacks(this); + if (mIncrementVirtualButtonPressed) { + mIncrementVirtualButtonPressed = false; + invalidate(0, mBottomSelectionDividerBottom, getRight(), + getBottom()); + } + mDecrementVirtualButtonPressed = false; + if (mDecrementVirtualButtonPressed) { + invalidate(0, 0, getRight(), mTopSelectionDividerTop); + } + } + + @Override + public void run() { + switch (mMode) { + case MODE_PRESS: { + switch (mManagedButton) { + case BUTTON_INCREMENT: { + mIncrementVirtualButtonPressed = true; + invalidate(0, mBottomSelectionDividerBottom, getRight(), + getBottom()); + } + break; + case BUTTON_DECREMENT: { + mDecrementVirtualButtonPressed = true; + invalidate(0, 0, getRight(), mTopSelectionDividerTop); + } + } + } + break; + case MODE_TAPPED: { + switch (mManagedButton) { + case BUTTON_INCREMENT: { + if (!mIncrementVirtualButtonPressed) { + postDelayed(this, + ViewConfiguration.getPressedStateDuration()); + } + mIncrementVirtualButtonPressed ^= true; + invalidate(0, mBottomSelectionDividerBottom, getRight(), + getBottom()); + } + break; + case BUTTON_DECREMENT: { + if (!mDecrementVirtualButtonPressed) { + postDelayed(this, + ViewConfiguration.getPressedStateDuration()); + } + mDecrementVirtualButtonPressed ^= true; + invalidate(0, 0, getRight(), mTopSelectionDividerTop); + } + } + } + break; + } + } + } + + class SetSelectionCommand implements Runnable { + private int mSelectionEnd; + + private int mSelectionStart; + + @Override + public void run() { + mInputText.setSelection(mSelectionStart, mSelectionEnd); + } + } + + private static final int DEFAULT_LAYOUT_RESOURCE_ID = R.layout.number_picker_with_selector_wheel; + private static final long DEFAULT_LONG_PRESS_UPDATE_INTERVAL = 300; + private static final char[] DIGIT_CHARACTERS = new char[] { + '0', '1', '2', + '3', '4', '5', '6', '7', '8', '9' + }; + public static final int FOCUSABLES_ACCESSIBILITY = 0x00000002; + private static final int SELECTOR_ADJUSTMENT_DURATION_MILLIS = 800; + private static final int SELECTOR_MAX_FLING_VELOCITY_ADJUSTMENT = 8; + private static final int SELECTOR_WHEEL_ITEM_COUNT = 3; + private static final int SELECTOR_WHELL_MIDDLE_ITEM_INDEX = NumberPicker.SELECTOR_WHEEL_ITEM_COUNT / 2; + private static final int SIZE_UNSPECIFIED = -1; + private static final int SNAP_SCROLL_DURATION = 300; + private static final float TOP_AND_BOTTOM_FADING_EDGE_STRENGTH = 0.9f; + public static final NumberPicker.Formatter TWO_DIGIT_FORMATTER = new NumberPicker.Formatter() { + final Object[] mArgs = new Object[1]; + + final StringBuilder mBuilder = new StringBuilder(); + + final java.util.Formatter mFmt = new java.util.Formatter(mBuilder, + java.util.Locale.US); + + @Override + public String format(int value) { + mArgs[0] = value; + mBuilder.delete(0, mBuilder.length()); + mFmt.format("%02d", mArgs); + return mFmt.toString(); + } + }; + private static final int UNSCALED_DEFAULT_SELECTION_DIVIDER_HEIGHT = 2; + private static final int UNSCALED_DEFAULT_SELECTION_DIVIDERS_DISTANCE = 48; + private final Scroller mAdjustScroller; + private BeginSoftInputOnLongPressCommand mBeginSoftInputOnLongPressCommand; + private int mBottomSelectionDividerBottom; + private ChangeCurrentByOneFromLongPressCommand mChangeCurrentByOneFromLongPressCommand; + private final boolean mComputeMaxWidth; + private int mCurrentScrollOffset; + private final ImageButton mDecrementButton; + private boolean mDecrementVirtualButtonPressed; + private String[] mDisplayedValues; + private final Scroller mFlingScroller; + private Formatter mFormatter; + private final boolean mHasSelectorWheel; + private final ImageButton mIncrementButton; + private boolean mIncrementVirtualButtonPressed; + private boolean mIngonreMoveEvents; + private int mInitialScrollOffset = Integer.MIN_VALUE; + private final NumberPickerEditText mInputText; + private long mLastDownEventTime; + private float mLastDownEventY; + private float mLastDownOrMoveEventY; + private long mLongPressUpdateInterval = NumberPicker.DEFAULT_LONG_PRESS_UPDATE_INTERVAL; + private final int mMaxHeight; + private int mMaximumFlingVelocity; + private int mMaxValue; + private int mMaxWidth; + private final int mMinHeight; + private int mMinimumFlingVelocity; + private int mMinValue; + private final int mMinWidth; + private OnScrollListener mOnScrollListener; + private OnValueChangeListener mOnValueChangeListener; + private final PressedStateHelper mPressedStateHelper; + private int mPreviousScrollerY; + private int mScrollState = OnScrollListener.SCROLL_STATE_IDLE; + private final Drawable mSelectionDivider; + private final int mSelectionDividerHeight; + private final int mSelectionDividersDistance; + private int mSelectorElementHeight; + private final SparseArray mSelectorIndexToStringCache = new SparseArray(); + private final int[] mSelectorIndices = new int[NumberPicker.SELECTOR_WHEEL_ITEM_COUNT]; + private int mSelectorTextGapHeight; + private final Paint mSelectorWheelPaint; + private SetSelectionCommand mSetSelectionCommand; + private boolean mShowSoftInputOnTap; + private final int mSolidColor; + private final int mTextSize; + private int mTopSelectionDividerTop; + private int mTouchSlop; + private int mValue; + private VelocityTracker mVelocityTracker; + private final Drawable mVirtualButtonPressedDrawable; + private boolean mWrapSelectorWheel; + + public NumberPicker(Context context) { + this(context, null); + } + + public NumberPicker(Context context, AttributeSet attrs) { + this(context, attrs, R.attr.numberPickerStyle); + } + + @SuppressLint("NewApi") + public NumberPicker(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + TypedArray attributesArray = context.obtainStyledAttributes(attrs, + R.styleable.NumberPicker, defStyle, R.style.Holo_NumberPicker); + final int layoutResId = attributesArray.getResourceId( + R.styleable.NumberPicker_android_layout, + NumberPicker.DEFAULT_LAYOUT_RESOURCE_ID); + mHasSelectorWheel = layoutResId == NumberPicker.DEFAULT_LAYOUT_RESOURCE_ID; + mSolidColor = attributesArray.getColor( + R.styleable.NumberPicker_solidColor, 0); + mSelectionDivider = attributesArray + .getDrawable(R.styleable.NumberPicker_selectionDivider); + final int defSelectionDividerHeight = (int) TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_DIP, + NumberPicker.UNSCALED_DEFAULT_SELECTION_DIVIDER_HEIGHT, + getResources().getDisplayMetrics()); + mSelectionDividerHeight = attributesArray.getDimensionPixelSize( + R.styleable.NumberPicker_selectionDividerHeight, + defSelectionDividerHeight); + final int defSelectionDividerDistance = (int) TypedValue + .applyDimension( + TypedValue.COMPLEX_UNIT_DIP, + NumberPicker.UNSCALED_DEFAULT_SELECTION_DIVIDERS_DISTANCE, + getResources().getDisplayMetrics()); + mSelectionDividersDistance = attributesArray.getDimensionPixelSize( + R.styleable.NumberPicker_selectionDividersDistance, + defSelectionDividerDistance); + mMinHeight = attributesArray.getDimensionPixelSize( + R.styleable.NumberPicker_android_minHeight, + NumberPicker.SIZE_UNSPECIFIED); + mMaxHeight = attributesArray.getDimensionPixelSize( + R.styleable.NumberPicker_android_maxHeight, + NumberPicker.SIZE_UNSPECIFIED); + if (mMinHeight != NumberPicker.SIZE_UNSPECIFIED + && mMaxHeight != NumberPicker.SIZE_UNSPECIFIED + && mMinHeight > mMaxHeight) { + throw new IllegalArgumentException("minHeight > maxHeight"); + } + mMinWidth = attributesArray.getDimensionPixelSize( + R.styleable.NumberPicker_android_minWidth, + NumberPicker.SIZE_UNSPECIFIED); + mMaxWidth = attributesArray.getDimensionPixelSize( + R.styleable.NumberPicker_android_maxWidth, + NumberPicker.SIZE_UNSPECIFIED); + if (mMinWidth != NumberPicker.SIZE_UNSPECIFIED + && mMaxWidth != NumberPicker.SIZE_UNSPECIFIED + && mMinWidth > mMaxWidth) { + throw new IllegalArgumentException("minWidth > maxWidth"); + } + mComputeMaxWidth = mMaxWidth == NumberPicker.SIZE_UNSPECIFIED; + mVirtualButtonPressedDrawable = attributesArray + .getDrawable(R.styleable.NumberPicker_virtualButtonPressedDrawable); + attributesArray.recycle(); + mPressedStateHelper = new PressedStateHelper(); + setWillNotDraw(!mHasSelectorWheel); + LayoutInflater.inflate(context, layoutResId, this, true); + OnClickListener onClickListener = new OnClickListener() { + @Override + public void onClick(View v) { + hideSoftInput(); + mInputText.clearFocus(); + if (v.getId() == R.id.increment) { + changeValueByOne(true); + } else { + changeValueByOne(false); + } + } + }; + OnLongClickListener onLongClickListener = new OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + hideSoftInput(); + mInputText.clearFocus(); + if (v.getId() == R.id.increment) { + postChangeCurrentByOneFromLongPress(true, 0); + } else { + postChangeCurrentByOneFromLongPress(false, 0); + } + return true; + } + }; + if (!mHasSelectorWheel) { + mIncrementButton = (ImageButton) findViewById(R.id.increment); + if (mIncrementButton != null) { + mIncrementButton.setOnClickListener(onClickListener); + mIncrementButton.setOnLongClickListener(onLongClickListener); + } + } else { + mIncrementButton = null; + } + if (!mHasSelectorWheel) { + mDecrementButton = (ImageButton) findViewById(R.id.decrement); + if (mDecrementButton != null) { + mDecrementButton.setOnClickListener(onClickListener); + mDecrementButton.setOnLongClickListener(onLongClickListener); + } + } else { + mDecrementButton = null; + } + mInputText = (NumberPickerEditText) findViewById(R.id.numberpicker_input); + mInputText.setOnFocusChangeListener(new OnFocusChangeListener() { + @Override + public void onFocusChange(View v, boolean hasFocus) { + if (hasFocus) { + mInputText.selectAll(); + } else { + mInputText.setSelection(0, 0); + validateInputTextView(mInputText); + } + } + }); + mInputText.setFilters(new InputFilter[] { + new InputTextFilter() + }); + mInputText.setRawInputType(InputType.TYPE_CLASS_NUMBER); + mInputText.setImeOptions(EditorInfo.IME_ACTION_DONE); + ViewConfiguration configuration = ViewConfiguration.get(context); + mTouchSlop = configuration.getScaledTouchSlop(); + mMinimumFlingVelocity = configuration.getScaledMinimumFlingVelocity(); + mMaximumFlingVelocity = configuration.getScaledMaximumFlingVelocity() + / NumberPicker.SELECTOR_MAX_FLING_VELOCITY_ADJUSTMENT; + mTextSize = (int) mInputText.getTextSize(); + Paint paint = new Paint(); + paint.setAntiAlias(true); + paint.setTextAlign(Align.CENTER); + paint.setTextSize(mTextSize); + paint.setTypeface(mInputText.getTypeface()); + ColorStateList colors = mInputText.getTextColors(); + int color = colors + .getColorForState(View.ENABLED_STATE_SET, Color.WHITE); + paint.setColor(color); + mSelectorWheelPaint = paint; + mFlingScroller = new Scroller(getContext(), null, true); + mAdjustScroller = new Scroller(getContext(), + new DecelerateInterpolator(2.5f)); + updateInputTextView(); + if (VERSION.SDK_INT >= 16 + && getImportantForAccessibility() == View.IMPORTANT_FOR_ACCESSIBILITY_AUTO) { + setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES); + } + } + + @Override + public void addFocusables(ArrayList views, int direction, + int focusableMode) { + if ((focusableMode & NumberPicker.FOCUSABLES_ACCESSIBILITY) == NumberPicker.FOCUSABLES_ACCESSIBILITY) { + views.add(this); + return; + } + super.addFocusables(views, direction, focusableMode); + } + + private void changeValueByOne(boolean increment) { + if (mHasSelectorWheel) { + mInputText.setVisibility(View.INVISIBLE); + if (!moveToFinalScrollerPosition(mFlingScroller)) { + moveToFinalScrollerPosition(mAdjustScroller); + } + mPreviousScrollerY = 0; + if (increment) { + mFlingScroller.startScroll(0, 0, 0, -mSelectorElementHeight, + NumberPicker.SNAP_SCROLL_DURATION); + } else { + mFlingScroller.startScroll(0, 0, 0, mSelectorElementHeight, + NumberPicker.SNAP_SCROLL_DURATION); + } + invalidate(); + } else { + if (increment) { + setValueInternal(mValue + 1, true); + } else { + setValueInternal(mValue - 1, true); + } + } + } + + @Override + public void computeScroll() { + Scroller scroller = mFlingScroller; + if (scroller.isFinished()) { + scroller = mAdjustScroller; + if (scroller.isFinished()) { + return; + } + } + scroller.computeScrollOffset(); + int currentScrollerY = scroller.getCurrY(); + if (mPreviousScrollerY == 0) { + mPreviousScrollerY = scroller.getStartY(); + } + scrollBy(0, currentScrollerY - mPreviousScrollerY); + mPreviousScrollerY = currentScrollerY; + if (scroller.isFinished()) { + onScrollerFinished(scroller); + } else { + invalidate(); + } + } + + private void decrementSelectorIndices(int[] selectorIndices) { + for (int i = selectorIndices.length - 1; i > 0; i--) { + selectorIndices[i] = selectorIndices[i - 1]; + } + int nextScrollSelectorIndex = selectorIndices[1] - 1; + if (mWrapSelectorWheel && nextScrollSelectorIndex < mMinValue) { + nextScrollSelectorIndex = mMaxValue; + } + selectorIndices[0] = nextScrollSelectorIndex; + ensureCachedScrollSelectorValue(nextScrollSelectorIndex); + } + + @Override + @SuppressLint("NewApi") + protected boolean dispatchHoverEvent(MotionEvent event) { + if (!mHasSelectorWheel) { + return super.dispatchHoverEvent(event); + } + if (((AccessibilityManager) getContext().getSystemService( + Context.ACCESSIBILITY_SERVICE)).isEnabled()) { + switch (event.getAction() & MotionEvent.ACTION_MASK) { + case MotionEvent.ACTION_HOVER_ENTER: { + sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_HOVER_ENTER); + if (VERSION.SDK_INT >= 16) { + performAccessibilityAction( + AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS, + null); + } + } + break; + case MotionEvent.ACTION_HOVER_MOVE: { + sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_HOVER_EXIT); + sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_HOVER_ENTER); + if (VERSION.SDK_INT >= 16) { + performAccessibilityAction( + AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS, + null); + } + } + break; + case MotionEvent.ACTION_HOVER_EXIT: { + sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_HOVER_EXIT); + } + break; + } + } + return false; + } + + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + final int keyCode = event.getKeyCode(); + switch (keyCode) { + case KeyEvent.KEYCODE_DPAD_CENTER: + case KeyEvent.KEYCODE_ENTER: + removeAllCallbacks(); + break; + } + return super.dispatchKeyEvent(event); + } + + @Override + public boolean dispatchTouchEvent(MotionEvent event) { + switch (event.getAction() & MotionEvent.ACTION_MASK) { + case MotionEvent.ACTION_CANCEL: + case MotionEvent.ACTION_UP: + removeAllCallbacks(); + break; + } + return super.dispatchTouchEvent(event); + } + + @Override + public boolean dispatchTrackballEvent(MotionEvent event) { + switch (event.getAction() & MotionEvent.ACTION_MASK) { + case MotionEvent.ACTION_CANCEL: + case MotionEvent.ACTION_UP: + removeAllCallbacks(); + break; + } + return super.dispatchTrackballEvent(event); + } + + private void ensureCachedScrollSelectorValue(int selectorIndex) { + SparseArray cache = mSelectorIndexToStringCache; + String scrollSelectorValue = cache.get(selectorIndex); + if (scrollSelectorValue != null) { + return; + } + if (selectorIndex < mMinValue || selectorIndex > mMaxValue) { + scrollSelectorValue = ""; + } else { + if (mDisplayedValues != null) { + int displayedValueIndex = selectorIndex - mMinValue; + scrollSelectorValue = mDisplayedValues[displayedValueIndex]; + } else { + scrollSelectorValue = formatNumber(selectorIndex); + } + } + cache.put(selectorIndex, scrollSelectorValue); + } + + private boolean ensureScrollWheelAdjusted() { + int deltaY = mInitialScrollOffset - mCurrentScrollOffset; + if (deltaY != 0) { + mPreviousScrollerY = 0; + if (Math.abs(deltaY) > mSelectorElementHeight / 2) { + deltaY += deltaY > 0 ? -mSelectorElementHeight + : mSelectorElementHeight; + } + mAdjustScroller.startScroll(0, 0, 0, deltaY, + NumberPicker.SELECTOR_ADJUSTMENT_DURATION_MILLIS); + invalidate(); + return true; + } + return false; + } + + private void fling(int velocityY) { + mPreviousScrollerY = 0; + if (velocityY > 0) { + mFlingScroller + .fling(0, 0, 0, velocityY, 0, 0, 0, Integer.MAX_VALUE); + } else { + mFlingScroller.fling(0, Integer.MAX_VALUE, 0, velocityY, 0, 0, 0, + Integer.MAX_VALUE); + } + invalidate(); + } + + private String formatNumber(int value) { + return mFormatter != null ? mFormatter.format(value) : String + .valueOf(value); + } + + @Override + protected float getBottomFadingEdgeStrength() { + return NumberPicker.TOP_AND_BOTTOM_FADING_EDGE_STRENGTH; + } + + public String[] getDisplayedValues() { + return mDisplayedValues; + } + + public NumberPickerEditText getInputField() { + return mInputText; + } + + public int getMaxValue() { + return mMaxValue; + } + + public int getMinValue() { + return mMinValue; + } + + private int getSelectedPos(String value) { + if (mDisplayedValues != null) { + for (int i = 0; i < mDisplayedValues.length; i++) { + value = value.toLowerCase(); + if (mDisplayedValues[i].toLowerCase().startsWith(value)) { + return mMinValue + i; + } + } + } + try { + return Integer.parseInt(value); + } catch (NumberFormatException e) { + } + return mMinValue; + } + + @Override + public int getSolidColor() { + return mSolidColor; + } + + @Override + protected float getTopFadingEdgeStrength() { + return NumberPicker.TOP_AND_BOTTOM_FADING_EDGE_STRENGTH; + } + + public int getValue() { + return mValue; + } + + private int getWrappedSelectorIndex(int selectorIndex) { + if (selectorIndex > mMaxValue) { + return mMinValue + (selectorIndex - mMaxValue) + % (mMaxValue - mMinValue) - 1; + } else if (selectorIndex < mMinValue) { + return mMaxValue - (mMinValue - selectorIndex) + % (mMaxValue - mMinValue) + 1; + } + return selectorIndex; + } + + public boolean getWrapSelectorWheel() { + return mWrapSelectorWheel; + } + + private void hideSoftInput() { + InputMethodManager inputMethodManager = (InputMethodManager) getContext() + .getSystemService(Context.INPUT_METHOD_SERVICE); + if (inputMethodManager != null + && inputMethodManager.isActive(mInputText)) { + inputMethodManager.hideSoftInputFromWindow(getWindowToken(), 0); + if (mHasSelectorWheel) { + mInputText.setVisibility(View.INVISIBLE); + } + } + } + + private void incrementSelectorIndices(int[] selectorIndices) { + for (int i = 0; i < selectorIndices.length - 1; i++) { + selectorIndices[i] = selectorIndices[i + 1]; + } + int nextScrollSelectorIndex = selectorIndices[selectorIndices.length - 2] + 1; + if (mWrapSelectorWheel && nextScrollSelectorIndex > mMaxValue) { + nextScrollSelectorIndex = mMinValue; + } + selectorIndices[selectorIndices.length - 1] = nextScrollSelectorIndex; + ensureCachedScrollSelectorValue(nextScrollSelectorIndex); + } + + private void initializeFadingEdges() { + setVerticalFadingEdgeEnabled(true); + setFadingEdgeLength((getBottom() - getTop() - mTextSize) / 2); + } + + private void initializeSelectorWheel() { + initializeSelectorWheelIndices(); + int[] selectorIndices = mSelectorIndices; + int totalTextHeight = selectorIndices.length * mTextSize; + float totalTextGapHeight = getBottom() - getTop() - totalTextHeight; + float textGapCount = selectorIndices.length; + mSelectorTextGapHeight = (int) (totalTextGapHeight / textGapCount + 0.5f); + mSelectorElementHeight = mTextSize + mSelectorTextGapHeight; + int editTextTextPosition = mInputText.getBaseline() + + mInputText.getTop(); + mInitialScrollOffset = editTextTextPosition - mSelectorElementHeight + * NumberPicker.SELECTOR_WHELL_MIDDLE_ITEM_INDEX; + mCurrentScrollOffset = mInitialScrollOffset; + updateInputTextView(); + } + + private void initializeSelectorWheelIndices() { + mSelectorIndexToStringCache.clear(); + int[] selectorIndices = mSelectorIndices; + int current = getValue(); + for (int i = 0; i < mSelectorIndices.length; i++) { + int selectorIndex = current + i + - NumberPicker.SELECTOR_WHELL_MIDDLE_ITEM_INDEX; + if (mWrapSelectorWheel) { + selectorIndex = getWrappedSelectorIndex(selectorIndex); + } + selectorIndices[i] = selectorIndex; + ensureCachedScrollSelectorValue(selectorIndices[i]); + } + } + + private int makeMeasureSpec(int measureSpec, int maxSize) { + if (maxSize == NumberPicker.SIZE_UNSPECIFIED) { + return measureSpec; + } + final int size = MeasureSpec.getSize(measureSpec); + final int mode = MeasureSpec.getMode(measureSpec); + switch (mode) { + case MeasureSpec.EXACTLY: + return measureSpec; + case MeasureSpec.AT_MOST: + return MeasureSpec.makeMeasureSpec(Math.min(size, maxSize), + MeasureSpec.EXACTLY); + case MeasureSpec.UNSPECIFIED: + return MeasureSpec.makeMeasureSpec(maxSize, MeasureSpec.EXACTLY); + default: + throw new IllegalArgumentException("Unknown measure mode: " + mode); + } + } + + private boolean moveToFinalScrollerPosition(Scroller scroller) { + scroller.forceFinished(true); + int amountToScroll = scroller.getFinalY() - scroller.getCurrY(); + int futureScrollOffset = (mCurrentScrollOffset + amountToScroll) + % mSelectorElementHeight; + int overshootAdjustment = mInitialScrollOffset - futureScrollOffset; + if (overshootAdjustment != 0) { + if (Math.abs(overshootAdjustment) > mSelectorElementHeight / 2) { + if (overshootAdjustment > 0) { + overshootAdjustment -= mSelectorElementHeight; + } else { + overshootAdjustment += mSelectorElementHeight; + } + } + amountToScroll += overshootAdjustment; + scrollBy(0, amountToScroll); + return true; + } + return false; + } + + private void notifyChange(int previous, int current) { + if (mOnValueChangeListener != null) { + mOnValueChangeListener.onValueChange(this, previous, mValue); + } + } + + @Override + protected void onDetachedFromWindow() { + removeAllCallbacks(); + } + + @Override + protected void onDraw(Canvas canvas) { + if (!mHasSelectorWheel) { + super.onDraw(canvas); + return; + } + float x = (getRight() - getLeft()) / 2; + float y = mCurrentScrollOffset; + if (mVirtualButtonPressedDrawable != null + && mScrollState == OnScrollListener.SCROLL_STATE_IDLE) { + if (mDecrementVirtualButtonPressed) { + + mVirtualButtonPressedDrawable + .setState(org.holoeverywhere.internal._View.PRESSED_STATE_SET); + mVirtualButtonPressedDrawable.setBounds(0, 0, getRight(), + mTopSelectionDividerTop); + mVirtualButtonPressedDrawable.draw(canvas); + } + if (mIncrementVirtualButtonPressed) { + mVirtualButtonPressedDrawable + .setState(org.holoeverywhere.internal._View.PRESSED_STATE_SET); + mVirtualButtonPressedDrawable.setBounds(0, + mBottomSelectionDividerBottom, getRight(), getBottom()); + mVirtualButtonPressedDrawable.draw(canvas); + } + } + int[] selectorIndices = mSelectorIndices; + for (int i = 0; i < selectorIndices.length; i++) { + int selectorIndex = selectorIndices[i]; + String scrollSelectorValue = mSelectorIndexToStringCache + .get(selectorIndex); + if (i != NumberPicker.SELECTOR_WHELL_MIDDLE_ITEM_INDEX + || mInputText.getVisibility() != View.VISIBLE) { + canvas.drawText(scrollSelectorValue, x, y, mSelectorWheelPaint); + } + y += mSelectorElementHeight; + } + if (mSelectionDivider != null) { + int topOfTopDivider = mTopSelectionDividerTop; + int bottomOfTopDivider = topOfTopDivider + mSelectionDividerHeight; + mSelectionDivider.setBounds(0, topOfTopDivider, getRight(), + bottomOfTopDivider); + mSelectionDivider.draw(canvas); + int bottomOfBottomDivider = mBottomSelectionDividerBottom; + int topOfBottomDivider = bottomOfBottomDivider + - mSelectionDividerHeight; + mSelectionDivider.setBounds(0, topOfBottomDivider, getRight(), + bottomOfBottomDivider); + mSelectionDivider.draw(canvas); + } + } + + @Override + @SuppressLint("NewApi") + public void onInitializeAccessibilityEvent(AccessibilityEvent event) { + super.onInitializeAccessibilityEvent(event); + event.setClassName(NumberPicker.class.getName()); + event.setScrollable(true); + event.setScrollY((mMinValue + mValue) * mSelectorElementHeight); + event.setMaxScrollY((mMaxValue - mMinValue) * mSelectorElementHeight); + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent event) { + if (!mHasSelectorWheel || !isEnabled()) { + return false; + } + switch (event.getAction() & MotionEvent.ACTION_MASK) { + case MotionEvent.ACTION_DOWN: { + removeAllCallbacks(); + mInputText.setVisibility(View.INVISIBLE); + mLastDownOrMoveEventY = mLastDownEventY = event.getY(); + mLastDownEventTime = event.getEventTime(); + mIngonreMoveEvents = false; + mShowSoftInputOnTap = false; + if (mLastDownEventY < mTopSelectionDividerTop) { + if (mScrollState == OnScrollListener.SCROLL_STATE_IDLE) { + mPressedStateHelper + .buttonPressDelayed(PressedStateHelper.BUTTON_DECREMENT); + } + } else if (mLastDownEventY > mBottomSelectionDividerBottom) { + if (mScrollState == OnScrollListener.SCROLL_STATE_IDLE) { + mPressedStateHelper + .buttonPressDelayed(PressedStateHelper.BUTTON_INCREMENT); + } + } + getParent().requestDisallowInterceptTouchEvent(true); + if (!mFlingScroller.isFinished()) { + mFlingScroller.forceFinished(true); + mAdjustScroller.forceFinished(true); + onScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE); + } else if (!mAdjustScroller.isFinished()) { + mFlingScroller.forceFinished(true); + mAdjustScroller.forceFinished(true); + } else if (mLastDownEventY < mTopSelectionDividerTop) { + hideSoftInput(); + postChangeCurrentByOneFromLongPress(false, + ViewConfiguration.getLongPressTimeout()); + } else if (mLastDownEventY > mBottomSelectionDividerBottom) { + hideSoftInput(); + postChangeCurrentByOneFromLongPress(true, + ViewConfiguration.getLongPressTimeout()); + } else { + mShowSoftInputOnTap = true; + postBeginSoftInputOnLongPressCommand(); + } + return true; + } + } + return false; + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, + int bottom) { + if (!mHasSelectorWheel) { + super.onLayout(changed, left, top, right, bottom); + return; + } + final int msrdWdth = getMeasuredWidth(); + final int msrdHght = getMeasuredHeight(); + final int inptTxtMsrdWdth = mInputText.getMeasuredWidth(); + final int inptTxtMsrdHght = mInputText.getMeasuredHeight(); + final int inptTxtLeft = (msrdWdth - inptTxtMsrdWdth) / 2; + final int inptTxtTop = (msrdHght - inptTxtMsrdHght) / 2; + final int inptTxtRight = inptTxtLeft + inptTxtMsrdWdth; + final int inptTxtBottom = inptTxtTop + inptTxtMsrdHght; + mInputText.layout(inptTxtLeft, inptTxtTop, inptTxtRight, inptTxtBottom); + if (changed) { + initializeSelectorWheel(); + initializeFadingEdges(); + mTopSelectionDividerTop = (getHeight() - mSelectionDividersDistance) + / 2 - mSelectionDividerHeight; + mBottomSelectionDividerBottom = mTopSelectionDividerTop + 2 + * mSelectionDividerHeight + mSelectionDividersDistance; + } + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + if (!mHasSelectorWheel) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + return; + } + final int newWidthMeasureSpec = makeMeasureSpec(widthMeasureSpec, + mMaxWidth); + final int newHeightMeasureSpec = makeMeasureSpec(heightMeasureSpec, + mMaxHeight); + super.onMeasure(newWidthMeasureSpec, newHeightMeasureSpec); + final int widthSize = resolveSizeAndStateRespectingMinSize(mMinWidth, + getMeasuredWidth(), widthMeasureSpec); + final int heightSize = resolveSizeAndStateRespectingMinSize(mMinHeight, + getMeasuredHeight(), heightMeasureSpec); + setMeasuredDimension(widthSize, heightSize); + } + + private void onScrollerFinished(Scroller scroller) { + if (scroller == mFlingScroller) { + if (!ensureScrollWheelAdjusted()) { + updateInputTextView(); + } + onScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE); + } else { + if (mScrollState != OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) { + updateInputTextView(); + } + } + } + + private void onScrollStateChange(int scrollState) { + if (mScrollState == scrollState) { + return; + } + mScrollState = scrollState; + if (mOnScrollListener != null) { + mOnScrollListener.onScrollStateChange(this, scrollState); + } + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + if (!isEnabled() || !mHasSelectorWheel) { + return false; + } + if (mVelocityTracker == null) { + mVelocityTracker = VelocityTracker.obtain(); + } + mVelocityTracker.addMovement(event); + switch (event.getAction() & MotionEvent.ACTION_MASK) { + case MotionEvent.ACTION_MOVE: { + if (mIngonreMoveEvents) { + break; + } + float currentMoveY = event.getY(); + if (mScrollState != OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) { + int deltaDownY = (int) Math.abs(currentMoveY - mLastDownEventY); + if (deltaDownY > mTouchSlop) { + removeAllCallbacks(); + onScrollStateChange(OnScrollListener.SCROLL_STATE_TOUCH_SCROLL); + } + } else { + int deltaMoveY = (int) (currentMoveY - mLastDownOrMoveEventY); + scrollBy(0, deltaMoveY); + invalidate(); + } + mLastDownOrMoveEventY = currentMoveY; + } + break; + case MotionEvent.ACTION_UP: { + removeBeginSoftInputCommand(); + removeChangeCurrentByOneFromLongPress(); + mPressedStateHelper.cancel(); + VelocityTracker velocityTracker = mVelocityTracker; + velocityTracker.computeCurrentVelocity(1000, mMaximumFlingVelocity); + int initialVelocity = (int) velocityTracker.getYVelocity(); + if (Math.abs(initialVelocity) > mMinimumFlingVelocity) { + fling(initialVelocity); + onScrollStateChange(OnScrollListener.SCROLL_STATE_FLING); + } else { + int eventY = (int) event.getY(); + int deltaMoveY = (int) Math.abs(eventY - mLastDownEventY); + long deltaTime = event.getEventTime() - mLastDownEventTime; + if (deltaMoveY <= mTouchSlop + && deltaTime < ViewConfiguration.getTapTimeout()) { + if (mShowSoftInputOnTap) { + mShowSoftInputOnTap = false; + showSoftInput(); + } else { + int selectorIndexOffset = eventY + / mSelectorElementHeight + - NumberPicker.SELECTOR_WHELL_MIDDLE_ITEM_INDEX; + if (selectorIndexOffset > 0) { + changeValueByOne(true); + mPressedStateHelper + .buttonTapped(PressedStateHelper.BUTTON_INCREMENT); + } else if (selectorIndexOffset < 0) { + changeValueByOne(false); + mPressedStateHelper + .buttonTapped(PressedStateHelper.BUTTON_DECREMENT); + } + } + } else { + ensureScrollWheelAdjusted(); + } + onScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE); + } + mVelocityTracker.recycle(); + mVelocityTracker = null; + } + break; + } + return true; + } + + private void postBeginSoftInputOnLongPressCommand() { + if (mBeginSoftInputOnLongPressCommand == null) { + mBeginSoftInputOnLongPressCommand = new BeginSoftInputOnLongPressCommand(); + } else { + removeCallbacks(mBeginSoftInputOnLongPressCommand); + } + postDelayed(mBeginSoftInputOnLongPressCommand, + ViewConfiguration.getLongPressTimeout()); + } + + private void postChangeCurrentByOneFromLongPress(boolean increment, + long delayMillis) { + if (mChangeCurrentByOneFromLongPressCommand == null) { + mChangeCurrentByOneFromLongPressCommand = new ChangeCurrentByOneFromLongPressCommand(); + } else { + removeCallbacks(mChangeCurrentByOneFromLongPressCommand); + } + mChangeCurrentByOneFromLongPressCommand.setStep(increment); + postDelayed(mChangeCurrentByOneFromLongPressCommand, delayMillis); + } + + private void postSetSelectionCommand(int selectionStart, int selectionEnd) { + if (mSetSelectionCommand == null) { + mSetSelectionCommand = new SetSelectionCommand(); + } else { + removeCallbacks(mSetSelectionCommand); + } + mSetSelectionCommand.mSelectionStart = selectionStart; + mSetSelectionCommand.mSelectionEnd = selectionEnd; + post(mSetSelectionCommand); + } + + private void removeAllCallbacks() { + if (mChangeCurrentByOneFromLongPressCommand != null) { + removeCallbacks(mChangeCurrentByOneFromLongPressCommand); + } + if (mSetSelectionCommand != null) { + removeCallbacks(mSetSelectionCommand); + } + if (mBeginSoftInputOnLongPressCommand != null) { + removeCallbacks(mBeginSoftInputOnLongPressCommand); + } + mPressedStateHelper.cancel(); + } + + private void removeBeginSoftInputCommand() { + if (mBeginSoftInputOnLongPressCommand != null) { + removeCallbacks(mBeginSoftInputOnLongPressCommand); + } + } + + private void removeChangeCurrentByOneFromLongPress() { + if (mChangeCurrentByOneFromLongPressCommand != null) { + removeCallbacks(mChangeCurrentByOneFromLongPressCommand); + } + } + + private int resolveSizeAndStateRespectingMinSize(int minSize, + int measuredSize, int measureSpec) { + if (minSize != NumberPicker.SIZE_UNSPECIFIED) { + final int desiredWidth = Math.max(minSize, measuredSize); + return org.holoeverywhere.internal._View + .supportResolveSizeAndState(desiredWidth, measureSpec, 0); + } else { + return measuredSize; + } + } + + @Override + public void scrollBy(int x, int y) { + int[] selectorIndices = mSelectorIndices; + if (!mWrapSelectorWheel + && y > 0 + && selectorIndices[NumberPicker.SELECTOR_WHELL_MIDDLE_ITEM_INDEX] <= mMinValue) { + mCurrentScrollOffset = mInitialScrollOffset; + return; + } + if (!mWrapSelectorWheel + && y < 0 + && selectorIndices[NumberPicker.SELECTOR_WHELL_MIDDLE_ITEM_INDEX] >= mMaxValue) { + mCurrentScrollOffset = mInitialScrollOffset; + return; + } + mCurrentScrollOffset += y; + while (mCurrentScrollOffset - mInitialScrollOffset > mSelectorTextGapHeight) { + mCurrentScrollOffset -= mSelectorElementHeight; + decrementSelectorIndices(selectorIndices); + setValueInternal( + selectorIndices[NumberPicker.SELECTOR_WHELL_MIDDLE_ITEM_INDEX], + true); + if (!mWrapSelectorWheel + && selectorIndices[NumberPicker.SELECTOR_WHELL_MIDDLE_ITEM_INDEX] <= mMinValue) { + mCurrentScrollOffset = mInitialScrollOffset; + } + } + while (mCurrentScrollOffset - mInitialScrollOffset < -mSelectorTextGapHeight) { + mCurrentScrollOffset += mSelectorElementHeight; + incrementSelectorIndices(selectorIndices); + setValueInternal( + selectorIndices[NumberPicker.SELECTOR_WHELL_MIDDLE_ITEM_INDEX], + true); + if (!mWrapSelectorWheel + && selectorIndices[NumberPicker.SELECTOR_WHELL_MIDDLE_ITEM_INDEX] >= mMaxValue) { + mCurrentScrollOffset = mInitialScrollOffset; + } + } + } + + public void setDisplayedValues(String[] displayedValues) { + if (mDisplayedValues == displayedValues) { + return; + } + mDisplayedValues = displayedValues; + if (mDisplayedValues != null) { + mInputText.setRawInputType(InputType.TYPE_CLASS_TEXT + | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); + } else { + mInputText.setRawInputType(InputType.TYPE_CLASS_NUMBER); + } + updateInputTextView(); + initializeSelectorWheelIndices(); + tryComputeMaxWidth(); + } + + @Override + public void setEnabled(boolean enabled) { + super.setEnabled(enabled); + if (!mHasSelectorWheel) { + mIncrementButton.setEnabled(enabled); + } + if (!mHasSelectorWheel) { + mDecrementButton.setEnabled(enabled); + } + mInputText.setEnabled(enabled); + } + + public void setFormatter(Formatter formatter) { + if (formatter == mFormatter) { + return; + } + mFormatter = formatter; + initializeSelectorWheelIndices(); + updateInputTextView(); + } + + public void setMaxValue(int maxValue) { + if (mMaxValue == maxValue) { + return; + } + if (maxValue < 0) { + throw new IllegalArgumentException("maxValue must be >= 0"); + } + mMaxValue = maxValue; + if (mMaxValue < mValue) { + mValue = mMaxValue; + } + boolean wrapSelectorWheel = mMaxValue - mMinValue > mSelectorIndices.length; + setWrapSelectorWheel(wrapSelectorWheel); + initializeSelectorWheelIndices(); + updateInputTextView(); + tryComputeMaxWidth(); + invalidate(); + } + + public void setMinValue(int minValue) { + if (mMinValue == minValue) { + return; + } + if (minValue < 0) { + throw new IllegalArgumentException("minValue must be >= 0"); + } + mMinValue = minValue; + if (mMinValue > mValue) { + mValue = mMinValue; + } + boolean wrapSelectorWheel = mMaxValue - mMinValue > mSelectorIndices.length; + setWrapSelectorWheel(wrapSelectorWheel); + initializeSelectorWheelIndices(); + updateInputTextView(); + tryComputeMaxWidth(); + invalidate(); + } + + public void setOnLongPressUpdateInterval(long intervalMillis) { + mLongPressUpdateInterval = intervalMillis; + } + + public void setOnScrollListener(OnScrollListener onScrollListener) { + mOnScrollListener = onScrollListener; + } + + public void setOnValueChangedListener( + OnValueChangeListener onValueChangedListener) { + mOnValueChangeListener = onValueChangedListener; + } + + public void setValue(int value) { + setValueInternal(value, false); + } + + private void setValueInternal(int current, boolean notifyChange) { + if (mValue == current) { + return; + } + if (mWrapSelectorWheel) { + current = getWrappedSelectorIndex(current); + } else { + current = Math.max(current, mMinValue); + current = Math.min(current, mMaxValue); + } + int previous = mValue; + mValue = current; + updateInputTextView(); + if (notifyChange) { + notifyChange(previous, current); + } + initializeSelectorWheelIndices(); + invalidate(); + } + + public void setWrapSelectorWheel(boolean wrapSelectorWheel) { + final boolean wrappingAllowed = mMaxValue - mMinValue >= mSelectorIndices.length; + if ((!wrapSelectorWheel || wrappingAllowed) + && wrapSelectorWheel != mWrapSelectorWheel) { + mWrapSelectorWheel = wrapSelectorWheel; + } + } + + private void showSoftInput() { + InputMethodManager inputMethodManager = (InputMethodManager) getContext() + .getSystemService(Context.INPUT_METHOD_SERVICE); + if (inputMethodManager != null) { + if (mHasSelectorWheel) { + mInputText.setVisibility(View.VISIBLE); + } + mInputText.requestFocus(); + inputMethodManager.showSoftInput(mInputText, 0); + } + } + + private void tryComputeMaxWidth() { + if (!mComputeMaxWidth) { + return; + } + int maxTextWidth = 0; + if (mDisplayedValues == null) { + float maxDigitWidth = 0; + for (int i = 0; i <= 9; i++) { + final float digitWidth = mSelectorWheelPaint.measureText(String + .valueOf(i)); + if (digitWidth > maxDigitWidth) { + maxDigitWidth = digitWidth; + } + } + int numberOfDigits = 0; + int current = mMaxValue; + while (current > 0) { + numberOfDigits++; + current = current / 10; + } + maxTextWidth = (int) (numberOfDigits * maxDigitWidth); + } else { + final int valueCount = mDisplayedValues.length; + for (int i = 0; i < valueCount; i++) { + final float textWidth = mSelectorWheelPaint + .measureText(mDisplayedValues[i]); + if (textWidth > maxTextWidth) { + maxTextWidth = (int) textWidth; + } + } + } + maxTextWidth += mInputText.getPaddingLeft() + + mInputText.getPaddingRight(); + if (mMaxWidth != maxTextWidth) { + if (maxTextWidth > mMinWidth) { + mMaxWidth = maxTextWidth; + } else { + mMaxWidth = mMinWidth; + } + invalidate(); + } + } + + private boolean updateInputTextView() { + String text = mDisplayedValues == null ? formatNumber(mValue) + : mDisplayedValues[mValue - mMinValue]; + if (!TextUtils.isEmpty(text) + && !text.equals(mInputText.getText().toString())) { + mInputText.setText(text); + return true; + } + return false; + } + + private void validateInputTextView(NumberPickerEditText v) { + String str = String.valueOf(v.getText()); + if (TextUtils.isEmpty(str)) { + updateInputTextView(); + } else { + int current = getSelectedPos(str.toString()); + setValueInternal(current, true); + } + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/PopupMenu.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/PopupMenu.java new file mode 100644 index 0000000000..bccefe2dad --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/PopupMenu.java @@ -0,0 +1,102 @@ + +package org.holoeverywhere.widget; + +import android.content.Context; +import android.view.View; + +import com.actionbarsherlock.internal.view.menu.MenuBuilder; +import com.actionbarsherlock.internal.view.menu.MenuPopupHelper; +import com.actionbarsherlock.internal.view.menu.MenuPresenter; +import com.actionbarsherlock.internal.view.menu.PopupMenuHelper; +import com.actionbarsherlock.internal.view.menu.SubMenuBuilder; +import com.actionbarsherlock.view.Menu; +import com.actionbarsherlock.view.MenuInflater; +import com.actionbarsherlock.view.MenuItem; + +public class PopupMenu implements MenuBuilder.Callback, MenuPresenter.Callback { + public interface OnDismissListener { + public void onDismiss(PopupMenu menu); + } + + public interface OnMenuItemClickListener { + public boolean onMenuItemClick(MenuItem item); + } + + private View mAnchor; + private Context mContext; + private OnDismissListener mDismissListener; + private MenuBuilder mMenu; + private OnMenuItemClickListener mMenuItemClickListener; + private PopupMenuHelper mPopup; + + public PopupMenu(Context context, View anchor) { + mContext = context; + mMenu = new MenuBuilder(context); + mMenu.setCallback(this); + mAnchor = anchor; + mPopup = new PopupMenuHelper(context, mMenu, mAnchor); + mPopup.setCallback(this); + } + + public void dismiss() { + mPopup.dismiss(); + } + + public Menu getMenu() { + return mMenu; + } + + public MenuInflater getMenuInflater() { + return new MenuInflater(mContext); + } + + public void inflate(int menuRes) { + getMenuInflater().inflate(menuRes, mMenu); + } + + @Override + public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { + if (mDismissListener != null) { + mDismissListener.onDismiss(this); + } + } + + public void onCloseSubMenu(SubMenuBuilder menu) { + } + + @Override + public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) { + if (mMenuItemClickListener != null) { + return mMenuItemClickListener.onMenuItemClick(item); + } + return false; + } + + @Override + public void onMenuModeChange(MenuBuilder menu) { + } + + @Override + public boolean onOpenSubMenu(MenuBuilder subMenu) { + if (subMenu == null) { + return false; + } + if (!subMenu.hasVisibleItems()) { + return true; + } + new MenuPopupHelper(mContext, subMenu, mAnchor).show(); + return true; + } + + public void setOnDismissListener(OnDismissListener listener) { + mDismissListener = listener; + } + + public void setOnMenuItemClickListener(OnMenuItemClickListener listener) { + mMenuItemClickListener = listener; + } + + public void show() { + mPopup.show(); + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/PopupWindow.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/PopupWindow.java new file mode 100644 index 0000000000..6f30bf7137 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/PopupWindow.java @@ -0,0 +1,844 @@ + +package org.holoeverywhere.widget; + +import java.lang.ref.WeakReference; + +import org.holoeverywhere.R; +import org.holoeverywhere.drawable.DrawableCompat; +import org.holoeverywhere.drawable.StateListDrawable; + +import android.content.Context; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.graphics.PixelFormat; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.os.Build.VERSION; +import android.os.Build.VERSION_CODES; +import android.os.IBinder; +import android.util.AttributeSet; +import android.view.Gravity; +import android.view.KeyEvent; +import android.view.MotionEvent; +import android.view.View; +import android.view.View.OnTouchListener; +import android.view.ViewGroup; +import android.view.ViewTreeObserver; +import android.view.ViewTreeObserver.OnScrollChangedListener; +import android.view.WindowManager; + +public class PopupWindow { + public interface OnDismissListener { + public void onDismiss(); + } + + private class PopupViewContainer extends FrameLayout { + public PopupViewContainer(Context context) { + super(context); + } + + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { + if (getKeyDispatcherState() == null) { + return super.dispatchKeyEvent(event); + } + + 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.isTracking(event) && !event.isCanceled()) { + dismiss(); + return true; + } + } + return super.dispatchKeyEvent(event); + } else { + return super.dispatchKeyEvent(event); + } + } + + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + if (mTouchInterceptor != null && mTouchInterceptor.onTouch(this, ev)) { + return true; + } + return super.dispatchTouchEvent(ev); + } + + @Override + protected int[] onCreateDrawableState(int extraSpace) { + if (mAboveAnchor) { + final int[] drawableState = super.onCreateDrawableState(extraSpace + 1); + View.mergeDrawableStates(drawableState, ABOVE_ANCHOR_STATE_SET); + return drawableState; + } else { + return super.onCreateDrawableState(extraSpace); + } + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + final int x = (int) event.getX(); + final int y = (int) event.getY(); + if (event.getAction() == MotionEvent.ACTION_DOWN + && (x < 0 || x >= getWidth() || y < 0 || y >= getHeight())) { + dismiss(); + return true; + } else if (event.getAction() == MotionEvent.ACTION_OUTSIDE) { + dismiss(); + return true; + } else { + return super.onTouchEvent(event); + } + } + + @Override + public void sendAccessibilityEvent(int eventType) { + if (mContentView != null) { + mContentView.sendAccessibilityEvent(eventType); + } else { + super.sendAccessibilityEvent(eventType); + } + } + } + + private static final int[] ABOVE_ANCHOR_STATE_SET = new int[] { + android.R.attr.state_above_anchor + }; + public static final int INPUT_METHOD_FROM_FOCUSABLE = 0; + public static final int INPUT_METHOD_NEEDED = 1; + public static final int INPUT_METHOD_NOT_NEEDED = 2; + private boolean mAboveAnchor; + private Drawable mAboveAnchorBackgroundDrawable; + private boolean mAllowScrollingAnchorParent = true; + private WeakReference mAnchor; + private int mAnchorXoff, mAnchorYoff; + private int mAnimationStyle = -1; + private Drawable mBackground; + private Drawable mBelowAnchorBackgroundDrawable; + private boolean mClippingEnabled = true; + private boolean mClipToScreen; + private View mContentView; + private Context mContext; + private int[] mDrawingLocation = new int[2]; + private boolean mFocusable; + private int mHeight; + private int mHeightMode; + private boolean mIgnoreCheekPress = false; + private int mInputMethodMode = INPUT_METHOD_FROM_FOCUSABLE; + private boolean mIsDropdown; + private boolean mIsShowing; + private int mLastHeight; + private int mLastWidth; + private boolean mLayoutInScreen; + private boolean mLayoutInsetDecor = false; + private boolean mNotTouchModal; + private OnDismissListener mOnDismissListener; + private OnScrollChangedListener mOnScrollChangedListener = + new OnScrollChangedListener() { + @Override + public void onScrollChanged() { + View anchor = mAnchor != null ? mAnchor.get() : null; + if (anchor != null && mPopupView != null) { + WindowManager.LayoutParams p = (WindowManager.LayoutParams) + mPopupView.getLayoutParams(); + + updateAboveAnchor(findDropDownPosition(anchor, p, mAnchorXoff, mAnchorYoff)); + update(p.x, p.y, -1, -1, true); + } + } + }; + private boolean mOutsideTouchable = false; + private int mPopupHeight; + private View mPopupView; + private int mPopupWidth; + private int[] mScreenLocation = new int[2]; + private int mSoftInputMode = WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED; + private int mSplitTouchEnabled = -1; + private Rect mTempRect = new Rect(); + private boolean mTouchable = true; + private OnTouchListener mTouchInterceptor; + private int mWidth; + private int mWidthMode; + private int mWindowLayoutType = WindowManager.LayoutParams.TYPE_APPLICATION_PANEL; + private WindowManager mWindowManager; + + public PopupWindow() { + this(null, 0, 0); + } + + public PopupWindow(Context context) { + this(context, null); + } + + public PopupWindow(Context context, AttributeSet attrs) { + this(context, attrs, R.attr.popupWindowStyle); + } + + public PopupWindow(Context context, AttributeSet attrs, int defStyle) { + this(context, attrs, defStyle, 0); + } + + public PopupWindow(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + mContext = context; + mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.PopupWindow, defStyleAttr, + defStyleRes); + mBackground = DrawableCompat + .getDrawable(a, R.styleable.PopupWindow_android_popupBackground); + final int animStyle = a.getResourceId(R.styleable.PopupWindow_android_popupAnimationStyle, + -1); + mAnimationStyle = animStyle == R.style.Holo_Animation_PopupWindow ? -1 : animStyle; + if (mBackground instanceof StateListDrawable) { + StateListDrawable background = (StateListDrawable) mBackground; + int aboveAnchorStateIndex = background.getStateDrawableIndex(ABOVE_ANCHOR_STATE_SET); + int count = background.getStateCount(); + int belowAnchorStateIndex = -1; + for (int i = 0; i < count; i++) { + if (i != aboveAnchorStateIndex) { + belowAnchorStateIndex = i; + break; + } + } + if (aboveAnchorStateIndex != -1 && belowAnchorStateIndex != -1) { + mAboveAnchorBackgroundDrawable = background.getStateDrawable(aboveAnchorStateIndex); + mBelowAnchorBackgroundDrawable = background.getStateDrawable(belowAnchorStateIndex); + } else { + mBelowAnchorBackgroundDrawable = null; + mAboveAnchorBackgroundDrawable = null; + } + } + a.recycle(); + } + + public PopupWindow(int width, int height) { + this(null, width, height); + } + + public PopupWindow(View contentView) { + this(contentView, 0, 0); + } + + public PopupWindow(View contentView, int width, int height) { + this(contentView, width, height, false); + } + + public PopupWindow(View contentView, int width, int height, boolean focusable) { + if (contentView != null) { + mContext = contentView.getContext(); + mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); + } + setContentView(contentView); + setWidth(width); + setHeight(height); + setFocusable(focusable); + } + + private int computeAnimationResource() { + if (mAnimationStyle == -1) { + if (mIsDropdown) { + return mAboveAnchor ? R.style.Holo_Animation_DropDownUp + : R.style.Holo_Animation_DropDownDown; + } + return 0; + } + return mAnimationStyle; + } + + private int computeFlags(int curFlags) { + curFlags &= ~( + WindowManager.LayoutParams.FLAG_IGNORE_CHEEK_PRESSES | + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | + WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | + WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH | + WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS | + WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM | + WindowManager.LayoutParams.FLAG_SPLIT_TOUCH); + if (mIgnoreCheekPress) { + curFlags |= WindowManager.LayoutParams.FLAG_IGNORE_CHEEK_PRESSES; + } + if (!mFocusable) { + curFlags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; + if (mInputMethodMode == INPUT_METHOD_NEEDED) { + curFlags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; + } + } else if (mInputMethodMode == INPUT_METHOD_NOT_NEEDED) { + curFlags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; + } + if (!mTouchable) { + curFlags |= WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE; + } + if (mOutsideTouchable) { + curFlags |= WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH; + } + if (!mClippingEnabled) { + curFlags |= WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS; + } + if (isSplitTouchEnabled()) { + curFlags |= WindowManager.LayoutParams.FLAG_SPLIT_TOUCH; + } + if (mLayoutInScreen) { + curFlags |= WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; + } + if (mLayoutInsetDecor) { + curFlags |= WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR; + } + if (mNotTouchModal) { + curFlags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; + } + return curFlags; + } + + private WindowManager.LayoutParams createPopupLayout(IBinder token) { + WindowManager.LayoutParams p = new WindowManager.LayoutParams(); + p.gravity = Gravity.LEFT | Gravity.TOP; + p.width = mLastWidth = mWidth; + p.height = mLastHeight = mHeight; + if (mBackground != null) { + p.format = mBackground.getOpacity(); + } else { + p.format = PixelFormat.TRANSLUCENT; + } + p.flags = computeFlags(p.flags); + p.type = mWindowLayoutType; + p.token = token; + p.softInputMode = mSoftInputMode; + p.setTitle("PopupWindow:" + Integer.toHexString(hashCode())); + return p; + } + + public void dismiss() { + if (isShowing() && mPopupView != null) { + mIsShowing = false; + unregisterForScrollChanged(); + try { + mWindowManager.removeViewImmediate(mPopupView); + } finally { + if (mPopupView != mContentView && mPopupView instanceof ViewGroup) { + ((ViewGroup) mPopupView).removeView(mContentView); + } + mPopupView = null; + if (mOnDismissListener != null) { + mOnDismissListener.onDismiss(); + } + } + } + } + + private boolean findDropDownPosition(View anchor, WindowManager.LayoutParams p, + int xoff, int yoff) { + final int anchorHeight = anchor.getHeight(); + anchor.getLocationInWindow(mDrawingLocation); + p.x = mDrawingLocation[0] + xoff; + p.y = mDrawingLocation[1] + anchorHeight + yoff; + boolean onTop = false; + p.gravity = Gravity.LEFT | Gravity.TOP; + anchor.getLocationOnScreen(mScreenLocation); + final Rect displayFrame = new Rect(); + anchor.getWindowVisibleDisplayFrame(displayFrame); + int screenY = mScreenLocation[1] + anchorHeight + yoff; + final View root = anchor.getRootView(); + if (screenY + mPopupHeight > displayFrame.bottom || + p.x + mPopupWidth - root.getWidth() > 0) { + if (mAllowScrollingAnchorParent) { + int scrollX = anchor.getScrollX(); + int scrollY = anchor.getScrollY(); + Rect r = new Rect(scrollX, scrollY, scrollX + mPopupWidth + xoff, + scrollY + mPopupHeight + anchor.getHeight() + yoff); + anchor.requestRectangleOnScreen(r, true); + } + anchor.getLocationInWindow(mDrawingLocation); + p.x = mDrawingLocation[0] + xoff; + p.y = mDrawingLocation[1] + anchor.getHeight() + yoff; + anchor.getLocationOnScreen(mScreenLocation); + onTop = displayFrame.bottom - mScreenLocation[1] - anchor.getHeight() - yoff < + mScreenLocation[1] - yoff - displayFrame.top; + if (onTop) { + p.gravity = Gravity.LEFT | Gravity.BOTTOM; + p.y = root.getHeight() - mDrawingLocation[1] + yoff; + } else { + p.y = mDrawingLocation[1] + anchor.getHeight() + yoff; + } + } + if (mClipToScreen) { + final int displayFrameWidth = displayFrame.right - displayFrame.left; + int right = p.x + p.width; + if (right > displayFrameWidth) { + p.x -= right - displayFrameWidth; + } + if (p.x < displayFrame.left) { + p.x = displayFrame.left; + p.width = Math.min(p.width, displayFrameWidth); + } + if (onTop) { + int popupTop = mScreenLocation[1] + yoff - mPopupHeight; + if (popupTop < 0) { + p.y += popupTop; + } + } else { + p.y = Math.max(p.y, displayFrame.top); + } + } + p.gravity |= Gravity.DISPLAY_CLIP_VERTICAL; + return onTop; + } + + public int getAnimationStyle() { + return mAnimationStyle; + } + + public Drawable getBackground() { + return mBackground; + } + + public View getContentView() { + return mContentView; + } + + public int getHeight() { + return mHeight; + } + + public int getInputMethodMode() { + return mInputMethodMode; + + } + + public int getMaxAvailableHeight(View anchor) { + return getMaxAvailableHeight(anchor, 0); + } + + public int getMaxAvailableHeight(View anchor, int yOffset) { + return getMaxAvailableHeight(anchor, yOffset, false); + } + + public int getMaxAvailableHeight(View anchor, int yOffset, boolean ignoreBottomDecorations) { + final Rect displayFrame = new Rect(); + anchor.getWindowVisibleDisplayFrame(displayFrame); + final int[] anchorPos = mDrawingLocation; + 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; + int returnedHeight = Math.max(distanceToBottom, distanceToTop); + if (mBackground != null) { + mBackground.getPadding(mTempRect); + returnedHeight -= mTempRect.top + mTempRect.bottom; + } + return returnedHeight; + } + + public int getSoftInputMode() { + return mSoftInputMode; + } + + public int getWidth() { + return mWidth; + } + + public int getWindowLayoutType() { + return mWindowLayoutType; + } + + private void invokePopup(WindowManager.LayoutParams p) { + if (mContext != null) { + p.packageName = mContext.getPackageName(); + } + if (VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH) { + mPopupView.setFitsSystemWindows(mLayoutInsetDecor); + } + mWindowManager.addView(mPopupView, p); + } + + public boolean isAboveAnchor() { + return mAboveAnchor; + } + + public boolean isClippingEnabled() { + return mClippingEnabled; + } + + public boolean isFocusable() { + return mFocusable; + } + + public boolean isLayoutInScreenEnabled() { + return mLayoutInScreen; + } + + public boolean isOutsideTouchable() { + return mOutsideTouchable; + } + + public boolean isShowing() { + return mIsShowing; + } + + public boolean isSplitTouchEnabled() { + if (mSplitTouchEnabled < 0 && mContext != null) { + return mContext.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.HONEYCOMB; + } + return mSplitTouchEnabled == 1; + } + + public boolean isTouchable() { + return mTouchable; + } + + @SuppressWarnings("deprecation") + private void preparePopup(WindowManager.LayoutParams p) { + if (mContentView == null || mContext == null || mWindowManager == null) { + throw new IllegalStateException("You must specify a valid content view by " + + "calling setContentView() before attempting to show the popup."); + } + if (mBackground != null) { + final ViewGroup.LayoutParams layoutParams = mContentView.getLayoutParams(); + int height = ViewGroup.LayoutParams.MATCH_PARENT; + if (layoutParams != null && + layoutParams.height == ViewGroup.LayoutParams.WRAP_CONTENT) { + height = ViewGroup.LayoutParams.WRAP_CONTENT; + } + PopupViewContainer popupViewContainer = new PopupViewContainer(mContext); + PopupViewContainer.LayoutParams listParams = new PopupViewContainer.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, height + ); + popupViewContainer.setBackgroundDrawable(mBackground); + popupViewContainer.addView(mContentView, listParams); + mPopupView = popupViewContainer; + } else { + mPopupView = mContentView; + } + mPopupWidth = p.width; + mPopupHeight = p.height; + } + + private void registerForScrollChanged(View anchor, int xoff, int yoff) { + unregisterForScrollChanged(); + mAnchor = new WeakReference(anchor); + ViewTreeObserver vto = anchor.getViewTreeObserver(); + if (vto != null) { + vto.addOnScrollChangedListener(mOnScrollChangedListener); + } + mAnchorXoff = xoff; + mAnchorYoff = yoff; + } + + void setAllowScrollingAnchorParent(boolean enabled) { + mAllowScrollingAnchorParent = enabled; + } + + public void setAnimationStyle(int animationStyle) { + mAnimationStyle = animationStyle; + } + + public void setBackgroundDrawable(Drawable background) { + mBackground = background; + } + + public void setClippingEnabled(boolean enabled) { + mClippingEnabled = enabled; + } + + public void setClipToScreenEnabled(boolean enabled) { + mClipToScreen = enabled; + setClippingEnabled(!enabled); + } + + public void setContentView(View contentView) { + if (isShowing()) { + return; + } + mContentView = contentView; + if (mContext == null && mContentView != null) { + mContext = mContentView.getContext(); + } + if (mWindowManager == null && mContext != null) { + mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); + } + } + + public void setFocusable(boolean focusable) { + mFocusable = focusable; + } + + public void setHeight(int height) { + mHeight = height; + } + + public void setIgnoreCheekPress() { + mIgnoreCheekPress = true; + } + + public void setInputMethodMode(int mode) { + mInputMethodMode = mode; + } + + public void setLayoutInScreenEnabled(boolean enabled) { + mLayoutInScreen = enabled; + } + + public void setLayoutInsetDecor(boolean enabled) { + mLayoutInsetDecor = enabled; + } + + public void setOnDismissListener(OnDismissListener onDismissListener) { + mOnDismissListener = onDismissListener; + } + + public void setOutsideTouchable(boolean touchable) { + mOutsideTouchable = touchable; + } + + public void setSoftInputMode(int mode) { + mSoftInputMode = mode; + } + + public void setSplitTouchEnabled(boolean enabled) { + mSplitTouchEnabled = enabled ? 1 : 0; + } + + public void setTouchable(boolean touchable) { + mTouchable = touchable; + } + + public void setTouchInterceptor(OnTouchListener l) { + mTouchInterceptor = l; + } + + public void setTouchModal(boolean touchModal) { + mNotTouchModal = !touchModal; + } + + public void setWidth(int width) { + mWidth = width; + } + + public void setWindowLayoutMode(int widthSpec, int heightSpec) { + mWidthMode = widthSpec; + mHeightMode = heightSpec; + } + + public void setWindowLayoutType(int layoutType) { + mWindowLayoutType = layoutType; + } + + public void showAsDropDown(View anchor) { + showAsDropDown(anchor, 0, 0); + } + + public void showAsDropDown(View anchor, int xoff, int yoff) { + if (isShowing() || mContentView == null) { + return; + } + registerForScrollChanged(anchor, xoff, yoff); + mIsShowing = true; + mIsDropdown = true; + WindowManager.LayoutParams p = createPopupLayout(anchor.getWindowToken()); + preparePopup(p); + updateAboveAnchor(findDropDownPosition(anchor, p, xoff, yoff)); + if (mHeightMode < 0) { + p.height = mLastHeight = mHeightMode; + } + if (mWidthMode < 0) { + p.width = mLastWidth = mWidthMode; + } + p.windowAnimations = computeAnimationResource(); + invokePopup(p); + } + + public void showAtLocation(IBinder token, int gravity, int x, int y) { + if (isShowing() || mContentView == null) { + return; + } + unregisterForScrollChanged(); + mIsShowing = true; + mIsDropdown = false; + WindowManager.LayoutParams p = createPopupLayout(token); + p.windowAnimations = computeAnimationResource(); + preparePopup(p); + if (gravity == Gravity.NO_GRAVITY) { + gravity = Gravity.TOP | Gravity.LEFT; + } + p.gravity = gravity; + p.x = x; + p.y = y; + if (mHeightMode < 0) { + p.height = mLastHeight = mHeightMode; + } + if (mWidthMode < 0) { + p.width = mLastWidth = mWidthMode; + } + invokePopup(p); + } + + public void showAtLocation(View parent, int gravity, int x, int y) { + showAtLocation(parent.getWindowToken(), gravity, x, y); + } + + private void unregisterForScrollChanged() { + WeakReference anchorRef = mAnchor; + View anchor = null; + if (anchorRef != null) { + anchor = anchorRef.get(); + } + if (anchor != null) { + ViewTreeObserver vto = anchor.getViewTreeObserver(); + vto.removeOnScrollChangedListener(mOnScrollChangedListener); + } + mAnchor = null; + } + + public void update() { + if (!isShowing() || mContentView == null) { + return; + } + WindowManager.LayoutParams p = (WindowManager.LayoutParams) + mPopupView.getLayoutParams(); + boolean update = false; + final int newAnim = computeAnimationResource(); + if (newAnim != p.windowAnimations) { + p.windowAnimations = newAnim; + update = true; + } + final int newFlags = computeFlags(p.flags); + if (newFlags != p.flags) { + p.flags = newFlags; + update = true; + } + if (update) { + mWindowManager.updateViewLayout(mPopupView, p); + } + } + + public void update(int width, int height) { + WindowManager.LayoutParams p = (WindowManager.LayoutParams) + mPopupView.getLayoutParams(); + update(p.x, p.y, width, height, false); + } + + public void update(int x, int y, int width, int height) { + update(x, y, width, height, false); + } + + public void update(int x, int y, int width, int height, boolean force) { + if (width != -1) { + mLastWidth = width; + setWidth(width); + } + if (height != -1) { + mLastHeight = height; + setHeight(height); + } + if (!isShowing() || mContentView == null) { + return; + } + WindowManager.LayoutParams p = (WindowManager.LayoutParams) mPopupView.getLayoutParams(); + boolean update = force; + final int finalWidth = mWidthMode < 0 ? mWidthMode : mLastWidth; + if (width != -1 && p.width != finalWidth) { + p.width = mLastWidth = finalWidth; + update = true; + } + final int finalHeight = mHeightMode < 0 ? mHeightMode : mLastHeight; + if (height != -1 && p.height != finalHeight) { + p.height = mLastHeight = finalHeight; + update = true; + } + if (p.x != x) { + p.x = x; + update = true; + } + if (p.y != y) { + p.y = y; + update = true; + } + final int newAnim = computeAnimationResource(); + if (newAnim != p.windowAnimations) { + p.windowAnimations = newAnim; + update = true; + } + final int newFlags = computeFlags(p.flags); + if (newFlags != p.flags) { + p.flags = newFlags; + update = true; + } + if (update) { + mWindowManager.updateViewLayout(mPopupView, p); + } + } + + private void update(View anchor, boolean updateLocation, int xoff, int yoff, + boolean updateDimension, int width, int height) { + if (!isShowing() || mContentView == null) { + return; + } + WeakReference oldAnchor = mAnchor; + final boolean needsUpdate = updateLocation && (mAnchorXoff != xoff || mAnchorYoff != yoff); + if (oldAnchor == null || oldAnchor.get() != anchor || needsUpdate && !mIsDropdown) { + registerForScrollChanged(anchor, xoff, yoff); + } else if (needsUpdate) { + mAnchorXoff = xoff; + mAnchorYoff = yoff; + } + WindowManager.LayoutParams p = (WindowManager.LayoutParams) mPopupView.getLayoutParams(); + if (updateDimension) { + if (width == -1) { + width = mPopupWidth; + } else { + mPopupWidth = width; + } + if (height == -1) { + height = mPopupHeight; + } else { + mPopupHeight = height; + } + } + int x = p.x; + int y = p.y; + if (updateLocation) { + updateAboveAnchor(findDropDownPosition(anchor, p, xoff, yoff)); + } else { + updateAboveAnchor(findDropDownPosition(anchor, p, mAnchorXoff, mAnchorYoff)); + } + update(p.x, p.y, width, height, x != p.x || y != p.y); + } + + public void update(View anchor, int width, int height) { + update(anchor, false, 0, 0, true, width, height); + } + + public void update(View anchor, int xoff, int yoff, int width, int height) { + update(anchor, true, xoff, yoff, true, width, height); + } + + @SuppressWarnings("deprecation") + private void updateAboveAnchor(boolean aboveAnchor) { + if (aboveAnchor != mAboveAnchor) { + mAboveAnchor = aboveAnchor; + if (mBackground != null) { + if (mAboveAnchorBackgroundDrawable != null) { + if (mAboveAnchor) { + mPopupView.setBackgroundDrawable(mAboveAnchorBackgroundDrawable); + } else { + mPopupView.setBackgroundDrawable(mBelowAnchorBackgroundDrawable); + } + } else { + mPopupView.refreshDrawableState(); + } + } + } + } + +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/ProgressBar.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/ProgressBar.java new file mode 100644 index 0000000000..2b91824765 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/ProgressBar.java @@ -0,0 +1,870 @@ + +package org.holoeverywhere.widget; + +import java.util.ArrayList; + +import org.holoeverywhere.R; +import org.holoeverywhere.drawable.DrawableCompat; +import org.holoeverywhere.internal._View; +import org.holoeverywhere.util.Pool; +import org.holoeverywhere.util.Poolable; +import org.holoeverywhere.util.PoolableManager; +import org.holoeverywhere.util.Pools; +import org.holoeverywhere.util.ReflectHelper; + +import android.annotation.SuppressLint; +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.StateListDrawable; +import android.graphics.drawable.shapes.RoundRectShape; +import android.graphics.drawable.shapes.Shape; +import android.os.Parcel; +import android.os.Parcelable; +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.accessibility.AccessibilityNodeInfo; +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; + +public class ProgressBar extends android.widget.ProgressBar { + private class AccessibilityEventSender implements Runnable { + @Override + public void run() { + sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED); + } + } + + private static class RefreshData implements Poolable { + private static final int POOL_MAX = 24; + private static final Pool sPool = Pools + .synchronizedPool(Pools.finitePool( + new PoolableManager() { + @Override + public RefreshData newInstance() { + return new RefreshData(); + } + + @Override + public void onAcquired(RefreshData element) { + } + + @Override + public void onReleased(RefreshData element) { + } + }, RefreshData.POOL_MAX)); + + public static RefreshData obtain(int id, int progress, boolean fromUser) { + RefreshData rd = RefreshData.sPool.acquire(); + rd.id = id; + rd.progress = progress; + rd.fromUser = fromUser; + return rd; + } + + public boolean fromUser; + public int id; + private boolean mIsPooled; + private RefreshData mNext; + + public int progress; + + @Override + public RefreshData getNextPoolable() { + return mNext; + } + + @Override + public boolean isPooled() { + return mIsPooled; + } + + public void recycle() { + RefreshData.sPool.release(this); + } + + @Override + public void setNextPoolable(RefreshData element) { + mNext = element; + } + + @Override + public void setPooled(boolean isPooled) { + mIsPooled = isPooled; + } + } + + private class RefreshProgressRunnable implements Runnable { + @Override + public void run() { + synchronized (ProgressBar.this) { + final int count = mRefreshData.size(); + for (int i = 0; i < count; i++) { + final RefreshData rd = mRefreshData.get(i); + doRefreshProgress(rd.id, rd.progress, rd.fromUser, true); + rd.recycle(); + } + mRefreshData.clear(); + mRefreshIsPosted = false; + } + } + } + + protected static class SavedState extends BaseSavedState { + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + @Override + public SavedState createFromParcel(Parcel in) { + return new SavedState(in); + } + + @Override + public SavedState[] newArray(int size) { + return new SavedState[size]; + } + }; + int progress; + + int secondaryProgress; + + protected SavedState(Parcel in) { + super(in); + progress = in.readInt(); + secondaryProgress = in.readInt(); + } + + protected SavedState(Parcelable superState) { + super(superState); + } + + @Override + public void writeToParcel(Parcel out, int flags) { + super.writeToParcel(out, flags); + out.writeInt(progress); + out.writeInt(secondaryProgress); + } + } + + private static final int MAX_LEVEL = 10000; + private static final int TIMEOUT_SEND_ACCESSIBILITY_EVENT = 200; + private AccessibilityEventSender mAccessibilityEventSender; + private AlphaAnimation mAnimation; + private boolean mAttached; + private int mBehavior; + private Drawable mCurrentDrawable; + private int mDuration; + private boolean mHasAnimation; + private boolean mIndeterminate; + private Drawable mIndeterminateDrawable; + private boolean mInDrawing; + private Interpolator mInterpolator; + private int mMax; + protected int mMinWidth, mMaxWidth, mMinHeight, mMaxHeight; + private boolean mNoInvalidate; + private boolean mOnlyIndeterminate; + private int mProgress; + private Drawable mProgressDrawable; + private final ArrayList mRefreshData = new ArrayList(); + private boolean mRefreshIsPosted; + private RefreshProgressRunnable mRefreshProgressRunnable; + private Bitmap mSampleTile; + private int mSecondaryProgress; + private boolean mShouldStartAnimationDrawable; + private Transformation mTransformation; + private long mUiThreadId; + + public ProgressBar(Context context) { + this(context, null); + } + + public ProgressBar(Context context, AttributeSet attrs) { + this(context, attrs, android.R.attr.progressBarStyle); + } + + public ProgressBar(Context context, AttributeSet attrs, int defStyle) { + this(context, attrs, defStyle, R.style.Holo_ProgressBar); + } + + public ProgressBar(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_android_progressDrawable); + if (drawable != null) { + drawable = tileify(drawable, false); + setProgressDrawable(drawable); + } + mDuration = a.getInt( + R.styleable.ProgressBar_android_indeterminateDuration, + mDuration); + mMinWidth = a.getDimensionPixelSize( + R.styleable.ProgressBar_android_minWidth, mMinWidth); + mMaxWidth = a.getDimensionPixelSize( + R.styleable.ProgressBar_android_maxWidth, mMaxWidth); + mMinHeight = a.getDimensionPixelSize( + R.styleable.ProgressBar_android_minHeight, mMinHeight); + mMaxHeight = a.getDimensionPixelSize( + R.styleable.ProgressBar_android_maxHeight, mMaxHeight); + mBehavior = a.getInt( + R.styleable.ProgressBar_android_indeterminateBehavior, + mBehavior); + final int resID = a.getResourceId( + R.styleable.ProgressBar_android_interpolator, + android.R.anim.linear_interpolator); + if (resID > 0) { + setInterpolator(context, resID); + } + setMax(a.getInt(R.styleable.ProgressBar_android_max, mMax)); + setProgress(a.getInt(R.styleable.ProgressBar_android_progress, + mProgress)); + setSecondaryProgress(a.getInt( + R.styleable.ProgressBar_android_secondaryProgress, + mSecondaryProgress)); + drawable = DrawableCompat.getDrawable(a, + R.styleable.ProgressBar_android_indeterminateDrawable); + if (drawable != null) { + drawable = tileifyIndeterminate(drawable); + setIndeterminateDrawable(drawable); + } + mOnlyIndeterminate = a.getBoolean( + R.styleable.ProgressBar_android_indeterminateOnly, + mOnlyIndeterminate); + mNoInvalidate = false; + setIndeterminate(mOnlyIndeterminate + || a.getBoolean(R.styleable.ProgressBar_android_indeterminate, + mIndeterminate)); + a.recycle(); + } + + 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 * ProgressBar.MAX_LEVEL); + (progressDrawable != null ? progressDrawable : d).setLevel(level); + } else { + invalidate(); + } + if (callBackToApp && id == R.id.progress) { + onProgressRefresh(scale, fromUser); + } + } + + @Override + protected void drawableStateChanged() { + super.drawableStateChanged(); + updateDrawableState(); + } + + protected Drawable getCurrentDrawable() { + return mCurrentDrawable; + } + + private Shape getDrawableShape() { + final float[] roundedCorners = new float[] { + 5, 5, 5, 5, 5, 5, 5, 5 + }; + return new RoundRectShape(roundedCorners, null, null); + } + + @Override + public Drawable getIndeterminateDrawable() { + return mIndeterminateDrawable; + } + + @Override + public Interpolator getInterpolator() { + return mInterpolator; + } + + @Override + @ViewDebug.ExportedProperty(category = "progress") + public synchronized int getMax() { + return mMax; + } + + @Override + @ViewDebug.ExportedProperty(category = "progress") + public synchronized int getProgress() { + return mIndeterminate ? 0 : mProgress; + } + + @Override + public Drawable getProgressDrawable() { + return mProgressDrawable; + } + + public int getResolvedLayoutDirection() { + return 0; + } + + public int getResolvedLayoutDirection(Drawable who) { + return who == mProgressDrawable || who == mIndeterminateDrawable ? getResolvedLayoutDirection() + : 0; + } + + @Override + @ViewDebug.ExportedProperty(category = "progress") + public synchronized int getSecondaryProgress() { + return mIndeterminate ? 0 : mSecondaryProgress; + } + + public synchronized final void incrementProgress(int diff) { + setProgress(mProgress + diff); + } + + public synchronized final void incrementSecondaryProgress(int diff) { + setSecondaryProgress(mSecondaryProgress + diff); + } + + private void initProgressBar() { + mMax = 100; + mProgress = 0; + mSecondaryProgress = 0; + mIndeterminate = false; + mOnlyIndeterminate = false; + mDuration = 4000; + mBehavior = Animation.RESTART; + mMinWidth = 24; + mMaxWidth = 48; + mMinHeight = 24; + mMaxHeight = 48; + } + + @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); + } + } + } + + @Override + @ViewDebug.ExportedProperty(category = "progress") + public synchronized boolean isIndeterminate() { + return mIndeterminate; + } + + @SuppressLint("NewApi") + @Override + public void jumpDrawablesToCurrentState() { + super.jumpDrawablesToCurrentState(); + if (mProgressDrawable != null) { + mProgressDrawable.jumpToCurrentState(); + } + if (mIndeterminateDrawable != null) { + mIndeterminateDrawable.jumpToCurrentState(); + } + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + if (mIndeterminate) { + startAnimation(); + } + if (mRefreshData != null) { + synchronized (this) { + final int count = mRefreshData.size(); + for (int i = 0; i < count; i++) { + final RefreshData rd = mRefreshData.get(i); + doRefreshProgress(rd.id, rd.progress, rd.fromUser, true); + rd.recycle(); + } + mRefreshData.clear(); + } + } + mAttached = true; + } + + @Override + protected void onDetachedFromWindow() { + if (mIndeterminate) { + stopAnimation(); + } + if (mRefreshProgressRunnable != null) { + removeCallbacks(mRefreshProgressRunnable); + } + if (mRefreshProgressRunnable != null && mRefreshIsPosted) { + removeCallbacks(mRefreshProgressRunnable); + } + if (mAccessibilityEventSender != null) { + removeCallbacks(mAccessibilityEventSender); + } + super.onDetachedFromWindow(); + mAttached = false; + } + + @Override + protected synchronized void onDraw(Canvas canvas) { + super.onDraw(canvas); + Drawable d = mCurrentDrawable; + if (d != null) { + canvas.save(); + canvas.translate(getPaddingLeft(), getPaddingTop()); + long time = getDrawingTime(); + if (mHasAnimation) { + mAnimation.getTransformation(time, mTransformation); + float scale = mTransformation.getAlpha(); + try { + mInDrawing = true; + d.setLevel((int) (scale * ProgressBar.MAX_LEVEL)); + } finally { + mInDrawing = false; + } + postInvalidate(); + } + d.draw(canvas); + canvas.restore(); + if (mShouldStartAnimationDrawable && d instanceof Animatable) { + ((Animatable) d).start(); + mShouldStartAnimationDrawable = false; + } + } + } + + @SuppressLint("NewApi") + @Override + public void onInitializeAccessibilityEvent(AccessibilityEvent event) { + super.onInitializeAccessibilityEvent(event); + event.setClassName(ProgressBar.class.getName()); + event.setItemCount(mMax); + event.setCurrentItemIndex(mProgress); + } + + @Override + @SuppressLint("NewApi") + public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { + super.onInitializeAccessibilityNodeInfo(info); + info.setClassName(ProgressBar.class.getName()); + } + + @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(); + setMeasuredDimension( + _View.supportResolveSizeAndState(dw, widthMeasureSpec, 0), + _View.supportResolveSizeAndState(dh, heightMeasureSpec, 0)); + } + + protected void onProgressRefresh(float scale, boolean fromUser) { + try { + if (((AccessibilityManager) AccessibilityManager.class.getMethod( + "getInstance", Context.class).invoke(null, getContext())) + .isEnabled()) { + scheduleAccessibilityEventSender(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void onRestoreInstanceState(Parcelable state) { + SavedState ss = (SavedState) state; + super.onRestoreInstanceState(ss.getSuperState()); + setProgress(ss.progress); + setSecondaryProgress(ss.secondaryProgress); + } + + @Override + public Parcelable onSaveInstanceState() { + Parcelable superState = super.onSaveInstanceState(); + SavedState ss = new SavedState(superState); + ss.progress = mProgress; + ss.secondaryProgress = mSecondaryProgress; + return ss; + } + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + updateDrawableBounds(w, h); + } + + @Override + public void onVisibilityChanged(View changedView, int visibility) { + super.onVisibilityChanged(changedView, visibility); + if (mIndeterminate) { + if (visibility == android.view.View.GONE + || visibility == android.view.View.INVISIBLE) { + stopAnimation(); + } else { + startAnimation(); + } + } + } + + @Override + public void postInvalidate() { + if (!mNoInvalidate) { + super.postInvalidate(); + } + } + + private synchronized void refreshProgress(int id, int progress, + boolean fromUser) { + if (mUiThreadId == Thread.currentThread().getId()) { + doRefreshProgress(id, progress, fromUser, true); + } else if (mRefreshData != null) { + if (mRefreshProgressRunnable == null) { + mRefreshProgressRunnable = new RefreshProgressRunnable(); + } + + final RefreshData rd = RefreshData.obtain(id, progress, fromUser); + mRefreshData.add(rd); + if (mAttached && !mRefreshIsPosted) { + post(mRefreshProgressRunnable); + mRefreshIsPosted = true; + } + } + } + + private void scheduleAccessibilityEventSender() { + if (mAccessibilityEventSender == null) { + mAccessibilityEventSender = new AccessibilityEventSender(); + } else { + removeCallbacks(mAccessibilityEventSender); + } + postDelayed(mAccessibilityEventSender, + ProgressBar.TIMEOUT_SEND_ACCESSIBILITY_EVENT); + } + + @Override + 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(); + } + } + } + + @Override + public void setIndeterminateDrawable(Drawable d) { + if (d != null) { + d.setCallback(this); + } + mIndeterminateDrawable = d; + if (mIndeterminate) { + mCurrentDrawable = d; + postInvalidate(); + } + } + + @Override + public void setInterpolator(Context context, int resID) { + setInterpolator(AnimationUtils.loadInterpolator(context, resID)); + } + + @Override + public void setInterpolator(Interpolator interpolator) { + mInterpolator = interpolator; + } + + @Override + public synchronized void setMax(int max) { + if (max < 0) { + max = 0; + } + if (max != mMax) { + mMax = max; + postInvalidate(); + + if (mProgress > max) { + mProgress = max; + } + refreshProgress(R.id.progress, mProgress, false); + } + } + + @Override + 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(R.id.progress, mProgress, fromUser); + } + } + + @Override + 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); + int drawableHeight = d.getMinimumHeight(); + if (mMaxHeight < drawableHeight) { + mMaxHeight = drawableHeight; + requestLayout(); + } + } + mProgressDrawable = d; + if (!mIndeterminate) { + mCurrentDrawable = d; + postInvalidate(); + } + if (needUpdate) { + updateDrawableBounds(getWidth(), getHeight()); + updateDrawableState(); + doRefreshProgress(R.id.progress, mProgress, false, false); + doRefreshProgress(R.id.secondaryProgress, mSecondaryProgress, + false, false); + } + } + + @Override + 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(R.id.secondaryProgress, mSecondaryProgress, false); + } + } + + @Override + public void setVisibility(int v) { + if (getVisibility() != v) { + super.setVisibility(v); + if (mIndeterminate) { + if (v == android.view.View.GONE + || v == android.view.View.INVISIBLE) { + stopAnimation(); + } else { + startAnimation(); + } + } + } + } + + void startAnimation() { + if (getVisibility() != android.view.View.VISIBLE) { + return; + } + if (mIndeterminateDrawable instanceof Animatable) { + mShouldStartAnimationDrawable = true; + mHasAnimation = false; + } else { + mHasAnimation = true; + if (mInterpolator == null) { + mInterpolator = new LinearInterpolator(); + } + if (mTransformation == null) { + mTransformation = new Transformation(); + } else { + mTransformation.clear(); + } + if (mAnimation == null) { + mAnimation = new AlphaAnimation(0.0f, 1.0f); + } else { + mAnimation.reset(); + } + mAnimation.setRepeatMode(mBehavior); + mAnimation.setRepeatCount(Animation.INFINITE); + mAnimation.setDuration(mDuration); + mAnimation.setInterpolator(mInterpolator); + mAnimation.setStartTime(Animation.START_ON_FIRST_FRAME); + } + postInvalidate(); + } + + void stopAnimation() { + mHasAnimation = false; + if (mIndeterminateDrawable instanceof Animatable) { + ((Animatable) mIndeterminateDrawable).stop(); + mShouldStartAnimationDrawable = false; + } + postInvalidate(); + } + + 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 == R.id.progress || id == 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 = ReflectHelper + .invoke(in, "getStateCount", int.class); + for (int i = 0; i < numStates; i++) { + out.addState( + ReflectHelper.invoke(in, "getStateSet", int[].class, i), + tileify(ReflectHelper.invoke(in, "getStateDrawable", + Drawable.class, 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; + } + + 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; + } + + private void updateDrawableBounds(int w, int h) { + int right = w - getPaddingRight() - getPaddingLeft(); + int bottom = h - getPaddingBottom() - getPaddingTop(); + int top = 0; + int left = 0; + if (mIndeterminateDrawable != null) { + if (mOnlyIndeterminate + && !(mIndeterminateDrawable instanceof AnimationDrawable)) { + 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) { + final int width = (int) (h * intrinsicAspect); + left = (w - width) / 2; + right = left + width; + } else { + final int height = (int) (w * (1 / intrinsicAspect)); + top = (h - height) / 2; + bottom = top + height; + } + } + } + mIndeterminateDrawable.setBounds(left, top, right, bottom); + } + if (mProgressDrawable != null) { + mProgressDrawable.setBounds(0, 0, right, bottom); + } + } + + private void updateDrawableState() { + int[] state = getDrawableState(); + if (mProgressDrawable != null && mProgressDrawable.isStateful()) { + mProgressDrawable.setState(state); + } + if (mIndeterminateDrawable != null + && mIndeterminateDrawable.isStateful()) { + mIndeterminateDrawable.setState(state); + } + } + + @Override + protected boolean verifyDrawable(Drawable who) { + return who == mProgressDrawable || who == mIndeterminateDrawable + || super.verifyDrawable(who); + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/RadioButton.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/RadioButton.java new file mode 100644 index 0000000000..e909c86b9e --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/RadioButton.java @@ -0,0 +1,84 @@ + +package org.holoeverywhere.widget; + +import org.holoeverywhere.R; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.res.TypedArray; +import android.os.Build.VERSION; +import android.util.AttributeSet; + +public class RadioButton extends android.widget.RadioButton { + private boolean allCaps = false; + private CharSequence originalText; + private BufferType originalType; + + public RadioButton(Context context) { + this(context, null); + } + + public RadioButton(Context context, AttributeSet attrs) { + this(context, attrs, android.R.attr.radioButtonStyle); + } + + public RadioButton(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + TypedArray a = getContext().obtainStyledAttributes(attrs, + R.styleable.TextView, defStyle, 0); + if (a.hasValue(R.styleable.TextView_android_textAllCaps)) { + allCaps = a.getBoolean(R.styleable.TextView_android_textAllCaps, + false); + } else { + allCaps = a.getBoolean(R.styleable.TextView_textAllCaps, false); + } + CharSequence text = null; + if (a.hasValue(R.styleable.TextView_android_text)) { + text = a.getText(R.styleable.TextView_android_text); + } + a.recycle(); + if (text != null) { + setText(text); + } + } + + @Override + @SuppressLint("NewApi") + public void dispatchDisplayHint(int hint) { + onDisplayHint(hint); + } + + public boolean isAllCaps() { + return allCaps; + } + + @Override + @SuppressLint("NewApi") + protected void onDisplayHint(int hint) { + if (VERSION.SDK_INT >= 8) { + super.onDisplayHint(hint); + } + } + + @Override + public void setAllCaps(boolean allCaps) { + this.allCaps = allCaps; + updateTextState(); + } + + @Override + public void setText(CharSequence text, BufferType type) { + originalText = text; + originalType = type; + updateTextState(); + } + + private void updateTextState() { + if (originalText == null) { + super.setText(null, originalType); + return; + } + super.setText(allCaps ? originalText.toString().toUpperCase() + : originalText, originalType); + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/Scroller.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/Scroller.java new file mode 100644 index 0000000000..b7ca637124 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/Scroller.java @@ -0,0 +1,307 @@ + +package org.holoeverywhere.widget; + +import android.content.Context; +import android.hardware.SensorManager; +import android.os.Build; +import android.util.FloatMath; +import android.view.ViewConfiguration; +import android.view.animation.AnimationUtils; +import android.view.animation.Interpolator; + +public class Scroller { + private static float ALPHA = 800; + private static float DECELERATION_RATE = (float) (Math.log(0.75) / Math + .log(0.9)); + private static final int DEFAULT_DURATION = 250; + private static float END_TENSION = 0.6f; + private static final int FLING_MODE = 1; + private static final int NB_SAMPLES = 100; + private static final int SCROLL_MODE = 0; + private static final float[] SPLINE = new float[Scroller.NB_SAMPLES + 1]; + private static float START_TENSION = 0.4f; + private static float sViscousFluidNormalize; + private static float sViscousFluidScale; + static { + float x_min = 0.0f; + for (int i = 0; i <= Scroller.NB_SAMPLES; i++) { + final float t = (float) i / Scroller.NB_SAMPLES; + float x_max = 1.0f; + float x, tx, coef; + while (true) { + x = x_min + (x_max - x_min) / 2.0f; + coef = 3.0f * x * (1.0f - x); + tx = coef + * ((1.0f - x) * Scroller.START_TENSION + x + * Scroller.END_TENSION) + x * x * x; + if (Math.abs(tx - t) < 1E-5) { + break; + } + if (tx > t) { + x_max = x; + } else { + x_min = x; + } + } + final float d = coef + x * x * x; + Scroller.SPLINE[i] = d; + } + Scroller.SPLINE[Scroller.NB_SAMPLES] = 1.0f; + Scroller.sViscousFluidScale = 8.0f; + Scroller.sViscousFluidNormalize = 1.0f; + Scroller.sViscousFluidNormalize = 1.0f / Scroller.viscousFluid(1.0f); + } + + static float viscousFluid(float x) { + x *= Scroller.sViscousFluidScale; + if (x < 1.0f) { + x -= 1.0f - (float) Math.exp(-x); + } else { + float start = 0.36787944117f; // 1/e == exp(-1) + x = 1.0f - (float) Math.exp(1.0f - x); + x = start + x * (1.0f - start); + } + x *= Scroller.sViscousFluidNormalize; + return x; + } + + private int mCurrX; + private int mCurrY; + private float mDeceleration; + private float mDeltaX; + private float mDeltaY; + private int mDuration; + private float mDurationReciprocal; + private int mFinalX; + private int mFinalY; + private boolean mFinished; + private boolean mFlywheel; + private Interpolator mInterpolator; + private int mMaxX; + private int mMaxY; + private int mMinX; + private int mMinY; + private int mMode; + private final float mPpi; + + private long mStartTime; + + private int mStartX; + private int mStartY; + + private float mVelocity; + + public Scroller(Context context) { + this(context, null); + } + + public Scroller(Context context, Interpolator interpolator) { + this( + context, + interpolator, + context.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.HONEYCOMB); + } + + public Scroller(Context context, Interpolator interpolator, boolean flywheel) { + mFinished = true; + mInterpolator = interpolator; + mPpi = context.getResources().getDisplayMetrics().density * 160.0f; + mDeceleration = computeDeceleration(ViewConfiguration + .getScrollFriction()); + mFlywheel = flywheel; + } + + public void abortAnimation() { + mCurrX = mFinalX; + mCurrY = mFinalY; + mFinished = true; + } + + private float computeDeceleration(float friction) { + return SensorManager.GRAVITY_EARTH * 39.37f * mPpi * friction; + } + + public boolean computeScrollOffset() { + if (mFinished) { + return false; + } + int timePassed = (int) (AnimationUtils.currentAnimationTimeMillis() - mStartTime); + if (timePassed < mDuration) { + switch (mMode) { + case SCROLL_MODE: + float x = timePassed * mDurationReciprocal; + if (mInterpolator == null) { + x = Scroller.viscousFluid(x); + } else { + x = mInterpolator.getInterpolation(x); + } + mCurrX = mStartX + Math.round(x * mDeltaX); + mCurrY = mStartY + Math.round(x * mDeltaY); + break; + case FLING_MODE: + final float t = (float) timePassed / mDuration; + final int index = (int) (Scroller.NB_SAMPLES * t); + final float t_inf = (float) index / Scroller.NB_SAMPLES; + final float t_sup = (float) (index + 1) / Scroller.NB_SAMPLES; + final float d_inf = Scroller.SPLINE[index]; + final float d_sup = Scroller.SPLINE[index + 1]; + final float distanceCoef = d_inf + (t - t_inf) + / (t_sup - t_inf) * (d_sup - d_inf); + mCurrX = mStartX + + Math.round(distanceCoef * (mFinalX - mStartX)); + mCurrX = Math.min(mCurrX, mMaxX); + mCurrX = Math.max(mCurrX, mMinX); + mCurrY = mStartY + + Math.round(distanceCoef * (mFinalY - mStartY)); + mCurrY = Math.min(mCurrY, mMaxY); + mCurrY = Math.max(mCurrY, mMinY); + if (mCurrX == mFinalX && mCurrY == mFinalY) { + mFinished = true; + } + break; + } + } else { + mCurrX = mFinalX; + mCurrY = mFinalY; + mFinished = true; + } + return true; + } + + public void extendDuration(int extend) { + int passed = timePassed(); + mDuration = passed + extend; + mDurationReciprocal = 1.0f / mDuration; + mFinished = false; + } + + public void fling(int startX, int startY, int velocityX, int velocityY, + int minX, int maxX, int minY, int maxY) { + if (mFlywheel && !mFinished) { + float oldVel = getCurrVelocity(); + float dx = mFinalX - mStartX; + float dy = mFinalY - mStartY; + float hyp = FloatMath.sqrt(dx * dx + dy * dy); + float ndx = dx / hyp; + float ndy = dy / hyp; + float oldVelocityX = ndx * oldVel; + float oldVelocityY = ndy * oldVel; + if (Math.signum(velocityX) == Math.signum(oldVelocityX) + && Math.signum(velocityY) == Math.signum(oldVelocityY)) { + velocityX += oldVelocityX; + velocityY += oldVelocityY; + } + } + mMode = Scroller.FLING_MODE; + mFinished = false; + float velocity = FloatMath.sqrt(velocityX * velocityX + velocityY + * velocityY); + mVelocity = velocity; + final double l = Math.log(Scroller.START_TENSION * velocity + / Scroller.ALPHA); + mDuration = (int) (1000.0 * Math.exp(l + / (Scroller.DECELERATION_RATE - 1.0))); + mStartTime = AnimationUtils.currentAnimationTimeMillis(); + mStartX = startX; + mStartY = startY; + float coeffX = velocity == 0 ? 1.0f : velocityX / velocity; + float coeffY = velocity == 0 ? 1.0f : velocityY / velocity; + int totalDistance = (int) (Scroller.ALPHA * Math + .exp(Scroller.DECELERATION_RATE + / (Scroller.DECELERATION_RATE - 1.0) * l)); + mMinX = minX; + mMaxX = maxX; + mMinY = minY; + mMaxY = maxY; + mFinalX = startX + Math.round(totalDistance * coeffX); + mFinalX = Math.min(mFinalX, mMaxX); + mFinalX = Math.max(mFinalX, mMinX); + mFinalY = startY + Math.round(totalDistance * coeffY); + mFinalY = Math.min(mFinalY, mMaxY); + mFinalY = Math.max(mFinalY, mMinY); + } + + public final void forceFinished(boolean finished) { + mFinished = finished; + } + + public float getCurrVelocity() { + return mVelocity - mDeceleration * timePassed() / 2000.0f; + } + + public final int getCurrX() { + return mCurrX; + } + + public final int getCurrY() { + return mCurrY; + } + + public final int getDuration() { + return mDuration; + } + + public final int getFinalX() { + return mFinalX; + } + + public final int getFinalY() { + return mFinalY; + } + + public final int getStartX() { + return mStartX; + } + + public final int getStartY() { + return mStartY; + } + + public final boolean isFinished() { + return mFinished; + } + + public boolean isScrollingInDirection(float xvel, float yvel) { + return !mFinished + && Math.signum(xvel) == Math.signum(mFinalX - mStartX) + && Math.signum(yvel) == Math.signum(mFinalY - mStartY); + } + + public void setFinalX(int newX) { + mFinalX = newX; + mDeltaX = mFinalX - mStartX; + mFinished = false; + } + + public void setFinalY(int newY) { + mFinalY = newY; + mDeltaY = mFinalY - mStartY; + mFinished = false; + } + + public final void setFriction(float friction) { + mDeceleration = computeDeceleration(friction); + } + + public void startScroll(int startX, int startY, int dx, int dy) { + startScroll(startX, startY, dx, dy, Scroller.DEFAULT_DURATION); + } + + public void startScroll(int startX, int startY, int dx, int dy, int duration) { + mMode = Scroller.SCROLL_MODE; + mFinished = false; + mDuration = duration; + mStartTime = AnimationUtils.currentAnimationTimeMillis(); + mStartX = startX; + mStartY = startY; + mFinalX = startX + dx; + mFinalY = startY + dy; + mDeltaX = dx; + mDeltaY = dy; + mDurationReciprocal = 1.0f / mDuration; + } + + public int timePassed() { + return (int) (AnimationUtils.currentAnimationTimeMillis() - mStartTime); + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/SeekBar.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/SeekBar.java new file mode 100644 index 0000000000..32accb536a --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/SeekBar.java @@ -0,0 +1,75 @@ + +package org.holoeverywhere.widget; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.util.AttributeSet; +import android.view.accessibility.AccessibilityEvent; +import android.view.accessibility.AccessibilityNodeInfo; + +public class SeekBar extends AbsSeekBar { + public interface OnSeekBarChangeListener { + void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser); + + void onStartTrackingTouch(SeekBar seekBar); + + void onStopTrackingTouch(SeekBar seekBar); + } + + private OnSeekBarChangeListener mOnSeekBarChangeListener; + + public SeekBar(Context context) { + this(context, null); + } + + public SeekBar(Context context, AttributeSet attrs) { + this(context, attrs, android.R.attr.seekBarStyle); + } + + public SeekBar(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + @Override + @SuppressLint("NewApi") + public void onInitializeAccessibilityEvent(AccessibilityEvent event) { + super.onInitializeAccessibilityEvent(event); + event.setClassName(SeekBar.class.getName()); + } + + @Override + @SuppressLint("NewApi") + public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { + super.onInitializeAccessibilityNodeInfo(info); + info.setClassName(SeekBar.class.getName()); + } + + @Override + public void onProgressRefresh(float scale, boolean fromUser) { + super.onProgressRefresh(scale, fromUser); + if (mOnSeekBarChangeListener != null) { + mOnSeekBarChangeListener.onProgressChanged(this, getProgress(), + fromUser); + } + } + + @Override + void onStartTrackingTouch() { + super.onStartTrackingTouch(); + if (mOnSeekBarChangeListener != null) { + mOnSeekBarChangeListener.onStartTrackingTouch(this); + } + } + + @Override + void onStopTrackingTouch() { + super.onStopTrackingTouch(); + if (mOnSeekBarChangeListener != null) { + mOnSeekBarChangeListener.onStopTrackingTouch(this); + } + } + + public void setOnSeekBarChangeListener(OnSeekBarChangeListener l) { + mOnSeekBarChangeListener = l; + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/SimpleExpandableListAdapter.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/SimpleExpandableListAdapter.java new file mode 100644 index 0000000000..b23c516464 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/SimpleExpandableListAdapter.java @@ -0,0 +1,149 @@ + +package org.holoeverywhere.widget; + +import java.util.List; +import java.util.Map; + +import org.holoeverywhere.LayoutInflater; + +import android.content.Context; +import android.view.View; +import android.view.ViewGroup; + +public class SimpleExpandableListAdapter extends BaseExpandableListAdapter { + private List>> mChildData; + private String[] mChildFrom; + private int mChildLayout; + private int[] mChildTo; + private int mCollapsedGroupLayout; + private int mExpandedGroupLayout; + private List> mGroupData; + private String[] mGroupFrom; + private int[] mGroupTo; + private LayoutInflater mInflater; + private int mLastChildLayout; + + public SimpleExpandableListAdapter(Context context, + List> groupData, int expandedGroupLayout, + int collapsedGroupLayout, String[] groupFrom, int[] groupTo, + List>> childData, + int childLayout, int lastChildLayout, String[] childFrom, + int[] childTo) { + mGroupData = groupData; + mExpandedGroupLayout = expandedGroupLayout; + mCollapsedGroupLayout = collapsedGroupLayout; + mGroupFrom = groupFrom; + mGroupTo = groupTo; + mChildData = childData; + mChildLayout = childLayout; + mLastChildLayout = lastChildLayout; + mChildFrom = childFrom; + mChildTo = childTo; + mInflater = LayoutInflater.from(context); + } + + public SimpleExpandableListAdapter(Context context, + List> groupData, int expandedGroupLayout, + int collapsedGroupLayout, String[] groupFrom, int[] groupTo, + List>> childData, + int childLayout, String[] childFrom, int[] childTo) { + this(context, groupData, expandedGroupLayout, collapsedGroupLayout, + groupFrom, groupTo, childData, childLayout, childLayout, + childFrom, childTo); + } + + public SimpleExpandableListAdapter(Context context, + List> groupData, int groupLayout, + String[] groupFrom, int[] groupTo, + List>> childData, + int childLayout, String[] childFrom, int[] childTo) { + this(context, groupData, groupLayout, groupLayout, groupFrom, groupTo, childData, + childLayout, childLayout, childFrom, childTo); + } + + private void bindView(View view, Map data, String[] from, int[] to) { + int len = to.length; + + for (int i = 0; i < len; i++) { + TextView v = (TextView) view.findViewById(to[i]); + if (v != null) { + v.setText((String) data.get(from[i])); + } + } + } + + @Override + public Object getChild(int groupPosition, int childPosition) { + return mChildData.get(groupPosition).get(childPosition); + } + + @Override + public long getChildId(int groupPosition, int childPosition) { + return childPosition; + } + + @Override + public int getChildrenCount(int groupPosition) { + return mChildData.get(groupPosition).size(); + } + + @Override + public View getChildView(int groupPosition, int childPosition, boolean isLastChild, + View convertView, ViewGroup parent) { + View v; + if (convertView == null) { + v = newChildView(isLastChild, parent); + } else { + v = convertView; + } + bindView(v, mChildData.get(groupPosition).get(childPosition), mChildFrom, mChildTo); + return v; + } + + @Override + public Object getGroup(int groupPosition) { + return mGroupData.get(groupPosition); + } + + @Override + public int getGroupCount() { + return mGroupData.size(); + } + + @Override + public long getGroupId(int groupPosition) { + return groupPosition; + } + + @Override + public View getGroupView(int groupPosition, boolean isExpanded, View convertView, + ViewGroup parent) { + View v; + if (convertView == null) { + v = newGroupView(isExpanded, parent); + } else { + v = convertView; + } + bindView(v, mGroupData.get(groupPosition), mGroupFrom, mGroupTo); + return v; + } + + @Override + public boolean hasStableIds() { + return true; + } + + @Override + public boolean isChildSelectable(int groupPosition, int childPosition) { + return true; + } + + public View newChildView(boolean isLastChild, ViewGroup parent) { + return mInflater.inflate(isLastChild ? mLastChildLayout : mChildLayout, parent, false); + } + + public View newGroupView(boolean isExpanded, ViewGroup parent) { + return mInflater.inflate(isExpanded ? mExpandedGroupLayout : mCollapsedGroupLayout, + parent, false); + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/Spinner.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/Spinner.java new file mode 100644 index 0000000000..a90cf9f5fa --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/Spinner.java @@ -0,0 +1,699 @@ + +package org.holoeverywhere.widget; + +import org.holoeverywhere.R; +import org.holoeverywhere.app.AlertDialog; + +import android.annotation.SuppressLint; +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.util.Log; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.view.accessibility.AccessibilityEvent; +import android.view.accessibility.AccessibilityNodeInfo; +import android.widget.AbsListView; +import android.widget.ListAdapter; +import android.widget.SpinnerAdapter; + +public class Spinner extends AbsSpinner implements OnClickListener { + private class DialogPopup implements SpinnerPopup, + DialogInterface.OnClickListener { + private ListAdapter mListAdapter; + private AlertDialog mPopup; + private CharSequence mPrompt; + + @Override + public void dismiss() { + mPopup.dismiss(); + mPopup = null; + } + + @Override + public Drawable getBackground() { + return null; + } + + @Override + public CharSequence getHintText() { + return mPrompt; + } + + @Override + public int getHorizontalOffset() { + return 0; + } + + @Override + public int getVerticalOffset() { + return 0; + } + + @Override + public boolean isShowing() { + return mPopup != null ? mPopup.isShowing() : false; + } + + @Override + public void onClick(DialogInterface dialog, final int which) { + setSelection(which); + if (mOnItemClickListener != null) { + performItemClick(null, which, mListAdapter.getItemId(which)); + } + dismiss(); + } + + @Override + public void setAdapter(ListAdapter adapter) { + mListAdapter = adapter; + } + + @Override + public void setBackgroundDrawable(Drawable bg) { + Log.e(Spinner.TAG, + "Cannot set popup background for MODE_DIALOG, ignoring"); + } + + @Override + public void setHorizontalOffset(int px) { + Log.e(Spinner.TAG, + "Cannot set horizontal offset for MODE_DIALOG, ignoring"); + } + + @Override + public void setPromptText(CharSequence hintText) { + mPrompt = hintText; + } + + @Override + public void setVerticalOffset(int px) { + Log.e(Spinner.TAG, + "Cannot set vertical offset for MODE_DIALOG, ignoring"); + } + + @Override + public void show() { + AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); + if (mPrompt != null) { + builder.setTitle(mPrompt); + } + mPopup = builder.setSingleChoiceItems(mListAdapter, + getSelectedItemPosition(), this).show(); + } + } + + private static class DropDownAdapter implements ListAdapter, SpinnerAdapter { + private SpinnerAdapter mAdapter; + private ListAdapter mListAdapter; + + public DropDownAdapter(SpinnerAdapter adapter) { + mAdapter = adapter; + if (adapter instanceof ListAdapter) { + mListAdapter = (ListAdapter) adapter; + } + } + + @Override + public boolean areAllItemsEnabled() { + final ListAdapter adapter = mListAdapter; + if (adapter != null) { + return adapter.areAllItemsEnabled(); + } else { + return true; + } + } + + @Override + public int getCount() { + return mAdapter == null ? 0 : mAdapter.getCount(); + } + + @Override + public View getDropDownView(int position, View convertView, + ViewGroup parent) { + return mAdapter == null ? null : mAdapter.getDropDownView(position, + convertView, parent); + } + + @Override + public Object getItem(int position) { + return mAdapter == null ? null : mAdapter.getItem(position); + } + + @Override + public long getItemId(int position) { + return mAdapter == null ? -1 : mAdapter.getItemId(position); + } + + @Override + public int getItemViewType(int position) { + return 0; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + return getDropDownView(position, convertView, parent); + } + + @Override + public int getViewTypeCount() { + return 1; + } + + @Override + public boolean hasStableIds() { + return mAdapter != null && mAdapter.hasStableIds(); + } + + @Override + public boolean isEmpty() { + return getCount() == 0; + } + + @Override + public boolean isEnabled(int position) { + final ListAdapter adapter = mListAdapter; + if (adapter != null) { + return adapter.isEnabled(position); + } else { + return true; + } + } + + @Override + public void registerDataSetObserver(DataSetObserver observer) { + if (mAdapter != null) { + mAdapter.registerDataSetObserver(observer); + } + } + + @Override + public void unregisterDataSetObserver(DataSetObserver observer) { + if (mAdapter != null) { + mAdapter.unregisterDataSetObserver(observer); + } + } + } + + private class DropdownPopup extends ListPopupWindow implements SpinnerPopup, + PopupWindow.OnDismissListener { + private ListAdapter mAdapter; + private CharSequence mHintText; + + private boolean mSelectionSetted = false; + + public DropdownPopup(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, R.attr.listPopupWindowStyle); + setAnchorView(Spinner.this); + setModal(true); + setPromptPosition(ListPopupWindow.POSITION_PROMPT_ABOVE); + setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() { + @Override + public void onItemClick(android.widget.AdapterView parent, + final View v, final int position, long id) { + Spinner.this.setSelection(position); + if (mOnItemClickListener != null) { + Spinner.this.performItemClick(v, position, + mAdapter.getItemId(position)); + } + dismiss(); + } + }); + } + + @Override + public CharSequence getHintText() { + return mHintText; + } + + @Override + public void onDismiss() { + mSelectionSetted = false; + } + + @Override + public void setAdapter(ListAdapter adapter) { + super.setAdapter(adapter); + mAdapter = adapter; + } + + @Override + public void setPromptText(CharSequence hintText) { + mHintText = hintText; + } + + @Override + public void show() { + final Drawable background = getBackground(); + int bgOffset = 0; + if (background != null) { + background.getPadding(mTempRect); + bgOffset = -mTempRect.left; + } else { + mTempRect.left = mTempRect.right = 0; + } + final int spinnerPaddingLeft = getPaddingLeft(); + if (mDropDownWidth == LayoutParams.WRAP_CONTENT) { + final int spinnerWidth = Spinner.this.getWidth(); + final int spinnerPaddingRight = getPaddingRight(); + int contentWidth = measureContentWidth( + (SpinnerAdapter) mAdapter, getBackground()); + final int contentWidthLimit = getContext().getResources() + .getDisplayMetrics().widthPixels + - mTempRect.left + - mTempRect.right; + if (contentWidth > contentWidthLimit) { + contentWidth = contentWidthLimit; + } + setContentWidth(Math.max(contentWidth, spinnerWidth + - spinnerPaddingLeft - spinnerPaddingRight)); + } else if (mDropDownWidth == LayoutParams.MATCH_PARENT) { + final int spinnerWidth = Spinner.this.getWidth(); + final int spinnerPaddingRight = getPaddingRight(); + setContentWidth(spinnerWidth - spinnerPaddingLeft + - spinnerPaddingRight); + } else { + setContentWidth(mDropDownWidth); + } + setHorizontalOffset(bgOffset + spinnerPaddingLeft); + setInputMethodMode(ListPopupWindow.INPUT_METHOD_NOT_NEEDED); + super.show(); + getListView().setChoiceMode(AbsListView.CHOICE_MODE_SINGLE); + if (!mSelectionSetted) { + mSelectionSetted = true; + setSelection(Spinner.this.getSelectedItemPosition()); + } + setOnDismissListener(this); + } + } + + private interface SpinnerPopup { + public void dismiss(); + + public Drawable getBackground(); + + public CharSequence getHintText(); + + public int getHorizontalOffset(); + + public int getVerticalOffset(); + + public boolean isShowing(); + + public void setAdapter(ListAdapter adapter); + + public void setBackgroundDrawable(Drawable bg); + + public void setHorizontalOffset(int px); + + public void setPromptText(CharSequence hintText); + + public void setVerticalOffset(int px); + + public void show(); + } + + private static final int MAX_ITEMS_MEASURED = 15; + public static final int MODE_DIALOG = 0; + public static final int MODE_DROPDOWN = 1; + private static final int MODE_THEME = -1; + private static final String TAG = "Spinner"; + private boolean mDisableChildrenWhenDisabled; + int mDropDownWidth; + private int mGravity; + + private SpinnerPopup mPopup; + + private DropDownAdapter mTempAdapter; + + private Rect mTempRect = new Rect(); + + public Spinner(Context context) { + this(context, null); + } + + public Spinner(Context context, AttributeSet attrs) { + this(context, attrs, R.attr.spinnerStyle); + } + + public Spinner(Context context, AttributeSet attrs, int defStyle) { + this(context, attrs, defStyle, Spinner.MODE_THEME); + } + + public Spinner(Context context, AttributeSet attrs, int defStyle, int mode) { + super(context, attrs, defStyle); + TypedArray a = context.obtainStyledAttributes(attrs, + R.styleable.Spinner, defStyle, R.style.Holo_Spinner); + if (mode == Spinner.MODE_THEME) { + mode = a.getInt(R.styleable.Spinner_spinnerMode, + Spinner.MODE_DIALOG); + } + switch (mode) { + case MODE_DIALOG: { + mPopup = new DialogPopup(); + break; + } + case MODE_DROPDOWN: { + DropdownPopup popup = new DropdownPopup(context, attrs, defStyle); + mDropDownWidth = a.getLayoutDimension( + R.styleable.Spinner_android_dropDownWidth, + ViewGroup.LayoutParams.WRAP_CONTENT); + popup.setBackgroundDrawable(a + .getDrawable(R.styleable.Spinner_android_popupBackground)); + final int verticalOffset = a.getDimensionPixelOffset( + R.styleable.Spinner_dropDownVerticalOffset, 0); + if (verticalOffset != 0) { + popup.setVerticalOffset(verticalOffset); + } + final int horizontalOffset = a.getDimensionPixelOffset( + R.styleable.Spinner_dropDownHorizontalOffset, 0); + if (horizontalOffset != 0) { + popup.setHorizontalOffset(horizontalOffset); + } + mPopup = popup; + break; + + } + } + mGravity = a + .getInt(R.styleable.Spinner_android_gravity, Gravity.CENTER); + mPopup.setPromptText(a.getString(R.styleable.Spinner_android_prompt)); + mDisableChildrenWhenDisabled = a.getBoolean( + R.styleable.Spinner_disableChildrenWhenDisabled, false); + a.recycle(); + if (mTempAdapter != null) { + mPopup.setAdapter(mTempAdapter); + mTempAdapter = null; + } + } + + public Spinner(Context context, int mode) { + this(context, null, R.attr.spinnerStyle, mode); + } + + @Override + public int getBaseline() { + View child = null; + if (getChildCount() > 0) { + child = getChildAt(0); + } else if (getAdapter() != null && getAdapter().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; + } + } + + public int getDropDownHorizontalOffset() { + return mPopup.getHorizontalOffset(); + } + + public int getDropDownVerticalOffset() { + return mPopup.getVerticalOffset(); + } + + public int getDropDownWidth() { + return mDropDownWidth; + } + + public int getGravity() { + return mGravity; + } + + public Drawable getPopupBackground() { + return mPopup.getBackground(); + } + + public CharSequence getPrompt() { + return mPopup.getHintText(); + } + + public void internalSetOnItemClickListener(OnItemClickListener l) { + super.setOnItemClickListener(l); + } + + @Override + public void layout(int delta, boolean animate) { + int childrenLeft = mSpinnerPadding.left; + int childrenWidth = getRight() - getLeft() - mSpinnerPadding.left + - mSpinnerPadding.right; + if (mDataChanged) { + handleDataChanged(); + } + if (mItemCount == 0) { + resetList(); + return; + } + if (mNextSelectedPosition >= 0) { + setSelectedPositionInt(mNextSelectedPosition); + } + recycleAllViews(); + removeAllViewsInLayout(); + 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); + mRecycler.clear(); + invalidate(); + checkSelectionChanged(); + mDataChanged = false; + mNeedSync = false; + setNextSelectedPositionInt(mSelectedPosition); + } + + private View makeAndAddView(int position) { + View child; + if (!mDataChanged) { + child = mRecycler.get(position); + if (child != null) { + setUpChild(child); + return child; + } + } + child = mAdapter.getView(position, null, this); + setUpChild(child); + return child; + } + + 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); + int start = Math.max(0, getSelectedItemPosition()); + final int end = Math.min(adapter.getCount(), start + + Spinner.MAX_ITEMS_MEASURED); + final int count = end - start; + start = Math.max(0, start - (Spinner.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()); + } + if (background != null) { + background.getPadding(mTempRect); + width += mTempRect.left + mTempRect.right; + } + return width; + } + + @Override + public void onClick(DialogInterface dialog, int which) { + setSelection(which); + dialog.dismiss(); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + if (mPopup != null && mPopup.isShowing()) { + mPopup.dismiss(); + } + } + + @Override + public void onInitializeAccessibilityEvent(AccessibilityEvent event) { + super.onInitializeAccessibilityEvent(event); + event.setClassName(Spinner.class.getName()); + } + + @Override + @SuppressLint("NewApi") + public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { + super.onInitializeAccessibilityNodeInfo(info); + info.setClassName(Spinner.class.getName()); + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + super.onLayout(changed, l, t, r, b); + layout(0, false); + } + + @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()); + } + } + + @Override + public boolean performClick() { + boolean handled = super.performClick(); + if (!handled) { + handled = true; + if (!mPopup.isShowing()) { + mPopup.show(); + } + } + return handled; + } + + @Override + public void setAdapter(SpinnerAdapter adapter) { + super.setAdapter(adapter); + if (mPopup != null) { + mPopup.setAdapter(new DropDownAdapter(adapter)); + } else { + mTempAdapter = new DropDownAdapter(adapter); + } + } + + public void setDropDownHorizontalOffset(int pixels) { + mPopup.setHorizontalOffset(pixels); + } + + public void setDropDownVerticalOffset(int pixels) { + mPopup.setVerticalOffset(pixels); + } + + public void setDropDownWidth(int pixels) { + if (!(mPopup instanceof DropdownPopup)) { + Log.e(Spinner.TAG, + "Cannot set dropdown width for MODE_DIALOG, ignoring"); + return; + } + mDropDownWidth = pixels; + } + + @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); + } + } + } + + public void setGravity(int gravity) { + if (mGravity != gravity) { + if ((gravity & Gravity.HORIZONTAL_GRAVITY_MASK) == 0) { + gravity |= Gravity.LEFT; + } + mGravity = gravity; + requestLayout(); + } + } + + @Override + public void setOnItemClickListener(OnItemClickListener l) { + throw new RuntimeException( + "setOnItemClickListener cannot be used with a spinner."); + } + + public void setPopupBackgroundDrawable(Drawable background) { + if (!(mPopup instanceof DropdownPopup)) { + Log.e(Spinner.TAG, + "setPopupBackgroundDrawable: incompatible spinner mode; ignoring..."); + return; + } + ((DropdownPopup) mPopup).setBackgroundDrawable(background); + } + + public void setPopupBackgroundResource(int resId) { + setPopupBackgroundDrawable(getContext().getResources().getDrawable( + resId)); + } + + public void setPrompt(CharSequence prompt) { + mPopup.setPromptText(prompt); + } + + public void setPromptId(int promptId) { + setPrompt(getContext().getText(promptId)); + } + + private void setUpChild(View child) { + ViewGroup.LayoutParams lp = child.getLayoutParams(); + if (lp == null) { + lp = generateDefaultLayoutParams(); + } + addViewInLayout(child, 0, lp); + child.setSelected(hasFocus()); + if (mDisableChildrenWhenDisabled) { + child.setEnabled(isEnabled()); + } + int childHeightSpec = ViewGroup.getChildMeasureSpec(mHeightMeasureSpec, + mSpinnerPadding.top + mSpinnerPadding.bottom, lp.height); + int childWidthSpec = ViewGroup.getChildMeasureSpec(mWidthMeasureSpec, + mSpinnerPadding.left + mSpinnerPadding.right, lp.width); + child.measure(childWidthSpec, childHeightSpec); + int childLeft = 0; + int childTop = mSpinnerPadding.top + + (getMeasuredHeight() - mSpinnerPadding.bottom + - mSpinnerPadding.top - child.getMeasuredHeight()) / 2; + int childBottom = childTop + child.getMeasuredHeight(); + int width = child.getMeasuredWidth(); + int childRight = childLeft + width; + child.layout(childLeft, childTop, childRight, childBottom); + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/Switch.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/Switch.java new file mode 100644 index 0000000000..0d6a36d3da --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/Switch.java @@ -0,0 +1,593 @@ + +package org.holoeverywhere.widget; + +import org.holoeverywhere.R; +import org.holoeverywhere.text.AllCapsTransformationMethod; +import org.holoeverywhere.text.TransformationMethod; + +import android.content.Context; +import android.content.res.ColorStateList; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.Typeface; +import android.graphics.drawable.Drawable; +import android.support.v4.view.MotionEventCompat; +import android.text.Layout; +import android.text.StaticLayout; +import android.text.TextPaint; +import android.text.TextUtils; +import android.util.AttributeSet; +import android.view.Gravity; +import android.view.MotionEvent; +import android.view.VelocityTracker; +import android.view.ViewConfiguration; +import android.view.accessibility.AccessibilityEvent; +import android.view.accessibility.AccessibilityNodeInfo; +import android.widget.CompoundButton; + +public class Switch extends CompoundButton { + private static final int[] CHECKED_STATE_SET = { + android.R.attr.state_checked + }; + private static final int MONOSPACE = 3; + private static final int SANS = 1; + private static final int SERIF = 2; + private static final int TOUCH_MODE_DOWN = 1; + private static final int TOUCH_MODE_DRAGGING = 2; + private static final int TOUCH_MODE_IDLE = 0; + private int mMinFlingVelocity; + private Layout mOffLayout; + private Layout mOnLayout; + private int mSwitchBottom; + private int mSwitchHeight; + private int mSwitchLeft; + private int mSwitchMinWidth; + private int mSwitchPadding; + private int mSwitchRight; + private int mSwitchTop; + private TransformationMethod mSwitchTransformationMethod; + private int mSwitchWidth; + private final Rect mTempRect = new Rect(); + private ColorStateList mTextColors; + private CharSequence mTextOff; + private CharSequence mTextOn; + private TextPaint mTextPaint; + private Drawable mThumbDrawable; + private float mThumbPosition; + private int mThumbTextPadding; + private int mThumbWidth; + private boolean mToggleWhenClick; + private int mTouchMode; + private int mTouchSlop; + private float mTouchX; + private float mTouchY; + private Drawable mTrackDrawable; + private VelocityTracker mVelocityTracker = VelocityTracker.obtain(); + + public Switch(Context context) { + this(context, null); + } + + public Switch(Context context, AttributeSet attrs) { + this(context, attrs, R.attr.switchStyle); + } + + public Switch(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + mTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); + Resources res = getResources(); + mTextPaint.density = res.getDisplayMetrics().density; + // TODO + // mTextPaint.setCompatibilityScaling(res.getCompatibilityInfo().applicationScale); + TypedArray a = context.obtainStyledAttributes(attrs, + R.styleable.Switch, defStyle, 0); + mThumbDrawable = a.getDrawable(R.styleable.Switch_thumb); + mTrackDrawable = a.getDrawable(R.styleable.Switch_track); + mTextOn = a.getText(R.styleable.Switch_textOn); + mTextOff = a.getText(R.styleable.Switch_textOff); + mThumbTextPadding = a.getDimensionPixelSize( + R.styleable.Switch_thumbTextPadding, 0); + mSwitchMinWidth = a.getDimensionPixelSize( + R.styleable.Switch_switchMinWidth, 0); + mSwitchPadding = a.getDimensionPixelSize( + R.styleable.Switch_switchPadding, 0); + mToggleWhenClick = a.getBoolean(R.styleable.Switch_toggleWhenClick, true); + int appearance = a.getResourceId(R.styleable.Switch_switchTextAppearance, 0); + if (appearance != 0) { + setSwitchTextAppearance(context, appearance); + } + a.recycle(); + ViewConfiguration config = ViewConfiguration.get(context); + mTouchSlop = config.getScaledTouchSlop(); + mMinFlingVelocity = config.getScaledMinimumFlingVelocity(); + refreshDrawableState(); + setChecked(isChecked()); + } + + private void animateThumbToCheckedState(boolean newCheckedState) { + // TODO animate! + // float targetPos = newCheckedState ? 0 : getThumbScrollRange(); + // mThumbPosition = targetPos; + setChecked(newCheckedState); + } + + private void cancelSuperTouch(MotionEvent ev) { + MotionEvent cancel = MotionEvent.obtain(ev); + cancel.setAction(MotionEvent.ACTION_CANCEL); + super.onTouchEvent(cancel); + cancel.recycle(); + } + + @Override + protected void drawableStateChanged() { + super.drawableStateChanged(); + int[] myDrawableState = getDrawableState(); + if (mThumbDrawable != null) { + mThumbDrawable.setState(myDrawableState); + } + if (mTrackDrawable != null) { + mTrackDrawable.setState(myDrawableState); + } + invalidate(); + } + + @Override + public int getCompoundPaddingRight() { + int padding = super.getCompoundPaddingRight() + mSwitchWidth; + if (!TextUtils.isEmpty(getText())) { + padding += mSwitchPadding; + } + return padding; + } + + public int getSwitchMinWidth() { + return mSwitchMinWidth; + } + + public int getSwitchPadding() { + return mSwitchPadding; + } + + private boolean getTargetCheckedState() { + return mThumbPosition >= getThumbScrollRange() / 2; + } + + public CharSequence getTextOff() { + return mTextOff; + } + + public CharSequence getTextOn() { + return mTextOn; + } + + public Drawable getThumbDrawable() { + return mThumbDrawable; + } + + private int getThumbScrollRange() { + if (mTrackDrawable == null) { + return 0; + } + mTrackDrawable.getPadding(mTempRect); + return mSwitchWidth - mThumbWidth - mTempRect.left - mTempRect.right; + } + + public int getThumbTextPadding() { + return mThumbTextPadding; + } + + public Drawable getTrackDrawable() { + return mTrackDrawable; + } + + private boolean hitThumb(float x, float y) { + mThumbDrawable.getPadding(mTempRect); + final int thumbTop = mSwitchTop - mTouchSlop; + final int thumbLeft = mSwitchLeft + (int) (mThumbPosition + 0.5f) - mTouchSlop; + final int thumbRight = thumbLeft + mThumbWidth + + mTempRect.left + mTempRect.right + mTouchSlop; + final int thumbBottom = mSwitchBottom + mTouchSlop; + return x > thumbLeft && x < thumbRight && y > thumbTop && y < thumbBottom; + } + + public boolean isToggleWhenClick() { + return mToggleWhenClick; + } + + @Override + public void jumpDrawablesToCurrentState() { + super.jumpDrawablesToCurrentState(); + mThumbDrawable.jumpToCurrentState(); + mTrackDrawable.jumpToCurrentState(); + } + + private Layout makeLayout(CharSequence text) { + final CharSequence transformed = mSwitchTransformationMethod != null + ? mSwitchTransformationMethod.getTransformation(text, this) + : text; + return new StaticLayout(transformed, mTextPaint, + (int) Math.ceil(Layout.getDesiredWidth(transformed, mTextPaint)), + Layout.Alignment.ALIGN_NORMAL, 1.f, 0, true); + } + + @Override + protected int[] onCreateDrawableState(int extraSpace) { + final int[] drawableState = super.onCreateDrawableState(extraSpace + 1); + if (isChecked()) { + mergeDrawableStates(drawableState, CHECKED_STATE_SET); + } + return drawableState; + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + int switchLeft = mSwitchLeft; + int switchTop = mSwitchTop; + int switchRight = mSwitchRight; + int switchBottom = mSwitchBottom; + mTrackDrawable.setBounds(switchLeft, switchTop, switchRight, switchBottom); + mTrackDrawable.draw(canvas); + final int saveState = canvas.save(); + mTrackDrawable.getPadding(mTempRect); + int switchInnerLeft = switchLeft + mTempRect.left; + int switchInnerTop = switchTop + mTempRect.top; + int switchInnerRight = switchRight - mTempRect.right; + int switchInnerBottom = switchBottom - mTempRect.bottom; + canvas.clipRect(switchInnerLeft, switchTop, switchInnerRight, switchBottom); + mThumbDrawable.getPadding(mTempRect); + final int thumbPos = (int) (mThumbPosition + 0.5f); + int thumbLeft = switchInnerLeft - mTempRect.left + thumbPos; + int thumbRight = switchInnerLeft + thumbPos + mThumbWidth + mTempRect.right; + mThumbDrawable.setBounds(thumbLeft, switchTop, thumbRight, switchBottom); + mThumbDrawable.draw(canvas); + if (mTextColors != null) { + mTextPaint.setColor(mTextColors.getColorForState(getDrawableState(), + mTextColors.getDefaultColor())); + } + mTextPaint.drawableState = getDrawableState(); + Layout switchText = getTargetCheckedState() ? mOnLayout : mOffLayout; + canvas.translate((thumbLeft + thumbRight) / 2 - switchText.getWidth() / 2, + (switchInnerTop + switchInnerBottom) / 2 - switchText.getHeight() / 2); + switchText.draw(canvas); + canvas.restoreToCount(saveState); + } + + @Override + public void onInitializeAccessibilityEvent(AccessibilityEvent event) { + super.onInitializeAccessibilityEvent(event); + event.setClassName(Switch.class.getName()); + } + + @Override + public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { + super.onInitializeAccessibilityNodeInfo(info); + info.setClassName(Switch.class.getName()); + CharSequence switchText = isChecked() ? mTextOn : mTextOff; + if (!TextUtils.isEmpty(switchText)) { + CharSequence oldText = info.getText(); + if (TextUtils.isEmpty(oldText)) { + info.setText(switchText); + } else { + StringBuilder newText = new StringBuilder(); + newText.append(oldText).append(' ').append(switchText); + info.setText(newText); + } + } + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); + mThumbPosition = isChecked() ? getThumbScrollRange() : 0; + int switchRight = getWidth() - getPaddingRight(); + int switchLeft = switchRight - mSwitchWidth; + int switchTop = 0; + int switchBottom = 0; + switch (getGravity() & Gravity.VERTICAL_GRAVITY_MASK) { + default: + case Gravity.TOP: + switchTop = getPaddingTop(); + switchBottom = switchTop + mSwitchHeight; + break; + case Gravity.CENTER_VERTICAL: + switchTop = (getPaddingTop() + getHeight() - getPaddingBottom()) / 2 - + mSwitchHeight / 2; + switchBottom = switchTop + mSwitchHeight; + break; + case Gravity.BOTTOM: + switchBottom = getHeight() - getPaddingBottom(); + switchTop = switchBottom - mSwitchHeight; + break; + } + mSwitchLeft = switchLeft; + mSwitchTop = switchTop; + mSwitchBottom = switchBottom; + mSwitchRight = switchRight; + } + + @Override + public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + final int widthMode = MeasureSpec.getMode(widthMeasureSpec); + final int heightMode = MeasureSpec.getMode(heightMeasureSpec); + int widthSize = MeasureSpec.getSize(widthMeasureSpec); + int heightSize = MeasureSpec.getSize(heightMeasureSpec); + if (mOnLayout == null) { + mOnLayout = makeLayout(mTextOn); + } + if (mOffLayout == null) { + mOffLayout = makeLayout(mTextOff); + } + mTrackDrawable.getPadding(mTempRect); + final int maxTextWidth = Math.max(mOnLayout.getWidth(), mOffLayout.getWidth()); + final int switchWidth = Math.max(mSwitchMinWidth, + maxTextWidth * 2 + mThumbTextPadding * 4 + mTempRect.left + mTempRect.right); + final int switchHeight = mTrackDrawable.getIntrinsicHeight(); + mThumbWidth = maxTextWidth + mThumbTextPadding * 2; + switch (widthMode) { + case MeasureSpec.AT_MOST: + widthSize = Math.min(widthSize, switchWidth); + break; + case MeasureSpec.UNSPECIFIED: + widthSize = switchWidth; + break; + case MeasureSpec.EXACTLY: + break; + } + switch (heightMode) { + case MeasureSpec.AT_MOST: + heightSize = Math.min(heightSize, switchHeight); + break; + case MeasureSpec.UNSPECIFIED: + heightSize = switchHeight; + break; + case MeasureSpec.EXACTLY: + break; + } + mSwitchWidth = switchWidth; + mSwitchHeight = switchHeight; + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + final int measuredHeight = getMeasuredHeight(); + if (measuredHeight < switchHeight) { + setMeasuredDimension(getMeasuredWidth(), switchHeight); + } + } + + @Override + public void onPopulateAccessibilityEvent(AccessibilityEvent event) { + super.onPopulateAccessibilityEvent(event); + CharSequence text = isChecked() ? mOnLayout.getText() : mOffLayout.getText(); + if (!TextUtils.isEmpty(text)) { + event.getText().add(text); + } + } + + @Override + public boolean onTouchEvent(MotionEvent ev) { + mVelocityTracker.addMovement(ev); + switch (MotionEventCompat.getActionMasked(ev)) { + case MotionEvent.ACTION_DOWN: { + final float x = ev.getX(); + final float y = ev.getY(); + if (isEnabled() && hitThumb(x, y)) { + mTouchMode = TOUCH_MODE_DOWN; + mTouchX = x; + mTouchY = y; + } + return true; + } + case MotionEvent.ACTION_MOVE: { + switch (mTouchMode) { + case TOUCH_MODE_IDLE: + break; + case TOUCH_MODE_DOWN: { + final float x = ev.getX(); + final float y = ev.getY(); + if (Math.abs(x - mTouchX) > mTouchSlop || + Math.abs(y - mTouchY) > mTouchSlop) { + mTouchMode = TOUCH_MODE_DRAGGING; + getParent().requestDisallowInterceptTouchEvent(true); + mTouchX = x; + mTouchY = y; + return true; + } + break; + } + case TOUCH_MODE_DRAGGING: { + final float x = ev.getX(); + final float dx = x - mTouchX; + float newPos = Math.max(0, + Math.min(mThumbPosition + dx, getThumbScrollRange())); + if (newPos != mThumbPosition) { + mThumbPosition = newPos; + mTouchX = x; + invalidate(); + } + return true; + } + } + break; + } + case MotionEvent.ACTION_UP: + if (mTouchMode == TOUCH_MODE_DOWN && mToggleWhenClick) { + toggle(); + cancelSuperTouch(ev); + mTouchMode = TOUCH_MODE_IDLE; + mVelocityTracker.clear(); + return true; + } + case MotionEvent.ACTION_CANCEL: { + if (mTouchMode == TOUCH_MODE_DRAGGING) { + stopDrag(ev); + return true; + } + mTouchMode = TOUCH_MODE_IDLE; + mVelocityTracker.clear(); + break; + } + } + return super.onTouchEvent(ev); + } + + @Override + public void setChecked(boolean checked) { + super.setChecked(checked); + mThumbPosition = checked ? getThumbScrollRange() : 0; + invalidate(); + } + + public void setSwitchMinWidth(int pixels) { + mSwitchMinWidth = pixels; + requestLayout(); + } + + public void setSwitchPadding(int pixels) { + mSwitchPadding = pixels; + requestLayout(); + } + + public void setSwitchTextAppearance(Context context, int resid) { + TypedArray appearance = + context.obtainStyledAttributes(resid, + R.styleable.TextAppearance); + ColorStateList colors; + int ts; + colors = appearance.getColorStateList(R.styleable. + TextAppearance_android_textColor); + if (colors != null) { + mTextColors = colors; + } else { + mTextColors = getTextColors(); + } + ts = appearance.getDimensionPixelSize(R.styleable. + TextAppearance_android_textSize, 0); + if (ts != 0) { + if (ts != mTextPaint.getTextSize()) { + mTextPaint.setTextSize(ts); + requestLayout(); + } + } + int typefaceIndex, styleIndex; + typefaceIndex = appearance.getInt(R.styleable. + TextAppearance_android_typeface, -1); + styleIndex = appearance.getInt(R.styleable. + TextAppearance_android_textStyle, -1); + setSwitchTypefaceByIndex(typefaceIndex, styleIndex); + boolean allCaps = appearance.getBoolean(R.styleable. + TextAppearance_android_textAllCaps, false); + if (allCaps) { + mSwitchTransformationMethod = new AllCapsTransformationMethod(getContext()); + mSwitchTransformationMethod.setLengthChangesAllowed(true); + } else { + mSwitchTransformationMethod = null; + } + appearance.recycle(); + } + + public void setSwitchTypeface(Typeface tf) { + if (mTextPaint.getTypeface() != tf) { + mTextPaint.setTypeface(tf); + requestLayout(); + invalidate(); + } + } + + public void setSwitchTypeface(Typeface tf, int style) { + if (style > 0) { + if (tf == null) { + tf = Typeface.defaultFromStyle(style); + } else { + tf = Typeface.create(tf, style); + } + setSwitchTypeface(tf); + int typefaceStyle = tf != null ? tf.getStyle() : 0; + int need = style & ~typefaceStyle; + mTextPaint.setFakeBoldText((need & Typeface.BOLD) != 0); + mTextPaint.setTextSkewX((need & Typeface.ITALIC) != 0 ? -0.25f : 0); + } else { + mTextPaint.setFakeBoldText(false); + mTextPaint.setTextSkewX(0); + setSwitchTypeface(tf); + } + } + + private void setSwitchTypefaceByIndex(int typefaceIndex, int styleIndex) { + Typeface tf = null; + switch (typefaceIndex) { + case SANS: + tf = Typeface.SANS_SERIF; + break; + case SERIF: + tf = Typeface.SERIF; + break; + case MONOSPACE: + tf = Typeface.MONOSPACE; + break; + } + setSwitchTypeface(tf, styleIndex); + } + + public void setTextOff(CharSequence textOff) { + mTextOff = textOff; + requestLayout(); + } + + public void setTextOn(CharSequence textOn) { + mTextOn = textOn; + requestLayout(); + } + + public void setThumbDrawable(Drawable thumb) { + mThumbDrawable = thumb; + requestLayout(); + } + + public void setThumbResource(int resId) { + setThumbDrawable(getContext().getResources().getDrawable(resId)); + } + + public void setThumbTextPadding(int pixels) { + mThumbTextPadding = pixels; + requestLayout(); + } + + public void setToggleWhenClick(boolean mToggleWhenClick) { + this.mToggleWhenClick = mToggleWhenClick; + } + + public void setTrackDrawable(Drawable track) { + mTrackDrawable = track; + requestLayout(); + } + + public void setTrackResource(int resId) { + setTrackDrawable(getContext().getResources().getDrawable(resId)); + } + + private void stopDrag(MotionEvent ev) { + mTouchMode = TOUCH_MODE_IDLE; + boolean commitChange = ev.getAction() == MotionEvent.ACTION_UP && isEnabled(); + cancelSuperTouch(ev); + if (commitChange) { + boolean newState; + mVelocityTracker.computeCurrentVelocity(1000); + float xvel = mVelocityTracker.getXVelocity(); + if (Math.abs(xvel) > mMinFlingVelocity) { + newState = xvel > 0; + } else { + newState = getTargetCheckedState(); + } + animateThumbToCheckedState(newState); + } else { + animateThumbToCheckedState(isChecked()); + } + } + + @Override + protected boolean verifyDrawable(Drawable who) { + return super.verifyDrawable(who) || who == mThumbDrawable || who == mTrackDrawable; + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/TextView.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/TextView.java new file mode 100644 index 0000000000..9fb274a53e --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/TextView.java @@ -0,0 +1,84 @@ + +package org.holoeverywhere.widget; + +import org.holoeverywhere.R; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.res.TypedArray; +import android.os.Build.VERSION; +import android.util.AttributeSet; + +public class TextView extends android.widget.TextView { + private boolean allCaps = false; + private CharSequence originalText; + private BufferType originalType; + + public TextView(Context context) { + this(context, null); + } + + public TextView(Context context, AttributeSet attrs) { + this(context, attrs, android.R.attr.textViewStyle); + } + + public TextView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + TypedArray a = getContext().obtainStyledAttributes(attrs, + R.styleable.TextView, defStyle, 0); + if (a.hasValue(R.styleable.TextView_android_textAllCaps)) { + allCaps = a.getBoolean(R.styleable.TextView_android_textAllCaps, + false); + } else { + allCaps = a.getBoolean(R.styleable.TextView_textAllCaps, false); + } + CharSequence text = null; + if (a.hasValue(R.styleable.TextView_android_text)) { + text = a.getText(R.styleable.TextView_android_text); + } + a.recycle(); + if (text != null) { + setText(text); + } + } + + @Override + @SuppressLint("NewApi") + public void dispatchDisplayHint(int hint) { + onDisplayHint(hint); + } + + public boolean isAllCaps() { + return allCaps; + } + + @Override + @SuppressLint("NewApi") + protected void onDisplayHint(int hint) { + if (VERSION.SDK_INT >= 8) { + super.onDisplayHint(hint); + } + } + + @Override + public void setAllCaps(boolean allCaps) { + this.allCaps = allCaps; + updateTextState(); + } + + @Override + public void setText(CharSequence text, BufferType type) { + originalText = text; + originalType = type; + updateTextState(); + } + + private void updateTextState() { + if (originalText == null) { + super.setText(null, originalType); + return; + } + super.setText(allCaps ? originalText.toString().toUpperCase() + : originalText, originalType); + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/TimePicker.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/TimePicker.java new file mode 100644 index 0000000000..962074bd7f --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/TimePicker.java @@ -0,0 +1,464 @@ + +package org.holoeverywhere.widget; + +import java.text.DateFormatSymbols; +import java.util.Calendar; +import java.util.Locale; + +import org.holoeverywhere.FontLoader; +import org.holoeverywhere.LayoutInflater; +import org.holoeverywhere.R; +import org.holoeverywhere.internal.NumberPickerEditText; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.res.Configuration; +import android.content.res.TypedArray; +import android.os.Build.VERSION; +import android.os.Parcel; +import android.os.Parcelable; +import android.text.format.DateUtils; +import android.util.AttributeSet; +import android.view.View; +import android.view.accessibility.AccessibilityEvent; +import android.view.inputmethod.EditorInfo; +import android.view.inputmethod.InputMethodManager; +import android.widget.Button; +import android.widget.FrameLayout; + +public class TimePicker extends FrameLayout { + public interface OnTimeChangedListener { + void onTimeChanged(TimePicker view, int hourOfDay, int minute); + } + + private static class SavedState extends BaseSavedState { + @SuppressWarnings("unused") + public static final Creator CREATOR = new Creator() { + @Override + public SavedState createFromParcel(Parcel in) { + return new SavedState(in); + } + + @Override + public SavedState[] newArray(int size) { + return new SavedState[size]; + } + }; + + private final int mHour, mMinute; + + private SavedState(Parcel in) { + super(in); + mHour = in.readInt(); + mMinute = in.readInt(); + } + + private SavedState(Parcelable superState, int hour, int minute) { + super(superState); + mHour = hour; + mMinute = minute; + } + + public int getHour() { + return mHour; + } + + public int getMinute() { + return mMinute; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + super.writeToParcel(dest, flags); + dest.writeInt(mHour); + dest.writeInt(mMinute); + } + } + + private static final boolean DEFAULT_ENABLED_STATE = true; + private static final int HOURS_IN_HALF_DAY = 12; + private static final OnTimeChangedListener NO_OP_CHANGE_LISTENER = new OnTimeChangedListener() { + @Override + public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { + } + }; + + private static void setContentDescription(View parent, int childId, + int textId) { + if (parent == null) { + return; + } + View child = parent.findViewById(childId); + if (child != null) { + child.setContentDescription(parent.getContext().getText(textId)); + } + } + + private final Button mAmPmButton; + private final String[] mAmPmStrings; + private Context mContext; + private Locale mCurrentLocale; + private final TextView mDivider; + private final NumberPicker mHourSpinner, mMinuteSpinner, mAmPmSpinner; + private final NumberPickerEditText mHourSpinnerInput, mMinuteSpinnerInput, + mAmPmSpinnerInput; + private boolean mIs24HourView, mIsAm; + + private boolean mIsEnabled = TimePicker.DEFAULT_ENABLED_STATE; + + private OnTimeChangedListener mOnTimeChangedListener; + + private Calendar mTempCalendar; + + public TimePicker(Context context) { + this(context, null); + } + + public TimePicker(Context context, AttributeSet attrs) { + this(context, attrs, R.attr.timePickerStyle); + } + + public TimePicker(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + mContext = context; + setCurrentLocale(Locale.getDefault()); + TypedArray attributesArray = context.obtainStyledAttributes(attrs, + R.styleable.TimePicker, defStyle, R.style.Holo_TimePicker); + int layoutResourceId = attributesArray.getResourceId( + R.styleable.TimePicker_layout, R.layout.time_picker_holo); + attributesArray.recycle(); + LayoutInflater.inflate(mContext, layoutResourceId, this, true); + FontLoader.apply(this); + mHourSpinner = (NumberPicker) findViewById(R.id.hour); + mHourSpinner + .setOnValueChangedListener(new NumberPicker.OnValueChangeListener() { + @Override + public void onValueChange(NumberPicker spinner, int oldVal, + int newVal) { + updateInputState(); + if (!is24HourView()) { + if (oldVal == TimePicker.HOURS_IN_HALF_DAY - 1 + && newVal == TimePicker.HOURS_IN_HALF_DAY + || oldVal == TimePicker.HOURS_IN_HALF_DAY + && newVal == TimePicker.HOURS_IN_HALF_DAY - 1) { + mIsAm = !mIsAm; + updateAmPmControl(); + } + } + onTimeChanged(); + } + }); + mHourSpinnerInput = mHourSpinner.getInputField(); + mHourSpinnerInput.setImeOptions(EditorInfo.IME_ACTION_NEXT); + mDivider = (TextView) findViewById(R.id.divider); + if (mDivider != null) { + mDivider.setText(R.string.time_picker_separator); + } + mMinuteSpinner = (NumberPicker) findViewById(R.id.minute); + mMinuteSpinner.setMinValue(0); + mMinuteSpinner.setMaxValue(59); + mMinuteSpinner.setOnLongPressUpdateInterval(100); + mMinuteSpinner.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER); + mMinuteSpinner + .setOnValueChangedListener(new NumberPicker.OnValueChangeListener() { + @Override + public void onValueChange(NumberPicker spinner, int oldVal, + int newVal) { + updateInputState(); + int minValue = mMinuteSpinner.getMinValue(); + int maxValue = mMinuteSpinner.getMaxValue(); + if (oldVal == maxValue && newVal == minValue) { + int newHour = mHourSpinner.getValue() + 1; + if (!is24HourView() + && newHour == TimePicker.HOURS_IN_HALF_DAY) { + mIsAm = !mIsAm; + updateAmPmControl(); + } + mHourSpinner.setValue(newHour); + } else if (oldVal == minValue && newVal == maxValue) { + int newHour = mHourSpinner.getValue() - 1; + if (!is24HourView() + && newHour == TimePicker.HOURS_IN_HALF_DAY - 1) { + mIsAm = !mIsAm; + updateAmPmControl(); + } + mHourSpinner.setValue(newHour); + } + onTimeChanged(); + } + }); + mMinuteSpinnerInput = mMinuteSpinner.getInputField(); + mMinuteSpinnerInput.setImeOptions(EditorInfo.IME_ACTION_NEXT); + mAmPmStrings = new DateFormatSymbols().getAmPmStrings(); + View amPmView = findViewById(R.id.amPm); + if (amPmView instanceof Button) { + mAmPmSpinner = null; + mAmPmSpinnerInput = null; + mAmPmButton = (Button) amPmView; + mAmPmButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View button) { + button.requestFocus(); + mIsAm = !mIsAm; + updateAmPmControl(); + onTimeChanged(); + } + }); + } else { + mAmPmButton = null; + mAmPmSpinner = (NumberPicker) amPmView; + mAmPmSpinner.setMinValue(0); + mAmPmSpinner.setMaxValue(1); + mAmPmSpinner.setDisplayedValues(mAmPmStrings); + mAmPmSpinner + .setOnValueChangedListener(new NumberPicker.OnValueChangeListener() { + @Override + public void onValueChange(NumberPicker picker, + int oldVal, int newVal) { + updateInputState(); + picker.requestFocus(); + mIsAm = !mIsAm; + updateAmPmControl(); + onTimeChanged(); + } + }); + mAmPmSpinnerInput = mAmPmSpinner.getInputField(); + mAmPmSpinnerInput.setImeOptions(EditorInfo.IME_ACTION_DONE); + } + updateHourControl(); + updateAmPmControl(); + setOnTimeChangedListener(TimePicker.NO_OP_CHANGE_LISTENER); + setCurrentHour(mTempCalendar.get(Calendar.HOUR_OF_DAY)); + setCurrentMinute(mTempCalendar.get(Calendar.MINUTE)); + if (!isEnabled()) { + setEnabled(false); + } + setContentDescriptions(); + } + + @SuppressLint("NewApi") + @Override + public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { + if (VERSION.SDK_INT >= 14) { + onPopulateAccessibilityEvent(event); + return true; + } else { + return super.dispatchPopulateAccessibilityEvent(event); + } + } + + @Override + public int getBaseline() { + return mHourSpinner.getBaseline(); + } + + public Integer getCurrentHour() { + int currentHour = mHourSpinner.getValue(); + if (is24HourView()) { + return currentHour; + } else if (mIsAm) { + return currentHour % TimePicker.HOURS_IN_HALF_DAY; + } else { + return currentHour % TimePicker.HOURS_IN_HALF_DAY + + TimePicker.HOURS_IN_HALF_DAY; + } + } + + public Integer getCurrentMinute() { + return mMinuteSpinner.getValue(); + } + + public boolean is24HourView() { + return mIs24HourView; + } + + @Override + public boolean isEnabled() { + return mIsEnabled; + } + + @SuppressLint("NewApi") + @Override + protected void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + setCurrentLocale(newConfig.locale); + } + + @SuppressLint("NewApi") + @Override + public void onPopulateAccessibilityEvent(AccessibilityEvent event) { + super.onPopulateAccessibilityEvent(event); + int flags = DateUtils.FORMAT_SHOW_TIME; + if (mIs24HourView) { + flags |= DateUtils.FORMAT_24HOUR; + } else { + flags |= DateUtils.FORMAT_12HOUR; + } + mTempCalendar.set(Calendar.HOUR_OF_DAY, getCurrentHour()); + mTempCalendar.set(Calendar.MINUTE, getCurrentMinute()); + String selectedDateUtterance = DateUtils.formatDateTime(mContext, + mTempCalendar.getTimeInMillis(), flags); + event.getText().add(selectedDateUtterance); + } + + @Override + protected void onRestoreInstanceState(Parcelable state) { + SavedState ss = (SavedState) state; + super.onRestoreInstanceState(ss.getSuperState()); + setCurrentHour(ss.getHour()); + setCurrentMinute(ss.getMinute()); + } + + @Override + protected Parcelable onSaveInstanceState() { + Parcelable superState = super.onSaveInstanceState(); + return new SavedState(superState, getCurrentHour(), getCurrentMinute()); + } + + private void onTimeChanged() { + sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED); + if (mOnTimeChangedListener != null) { + mOnTimeChangedListener.onTimeChanged(this, getCurrentHour(), + getCurrentMinute()); + } + } + + private void setContentDescriptions() { + TimePicker.setContentDescription(mMinuteSpinner, R.id.increment, + R.string.time_picker_increment_minute_button); + TimePicker.setContentDescription(mMinuteSpinner, R.id.decrement, + R.string.time_picker_decrement_minute_button); + TimePicker.setContentDescription(mHourSpinner, R.id.increment, + R.string.time_picker_increment_hour_button); + TimePicker.setContentDescription(mHourSpinner, R.id.decrement, + R.string.time_picker_decrement_hour_button); + if (mAmPmSpinner != null) { + TimePicker.setContentDescription(mAmPmSpinner, R.id.increment, + R.string.time_picker_increment_set_pm_button); + TimePicker.setContentDescription(mAmPmSpinner, R.id.decrement, + R.string.time_picker_decrement_set_am_button); + } + } + + public void setCurrentHour(Integer currentHour) { + if (currentHour == null || currentHour == getCurrentHour()) { + return; + } + if (!is24HourView()) { + if (currentHour >= TimePicker.HOURS_IN_HALF_DAY) { + mIsAm = false; + if (currentHour > TimePicker.HOURS_IN_HALF_DAY) { + currentHour = currentHour - TimePicker.HOURS_IN_HALF_DAY; + } + } else { + mIsAm = true; + if (currentHour == 0) { + currentHour = TimePicker.HOURS_IN_HALF_DAY; + } + } + updateAmPmControl(); + } + mHourSpinner.setValue(currentHour); + onTimeChanged(); + } + + private void setCurrentLocale(Locale locale) { + if (locale.equals(mCurrentLocale)) { + return; + } + mCurrentLocale = locale; + mTempCalendar = Calendar.getInstance(locale); + } + + public void setCurrentMinute(Integer currentMinute) { + if (currentMinute == getCurrentMinute()) { + return; + } + mMinuteSpinner.setValue(currentMinute); + onTimeChanged(); + } + + @Override + public void setEnabled(boolean enabled) { + if (mIsEnabled == enabled) { + return; + } + super.setEnabled(enabled); + mMinuteSpinner.setEnabled(enabled); + if (mDivider != null) { + mDivider.setEnabled(enabled); + } + mHourSpinner.setEnabled(enabled); + if (mAmPmSpinner != null) { + mAmPmSpinner.setEnabled(enabled); + } else { + mAmPmButton.setEnabled(enabled); + } + mIsEnabled = enabled; + } + + public void setIs24HourView(Boolean is24HourView) { + if (mIs24HourView == is24HourView) { + return; + } + mIs24HourView = is24HourView; + int currentHour = getCurrentHour(); + updateHourControl(); + setCurrentHour(currentHour); + updateAmPmControl(); + } + + public void setOnTimeChangedListener( + OnTimeChangedListener onTimeChangedListener) { + mOnTimeChangedListener = onTimeChangedListener; + } + + private void updateAmPmControl() { + if (is24HourView()) { + if (mAmPmSpinner != null) { + mAmPmSpinner.setVisibility(View.GONE); + } else { + mAmPmButton.setVisibility(View.GONE); + } + } else { + int index = mIsAm ? Calendar.AM : Calendar.PM; + if (mAmPmSpinner != null) { + mAmPmSpinner.setValue(index); + mAmPmSpinner.setVisibility(View.VISIBLE); + } else { + mAmPmButton.setText(mAmPmStrings[index]); + mAmPmButton.setVisibility(View.VISIBLE); + } + } + sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED); + } + + private void updateHourControl() { + if (is24HourView()) { + mHourSpinner.setMinValue(0); + mHourSpinner.setMaxValue(23); + mHourSpinner.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER); + } else { + mHourSpinner.setMinValue(1); + mHourSpinner.setMaxValue(12); + mHourSpinner.setFormatter(null); + } + } + + private void updateInputState() { + InputMethodManager inputMethodManager = (InputMethodManager) mContext + .getSystemService(Context.INPUT_METHOD_SERVICE); + if (inputMethodManager != null) { + if (inputMethodManager.isActive(mHourSpinnerInput)) { + mHourSpinnerInput.clearFocus(); + inputMethodManager.hideSoftInputFromWindow(getWindowToken(), 0); + } else if (inputMethodManager.isActive(mMinuteSpinnerInput)) { + mMinuteSpinnerInput.clearFocus(); + inputMethodManager.hideSoftInputFromWindow(getWindowToken(), 0); + } else if (inputMethodManager.isActive(mAmPmSpinnerInput)) { + mAmPmSpinnerInput.clearFocus(); + inputMethodManager.hideSoftInputFromWindow(getWindowToken(), 0); + } + } + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/Toast.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/Toast.java new file mode 100644 index 0000000000..d7fb6bc098 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/Toast.java @@ -0,0 +1,48 @@ + +package org.holoeverywhere.widget; + +import org.holoeverywhere.R; + +import android.content.Context; +import android.util.Log; +import android.view.Gravity; + +public class Toast extends android.widget.Toast { + public static final int LENGTH_LONG = android.widget.Toast.LENGTH_LONG; + public static final int LENGTH_SHORT = android.widget.Toast.LENGTH_SHORT; + private static final String TAG = "Toast"; + + public static Toast makeText(Context context, CharSequence s, int duration) { + Toast toast = new Toast(context); + toast.setDuration(duration); + TextView view = new TextView(context); + view.setText(s); + view.setTextColor(0xFFFFFFFF); + view.setGravity(Gravity.CENTER); + view.setBackgroundResource(R.drawable.toast_frame); + toast.setView(view); + return toast; + } + + public static Toast makeText(Context context, int resId, int duration) { + return Toast.makeText(context, context.getResources().getString(resId), + duration); + } + + public Toast(Context context) { + super(context); + } + + @Override + public void setText(CharSequence s) { + if (getView() == null) { + return; + } + try { + ((TextView) getView()).setText(s); + } catch (ClassCastException e) { + Log.e(Toast.TAG, "This Toast was not created with Toast.makeText", + e); + } + } +} diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/ToggleButton.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/ToggleButton.java new file mode 100644 index 0000000000..4398966662 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/ToggleButton.java @@ -0,0 +1,84 @@ + +package org.holoeverywhere.widget; + +import org.holoeverywhere.R; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.res.TypedArray; +import android.os.Build.VERSION; +import android.util.AttributeSet; + +public class ToggleButton extends android.widget.ToggleButton { + private boolean allCaps = false; + private CharSequence originalText; + private BufferType originalType; + + public ToggleButton(Context context) { + this(context, null); + } + + public ToggleButton(Context context, AttributeSet attrs) { + this(context, attrs, android.R.attr.buttonStyleToggle); + } + + public ToggleButton(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + TypedArray a = getContext().obtainStyledAttributes(attrs, + R.styleable.TextView, defStyle, 0); + if (a.hasValue(R.styleable.TextView_android_textAllCaps)) { + allCaps = a.getBoolean(R.styleable.TextView_android_textAllCaps, + false); + } else { + allCaps = a.getBoolean(R.styleable.TextView_textAllCaps, false); + } + CharSequence text = null; + if (a.hasValue(R.styleable.TextView_android_text)) { + text = a.getText(R.styleable.TextView_android_text); + } + a.recycle(); + if (text != null) { + setText(text); + } + } + + @Override + @SuppressLint("NewApi") + public void dispatchDisplayHint(int hint) { + onDisplayHint(hint); + } + + public boolean isAllCaps() { + return allCaps; + } + + @Override + @SuppressLint("NewApi") + protected void onDisplayHint(int hint) { + if (VERSION.SDK_INT >= 8) { + super.onDisplayHint(hint); + } + } + + @Override + public void setAllCaps(boolean allCaps) { + this.allCaps = allCaps; + updateTextState(); + } + + @Override + public void setText(CharSequence text, BufferType type) { + originalText = text; + originalType = type; + updateTextState(); + } + + private void updateTextState() { + if (originalText == null) { + super.setText(null, originalType); + return; + } + super.setText(allCaps ? originalText.toString().toUpperCase() + : originalText, originalType); + } +} diff --git a/android/3rd_party/HoloEverywhere/support-library/android-support-v4-r13.jar b/android/3rd_party/HoloEverywhere/support-library/android-support-v4-r13.jar new file mode 100644 index 0000000000000000000000000000000000000000..428bdbc02a1aa32649e236e0734261bd68bc4e6f GIT binary patch literal 484258 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ПpHSAC30$g7yH$GiAcgHdf4hoNNNW2%pqu zqm$p?=GRMDf)wGe9H;r09RK&TjQ_Hv_fKyvIs3o#YMlOcZ8BTg>aQr}Re~xWmlV(? zs?N)M$fu!?PsQp%u!|&~RYs>FD#&9D94X_agdk;f?l|+*?Cc_nlWWB`!pX#_YNFxmH!C(N&tDvv;ZIOL8 zln~KycEM#t!65H6S7MIYG1cwkgJToX#!Uh7nD!v1YT~^O=yH5Baka@kZ`|#wbwy64 zGVk<#aTEU{gwHCimv*-{QOZ?=)-Oy$&YhLoiUXUqt?e~0l(rlvXm9#ypZqrh49bO8 zjF;);Ui~<$*V=Q*=8>KT7=_m#BR!X@Hr2?#-iNrqTp^2UeGL5SZhpy­S=@2b9k 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�@v;$9bpl_%m}> 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

    f4)&8pa{MTrd^Bdt^+KRphNNz9%3le_j=ZTL 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 z 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 literal 0 HcmV?d00001 diff --git a/android/MapsWithMePro/install-run.sh b/android/MapsWithMePro/install-run.sh new file mode 100755 index 0000000000..f05e85f58a --- /dev/null +++ b/android/MapsWithMePro/install-run.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +#1 +adb -s S557026e32038 uninstall com.mapswithme.maps.pro +adb -s S557026e32038 install bin/MapsWithMePro-debug.apk +adb -s S557026e32038 shell am start -a android.intent.action.MAIN -n com.mapswithme.maps.pro/com.mapswithme.maps.DownloadResourcesActivity +#2 +adb -s 4df1615c2383596f uninstall com.mapswithme.maps.pro +adb -s 4df1615c2383596f install -r bin/MapsWithMePro-debug.apk +adb -s 4df1615c2383596f shell am start -a android.intent.action.MAIN -n com.mapswithme.maps.pro/com.mapswithme.maps.DownloadResourcesActivity +#3 +adb -s B0CB060325140SCN uninstall com.mapswithme.maps.pro +adb -s B0CB060325140SCN install -r bin/MapsWithMePro-debug.apk +adb -s B0CB060325140SCN shell am start -a android.intent.action.MAIN -n com.mapswithme.maps.pro/com.mapswithme.maps.DownloadResourcesActivity

28MrrooN<8UQkq83F-g2t-n8fIcG# zR_-PU*4EZeU?FpRzXqTT$eM)AlgS3bj8B7&jg4#j90qa9psW`!UhHNX44Knlx)ws+ z&V|seTer4d2!%qS7*=xYdo=*-LdK64LY?}zT<`nyE4Y}Tth>{8Y4Rt-JrsR&wNL( zvkabh+z`R0i@70En)VG5=a!gp!rS855*xz8r1IgzhgO0uu@IE&$Fw$%xqS``oJGQC zzGEKC7+Yed^4uIXx5R=6wIya6p)%p7C=!BGV7pCGcryR(+qb?~uU-YNU%y^8IXM|b z*#^RAzGEKCplqT|(XeAvG{Cl)o1*F77Vk{3EglAa8Qd0c1=dkI81a%s2O}8s=D|px z<6xx4I2ajMEI4#WV?HW@bwW}{V+g3p9*tFjj2({7fLgxa;c)a9C{z5S!%^m;jCnZ9 zlK+UP@<^3(-oQHB+(Ta$>^rcHWwwQWt4KsJ~CHjEqS>Xj5x2#+TIm^m{(<0b{K^Ae^oZ~J;JRq?FT0n zyt=iF9wmD2R$i6!vUE0OQ#NH&Hf2*bWm7h#A^i!;MbYx~))OWG0000QU literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_on_disabled_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_on_disabled_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..346909d36f85d371a515fbd70cbccfe2999487cc GIT binary patch literal 1446 zcmZ{kdpOez9L9eb&0@!`6C(H0)3Dh*m`jt%Eeo5FGQ*6}#F*R= zsFX`Xg_@bpToS@z9+3{oS?4+boIlPV@B2RQ^L#(g_rLe1GtO2Tq6`55K-%68>ncpl z4}n2K2Yfo*gf8mqXp05*Z!m|S3Y%n@oo9qF?f%gjcCaM?fL_>Rtq6frtNBh;d3S}h zk_d|V_YA*~fh(3_3K&RZ#bv^MhiWo0YSVyrDM9km=fi{9Yb0KBZIg8iB-I3}feVpK zWLP}ejv^h`)XU=MkJ#+JexBJeuvie$z???HIRw0u5r?o(XD>Z>$NS{GXV*1MSkIEyk> zJW)nfN&;`gH8c8dT`i9ACdazE*%p39wI8Hwbx+*4D{?u4uX8e7b5hi!Q)kzuNW=OD zm)38sc(4?NgeAw|17V*2(M6!flv-Hq2_%zTxL^YI1MaBfWLH8Co0+DuIS9}I`_)VY z^HICE=-?coN3}!L{O4!9C*zh5p+(Y*K_5v?DpXr_Sp_p=FK+T7J>|@T=7`m*L-EDp zgCKeLQtjc}ZeBwS6)=Porq;VgAQq&{8US#QLdv{sul?O2UgAJPvc6dsR*B z1t-Z3H=gZYuLLI>zE;caESP3#^~Gthob@5_N{XB+so#Q(KaXJ zj@%1N5~xDj*H+vZr^||C>CMcB`whbezxI}SxksAjupk!=qVyk8xJBWyt;Q5!EXugC z*#srHK8|5b{G!|ZZlh=BrO_X1$fp-ydppf;UDbe#->2JWIll8fjXrN*q_SBeGw;jI`^<0_}z8W#!7r<9+i6@B@rBoJd?FB z3GxDNnCyKF?(wxreBb@##0o!UTg&6EMb6erVO!j&M~Dqgu1vPrM*)*(9nN|AEabt? zsdrR!<2RFT^50fr9`Y@<3p~ameffk%OTbZ2=u+Bo#rXrUv@BV^gIG>$ZTIRpt}T?I z1(6l;qm2ZAy*p7td^BCtAW@E(XhMC~o+zUmpkB1I>YAdz@;X_tZA}5iX)s3Jf|JhC zKTj1*Z{U^pT=bMM>kZVv=uK*T);V;(R4j;Mny=zc%2kZ4Di-J`_@HWEPVuq=tWzsyY12XR8?!X9 zhBh0XS?1{YO@8iL@~49A#evAL21MsBvGVmau+KhmKzkks=(!2zO0~ zX5&HgC(+1gzi_fJ07Ezep@)F$8JZ9fNHh|KHbUvajnQ!Ur_I*U{{W#>|Db?t{|^+@ xNQVjmr5_*g)BqZt6ix=L{HeZVb^A~fh3rZu`Cq%rCYuY70DBu8w*ItF^51E~iYNd8 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_on_disabled_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_on_disabled_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..5741490d36c0979777650f773b326aa4db9e1b86 GIT binary patch literal 1643 zcmV-x29)`UP)s_yF z(*09!(sYxwRD}zX0Jq7ZoZ!};Do`(6kU#`gReL}}po*%hl!`Maq)L^5Udn|YNX4oG z(gT0m5VpxGiT7W+-QBU*9?y(t-g_ME-87Kc?ry>bf9GJ0#xuW=vLB@T95)gnV08w*e*M1+g#e*jPgn;a#IIHZtBK=%+lw(v<7?;k)_Qec`g8lSps z%Fyb7a&$)LnIMN`lXV)4`aS?u!DWtVlvquB)2*MY2S0Q520ylLjzyDZ4#^rTgv0tU zBtTU##tFv6Mtc2g?H9ExZoAt61m;!wr))H1j?m;|T8rkM0aOK(oIs?mKE3^tM)Z!` z0ZjLJMgCzbK8|4tZx{q?DD(3?ig7PL?|ly>5{ZSx!s?yLeIW6qq5ZGjh)7>@hT-!~8lB*IwNt-qx%FS*+ujr1^0Jxwt@}p#oyz*LU|vs711n>kmf@>+J zX;i}6VE`&NM{(RMzwC71^^$YGc=2T6!EgG*IKp-wU*UC;gu{+#(U>iClcDj76e9`I73$Gi|AWi1r0BLO5qB~oN_j2Ks z$acitS6xLcL^hmyFSj>O$`&^1g9D_nMF3p~)?AercK=0RA#9ajb9*x*BEZ5vIDkZ0 zNe_U)HjbA4=M{sN#tH16Ygh@ALyUntmiRnZ2d_r`0W?P0drxu`(J=#C4WmWJP4;T* z6q>&G^aqGh#_a)^nLsvGG6+B=vNaQ8x&S7FB0e}kM6Abpzs8*L-R-13=p7_&ck8KE zuR}nOk#LBaFeEaC7ev>AuXK)X#+$mY2Rey2k8YmsbRBq6m~kTdF3EiX78M@34|9>h zpy$=I+u4<1=kDXc=wQcPd1hx`p)ry9dyX7l|8{-QzhDbHES?t_j8NZt?#wHBt0|of zA0yz>Vle3G!vH{@FM@mdJG;-(%LH;i8^B&B(B02B`PF#vD29({4$enIixp{*4Zoa?NW3C!xFp0#Ixa}S)K*P#Le{D-J{uS^8Ic!Yw-I?}p52qWvY^~>_qM5~JjTM4>98P->d+}V+rY?77)Qjh7JGoeqZAG zz7KmF6lv`J4GK*{#Lj)+p!f{P-WH7wB!}6e8EK@EMjC0Pk^T+!A(8RWOu6^~001R) zMObuXVRU6WV{&C-bY%cCFflPLF)%GMI8-q+Ix{pnH8d?SH##sd==8PG0000bbVXQn zWMOn=I&E)cX=ZrXPw literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_on_focused_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_on_focused_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..97043d0d9953a1cac5b2d95afcbc1dd613c3889c GIT binary patch literal 2920 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 KMNUMnLSTYlu~8HN literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_on_pressed_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_on_pressed_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..fde0e7d0636b6a648e73fa71b60f8cf42dae8cf5 GIT binary patch literal 4259 zcmV;U5M1wxP)@ z)_|{p`@jgwC{9`dA#u&ty~J1n8f;}XlFk3Sb000KNon0^3l8IY|YG#pi*S zfy=;>SlTCk%y(Hvn9hN9R>a4^&ZBsQIwo-vZQu&<17KOKT|xe^RUk}<$}m9A9&ru$ z92i0oPgDUyJOa)EuLBo=1kggzL+u!zU@M4=6c``{z5?C@sDS1uiinS>umj7eUA^!&O0xL{EjJ#3-c}cUZY6c~3 zJ%YXxtPK>w>EJvAJ^}s;?86g|=Kk?uqhNrDpVBViqJ z0=(LX=j2GW|+$!xZQ>qRC+*%J2{I}E$^KRaY+0r&owK7 zT|v%O5~*mmuHts2;zX+`*2-BeGu8k_KezcoZnLzo&dP>3Lps8clqfUUpP(P%OxYyZ z6Kqh$mw?yU6NaGz!oK|#?%_q#f}QfnYiD&y15Oc&(hdy}U1;d$xpv%MYUoxg(s8V7 zQKZV>Idg$X0dkqC6{EuB>mxI~JIMQ6sTrrn=7m*6UOC1f#Y8EKg9G#RtAiIHnad^M zIdHu0j~zk}SO9)7xviH-Kb?F;#5r9D$mc8|H_Qi_p?a?ha1@q`35$>@>#C7QUNI8p zb_duL!YUZjzQOLFh}Bs}67(PeoI5L*`H?D>0T~f`AabRf^q%TOU2@yogZyA~T%-pX ztV!naTLi$5{J5rO>pEI&=*IbWJVWfh>F2wj?PfcqxZKu?0)W+R;q*Z18lOTEY$^Sg zf#n$ZC-8R}O2-oTyzzV;P$2@>SBj-B$rEuMgZxS}YF%AOmSN4ty-_i^-OmTGe8GxB zy~jQDxS$_kIsOru{mdAU9Xx=yobSZ#XJ+DFFVW2px6<|XQNeXsfv{D^x^j>|XnKGv zqatNa?2Z$+%RG$U@~c23etjq1MqN(1I>hq3h+75C z^ch6la^r3aOR#2`Tl4vDwzoAl<7emU-5)PCRzKJpKe#(6`r(+!SjD`#?g!m!kIxEl z5k}voSRg-a0+*&tW~iXtx9eMR8 zryD?`0i4sb;R)$S+vzsa`qhQT$}-+X3g`E0zj_8`o`jgWHhd2_1FVGPLny#&@+8{p z9^73l|Itp0x@wC$3J4NW-JzyQ(sjBoa*uJ(VC#|pD@6FRUK4UvGpQ++tc=ZfGn0S3 zlkL1bpUhvKPnO@_7_aT5hC51DQNkVcAkTvXFOXvuI0f9&JbQbAy`VOge2|vNpTNo# z@KEQQH}g43*T@6tw++4*(kU^) zGf4?I_Ojg`n$_p$>OE>{r0)^*O+q7vXcA}Q9`lUt>eR^%`6F(oSaO}FrVi15?%QGB zN1Y!dF9!J-29|E)qb`+ zC~OWk$|qxCa0J2ey`df;Fm}Hk7Jc*=3Zs;P_YiRll-|HY=_y_vG3U1CNzLB02@K!z zGO*Dc{mIG~X5+aGKKM<)7~mSYI>C7c;4HX=I{ULz&2zsx)4KfJT(Yvzh&p6xstyE7 zQyyLW<(byAKR?wvzto6Y&V%rrx`Wa&-be4aeUSI5+E5>ZlqelA#bul_1Q#jk9&wlH z>`pjBoILCmEhwjiMY!T>GwR&!=lxM(4F$bexdQ7%l^#GuezDqm`qjn8Ikur$T}^RRuicF2Q%i=N=p>$tZQt2lPgED`ZYliq2N zKpAGFJYE^AtS?Rfg62Vw9MwUPUI375FT+BpyE*mnC>{Wch{uYcBC7K*_3Ec&&~p@! z5?{o<7ia2S9y_?_%6sUYgUn>hO-)`>cGLYHCZj?Li<({GP={Z^X6mlJj?omQmK6k* z>WJe5u7Nwu%N0}&NC?Ah=*5t zq9LM(#(?0koEP!zPiksL?(pLUb$X}+^Qa1-XEXuL41IdJu@)y_uheAEtu$w(Pj;#O z8UCzW?QZzMk8|D}jECdp6$N9IwH>Gn^L`P;*m0 zpNK5som6<5KIih7u#6R(E(%~%^Om%ONgA832usq?T;1BJ=$~!7;jJP|!51C*%-Wn> zcN3GCe_k7Y^TFo$PCqx}hs6ZCM!)%BGrjYdwc-DhhmohHAfCBr1CV%^n}5W7z`=HE z#$K61>)UC(nDcgY<~P4Jyrr!xlZlg-ycJ6vnx}NNg`k_C>cq1emp047@a6B80^y0%9J?dL-!Tj1Fpp!1lNGGo&s!WdF8Fx5)A&+ip{-2j;Zfx@99q5 zrFnZq{xp^L-)kPpt*>vVn_ui@J6IuVB6v2Mk#>D}S`FF(5k$KY)n{1RxqE7z0t)2i zL>@%VN>evZx1%-|Om^3>U}BJGO7jy8feBRYG$YP~n08=dZtNCsb&CNNx{j{|)~u}6 z87d$xT7XcKrmjcEZi7rN`nR~tXfUbKh|X#vHONhNXP^$GcPo7d<0QK}$B~Q_L1`$Z zi=cOTwm!E5MbSGm!;2zQmd-tdReA*6BJR!t><;&Vi&N{55CdZAnIq3PPDW|CO(Jbx5{Osr+N?AH0h)nRM6sVk$t<#=L|Ch{uA+(M7iA8w}` z7F*sEumn6inoKeGqWgCm_keuiE+#fSa;H96A60{qJgM4MyA&oR<7x zNX%hf(&c~oktkt69VB#4>RKt9ucK*m?MPV*OH+U|hDibiOOrE*zzp2|OgnB~nM-;z zsP|uEarEC?>E@P1e0F`m{tJ0K-THK-z<+=*z}e-gV1K|e#IJ!fd`u*lmAFu^n?u-g z@Ha?cimQQ+Q`;#E_f6U$adW>opnIu}hmuO-OcX4Hy!FX@b>B>B`%~t&Gi?$>yr2W| z7VxY$U9N-0QBE_I^0vnK(&Z~Tr`cQd;p^>K#|f<$@@%m*brdW10UqAU$Wo%aM0+dN zmwZC0M2qjY~unLu6nY>3hM7Uqrcxi~Rjh`CvGu{XE4lsBe-wSkkx8?UIZJnK*4)+EF z)$g^Tv|idnNH}!+4~aZ1zyG+t7uW^<2ITU=MBoXEVM+S1oPXS}#zY1%6(3Bn=Cc?@Hz2`RFGGPR)FMHlOOZw z?p^t4>VNgwTqpc&PKMWy`qkJWzZlEB&*nbk&*o0-!^u~8qvdiqlB{S_?A3t*kw z_UplilPCY_EGuFKXv$ckQUTQ;P3G+C_j%sptCRb5w%Q|F6F#1v1EM1;Kt7({;VGAC;_002ovPDHLk FV1ir_FQxzh literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_on_pressed_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_radio_on_pressed_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..adda0f0beeffe0af1f2ed8da3020adb7ea0602a6 GIT binary patch literal 3394 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 O0000y6 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_off_disabled_focused_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_off_disabled_focused_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..bcd07e2a11d9b4d97d5ce59e8643d1ca95068a81 GIT binary patch literal 3613 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 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_off_disabled_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_off_disabled_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..dd152e302d5efa3e0ce78550235835e64bf6ccbe GIT binary patch literal 1895 zcma)6c{JPk7LN$gB$il0Qe!KVMG^!d5=kYIO)M2mseS3#YNr&nm5!xqUt=v5JE649 zYt=Gp&M>CSn{JNcmDic+w9{63WuEtY=bh6tf4+Op_w&8?ez(uP_j_)!hZ|oNhJk@V zAXTA&>j})kzz9)M1keEEH4FlQ-95x!&VV^NISJtZFHuoZf8Ffp==fLjv)>UN^x;9fZE#Ha=HBS<;z1uLz$VGGMTKqyPLsa^!4=tt0zvJ7#$rQ8yoxI!N9=4 zwzjt6;o+{Xu7ZLBz^SC9M5R)hOlEL!FkluI79tRc-rimq3^p(@(9_d%<;oQfhZ7PK zqOPv4rKLqCllArWi;9YPJYH2*6|g5SFONhbm6nzQ&YGGUKA*3usu~dy5g#A#;^Ja& zZ=ai++tAQZTU)EFtelvbD3wZCELMGeeM?Kr#KZ&?3ia^tC@(L+c<~|%g;G>h%*egt-BnhJ3C^73kLZ^vLTSFc_*GcyD7Oe7L16bkS(kVyi8 z0E8eCiGXwk1qEeiXQR<*AR=pPYdjwB;NTDt5CBA1Qc~jY?{8>mNT<_dVq$=DsHv$* zB$APl5rIIEl9H02pAS$15Dtd}1pNH`zEn*<1{7l<#nVj!a>XiqX{G{J*FB+ZWTK&j zqGHq(waHM!-hs$Ar;FNAPCeKZq+cX1Rt@Ofl`j=77AG0cW5;xV+aB(e>}5y!^~ z_)H619G*yUv^*(f5SfgVmN;8GD>9w!gtg~bIB~>SD;6D(bs#uXX&k(j*iKBdrD7Rm zwl&LwC~(4JZSl5j%aeE#k1iz9TrAj3E1DC9i)WdO%t^M^M6RX4#sTk2B9d)zOltz! zPK2X~EbZwy2F}TP+yA{K2m}EOxlUes=+}26I9rk0%Bz`ec2R;pNk`nxX~c?3*)$+S z|Apya)z1VscBFKiyTAS5qdxEz06EeKC*PSa66@4}ZNp8lxgyHdpU7KxFt_%rii7(>ZU zHQMCy+*Z?@Rna|2U{nm${dB%j<4nP|!{I}E{qG@SxTP`ADP{60P3O+4u9fAiZ0 z`uUlF>|b{i--{NdGuqPyXE*EICSosSA2n9W9jKjS8?D=W@xym6C{!jjEoJGtO(fmM zU=&!(VxeeqaQiUDKWlZn{YiTEjPc6iriJmpqS87|vOeWGPzPScdGYYq;$Czhsj|^8 z0`lcJVdz{awKMkapL!#nKC|WCJCAcwm!9EtS1K-T4Gu_lF_9>zTjNRgA;K}{MCV~JOud<(t-1+BEEfs@Zl6ysqZT3IVaQ%jbO-5_l^ytatv=(=c z&yvd5f?4Zj>B29HBUlJpYcgzMO!|}4$<(S4x8tol;->9rvQvg^1}+u;SXvqPJzw{e zeRX-gso~2IW;AWA9@)X*{sH^i#|{Ulh!d|E>=278jOL=j^ib(S#3cy&Wwl!(_4suDtvfblfiG#h?2eq>4s%V=AI--5gPBlYRQ^=8gE3G+Tefr?wwNUevz5X zMDb8>Q<%D#E1-4Ds{VNG(E1Q@9R1=hr8S}Z&Gg?s!U{c)mAXD1`4ifj@QN=qUeo^S z9Lv2S6B2^$mTb<{tuaFMQ1?ld&*g2450AjKxNda%b3I4hEvsi9?5WzwWK2WzHs~&7 zc~(bx#qxdpok@IGJv`^_y?nUJK4kfOKl~9bOZNM4U3=Syq_A_b7F}KKWrrcb`-kfj znEU4WwFOD@COCLMhm)E4*y%#5LQ`$hMk>hjn-9_bxINEuVtGjt&@2g`SO?IZiK<(B Tteriey@75=dK literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_off_focused_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_off_focused_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..fbd75da69b46ddc3f2df3c7d11bd9b575a038936 GIT binary patch literal 3834 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 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_off_focused_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_off_focused_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..953a041a06e3bc4bb7cb4075340925055d32fc3e GIT binary patch literal 3845 zcmV+g5Bl(lP)RSpOEc~e8SDneDohOz3wD+{<3AuK0?O}xOeZ~S4yRlIB4BS;=MnK z2`B+*6|&hxfVVj15PSAZ;+46Q`1|{BJ9OyKRWSjGtgNgiB*((JAV}VfZ6hF=<#-4p zU}Gb3(0LHB4tV3g4m{hv_bai#z zLx=O|?d|OlvJG43T_S#SJ?Ac?%MY&a=-}aS;lhQ7OP4PF z$i);%W;C7?6R;8xq>#W598huyGcM zuo|$EJy#ApRcEt;Pa2z1CYC&OV}4SOb!1`yq%)_I*Nyn=zoO39>2%fTOj~j4)Tz6o zn(=s`oDmbpW|GR@lz0N!y8qYl7&{+v zr2^Ep65t6~XzKtlib3^4^zp}LM78&m;H_;hA?Urm5VIFk=(7r7`H3P1gP{g1UG@;b zQWLvrwJbeX_zm1&ERF+nPB>065^w+BULt~!1X~D*6(5R{`~N{^_Pii78oG&T^8w(Itqa)hs&2QKSt+`A->1`K=_S=2M=DcG>(lMHy*)p zis9qqQ!|?9b~5^7{)$h51lU5rd~tMwGC<79J2*I0W@KdS#)s(a?7VsL;>Ce$*RDOe zef#$3m@XI?7OZF!WhmTwEPJQUT**KPXB4YJIKxqSRNam9)gsPuQ-0_&!{us5W^pIunBT>g5S?Wz& z&oac0VMaK^f4Sjq1^l6$+MR+eJ13w#ZUvQZoLrF+VN~*tcH6jd_mL$WH^^}04N00VS1OZTW8(Ot$RWo+pL>#;| z38S2`Phk{@9}sKENC4_MCn}e}bLY-8Dn|`UAo)z@f+^M5#||qc;_4bYAC(UixdEf( z5yyeaME>5Psiu0KCVDtjR!{=gu3dXzA_;&R#xtfH;?v4&rLG_4H{(S1V637L$S09!^A_^)KpQkO?WALDB4J^4V!7cY-6GcK>a8Z5LnT~tEi^~9H!iD zC%y$+=|xM8jg8%tAwk#P-hMqiJiOK`eFb0FT?lZSay?&eGt-3lpKAUm8d$R^FE4M$ z^FVM-8!uxwNu2<-_^L6S;@HEB1mFfZS#m*;guBXe{(N~cP4YdzVs%|q#~^k7+_`fb z#=>!s#`t!OBqpEGBD-%ej+0llDW%-;9`vI;(0ltR0b90gIc~4hKnimVb(@e*XdR2q z9M2>$HoO)=(jE4^vTiPW5NwvC*Uf-n_k&}{j@__h)9hWbV#Pk1I%dn6o10s8b8~YK z>Qim~-qovDH{*AOHudncKo5{40n@~Su8`VJq5)}lX=&*Z6gJtS!E9=3x?sL3F=;-D zXuSuy`}O8tVn08>t+omQFe;Il5)_7ySx3#<*K zr>F16nc`&dryFeIoj+J|{03Gqab>@iA`mX_X^Vm;J7-fk>XWE$6~zFsH~jn+Vyy4j zO}x0I@g0v2Qab&Hixm+*Z&eK2^@!y`VXar|Jju+<-&%X?QvrGlXO2j~YDq)y7r4+?ma$*t*S@@O@*T>1EVW`Ja{W3UADG&@V{>WNP++(AcqZ_ z-e8C~8CF+UcS5A`R9qCtKNH?ek6DZGdKznQeI6$P9PYwbU#8P1JW&0Bk&f`Y*kH)r zHPnOGUxES}Z|W6)b_S9x1p-3F2{Vk{JJw`TdueU04;k(B zN1_-Bsl19iW$@pq>&NR0C=sZH!(|6st-zk0Idi5DrRbh>mO#VZPsC%H1JFu=fK>6@ z=b5&gzG){)z4|yTtQMhm^MtO)7CtlTBLxDo#SiEl7%IGB_>lY!R=f}@gUQ~Nujz2;&C6rN zm&2N>4hUnVX^nuAUHpsTD+K~F#1}95=2sK_;(QX`+-oh3@Gg5eJ-~4s&M59IOfIxU z1a!dQn~ztLJ1cV8j@CZ=IHcO`o7^hxPYm5-702is817^MAK`NN;CIa9I zP)^{9-GK>j)3~seM=4vrlu{95xmbxjikaL)Hwnk=&q7VYVI7+(N~z_8wCwa4!(e2y zLph1ZtOn>=DK(Dm6>joBi6xtCvdJc!Y_iEFn{2YlHihheqe5^-V4s0=00000NkvXX Hu0mjf>a$X# literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_off_normal_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_off_normal_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..5d7b03181313e2dc4b195326879661969f53d5a5 GIT binary patch literal 1939 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 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_off_pressed_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_off_pressed_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..c40e28a1ef63d27e5df18c8b53120b1882082230 GIT binary patch literal 4300 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 Tf$amx00000NkvXXu0mjf=T19= literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_on_disabled_focused_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_on_disabled_focused_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..d6c61d6b7f9e0b92011642101359be29cdd6e7ae GIT binary patch literal 3802 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 QMF0Q*07*qoM6N<$g76(te*gdg literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_on_disabled_focused_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_on_disabled_focused_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..b290a3dcbb3e552ea0bbd92d5fbdead66539d0f5 GIT binary patch literal 3605 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 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_on_focused_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_on_focused_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..81de243b93ace53bb819bf72a237a9cd660f89c5 GIT binary patch literal 4061 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 P00000NkvXXu0mjfU3RQN literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_on_focused_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_on_focused_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..e62c7aa1ef6693ee2cf5d8013252385b8ab22dc9 GIT binary patch literal 3843 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 FV1nMNJFEZz literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_on_normal_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_on_normal_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..68b45bd0c7216d24529c860826ed5c2fb470da66 GIT binary patch literal 2456 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 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_on_pressed_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_on_pressed_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..75a12c508f3eed519ad09123c1238a1b1bc8acf8 GIT binary patch literal 4565 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 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_on_pressed_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_rating_star_on_pressed_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..65227d4ce1e1dd3d46aa39d5444bdae8d7648eef GIT binary patch literal 4298 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 sLr^uNJ$ule)vjN4Ono$I0C#^F`NJpXZpnU7+# zz{JNs6Y3AXV*B=M*37gg(>G33`&DCdElROP!0BJ@v-S6jmd^f{wDYR@(`&!IjNVG$ zT@YROqfvg&%F}U~zg}JSiTiTqNTt!$+q)dM|7hx6GW%}SuAfOyw#?2bZO*&sYnRYC z$40%aGi>_{HTexbB4Im!&*^f8&Nz>fh`} zMrN_r(zX}u)B42&W+pA%C4Up#Se^2EaxtIfY|%e$bvFQIYG z)$U6-R-bydcH-LKsWKbgidW?`DlUwzydL9pwoRG|=y9VZ8z=tDT(k8Pr=|ad6Tdtz%L2ok!PC{xWt~$(69D#WyM6!w literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_off_disabled_focused_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_off_disabled_focused_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..de3bdf086599aa887da77ea22246e5adfd5a5d7c GIT binary patch literal 410 zcmeAS@N?(olHy`uVBq!ia0vp^WOno$I0C#^F`NJpXZpnU7+# zz{JNs6Y3AXV*B=M*37gg(>G33`&DCdElROP!0BJ@v-S6jmd^f{wDYR@(`&!IjNVG$ zT@YROqfvg&%F}U~zg}JSiTiTqNTt!$+q)dM|7hx6GW%}SuAfOyw#?2bZO*&sYnRYC z$40%aGi>_{HTexbB4Im!&*^f8&Nz>fh`} zMrN_r(zX}u)B42&W+pA%C4Up#Se^2EaxtIfY|%e$bvFQIYG z)$U6-R-bydcH-LKsWKbgidW?`DlUwzydL9pwoRG|=y9VZ8z=tDT(k8Pr=|ad6Tdtz%L2ok!PC{xWt~$(69D#WyM6!w literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_off_disabled_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_off_disabled_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..eb8d623180a104ee0f1e87a87aaae01fae5fd7dd GIT binary patch literal 402 zcmeAS@N?(olHy`uVBq!ia0vp^We>!JJ12*(w;A5-j&nENsBm-*C=3piH~Z`Va>6CoQ){;G1^B}%jz=G@<3_kd*fb)`lwTeZsQ z-zNs9w8s|T z=RM!c;#k0QIKVY=JFey literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_off_disabled_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_off_disabled_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..eb8d623180a104ee0f1e87a87aaae01fae5fd7dd GIT binary patch literal 402 zcmeAS@N?(olHy`uVBq!ia0vp^We>!JJ12*(w;A5-j&nENsBm-*C=3piH~Z`Va>6CoQ){;G1^B}%jz=G@<3_kd*fb)`lwTeZsQ z-zNs9w8s|T z=RM!c;#k0QIKVY=JFey literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_off_focused_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_off_focused_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..03ba1327343f4783582cd76a567a1e39762ddcc0 GIT binary patch literal 429 zcmeAS@N?(olHy`uVBq!ia0vp^WNJ+3h)s9Y?%oXueIp^KKvk$MCUj4}wrpXm{J@NnpGmilZvBu+u08r%cX=a4@ zhX0(}=kbvFGX54R;$G$2d^_I=|jPHhvo(21` zpBI#Uwf4@G+nXG>olrBqAGCH&?!?<4GJoqWo7;ZGbP0l+XkKA)>v` literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_off_focused_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_off_focused_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..03ba1327343f4783582cd76a567a1e39762ddcc0 GIT binary patch literal 429 zcmeAS@N?(olHy`uVBq!ia0vp^WNJ+3h)s9Y?%oXueIp^KKvk$MCUj4}wrpXm{J@NnpGmilZvBu+u08r%cX=a4@ zhX0(}=kbvFGX54R;$G$2d^_I=|jPHhvo(21` zpBI#Uwf4@G+nXG>olrBqAGCH&?!?<4GJoqWo7;ZGbP0l+XkKA)>v` literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_off_normal_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_off_normal_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..19ef990a6dd0fe8b19c5790e67397dd126686a5f GIT binary patch literal 434 zcmeAS@N?(olHy`uVBq!ia0vp^Wu`XCn{Ml} z)%pP~>&^O?}>EB+o=Y0SEdcJy#fYXWau0z|1XU+`s<%NH}g++a)ULZGU^2sBiP(bFBhS9bEq&$=|)lSUKla>Z~%=y}-C& N@O1TaS?83{1OV~g!Z`o{ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_off_normal_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_off_normal_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..19ef990a6dd0fe8b19c5790e67397dd126686a5f GIT binary patch literal 434 zcmeAS@N?(olHy`uVBq!ia0vp^Wu`XCn{Ml} z)%pP~>&^O?}>EB+o=Y0SEdcJy#fYXWau0z|1XU+`s<%NH}g++a)ULZGU^2sBiP(bFBhS9bEq&$=|)lSUKla>Z~%=y}-C& N@O1TaS?83{1OV~g!Z`o{ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_off_pressed_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_off_pressed_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..4e970d2b84607cacccde6ea397e4a3b02d75ea25 GIT binary patch literal 673 zcmeAS@N?(olHy`uVBq!ia0vp^W-aWS-#qgac*bV)|3rdW4#0Tr?G%cI*8qv$$EhSEBYba(!eH3UOh&#i=Ex=b5&s z?P%*?_K(#M*PP+9oE&i`vF-hVXq7o9zuP=CxV$I$>$%V^ZV&&R3cvlYx&M+2XCRw~ zvq)@V8;iHchM!tfS1rw$!jT%%*QA-71C$W0Zvtx8=n=*z~0# zw(L*B`rRgm7JH_y5_=w6UTLx;;^+t0Bg{z!7uF=jPT9eJ^Ca=-|T3}T1?e-fxy&3a^Sszb6 ze9-3%8}r6FO`b|(wW5<{4?kPGd%diu^5x1OGnStBVrJXW;8`ZKHmS;Uj$wNpak0F#oO$)%U46zd^%Np^ZCy)>J+=Yj^9(GBjvl^?4fBw`h~z)NLE4 z|NCH^$`-z!XVq_sFOU1!j18rEZvBaq@+ng_yd5P!_hsS#H_wV5Z{NDbZ2B2?F@8Db z?skZ(Bb%7iZb!|p6*OMYzH-Xf!k0Ox{wHVOvfpj^`2V{c1L4gF8N>{xMjzn`P}+1( z>7VMBa|QcCSwNz@U#)q5`rNguUme{`-5vz2s=n{=vUFjH{*ArAxjMeb--aWS-#qgac*bV)|3rdW4#0Tr?G%cI*8qv$$EhSEBYba(!eH3UOh&#i=Ex=b5&s z?P%*?_K(#M*PP+9oE&i`vF-hVXq7o9zuP=CxV$I$>$%V^ZV&&R3cvlYx&M+2XCRw~ zvq)@V8;iHchM!tfS1rw$!jT%%*QA-71C$W0Zvtx8=n=*z~0# zw(L*B`rRgm7JH_y5_=w6UTLx;;^+t0Bg{z!7uF=jPT9eJ^Ca=-|T3}T1?e-fxy&3a^Sszb6 ze9-3%8}r6FO`b|(wW5<{4?kPGd%diu^5x1OGnStBVrJXW;8`ZKHmS;Uj$wNpak0F#oO$)%U46zd^%Np^ZCy)>J+=Yj^9(GBjvl^?4fBw`h~z)NLE4 z|NCH^$`-z!XVq_sFOU1!j18rEZvBaq@+ng_yd5P!_hsS#H_wV5Z{NDbZ2B2?F@8Db z?skZ(Bb%7iZb!|p6*OMYzH-Xf!k0Ox{wHVOvfpj^`2V{c1L4gF8N>{xMjzn`P}+1( z>7VMBa|QcCSwNz@U#)q5`rNguUme{`-5vz2s=n{=vUFjH{*ArAxjMeb-R5g%&yB@VuiNacQp=}liTM|beV$)n zF=Dx9a3gB`DE^ zyfyzOsXew{m(G4JPK?cat!v-9^S}FEMe^TGe`=a3E}d9Cb&BYmpfyYF3wv+wo9x#2 z_;pXvnnmBVHGd~)FE>tl9M|=hU9(JX>5Wn|yUFLD$ySK(PFOYLboQbRQ$<#r2d%lg z^ysd`A7|E-B^qlMRi0gUKS=Y6g6I;bkQrSTF*hu%Gu|xXnC-Uom!`dFf#&{=%~}Q$ lJZzuc|GO+Jf7bGnnbT}dp~J^|4q#j|c)I$ztaD0e0svn|+ok{j literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_on_disabled_focused_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_on_disabled_focused_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..a1096c0fa6ad602116a773841f1ad1cdae689686 GIT binary patch literal 498 zcmeAS@N?(olHy`uVBq!ia0vp^WR5g%&yB@VuiNacQp=}liTM|beV$)n zF=Dx9a3gB`DE^ zyfyzOsXew{m(G4JPK?cat!v-9^S}FEMe^TGe`=a3E}d9Cb&BYmpfyYF3wv+wo9x#2 z_;pXvnnmBVHGd~)FE>tl9M|=hU9(JX>5Wn|yUFLD$ySK(PFOYLboQbRQ$<#r2d%lg z^ysd`A7|E-B^qlMRi0gUKS=Y6g6I;bkQrSTF*hu%Gu|xXnC-Uom!`dFf#&{=%~}Q$ lJZzuc|GO+Jf7bGnnbT}dp~J^|4q#j|c)I$ztaD0e0svn|+ok{j literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_on_disabled_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_on_disabled_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..85602d8476ff080e1ef49b3ca3c6dd42c76660cd GIT binary patch literal 514 zcmeAS@N?(olHy`uVBq!ia0vp^W80d&5O^b87o~c)-6jimuPv);1kxdGbHrv=>r+N?|!=(X~5yl2o$P3 z^>kCv>Z?j+-HnVo37cHjglK7A&AM7h4aAd^LlUmv zzVPn)doN@E`##q!xLV7(XzIDgQg+#=_O^=d7G><1BmG`_`LTr0XCzwmdtSO1CM-N$gZwbP0l+XkKDm>)> literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_on_disabled_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_on_disabled_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..85602d8476ff080e1ef49b3ca3c6dd42c76660cd GIT binary patch literal 514 zcmeAS@N?(olHy`uVBq!ia0vp^W80d&5O^b87o~c)-6jimuPv);1kxdGbHrv=>r+N?|!=(X~5yl2o$P3 z^>kCv>Z?j+-HnVo37cHjglK7A&AM7h4aAd^LlUmv zzVPn)doN@E`##q!xLV7(XzIDgQg+#=_O^=d7G><1BmG`_`LTr0XCzwmdtSO1CM-N$gZwbP0l+XkKDm>)> literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_on_focused_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/btn_toggle_on_focused_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..637a89b0c2ff35bcf75806a193b8912e0cdace12 GIT binary patch literal 532 zcmeAS@N?(olHy`uVBq!ia0vp^WHV)<7z*@t{gCn6gZj`>@OF_b-3!!yS~fld|3Fir5++8 z!B1}9SvYyupO5VC=U)r9zFIcTJlgL~%;!Q*Z$ry@XJuD-M@@@xUYlog?bR~HZ#`Xy zWOs0vPg1<5QMUONOU(nlJDzP3N3^fi{+*}rsLSJzl9=Z7h!|CYW{D#TY=#|)n-9wlY);3J*;_rcEc#4qtqW_`t9n)HgDzPY&-6^l4%Mnb6+WW>gY^zm)uyD-SuUz zs@Xf=jVs0Go!q>Wx%{DDQQ690?CGu3c8PF@Pm9>IQJd-fwQKsW@}(2Ec!xT>bTT?A zyLB2K{or%F2mzb^uYi^2^J%gd@)as$Kr(|wD+#VI}Qo1Sya9QSBB(O)qE P7~2eHV)<7z*@t{gCn6gZj`>@OF_b-3!!yS~fld|3Fir5++8 z!B1}9SvYyupO5VC=U)r9zFIcTJlgL~%;!Q*Z$ry@XJuD-M@@@xUYlog?bR~HZ#`Xy zWOs0vPg1<5QMUONOU(nlJDzP3N3^fi{+*}rsLSJzl9=Z7h!|CYW{D#TY=#|)n-9wlY);3J*;_rcEc#4qtqW_`t9n)HgDzPY&-6^l4%Mnb6+WW>gY^zm)uyD-SuUz zs@Xf=jVs0Go!q>Wx%{DDQQ690?CGu3c8PF@Pm9>IQJd-fwQKsW@}(2Ec!xT>bTT?A zyLB2K{or%F2mzb^uYi^2^J%gd@)as$Kr(|wD+#VI}Qo1Sya9QSBB(O)qE P7~2euSvOymZEY#T)S>t(;REv&E}~@46b+=5G;b zJ~JatU>@^%zh}1WDR(SBx%a&L`};W~(2fst-4;L0+#0peZ~5ZSskh&L+cKY{dDUa z8Ow}WYLg~QCY}q?5`D%$Z@YDm%!$@HXE>z8LrX1ZpS>mL#`na@kHcBwkU*P3iy}`V z60`OY4@jh*>eN{GZC>SEx(C-i^=a%p{`1hG3vIHWR@{9wbxTp8 zf5+43%p3n~(T}xRQGImN6wA~{0c~@id|D`5Cd?aew`_UVdbjKMo_uCE4cs%S-7IHw z$$qQ&x|3g8_UgylE!}=ImnZRu7N3Mz|M74WU*R`(l?CmrMTWXQ)1F2c&E&cLcb7W* zyG1iZpMCgQvoXP71$Wa1MbAr7Dnfy4WbQ7x{p3Kb$mW0Erq9ZDFSnIDzwP?#)Vlri zS(zG*!NF91uSvOymZEY#T)S>t(;REv&E}~@46b+=5G;b zJ~JatU>@^%zh}1WDR(SBx%a&L`};W~(2fst-4;L0+#0peZ~5ZSskh&L+cKY{dDUa z8Ow}WYLg~QCY}q?5`D%$Z@YDm%!$@HXE>z8LrX1ZpS>mL#`na@kHcBwkU*P3iy}`V z60`OY4@jh*>eN{GZC>SEx(C-i^=a%p{`1hG3vIHWR@{9wbxTp8 zf5+43%p3n~(T}xRQGImN6wA~{0c~@id|D`5Cd?aew`_UVdbjKMo_uCE4cs%S-7IHw z$$qQ&x|3g8_UgylE!}=ImnZRu7N3Mz|M74WU*R`(l?CmrMTWXQ)1F2c&E&cLcb7W* zyG1iZpMCgQvoXP71$Wa1MbAr7Dnfy4WbQ7x{p3Kb$mW0Erq9ZDFSnIDzwP?#)Vlri zS(zG*!NF918*+7Et-v*~DUMC3HY=p*!6xaU-x{p{@-giJBCPF_jvk zjp)imjSCH(52mA(f1nKKjnzy@dZ%?UH#0etJV|LLJ#=jMm)*T$>5nM;susgccIAaE7}q3^()> zTF4lHyX^R(UJEH%H0+MrO9(;>IRY)-FhQgv5QYZf4eKUy5eUnn#T%Ate6yvUeQ8c- z-#DeK?`ziN+E!Hsm<^)h8$0sG*idn!bYby_hqWBt^!U7^2~0tdLjNp>8)VOqnmN1rD;o~>896h{F# zkc$o{nR8QNiTO{H$DV%I>0B!hg9BXP#9} z7>98fKRh^$!#Iq?IE=$MjKk!dEZCLq7q)(;=$Hd5f9Rvnr|G*Bg%F1!s<&7*E|)j$ ziM3i4WZ!PuJ@g&oLK)UYoO|V%WAAEJ*K_^acDFB4Tpz`SHf*T$!@B-q%khT&rm%5} z#oh*o@lk9w?8!I1GjA$?c)$TJt%T)dVeJcFbZo?^e%!+WE^umg>_5INXvE>@n6E$ z8P2x~FdGhV@mrmZ{IaumJ$)p^Q6p$*w0nP$7z|<5Al#$<3P|){+L6CzC5R-EA}*>9 rsyn3WPD1*cmFv1~0bH(!KnCsr8*+7Et-v*~DUMC3HY=p*!6xaU-x{p{@-giJBCPF_jvk zjp)imjSCH(52mA(f1nKKjnzy@dZ%?UH#0etJV|LLJ#=jMm)*T$>5nM;susgccIAaE7}q3^()> zTF4lHyX^R(UJEH%H0+MrO9(;>IRY)-FhQgv5QYZf4eKUy5eUnn#T%Ate6yvUeQ8c- z-#DeK?`ziN+E!Hsm<^)h8$0sG*idn!bYby_hqWBt^!U7^2~0tdLjNp>8)VOqnmN1rD;o~>896h{F# zkc$o{nR8QNiTO{H$DV%I>0B!hg9BXP#9} z7>98fKRh^$!#Iq?IE=$MjKk!dEZCLq7q)(;=$Hd5f9Rvnr|G*Bg%F1!s<&7*E|)j$ ziM3i4WZ!PuJ@g&oLK)UYoO|V%WAAEJ*K_^acDFB4Tpz`SHf*T$!@B-q%khT&rm%5} z#oh*o@lk9w?8!I1GjA$?c)$TJt%T)dVeJcFbZo?^e%!+WE^umg>_5INXvE>@n6E$ z8P2x~FdGhV@mrmZ{IaumJ$)p^Q6p$*w0nP$7z|<5Al#$<3P|){+L6CzC5R-EA}*>9 rsyn3WPD1*cmFv1~0bH(!KnCsrn+a literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/dialog_bottom_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/dialog_bottom_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..94bb8e140facc51317500f9a499bff8d69b58c46 GIT binary patch literal 1263 zcmV_*O=ntr6ly)F+6SKuL$Ibh*R`iD@HZuVL*4g?IwI7He82<#!*f5M@I8l zCg{Dv1W$Fzcs3L;NE=$Fr<|JzVM3(@hGzPCYq!@lQdyTkKnU`?+fnp z>(F)Gr(qbrUhsW{Sj{jDU%RgR#Q1bO)1&VfVpcE~_XxE*%P(A<($9Xs|I&5c=af=+ z*;f-{87ZZ%>$=bT{r(HnQm8bA3XQA~AEs)?*yZh;9N*-9Z*zQ?kA2|bGg0jssqfwU zcKO)OozI@JYS+8!LtVxH4il#d*hFok`+bf-a|Du|<2hY81WgJ0c^9DK#Tld2{b#@1k#zP2{DlFiSLo%^KOZImV(n zX`7Gx*yrt={JtHd6D=c{0W8{i>`C0>_2LIwn9lr|5e_ce$lo*V5nAgC{+cIh8KJb0 zMu>JH%LwEf8S*}F8p|Y>31kG}DH*|M2GiBSML&ffgp|d`2+g+lsUG1Th=LOrVVL zx{0H8TpaViZ}W!mO>{JdH`1&j=9=Yrqke>kbNRG&@A26oW&&Rp$ppevt3JG-qY?ac zXlpGYUL$VLPM?~P;VjepZ&@PqY{zW}Oq$a{B)>zVPLyVG?ekjx;A zk_r5Fe8myJmI0!n;`vX^%^Jmi!B43!DQ~tRsw5IEN+lB17j|0)fT`%K8KNb`l2~h_ zd}&>v))dPGqD9RNrIM#LO`Y62;mQbjbj7pDnUfjB_HctqW-M7nd@(4lrkc(%%!VCCP)*??YAL*8RA!9349xlT>xKhZ*TuOWygd# zhMSw4-+>nR4|oBdfevVZemK?-$NFIlA%uRlS^35{( zT}BvQM-}4JU^TCykr2oTLIAHf!c^TL#7FZcO&)6muOXR1oSWPv&umVS5o82$Zr-fN zk`dDBCfi`z0U^#wNtd3EN92s)2|wM}$Il_i3*tO zZzIHMY1MHBL9_X5;L0Lh3G+o#6`1lChHH>!a6(t+YFvC=h;N2i? zC^SveHcd0P|3aLE^?J>Ey>4+d>6~7yXVZ6$a@Y*O5UUs;9v=R>yuAG5;^N|Rxm;3J zuZ1b@eB(On(r^e9wKJbNp28e&n@N_d2GnbM<5D-1lIySah4s=KKBq{SW3B z%2^H`-F018)%I~7x8)Gy8mM+H)TN2vhWOR&x92ZSjBBgLHiU?zvp;d{A7fm*v}M1x zX~%x8)7C_L{)@R^oaqd!)oN!DFC)aKzt_REShk-T8iK9Rb6LbQf(-Gw@kSa46EaTh z%y&R8^@=@ zwncC%{50n30vSPAQo*L1XM}Xfl-3rb`wUa32MxO!VJMirLfK}97<+S0pTrjqGlEwj z%M1eip^VKCo*}%UQ!Wz#`8TCq5!Q8G0j12aI3j{y6UYF*?vh+g4iG#mCykiMuIN=h1aP@v(tGz9C-{ed~@19+=qq?_4`rMb9 qo6QfLy7a4ZLdZ|^567?CGqnG7U%CA5q6a|Z89ZJ6T-G@yGywqJBsjVN literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/dialog_divider_horizontal_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/dialog_divider_horizontal_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..8633374a7b4592cbf9645cdd3e718aaac6abb96d GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp@K+Mj;1|%;R9G3!80iG_7Ar-gg_TA-daNud)y;0X~dZ`jY^Rrm4Ke74^!FRpFVj0T#`;OXk;vd$@?2>@soGCBYN literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/dialog_full_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/dialog_full_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..0f4720f0efc4382d9d9117e9631524b6ba9ebc41 GIT binary patch literal 2018 zcmeAS@N?(olHy`uVBq!ia0vp^hk!VUgBeH~M*emHQq09po*^6@9Je3(KLBz$3p^r= z85p=bL736}(} z*9S@&8X6iI83DBbRhpWbnwgoIo10r$SXf$GT3K0HTU*=M*x1_I+S%FJ+uK8IbaHZX zc6N4gaRFN4=H}+^?(X5?;pyq=<>lq=?d{{^19XO;pC8cnfPjF&z(BvBnKOYd=qd^F z3ua(sVrF4wW9Q)H;^yJy;};MV5*85^6PJ*bl9rK`lUGnwQdUt_Q`gYc($>+{(>E|Q zGBzP`$=Su#&E3P(%iG7-&p#kAC^#fEEIcAIDmo@MHZDFPDLExI zEj=SEJ0~}E{AH(!hdN1=jUzRo0PE?N!QVDRq zBbuK-{ot2xXG{zv6z-YF9i8zw_0I8HAmXw8aL`)fOi=vazYHvI@)AWL)+8l*f zqD%}AdY0aoJ<^$W`Kqj@Ohm>C?WQ~{$0-^I9~emdvJTfUQgPjt%=M$Gm0=MxL*RxT zm#3F6ZDpGEPJjM1!Fhru94}-<1X@{JRSqf`cm!<~-85&C2B%-k-P)D!K508lV4bSM zDWJR~=)BV=RcGF|mkk?JmasDI{<-GQ%kAy+?PuM;SH3as=jVNuKR-6+pA*lQtN-u( zaDr}H{Jg87LJUnyKU_cDU;q60l%nPR|K@c2SARR0|IqdK)AJgfT1poVC-$)}C=TFz z`tbLDwt1KL&ghfmiR3zBCzj@@q4TxfT-o3IbBOanyY3fPK3rYHt&(jid!tK3Ms=D;St4Bf#4Z6yTOe)?h+pBDzJP_~`5mA-6)%y7ii{mw; zUrK9N%s8SJ?(L>@GKlYMft2ha&2xc1#tarp60dm{b2GQ6FPspQUZBk_$l$H{wZNv2 z@8N@!I!6!Kgg#xy%_t-@pS9^t+~)Hh9j-UBWM!SsYKc|NZ7z!4`n5u0KI^9}&y%Gu z`}HoA{wY|ea^33mtclwyh1}X1)|~3;ZM|BvsYgGzbw|bRJ5vum+jaDZPRy;7cPF2_ z=YoH5Qj@M|Z-p6jho z#hT0?MD{#58g}KnAa^+j1Ts5**d!^^b>W4Ww$tZ-o0G#2Mr<#&{TIFe&Zgc6)w87X zGJk0Eq~B*yKcDmD>0xOOw)pLb3aTG%So={i!|baicXs`;4}B%6>fwAj(Whi&otBx* z-rfE{w&!DVqUmMnmYsLKf=-)RwM_G!WM2CC+`&WJj?GV4^Kj1><-I)yyS|>x$*owM zy>@9(cJ>XsIfo}LJ-$)U#%tQMEmtBVk`A77IV_TH%hU59*YEPq)MYi2+{Mpluep-# z`&enlmnhBbcgA-_leo0|pN8yP$^Uit;q6}=mph5|1+1O_IOLT2-rV=+{%_m<)^L7N zP;lF~-T${~n3~M_Te4skYZJ4>gw)lk*7KvYZ>nT3k2h87DR^(cBy(QuW|`B1t;O~C z#HSgxPMKG9YUSSS%Rlc#EmL{_d*Yq_5~p0cJx?r%Fyvt|pKF?#wRWq|(qAgcr#%uQ zy28#$zMPc0%Ky#pu4Iczs-|1Z&MlvFYst)(?!1SQvo>1?yQK+oH3&}e+jd!Zw%XR1 zmbW|gT6kKOV~-qL8ZH`NlX**8NmcV|$+^u@X3yD@IG=O0uV{F=KvSfkNA^Oc<}^Q3 z)2BK-uZ2oHS2;28&2;-@leT*8l4r|GqHh1%6sP0G>Z0V9TQP0QJ@v(*bAPYnZ(Ml$ zT(0%nnT*liYm-iT>=lk({k-SaAA4qw{H-&-UbuL}-9YBHV2`S}?ydr5_QXA5ozotx xXg95YX>lo6mTR}h3)}6*S03LwT~U_v+g@sW-KL+4J5GaY8BbR~mvv4FO#m7Xz;XZp literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/dialog_full_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/dialog_full_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..db96033e6621684d0324d32bf9dfc5d839fbec9b GIT binary patch literal 1889 zcmc(f`B&0;7stP*B}pQsfjMfJ=$N@AS_~s3SyQ2m~@VJFuC;))o`fn)NvbxIv zKxyEFr>`q`iNRp3|F0@6Ec{pdYier#l^--S7>ul}EP+5UIXNj53a6*1D=I1~D=WLZ zyL)zyO=o8(lgVVUSYX$;vAw;$Y&N^Eudlzqe_&u>aBy&FXz1< zczAeZWQ5D*@_4+_(b2K7vGMWoiHQji03-z0O-)UG;}nTRGcz+FhD0KH_wJokDxIC3 zotvAJ$z=2M^B|@|p#b^6VJ|N)r+?A51X(F`(s3U^NokX^%H}PqkgaOaZR#)$`1T!| zT00R)?Oi(G>FVk4Mj7leL>n1@Z?f0abf1~Ih2?%LjJ3^ygSK{9Ebh=@dk077BQAK? zqXajiyN3roIz2NV)R^@BdzoTsWo>O^W2nV@2LPzl67kNyRK6^rC6jUh{%7bFZL}b* zeb>q+i*Pb5zAJv@3v9gBAX66`?hG-wq!|-I9qW@D_0TY^_E)EZi_v}T;%*LycIfj> zicBf0I&Y=l;iZNwffnzh5k`CL=M|Rn`lD^?D&Z^@Y8(c@FH}dF1`k-d-M?iFK(#V% z-g2U@YNFIljv|;xT__ZomYNPX10hW{gP-ewTjKO8Pr$P+w<~q^5u^5JCsZsV2(pF=Zw;a%kbb*slA^S5udxV6$01@VN0^~#CA^Vfw#4@em6 z_Xd->Iapy@S$v%OYyNMAN!G2g$8{+N`PpbjNW<6xMl!zpQyCXxW2kzn+NN&J8`$r$%F~-^XE)gXz9&_)3Sa!k zmg(N7t7ZP$kq-@c2d%9=`po?bxOwLu^C~1S&XY?b^X;@59ULa@x%wgfyTPt#DfVO# zYuM-F{h{>q%J7JS?EA9fz^dwk?Y{yHyR#ny1ScTr>9EzwSg2A*ZW`^HC;P!FB+>dLYeAV97b5w@4SjzIjo^7xmtRxt%c{4 zy$+wqS1wSyypcngHtJ=za7&f0)9Vqm_UjgT&-njIwk4n&p}Oy^5cCCwK;4e3gRMZ> z$C=tdRRi{294q5R7s_lT4kzxQM&@3)mE$-%3+e&^9s_`ANI4fQ*{ zq|ugDT4EH28rryV z`1y~F-R8ePAAi73O1!#Z9Fa{j|0-uLiU(Kx2#!l14XZDHn*DTUuReoV>Y2lV6WNLK z#MM)6Na_op(oz?>Vc6~X6~*?rZ7#8&aSad;&$J?15jm*(!TccMQdrETU~m5e&S(7b z?sf8b$zL1Myqre)&T~}Aa|0?%&(-)8=9r4}j}4cz7u?nB#K*i>$?)^BL4l8V#jYRe z)7f|O1xBW8(8j)KI2B)~mZvm0gI^{7ah@)YAr*0NZ@Tj}7zi9V;QO}q z>Hq$xeMN4Lo9YeHPn+3VRF-yjZ9dt)W7EpD(=Fc}mfrj&%s0;PN6K7{mi}f2MkW>x k0R@K!G{(2;C*j>s7z@wL&q;a^ei7sWPgg&ebxsLQ04a<>u>b%7 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/dialog_middle_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/dialog_middle_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..6c29b320644403bc7c8d4d5045c2cfbed367b360 GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^hk#g#gBeI#Rex&)QkDTeA+A8$7z~Vzj35mBvyg_Atcs}tFN2@l=4U|3I8PVHkczmsH{JOf z36Y&fOK<)X<{M}DBW12e tOMf#1BNGdUfPzB<8sl5_lkn~*jD=_B=OjG{zX-I6!PC{xWt~$(698kGOp^cr literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/dialog_top_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/dialog_top_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..e1c602fbc09e6c6a1f87913d3ac4640ee1d19d2a GIT binary patch literal 1155 zcmV-}1bq96P)X-Lx=Y*sLoDzJc+^fxJjWdO4J;|Lom)A~QYo@Rw1dTu>aXO<3Umokk zHM(nHKO*dzp)?}oB0w-e-TgeYE^286lEM<~I%?alt-8K7^ryWU0b)`{kYbIW^iufF zIOO)cRVii$@49_)F_n#x$b_gmBx^5s%{`eiv%(PwCG2GmC`!#^Dvhxe#xOm zkWoM$b<|phh*KtjMj$(^VmKJUp`QZDbVv4uF~u5-jUaE3qSYcn4PXMm-Q3)Ky1u^t zx>zi3opUwLMEr#c?F$w|jVT#-?0uK;dmh_&%HK0J#(UqszP|pvzrX*rTrPiOKaC0o zkrBp;ak5_Uxf((CSw(Sub#?W5KA(Skd3mYd-rmr*Ely3zw~9)?c{J2q=NxmXpEu-Z zT4SoJLRD4uY&QF{SS+gLa`~tGQM^hig}=Q$OfNgF)W}MOYV0CG4PXYKo=&H?cXxM_ zhlhvkA4kYgG)*&an&vxzAK26fK);TVksy9A(Vr{xS*c<<9L@9d^W^F2>Da%AkfUhZ z7S6fwfcDre(}$v2YBw2z8uY8`c-d4dh8uBA0ZbkrAJ38w5hC&4W3^fVU1ow!8Whr@ zu#yDP$|c#JIdU)5aw$>`pr#4PSafwnc%X;KpuN;ht{kO`Wz7WJbO@U|VFqAABapG^ zj4;JUrz_E-YeU8pAH7t`Ax-XuS}+G8V`A-ScvnO~bYn1pj0R!lXxg=ej7iYo->#L# zvlbEd&>}*-4=DF`nGu1Ejf@DEW+i)OD0z<%Z?fwxohIfW!} zJ>rOC7K*&x?&9E00N>+{HYb{+OWK68D z3QLl!MwW=Jf?3;s&0?91P0*p-1!0+@c-2VWU`}!GKtfK#yL9Zm$3Gx! Vg*z-4zJCA!002ovPDHLkV1jx72zCGf literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/dialog_top_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/dialog_top_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..606b4bcc4bed5e7d53487d1492f5b8904c8fb771 GIT binary patch literal 863 zcmeAS@N?(olHy`uVBq!ia0vp^hk#g*gBeKr?lk)aq?n7HJVQ7*IBq}me*oli7I;J! zGca&>f-s}`$Kd9_I=XuL28Kq)CZ=XZMIAl2UcUYC<;Of*Ssn%k#yg%ajv*3~Zx5dCed5O8 za`5}4t;JK%8Kv{YTc>n4q^>%VcHaM1aX7QE;{WGUP5(Z*y*>Z_G`0Q8>XloHwDv3h zS3EJ-CT^#8z`hCnE-WdNrcPPupgE<9 zQzdc5jujkAlWpQ=dM(_tWs2CT%mQV{kfyGt6H;Cam+J1;eQ++dKq&ACv!me5CmT^YSY~@YnhAx5=k85u!S!B&5b~?2n zNafg%>+|)SL;wDIe*OMk@A4x?d-?p7=6yPD7IAIcOtFnXvwXTNjy^oiFZOLyero#k zTW?qoITmyo+DAk^YW0q@tnk>D%OhrfY@4c_1@Ai>mBd2D&`M(l{gc~zH|*Fr{Zgz8 z*TYAuI(kyBJ9*R`eKz^(c#PB0 z@1e4**z!-F70Vas_&HRH+X+R^JK_Ft@&}ef>JMMGK38EfVhwP3qR>5gG6zSC^h9;h od2tn04_}@PU%%$9di)>mxOKJLmH1UzfvJYU)78&qol`;+0P>$h-v9sr literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/expander_close_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/expander_close_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..b1ec13f562e84c2c9c9332166a483fbe76d7e73a GIT binary patch literal 573 zcmeAS@N?(olHy`uVBq!ia0vp^jv&mz1|<8wpLAtlU}EufaSW-r^>)U7Z)Qh<*3D8) z3p|+2Zbck%+8}Txh~;)jQ|nd%7He(qkMaWE+#7`tIyJ>|MQaP{=;XL;5ER_leJuVl zv-%sONe3Fs*F3ZRG2_n8HD{*Z-K%UVcv6vRm*Jwn&J2eQctGe6PrR6BqmTw1DMoQB zU0T((|D78r-;>7IQk+UckE~+KTU+ARs&3%=_2+NBmZS7$Cbt8fHOtw$s`jft7FCSo zK9N0_WxCdag&D&dA5 z}^?$yE>JPSMj+f{Bn4Qaa z+OIuRE{BIr-}=t7_TNo8lW8%lW}fHhh;EAAv|_(e{D+zQ z4L`Mqc`aZ;M+p*bi4tuOrGw`PPGs5ikI(bhf2Qqej7#++m9GMm1%s!npUXO@geCxD C!1DqC literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/expander_close_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/expander_close_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..04d5e7b351b50f8c1ee5bbe09c3a8124c25b90f0 GIT binary patch literal 458 zcmeAS@N?(olHy`uVBq!ia0vp^jv&mz1|<8wpLAtlV4Udb;uunK>+OtOZze~P*4S*} zH%B`rylQrJadd17adC2WbzQgZ<^TV>+dn_7*|COu;}I*rxy<~{RqkbS@2wW|8fPo8 z{Y&n7-Ok_|C;~z=`}w*jDR3eqK~E1A#TuP2%jY*KU*NeRDi-9xeWy`!2V{&R=CkN0uzumr{U3GdTkHqFK*`tV#S7+b*u}c0Fv&FK?%|6+8#rh4d=$OcZiy$oELJ9llW%r($CBmHZx@-)92x;Gj1{w{pM-njY! zmyf2>^J%vtzxjDslvO+w{@z<3_VAwHor;Gp&qQ{=dp&Kda8O>g@u?S~dtM~HkE3q$-e4VKI^KH%FDcAm^ga;yQ7HD)W0wUqy6vNG2n;tDZ c^=m()xq7o#Kxp}TU>q@cy85}Sb4q9e0Md%Ov;Y7A literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/expander_ic_maximized.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/expander_ic_maximized.9.png new file mode 100644 index 0000000000000000000000000000000000000000..24f12f41b385190b7f1c3f5e8486936489ac6143 GIT binary patch literal 3869 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 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/expander_ic_minimized.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/expander_ic_minimized.9.png new file mode 100644 index 0000000000000000000000000000000000000000..ce28f0194be5de4ffb7c4bd565b9d28d3aae2852 GIT binary patch literal 3963 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 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/expander_open_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/expander_open_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..17f8e3865a064fac70840526880f070be2700423 GIT binary patch literal 600 zcmeAS@N?(olHy`uVBq!ia0vp^jv&mz1|<8wpLAtlV3PNAaSW-r^>)U7@326b_Py_= z13MHGy#pMZodwu@n;ty7prDuME6C?Gd$I)Y+KXy>yu53xh?ESz~cUWDbRB4gBRp5_9ozm@Mf11<_B&969K5Q)$x9anq zp(ASW>W$EE`GbA2$>L!T+umkBxg#SL_B;DRYyJlI%O}g^^79Yrym7vL?mx%(&v|@> zzV{kkfAGaWWSHlizjMCE+V6+Ge{kvwf8@*i{rb7K;<}5kKiuNFw5dt=Kxp}#_x7XFj%oEb-oVAxp|G@>WZ_M`&FL=BE!LLc5CVv*uQ@v+U>80Sl^`oTlg|^rq zJcqZ{^X%KbYC3eIum)eyvNMP!6azSWA>0&d;c?--I@LP z!d}K{iBIYub4}XW^6Kvq+lWoiHuC-cz{n>2cE6g?s_q@E`49Q`G&Q>XUO%(tmD0L{ z$uG2X?RQVs`uM>j&i=4alH`%{8LjvI&Na4t;hFMG!t|mR=OhILf<%y%;Z?0rb#v#r dD}w&*U-tIx8Dr6->cAAk;OXk;vd$@?2>?@!4}Jgu literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/expander_open_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/expander_open_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..a58e4331bb1bcd8fadbbc9d60037c8f41c1ef3d3 GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^jv&mz1|<8wpLAtlV4ULV;uunK>+PIaZze|xx4C~b zCaLgxEmGoG>9CEXOR1~N&gA;}KmY4ft&h0qzihqXdhUl!flSQ(*vkIh){oCV+oW?^ zFm9UB%=hw)U5hk8$VgIGOx00H1p_Hff8aFj!N0`+trIpdabEFJt``hwPty>R5qThU z>;v0ZOP3qJYF`{+pW`HVXOUMy-5RI!7h0WXsPh*0*lk&uvoHUlN`z!-hO>N-#DSAM z*LNBxGdXYmubtCcmVBor{l3F-^Ag5ZO{F)#g<=j~c=Me>dYK*v=ehpZ1?f^!2YJ`b zva+7`@Za=?Y>k_{7*u>ZG!Ciu_$2oS{G92zFUU0A@73#b3i7|K4$j<|x$dLgmW12& z`?%lNRbTJ6*mk@#^Js<1)4cf(>{atb_>yAHtnJ^;jJIu_IFm7IL-MP|lM|#@ALQoQ zGeObD@#wXqnu))B4BBpYN-7s|Zo6oj;qb9~_dl=6sZ$@QIHotLc%UFisD=3m+BhUU fyR>1(-v9m!_BLCtlB?AQMiYaltDnm{r-UW|ks`s2 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/fastscroll_label_left_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/fastscroll_label_left_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..a92d396fee215f4f467243385b41eb07a162abb2 GIT binary patch literal 1351 zcmV-N1-SZ&P)uy#>6vpv2v*v9FpY$@k9}c0dq!O?Z1SE(- zilqgC9!#*Hfud9>-Fx<7#>Q)SzV(?)_~oBWGAnCu6U7MlL|NF!7=fz3zi92(TfZ_3 z)>CEi+0Val0zB=;Hu=3XvT#r3|3WRa`#SfDTP+Lz088B`(o)%{mZ(62yiR*u0}z0v zwp)Ft(q^UUXIW0uX?xdz^c(vdvf^08z~fSJfpz z0HU^8>2z;lGi9l(DqRlQDN%RVxK7t-3=n{*c8z|jH9!EO?sB$Tc@3B;QQJh;yAHbu z2td^0IoIVjKszO>-Jl;qpHPUpeUTn?Yk{2-b%(K=+#Xv20`NUG*1M`(4egYrn$2#n zMVb<|^?5y{D}Vq*ZMCMw?SS6yTt(zb-QeB(1UI%5P+z;>Q1)> zIyxb$U8$dGJrIDX+l=|ZH5wcMQMXB0t5sVE1R!dt(RTMHbaX;g^Qs=OwLk!(wy4?f z)&nyoYKw^*-F~|m2td?Ws~_q*Xs1LqZ@6yjfB-~ouC?866|hsHHXGaII&2LPfT(7P zcInGN0HVGvwnaOv1p*MYsIxuL(FswTt!;JKtrMb}rCQbHKmejP8?#$?L7z~F8kTFf zB1b1g-R$&TZH10bh-wFz4+0i|J;a<__ zJ+xJ#PG;qIexwAea*^WCVjz14RVC^~h^PEe2?b!O5~qtkk8PEx<3)MS|6Bwh08vHk zKSh7`FSJ#nj>UMv|Cl3Hi7FCj=39LXRVC_p2$%hNj#!|mB05|4rqcllK-Ak3u4aQd zQkAG8@mcwe{|l;0)bSXuXMW{FfK>ThEI$otY+pej-4Sz{dZ zqXiOxs3PG(ei+;;QC%4>`XT7^3Q=#!t?A-eIsU5{AgVmhkEV~HtrGQS zh`*$lvJwfvQsw58;z;r^AOVOf5{I)hS&T>kqME09Z*mXXDp5yc9QEh290)*EksE1w zB$h-KRos1MnRicW>{cIqagQ^mBID}KluQ?QerAmC59Z#@ZEJVFl6z7sF&=Ct!MeN^s z-`o?ZDp7}Gc|N%a-C`lCNSv8(bq3lhQLlyar{n^3#6naNH=7@ydjxHjs8=LhO$HOB zDp5t^Y;j`tK5r|B1Q?1f!*kzHeW?qUvm%*@m?#Dfu)tG|=0A7M)L5_uY$N~x002ov JPDHLkV1n;=YhVBX literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/fastscroll_label_left_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/fastscroll_label_left_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..94079264a16510b565c5e561b19cfd1e2ea08c0e GIT binary patch literal 1347 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 a4F3SIodopoBTga!0000hvo0 zY$EaHq(_U1yv!I)GtsglrKf}&?ZxXZAH?DcOHcEbKX!NayF0({XTQ6%rBS>vJkA4$ z!C>%Q4tqBkVbD%GVnKhr;1Uq9S}vObWyhNhvHU%I30lkHGaclTW|_E!A`g5PdftnE zL5Q#M7}~s+gTu`Sc20#c7MmEsFOqwClOu7h2dYZC~60`@A|DkubfPsv6ekuiH+uk1sRG zPdzr0r1TIg%2c&d8e|6x)6D`3+|#n`zvyU9R5dzr%*;u)OJ{eVJ^llREBmBAJLROCDi{T7Nq7P8xeZ#0teWHthl1zr*FJFPuS72dHmGD#6r= zc0}awhO9__c1!48FLSv1B3{G@&4?NOHn$z<=W`T;F()2{SkoJB#Re=#sGP_VmGpt~ z2`o)|dCQf6v@G-bqC8!WKJYMidwRo%=}&ovwzK8v1kN0Y-d4t+ovPAavr)|+94VfO zgZO{!uWkQTkk_)S$@g({z0952k|K@qgMHs0+2WompbdEq-w~B45nYlG5fNn+rfy7J71Ax2bFFGp#a4*$FrF;VlRqQb)r9Du}rz#zS;hjq)Kjx6!kehYe z8arBn>(~o>A#lByIXX6Ai&mIB{>FgZ8zI` z`CLuOF=CY=mDwvn^2w`ux0#+QPGPd_>!Qpv*j7zqdE8%LrOK)WnN`zIzbzKfXN-<H96%Lv&E`kb$U4 z`_ra`O}sNZtp;$CO0OGBFe{L(;My+6X<*_9#e%T! z`DMMydHfqtn#+}2l2fp>}sO4CgxKOjucMH$-6-#$cc;7Ws=l-go ze<51y-fHb!{i-6&a`)=zHx^E57oFAUInO0=^=IQb?eqQ4vfWx17h8Hc@5Yih@%Edq zPVaqFuiZcQZdJvaCX0_1e@{JrqHll%3jUZV^}Aow=$_yF(b=Sqi96P%C;y`SW4mV$ y1WI2eq-&bXXBKUGg2d!PC{xWt~$(6989& BAIty% literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/fastscroll_track_pressed_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/fastscroll_track_pressed_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..a17b92eb108ff6c3b1024471a20056fe4e81135b GIT binary patch literal 102 zcmeAS@N?(olHy`uVBq!ia0vp^+(693!3HF^taP6Tq;x%9978H@U7fg*mw|!fki}f) zznsGErHMY z^`_;*%*+RmT=?J2I{73^aofu4)0gqZvs$rzWqeW?!N1x!lS#BaQN*!KeihIJ22WQ% Jmvv4FO#o6sA#DHv literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/list_divider_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/list_divider_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..e62f011d45a2c4c61a60b6451bec014a557a5188 GIT binary patch literal 83 zcmeAS@N?(olHy`uVBq!ia0vp^EFjFm1|(O0oL2{=q&!_5LpZJ{Cp0wt58!#o&?v=m gn8lDKU<(7oW*(8&@UL&}fT|cgUHx3vIVCg!0O}VNC;$Ke literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/list_divider_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/list_divider_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..65061c0f45e63fe0fea0bfad9c71ee52c07ef38e GIT binary patch literal 83 zcmeAS@N?(olHy`uVBq!ia0vp^EFjFm1|(O0oL2{=q&!_5LpZJ{Cp0wt58!$3;rOwB g4O4-x!vO{c$tv!+&aYQD0#z}1y85}Sb4q9e02-VDh{_+hS b3(he$O=;**I(SVAXe5KDtDnm{r-UW|3xg_^ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/list_longpressed_holo.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/list_longpressed_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..6a8a97e1e173d69acf3e557c050885e54704b060 GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xaGfx-CkcwMRFKy&xaNuA$_;x>Y z^`_;*%*+RmT=?J2I{73^aofu4)0gqZvs$rzWqeW?!N1x!lS#BaQN*!KeihIJ22WQ% Jmvv4FO#o6sA#DHv literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/list_pressed_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/list_pressed_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..4c9bb4975e3475b8cb8b1061527743fc22a5325a GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xaD^C~4kcwMRCvD_pFyJ}-CwTo^ zMN7@{9Tgr57gUp_n-6r`NS>CNz9B$a{q(y98;`s234Gis(Vog~$zCAV&{EFwq84Zh NgQu&X%Q~loCIIBwBdP!Z literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/list_pressed_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/list_pressed_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..4c9bb4975e3475b8cb8b1061527743fc22a5325a GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xaD^C~4kcwMRCvD_pFyJ}-CwTo^ zMN7@{9Tgr57gUp_n-6r`NS>CNz9B$a{q(y98;`s234Gis(Vog~$zCAV&{EFwq84Zh NgQu&X%Q~loCIIBwBdP!Z literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/list_section_divider_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/list_section_divider_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..7e249cbf444a3218cd8e207acaadf0b47fb3abbc GIT binary patch literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^d_e5P!3HGLFFij7r0hIh978H@y*+Kn#h}1*;K09= z|M%-AnIBxL7v!Vxm{p+t#y#(1>9Y#*2L!lUofZaYh;X&$D;j8(H#^)qb=pVy(2s>% TBkgK{CNX%r`njxgN@xNAB@ZW_ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/list_section_divider_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/list_section_divider_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..05b5ff6f993fc2ca10c3cd1660ee2cbed74a85ec GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^d_e5P!3HGLFFij7q^vw$978H@y*<5=lR-h?=!N~0 zf1ek7%{+Va#KSB>`xq=;_Od-OYjd<~5aeogS{R@q!qs~I;VT=FOE%JxmdWPxJEq+L Pn!@1e>gTe~DWM4fq;@7C literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/list_selector_disabled_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/list_selector_disabled_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..a791f5ca73345fc7b16e702e88ab383589f58ef1 GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^azGr$!VDy}M6D+PDgFST5LY0L4E*_?_X7DWB|(0{ z3^nx)tJ4Ly1Nmy6E{-7gb&~z{p^s V_2jROw2B4DL{C>gmvv4FO#m_aBEJ9t literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/list_selector_disabled_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/list_selector_disabled_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..ce1bc83b22454201587414270d430373a31c4222 GIT binary patch literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^azGr$#0(^thMqG3Qak}ZA+A6g4oqK~PXlt8OM?7@ z8RX;_+kg84>!goUHx3vIVCg!06$$FbpQYW literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/menu_background_fill_parent_width_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/menu_background_fill_parent_width_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..e1c602fbc09e6c6a1f87913d3ac4640ee1d19d2a GIT binary patch literal 1155 zcmV-}1bq96P)X-Lx=Y*sLoDzJc+^fxJjWdO4J;|Lom)A~QYo@Rw1dTu>aXO<3Umokk zHM(nHKO*dzp)?}oB0w-e-TgeYE^286lEM<~I%?alt-8K7^ryWU0b)`{kYbIW^iufF zIOO)cRVii$@49_)F_n#x$b_gmBx^5s%{`eiv%(PwCG2GmC`!#^Dvhxe#xOm zkWoM$b<|phh*KtjMj$(^VmKJUp`QZDbVv4uF~u5-jUaE3qSYcn4PXMm-Q3)Ky1u^t zx>zi3opUwLMEr#c?F$w|jVT#-?0uK;dmh_&%HK0J#(UqszP|pvzrX*rTrPiOKaC0o zkrBp;ak5_Uxf((CSw(Sub#?W5KA(Skd3mYd-rmr*Ely3zw~9)?c{J2q=NxmXpEu-Z zT4SoJLRD4uY&QF{SS+gLa`~tGQM^hig}=Q$OfNgF)W}MOYV0CG4PXYKo=&H?cXxM_ zhlhvkA4kYgG)*&an&vxzAK26fK);TVksy9A(Vr{xS*c<<9L@9d^W^F2>Da%AkfUhZ z7S6fwfcDre(}$v2YBw2z8uY8`c-d4dh8uBA0ZbkrAJ38w5hC&4W3^fVU1ow!8Whr@ zu#yDP$|c#JIdU)5aw$>`pr#4PSafwnc%X;KpuN;ht{kO`Wz7WJbO@U|VFqAABapG^ zj4;JUrz_E-YeU8pAH7t`Ax-XuS}+G8V`A-ScvnO~bYn1pj0R!lXxg=ej7iYo->#L# zvlbEd&>}*-4=DF`nGu1Ejf@DEW+i)OD0z<%Z?fwxohIfW!} zJ>rOC7K*&x?&9E00N>+{HYb{+OWK68D z3QLl!MwW=Jf?3;s&0?91P0*p-1!0+@c-2VWU`}!GKtfK#yL9Zm$3Gx! Vg*z-4zJCA!002ovPDHLkV1jx72zCGf literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/menu_background_fill_parent_width_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/menu_background_fill_parent_width_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..606b4bcc4bed5e7d53487d1492f5b8904c8fb771 GIT binary patch literal 863 zcmeAS@N?(olHy`uVBq!ia0vp^hk#g*gBeKr?lk)aq?n7HJVQ7*IBq}me*oli7I;J! zGca&>f-s}`$Kd9_I=XuL28Kq)CZ=XZMIAl2UcUYC<;Of*Ssn%k#yg%ajv*3~Zx5dCed5O8 za`5}4t;JK%8Kv{YTc>n4q^>%VcHaM1aX7QE;{WGUP5(Z*y*>Z_G`0Q8>XloHwDv3h zS3EJ-CT^#8z`hCnE-WdNrcPPupgE<9 zQzdc5jujkAlWpQ=dM(_tWs2CT%mQV{kfyGt6H;Cam+J1;eQ++dKq&ACv!me5CmT^YSY~@YnhAx5=k85u!S!B&5b~?2n zNafg%>+|)SL;wDIe*OMk@A4x?d-?p7=6yPD7IAIcOtFnXvwXTNjy^oiFZOLyero#k zTW?qoITmyo+DAk^YW0q@tnk>D%OhrfY@4c_1@Ai>mBd2D&`M(l{gc~zH|*Fr{Zgz8 z*TYAuI(kyBJ9*R`eKz^(c#PB0 z@1e4**z!-F70Vas_&HRH+X+R^JK_Ft@&}ef>JMMGK38EfVhwP3qR>5gG6zSC^h9;h od2tn04_}@PU%%$9di)>mxOKJLmH1UzfvJYU)78&qol`;+0P>$h-v9sr literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/menu_dropdown_panel_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/menu_dropdown_panel_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..26481856d87826facab86f1bd60efc58a56413ad GIT binary patch literal 1334 zcmeAS@N?(olHy`uVBq!ia0vp^O+f6#!3-qVnEtBgwu)0nju90|O<;w~jzoZb^_| zFaskKGYcylI|nBhHxDl#zkr~Su!yLbxP+vXw2Z8ryn>>VvWlvjx`w8fwvMizzJZ~U zv5BdfxrL>bwT-Qvy@R8Zvx}>{hnKgHub+QFP;gjSctm7WbWChqLSj-%T4q*mUVcGw z$;8QzKYnqVyde=7>Fk~^jv*QM-p=yPyKNxQ`kYtOJVXB`_Y)Ia$Mx51yF(uBxz4KE zzGz9!#OF3_LtnS8Pxo;cVZQsmoJ6vD*-Hm^8W_5)y<5$+( z&iB8DbKG@G_|C$dV35$jWi&G-=;)51Cv&+BLRNb%Sk5-pVUv02ig>xW|7U({DNgQj z3!LJzm+hEetLOpQeOVVTbDNyvoRyK0dSboOfrs-x)E4mlOS#}8taYq7&t!#Gj~;Vg z$yTc;Z3iaSe7eXX+&hV9myzkjm+$7eDL;AgE_ccA&#SpkelGcGB=yk9*HZO|>8;xZ zExVV0)H=cHuw9aoc|y>+>6tsY6b@~`wu(0zkP*!xXRalj%jEPy<>OBj_=_*JqCjZYa(u>&f8zP;TKEa4(AE4 z44tL+CdEFjTJiIV2;Wtbojw< z%Z?Kg-U3U$F}L0M)%Y;bN!i@5RaI#Pv*;E#rk~!-wT^$4u4i1>XL!JNxp&>HeR2C@ z=Y0x3<#8|njFPakYTT*Qf2#j&-ZRD0>#N6Oj+rhK1(zlW-no&l9QjpO)vHtCsF}JM zOQV~}?5WHLO_p=k3Qp^oaoT(4^dOHw>pI0qypt95$a)s!)yc7`?|)vX zfU~QyuCZ=rnR~hW5t;ha_peHR7dD@{WW$COzt107-b?g_Y$)i|YVJ!~SjXdZBdEry zsQvpb&yzh$&fMbXbb7W4K3P_MB4gpB0?UWC{$Z0=By2F)5!$9Knqb7y*m9-%i>9WC zmKN8ifYw#ajSV{wl)B$t@4P-WU6%26!tI(zJhM!t-WxMDDV$7j`%tBOk$Yj^!|eHa zoPPWIBRs!-7kuj_edO2Q-}g`DOjr8-_fThf@TT%RzHe Tg%d@VfbzJftDnm{r-UW|7gMaZ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/menu_dropdown_panel_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/menu_dropdown_panel_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..6a684c9d8e7b7d7acc53ab47fc9f2f661978486f GIT binary patch literal 1306 zcmeAS@N?(olHy`uVBq!ia0vp^O+f6#!3-qVnEtBo;%SynXxj-Me@1-@jj-KgkGav3*I9UoZnBBNHjUlCw6QuJUr)POaDhhx#|zR_xI$!*xGnwU(c}x!Ui@qkA6Jh z?PKOD`+h!C<;sm!Eer>4{W%qs6UHI4nn{r9c8I~A=&tj&k}`TMOT`)E7P4|obGm-q zfk$;4Q=1qQqj%%X`OT>_owe;3b~R3HmbqsjbGVNoEj&kAuh3;H+_81sKgv-vOGDrc|ohr$?RvXY1h`edd3A$NptP%iSn3w zi=#B|yxgJIu-y2K`ZHuRw=C1&61MsPtIiXT7f)wQDxNBne5_h*nX-oNr$*LknU9$) zH@%$0`@i-^;jcONj{A8YGDcJ|a9n!R(a!PBN;+xT?ZmgCXWbV{txi_VEnDa5(pBQq zvToubIp^h36GF;rE+3n=s3a=j3qzW7LF)3w0r~zvzfG2i+2?z<^?z9<=kmBd0fpN7 zd7KZ=^M`IGI~^4|eXnnTyJ{GUyJY05vb3py1s;yg=$L%QCdQ~iX$AygMTkMWSJI!+U{k;4B)|Qh`3s#gy z9tjbAw(`2T`?AUqsltod zu$#jG*MJ+qf=h5B4#XylS+JU7l9+`g-0n!SY$tIF-dE*P{wybXFWqX{iotd0uGBAa zm`irnb(D(`LI@#*5JCtc-NqNJ~jPK5jil+N@lo)OwC*jI~cGS7`YPU55l&Iv!u z6jOyUnbu^UpK~nY=pwge+a(^?`(`PP2q|H68vs;^en=Tw$Zli{uhHN0s3E4L25E*0 zL(%KR;}y=M1}R4ie8N!p(@1Mj7!^v4phLbEx!U3SR@*0;nG!AK$fY`@U(KZvY+&`XtNw_44xa z{rUO%$9}*631<@HTc9^VFiMV2kLpwCv4Knto3?E~SZhCnCb%UJ*4j^P+kQm*J8w7-OESwO`+5Ga#*f5mxr$z$*Z_g4GmCPt zD60puE?c-tAw=xhIi4&f6H2;`MFz4isc3*mo9ti;dR~F4;XcrV#iH3n$(*V|-j>%K zko8ENTPQZeoQS~GaDT)Gh*ygUF?e0U{jf+2{+bB@8sT53I8CIC5X(2Qfg-^4a1W%k z(XUCGf)RlL7&k(0$rb;B>Hf&+GV9`1z04}Mtg7e$ZMCpb>~?su6Tp zDY<5zT%WM8ML$-|oQRNGg-h0Bu_jZDpjY7@MN8I2YN1z57cnO_=uL+ta(lG+lcU1e zdF#-bJWz1n5pLD(A-*fQAwh?ri`EMmF-A#5h}ERp5M*6q2FT6*oKd>KMG9ZTxvzq| zex6q-tY$hw5IAhk)&E=IZ3nM0P4>#|74uIumzQr`wj T3mCQ700000NkvXXu0mjfr02=H literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/menu_hardkey_panel_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/menu_hardkey_panel_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..f0661e6bd52b68308419bef36cce28b1f75b86d1 GIT binary patch literal 861 zcmeAS@N?(olHy`uVBq!ia0vp^O+akK!3-pqi+|n)q?n7HJVQ7*IBq}me*oli7I;J! zGca&>f-s}`$%pY@q5Dmi<0{E?}5O-$rTD>Odm@Wbq>wDAvjlH zk??tuT>?(x?~ZsiOlX-Pa9+&GNrmieSuFI%}8 zZw};p$+RB4<2mhUiq^Cvv8fZDtebKw#q?>CwNP^;=MyF4nW^2fn**PN^@&Mu7K$>M zslt+!YBuSP;Y@4KoHNRuCspKT+IGt;Y)+3mx2Nk!0-L9Yg5gY-R}nLND|kN_rJZ0B zQu9{eX8T<9?CF^}ZhM7Z+s_(_n_Aq{go}=*>{QD6bJRB@Q+D!Jz1|H*vl%iIH*H}^ zOb%0gTa=fsX1)FM($)<|&Q4;zC!@qvcpl}eKl}Aazn)?LoK2jacBdDBQlY1-pUXO@ GgeCyhfd+a2 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/numberpicker_selection_divider.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/numberpicker_selection_divider.9.png new file mode 100644 index 0000000000000000000000000000000000000000..ffb60e809eaadd0b612ff215ebf5749e3a421f27 GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^Y#_`5A|IT2?*XKAJY5_^DsHXqHRNSr;5huDr7R|a yS+=?G?Zafx`QK(RZjcn&HC1jZ*WF}`^U@YSTuZM@>AnH#WAJqKb6Mw<&;$TGe;-i* literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/old_switch_thumb_activated_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/old_switch_thumb_activated_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..9f7a9ec71f22716524849eb89daec3cef520c7c7 GIT binary patch literal 627 zcmeAS@N?(olHy`uVBq!ia0vp^SwL*X!3HEF)}KjWU|_QHba4!+xb^nVNk5T5iMEIL z?GiINye{*6Pg-PH79enF%agP_FAg2yluX&f$9a{%Y$ch-`@LL`S4txuab|Q&AKc^V^o>bVQ%dS3(9f4pwuF*ARLjOCPDQ)1e-zvz+i z%Jq6Bw!h1)7sS#!Tr+ilz|LD!u9TN(^DZ@0o%~SNYHC~1>`7ZQx%GQin*g=Bw0%Do zDhE{jNPX88e30R z&;HhJRw?V1`{@;z_OVKNAR|lO*b%67&&~rzF%uSEQOnP@a=5-j0cdjEpTnyP4}#<@ zj^tbbO6liDHF8@`xpn1M;KgMNfGXDhIX*+QFik#qlwuo=3+10Yn(j6;+dbiFM$@Q|lQe0!y8~99Yc9nB@_+Qrq3(1!^ zoh42!?4CD8s#?SOtAX~?WAjcue*QCgTGHa`r@Ac*&VGB#2TV*1p00i_>zopr0IQ@X Aq5uE@ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/old_switch_thumb_activated_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/old_switch_thumb_activated_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..09fad6e3f719414e0cc910272c975fe5d5744532 GIT binary patch literal 636 zcmeAS@N?(olHy`uVBq!ia0vp^SwL*X!3HEF)}KjWU|@3gba4!+xb^mqw|8iu#IcXt zH#4~lPCIU-c*0R$Sz}Ris_L!G8`Cp`nitGon!0lS;sW`t+$-*9exJYQrrqq?$mvI( zx8ASFuVDLsbJHfBw>)v3#l<-(R&)K9U)DVHZ=0XHMuFDUxQ9hY-8kDHv43DYzRYpe zo5yl&KieKX-qAcC$dh?&o7Q{U@`_H}Y_^$c^2(2k_)Ep@eVTnfixqEmUg>*NbVtAA z+kmX#F!diVZiiS;xiuxUG4*q}IgoMHnn#*5{UcvU}oV(po6P!9!#1963C5e_Xe7B<)+@VUNGZiyp6fu zO`vJ&)e$}*y|)C96?g)*MBVK>C`!?T=mFL+~PH%s>)Z|e?v-IQu)f5}(J wb7}O9pYd%`hjM3TJ=gs6%36lT5@+^Ucma_v3y^{a+auX@uZu1hm%2QJp@mD&oed0GxzUPCt5oxu#)>O+Df)*j8hM?t^3yQpBvmGWbb$L2H zN@u|Zu!2qAcW1GNq^pG(>} eBIILKc0Sa1P6kg`KbLh*2~7ZTs>3w^ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/old_switch_thumb_disabled_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/old_switch_thumb_disabled_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..6b649331d347cb8ecf50972024c1a100f8e44a9a GIT binary patch literal 453 zcmeAS@N?(olHy`uVBq!ia0vp^SwL*X!3-qx3vECGfdM`tuA!l!KqiocfdBvh!FgFD-L%}R?CVP7S3i?pKJYk)kW^zum74(-M7vDtET8w zxz}2$tCe2L1*T3`zIr;dZPvAJnO89;&QnACwn&(|>u&DL@;$ip*h!J-tmqUj-B5lb z*Xc&B*bwWqTiecyL}a~S>e5K<(!Q#_U_#Kc4?)XT1nmxEJURtc)0A7XOj_GR?z4)7 zpArdpbwzu@0kC4A`cK|(MFTQ4gDW(HZ!Yay%haWtsZpNdM=M^#ee6o?JL{@Pl+#2ILq9?tKk1#===s?&@p(r`njxgN@xNA4wI_e literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/old_switch_thumb_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/old_switch_thumb_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..7a5ead14ad9a6eb4781a51d882ec404ab79acffa GIT binary patch literal 628 zcmeAS@N?(olHy`uVBq!ia0vp^SwL*X!3HEF)}KjWU|_QLba4!+xb^nVNk5T5iMEIH zS8Y&gxUemEkAS#~nk&Z!W6SVIPU6QJ9T^|$UCCoJJ-|Bc{h?c>rCAotE${v3mFn(0 zI{TK4cGsbI4@D~sj=L?p{IbMq?x8>b=M=A&co=r9s{Ll6w5Xu_tfTBP*1SgN1iVj7 z;(hwVV&3EBmlYo0d0_mk$J_FX%{^=0pr_(tz23H0gz7ASY-KSuzNKcW=0~_wgxiB= zPuiZz|M{4&j90E#R>xMW{Q<4Frd(0ixh4e^NNY(=+1dtFvo&*nPVm}=SC*-`MVPPq z7LXMz6n`PxWXdg(yByjlqp@CyZE3voIv{KE zcQe`KixwcExY)$g7Vkj}*@vDJ7G6=y*W1u(a{{QwTs?Jm6VQ~(kJ7h~u}XX8etN{x zya1%~)|OVA7eH5~-#=}}D(jW|>Ir{Y54YWvTUSnMvIPQtVzo6>x^fE8{nz|18ta_` zD%Gyvm>shPC=zz=gUKtPK=Sk(u5zUsTUTz}yvbLyeb&L~<%X;7Jm|f5;p)|TL5ZC{ zCZ*zSr!F3M(DJ=Mbs<}Y+SFz8ryf5)T01RialQJ5g{8u0YW4$D6N9I#pUXO@geCyD CIUlV6 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/old_switch_thumb_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/old_switch_thumb_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..fbd54a399255da07cc027f3f26577886a3986496 GIT binary patch literal 558 zcmeAS@N?(olHy`uVBq!ia0vp^SwL*X!3HEF)}KjWU|{^}>EaktaqI1zlU~e$BCPkB zCuh_-%z4D}?x?0;bnoR&|NjTy5-upet>(G^VOQybYmp+;v#c&G%)R}A{d!ydmZi$a zB$9g!{;$cL#k^4<{=&(r5~Y?|++I@M(jRXsEa`5&A-r+cil_bEu^(>%x&DRf#~fE{ zX6dYxZut^>+3`YF_bp+4UZ=XpVLnx^7uCeCZ_!U$uW>76uW#|?WqN^IR{k=TWwX}q zG7Ej`m$P1_%WP-PWKq}Is|?Nkt7;czOg?QE8Mx(S>g+W@JTE5p=1+2k80l3R3B4QQ(9?qzcwfeI#OTZt4-(6}{aF8k$W zzAhJ+y}53}eJcT`Wy*I?|060e>omFFFY|SFy|^sr`j*KdFr!qTU)-bUuh?a#nt!?Q z!ldp+z9-jb&H_5a>$jNG5gnLjh+83U@Vc}tS#WdLBH!jpquf(Kt-Oz%=dkGR*0^Qz zW7aZPmy2rCb2p)C+#+~BDGF%ktrfoNN@Bo}xc2PkmX%E_Cho|YaPhe1{R^qu|DSJ3 z;jZeGbII+TY0>QGcl1d23gbe?{YF3a$lwC|Nf+>*OPeyPI=@PlwNU5Ju-3K zLs>sAUL!Ag{t2qmUH$RLY;(k=Ql<#6S(F@eYN1s{bjAcN>lvncUjx2>+n& zn}Dp~qFNglvoejXnw7Kdcy613SS#(Gz53%cH7hts`^8l$uUxOR2KN(Lyi3hgvoA}n zlMc@Ys_A5W*1Otv%B?9!w3bN$rCiMq=xlOxUg;Y+H>vi)JBjl3p+?iNE`pB|lL6#=hBW+k$2<+L9?3xq9K1We;+19pQZ(1vHs; zYrp!jt#V$uTv^Q9_wWD(KC^S5*b8E0Up}5V8!S}Vp!#?ZNb$zb+i~qdvzxYL3hunV z@QT{|++RJOkN5B`HLEP`NPWBqXjkP|PGd))U3+dG7W$+Bbl<&OUs!D)Hvvto{3!0< z%WXF0){~>*XINytaz9;KmiojIXkgU#m$x_gf?1Y_iXS%t&Dr`%wtNv#ljZH>#!mu) z2F}S%JhejuXrN!;$4fghK#aOac~^k0SZ=o0L9SF|>&lJtGtBg!284gubwMK3@1s}# zi&wAqbM*Ke+f^dgcItv-xR&pnsS9_#@Lby2{pm+#<-DagUdZQcd2Hy+?(-O!x)?lN L{an^LB{Ts5<)0@+ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/old_switch_thumb_pressed_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/old_switch_thumb_pressed_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..298e8b4238d9c648d4fe80dfb016007efdd77c2b GIT binary patch literal 650 zcmeAS@N?(olHy`uVBq!ia0vp^SwL*X!3HEF)}KjWU|8ktXe)+{W&t#r` z+OJ_}|6@)1N1c57X_lZfoM-QKWY*xn28}yXp^$ZiervZ~IA~Plgely6AdA0D}gX)EjZk4^+ z$?ZY2CrK~p&v_G&75vF;ujXx&GL5a8D;dRJ?QyaMGE8IEn@+hk<&41h30I}Oa=orC zgj%iNq-`UbvDKDpx@GH z>nc!>$?ph z{M~BGttWeZ-=AI|x0i3JS>;#m)yFF3y>dUjl1*#o0SXj1h(2)yx_Qsmm(D-0W=~jn zMNPl%@xsD`Ah91EHx~eHkGr*{%jN~p#OG$UTDL_?G`6msY+sQR^8sj?Uzve;Do|jn zvyGD+m~noFk=`kwV(t2mS9W9owXdyl)qe#PSZ!wOC|3$pyHS6J88AM?KkT_6u~_Eu z%zq14uP*;vcYng^i06KX0xZ)mO!g|CVWH{#wZPkLmW8&xefjd}KfV7L_ciD*xPK?7 R517UnJYD@<);T3K0RX-`GhzS$ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/overscroll_edge.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/overscroll_edge.png new file mode 100644 index 0000000000000000000000000000000000000000..f07563aa21179d69d1603963a4d1675c9ec52dbd GIT binary patch literal 1378 zcmb_cX;%^m07Ov`5Yqys=x~+P!W5pR3~U>PZc)k4CPqwkpG}N;ifF1!%3<>FuU$P2mx+Dnot`GWXAsnB z>iKyVyyHu-RYznhZ*nz61OkELM(ekRjy4cLVrEfEO}rSV*}C4<=iM~bi&bRzoaa_L zCfIRr_o)8pXPU^7BAY5!x+eSW3WJ578{t+cgo@XxY zE10Z&5V`L9oK-}$1+jZtS}wSkkUY?mRM`MT*9AJq@e`8oQUFOE9Krs<*eS01vn<~) z2MtModEf<*SZ@dgZ+6HyO5H?m6>sE%H0>EYbTw6BM>-T#rreG~p++S%JqLB@XjlbN zh@G~M!^)%5+}axYr)}yuE@p^Ri7^QQOxJ7Y2#pOUy_WoWhU43=RVCX6{HfnN|IH2m z6J?q7+lXZ3ru@B`H0EJEPA~ncmNdqjF0cx~LUfeKEeJ0Ugv#pCnbKC|G&8v&)l;a{ zUGRN(Rxv@%mO&H7Jg+EXG8lZ;uE2l;{8!Cy@@i68Gt7yS@E zE^7uYgVFC)iqaQdyC91!3~G{Y;rd(3V$lTwdP_TbinPe{(di= zfYl@N4Ct@Pwx$Fh<@Fb62>k8q_UjfkeRktGry@E`O?N2a4MhU4`Jqsxkn#y%x=)uZ z(`m-~5~Gw)d8Gq$lE-F24K^cb&>4;|!5{&WC9_H%66^LGg-89sC%pi!gT_4&N|+QK z9lbN#IiVX4(S7=mW9Au!H;`g2auCa>psS555M8|GJ-OMToZ*w49o!+u8ltl8Q;c&Q z@|!~3V=Por61lggTsBuLOPX3`q*i_3}5)(a;4k=I1-PH@vJT*&VAdqFPk*h@T&Q=$Y{4j zO2JoRL`b}L`PA;v)=&7H>FvuZE)+Hkm*B{o8I>Bzez_EOY;yPpyB>arC@_Lf$95zI zVyL0F)-qyuho0iA-AZZ3X1UTTYPKMUGvvBA2wMNdElB5t3jL})Z&ePEWbg$*klzh?PQG@gkcvRfHa+Xs&5Z#y~Pw1Z%=@opqksOJ5LJ}rUvhWTIcc}vB`0-<{e P=HE6icN(RdOi%p>+y{7m literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/overscroll_glow.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/overscroll_glow.png new file mode 100644 index 0000000000000000000000000000000000000000..f11854c76d4ff679becbf11cc33a85b4a1d4b31c GIT binary patch literal 33690 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 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/panel_bg_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/panel_bg_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..c7041503858f8969c0348c8486b3aca4bfcdc116 GIT binary patch literal 265 zcmV+k0rvihP)j?ezK{3KpCiVw!|6@W(+&embeKBckr4 zan{5K^MxC^2d4|`zS(;2fPQki@TS$ekCD?A^jfX^SU6ot%QsxtRJ-sHf_2Vi&wFoW z?P$16!pH0>rQ`wt2ORKU;lpryrws54-~>3}fCHW$PPpTM0}eRgfa7@_aJ=OM-Z0#I zFOy`?7-MDa<~}oHN8+FGxgzx3#CBoNO>&}e^mVh=yCt6DCj^Qva)|i@>RYJy(oYJW P00000NkvXXu0mjfB20I) literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/panel_bg_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/panel_bg_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..5d52d2c40861e02dbb78977ab20d375ee4938bf3 GIT binary patch literal 702 zcmV;v0zv(WP)2$P*lL45){W7Jjh0xnei!;N@T z2THgZbR7HIeHFUkAc)ra>?*}R_k&9%SgzMc(kD`o6e2}PcW0sqGXk;b=4x(0Dv{Bz`}7c?XWG zwS}HcCXU4L=;Z`lI0cuXRp8$Q2g9-8R}5}z1n)4oaTGYlm1CzHuXMBWEuW;xhL zs1A69>=+qBcMkLuZi)IQ3Wb81$z)7GN2AeiyMz71M=60l#~g+Sy54t`a+uXoIeEG`hE&{od&Q88L4n8lV$1^Z z5C6XZ>6#o|qS0~5q3w{gH%kV~^~`4*`KK@Bdgh=I6MiFRf9u0lRhvzI9Qr21pUJNF Wm1B=zwHZ6mGzL#sKbLh*2~7Y5a4O0G literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/progress_bg_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/progress_bg_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..174b9323611d9edff28b97bb2639f27d1b1281a9 GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^Ahr?*8<0#p>+uXoIeNM{hE&{od&Q88!GOd0;+$i* zEB-%TGL`SH5BtI`5bRS6~^)Zv-Z9(b{ygu?5d%eR4@vNK_|?bN=#72j8;te0(^>m3cdg{7&Fg^0pU$Z z?SPkxTC^o~onAY+_Pyuqy&hCqks>Q{-$c|D|D>g*bF|OaqoXbDeU3O|o-YD0&mRZR zsjqwROP6cB@>TI0i=T2v@>eSOtvl9>uRz;E0C)fPKHRv$t@{T$WkKFO62R zUdzho@lT6=bfdk+^^f;7R%ojQJS=f-5V@tu>6)Py`Sh6MGDhkFtGT6dDNSo>1s%7Q zf~Hw2QixDUU5X6nsH%|CRum_ZlVP=%X?yIg^EfyJ#6|9$t-J5Njq2{dltYiACiiW% z)u7pC)l8wWyVU+kZ;>T5b1B`atQ4oh9tx65L`g>&Lh2!_+C9i9ju6Gwc7$AH35o?h z>8C-i)LA&@>wB;7E-DxK5MI6qH(x-D*^V9@9ck;zriyFKr&Tdcp&sKvctZ4blt3CI z3pfZ05Vi{_Y*)EO5``duiXtScWyz}85yZqGWIJu-VxmT9pril<@XBxB`vYh6lmZAq zK%5&BU!tF%ho{`vxm-)&Pk(&<+pktWA9F^4&kDXk&vSwO#GL1e$6yQi;j`NEeZDRj z^I1$U4_VLH`pX8_x%$*`7d-Qn>!%ukKLd!1ykYS(^y3Y**gn?KhPc9@<&k2fsmd`a zbDi2{LMUThN)|=-;*4P8f*nLDkl`^3MbXJ36T+1UVOLB@Q7i@NY8=9nWYQ;=RxW&$ zwVwRtM|%gsMRtK>d^A8kOaRv1ZevoqX`aw~C1l6MRzgN2iixo4vU)L23+#|V78uJ2 z8w{i&5&i^VO9s-)ZWtiefd*0|K;}_rAM1wJK6Pe8(M+Y@KD(##{u8UshF?T$E5X8Y7(VP z<@H)pSFRjcpk0xAmo`R6SC3|eK{W|VLFxwehE@uX_b06_>Yf3_|B5XhyNh1hfSr9f z84x>=4;PF#L+vB!J4Z!>K4zfETXT)W`vRC=*~qz@-?@3M-QV9cKan|O@vPmkc868Qh&oAYw#ybSKI@f*Jkei{6^{jvXF X`e!54=p|rJ00000NkvXXu0mjf6yzUk literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/progress_primary_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/progress_primary_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..396fadb3a025642943d8fdd48acdef107fddab84 GIT binary patch literal 1104 zcmV-W1h4yvP)bRS6^5U8?R`J&IK(m7RYNnWU=$F8PM9^7n4pRot(fo!_!apT`~hY#W}XoP!k3WR z0Us5$Xd!i-UOTz=z31$`UWBYlU`0-8L{wLPq@|^Ew9eM6rKPi8ZE=SAZ^R|QTs|CJ zQoiiMueh4=$`^%SSp1MPB!8iV-??YK{2H_^1aSXPAHuC$+6)Py`Sh6MGDhkVtGT6dDNSo>1s%7Q zf~Hw2QixDUU5X6nsH%|CRum_ZlVP=%X?yIg^EfyJba7YD=I&eXqPqJx<iyR*F+$4+TjjqNF1XA@z_|?H*(lM~LETJ3=n91jT}$ z^wS_$>MR`d^@BHe7nO_n2wr^vw_iew*^V9^9ck;@riyFKr&Tdcp&sKvctZ4blt3CI z3pfZ05Vi{_Y*)EO5``duiXtScWyz}85yZqGWIJu-VxmT9pril<@Y*jw_zh?1DFG0G zfH+qZ&ymlc!&BbtoUSGCyWhU~_1Ej?G-LvN7VtT8o)hfK5?b7q#+zJ}#*F zEKILV)(d9+yux)Zo>_OnH&1zfDg*HQXK&88EPjN(zkwFp#~RuY*BG=sQj9cJIVNSU zQ@czEWvoldqR3vH5lmdLgD3?uJVv1?I$2~wxDp}kiU}!-r6666Ls*hb`oz-8g^#n= zlRtcK?;yB{UEmlW4NwmgfOWUqn3QgsC-hzk*)g$|kkN=@B5b;>UX0TMJ7kar#xlYN z18GQvZ5yy918HS93=r!;1F7-ZChMm%z^{Jp=7v{Hv=Mzfsi!lo z)}vNqi7X@AQ=-pPQV|WQIck}xD?>G%F0MNl*$>H>fwXQh0ngX>C#W3?Tkr*y2;}qgOUyXCF=m z#17=+1>@~d`&jzMQPH4J7%1}AT;uSe0H)VAa_;8$Zr^AR_xH>XWX`a7(cH86lph28 z=+3)noE?%Uf^Y87=I;xjelU7-dg4F6{hhpgS1MQcD$mcAaDRzAekJ@$xGw1rUH=06 W2P4y{1G}&Q0000+uXoxqG@ehE&{odu1ahg8~oBf%(T+ z=N!(JJ!xw<>C~&O937Jmh&Qfws+e#@X4Q_5srGw#CK|9^v+Fv=HT%@|fcfh8b$Iq& dus!aYwd=)k-%S^8eE=HC;OXk;vd$@?2>=oaFZKWc literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/progress_secondary_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/progress_secondary_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..9b1717a093302eb8ec88224192c579904682ef73 GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^Ahr?*8<0#p>+uXoxqG@ehE&{od*vV}g8~op0iVZA z=N@kBdmmdKI;Vst03A;*kpKVy literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/progressbar_indeterminate_holo1.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/progressbar_indeterminate_holo1.png new file mode 100644 index 0000000000000000000000000000000000000000..93684e85286fdfda5779531331157b34ab68367e GIT binary patch literal 627 zcmeAS@N?(olHy`uVBq!ia0y~yVA%s?D{wFaN&Qz7m4Q@CfKP}kkT%}>bYM~GSH77* zcW9Rc`2{mDGBLBTv2$>8ar5x<3kV8}h>1%`N=eJe$|)!*tE#E@PMAD>#?0Ase*8Sx z;x&bVfw9=r#WAGf*4sO${SG-uG+b;7=31)|wUH@EUm^7OzxT@ng~ZO2`qJ$G4mqb;eM+8}1=gbN}m;SHHepw5xwn)SbBar;$5$a76wyW}7#VHNPN|pa1+ytSz6sC#U@PvdZoSncsH5J)LBC za?{D0!WqqJU8^q@)?ME7ZrgcJ>6@!`jy+x!vo&Mc4z1<0|Igbp@#^W!dH&N&yMfAz zcKwtGD!H5$CbIczFi7N6`%k$zI}?p}51(@H1o7|NOYhzAeUZq~>Ys=1g>lvgYOkx% z-|lr|NmlWKM_u2GCa-$z*q5pS6zpfWoblFS4N&k?!Zz)~7+0g9n2&aGosW&2rXS!H k3ExvbU62V9Y7BFx`@hvX+$?oT+YTh+>FVdQ&MBb@0MqRzy8r+H literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/progressbar_indeterminate_holo2.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/progressbar_indeterminate_holo2.png new file mode 100644 index 0000000000000000000000000000000000000000..904386dbe1bff7d9f75ed59d15303131a6885ec3 GIT binary patch literal 761 zcmeAS@N?(olHy`uVBq!ia0y~yVA%s?D{wFaN&Qz7m4Vcv0G|+7AZ@($>0m}O30w97 zU1?ep=5M>(dVIyt7GEx#!~wJ#1{%6n-YlNg;~j8MeA!kT-zVoqt%H8mCG@`c zerdJ4;P_2-<@jp7w}xv|^OR1P`W0=~R^m`zTAI^(O^eIf|6N`0l;bHe_vR_@o$zhO zwNGXfpRxsAt9z0b?y~ywYyLbP$uHG&r>&}9r|n$o;nw$Uj}_3Qr$Cc<_dibyzvX*T zwnu$)wRhU&j|*nMI52si7vISpdu;VDY&pJV+MZ6G>(kSBZr=Uz>(q+K{B4=P(p+cd znZLfeMYuKb$~*bVg^AUx;=<>?>;l>>WIpj}-|go+Gk@)hwC7H~yGPu8;yXUxPg|FV z+?g$Huy$(3qmS$Flqar<=9wL(zTLRF=IznK;vEJFQQ8-e)XexZ@3&%4>FL1i@87Ep zPF#;$d{Ii5cg8g@laD4@?}~R;7Jg>BeCljBdtsb(W#ppH|JAuqnr-FZ9NZ%IsoB)r_yCr_U-bM~AcKb_qQ-!U*SS$n!ThE&{odnY@8wt+-jBAc2F52KTUuk(w>)JT8N z(^3Ea`%A}NnDD97Yr(NswY7(*uDRa-LR;{r8PIw-*tb*O%0gRG*nneZ&i=a8V>ACJ zJDrJgnz2mE$oK1;42P>ZbF;SnyV|2^Y<6-+PP^rMwaaH#9OF6ub?KK_caE>_idTvS zTEz7@Zq15~p7FM-u0Z!{QYl={no#$^0wN(KAB znbwINH%z4}@2GvQ+*F$bRG7E|tZ@JKk0-Qm&%O1q?-}dAgD1j%KRcSP{3AytTGw9s z=RvtY3I5xn{w16bU?|mR)Pgg&ebxsLQ083Y& Ang9R* literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/progressbar_indeterminate_holo4.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/progressbar_indeterminate_holo4.png new file mode 100644 index 0000000000000000000000000000000000000000..b9dbc45bfa149533745d514a88af1460cf38f22a GIT binary patch literal 856 zcmeAS@N?(olHy`uVBq!ia0y~yVA%s?D{wFaN&Qz7m4VdK0G|+7AZ@($>0n0x|NsB1 zqV@>rP}7nizhDMNCT12^Hg*n9E^Z!PK7Ii~VG%KL2}vnw8Cf}b1w~~QRW)@TV^b^Z z-U$;YPoFV!_M9I-tpzu%W?*2_^>lFzskrs_PPYGI2Z^?anmorFo%jQ?Geh5$*>1fR z`tN`IZ6%kG55lL9b$*MsvW??>4ssPY#IIutSqWRjYK0DU~4lJ&hU;Xz`+U1dX z`yBf=-KB{=emsk#u6j;BxW;J4dP#$l^K7=4vobp(FWCiG>d0IVcNEyi$@Fx0-;~9| zny*7^O(bKyrIs(bRJ58$V%_ssQ47JwrIZgkm$&S(VrF|Ax$BG1>bstI>O5}+YtB>4oaK`|QOA7x&#%@$pQg=pIW_H4 zSm4%GQ`MXwL`)ODB59Cv{!$oFN4&~QbMIThnRVNC?zl1M?9spfK9tz}t1Py$ll}I+ zd*%CG|4IVazgm3qLxE}Vyya=({Gn_-*NSV`UNBx;rgHPkY}L0br`&tX-{0Tj`Sw?-X8JGv`D&+CjhO558c|KrwV#}l%_C*n z3d@2MUd(G=uqVu6wQO1B6?;$PsmGrG^e+9O)a7@3(=LnKVp6+f{f|99`D@#O3%2cv zm1`TqtpCIv|F3a!n^bdjoA{5J7gt?7+0I_);}tI^2#jp l&n~{2Ki>r&#X!cNoO(tsfkN{}E31VdaZgu2mvv4FO#p44jBfw{ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/progressbar_indeterminate_holo5.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/progressbar_indeterminate_holo5.png new file mode 100644 index 0000000000000000000000000000000000000000..e7152fc5c954024ba86b7b025725117187b939a9 GIT binary patch literal 827 zcmeAS@N?(olHy`uVBq!ia0y~yVA%s?D{wFaN&Qz7m4VcR0G|+7AZ@($>EJ;ujdL?W zPAm!X3ua(s=T(!L!@$DB&BnpSG+SDdUtCo}PEdqdfmM0>%*mVr6NJ@ejVH>hSX=Sw zm|iux4D=S0wx^3@NX4zUck=UB8HgPJ$ho^bS93*&#wPn6D~o4;|Mc(vT^1j|cg*6- zJ5{#cKmYjHmp?)NEVu750V>ZN+}g@$L!n%he@En2-ML;G+*rTUY%iPQe>?yPaTzK=;-dhKE3EoK{er%1_a zswU4>n|d=y^|(xE=I&Dl4)@-ADdqETeskaViSRqA?x!_YKTEHrSjFr0gt{(VGjU_z zBF8X z`64(~LMdNV5~O_Q_p5hZeg$6q_ob?~vP!PMe!iicz5U)je)p5IA8%jTQ#vc;+rNz_ zp{dj4-^Zr@cwad`OsKMY+R`)CrM2c0>qNGmUA@o2?sDkT^vc@evd-h z&Ki}9*-z)cey;mh!$U7O?xvZk+TFCTXMdi$p19-O{w$uU+pnGVYT6$8?$eg%dp5sa zxNApc?yMQtelFW*Isf<3hZ}CxUz5;!Z;%rvwCC)n_jPxR@6EPZT6uBLk3$oe&OY0H z+)Ylp@`|Fjxx92`;(6}sIHSo+C+oktsdX@n^WQynZ}sh78$74_uF6@X;;nAJvdE_6 zv7=0;qPKcKd!fPX=9@BVYTn}fX~n91;g1S>xg)JARr#h17D+0KznHkRd%7SKEQW#f ak7v@GoJ9BElIc1F67_WTb6Mw<&;$V9yMMm` literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/progressbar_indeterminate_holo6.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/progressbar_indeterminate_holo6.png new file mode 100644 index 0000000000000000000000000000000000000000..51e466ce61c8c6313c93e8000f5ae13cd5c383d6 GIT binary patch literal 945 zcmeAS@N?(olHy`uVBq!ia0y~yVA%s?D{wFaN&Qz7m4VdZ0G|+7AZ@($>Ci?0|NpnX z_9heP4f~QHzhDMNCT12^Hg*n9E^Z!PK7Ii~Az=|wF>wh=DQOv5Ie7&|C1n*=HFaY% zE9=ncn92zgCrzF*ZTgIvvu4k^bmi*ZZ*|-Z3`}vJE{-7;x8B}~&Yx`{ajcN(SwfD& zay`W@o|jv;WtV4MTl;ns^ZozPTX|HL#2$2=SnzLuwfCO>Guo0l(Lk5LfqL4NsP2i+ zey&g1W8HnC+M{4a|IHquL!bX#v+?J+Ew^{$+pHxgXU&?sD(!jv*%$hSvybrlZg{D_ z_}ASc+x5ZXn{@0srd|uwj#_Q-p;cn9;3B!qb<3U|&{f{nDjj0Fxc|uNNViAF)K-*6 zd=pL&*&Ds7=A2&aiCJf+XO`Uynx^+$Sd`}~`){r~ap>tUB)LGx>EYU=goZ>|;pv}V!fuTI`8 z#a};axud7NbkWn?#(zTmhl{2ie8W+3r;3({5t6Di$YFmF3_3OgR5MO-SYmd-XQ2 z4WUi)e}Up_g>r&YCu>FPcos~U9bzeWK&W;frI(N;U?D0k+Wm(02& z51qt?WFAemh;ciS+7h$Wy@`2uj{rPDFfcs$vWMx^X0F-kUl*JK346NwxvX|NqZE zux1C)O?o9ke!&ckOw25-Z0sDIT--doeEb4}!Xn}llF~A=a`FnwDynMgI>x3}))OX9 zo<4K-oZ#y484L`J|2~)y%Xzy$Ux-S$Bm`y-^%DSrz{W-WIS5?zhC{3t6|&( zFQej1|KC?-&Qfomyk!e7&_+10G5*mUpZufG;vajdhMoTRO4f8QRnK4So{K^x`1%fA z=zFL<+r8wRvQq!N;^lltpFO?j|K_^mEYVvtE=@Gtbs}gfo4eOdLz|S(Cz3?vHis8J ztCidP+)tM4?CHJpZ>(>=m|`{izV+<$%O+1e7b3FK=eFS6&I_CClaJ5+UioFNb*YBAzV-U6{dGlq zf3w`>optNU&Xu$I)Msa|EVaB_^1}N2q6K_MpMQO0vVPgVm6cn&yzopr09Gt0n0x|NsB1 zqV@>rP}7nizhDMNCT12^Hg*n9E^Z!PK7Ii~VG%KL2}vnw8Cf}b1tnz_RW)@TV^b^Z z-U$;YPoFV!_M9I-nKETxGcYjz^K@|xskrs_PPYFc1BteWvb&P4%^Vz36#R}Tzqs=E z|Ndo6C+#@S97$dCaG#yN@AoHXXK%^O2HFe>SO70VVU z#e3~j*15c;YiV|tA9$o*H=HU5dT$oL;9`T(S1|m@_rd{r2K!@3U+Qz zvE5UjG|^g>^YPbLt1n&=Y8BwPfGx98dD>x*QyDvSE|k1W^eD}maQ<$5+NZ$c&!^Nj zPWh;!U2w#CmP_CyJCO{l@}(>Mct1rhEBxwXmz@{aJ^#M{CD%q}x#f5LmRr|?32ESqAFN<;XFNA=p1Z2W zl2eMIe2Gq{oma*1KdKVA9>3t}R|UPaV#C?p$J71Kci*(>JUrRL<|mWx{38zyo#d3C mY_xsxT|yBaZ43+tDt|J4DXdqncb?}D683cUb6Mw<&;$V4r+bS4 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/rate_star_big_half_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/rate_star_big_half_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..85068130f144c72627641a0ba07cee89756a152a GIT binary patch literal 2358 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 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/rate_star_big_half_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/rate_star_big_half_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..185326eb4264f5b4115bef5e18d88250be3aced9 GIT binary patch literal 2526 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 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/rate_star_big_off_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/rate_star_big_off_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..f88123c27b6f81c3091b43de55e3405d776c9837 GIT binary patch literal 1783 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 Z{R^Bw=yN`6Wpn@l002ovPDHLkV1hDPE&Kog literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/rate_star_big_on_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/rate_star_big_on_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..14e5ffa3e752e25251cabceeddb4e547b7116a01 GIT binary patch literal 2412 zcmV-y36u7TP)h8OPZZ7WRO}<&bLufn8W&SulXHYP8-H?=vdaf=UTSQ9Mv?gLolVhz7h+R5Y4+ zkZ7VNwHdXoF~(F)ZK91PHa!xPCT)_M)b#&2&t@0~$XWyY3H#3cW?(q>`~KhaKIi*6 zIhJENmSZ_q_gDcS87Q0_>)vt&(?Jf1b#g2xF-UY0i&u!GvLbw)3e=!mFAYd@_6}U5 z={@LKe7yoBvRK`A#eqDp(P=vkWk)VL`|8)SwYYazLF8b%NFptYSbym4xEHT~?Kx=T z77_`Vx~nMRV6n%~9GB8W5i1+1Ys@|oj*Bq5q(Ieg<=pNW}!NHh@NT|@~1 z+3v~1H^nwyzD+{3#87tlB7Ub3Oa+pzE{F^au{zk6TZdqW`>8sv-!tTQfL~V^#RH_f zhD4Q_HlO~WH9>d_-3iPnX+jP|Tc~eW&u~p3moiw(p%3nm0Bu43#>FpWE%_gy?#jjA zI8YE)()j!MrjPEnCraE4?|ywe>wZ1F1ftGJlZ-jJKp-ZZ9y1_7LxPauSrBO z9EiG_AR>?eR#0wYIr!&qepD3BS!C`#R*@e9s;<~bnnX7kUb^p`ErJkn2j2Ua*O=K2 z_}gV5s;i0O3$iK9T8ls1_~`r4<+Z28&Mw7ND*?H^&0P)@Knc_wPCeN-^aNoboG}0k z=-q-uFbGTm1p(XZ9c=fiH&fP7?`oDN$lcU%uYAI z4f0x$%Pa=-!CWwlAJAAZfFGnkkhT{xhk+&NnHESjo~xXFgVreYhV`ytu^W`8#444! zZ?z_I@J4O_F?HVK(s%hx$kyCxyZGFRlCQ?kpg}>1a z+A2m%-xBrQsrSQH?m8R1c>WS~>^>Z7u^?fIleK4j5Y(zUIJrT+FrTZNK|4cK17+H&TG zvHI0_gCMF@?NP!OHWs+GCyJE4{CrqSNl@mRmmvf@#)luv;hWzYE00~)Bn+%!D;W>m zZOMVeEKH`vRk_l4%KW`CyWal0^=Utpa7!Y5_5L@ph02^nBJw$7*!kMLBtQ>R(f26y z95`Wf)W+A}v-*UGjJrq!J|jQGwbWvch;9#(Urd9t`EG{z3d4q`cOEujVs~Bqhws#^ zy$BxEpIOKeNA{rkiaRGxOBH(Kdi{d(S2zK?EA;I`?TH>kpV)@}4GA(Eg#VOHD>)}( z*)*r|oeV#N5Gzzc5F!5)R@`uw!Z1geX~3%^ib^Sm>@@N-?ny&8Myxw{!CKr20tAED z#!I*LS>>ns+>bzwV(xM9GyBoJ0_(D zggDnRqncjPGiB)ksy#X*M=@=|T*%YAl#4w#A)YxIDOGDrdKK+F(^-idwMRV%Pu@z- zU5KMq5AZAM*pmb7EK#VeK=Jn~9qpjehtSTl7(kBKcQ%+`#B}h11 zI&1;63lDL3zPFHGOUcsq8&zv=#Etxjb(r^E`CPxS@;D9IILDXK)Snk5hh;AdXmwB$9mp*#(E_skQe+qc)wo<~?RkgG8x$nv2H)K-KI< zWFQpGpfLnxtolWj$EiKgZgyLL?v^6xp2%~7MhMmMC>dIRG*fBQI^aO*0FENqxSnS& z(?Li((L%+7EyR{8)QwE3Cx=S;Pn$TB?Q(7d%rQ8iQ7KH1(a1U*>RW5|@P^cKbs zVjuz`vV5vvRCSzk7j}ZPK-mA0OQ_juvc=AdBF};2H@VeBeyiyvCaPG~mH{=Ka;JkNYh>ww4xc|52bN;Yvf6um`YvO| z(M#08<}jaNFHv+LQ>OJURmJqF=0h;qV1#uV*9l3Z38az`H2hLUCtG{A!|a;0VUHK$ z{+IIGToJ&flcxz<&>v*5Ae_Y6uOFMjW^4os0gPJuf|>TT6bVqWWrzecQBXSGgm)~* eaxBLZ`1&6s;?`~wEYVK@0000-i{(cKOTGf1?RW#y#&zsDeoL)haBwB?N zu;zL%PCWpIiF{@1rJ;n>XBk$L$>cAr8J~pq>lt7v>{STyoCp`A+XtiM2ZL1)27|n+ zsy@7T1a5BR!tHPitb)~WC)@`c*d0F(+u<2FnU>Y@0~a%e-g8m?Gy>Rcwz4RS0laq> zo@1Zwg^jR*U2847_N~wfH!cj&1Mk4Ma0U!uW-Kto468(UoB8t06PEdEEr7{n(m0Nz zRq)c!zz|~rGh<-aJ_+x`x`hE&!a=Zsx2zH$SEx?9(lX~r$(PU0mO?+pOX2>Q82M3Wcd^wd!Xx;{qIo z+y8j9y5JQsO9;@1#dh0LVlVD=n~7H*Gx6%9u*JY@8_&(@)WQHjD?uz4i^?c8)X2z) z6bgmnilX>fb>3zbZ~L=eSO&YGAIHpN|4o{H`9fNF5O>QKWflck#Aq~<(a}*c9*;+` z_!zD^2roisy<@fnw!(3Z=q^sEP97S|X11B;m8%Uvd&2E@7jn5=P}4Lo+xH!C6I}JQ zTLXu|ny+a7Q;}knZb!WUwESquxl*Y#f$xsMF}N4n8yPw)*|8cB6*Bg!E0f<;CxFxG z6l7T*XD47k+}70d0^5?KMAuzM{JAvk{=W-AOV5VVm(Y1Fre8N4r`xd4nHK78f!%H| z6^lhWlupCiYc~5mnF_bVnyl0of7r-t&!11oXNDb;*=$y80qE~M&(GjHj;8-Nu=2m4 z5ZyzYuvY%3&L`!sriH|>#cH4^mL|gCaEy*)dh}=rIu+SAyaCIb3D60j(DJ|L$z~rh z^6Ei%CO4XrrmL6}Y`hK-LR|TLKIr%R({uni91gKuE?>fXr(kt60q%w$qoOjg->v9Kl`$k;CQYQWOqFPd!c8+ z=epoo=%dvT1YwHKf7S>4py3959h|aC#&FjT_VBrtO|(T5lr`)JFpMBx{Pe)bu(Xi? z%h-ZW_#Sq{Drl<{dIju)Z@>ZHK~JL%co^PX?>Zp8>z=A~-Si(3(W2{Qm zOe?Vr7A#gnrRK@)uWu_We}iF|m+(Ian1$MW`K(A{%RJQg(Si1k;rRG?QiT$TScnAf zf^vCAcH0`q2jiVC-$ZV1?yEc=k8DQmzug!3U|@uy^{QuWgX=salTP1IpsK3sEtyQ# zfMXjW6y_ZaEv*E?K>=}~qBBkeEhIxpSnRU>D_VxWGTCMgdj_m+F zJy!!uK}GMSr1zGB2w0d24jzW5p$y9D&fZ1sruOgz!n!4!OS)I}Uifu7fx*GSKTw5p zVzJnUbF4Gx)9a~nnqUb$0?{xNB6tugp^h(=H-x9IZHY9RPbnYDvqwK(>bx_5XHU%5 zir(cl_IHvTACISc#-^qd@caFN{{H^oZ8qDx#l^*^3knK)^78UtGnq^sMx*gmdU|@R zLZN7+J);_O|EYV5!3eupNq9p{;qE@2{k^ed%ryD*@I-R|@FgO}{ms=>@3#TsuL%$y zkLTLJz`!NK<#J6Rsoxw9$B(6@r9Qb_-bkyn0l3*Vs{oR~!i0(UD%Tg-wI|*lNf{iy zMhB&?OW-;_pKr3Wvvahtu&|foxP7?iPRIZe%o!{sKoO7S*OH~U_rSn;QiYpM0F}7f z+S>Y+!C*Kc6bkFHpO;MpEmwswDy~UYQtu|qaiauC`K?y#*@T3IL$u^uU`eq3 zK@4e7#^)mUX>GEx-Iu2m!0#(&v)O?qsJfN zoZ;?EKX!Mb=CH+L@uD4nk4JBcBtg0&U551_grGwNPmre|@v!%k6xYaQ%~Ahn%IthQ z6Dq2w?eztLKv0*Nnc3Fd-25SFKph<&qiVJKAdYQ=a0oggVY?(T<;aTTXD_HLTHX|? zH3xYNOUkh=1Tw6wHV`oa1D1RdE>!-{1Mbk_NhFiS^cAs)=Ah84@Q7r$%aF?#;I zLqG?tf#)C{q&NA=mIO~hH9P}cup2N3Ob|WKSuhX@>tIu`--V!Z07*qoM6N<$f-S5wB>(^b literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/rate_star_small_off_holo_dark.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/rate_star_small_off_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..346daa31fd468dd4c32c5606ed61c778b60ac343 GIT binary patch literal 1018 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UOiAAEE)4(M`_JqL@;D1TB8!2v z2N=7Z%(epwmK8Xr18D^?ZvQoBE&~HIlc$Sgh{y50Q+)HKLq*!=8^?dU(P!KD_=xX| zmMJPNE3~@2R6`~>I7Dt>HVbi@8ny9>{Xr#Zhp8GH7Oc4u;<4fat5AnShU41K zt)J(l@_tSc-Lc1uak}}*c{~A+j$U{Xy=GGlQv;Xy%zLNq>Sy$YU$HT3;L$(wZd>?i zzDaYImiROrQaZowPT8u-dCMXaLVJ@L3oMogTfeMRGLcVPWFlU`@4v-?H^?GF<%D8H z#f&8t${Vuhab2<5KX2cOHnWaQp#>!`gbbHxFKn2$zQZbwg5M=I+q^48|kJnv*h8cDHp|O%#kS z)Y_oT^~a5wCFDfm%?0(bT&PX)n@DeVM%Q_54^Nq+$(d# zb~e*w{|TE8T|QGj>8?tHq&j=v{T_y@&az3Db$Y9kw%j(;wz^uxEIp}t=c|=%8LHnG z-0*cvGq!y@>-i4Xa+w29|6Ew*FYz(u^m?%usP3j z_QV(MI^CVx_M80t?|qJ|(%W%=^|M`^|`IKWV+j;IK-xJ7dna9p|Rsnfl;>6;tlslm2^LJDqDbeP?n0oMo(bB_zM* z*nj!|47|JwQMEOTwSd_|wZt`|BqgyV)hf9t6-Y4{85kPs8d&NYT80>!S{a*JnONu= zm|GbbFk0*hMbVI(pOTqYiCaTKD$7ft21$?&!TD(=<%vb942~)JNvR5+xryniL8*x; Vm4zo$ZGegxJYD@<);T3K0RY#`yXgP` literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/rate_star_small_off_holo_light.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/rate_star_small_off_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..4c2b62c3f76d7e5da8b92d32f7ff967eaaa99446 GIT binary patch literal 1032 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 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/scrollbar_handle_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/scrollbar_handle_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d7b274ae9cb5645df310dbf010e21cede75659a3 GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4f@t!V@Ar-gYPCdxUpvc2=xq&z0 z!q)`zaMvmi{g;`0|H`y4nAfqN=S@2EXHNwthq?we=NCLpu6Jy0PtIK;TWGe~JM^^q z8;i-D5}lg6q;L2h;rOV1FY4aTV(uo@KHJM&>%`XR7Vq5}2(*g9)78&qol`;+03;qY A!~g&Q literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/scrollbar_handle_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/scrollbar_handle_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..fbb202b8c39469b786cf1689eb070943931d852c GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fah@)YAr-gYPBr8@V8G#O>)AIc zoAZ&v-J+Ix-?rx0naS@tdLUZFi6Mhw56_3RNj`_pJl$3o5q2olg)cOBuia;J zt^@HmoYTs_{nFu3KI~tSS^4{%uII8F-)6=gj-C|xy4XSvXcL2{tDnm{r-UW|@^&`Z literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/scrubber_control_disabled_holo.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/scrubber_control_disabled_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..17f00e4af97a78d4241d9fc1827f1c43218f750d GIT binary patch literal 877 zcmV-z1CsoSP)toSvm|4IIv7`+&GrZX$^B)?>{FEjt=nVq-YXTX{@Yu2n;v!>iSosI)skOmo& zB^i?DJ*+NU=&or6j%UvKtsUe1zxN2-Xfn(q|+|QgEH{wWDA6UNsG^TEF;e{ z6Y-iC*or;~Kp2yNWmQ?WW2)mrphB^25K5-avMa31G0FMMU^Z%T#ROoMbvnA8Pk}K| zk6OJ?v_YM9r*t{*f(Z^*p(YyC;Oc1k39t-8%`8((s-Jy+3@m}r5SFOP>DPc)2ccoq zl@E-Ze&(V9&oJ85Hl)h=K~RaNIztJlaZp773cv@U;rO7SV#=#VufE~5snwMkfLtP4 zpHOQ~=I(AX>iY>Hpk^rnNP~G0CJAaz%LqUb+)ZEr8lWg^)z?a309w@U$Qb=YnLK;G zb^pos?#lYk+ckkW7UyKw6MHsb|DTd6>gm>t2dl3?Jo5KG9eIamT>*}dac)CglUWzF zr{e@518&M}`PDZ^8{WZ}uhZ|p_rMR*!?~`wCi6|8_Dq}rWI;`qpv~>whyMQQape4O z^lJN`KR$l>YDMyTAR8+HGG_qM-@SvgE*<^@bcgfxop)=p>ZA6dSi8TA9)K+HC3b-o zbb%B7T|oaJ*ws1+>YoOWHpJ97e|Yu{ocnvHCpc&1H0XlsDi%VbJBa=+*i^I-qINg# zQg}3}OJQnvF63s2nv1fw!*dA?z?`h@u;3bKCdm0FHQP^O_M@oe&*C-H13--hRlmi` zplNvDFDv^!#=XIeslUdkEvq^KsswyP2fk9j{t%CVhEZRDx$5g@cE~umr`vgI7}t;` z!XW5Qk)iWC^Mpo#uOUgwXWgy|X>uhn-KQxsU|l7Xas>q$uD=&mB}%gFNlwScrpo3( zg<_jAgVAOgi!3uIuhrF$4a49nnE8ji;egM~u#Dk&eO-SxX&zhwWpD#{;1;+o;IYSR zW!{^YpZlkOoET(4E`iLi@LY=b3|O;f&6+i9)|A^%(XO>fH{_|j00000NkvXXu0mjf Ddy%KT literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/scrubber_control_focused_holo.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/scrubber_control_focused_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..85c1bf27228384e7cc3517d39b8d229b3d0e5740 GIT binary patch literal 1381 zcmV-r1)BPaP)o1SPiXe2D_$rN+CKN(jlG}{yGZoiKWKh0p3YZDpD5EYrM z;m~a5!#3s5fLuGF45O4O+!Q0w^}9G1@2Bgr=UqWYWTI?A%IbK~>t^H~vBtd1NK>|6 z%Ia&zxQ{Uc=iCToi`nCWldj*-IXLTL17s;&J1OZSW~0!*bg!f zPl8;Bkfh8(;L~w`KUZSIPW66rt&)F!tNQ9f(R^pVXuL1THSWD8zd7gy!<5|*lzYF2 zQ%gd3>>ppRytq&>-d--(zFfLt-h|S(U)VPO0Dt28r=^m4^K!Yig6k{ttV6M2KXve_ z8XycF2PqwaPJjL5;-#|r$zsW@ocX4D@5DxB_t;uxcYO7h@b9(U!*BO5mdxsah+}YN^ya5f{=Apj#(VT9V}8pC0hviCMT8_)nf+@Bj) z?S=D2<0@R*K(A8y`bYq&gSzI$lJTBu`;`44b=jjb{SAOgmBuly=MdCZWz5s<8$#+l zhnTRuQ`>+i&8f&h*$1rYP$d8!0;g0OKf7hTfyn-y1ULMx#3br2-Y~z;>+o&RMzTPT=!j;^U2K9 zWr0)QVu;G`m>a13a>C)okV+sN~N<*+C%*K$vOgWJ~-JFcfU ztFJh@9M;_s8FOMoyj!_jsDn2}L%`?cws^V&lutjnE$)37 zaro0%%Ebmq>3tgO{EwqY>>o$H&*M!#ATjFZ0}|d5ng8h_DIaLtF}YL=kIAJTc1+GY zDCvTuvi%_5#G|rt(64Y*w&jPVqfIz09aT6i-L~WMp*oJsPlF7ZuH(3T=z-(%-akxu n|1#tK)09`d;uWuWMXUS+*+bK+2w|sT00000NkvXXu0mjfhMuMM literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/scrubber_control_normal_holo.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/scrubber_control_normal_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..b2b1cff81ab8a1bd2be71af75de579b0e6b0644c GIT binary patch literal 1526 zcmV2Rqi`*o2rowKT29;2$k+4(*P2{FDv7JO}$tEbQnux$6T@XPR5EdyCUXfet zuxOeXK{wq1+vaY50sR5=7ua3^n<7yJs^ELocch~sO+C(;vB!y}N3v$l`Of#A+nno5 zM?Z&t7dDG3KGGxvNYFxnG@0R58(#UTg8dW|5+Xv25ETsJWg#ZSNsP}7hG}7(5N-Hr zv+hgV&r%FS1O>GVXM}UYd7($>6W$j30sr^$-Fb#R!?*@*g=yPgPqo4-Ji-z@DZENC zX<ggd0Mqkf7s}!mO|;tO(!OWCd|) z<9*spFb$)Y8KJiEuy9;BCA={6w?lweT17GTu?YB#MoYk zgpY;Wrf7%ABMqiC#I$4dCE$2RiJYeRR-r?9Qy6FaU4@e_vC1^B(T5KD6oijXw)c?G zCUmh)ekR<3Q#IlaeMrG4`WDjNFR0=T;jAzsd?~EKks7lGU+B|of?;NY?vgjy=0=5i zv#r+&dHOU;9}OKfLGAF`kh@G^!4zL-<0TcxFMaJ>DAIl}WOtI$9#2DMdG`kkC~ zofBzN%Oth6?AZ)BSTKY)gjwCyzjv#6PsBbL z`lVI*obU#xl|12UO zOKCs7xK;eOSLoRU&;H{X-XRRaB8~&iAOnrm`oH!c;Y#e7&g!4sF5MrLl1&xL|0K7c z3BK?g@D5=R7I6?)b2AvD#t1Z9GoYEHrYUXJezSNFr8!V2|DD`|$jU%i#6eux(B%)c zougKtwf#rA1U;iG!Tz1nI;wPX8^Y{?IEV`y8Z%&q8l!4IppO1}gsi4c?>lsAXxFUv zwm=-jg$>x!lmS_4G@x0{fFQS~`hL?Ajj+BM#y^ITUtvGBjXgGBi+w$&htAyyU=i_@Ox+PVO-sPAb!3gmqv# zytLPJ*xC`E;G)474lRgmpi>i(zscwAiLxN_1kdmeVH{czxk+v80QX-K`_SPfu^*(g z*Oeu)bv$!;N$dl4N$f?7qJv5^@I2Hqs4j|DvMfH`K+EFO>auvH8zWa6WMd=;EtPJJ zsH4J!aH9dX#%@@)#%ynn&UrWk=BPp09JRkaKG6W%<56llGzTQs;Is9BM72j`PIF%^ z>#-v;X;%GaYSD5?YQZCiq(-cVq;wsVd)JG{^3vOdj}=;AC=A4;ZfPMs(7~! zORv+(Q)|+d&lMVUzmuq%?)$NnRDU7M2=|6`mk zW>^9VPCBL?zA|%_X>~B|Fn#gW!=+KgI+d+Oq3w~dRF-Fhxg*8b{jK=akvqs!Ar cKh3}Y0E-Zz*mR>>2><{907*qoM6N<$g4Yb{wEzGB literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/scrubber_control_pressed_holo.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/scrubber_control_pressed_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..d8f52734c4c6e9497c34758371112950f35bf9bc GIT binary patch literal 1986 zcmV;z2R-B6ayQ>WGE^U*$1QT5H^O4h@cEF;}T#Uup!D9 z5(qHNCd|mqtZUhdmxS5f2nl1zWnC{@VUyt|z4(93^Wo(2wA7x{(jrZM*;#we`@a9@ zy*=-Ho_ECEPZB;;f9NKRU^I9TWPnG&1cI+0=HKq)d+!M0Bf;Y!8x(@=;4nA^egl^X zzIK4`Ksi_fviaGO=_J?y#)2ooQcwe&;2H>laEyfb87HXWv?g)dhEx?l8q5S=gY)1I zAv#_{oK_d7J(KcEr5Yc@&2>NUMiCtVe}e0vpKI7p@bv)yHUt7ujNt_bKn~|^xLxA! zfn~r9Ofh1nXZYDYppDZEs^rxP-Us87A^aXN5tIQp2n())U$|zLgGIok zkpfO@8>f9$C0`F4Ya*2~k>aQFG&U>>a09e*cPIj;1X09!v{Ig;48x!fWU>)-7ylHn z3h^P}=YG3_Ys-{i3OKK7&O0QGU+y~;q;!8P&$FeMYt(*oL624JghErI*h zAyM-I_TJWtT2D4+P|9TqsC0*kdW`mED&kLp)xeY@tmZOFBb3EGJMeVANot&XL zg$!WkGRcopq?rpkI1e%4Gouo0E0VaVih1CXliE2ty zcCdyp(?uGi8K4+kS3J-TO7tvL)=}4@T&w$&xi-({*KD3Dg05#<-K*(0oefaJ8o~r? zD~`5-Su2{%UcLJM^kc3iuiHK4`3`U6f=2J9H|*X4h`&j^iEDg!G2h{{ zI4$lKnrc-yT6qW7DF(lddK6^FiJp>on!JbRH+uVW>fM1Cj=RDT8GhzSH}TIkeMi5& z-RSMby)`eN=vl6l5jKj!&`DaQcp@8IQ`~q4EYm|g)q0-IGyFV6K7EAJR)>D0d(b6@ z@|(Q2mrnG2sDlBPv6e7%jkW&E?=Ms|l>o46_4lVAbuB?{9?pZHXOFqUnL@A{nSkyk zBT!4w+8tPfRpHl!SgTPwKb4At41s-Gt&cu$L9_QicU*{%!3fk6s5`(Ao3xgLwG1ip zs3Ofu13U!k#AsQmanM_w-{f;-*Smv}n|<`|FdJh6x{n>RgH{*3Qp|33q*-Zz4DhSs zhJLV4OQv%g+@+|&Zqy{D7Z)$$*#%ABOEhh2G{8F66ed_}hSC6!g0o@_F2c`3V{gutv-TXGyct029FPV(I&_mP}FTopWvOkfQm=)eYEJsM2VF zm12o}ku)m}@EABR46y3|WPtIYRm_#2Y3c%YPX)TbjdbY(8Q>=|2yW1l>8lOywQz4; zS_VP#4v|K}2EoKngAU&*Ez=;m#_$MFPD{`4|ZLi=-<|%jK{SlmU|-Mp)S7`+h#U1C0qZxY6uDf(g3j<#3Re%(Q@-q2F@& zOW;*o4od@!5*s2xuv^a!k$HCSR@AHmBl{Ihk=OHV?jQ)zHTwHyS~k-Hitg2MLu9vT z{r}Y|ty#1r}gVvlk;4;s5utHbX40#tw=X zqb+IpYRoBKkbX2El=TwR1Pxl&+GfiSsdy~E^WpkyYnssu{51Iuj;lq?5rLOfvunR-Wy zPKgjI+s9L62{0$A)=N0gK9x{en_8%>o-Ls+La=lTw}!$5iZ28f&TCLZu(alI`Srj9 z!U8||SrIN@pkuiFR!-X=AzXfaBE#jSA;xjxIwKrn7~sCS2b6*0I1Wq{gEGZ|iT((A zod;$uqrH|;+AQ`MU5diV0{TD)s8=~M^AYp8;>b)ju<|p$DCxR5tt?=?-G`=fc>(21 z!l9{NPy^u)a$x>3 z);Wg@WlvhhIWOH<%QZ>;XVWt+js_LKz?lY%FN*Wp8}K|oT)S@B8D9QWp6l&jA3vM= iFEM_?tb$vIH!&`Wo%=*Vmn9u&E`z75pUXO@geCxYy)O9x literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/scrubber_track_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/scrubber_track_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..c3bc32fa1de20bbaaa6eb03bb5470ae8c753c20c GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8g#!3HEZm#uLCQcj*Ojv*Dd-d;20V^H8>a+vol z`^SI&fZaPS0)>S=BJvY66gjnxwk!Que1N^@K%@L2mG;fK1;@B+8jBtOwM5HJ%k^7i W*VVvYc}ogt8iS{+pUXO@geCwht|wps literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/scrubber_track_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/scrubber_track_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..6585a04542efef21c1188e7e5e44d51756db7e94 GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8g#!3HEZm#uLCQqG<(jv*Dd-d;20Vld!ga`=D6 z{^x)B8gTe~DWM4f7Ahqi literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/spinner_16_inner_holo.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/spinner_16_inner_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..9ba14b2d50cd3a2fe79e56257a25271ea8ab01d9 GIT binary patch literal 729 zcmV;~0w(>5P)kdg0007@Nkln;y}wO44=vIraoHjPfrvOs$vox<=dWfq%pk3Zq8A;Az}Fv=x|4YwL_ zf3@47Vk-`!TLmK+zT}q$eBXr=h~kw#l5gQM1-o8{19}9+1DU$$idHRN5@GAJ?KaJa z;Y7G>y$3S-3?m4lPq+QC{sycl5?v^QDZl?6wtyNF1zH$(mkKmMI~C`l_=2~&66)E zRHJ_VA_Zv_Px7k(tP_>Auqr@GD0M{v6agYuZT~4`m3I-47L$l*H96=eQOOiNi#14C zL820rDypDS3EEe2rN6MuEMu-=D)1N*FL{qUh0^lDr`;l4!?whB9-D|h zFZ+;t5k0Iun!zLeTy`Ezsm0mPW-f5d-uITwo%;dq;30O>w_%Q*DXcTnCSk2S!oAFM zo^xDqX-C3^7;|kFcMZ0}$2NW1uP{_6U`^~{CmUH{o*9>;$4v~nkY(Mhjq}4Px8YtG z^(<<8xSKH-BxrO@aE^<%bTU`{kP9))kU5uP-g3ta^1q&6;e|LewbKct00000 LNkvXXu0mjf5~Nbq literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/spinner_16_outer_holo.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/spinner_16_outer_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..afd4bb921f578084848a4f69bdd090ff57609ec1 GIT binary patch literal 808 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UOiAAEE)4(M`_JqL@;D1TB8!2v z2N=7Z%(epwmK8Xr18D^?ZvQoBE>N3+r;B5V$MLII&S!_DiyZrSzB)f|PKuh8aL>lz z-K!ThO}fNYc5#Qc$R>@y=DS`j`|ol6?K1B0yB(*ST#v>taMN*(5iwOw>YOmC#Av2U zvA=lM8K39w+w4}KuDt)*_IWMe_Ye29zw#Y_y}96Ep!UCQizb$R_c;q)r& zbwAG*X|*#n`6!Be;y6K-c$G)L zIq-{oWXeW?^2c>LdtMvdHq8(5U6xpV;EZ>8Y|z)OEA<+dtV%kaW)#3X-PY{+2tUlni znc@Ava_hEzyIpiMPb1v$4$}&W?U`$ZFHE{3@|)?3Xk1na)3zK*bIUtzC(cNI-JPbM zaC}vuJkM*z9~Ug8#kN{8E*14P?mL>GeLU7A`=b2H%ST)edn^0Rc=x~O#N6+#q5Gri zrEjmDekeZ9;*Id;iQj$Xiw~M}h1=Aaud{9D=9?9~{bA?xS=Hg;DSbcg?3p#YZsR>+ z2E&Iv!d&ZhqQ9*V3Yt-PD)YE$Y^m+qw`YI+4_f=) zsMjYIkIQ_YxXMZI@|P>d=XaSG$sdsRc-YWYnCR?%y6o2b^WXNpw4bhfXxi@EU;2TG zNVUW@q9i4;B-JXpC>2OC7#SEE>Ka(;8d`=Jnpzo~S(#Yq8kk!d7%*Dw2}RM6o1c=I zR*73fK`P5jpaw~h4Z-w-i1W<>M5|`ecV}a$f>Of(c%-~@+ zf+WKP!RGn;jCX4dqt84iaqVn9AkdF+5aZlW$0~2Kz$KQ?*JeCMndW^w$OJvEA;&9R ze@lD1yb;xLJi#6{IIkS@sHpD!d+nVNBFJDE4aVz5tev`)3MEV zPQ4dmA5XKNc%%YcJ7Cx`-09+yZ z@HCPr;sWLp&7GgdWnA)~DKO0pvur$f?ZP&VZfmKSjw`K-zEZwhdp+Pc*Z3tD8Q};I zY~SAw?AMT)W|iw{1j>meeodcg4!<911H9?!sN&kxRH_;*$zC^?cMAlEm}~=7TKAgM z?{+$RwD+TU602v~7TjxL3+ z7NDGZ1o`qiELIJc2*wy~Nj)PX0P3iB26RFhKnUR$pzgGss#T#-1rS!aGoVMs0W{EP zRoKKDpu|>i11bzLC7^;z%TF0FTd}HjS!UjK6vMdN@8nikzWrerwJK*vEYcCMj|o@j z;;VK$aMcQCI&24n<35bLV=l^d=G$b-15N!b-?}w28x4m0$hjlzC)}JXwXHU`pgGZw z>R2um$la_v>Ef=)=~rrPfvDP~ii+7O9iHM|xO4kB&O@y7CoJvQQ)Zk-^`sJ7wu{O? zx?|RSOzYKYdqmWvzIb_amnM~q>4e4uQ3}ir(gBiOT|6<@>Eo# zI%!EY>+V`W`v;*!syPpx RcoF~r002ovPDHLkV1f?_yaE6K literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/spinner_20_outer_holo.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/spinner_20_outer_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..6f693d631535d4e515227dc08ca341f873ebfdd6 GIT binary patch literal 1007 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU0wmSG7d!(}OiAAEE)4(M`_JqL@;D1TB8!2v z2N=7Z%(epwmK8Xr18J~chQ$R_egL(7_jGX#@i_i=ns2^vxJcXl>hxpZ9^6p0Xj@_! z_~T9h3uB8w6R%S$bC&ss{0H(Eazi;C&F^k-NMaNUid1x1Gr{4JvSUrFLzD*Z!Hu&0 z>2YGA8|PnYez7jpe3YOZ>S)!hKWEzF1XvE#Uk#R=rFeK|w`D z!4JyGPb3oUe@m(!baf=>d{x2sU3v8GX@Z#x=$L7mU z7SCE(kuXgpK=BP{yI}uL&)(QKeT=6RyS+V3H`e&3G-v;Do~C>@&Rn!ArC`Oy*>|7L zcqrJW%d?G+L@?0$MdUtx4zaiwlf@JB6F=XXoP`cb<1e=G@J$cAq9R`3XnGxnR5FzIl;ea~?3f zp7D@>S@^RVGrkypGw6A0ANQe)i*e$^*R^{aJ--Dq%`2Lk{`T_SBU%z^`pHWKz4xT| zaWPKgVclkQPC+uu=80ADT)r^P$(wT0#1H@2u_HpsrY1&4r!=m(edW}x-b_uY4TWkN z1|HKy_!jxi{BHA5^66E*O-t@u_A?g!u#j+CrL!TSYR{2tkD?!Q-}<5wv!|-;9WXzr zmbgZgq$HN4S|t~y0x1R~14Bby14~^)%Me3TD`PV&6AN7fb1MS_MvFb6C>nC}Q!>*k zacd|@WqAqIAPKS|I6tkVJh3R1!7(L2DOJHUH!(dmC^a#qvhZZ84Nwt-r>mdKI;Vst E0C*myI{*Lx literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/spinner_48_inner_holo.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/spinner_48_inner_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..50e5463196c2dfb7c5266a9f6c69fe4ffbb74b4c GIT binary patch literal 2411 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 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/spinner_48_outer_holo.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/spinner_48_outer_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..14143c51c351a56446b86b18ffa534c4543ec4f1 GIT binary patch literal 2432 zcmZ{mS5(u962||5zy>53*w9%B3P=?aA_NH%FrjGZC`F`)4nioBUC=~8AW8|nWPuBU z$_Ax~QpE+Ngl3~F#l&Etsjw_Xv$*Hnhx>3JzWJRg->crS6J%m+QIvUZxhV?Jo-M#nxzF{J^|38LuZ7p2A{3`Uq`=6kIe>?XjoG zr?GU9y(f-uD6ci)?1uQVR4SRTa}|zrSmC&X%{3Uu#s!v3xTlSKYl2xXRH=XldiG8v z(NTpiD;+Y~m>M*QdTK>xZWq^1Gi8i~5S7o}q&SbO8eBpO0}glmjSVvH7iqi26bB%| ze)qmu=vH{`#f$>>(djQ0^Nd<2H1NqlRYSvb%bfxVSE-6hyvT5}iWKJBsJYUTMmHlb zv{AxVJ_-jqG)Isz@a^K$cM^+{e$!&jnX5OO8E8XRNKBd8M%eMRN2h}U8b(CNyXF_g zuNUp7s?z=QD$}|Yd9ZAQ6_1dXY%HHkm_JujD3E@{yoa-`U00;ZS$y^Kch)kpoM#-L z_hl0hcTHdzz3P<)L4tEt9m4YU94$VspFs>kyx$G43>YTSqKXzilVwxd7qomBM?e)0 zk70Hc`|MK3$79>mw09q37_K`7rCCb2Je8#;R&l3wIoUvgp*l01y`!k-Fb_5 zLjfJM*_>#E9is$M8{y8UF zc`)}6IgHUUW3OdBIJ8Hp{C;Gz79e0KH~zPbyGtCwB=d&F=mttg3`f7;P(54xp{|RR zuCSG=W?@N(vW>lt2EpQ^z#T{`#xM4!mdgzNHx)<1u}$v?^g+=6*9ecRo#a#lbymZ)6-p6z^Oni3 zsLEXV)_}Iwfa=*b4{k&Dd=wxu4wfdbo>!(imlp)*j4pv5ge6;)9owM4=9St^swSv{ zskok>E#MxCe6UUVusSMJNGR_6U4pG5H1hlHX%(t~>nKmo-|d0-{MbUO&bU~mKcE&# zK_zv4|CD1!H8jAfY`vSSl6kj5Wt9loIBf}POwl~4S?>?$T&{Mawq7O5qkqy#o-A4N zE|eq~B+4&zVcuWC$vrg@L14-|z}_N{7ai6X+LIyj5pcb|jwUl|0>Ek~Th%i#NI{1_ zBm3pUiwMhzLuXI=foW(FgEeV4z(3A`*yzwk~f+h&vY#xmxsf?5OY1hsd ztM%beiwI=D(k-wWDn9)VJJk!~4z@|bN-=_~*}T5DfK5!C3E@eSEsWaR*+?aH|7J32 zC+By&%_SPM+AS<3m|xNxz3pqO+_l<53yw$fu1oeLjY&kkfdiF=Q*Wdc`etyM*rdK( zp22kBzFv%4ur^fuXEGM-pX|Fkd%Nq2l6dRQ2XKwJF@_oc*%do|>Y6Qv~!9EN3 zF&dggK*AU2RyOj#FqbZdzB>B~aA?KNhqMjCP zxg%^}e6-VnyS`t)yIHRQ48~-EkCwOT+tHm-FNve|j%NMGANQwdwt$uv_8B$5dQ4qt zta;CYDP&5a>BeK^j6`R(AiCG7VaMyHMlZyJ5(>(;W*&VnHGV2AuFnNIz}wiAT7{P6 zzLG`Ao;5|df63pAJnK+9#KTd^>$h)+arJbu4vNUF`f^QCm+L^AP{SFHl{TDz|}ZV(SF{inp3522LyJ zSw}w{j~U+S-eU%!n4i!>i<1qPc*uvvdn0Equ&#u7KRLHmgc+YBp73B#_8nO(jI!6a zd|^=Eg{Z*a-EZraT;7p!4p4Bd9(wNu7coSR1qusz_AQ_YwQYlP_s|#mVMCws=x<_3 zw)$>kM#p7l7$^lrSc}QL@p{n?})PR^#Ne#?) zCgB#K1aGkR_pfe{pyO!Rvn|^H>G<#YXY-5pW!C!5cE@?0?1Se-EtcRG8{ivDI_Xa) z9RNV-BayoL#=1yj7vzbP28Jim7+rm%lluA~Oy{}(F+^Mn2nnS8e?t@r{NcbL_hWF!{4*;x%LlxuUCHn literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/spinner_76_inner_holo.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/spinner_76_inner_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..0187f21a4cc2d5d514e558606a34f75678cd9a07 GIT binary patch literal 3869 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 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/spinner_76_outer_holo.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/spinner_76_outer_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..7f6ff94bbb334baec9ac329301306f39d4d33595 GIT binary patch literal 3476 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 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/spinner_default_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/spinner_default_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..4bae93248a80b8fb25f8b60a5d0e769e2e8ac1ba GIT binary patch literal 298 zcmV+_0oDGAP)GM3<4;&OHcjAcd6+5NrfjAY`@UpHi!l7xNgnA6|dB#iU7-Qfdk= zeaw8>%yAsY)qe>%@Ur8>&+!rh2M!!KaNxj!0|yTLmm7wmkFBbK2eyrEW9N*o37*ko z>=E0P!~LZ%u~+OVz%8XSdJ^Ea(vtx9l@{Q>(gNI9T7dgXD{xzB6>ceQfa|3VaJ{qv zu9r5z_0k5oUfKuOOZ(w^X&r7TZGa1<1-QGk4)>SV;W~O>Qd)=W(B0Qgv0Lo^hh1a+ wT=3(9JH)!V;Ohm~#oC7BIF2j1YJYrx1JE<=Tu30sqyPW_07*qoM6N<$g5~gra{vGU literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/spinner_disabled_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/spinner_disabled_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d77884482cd24ac54cd4eb2050e699ac0635367b GIT binary patch literal 285 zcmV+&0pk9NP)@5sTj?yoeWeAsue1R7l@{Q>(hA>7_Fm8{m3r16(g{fa|3VaJ{qvu9x<~ z_0oR0URsA6N*mxpX#wsot;7ALb-0c`HkH=lI`r%2xO?34hr7j%Yr&@t?-Vzz1s^uP h#290&Y2E(#{suAUb2o*Chui=F002ovPDHLkV1f?FfNcN( literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/spinner_focused_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/spinner_focused_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..61cd6467fd6af2fc33e49c5a07f0727af66fb6ab GIT binary patch literal 496 zcmeAS@N?(olHy`uVBq!ia0vp^dO+;N!3HEX`k#m~FfeZSba4!+xb^myuQyYm$gx84 zueCBt8Pd7cix+e_{btHMZKiw6L?HKA;0#8^jujf_tXYp%`5a%W@3FS+-XEFEI}28x zc2JP{ct_g(hkomP{&Q~rN?nVNaIDu5d;0piO|YDwqh|(xkz)Mjm`raj?Fsb{#7cN7 zXEk26$=niB!S;z)bMc|MH`Gr%_NhHhy3gX?`rFG=gEcoJ$ZJN(>mxdk zeK}J;Pt1buvvm*6Uff%A?cTO6ZL7WKoBqBRyE|Bu_3or^1*Msd`|``>I39E?Rh`Aq z7f&>n0jibji_^j^W?MbXMVNKY;#wn zJ$661jnVyJ*&mIHs7K!y?rD3mXG`QEtux2u_SG|goR!G5F1x!K7?TX1u6{1-oD!M< Dk^bMF literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/spinner_focused_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/spinner_focused_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..42ca63b10a2ebb33d2d329ec56fd1d083a720633 GIT binary patch literal 480 zcmeAS@N?(olHy`uVBq!ia0vp^dO+;N!3HEX`k#m~FfcCnba4!+xb^ndMlWVZfny)F zztk4J3D%e~LAWQ-Qk2#4gHl#vvZ@4!*uB^m?j;)p43iYS7VYib8x`Gge&f4Ci(WSg z%$PBAD(9cm2lVB4s?BuplH~a~$#2H`{LL@weO7p_(hXhrNDbLpnK4@5KTD9s|0|UEG?gfs5AD3|92%y{# zI4;jDv8c(c0b&aqh69e?j}PBndhuby(n28SJnWwr{$}aRL!1A7>c93aN~!C-Yw63R zCs(iSzII;Np`xh5U|U)A??vCGdfDoJ+E{O^(w|uO;phGuuY&pKzyGnHkyBB!=vG00 z(`-2zR`a`yA9yz358KMQ==L$Otkq`K)j$4mF1cN{OR~~l85na6p00i_>zopr0P@b} Ad;kCd literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/spinner_pressed_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/spinner_pressed_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..4a598c9eb0a90ba5ddd2b4b0b866ca6ff509ed30 GIT binary patch literal 451 zcmeAS@N?(olHy`uVBq!ia0vp^dO+;N!3-qj14UGTR7HSKh^z6|rwfi=2J&+E-LcyC z#CiK8ubmI)AH6*N$dyTlubOOq+H&wl`=RSVWpL!Z^P%JR$8at#hV`~5U5Bn$9k`Xg z_pa~Ghh|%!)*QGw@$j{2hpz&yGkL^U4W!gdg8YJKUSrrgXTjpD=g-VMbi|Nh#>B<* zbEmMf801fGE68h~b8OGXCA0RPKBshWb`ns_WltB!kczms*G}^_8A!BT{M5Z5gK_8M zzvq7MUl=>%%p%3P?=Bd;o}6#1HT6B4aiLD=r7fxJJHDpg?hx90USw;|dR}|2D)+<1 z^Pab9_xtwn+n-6bs`*iG_j#r`KmR^4sSxrBH9*M&(Xr5CnV-22NfdP8(|)!yx(C}Qw*^>bP0 Hl+XkK_toB) literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/spinner_pressed_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/spinner_pressed_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..998c2dfe4820d70575a0fed32aef26e28eab1cbc GIT binary patch literal 446 zcmV;v0YUzWP)YU6vy!n`aTWkWpq~jT0kd@_PFfeD dSQ&YF7!nFpd&5$i4S@O>JYD@<);T3K0RUl-AbkJ; literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/switch_bg_disabled_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/switch_bg_disabled_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..c5d11014a7ea34dfdfdc5ac579329f4b7d367312 GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^T0m^Y#0(^NS1ShtDb4_&5LX~QbLLDSxirL;1xPWK z1o;Is_}2aVAPVH^c)B=-Xq-<@U}$7x`_z!3!D6AYV3VuDr5@!ucMYWY1kBczIB8vo dVrAszVMr)Y?F~z5HUR2l@O1TaS?83{1OUCwA$I@( literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/switch_bg_focused_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/switch_bg_focused_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..17e161a03572bd553e680f0d3af97165442110d5 GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^T0m^Y#0(^NS1ShtDV_kI5LX~=3FVdQ&MBb@09_s_?*IS* literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/switch_bg_focused_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/switch_bg_focused_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..7cf1895a6f096be2c46a5be85fc0e88c28d458df GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^T0m^Y!VDx$tgn3rQv3lvA+9rL&IB@zw>||TAfsc= zl`lYwr6kBN*q31@Lsi~&O(5UF)5S5w;&ifsNDHI8h4&0c4^Cl?M?#?@F6>S_Tv;Uo z7#B}Cwcpj)LML4>UA*80JjSt1sn9x(YOl!PC{xWt~$( F698jqEp-3@ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/switch_bg_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/switch_bg_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..652b1eecf934faf578f0650ee938f3e5835908f7 GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^T0m^Y#0(^NS1ShtDb4_&5LX~=Y-|i9StoJc0#ZyR zL4LsuGygk0y8+~>db&7WQ W?7ryiuyhkp1B0ilpUXO@geCyUogj+< literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/switch_bg_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/switch_bg_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..f274c8a0090082787cf726e575d30ce3d1cb3324 GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^T0m^Y#0(^NS1ShtDb4_&5LX~QbLLDSxirL;1xPWK z1o;Is_}2aVAPVHEdb&7WQ W?7ryiuyhkp1B0ilpUXO@geCy&Xdt}+ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/switch_thumb_activated_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/switch_thumb_activated_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..949d854afb1a8b5011d107151860931e0f1940bf GIT binary patch literal 484 zcmeAS@N?(olHy`uVBq!ia0vp^SwL*X!3-qx3vECGO9OmDT!A#h%rhWz>T!npl@6P4 zGE6_oHv23{#4kPh-~-!@H~#H|YIaYyx&o3|xY)fCqFmqnx(rtZu+OO+_Q||6mUin<_EoH(Uy-47mt^?6c#T;Bs@{xhz6{6b)n zhS-gzyIG!0D{H9r@lDiah;%hxR%|v`Lv+LYgS9PjYQ;7$EJV0%fqr1{boFyt=akR{ E0DGOi=Kufz literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/switch_thumb_activated_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/switch_thumb_activated_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..949d854afb1a8b5011d107151860931e0f1940bf GIT binary patch literal 484 zcmeAS@N?(olHy`uVBq!ia0vp^SwL*X!3-qx3vECGO9OmDT!A#h%rhWz>T!npl@6P4 zGE6_oHv23{#4kPh-~-!@H~#H|YIaYyx&o3|xY)fCqFmqnx(rtZu+OO+_Q||6mUin<_EoH(Uy-47mt^?6c#T;Bs@{xhz6{6b)n zhS-gzyIG!0D{H9r@lDiah;%hxR%|v`Lv+LYgS9PjYQ;7$EJV0%fqr1{boFyt=akR{ E0DGOi=Kufz literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/switch_thumb_disabled_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/switch_thumb_disabled_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d443572074deadc7c0abfee34287b7f2c1fd80e4 GIT binary patch literal 487 zcmeAS@N?(olHy`uVBq!ia0vp^SwL*X!3-qx3vECGD*}8%T!Hk=nKOaplqpkMTU)cU zvuDhh0pxacblBS3hK7a~78XvJFya6I{|go@0E#bMxDcqmtE&r0nwgmaMSzT1vt|Jm zPnV`C$eGWUb$rvi=G?&;zfQgQ3; zjpKYx3?eRpOEj7qF3oQ3+k5)||C!R)pG}-D;q&aBdb)j+;+HkQuau{Ayr_Rw$Hv>a z>H4!d6LxOfdF9&+c5bJ}`Wwb8i+7bAYnhW;^(gR>Yp(l}sIQ8jRy_A!6gX*(fu<`P zE0>5yzygOxCJ2Mg;qL4XH`lYho|)H;<_n%WJ@?q+M=8NCwVkTAdM1gfR?L+4<7~}) xR%pL$*9NtgHH+jf6}SCUZ!Wk$`8U^I#;N-p`I{z0Uvu literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/switch_thumb_disabled_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/switch_thumb_disabled_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d443572074deadc7c0abfee34287b7f2c1fd80e4 GIT binary patch literal 487 zcmeAS@N?(olHy`uVBq!ia0vp^SwL*X!3-qx3vECGD*}8%T!Hk=nKOaplqpkMTU)cU zvuDhh0pxacblBS3hK7a~78XvJFya6I{|go@0E#bMxDcqmtE&r0nwgmaMSzT1vt|Jm zPnV`C$eGWUb$rvi=G?&;zfQgQ3; zjpKYx3?eRpOEj7qF3oQ3+k5)||C!R)pG}-D;q&aBdb)j+;+HkQuau{Ayr_Rw$Hv>a z>H4!d6LxOfdF9&+c5bJ}`Wwb8i+7bAYnhW;^(gR>Yp(l}sIQ8jRy_A!6gX*(fu<`P zE0>5yzygOxCJ2Mg;qL4XH`lYho|)H;<_n%WJ@?q+M=8NCwVkTAdM1gfR?L+4<7~}) xR%pL$*9NtgHH+jf6}SCUZ!Wk$`8U^I#;N-p`I{z0Uvu literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/switch_thumb_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/switch_thumb_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..f31d0e8e70fbe5aaf8477c59699911232e61bae0 GIT binary patch literal 550 zcmeAS@N?(olHy`uVBq!ia0vp^SwL*X!3-qx3vECG#{zspT!Hk=nKOZ8Vq)Tq88f=O zyXEBMfZW@+Z}<22&zm>T+uQrZi4*_-|G#zXR##WosZ*yWOqj51*RGQ%PrAFi`}p|O z*49p*Jeil5cg~zSK$Vv-Uj}MVPEKC5Xc3UHZr!@h&d&Ms=j-e1cXV_BMIfN4s34oi@2BLpq~ZmBk>3wH^QkGGLgj&80zhjx~(LADO3eERh@6ORE6JLl=*7*cWT?Ty<)jSM2K z4<}7faj^;v(wh4D=bhjCr$}GFm3CgD_wW7nKi`Qf8_G}H`>RCVFr@I*KDNI?R}E*I zI{0pGUiz(jT9QeT@sw+S+LpY_PJeN&xVZgXS^HwI_QmI#F6mzv>XZ7wFD7R15Oik+ z&*W3eeHx28l)4baiu%Rp?(uk3Mr1AhmKYKrtF$s$WapJ`P|Nn2@y4BUyb?Vfq{{H@5yLO#CdD7k8-N(nL zwzhWioO7EPx%4omh%HOx1wpQgaz0WJRSXCk+siX0@NcZ82e-92GlKL`H z#9Zg_l1~$qyEGPcC?SYf_g8E-XAY8^7L{o$arN>vk5?kCMXzT>d-E;k?fZ1O@RH!} zot<-2=KRv=;{1{s!zkkamEpJHP2uHSCuZK*|7A|#QBS5j-yhs_@^73Lbn%w=%!i=h N_jL7hS?83{1OW8Q>7M`q literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/switch_thumb_pressed_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/switch_thumb_pressed_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..77b5a3e55808f056c32ccb8074c1786c57a583f6 GIT binary patch literal 479 zcmeAS@N?(olHy`uVBq!ia0vp^SwL*X!3-qx3vECGivoN?T!FOl)~7(yaKnA=>HC{5 zy_bq9G2i~oXw$>A6R(qxzxG&h=Kufy2FtHx@4iuU_O;cHXF$a~+U8j&UISHXP2Fp{ z?P=r1_dr3ljy0N-cDn9)t~qgs_RK@Zn;!!Om22jT2ZOBk*bTBpd-^`p&5x1}JyR;5 zZn6A=!J3;%ho1pS%M};hmz~s^drYx>y0B}wuxkX64O9;VHWLMMfs|=UkY6yv8K$#- zUa4o#Ub)7{aGu-v9Ix!bq$_9KxsF`E;Ct{4tDP^)UPiw&MUAFsi_V$xdNoQ)dh<fbE_xjv*0;-`+UR*OVaA68PYF(qQ7NmxxBd0*6K>RtTfE$7{Q#@2T&alcQ4FB!q?Bwmk^^S}J=!z2(`* zpFyAXCLN0XHC{5 zy_bq9G2i~oXw$>A6R(qxzxG&h=Kufy2FtHx@4iuU_O;cHXF$a~+U8j&UISHXP2Fp{ z?P=r1_dr3ljy0N-cDn9)t~qgs_RK@Zn;!!Om22jT2ZOBk*bTBpd-^`p&5x1}JyR;5 zZn6A=!J3;%ho1pS%M};hmz~s^drYx>y0B}wuxkX64O9;VHWLMMfs|=UkY6yv8K$#- zUa4o#Ub)7{aGu-v9Ix!bq$_9KxsF`E;Ct{4tDP^)UPiw&MUAFsi_V$xdNoQ)dh<fbE_xjv*0;-`+UR*OVaA68PYF(qQ7NmxxBd0*6K>RtTfE$7{Q#@2T&alcQ4FB!q?Bwmk^^S}J=!z2(`* zpFyAXCLN0X*1~ d%cx_`%wTm>K2&z)nx8*1~ d%cx_`%wTm>K2&z)nx83O<1hGzp*bQ7=*JWskBs}F) cX-G|HI9tcxd$}q!2dI<5)78&qol`;+02{+2r~m)} literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/textfield_disabled_focused_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/textfield_disabled_focused_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..23cda8134f317f3b1c85c2dea14740ecc9a4889d GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^W+GczQYPUES|NkG2bW&cvRXP5Wv-bJI zt;~}enV(K$^qQn{-Z02pck7j)-+gBPBC0pa{!qOwF-!30yv!ACFAjXpaW++Ab6J-r z{Wzv;X?bG4_3aB2mVS$ysPs+2N;*8Zl~;2z_u>oJ4!w_RX7j({nsByly<v-m-mJNB!!uy=xEWOLXTH()~Quf5VD&wi;x-ti& zf(3Vs96TpIv2@E?xpZ1o*8Pje7_hWD9{J(~Od|Gd4;m?g(q|5#_i R9-!M9JYD@<);T3K0RXJ5X5s(< literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/textfield_disabled_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/textfield_disabled_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..fc4a4eb663596513ee39cccce6fd59a382b0209e GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^WYQN(R0^WoeD4c;@2T^8iHu^YI$uFKF6NqEYq c(vX_YaJG)W_i|Ne4p1k9r>mdKI;Vst00Dv{PXGV_ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/textfield_focused_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/textfield_focused_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..f8739d75930bb551d69892fc3fd328001939e0fa GIT binary patch literal 300 zcmeAS@N?(olHy`uVBq!ia0vp^W*1~ d%cx_`%wTm>K2&z)nx8*1~ d%cx_`%wTm>K2&z)nx83O<1hGzp*bQ7=*JWskBs}F) cX-G|HI9tcxd$}q!2dI<5)78&qol`;+02{+2r~m)} literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/textfield_multiline_disabled_focused_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/textfield_multiline_disabled_focused_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..23cda8134f317f3b1c85c2dea14740ecc9a4889d GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^W+GczQYPUES|NkG2bW&cvRXP5Wv-bJI zt;~}enV(K$^qQn{-Z02pck7j)-+gBPBC0pa{!qOwF-!30yv!ACFAjXpaW++Ab6J-r z{Wzv;X?bG4_3aB2mVS$ysPs+2N;*8Zl~;2z_u>oJ4!w_RX7j({nsByly<v-m-mJNB!!uy=xEWOLXTH()~Quf5VD&wi;x-ti& zf(3Vs96TpIv2@E?xpZ1o*8Pje7_hWD9{J(~Od|Gd4;m?g(q|5#_i R9-!M9JYD@<);T3K0RXJ5X5s(< literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/textfield_multiline_disabled_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/textfield_multiline_disabled_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..fc4a4eb663596513ee39cccce6fd59a382b0209e GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^WYQN(R0^WoeD4c;@2T^8iHu^YI$uFKF6NqEYq c(vX_YaJG)W_i|Ne4p1k9r>mdKI;Vst00Dv{PXGV_ literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/textfield_multiline_focused_holo_dark.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/textfield_multiline_focused_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..f2de222ff9943568179c39a222a8db4bd9192de2 GIT binary patch literal 556 zcmeAS@N?(olHy`uVBq!ia0vp^WN{%q*;I>>Qk2+&sK|`~reP!Xlz#;*wI*GO}{=3W`d~DynLJ$~<-q z42-s(E{-7{$KOu(?mKM29!5JzZTR?eDbYTMIpC2e^L#jhm@!1 zLf&_=mv*Uov$b3{-@Vt%$YIvgq!6Fb*Kg}QjToZjycW#~$l>{^mKkyCFy{^>GqdAU ziX{CGguY|Z+nH;g%CJ}^YR%5sp90(%c1oSB^q7^(AjA6kYu?fxmI-H195vsz;YP-? zt9d%9(u` zxh?wP*S1ae$v)d(8Kw($c^#QDjrs1asnv5|$qF}3t}**0EdJ2+k)6tuNt1Wa5V=_M ww5YUvf%T0|=bkQnAb8!*-hB7b_jSMP7}$5NKQ0-ZYYK`4Pgg&ebxsLQ0O!W=$^ZZW literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/textfield_multiline_focused_holo_light.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/textfield_multiline_focused_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..f2de222ff9943568179c39a222a8db4bd9192de2 GIT binary patch literal 556 zcmeAS@N?(olHy`uVBq!ia0vp^WN{%q*;I>>Qk2+&sK|`~reP!Xlz#;*wI*GO}{=3W`d~DynLJ$~<-q z42-s(E{-7{$KOu(?mKM29!5JzZTR?eDbYTMIpC2e^L#jhm@!1 zLf&_=mv*Uov$b3{-@Vt%$YIvgq!6Fb*Kg}QjToZjycW#~$l>{^mKkyCFy{^>GqdAU ziX{CGguY|Z+nH;g%CJ}^YR%5sp90(%c1oSB^q7^(AjA6kYu?fxmI-H195vsz;YP-? zt9d%9(u` zxh?wP*S1ae$v)d(8Kw($c^#QDjrs1asnv5|$qF}3t}**0EdJ2+k)6tuNt1Wa5V=_M ww5YUvf%T0|=bkQnAb8!*-hB7b_jSMP7}$5NKQ0-ZYYK`4Pgg&ebxsLQ0O!W=$^ZZW literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/toast_frame.9.png b/android/3rd_party/HoloEverywhere/library/res/drawable-xhdpi/toast_frame.9.png new file mode 100644 index 0000000000000000000000000000000000000000..403e129fe47022a9a23520ffc6bacc76b836b8b1 GIT binary patch literal 1793 zcmeAS@N?(olHy`uVBq!ia0vp^hk!VUgBeH~M*emHQq09po*^6@9Je3(KLBz$3p^r= z85p=bL736}ZfSg@uKsrKOdXm9@3Cjg5`1t*xD%oxQ!igM$OaI%j8R7Z(>- zS684F?(Xg$9v+^ao?c#F-rn9mK0ZJ<`1$z(tquqX2n-C&I&HuYv_8Ki$S;_Ik%^gw zm5rT)lZ%^&mycgSP)JxrR7_k#Qc7AzR!&|)QAt@vRZU$(Q%hS%S5M!-(8$=t)Xdz% z(#qNf=n8uWM<-_&SD>XHoE<%dt7fBpXR zSE8P083O}LsHcl#NXEUl(Wm=VOa*#8c5l_GesZ9dSx9EWj~zd!{WVni$2eif8i7ZK zCE;!b8)8H6+U`EHj^(vmZttqK^Q=-zTrB>22>WkkKXWtg@x6C%@7=rggYo}Qi?iqX zr%e9;B0S(#=!ZKA1>1J~6%mMIPIzA|B_L;5{pYP?!FSIFg%cNNd)u?|RDTH*_}U{- z#_-m#dzy`c1Vi+PlK1mo&sSk;WO$x*NVbvJQGh4c=1On#zu%Knc;qa4J9wmvEPNzP zY7LbH8I2@3rZFZ9@$fe0oG5B)b1Zz{8tSehDagy^aV~+4d7EHZxUl1a)zVhnx)p9B zV$;}~?g|=jNVq-iiOAfht-Y&D(^-v9bVN8dOs-hy*)h>br_HfKf622HHXQ@`>iO{(6|4c_{j6#>c@%`r_GwdpwO^);o>Rh>*rU_o2BoSSrnNo z#sA_nmz(C+YlrhKzlK=zw?}z*@*cBVu_$xpkt-Yw)8{R`{;{rAKv30dZD|?DR8K`w zWn1>Lw2lsq&H7WnOYM@FC?U91=G7YktzA>tdLqKPl&#P6DONE>s~6Z>CofH`Q(Vcz z$5Hi_DcrEIN-RwOOMrfGw9K;aPA?V0e17LP6fZx&tI|B_i6n~*K@T3H-AT?mw%qaG`9^Ewf|1 ziZ|@uJMD7b0f#fz>|NJzeCN7+^}OxQ8Mn(7eYp~=On=T5$T^?iv05RyecjxR{``*F zo+m9?)|c{aHO^?bLLJMZ8TDG@rTdJ##!x=X+&I@}bPg+nW+N zR!&_jrL<`3((_@P*Pe5U|M24vSKH2MPiLKb*VO5E|5weSO$ywvR?l0#=fYk8ufJ7{ z@5M`qy!mvftUT*Zb7FPg^-0feSbvI;=zscg)snj}pYz^%D%o$_r0cTIVTY{G`K|5d udZBN--+tV`>-x7p-}2+1*S*iaSI&t;ucLK6U^)ptq& literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/activated_background_holo.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/activated_background_holo.xml new file mode 100644 index 0000000000..87c6f15b95 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/activated_background_holo.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/activity_picker_bg.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/activity_picker_bg.xml new file mode 100644 index 0000000000..8cbe1a216b --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/activity_picker_bg.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/background_cache_hint_selector_holo_dark.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/background_cache_hint_selector_holo_dark.xml new file mode 100644 index 0000000000..8ede372e6e --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/background_cache_hint_selector_holo_dark.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/background_cache_hint_selector_holo_light.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/background_cache_hint_selector_holo_light.xml new file mode 100644 index 0000000000..86e238156e --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/background_cache_hint_selector_holo_light.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/background_holo_dark.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/background_holo_dark.xml new file mode 100644 index 0000000000..5f7a0ec5e1 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/background_holo_dark.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/background_holo_light.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/background_holo_light.xml new file mode 100644 index 0000000000..6746a910c7 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/background_holo_light.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/btn_checkbox_holo_dark.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/btn_checkbox_holo_dark.xml new file mode 100644 index 0000000000..428d4e3170 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/btn_checkbox_holo_dark.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/btn_checkbox_holo_light.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/btn_checkbox_holo_light.xml new file mode 100644 index 0000000000..c2fc6f6dcb --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/btn_checkbox_holo_light.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/btn_default_holo_dark.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/btn_default_holo_dark.xml new file mode 100644 index 0000000000..234e1f2d12 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/btn_default_holo_dark.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/btn_default_holo_light.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/btn_default_holo_light.xml new file mode 100644 index 0000000000..eaa272aff0 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/btn_default_holo_light.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/btn_group_holo_dark.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/btn_group_holo_dark.xml new file mode 100644 index 0000000000..81c63c54f0 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/btn_group_holo_dark.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/btn_group_holo_light.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/btn_group_holo_light.xml new file mode 100644 index 0000000000..f1e3b1f296 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/btn_group_holo_light.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/btn_radio_holo_dark.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/btn_radio_holo_dark.xml new file mode 100644 index 0000000000..3d35a26018 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/btn_radio_holo_dark.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/btn_radio_holo_light.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/btn_radio_holo_light.xml new file mode 100644 index 0000000000..984fb05ef9 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/btn_radio_holo_light.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/btn_toggle_holo_dark.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/btn_toggle_holo_dark.xml new file mode 100644 index 0000000000..efb623acb9 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/btn_toggle_holo_dark.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/btn_toggle_holo_light.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/btn_toggle_holo_light.xml new file mode 100644 index 0000000000..37abe8860b --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/btn_toggle_holo_light.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/edit_text_holo_dark.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/edit_text_holo_dark.xml new file mode 100644 index 0000000000..a61a4b7851 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/edit_text_holo_dark.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/edit_text_holo_light.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/edit_text_holo_light.xml new file mode 100644 index 0000000000..e1c067ea89 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/edit_text_holo_light.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/expander_group.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/expander_group.xml new file mode 100644 index 0000000000..f971fdf48d --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/expander_group.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/expander_group_holo_dark.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/expander_group_holo_dark.xml new file mode 100644 index 0000000000..f7ff3512f6 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/expander_group_holo_dark.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/expander_group_holo_light.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/expander_group_holo_light.xml new file mode 100644 index 0000000000..18e25bc876 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/expander_group_holo_light.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/fastscroll_thumb_holo.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/fastscroll_thumb_holo.xml new file mode 100644 index 0000000000..f6d6c91fa2 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/fastscroll_thumb_holo.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/fastscroll_track_holo_dark.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/fastscroll_track_holo_dark.xml new file mode 100644 index 0000000000..3bd754826f --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/fastscroll_track_holo_dark.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/fastscroll_track_holo_light.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/fastscroll_track_holo_light.xml new file mode 100644 index 0000000000..92ee1f0281 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/fastscroll_track_holo_light.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/item_background_holo_dark.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/item_background_holo_dark.xml new file mode 100644 index 0000000000..7f56e15ae3 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/item_background_holo_dark.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/item_background_holo_light.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/item_background_holo_light.xml new file mode 100644 index 0000000000..f603676d86 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/item_background_holo_light.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/list_selector_background_transition_holo_dark.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/list_selector_background_transition_holo_dark.xml new file mode 100644 index 0000000000..1c134cd112 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/list_selector_background_transition_holo_dark.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/list_selector_background_transition_holo_light.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/list_selector_background_transition_holo_light.xml new file mode 100644 index 0000000000..33c9e7fe11 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/list_selector_background_transition_holo_light.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/list_selector_holo_dark.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/list_selector_holo_dark.xml new file mode 100644 index 0000000000..87879bf6b8 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/list_selector_holo_dark.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/list_selector_holo_light.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/list_selector_holo_light.xml new file mode 100644 index 0000000000..8729f29e4e --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/list_selector_holo_light.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/progress_horizontal_holo_dark.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/progress_horizontal_holo_dark.xml new file mode 100644 index 0000000000..61fb5e045e --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/progress_horizontal_holo_dark.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/progress_horizontal_holo_light.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/progress_horizontal_holo_light.xml new file mode 100644 index 0000000000..49c11021f4 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/progress_horizontal_holo_light.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/progress_indeterminate_horizontal_holo.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/progress_indeterminate_horizontal_holo.xml new file mode 100644 index 0000000000..8ae9e6f74c --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/progress_indeterminate_horizontal_holo.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/progress_large_holo.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/progress_large_holo.xml new file mode 100644 index 0000000000..da571e50e8 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/progress_large_holo.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/progress_medium_holo.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/progress_medium_holo.xml new file mode 100644 index 0000000000..ae94265d94 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/progress_medium_holo.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/progress_small_holo.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/progress_small_holo.xml new file mode 100644 index 0000000000..7a3fb68b7b --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/progress_small_holo.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/ratingbar_full_empty_holo_dark.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/ratingbar_full_empty_holo_dark.xml new file mode 100644 index 0000000000..abdd5f363f --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/ratingbar_full_empty_holo_dark.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/ratingbar_full_empty_holo_light.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/ratingbar_full_empty_holo_light.xml new file mode 100644 index 0000000000..71a4eea379 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/ratingbar_full_empty_holo_light.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/ratingbar_full_filled_holo_dark.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/ratingbar_full_filled_holo_dark.xml new file mode 100644 index 0000000000..846b477861 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/ratingbar_full_filled_holo_dark.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/ratingbar_full_filled_holo_light.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/ratingbar_full_filled_holo_light.xml new file mode 100644 index 0000000000..832e60a920 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/ratingbar_full_filled_holo_light.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/ratingbar_full_holo_dark.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/ratingbar_full_holo_dark.xml new file mode 100644 index 0000000000..475f74b5b6 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/ratingbar_full_holo_dark.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/ratingbar_full_holo_light.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/ratingbar_full_holo_light.xml new file mode 100644 index 0000000000..7b8aef7fd6 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/ratingbar_full_holo_light.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/ratingbar_holo_dark.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/ratingbar_holo_dark.xml new file mode 100644 index 0000000000..13bf8fce66 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/ratingbar_holo_dark.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/ratingbar_holo_light.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/ratingbar_holo_light.xml new file mode 100644 index 0000000000..e707b27e86 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/ratingbar_holo_light.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/ratingbar_small_holo_dark.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/ratingbar_small_holo_dark.xml new file mode 100644 index 0000000000..af4b4fc7d4 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/ratingbar_small_holo_dark.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/ratingbar_small_holo_light.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/ratingbar_small_holo_light.xml new file mode 100644 index 0000000000..eb379de9ca --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/ratingbar_small_holo_light.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/scrubber_control_selector_holo.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/scrubber_control_selector_holo.xml new file mode 100644 index 0000000000..1279056f7a --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/scrubber_control_selector_holo.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/scrubber_progress_horizontal_holo_dark.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/scrubber_progress_horizontal_holo_dark.xml new file mode 100644 index 0000000000..3738d88550 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/scrubber_progress_horizontal_holo_dark.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/scrubber_progress_horizontal_holo_light.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/scrubber_progress_horizontal_holo_light.xml new file mode 100644 index 0000000000..19777d442a --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/scrubber_progress_horizontal_holo_light.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/spinner_background_holo_dark.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/spinner_background_holo_dark.xml new file mode 100644 index 0000000000..6e5629cd36 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/spinner_background_holo_dark.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/spinner_background_holo_light.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/spinner_background_holo_light.xml new file mode 100644 index 0000000000..df3e81e352 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/spinner_background_holo_light.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/switch_inner_holo_dark.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/switch_inner_holo_dark.xml new file mode 100644 index 0000000000..85b6a52fae --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/switch_inner_holo_dark.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/switch_inner_holo_light.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/switch_inner_holo_light.xml new file mode 100644 index 0000000000..f2de5d9ced --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/switch_inner_holo_light.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/switch_old_inner_holo_dark.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/switch_old_inner_holo_dark.xml new file mode 100644 index 0000000000..dcabdaa998 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/switch_old_inner_holo_dark.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/switch_old_inner_holo_light.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/switch_old_inner_holo_light.xml new file mode 100644 index 0000000000..52e3766a4f --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/switch_old_inner_holo_light.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/switch_track_holo_dark.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/switch_track_holo_dark.xml new file mode 100644 index 0000000000..116bc3cf2a --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/switch_track_holo_dark.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/switch_track_holo_light.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/switch_track_holo_light.xml new file mode 100644 index 0000000000..df70f13a40 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/switch_track_holo_light.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/drawable/transparent.xml b/android/3rd_party/HoloEverywhere/library/res/drawable/transparent.xml new file mode 100644 index 0000000000..2919cb28a1 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/drawable/transparent.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/interpolator/accelerate_cubic.xml b/android/3rd_party/HoloEverywhere/library/res/interpolator/accelerate_cubic.xml new file mode 100644 index 0000000000..14b61f16f6 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/interpolator/accelerate_cubic.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/interpolator/accelerate_decelerate.xml b/android/3rd_party/HoloEverywhere/library/res/interpolator/accelerate_decelerate.xml new file mode 100644 index 0000000000..0aa3b5a597 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/interpolator/accelerate_decelerate.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/interpolator/accelerate_quad.xml b/android/3rd_party/HoloEverywhere/library/res/interpolator/accelerate_quad.xml new file mode 100644 index 0000000000..952506825b --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/interpolator/accelerate_quad.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/interpolator/accelerate_quint.xml b/android/3rd_party/HoloEverywhere/library/res/interpolator/accelerate_quint.xml new file mode 100644 index 0000000000..9563fe3d23 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/interpolator/accelerate_quint.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/interpolator/anticipate.xml b/android/3rd_party/HoloEverywhere/library/res/interpolator/anticipate.xml new file mode 100644 index 0000000000..e93fce7b63 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/interpolator/anticipate.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/interpolator/anticipate_overshoot.xml b/android/3rd_party/HoloEverywhere/library/res/interpolator/anticipate_overshoot.xml new file mode 100644 index 0000000000..373cf4e302 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/interpolator/anticipate_overshoot.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/interpolator/bounce.xml b/android/3rd_party/HoloEverywhere/library/res/interpolator/bounce.xml new file mode 100644 index 0000000000..e713ae780e --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/interpolator/bounce.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/interpolator/cycle.xml b/android/3rd_party/HoloEverywhere/library/res/interpolator/cycle.xml new file mode 100644 index 0000000000..5e2a2ec832 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/interpolator/cycle.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/interpolator/decelerate_cubic.xml b/android/3rd_party/HoloEverywhere/library/res/interpolator/decelerate_cubic.xml new file mode 100644 index 0000000000..8091e734c9 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/interpolator/decelerate_cubic.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/interpolator/decelerate_quad.xml b/android/3rd_party/HoloEverywhere/library/res/interpolator/decelerate_quad.xml new file mode 100644 index 0000000000..5ac34686b5 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/interpolator/decelerate_quad.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/interpolator/decelerate_quint.xml b/android/3rd_party/HoloEverywhere/library/res/interpolator/decelerate_quint.xml new file mode 100644 index 0000000000..613fb8b7b6 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/interpolator/decelerate_quint.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/interpolator/linear.xml b/android/3rd_party/HoloEverywhere/library/res/interpolator/linear.xml new file mode 100644 index 0000000000..ea0d10832a --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/interpolator/linear.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/interpolator/overshoot.xml b/android/3rd_party/HoloEverywhere/library/res/interpolator/overshoot.xml new file mode 100644 index 0000000000..70972d0067 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/interpolator/overshoot.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/layout-sw600dp/date_picker_dialog.xml b/android/3rd_party/HoloEverywhere/library/res/layout-sw600dp/date_picker_dialog.xml new file mode 100644 index 0000000000..3b4eb2d9c7 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/layout-sw600dp/date_picker_dialog.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/layout-xlarge/select_dialog_holo.xml b/android/3rd_party/HoloEverywhere/library/res/layout-xlarge/select_dialog_holo.xml new file mode 100644 index 0000000000..ef42379422 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/layout-xlarge/select_dialog_holo.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/layout-xlarge/select_dialog_item_holo.xml b/android/3rd_party/HoloEverywhere/library/res/layout-xlarge/select_dialog_item_holo.xml new file mode 100644 index 0000000000..4592ba0e3d --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/layout-xlarge/select_dialog_item_holo.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/layout-xlarge/select_dialog_multichoice_holo.xml b/android/3rd_party/HoloEverywhere/library/res/layout-xlarge/select_dialog_multichoice_holo.xml new file mode 100644 index 0000000000..7e9a2ab497 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/layout-xlarge/select_dialog_multichoice_holo.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/layout-xlarge/select_dialog_singlechoice_holo.xml b/android/3rd_party/HoloEverywhere/library/res/layout-xlarge/select_dialog_singlechoice_holo.xml new file mode 100644 index 0000000000..2e83fe4811 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/layout-xlarge/select_dialog_singlechoice_holo.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/layout/alert_dialog_holo.xml b/android/3rd_party/HoloEverywhere/library/res/layout/alert_dialog_holo.xml new file mode 100644 index 0000000000..90ec405177 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/layout/alert_dialog_holo.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/layout/alert_dialog_progress_holo.xml b/android/3rd_party/HoloEverywhere/library/res/layout/alert_dialog_progress_holo.xml new file mode 100644 index 0000000000..b61e6803ee --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/layout/alert_dialog_progress_holo.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/layout/calendar_view.xml b/android/3rd_party/HoloEverywhere/library/res/layout/calendar_view.xml new file mode 100644 index 0000000000..3b2e7be745 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/layout/calendar_view.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/layout/date_picker_dialog.xml b/android/3rd_party/HoloEverywhere/library/res/layout/date_picker_dialog.xml new file mode 100644 index 0000000000..eef3cd4ef2 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/layout/date_picker_dialog.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/layout/date_picker_holo.xml b/android/3rd_party/HoloEverywhere/library/res/layout/date_picker_holo.xml new file mode 100644 index 0000000000..a684e5da2b --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/layout/date_picker_holo.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/layout/expandable_list_content.xml b/android/3rd_party/HoloEverywhere/library/res/layout/expandable_list_content.xml new file mode 100644 index 0000000000..fc29daeec1 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/layout/expandable_list_content.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/layout/expanded_menu_layout.xml b/android/3rd_party/HoloEverywhere/library/res/layout/expanded_menu_layout.xml new file mode 100644 index 0000000000..849d22b6f8 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/layout/expanded_menu_layout.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/layout/grid_content.xml b/android/3rd_party/HoloEverywhere/library/res/layout/grid_content.xml new file mode 100644 index 0000000000..58c715de67 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/layout/grid_content.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/layout/list_content.xml b/android/3rd_party/HoloEverywhere/library/res/layout/list_content.xml new file mode 100644 index 0000000000..23d3ee4f90 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/layout/list_content.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/layout/list_menu_item_checkbox.xml b/android/3rd_party/HoloEverywhere/library/res/layout/list_menu_item_checkbox.xml new file mode 100644 index 0000000000..7e1f8a8232 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/layout/list_menu_item_checkbox.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/layout/list_menu_item_icon.xml b/android/3rd_party/HoloEverywhere/library/res/layout/list_menu_item_icon.xml new file mode 100644 index 0000000000..9d43c469c3 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/layout/list_menu_item_icon.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/layout/list_menu_item_layout.xml b/android/3rd_party/HoloEverywhere/library/res/layout/list_menu_item_layout.xml new file mode 100644 index 0000000000..d1733e9607 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/layout/list_menu_item_layout.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/layout/list_menu_item_radio.xml b/android/3rd_party/HoloEverywhere/library/res/layout/list_menu_item_radio.xml new file mode 100644 index 0000000000..74709dda29 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/layout/list_menu_item_radio.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/layout/number_picker_with_selector_wheel.xml b/android/3rd_party/HoloEverywhere/library/res/layout/number_picker_with_selector_wheel.xml new file mode 100644 index 0000000000..7caddc1fce --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/layout/number_picker_with_selector_wheel.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/layout/popup_menu_item_layout.xml b/android/3rd_party/HoloEverywhere/library/res/layout/popup_menu_item_layout.xml new file mode 100644 index 0000000000..a99bafedfc --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/layout/popup_menu_item_layout.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/layout/progress_dialog_holo.xml b/android/3rd_party/HoloEverywhere/library/res/layout/progress_dialog_holo.xml new file mode 100644 index 0000000000..ac09ba5264 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/layout/progress_dialog_holo.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/layout/resolve_list_item.xml b/android/3rd_party/HoloEverywhere/library/res/layout/resolve_list_item.xml new file mode 100644 index 0000000000..5b89ec5ba0 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/layout/resolve_list_item.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/layout/resolver_grid.xml b/android/3rd_party/HoloEverywhere/library/res/layout/resolver_grid.xml new file mode 100644 index 0000000000..d7c00eff64 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/layout/resolver_grid.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/layout/select_dialog_holo.xml b/android/3rd_party/HoloEverywhere/library/res/layout/select_dialog_holo.xml new file mode 100644 index 0000000000..1124c47cba --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/layout/select_dialog_holo.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/layout/select_dialog_item_holo.xml b/android/3rd_party/HoloEverywhere/library/res/layout/select_dialog_item_holo.xml new file mode 100644 index 0000000000..e7a77387c9 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/layout/select_dialog_item_holo.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/layout/select_dialog_multichoice_holo.xml b/android/3rd_party/HoloEverywhere/library/res/layout/select_dialog_multichoice_holo.xml new file mode 100644 index 0000000000..bbf6875adf --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/layout/select_dialog_multichoice_holo.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/layout/select_dialog_singlechoice_holo.xml b/android/3rd_party/HoloEverywhere/library/res/layout/select_dialog_singlechoice_holo.xml new file mode 100644 index 0000000000..a17216b326 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/layout/select_dialog_singlechoice_holo.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/layout/simple_dropdown_hint.xml b/android/3rd_party/HoloEverywhere/library/res/layout/simple_dropdown_hint.xml new file mode 100644 index 0000000000..0c76a115bf --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/layout/simple_dropdown_hint.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/layout/simple_dropdown_item_1line.xml b/android/3rd_party/HoloEverywhere/library/res/layout/simple_dropdown_item_1line.xml new file mode 100644 index 0000000000..760746fe37 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/layout/simple_dropdown_item_1line.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/layout/simple_list_item_1.xml b/android/3rd_party/HoloEverywhere/library/res/layout/simple_list_item_1.xml new file mode 100644 index 0000000000..6907798a4b --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/layout/simple_list_item_1.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/layout/simple_list_item_2.xml b/android/3rd_party/HoloEverywhere/library/res/layout/simple_list_item_2.xml new file mode 100644 index 0000000000..3bde4debe8 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/layout/simple_list_item_2.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/layout/simple_list_item_2_single_choice.xml b/android/3rd_party/HoloEverywhere/library/res/layout/simple_list_item_2_single_choice.xml new file mode 100644 index 0000000000..aa65e8fdc4 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/layout/simple_list_item_2_single_choice.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/layout/simple_list_item_activated_1.xml b/android/3rd_party/HoloEverywhere/library/res/layout/simple_list_item_activated_1.xml new file mode 100644 index 0000000000..0b3d8f525f --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/layout/simple_list_item_activated_1.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/layout/simple_list_item_activated_2.xml b/android/3rd_party/HoloEverywhere/library/res/layout/simple_list_item_activated_2.xml new file mode 100644 index 0000000000..bc2ed28b6f --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/layout/simple_list_item_activated_2.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/layout/simple_list_item_checked.xml b/android/3rd_party/HoloEverywhere/library/res/layout/simple_list_item_checked.xml new file mode 100644 index 0000000000..17358d8737 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/layout/simple_list_item_checked.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/layout/simple_list_item_multiple_choice.xml b/android/3rd_party/HoloEverywhere/library/res/layout/simple_list_item_multiple_choice.xml new file mode 100644 index 0000000000..e05ef364b8 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/layout/simple_list_item_multiple_choice.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/layout/simple_list_item_single_choice.xml b/android/3rd_party/HoloEverywhere/library/res/layout/simple_list_item_single_choice.xml new file mode 100644 index 0000000000..dadeb44ed5 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/layout/simple_list_item_single_choice.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/layout/simple_spinner_dropdown_item.xml b/android/3rd_party/HoloEverywhere/library/res/layout/simple_spinner_dropdown_item.xml new file mode 100644 index 0000000000..962eda6f12 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/layout/simple_spinner_dropdown_item.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/layout/simple_spinner_item.xml b/android/3rd_party/HoloEverywhere/library/res/layout/simple_spinner_item.xml new file mode 100644 index 0000000000..f8586599b6 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/layout/simple_spinner_item.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/layout/tab_swipe.xml b/android/3rd_party/HoloEverywhere/library/res/layout/tab_swipe.xml new file mode 100644 index 0000000000..67cd38a364 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/layout/tab_swipe.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/layout/time_picker_dialog.xml b/android/3rd_party/HoloEverywhere/library/res/layout/time_picker_dialog.xml new file mode 100644 index 0000000000..d376bf6bda --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/layout/time_picker_dialog.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/layout/time_picker_holo.xml b/android/3rd_party/HoloEverywhere/library/res/layout/time_picker_holo.xml new file mode 100644 index 0000000000..71e5256534 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/res/layout/time_picker_holo.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/android/3rd_party/HoloEverywhere/library/res/raw/roboto_bold.ttf b/android/3rd_party/HoloEverywhere/library/res/raw/roboto_bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..91ec21227866ca9d1cf77ec13660b7b85ec900dd GIT binary patch literal 163448 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 literal 0 HcmV?d00001 diff --git a/android/3rd_party/HoloEverywhere/library/res/raw/roboto_bolditalic.ttf b/android/3rd_party/HoloEverywhere/library/res/raw/roboto_bolditalic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..4013bf88a5e7b4e9ca4f8e53774d4f0a1346b52b GIT binary patch literal 165864 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

XML attributes + *