From e6d2fe81f3a08b76c1006ef1e27291824f944bc9 Mon Sep 17 00:00:00 2001 From: Victor Shcherb Date: Sun, 3 May 2015 14:56:07 +0200 Subject: [PATCH] Use appcompat as sources --- OsmAnd/build.gradle | 13 +- OsmAnd/libs/android-support-v4.jar | Bin 995624 -> 0 bytes OsmAnd/libs/android-support-v7-appcompat.jar | Bin 507947 -> 0 bytes OsmAnd/src/net/osmand/plus/Version.java | 3 +- android/support/v7/app/ActionBar.java | 1358 +++++++++++ android/support/v7/app/ActionBarActivity.java | 24 + .../support/v7/app/ActionBarDrawerToggle.java | 697 ++++++ .../app/ActionBarDrawerToggleHoneycomb.java | 139 ++ android/support/v7/app/AppCompatActivity.java | 416 ++++ android/support/v7/app/AppCompatCallback.java | 43 + android/support/v7/app/AppCompatDelegate.java | 251 ++ .../v7/app/AppCompatDelegateImplBase.java | 325 +++ .../v7/app/AppCompatDelegateImplV11.java | 85 + .../v7/app/AppCompatDelegateImplV7.java | 1808 +++++++++++++++ android/support/v7/app/AppCompatDialog.java | 163 ++ .../support/v7/app/DrawerArrowDrawable.java | 207 ++ .../v7/graphics/drawable/DrawableWrapper.java | 225 ++ android/support/v7/internal/VersionUtils.java | 16 + .../internal/app/NavItemSelectedListener.java | 48 + .../v7/internal/app/TintViewInflater.java | 156 ++ .../v7/internal/app/ToolbarActionBar.java | 635 ++++++ .../v7/internal/app/WindowDecorActionBar.java | 1369 +++++++++++ .../text/AllCapsTransformationMethod.java | 45 + .../transition/ActionBarTransition.java | 55 + .../v7/internal/view/ActionBarPolicy.java | 97 + .../v7/internal/view/ContextThemeWrapper.java | 103 + .../internal/view/StandaloneActionMode.java | 163 ++ .../view/SupportActionModeWrapper.java | 199 ++ .../v7/internal/view/SupportMenuInflater.java | 506 ++++ .../view/ViewPropertyAnimatorCompatSet.java | 139 ++ .../internal/view/WindowCallbackWrapper.java | 151 ++ .../v7/internal/view/menu/ActionMenuItem.java | 296 +++ .../view/menu/ActionMenuItemView.java | 334 +++ .../internal/view/menu/BaseMenuPresenter.java | 237 ++ .../internal/view/menu/BaseMenuWrapper.java | 126 + .../v7/internal/view/menu/BaseWrapper.java | 34 + .../internal/view/menu/ExpandedMenuView.java | 97 + .../internal/view/menu/ListMenuItemView.java | 282 +++ .../internal/view/menu/ListMenuPresenter.java | 288 +++ .../v7/internal/view/menu/MenuBuilder.java | 1352 +++++++++++ .../internal/view/menu/MenuDialogHelper.java | 172 ++ .../v7/internal/view/menu/MenuItemImpl.java | 743 ++++++ .../view/menu/MenuItemWrapperICS.java | 401 ++++ .../internal/view/menu/MenuItemWrapperJB.java | 84 + .../internal/view/menu/MenuPopupHelper.java | 404 ++++ .../v7/internal/view/menu/MenuPresenter.java | 153 ++ .../v7/internal/view/menu/MenuView.java | 120 + .../view/menu/MenuWrapperFactory.java | 57 + .../v7/internal/view/menu/MenuWrapperICS.java | 177 ++ .../v7/internal/view/menu/SubMenuBuilder.java | 141 ++ .../internal/view/menu/SubMenuWrapperICS.java | 92 + .../v7/internal/widget/AbsActionBarView.java | 288 +++ .../v7/internal/widget/AbsSpinnerCompat.java | 451 ++++ .../widget/ActionBarBackgroundDrawable.java | 44 + .../ActionBarBackgroundDrawableV21.java | 26 + .../internal/widget/ActionBarContainer.java | 326 +++ .../internal/widget/ActionBarContextView.java | 546 +++++ .../widget/ActionBarOverlayLayout.java | 822 +++++++ .../internal/widget/ActivityChooserModel.java | 1100 +++++++++ .../internal/widget/ActivityChooserView.java | 843 +++++++ .../v7/internal/widget/AdapterViewCompat.java | 1150 ++++++++++ .../internal/widget/AppCompatPopupWindow.java | 120 + .../v7/internal/widget/CompatTextView.java | 84 + .../internal/widget/ContentFrameLayout.java | 48 + .../internal/widget/DecorContentParent.java | 55 + .../v7/internal/widget/DecorToolbar.java | 104 + .../v7/internal/widget/DrawableUtils.java | 99 + .../widget/FitWindowsFrameLayout.java | 51 + .../widget/FitWindowsLinearLayout.java | 50 + .../internal/widget/FitWindowsViewGroup.java | 32 + .../v7/internal/widget/ListViewCompat.java | 388 ++++ .../widget/NativeActionModeAwareLayout.java | 55 + .../v7/internal/widget/ResourcesWrapper.java | 282 +++ .../v7/internal/widget/RtlSpacingHelper.java | 93 + .../widget/ScrollingTabContainerView.java | 609 +++++ .../v7/internal/widget/SpinnerCompat.java | 1102 +++++++++ .../v7/internal/widget/ThemeUtils.java | 107 + .../widget/TintAutoCompleteTextView.java | 142 ++ .../v7/internal/widget/TintButton.java | 154 ++ .../v7/internal/widget/TintCheckBox.java | 66 + .../internal/widget/TintCheckedTextView.java | 67 + .../internal/widget/TintContextWrapper.java | 53 + .../v7/internal/widget/TintEditText.java | 129 ++ .../v7/internal/widget/TintImageView.java | 70 + .../support/v7/internal/widget/TintInfo.java | 25 + .../v7/internal/widget/TintManager.java | 511 +++++ .../widget/TintMultiAutoCompleteTextView.java | 147 ++ .../v7/internal/widget/TintRadioButton.java | 66 + .../v7/internal/widget/TintRatingBar.java | 166 ++ .../v7/internal/widget/TintResources.java | 49 + .../v7/internal/widget/TintSpinner.java | 163 ++ .../v7/internal/widget/TintTypedArray.java | 189 ++ .../internal/widget/ToolbarWidgetWrapper.java | 716 ++++++ .../v7/internal/widget/ViewStubCompat.java | 262 +++ .../support/v7/internal/widget/ViewUtils.java | 140 ++ android/support/v7/view/ActionMode.java | 279 +++ .../v7/view/CollapsibleActionView.java | 42 + .../v7/widget/ActionMenuPresenter.java | 769 +++++++ android/support/v7/widget/ActionMenuView.java | 811 +++++++ .../support/v7/widget/LinearLayoutCompat.java | 1837 +++++++++++++++ .../support/v7/widget/ListPopupWindow.java | 1780 +++++++++++++++ android/support/v7/widget/PopupMenu.java | 282 +++ android/support/v7/widget/SearchView.java | 1820 +++++++++++++++ .../v7/widget/ShareActionProvider.java | 376 +++ .../support/v7/widget/SuggestionsAdapter.java | 756 ++++++ android/support/v7/widget/SwitchCompat.java | 1151 ++++++++++ android/support/v7/widget/Toolbar.java | 2028 +++++++++++++++++ .../appcompat/libs/android-support-v4.jar | Bin 995624 -> 1157388 bytes .../libs/android-support-v7-appcompat.jar | Bin 507947 -> 0 bytes .../res/anim/abc_grow_fade_in_from_bottom.xml | 30 + .../appcompat/res/anim/abc_popup_enter.xml | 21 + .../appcompat/res/anim/abc_popup_exit.xml | 21 + .../anim/abc_shrink_fade_out_from_bottom.xml | 27 + .../res/color/switch_thumb_material_dark.xml | 20 + .../res/color/switch_thumb_material_light.xml | 20 + .../abc_ab_share_pack_mtrl_alpha.9.png | Bin 0 -> 112 bytes .../abc_btn_check_to_on_mtrl_000.png | Bin 602 -> 227 bytes .../abc_btn_check_to_on_mtrl_015.png | Bin 900 -> 404 bytes .../abc_btn_radio_to_on_mtrl_000.png | Bin 951 -> 464 bytes .../abc_btn_radio_to_on_mtrl_015.png | Bin 1086 -> 563 bytes .../abc_btn_rating_star_off_mtrl_alpha.png | Bin 0 -> 954 bytes .../abc_btn_rating_star_on_mtrl_alpha.png | Bin 0 -> 632 bytes .../abc_btn_switch_to_on_mtrl_00001.9.png | Bin 17227 -> 1204 bytes .../abc_btn_switch_to_on_mtrl_00012.9.png | Bin 17243 -> 1374 bytes .../abc_cab_background_top_mtrl_alpha.9.png | Bin 119 -> 107 bytes .../abc_ic_ab_back_mtrl_am_alpha.png | Bin 667 -> 279 bytes .../drawable-hdpi/abc_ic_clear_mtrl_alpha.png | Bin 326 -> 324 bytes .../abc_ic_commit_search_api_mtrl_alpha.png | Bin 192 -> 171 bytes .../abc_ic_go_search_api_mtrl_alpha.png | Bin 120 -> 118 bytes .../abc_ic_menu_copy_mtrl_am_alpha.png | Bin 287 -> 203 bytes .../abc_ic_menu_cut_mtrl_alpha.png | Bin 500 -> 404 bytes .../abc_ic_menu_moreoverflow_mtrl_alpha.png | Bin 219 -> 134 bytes .../abc_ic_menu_paste_mtrl_am_alpha.png | Bin 312 -> 226 bytes .../abc_ic_menu_selectall_mtrl_alpha.png | Bin 313 -> 222 bytes .../abc_ic_menu_share_mtrl_alpha.png | Bin 549 -> 406 bytes .../abc_ic_search_api_mtrl_alpha.png | Bin 1150 -> 610 bytes .../abc_ic_voice_search_api_mtrl_alpha.png | Bin 409 -> 325 bytes .../abc_list_divider_mtrl_alpha.9.png | Bin 136 -> 78 bytes .../drawable-hdpi/abc_list_focused_holo.9.png | Bin 191 -> 106 bytes .../abc_list_longpressed_holo.9.png | Bin 154 -> 93 bytes .../abc_list_pressed_holo_dark.9.png | Bin 159 -> 90 bytes .../abc_list_pressed_holo_light.9.png | Bin 159 -> 90 bytes ...abc_list_selector_disabled_holo_dark.9.png | Bin 189 -> 108 bytes ...bc_list_selector_disabled_holo_light.9.png | Bin 189 -> 109 bytes .../abc_menu_hardkey_panel_mtrl_mult.9.png | Bin 850 -> 675 bytes .../abc_popup_background_mtrl_mult.9.png | Bin 1331 -> 1026 bytes .../abc_spinner_mtrl_am_alpha.9.png | Bin 3045 -> 235 bytes .../abc_switch_track_mtrl_alpha.9.png | Bin 468 -> 315 bytes .../abc_tab_indicator_mtrl_alpha.9.png | Bin 102 -> 93 bytes .../abc_text_cursor_mtrl_alpha.9.png | Bin 0 -> 102 bytes .../abc_textfield_activated_mtrl_alpha.9.png | Bin 94 -> 88 bytes .../abc_textfield_default_mtrl_alpha.9.png | Bin 99 -> 93 bytes ...extfield_search_activated_mtrl_alpha.9.png | Bin 152 -> 88 bytes ..._textfield_search_default_mtrl_alpha.9.png | Bin 152 -> 87 bytes .../abc_ic_ab_back_mtrl_am_alpha.png | Bin 584 -> 271 bytes .../abc_ic_menu_copy_mtrl_am_alpha.png | Bin 464 -> 199 bytes .../abc_ic_menu_cut_mtrl_alpha.png | Bin 671 -> 403 bytes .../abc_spinner_mtrl_am_alpha.9.png | Bin 272 -> 232 bytes .../abc_ic_ab_back_mtrl_am_alpha.png | Bin 501 -> 218 bytes .../abc_ic_menu_copy_mtrl_am_alpha.png | Bin 362 -> 129 bytes .../abc_ic_menu_cut_mtrl_alpha.png | Bin 486 -> 268 bytes .../abc_spinner_mtrl_am_alpha.9.png | Bin 225 -> 202 bytes .../abc_ic_ab_back_mtrl_am_alpha.png | Bin 611 -> 295 bytes .../abc_ic_menu_copy_mtrl_am_alpha.png | Bin 464 -> 186 bytes .../abc_ic_menu_cut_mtrl_alpha.png | Bin 754 -> 494 bytes .../abc_spinner_mtrl_am_alpha.9.png | Bin 370 -> 303 bytes .../abc_ic_ab_back_mtrl_am_alpha.png | Bin 737 -> 369 bytes .../abc_ic_menu_copy_mtrl_am_alpha.png | Bin 598 -> 264 bytes .../abc_ic_menu_cut_mtrl_alpha.png | Bin 1047 -> 707 bytes .../abc_spinner_mtrl_am_alpha.9.png | Bin 535 -> 422 bytes .../abc_ic_ab_back_mtrl_am_alpha.png | Bin 690 -> 232 bytes .../abc_ic_menu_copy_mtrl_am_alpha.png | Bin 702 -> 329 bytes .../abc_ic_menu_cut_mtrl_alpha.png | Bin 1283 -> 905 bytes .../abc_spinner_mtrl_am_alpha.9.png | Bin 475 -> 367 bytes .../abc_ab_share_pack_mtrl_alpha.9.png | Bin 0 -> 108 bytes .../abc_btn_check_to_on_mtrl_000.png | Bin 595 -> 214 bytes .../abc_btn_check_to_on_mtrl_015.png | Bin 724 -> 322 bytes .../abc_btn_radio_to_on_mtrl_000.png | Bin 714 -> 326 bytes .../abc_btn_radio_to_on_mtrl_015.png | Bin 758 -> 358 bytes .../abc_btn_rating_star_off_mtrl_alpha.png | Bin 0 -> 744 bytes .../abc_btn_rating_star_on_mtrl_alpha.png | Bin 0 -> 535 bytes .../abc_btn_switch_to_on_mtrl_00001.9.png | Bin 16533 -> 721 bytes .../abc_btn_switch_to_on_mtrl_00012.9.png | Bin 16607 -> 843 bytes .../abc_cab_background_top_mtrl_alpha.9.png | Bin 107 -> 95 bytes .../abc_ic_ab_back_mtrl_am_alpha.png | Bin 583 -> 223 bytes .../drawable-mdpi/abc_ic_clear_mtrl_alpha.png | Bin 277 -> 279 bytes .../abc_ic_commit_search_api_mtrl_alpha.png | Bin 200 -> 184 bytes .../abc_ic_go_search_api_mtrl_alpha.png | Bin 110 -> 108 bytes .../abc_ic_menu_copy_mtrl_am_alpha.png | Bin 216 -> 134 bytes .../abc_ic_menu_cut_mtrl_alpha.png | Bin 353 -> 264 bytes .../abc_ic_menu_moreoverflow_mtrl_alpha.png | Bin 202 -> 112 bytes .../abc_ic_menu_paste_mtrl_am_alpha.png | Bin 240 -> 157 bytes .../abc_ic_menu_selectall_mtrl_alpha.png | Bin 224 -> 141 bytes .../abc_ic_menu_share_mtrl_alpha.png | Bin 463 -> 274 bytes .../abc_ic_search_api_mtrl_alpha.png | Bin 794 -> 407 bytes .../abc_ic_voice_search_api_mtrl_alpha.png | Bin 322 -> 235 bytes .../abc_list_divider_mtrl_alpha.9.png | Bin 136 -> 78 bytes .../drawable-mdpi/abc_list_focused_holo.9.png | Bin 171 -> 97 bytes .../abc_list_longpressed_holo.9.png | Bin 151 -> 92 bytes .../abc_list_pressed_holo_dark.9.png | Bin 158 -> 89 bytes .../abc_list_pressed_holo_light.9.png | Bin 158 -> 89 bytes ...abc_list_selector_disabled_holo_dark.9.png | Bin 172 -> 94 bytes ...bc_list_selector_disabled_holo_light.9.png | Bin 171 -> 94 bytes .../abc_menu_hardkey_panel_mtrl_mult.9.png | Bin 562 -> 449 bytes .../abc_popup_background_mtrl_mult.9.png | Bin 961 -> 680 bytes .../abc_spinner_mtrl_am_alpha.9.png | Bin 314 -> 203 bytes .../abc_switch_track_mtrl_alpha.9.png | Bin 351 -> 238 bytes .../abc_tab_indicator_mtrl_alpha.9.png | Bin 94 -> 89 bytes .../abc_text_cursor_mtrl_alpha.9.png | Bin 0 -> 98 bytes .../abc_textfield_activated_mtrl_alpha.9.png | Bin 88 -> 84 bytes .../abc_textfield_default_mtrl_alpha.9.png | Bin 95 -> 90 bytes ...extfield_search_activated_mtrl_alpha.9.png | Bin 149 -> 84 bytes ..._textfield_search_default_mtrl_alpha.9.png | Bin 148 -> 85 bytes .../abc_btn_switch_to_on_mtrl_00001.9.png | Bin 0 -> 801 bytes .../abc_btn_switch_to_on_mtrl_00012.9.png | Bin 0 -> 939 bytes .../abc_ab_share_pack_mtrl_alpha.9.png | Bin 0 -> 117 bytes .../abc_btn_check_to_on_mtrl_000.png | Bin 719 -> 281 bytes .../abc_btn_check_to_on_mtrl_015.png | Bin 910 -> 432 bytes .../abc_btn_radio_to_on_mtrl_000.png | Bin 1197 -> 651 bytes .../abc_btn_radio_to_on_mtrl_015.png | Bin 1421 -> 785 bytes .../abc_btn_rating_star_off_mtrl_alpha.png | Bin 0 -> 1433 bytes .../abc_btn_rating_star_on_mtrl_alpha.png | Bin 0 -> 932 bytes .../abc_btn_switch_to_on_mtrl_00001.9.png | Bin 17992 -> 1797 bytes .../abc_btn_switch_to_on_mtrl_00012.9.png | Bin 18134 -> 2022 bytes .../abc_cab_background_top_mtrl_alpha.9.png | Bin 136 -> 114 bytes .../abc_ic_ab_back_mtrl_am_alpha.png | Bin 706 -> 326 bytes .../abc_ic_clear_mtrl_alpha.png | Bin 371 -> 402 bytes .../abc_ic_commit_search_api_mtrl_alpha.png | Bin 281 -> 250 bytes .../abc_ic_go_search_api_mtrl_alpha.png | Bin 155 -> 145 bytes .../abc_ic_menu_copy_mtrl_am_alpha.png | Bin 330 -> 187 bytes .../abc_ic_menu_cut_mtrl_alpha.png | Bin 593 -> 493 bytes .../abc_ic_menu_moreoverflow_mtrl_alpha.png | Bin 268 -> 158 bytes .../abc_ic_menu_paste_mtrl_am_alpha.png | Bin 363 -> 243 bytes .../abc_ic_menu_selectall_mtrl_alpha.png | Bin 323 -> 193 bytes .../abc_ic_menu_share_mtrl_alpha.png | Bin 857 -> 498 bytes .../abc_ic_search_api_mtrl_alpha.png | Bin 1373 -> 771 bytes .../abc_ic_voice_search_api_mtrl_alpha.png | Bin 551 -> 417 bytes .../abc_list_divider_mtrl_alpha.9.png | Bin 136 -> 78 bytes .../abc_list_focused_holo.9.png | Bin 203 -> 111 bytes .../abc_list_longpressed_holo.9.png | Bin 158 -> 94 bytes .../abc_list_pressed_holo_dark.9.png | Bin 163 -> 91 bytes .../abc_list_pressed_holo_light.9.png | Bin 163 -> 91 bytes ...abc_list_selector_disabled_holo_dark.9.png | Bin 190 -> 115 bytes ...bc_list_selector_disabled_holo_light.9.png | Bin 188 -> 115 bytes .../abc_menu_hardkey_panel_mtrl_mult.9.png | Bin 1507 -> 951 bytes .../abc_popup_background_mtrl_mult.9.png | Bin 2448 -> 1470 bytes .../abc_spinner_mtrl_am_alpha.9.png | Bin 498 -> 303 bytes .../abc_switch_track_mtrl_alpha.9.png | Bin 708 -> 419 bytes .../abc_tab_indicator_mtrl_alpha.9.png | Bin 112 -> 97 bytes .../abc_text_cursor_mtrl_alpha.9.png | Bin 0 -> 99 bytes .../abc_textfield_activated_mtrl_alpha.9.png | Bin 100 -> 90 bytes .../abc_textfield_default_mtrl_alpha.9.png | Bin 103 -> 93 bytes ...extfield_search_activated_mtrl_alpha.9.png | Bin 155 -> 91 bytes ..._textfield_search_default_mtrl_alpha.9.png | Bin 158 -> 92 bytes .../abc_ab_share_pack_mtrl_alpha.9.png | Bin 0 -> 129 bytes .../abc_btn_check_to_on_mtrl_000.png | Bin 822 -> 308 bytes .../abc_btn_check_to_on_mtrl_015.png | Bin 1210 -> 593 bytes .../abc_btn_radio_to_on_mtrl_000.png | Bin 1820 -> 984 bytes .../abc_btn_radio_to_on_mtrl_015.png | Bin 2063 -> 1209 bytes .../abc_btn_rating_star_off_mtrl_alpha.png | Bin 0 -> 1683 bytes .../abc_btn_rating_star_on_mtrl_alpha.png | Bin 0 -> 891 bytes .../abc_btn_switch_to_on_mtrl_00001.9.png | Bin 19313 -> 2944 bytes .../abc_btn_switch_to_on_mtrl_00012.9.png | Bin 19985 -> 3373 bytes .../abc_cab_background_top_mtrl_alpha.9.png | Bin 182 -> 123 bytes .../abc_ic_ab_back_mtrl_am_alpha.png | Bin 924 -> 413 bytes .../abc_ic_clear_mtrl_alpha.png | Bin 495 -> 499 bytes .../abc_ic_commit_search_api_mtrl_alpha.png | Bin 488 -> 259 bytes .../abc_ic_go_search_api_mtrl_alpha.png | Bin 172 -> 145 bytes .../abc_ic_menu_copy_mtrl_am_alpha.png | Bin 436 -> 266 bytes .../abc_ic_menu_cut_mtrl_alpha.png | Bin 836 -> 711 bytes .../abc_ic_menu_moreoverflow_mtrl_alpha.png | Bin 312 -> 215 bytes .../abc_ic_menu_paste_mtrl_am_alpha.png | Bin 488 -> 350 bytes .../abc_ic_menu_selectall_mtrl_alpha.png | Bin 421 -> 262 bytes .../abc_ic_menu_share_mtrl_alpha.png | Bin 1127 -> 724 bytes .../abc_ic_search_api_mtrl_alpha.png | Bin 2221 -> 1339 bytes .../abc_ic_voice_search_api_mtrl_alpha.png | Bin 766 -> 587 bytes .../abc_list_divider_mtrl_alpha.9.png | Bin 138 -> 78 bytes .../abc_list_focused_holo.9.png | Bin 1079 -> 112 bytes .../abc_list_longpressed_holo.9.png | Bin 1048 -> 101 bytes .../abc_list_pressed_holo_dark.9.png | Bin 1051 -> 92 bytes .../abc_list_pressed_holo_light.9.png | Bin 1051 -> 92 bytes ...abc_list_selector_disabled_holo_dark.9.png | Bin 302 -> 140 bytes ...bc_list_selector_disabled_holo_light.9.png | Bin 301 -> 134 bytes .../abc_menu_hardkey_panel_mtrl_mult.9.png | Bin 2007 -> 1577 bytes .../abc_popup_background_mtrl_mult.9.png | Bin 3652 -> 2370 bytes .../abc_spinner_mtrl_am_alpha.9.png | Bin 689 -> 425 bytes .../abc_switch_track_mtrl_alpha.9.png | Bin 1105 -> 589 bytes .../abc_tab_indicator_mtrl_alpha.9.png | Bin 142 -> 106 bytes .../abc_text_cursor_mtrl_alpha.9.png | Bin 0 -> 86 bytes .../abc_textfield_activated_mtrl_alpha.9.png | Bin 112 -> 101 bytes .../abc_textfield_default_mtrl_alpha.9.png | Bin 117 -> 105 bytes ...extfield_search_activated_mtrl_alpha.9.png | Bin 160 -> 92 bytes ..._textfield_search_default_mtrl_alpha.9.png | Bin 161 -> 97 bytes .../abc_btn_check_to_on_mtrl_000.png | Bin 588 -> 284 bytes .../abc_btn_check_to_on_mtrl_015.png | Bin 881 -> 476 bytes .../abc_btn_radio_to_on_mtrl_000.png | Bin 1510 -> 785 bytes .../abc_btn_radio_to_on_mtrl_015.png | Bin 1758 -> 946 bytes .../abc_btn_switch_to_on_mtrl_00001.9.png | Bin 18883 -> 2548 bytes .../abc_btn_switch_to_on_mtrl_00012.9.png | Bin 19168 -> 2963 bytes .../abc_ic_ab_back_mtrl_am_alpha.png | Bin 1437 -> 238 bytes .../abc_ic_clear_mtrl_alpha.png | Bin 628 -> 662 bytes .../abc_ic_menu_copy_mtrl_am_alpha.png | Bin 524 -> 334 bytes .../abc_ic_menu_cut_mtrl_alpha.png | Bin 1071 -> 916 bytes .../abc_ic_menu_moreoverflow_mtrl_alpha.png | Bin 390 -> 307 bytes .../abc_ic_menu_paste_mtrl_am_alpha.png | Bin 677 -> 465 bytes .../abc_ic_menu_selectall_mtrl_alpha.png | Bin 516 -> 320 bytes .../abc_ic_menu_share_mtrl_alpha.png | Bin 0 -> 941 bytes .../abc_ic_search_api_mtrl_alpha.png | Bin 2402 -> 976 bytes .../abc_ic_voice_search_api_mtrl_alpha.png | Bin 1005 -> 786 bytes .../abc_spinner_mtrl_am_alpha.9.png | Bin 1545 -> 365 bytes .../abc_switch_track_mtrl_alpha.9.png | Bin 1874 -> 532 bytes .../abc_tab_indicator_mtrl_alpha.9.png | Bin 171 -> 112 bytes .../drawable/abc_btn_borderless_material.xml | 22 + .../drawable/abc_btn_default_mtrl_shape.xml | 32 + .../abc_dialog_material_background_dark.xml | 26 + .../abc_dialog_material_background_light.xml | 26 + .../res/drawable/abc_edit_text_material.xml | 15 +- .../drawable/abc_ratingbar_full_material.xml | 24 + ..._spinner_textfield_background_material.xml | 36 + .../res/layout/abc_activity_chooser_view.xml | 50 +- .../res/layout/abc_dialog_title_material.xml | 47 + .../res/layout/abc_expanded_menu_layout.xml | 3 +- .../appcompat/res/values-af/strings.xml | 2 + .../appcompat/res/values-am/strings.xml | 2 + .../appcompat/res/values-ar/strings.xml | 2 + .../appcompat/res/values-bg/strings.xml | 2 + .../appcompat/res/values-bn-rBD/strings.xml | 2 + .../appcompat/res/values-ca/strings.xml | 2 + .../appcompat/res/values-cs/strings.xml | 2 + .../appcompat/res/values-da/strings.xml | 2 + .../appcompat/res/values-de/strings.xml | 2 + .../appcompat/res/values-el/strings.xml | 2 + .../appcompat/res/values-en-rGB/strings.xml | 2 + .../appcompat/res/values-en-rIN/strings.xml | 2 + .../appcompat/res/values-es-rUS/strings.xml | 2 + .../appcompat/res/values-es/strings.xml | 2 + .../appcompat/res/values-et-rEE/strings.xml | 2 + .../appcompat/res/values-eu-rES/strings.xml | 2 + .../appcompat/res/values-fa/strings.xml | 2 + .../appcompat/res/values-fi/strings.xml | 2 + .../appcompat/res/values-fr-rCA/strings.xml | 2 + .../appcompat/res/values-fr/strings.xml | 2 + .../appcompat/res/values-gl-rES/strings.xml | 2 + .../appcompat/res/values-h720dp/dimens.xml | 20 + .../appcompat/res/values-hdpi/styles_base.xml | 23 + .../appcompat/res/values-hi/strings.xml | 4 +- .../appcompat/res/values-hr/strings.xml | 2 + .../appcompat/res/values-hu/strings.xml | 2 + .../appcompat/res/values-hy-rAM/strings.xml | 2 + .../appcompat/res/values-in/strings.xml | 2 + .../appcompat/res/values-is-rIS/strings.xml | 2 + .../appcompat/res/values-it/strings.xml | 2 + .../appcompat/res/values-iw/strings.xml | 2 + .../appcompat/res/values-ja/strings.xml | 2 + .../appcompat/res/values-ka-rGE/strings.xml | 2 + .../appcompat/res/values-kk-rKZ/strings.xml | 2 + .../appcompat/res/values-km-rKH/strings.xml | 2 + .../appcompat/res/values-kn-rIN/strings.xml | 2 + .../appcompat/res/values-ko/strings.xml | 2 + .../appcompat/res/values-ky-rKG/strings.xml | 2 + .../appcompat/res/values-lo-rLA/strings.xml | 2 + .../appcompat/res/values-lt/strings.xml | 2 + .../appcompat/res/values-lv/strings.xml | 2 + .../appcompat/res/values-mk-rMK/strings.xml | 2 + .../appcompat/res/values-ml-rIN/strings.xml | 4 +- .../appcompat/res/values-mn-rMN/strings.xml | 2 + .../appcompat/res/values-mr-rIN/strings.xml | 2 + .../appcompat/res/values-ms-rMY/strings.xml | 2 + .../appcompat/res/values-my-rMM/strings.xml | 2 + .../appcompat/res/values-nb/strings.xml | 2 + .../appcompat/res/values-ne-rNP/strings.xml | 2 + .../appcompat/res/values-nl/strings.xml | 2 + .../appcompat/res/values-pl/strings.xml | 2 + .../appcompat/res/values-pt-rPT/strings.xml | 2 + .../appcompat/res/values-pt/strings.xml | 2 + .../appcompat/res/values-ro/strings.xml | 2 + .../appcompat/res/values-ru/strings.xml | 2 + .../appcompat/res/values-si-rLK/strings.xml | 2 + .../appcompat/res/values-sk/strings.xml | 2 + .../appcompat/res/values-sl/strings.xml | 2 + .../appcompat/res/values-sr/strings.xml | 2 + .../appcompat/res/values-sv/strings.xml | 2 + .../appcompat/res/values-sw/strings.xml | 2 + .../appcompat/res/values-sw600dp/dimens.xml | 7 + .../appcompat/res/values-ta-rIN/strings.xml | 2 + .../appcompat/res/values-te-rIN/strings.xml | 2 + .../appcompat/res/values-th/strings.xml | 2 + .../appcompat/res/values-tl/strings.xml | 2 + .../appcompat/res/values-tr/strings.xml | 2 + .../appcompat/res/values-uk/strings.xml | 2 + .../appcompat/res/values-ur-rPK/strings.xml | 2 + .../appcompat/res/values-uz-rUZ/strings.xml | 2 + .../appcompat/res/values-v11/themes_base.xml | 265 +-- .../appcompat/res/values-v12/themes_base.xml | 30 + .../res/values-v14/styles_base_text.xml | 26 + .../appcompat/res/values-v14/themes_base.xml | 38 +- .../appcompat/res/values-v17/styles_rtl.xml | 13 +- .../appcompat/res/values-v18/dimens.xml | 22 + .../appcompat/res/values-v21/styles_base.xml | 34 +- .../appcompat/res/values-v21/themes_base.xml | 38 +- .../appcompat/res/values-vi/strings.xml | 2 + .../appcompat/res/values-zh-rCN/strings.xml | 2 + .../appcompat/res/values-zh-rHK/strings.xml | 2 + .../appcompat/res/values-zh-rTW/strings.xml | 2 + .../appcompat/res/values-zu/strings.xml | 2 + .../appcompat/res/values/attrs.xml | 68 +- .../appcompat/res/values/colors_material.xml | 8 +- .../appcompat/res/values/config.xml | 6 + .../appcompat/res/values/dimens.xml | 21 + .../appcompat/res/values/dimens_material.xml | 18 + .../appcompat/res/values/strings.xml | 2 + .../appcompat/res/values/styles.xml | 48 +- .../appcompat/res/values/styles_base.xml | 132 +- .../appcompat/res/values/styles_rtl.xml | 13 +- .../appcompat/res/values/themes.xml | 9 +- .../appcompat/res/values/themes_base.xml | 244 +- .../src/android/support/v7/app/ActionBar.java | 1358 +++++++++++ .../support/v7/app/ActionBarActivity.java | 24 + .../support/v7/app/ActionBarDrawerToggle.java | 697 ++++++ .../app/ActionBarDrawerToggleHoneycomb.java | 139 ++ .../support/v7/app/AppCompatActivity.java | 416 ++++ .../support/v7/app/AppCompatCallback.java | 43 + .../support/v7/app/AppCompatDelegate.java | 251 ++ .../v7/app/AppCompatDelegateImplBase.java | 325 +++ .../v7/app/AppCompatDelegateImplV11.java | 85 + .../v7/app/AppCompatDelegateImplV7.java | 1808 +++++++++++++++ .../support/v7/app/AppCompatDialog.java | 163 ++ .../support/v7/app/DrawerArrowDrawable.java | 207 ++ .../v7/graphics/drawable/DrawableWrapper.java | 225 ++ .../support/v7/internal/VersionUtils.java | 16 + .../internal/app/NavItemSelectedListener.java | 48 + .../v7/internal/app/TintViewInflater.java | 156 ++ .../v7/internal/app/ToolbarActionBar.java | 635 ++++++ .../v7/internal/app/WindowDecorActionBar.java | 1369 +++++++++++ .../text/AllCapsTransformationMethod.java | 45 + .../transition/ActionBarTransition.java | 55 + .../v7/internal/view/ActionBarPolicy.java | 97 + .../v7/internal/view/ContextThemeWrapper.java | 103 + .../internal/view/StandaloneActionMode.java | 163 ++ .../view/SupportActionModeWrapper.java | 199 ++ .../v7/internal/view/SupportMenuInflater.java | 506 ++++ .../view/ViewPropertyAnimatorCompatSet.java | 139 ++ .../internal/view/WindowCallbackWrapper.java | 151 ++ .../v7/internal/view/menu/ActionMenuItem.java | 296 +++ .../view/menu/ActionMenuItemView.java | 334 +++ .../internal/view/menu/BaseMenuPresenter.java | 237 ++ .../internal/view/menu/BaseMenuWrapper.java | 126 + .../v7/internal/view/menu/BaseWrapper.java | 34 + .../internal/view/menu/ExpandedMenuView.java | 97 + .../internal/view/menu/ListMenuItemView.java | 282 +++ .../internal/view/menu/ListMenuPresenter.java | 288 +++ .../v7/internal/view/menu/MenuBuilder.java | 1352 +++++++++++ .../internal/view/menu/MenuDialogHelper.java | 172 ++ .../v7/internal/view/menu/MenuItemImpl.java | 743 ++++++ .../view/menu/MenuItemWrapperICS.java | 401 ++++ .../internal/view/menu/MenuItemWrapperJB.java | 84 + .../internal/view/menu/MenuPopupHelper.java | 404 ++++ .../v7/internal/view/menu/MenuPresenter.java | 153 ++ .../v7/internal/view/menu/MenuView.java | 120 + .../view/menu/MenuWrapperFactory.java | 57 + .../v7/internal/view/menu/MenuWrapperICS.java | 177 ++ .../v7/internal/view/menu/SubMenuBuilder.java | 141 ++ .../internal/view/menu/SubMenuWrapperICS.java | 92 + .../v7/internal/widget/AbsActionBarView.java | 288 +++ .../v7/internal/widget/AbsSpinnerCompat.java | 451 ++++ .../widget/ActionBarBackgroundDrawable.java | 44 + .../ActionBarBackgroundDrawableV21.java | 26 + .../internal/widget/ActionBarContainer.java | 326 +++ .../internal/widget/ActionBarContextView.java | 546 +++++ .../widget/ActionBarOverlayLayout.java | 822 +++++++ .../internal/widget/ActivityChooserModel.java | 1100 +++++++++ .../internal/widget/ActivityChooserView.java | 843 +++++++ .../v7/internal/widget/AdapterViewCompat.java | 1150 ++++++++++ .../internal/widget/AppCompatPopupWindow.java | 120 + .../v7/internal/widget/CompatTextView.java | 84 + .../internal/widget/ContentFrameLayout.java | 48 + .../internal/widget/DecorContentParent.java | 55 + .../v7/internal/widget/DecorToolbar.java | 104 + .../v7/internal/widget/DrawableUtils.java | 99 + .../widget/FitWindowsFrameLayout.java | 51 + .../widget/FitWindowsLinearLayout.java | 50 + .../internal/widget/FitWindowsViewGroup.java | 32 + .../v7/internal/widget/ListViewCompat.java | 388 ++++ .../widget/NativeActionModeAwareLayout.java | 55 + .../v7/internal/widget/ResourcesWrapper.java | 282 +++ .../v7/internal/widget/RtlSpacingHelper.java | 93 + .../widget/ScrollingTabContainerView.java | 609 +++++ .../v7/internal/widget/SpinnerCompat.java | 1102 +++++++++ .../v7/internal/widget/ThemeUtils.java | 107 + .../widget/TintAutoCompleteTextView.java | 142 ++ .../v7/internal/widget/TintButton.java | 154 ++ .../v7/internal/widget/TintCheckBox.java | 66 + .../internal/widget/TintCheckedTextView.java | 67 + .../internal/widget/TintContextWrapper.java | 53 + .../v7/internal/widget/TintEditText.java | 129 ++ .../v7/internal/widget/TintImageView.java | 70 + .../support/v7/internal/widget/TintInfo.java | 25 + .../v7/internal/widget/TintManager.java | 511 +++++ .../widget/TintMultiAutoCompleteTextView.java | 147 ++ .../v7/internal/widget/TintRadioButton.java | 66 + .../v7/internal/widget/TintRatingBar.java | 166 ++ .../v7/internal/widget/TintResources.java | 49 + .../v7/internal/widget/TintSpinner.java | 163 ++ .../v7/internal/widget/TintTypedArray.java | 189 ++ .../internal/widget/ToolbarWidgetWrapper.java | 716 ++++++ .../v7/internal/widget/ViewStubCompat.java | 262 +++ .../support/v7/internal/widget/ViewUtils.java | 140 ++ .../android/support/v7/view/ActionMode.java | 279 +++ .../v7/view/CollapsibleActionView.java | 42 + .../v7/widget/ActionMenuPresenter.java | 769 +++++++ .../support/v7/widget/ActionMenuView.java | 811 +++++++ .../support/v7/widget/LinearLayoutCompat.java | 1837 +++++++++++++++ .../support/v7/widget/ListPopupWindow.java | 1780 +++++++++++++++ .../android/support/v7/widget/PopupMenu.java | 282 +++ .../android/support/v7/widget/SearchView.java | 1820 +++++++++++++++ .../v7/widget/ShareActionProvider.java | 376 +++ .../support/v7/widget/SuggestionsAdapter.java | 756 ++++++ .../support/v7/widget/SwitchCompat.java | 1151 ++++++++++ .../android/support/v7/widget/Toolbar.java | 2028 +++++++++++++++++ 519 files changed, 79009 insertions(+), 528 deletions(-) delete mode 100644 OsmAnd/libs/android-support-v4.jar delete mode 100644 OsmAnd/libs/android-support-v7-appcompat.jar create mode 100644 android/support/v7/app/ActionBar.java create mode 100644 android/support/v7/app/ActionBarActivity.java create mode 100644 android/support/v7/app/ActionBarDrawerToggle.java create mode 100644 android/support/v7/app/ActionBarDrawerToggleHoneycomb.java create mode 100644 android/support/v7/app/AppCompatActivity.java create mode 100644 android/support/v7/app/AppCompatCallback.java create mode 100644 android/support/v7/app/AppCompatDelegate.java create mode 100644 android/support/v7/app/AppCompatDelegateImplBase.java create mode 100644 android/support/v7/app/AppCompatDelegateImplV11.java create mode 100644 android/support/v7/app/AppCompatDelegateImplV7.java create mode 100644 android/support/v7/app/AppCompatDialog.java create mode 100644 android/support/v7/app/DrawerArrowDrawable.java create mode 100644 android/support/v7/graphics/drawable/DrawableWrapper.java create mode 100644 android/support/v7/internal/VersionUtils.java create mode 100644 android/support/v7/internal/app/NavItemSelectedListener.java create mode 100644 android/support/v7/internal/app/TintViewInflater.java create mode 100644 android/support/v7/internal/app/ToolbarActionBar.java create mode 100644 android/support/v7/internal/app/WindowDecorActionBar.java create mode 100644 android/support/v7/internal/text/AllCapsTransformationMethod.java create mode 100644 android/support/v7/internal/transition/ActionBarTransition.java create mode 100644 android/support/v7/internal/view/ActionBarPolicy.java create mode 100644 android/support/v7/internal/view/ContextThemeWrapper.java create mode 100644 android/support/v7/internal/view/StandaloneActionMode.java create mode 100644 android/support/v7/internal/view/SupportActionModeWrapper.java create mode 100644 android/support/v7/internal/view/SupportMenuInflater.java create mode 100644 android/support/v7/internal/view/ViewPropertyAnimatorCompatSet.java create mode 100644 android/support/v7/internal/view/WindowCallbackWrapper.java create mode 100644 android/support/v7/internal/view/menu/ActionMenuItem.java create mode 100644 android/support/v7/internal/view/menu/ActionMenuItemView.java create mode 100644 android/support/v7/internal/view/menu/BaseMenuPresenter.java create mode 100644 android/support/v7/internal/view/menu/BaseMenuWrapper.java create mode 100644 android/support/v7/internal/view/menu/BaseWrapper.java create mode 100644 android/support/v7/internal/view/menu/ExpandedMenuView.java create mode 100644 android/support/v7/internal/view/menu/ListMenuItemView.java create mode 100644 android/support/v7/internal/view/menu/ListMenuPresenter.java create mode 100644 android/support/v7/internal/view/menu/MenuBuilder.java create mode 100644 android/support/v7/internal/view/menu/MenuDialogHelper.java create mode 100644 android/support/v7/internal/view/menu/MenuItemImpl.java create mode 100644 android/support/v7/internal/view/menu/MenuItemWrapperICS.java create mode 100644 android/support/v7/internal/view/menu/MenuItemWrapperJB.java create mode 100644 android/support/v7/internal/view/menu/MenuPopupHelper.java create mode 100644 android/support/v7/internal/view/menu/MenuPresenter.java create mode 100644 android/support/v7/internal/view/menu/MenuView.java create mode 100644 android/support/v7/internal/view/menu/MenuWrapperFactory.java create mode 100644 android/support/v7/internal/view/menu/MenuWrapperICS.java create mode 100644 android/support/v7/internal/view/menu/SubMenuBuilder.java create mode 100644 android/support/v7/internal/view/menu/SubMenuWrapperICS.java create mode 100644 android/support/v7/internal/widget/AbsActionBarView.java create mode 100644 android/support/v7/internal/widget/AbsSpinnerCompat.java create mode 100644 android/support/v7/internal/widget/ActionBarBackgroundDrawable.java create mode 100644 android/support/v7/internal/widget/ActionBarBackgroundDrawableV21.java create mode 100644 android/support/v7/internal/widget/ActionBarContainer.java create mode 100644 android/support/v7/internal/widget/ActionBarContextView.java create mode 100644 android/support/v7/internal/widget/ActionBarOverlayLayout.java create mode 100644 android/support/v7/internal/widget/ActivityChooserModel.java create mode 100644 android/support/v7/internal/widget/ActivityChooserView.java create mode 100644 android/support/v7/internal/widget/AdapterViewCompat.java create mode 100644 android/support/v7/internal/widget/AppCompatPopupWindow.java create mode 100644 android/support/v7/internal/widget/CompatTextView.java create mode 100644 android/support/v7/internal/widget/ContentFrameLayout.java create mode 100644 android/support/v7/internal/widget/DecorContentParent.java create mode 100644 android/support/v7/internal/widget/DecorToolbar.java create mode 100644 android/support/v7/internal/widget/DrawableUtils.java create mode 100644 android/support/v7/internal/widget/FitWindowsFrameLayout.java create mode 100644 android/support/v7/internal/widget/FitWindowsLinearLayout.java create mode 100644 android/support/v7/internal/widget/FitWindowsViewGroup.java create mode 100644 android/support/v7/internal/widget/ListViewCompat.java create mode 100644 android/support/v7/internal/widget/NativeActionModeAwareLayout.java create mode 100644 android/support/v7/internal/widget/ResourcesWrapper.java create mode 100644 android/support/v7/internal/widget/RtlSpacingHelper.java create mode 100644 android/support/v7/internal/widget/ScrollingTabContainerView.java create mode 100644 android/support/v7/internal/widget/SpinnerCompat.java create mode 100644 android/support/v7/internal/widget/ThemeUtils.java create mode 100644 android/support/v7/internal/widget/TintAutoCompleteTextView.java create mode 100644 android/support/v7/internal/widget/TintButton.java create mode 100644 android/support/v7/internal/widget/TintCheckBox.java create mode 100644 android/support/v7/internal/widget/TintCheckedTextView.java create mode 100644 android/support/v7/internal/widget/TintContextWrapper.java create mode 100644 android/support/v7/internal/widget/TintEditText.java create mode 100644 android/support/v7/internal/widget/TintImageView.java create mode 100644 android/support/v7/internal/widget/TintInfo.java create mode 100644 android/support/v7/internal/widget/TintManager.java create mode 100644 android/support/v7/internal/widget/TintMultiAutoCompleteTextView.java create mode 100644 android/support/v7/internal/widget/TintRadioButton.java create mode 100644 android/support/v7/internal/widget/TintRatingBar.java create mode 100644 android/support/v7/internal/widget/TintResources.java create mode 100644 android/support/v7/internal/widget/TintSpinner.java create mode 100644 android/support/v7/internal/widget/TintTypedArray.java create mode 100644 android/support/v7/internal/widget/ToolbarWidgetWrapper.java create mode 100644 android/support/v7/internal/widget/ViewStubCompat.java create mode 100644 android/support/v7/internal/widget/ViewUtils.java create mode 100644 android/support/v7/view/ActionMode.java create mode 100644 android/support/v7/view/CollapsibleActionView.java create mode 100644 android/support/v7/widget/ActionMenuPresenter.java create mode 100644 android/support/v7/widget/ActionMenuView.java create mode 100644 android/support/v7/widget/LinearLayoutCompat.java create mode 100644 android/support/v7/widget/ListPopupWindow.java create mode 100644 android/support/v7/widget/PopupMenu.java create mode 100644 android/support/v7/widget/SearchView.java create mode 100644 android/support/v7/widget/ShareActionProvider.java create mode 100644 android/support/v7/widget/SuggestionsAdapter.java create mode 100644 android/support/v7/widget/SwitchCompat.java create mode 100644 android/support/v7/widget/Toolbar.java delete mode 100644 eclipse-compile/appcompat/libs/android-support-v7-appcompat.jar create mode 100644 eclipse-compile/appcompat/res/anim/abc_grow_fade_in_from_bottom.xml create mode 100644 eclipse-compile/appcompat/res/anim/abc_popup_enter.xml create mode 100644 eclipse-compile/appcompat/res/anim/abc_popup_exit.xml create mode 100644 eclipse-compile/appcompat/res/anim/abc_shrink_fade_out_from_bottom.xml create mode 100644 eclipse-compile/appcompat/res/color/switch_thumb_material_dark.xml create mode 100644 eclipse-compile/appcompat/res/color/switch_thumb_material_light.xml create mode 100644 eclipse-compile/appcompat/res/drawable-hdpi/abc_ab_share_pack_mtrl_alpha.9.png create mode 100644 eclipse-compile/appcompat/res/drawable-hdpi/abc_btn_rating_star_off_mtrl_alpha.png create mode 100644 eclipse-compile/appcompat/res/drawable-hdpi/abc_btn_rating_star_on_mtrl_alpha.png create mode 100644 eclipse-compile/appcompat/res/drawable-hdpi/abc_text_cursor_mtrl_alpha.9.png create mode 100644 eclipse-compile/appcompat/res/drawable-mdpi/abc_ab_share_pack_mtrl_alpha.9.png create mode 100644 eclipse-compile/appcompat/res/drawable-mdpi/abc_btn_rating_star_off_mtrl_alpha.png create mode 100644 eclipse-compile/appcompat/res/drawable-mdpi/abc_btn_rating_star_on_mtrl_alpha.png create mode 100644 eclipse-compile/appcompat/res/drawable-mdpi/abc_text_cursor_mtrl_alpha.9.png create mode 100644 eclipse-compile/appcompat/res/drawable-tvdpi/abc_btn_switch_to_on_mtrl_00001.9.png create mode 100644 eclipse-compile/appcompat/res/drawable-tvdpi/abc_btn_switch_to_on_mtrl_00012.9.png create mode 100644 eclipse-compile/appcompat/res/drawable-xhdpi/abc_ab_share_pack_mtrl_alpha.9.png create mode 100644 eclipse-compile/appcompat/res/drawable-xhdpi/abc_btn_rating_star_off_mtrl_alpha.png create mode 100644 eclipse-compile/appcompat/res/drawable-xhdpi/abc_btn_rating_star_on_mtrl_alpha.png create mode 100644 eclipse-compile/appcompat/res/drawable-xhdpi/abc_text_cursor_mtrl_alpha.9.png create mode 100644 eclipse-compile/appcompat/res/drawable-xxhdpi/abc_ab_share_pack_mtrl_alpha.9.png create mode 100644 eclipse-compile/appcompat/res/drawable-xxhdpi/abc_btn_rating_star_off_mtrl_alpha.png create mode 100644 eclipse-compile/appcompat/res/drawable-xxhdpi/abc_btn_rating_star_on_mtrl_alpha.png create mode 100644 eclipse-compile/appcompat/res/drawable-xxhdpi/abc_text_cursor_mtrl_alpha.9.png create mode 100644 eclipse-compile/appcompat/res/drawable-xxxhdpi/abc_ic_menu_share_mtrl_alpha.png create mode 100644 eclipse-compile/appcompat/res/drawable/abc_btn_borderless_material.xml create mode 100644 eclipse-compile/appcompat/res/drawable/abc_btn_default_mtrl_shape.xml create mode 100644 eclipse-compile/appcompat/res/drawable/abc_dialog_material_background_dark.xml create mode 100644 eclipse-compile/appcompat/res/drawable/abc_dialog_material_background_light.xml create mode 100644 eclipse-compile/appcompat/res/drawable/abc_ratingbar_full_material.xml create mode 100644 eclipse-compile/appcompat/res/drawable/abc_spinner_textfield_background_material.xml create mode 100644 eclipse-compile/appcompat/res/layout/abc_dialog_title_material.xml create mode 100644 eclipse-compile/appcompat/res/values-h720dp/dimens.xml create mode 100644 eclipse-compile/appcompat/res/values-hdpi/styles_base.xml create mode 100644 eclipse-compile/appcompat/res/values-v12/themes_base.xml create mode 100644 eclipse-compile/appcompat/res/values-v14/styles_base_text.xml create mode 100644 eclipse-compile/appcompat/res/values-v18/dimens.xml create mode 100644 eclipse-compile/appcompat/src/android/support/v7/app/ActionBar.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/app/ActionBarActivity.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/app/ActionBarDrawerToggle.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/app/ActionBarDrawerToggleHoneycomb.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/app/AppCompatActivity.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/app/AppCompatCallback.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/app/AppCompatDelegate.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/app/AppCompatDelegateImplBase.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/app/AppCompatDelegateImplV11.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/app/AppCompatDelegateImplV7.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/app/AppCompatDialog.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/app/DrawerArrowDrawable.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/graphics/drawable/DrawableWrapper.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/VersionUtils.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/app/NavItemSelectedListener.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/app/TintViewInflater.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/app/ToolbarActionBar.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/app/WindowDecorActionBar.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/text/AllCapsTransformationMethod.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/transition/ActionBarTransition.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/view/ActionBarPolicy.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/view/ContextThemeWrapper.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/view/StandaloneActionMode.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/view/SupportActionModeWrapper.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/view/SupportMenuInflater.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/view/ViewPropertyAnimatorCompatSet.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/view/WindowCallbackWrapper.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/ActionMenuItem.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/ActionMenuItemView.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/BaseMenuPresenter.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/BaseMenuWrapper.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/BaseWrapper.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/ExpandedMenuView.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/ListMenuItemView.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/ListMenuPresenter.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/MenuBuilder.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/MenuDialogHelper.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/MenuItemImpl.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/MenuItemWrapperICS.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/MenuItemWrapperJB.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/MenuPopupHelper.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/MenuPresenter.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/MenuView.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/MenuWrapperFactory.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/MenuWrapperICS.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/SubMenuBuilder.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/SubMenuWrapperICS.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/AbsActionBarView.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/AbsSpinnerCompat.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/ActionBarBackgroundDrawable.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/ActionBarBackgroundDrawableV21.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/ActionBarContainer.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/ActionBarContextView.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/ActionBarOverlayLayout.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/ActivityChooserModel.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/ActivityChooserView.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/AdapterViewCompat.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/AppCompatPopupWindow.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/CompatTextView.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/ContentFrameLayout.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/DecorContentParent.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/DecorToolbar.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/DrawableUtils.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/FitWindowsFrameLayout.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/FitWindowsLinearLayout.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/FitWindowsViewGroup.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/ListViewCompat.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/NativeActionModeAwareLayout.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/ResourcesWrapper.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/RtlSpacingHelper.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/ScrollingTabContainerView.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/SpinnerCompat.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/ThemeUtils.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintAutoCompleteTextView.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintButton.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintCheckBox.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintCheckedTextView.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintContextWrapper.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintEditText.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintImageView.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintInfo.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintManager.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintMultiAutoCompleteTextView.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintRadioButton.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintRatingBar.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintResources.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintSpinner.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintTypedArray.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/ToolbarWidgetWrapper.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/ViewStubCompat.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/internal/widget/ViewUtils.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/view/ActionMode.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/view/CollapsibleActionView.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/widget/ActionMenuPresenter.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/widget/ActionMenuView.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/widget/LinearLayoutCompat.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/widget/ListPopupWindow.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/widget/PopupMenu.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/widget/SearchView.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/widget/ShareActionProvider.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/widget/SuggestionsAdapter.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/widget/SwitchCompat.java create mode 100644 eclipse-compile/appcompat/src/android/support/v7/widget/Toolbar.java diff --git a/OsmAnd/build.gradle b/OsmAnd/build.gradle index e639da736f..39a9e293e1 100644 --- a/OsmAnd/build.gradle +++ b/OsmAnd/build.gradle @@ -142,14 +142,14 @@ android { buildTypes { debug { // proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt' - minifyEnabled true - proguardFiles 'proguard-project.txt' + // minifyEnabled true + // proguardFiles 'proguard-project.txt' signingConfig signingConfigs.development } release { // proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt' - minifyEnabled true - proguardFiles 'proguard-project.txt' + // minifyEnabled true + //proguardFiles 'proguard-project.txt' signingConfig signingConfigs.publishing } } @@ -294,6 +294,7 @@ repositories { } dependencies { + compile project(path: ":eclipse-compile:appcompat", configuration: "android") compile project(path: ":OsmAnd-java", configuration: "android") compile fileTree( dir: "libs", @@ -305,8 +306,8 @@ dependencies { "OsmAndCore_android.jar", "OsmAndCore_wrapper.jar"]) compile "com.github.ksoichiro:android-observablescrollview:1.5.0" - compile "com.android.support:appcompat-v7:21.0.3" - compile "com.github.shell-software:fab:1.0.5" + // compile "com.android.support:appcompat-v7:21.0.3" + // compile "com.github.shell-software:fab:1.0.5" legacyCompile "net.osmand:OsmAndCore_android:0.1-SNAPSHOT@jar" qtcoredebugCompile "net.osmand:OsmAndCore_androidNativeDebug:0.1-SNAPSHOT@aar" qtcoredebugCompile "net.osmand:OsmAndCore_android:0.1-SNAPSHOT@aar" diff --git a/OsmAnd/libs/android-support-v4.jar b/OsmAnd/libs/android-support-v4.jar deleted file mode 100644 index 4ebdaa9ed9f32a9db0d7fcd3487662d8dcc86eb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 995624 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�eV;Y!o(ql$`2g28x(#7R6WsnRbotlSxVv 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�U`_7A@HUlAR9 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
y&*}QP{Ch2 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
  • 9wwhF!8eW6Si>R0xSp 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%0D`+EGo|gwxDxg+A*%Z+ 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
      Gf0|1L(N zf5{t~RLmTZl#sZxCL~D{U<`>P!vUe`(f|;FC=h@Je*3S+4*0e@8?%e`7kZqW5&`#u z2yLXa`sXUY_SQc@DiI+xQSs>Q%FNlbwV2dP&J`j#mLE|+Z@OH09B;Z@pX+>oe31fZ z+z9=-5-dT|l6RD_;|&)nWJMFEcJEUS+oHn}(g8oSEd>s_RYkjGC8!!Ma?J;p*&{dO zqOLL#&n?gi4-7X1FV`(ai{0fz7MNoJxi9s_f+P&mGgG6mL^eYnMox@AD{Bw5YHK$` zkM{rB;3>}DoE90AKBU?iBh=t;ly9W&f$e3xQmcuKK9yJ(5PY6GR64Qnq#V)Kx!hQ#?7>>qA(e4{2WQr-IidbmJ3HBJKmy|8 zHZ13*7!%WKOtDo~Ql>pb3}Q#%>7S>&?Uaqz|s;-}1E_B)L8vN~?p8=>&I zgskkO7SX+2#zpeS~13@f-n4LPW}jpRH@??G6jT3BKh zzH!Me%&HhNA%^guYCY(yIa`(`i_m;+0m*Ps%b8mE48{RF`ThphqP@o8!W@y^|%3u{+>HeRHqQP^Ft)2{wErii^*AU9Zn`*M|5O8fwTnxreS^*=-mg?PK zo+FqIBacj;f#A@%`-srTc6@^+7&PIt5-*ay$r(2VoadXLB2mDvQMB|M=V-z%K0~&y zUT5tlAJUrJH~boHF_z2J+6wG<`qK)vuR8s6A&-Xk(pwcA0l^t^w`|yz)K(;&r3bHd z@`#tJBO(nk2j9QNzrl^SoRfb$I^><_oQS#_gzBk@9igxX`ZLYG4UXs3^i_14i-CYJ zMgOsk!QhT=TqFgjx{TfOU)+#K-~LD@oh7z8&(t$s3!bMT+^Ywi7k8cJ7^lYg?)FTz+8E-_+!(*x2J$5a(JwEi>eod@ z2`<#;}2iv7v5fl97q9vO3xJ~L!7yzKudm>51%;lkvCCf38;o)` zoYCkIf?iQmh!(HMW!Qy-6?bKP^}kwY7Z9ed5H6vsxxZ`lm3B0&Np|3G=qOZ;Wr0u^ z(f9&oe4Ee+M@eUb?V$FEu!`RqSc4o`qri(l?k8SQ$zS8qzcEQZaP3h3(rrS9y^AgY ze?J>=j5@g{PFjMLY6W0(?%=^^+yFS|!F4To!%=U^X;05;M^Uawae-8|5ssc+=Xqli zBme&J(?<4C;(XwE`WSLJ8sWa?eRg1}uW@#~LE{?+zbh!lwh*}MCHza^or5(b{iJfA zF|5Zmbc;y#h53)8VJRHxx$%cgX8LK={%11zKSjjU`Ojl`^Nog9h&tx2N$XNy*( zF#coZMdC^*OdDc)K+a86F;hrq6pQi&A^ROBT#iIeA+O-nZ;lWXPPuOII(zMpj10-` zTf?XS3v=Lcg$UVv5dd-;eVgMrlf%KJ`{UyQy+@%DdSa*A&!aU529_1azS6;xE>VZQ z8}Y9`*%GD*R8e(3alhyG?V=WFpW_1n>o=2Aw2u34-VDfb!KSZ+&$2<(+;QG zgzl54POz4WU|ivXw9bojDb{*;Jf5tcWfpgXAe<`LoI>5jD<8u0&;yLXqv{YCz4!*} z8f4P)y}{`))a9G1X`$o9nEcOD`8)y(mRl>8c*)h#Fv^r$Q;EK2hYEqmbyHa%4x!Pk zaYb4(5-w$iOxsgM=8`+z9X(~7{=1+KMo3I#BIT5X*zYvpD{KBjapYRvIq#)=_sm^y) zCT2~IA%7o(tGOfF-$C~Ar(0y_-F(5`u}F2NQICwCT7r+SHH2ffP57Eq6e%%jTrwb$ zDxsx+WC8n_)?HezszxS!P+JW(S@KOQ+hzbmsxGp-*k;)(X;kiFSanLOQcmx|pIRkR z{L}I)U7X|y`Q!H5|Bsem*8iED`45)ge{nT(QWE{Va9$b~3KkagU%m0woeBdH6~4wO7Ol7KLNK zN~Fq%3LWtw^=~{JqTBUhA%hcms22O>$~H0XaU;K(KHr=L%8XdQuG^sA|4Il0^aEr; z2SaJx0H6-9oT5o?ebQ*6C&NJh8EhVJqt&xv{HMt@$~r^%_m2wk;OG9I3;RDzU($Nc zN{(ih4n+Tc_(ye%^Z)ao&Pvpf`Egbcf0wjSJGH6i`R4oPKY>C5X#7wG5yv3I)} z73fF|`f*mftoH<9{EdNqAs7JD5&MuFVm0ZYUYS!Q+SN2R@n$&YN%;Es`~>qgqZ)$i zcZEWf)j#PeY^B&^Cr$>_PeW-&2Ztr*)DNXH4L+iw2TmxX4xXu3lSOY=VG@{3l2|YA z>TPkVA5fX(TyANt3hS_eYU@bvpGn$Jl2Vz^N{TP~tF0fa0wvIt;&jDI;gzF#DBR23 zIBQL|1>lvB#_^K$DUmrfsIFur@7`Cm&V%bEs@usC;YY7HiJorDcG?R?PV zcqw0_I^5Pt!-~R8E}!AT;EP)b6-R5NB&X%2NCGjk!-`#~0P0aj6%0T$;q@apht))( zJ}d#tO{#Ub#~_lU#s+2`#6GnlNuNy1F=G8bRngNNvn?%Yv>le1byrW1A;Gt2bp^Rf#L*yjsmVs zZqRq}5P)`0Qa#TYYxTqOU+%V1&Lr-;U=|11g`eg}z#MoIgR-$s!e=I*4>z#F{yW zS(mqYS4_9eIg4+R{Ua?)&f*=e%AUX_%*e7;dJi^s6X*CPcrdM9?8sD~O&;CRdTbQF z&mEsgF3AQOOCYUvixaj7G~)VbGOFMT7Rn*v6+UNSe2X^wU&3%xrmVd4pHJ8Le>AH8 zhZy<)7s=H>V?u~jjP&gF^ev74oBT>e!$Cm_=}S7pIH$NoEPW1$TA2oUj*(Fo&`;SE zBOXCa!Bkx0yePA{WS7_aK>j8;)a4U|^Ob~_`y{fFfqwr4vcMHx8~f+VnnkUt39t6D zkIyD4Q{BNgxo(z1u%ZOpb{A3XC{3m9LHq~=IrnEef&Z+DA+m$ z|Ld~Afp#a8Z~`mhPq-TjAac^kN$as^Pk$74KyOaJM4CIBB5v$pPtQU#d>`)nM));) z$~(d#2&w+UiI&aH&Q8yG79&_Ju*K&i%8R)CF5Kt0b7CuJvh283JB>?GuFf{m=(2$c zWu_?%P;vJU5m_i3Q^Jf?QJ_pQi=7tZbA=d_3oma~gN3H=Xi9n!uN6L1S>Syb zIxz#u^Z;^pj-q08%s6_|c>7!;N0BjlHW8W)V@Yv5Fs>v?QY0;nNdv?&d)^4T^#xCk zLVSa`urDnUsR;wQ(^A4@$$XjQ6vN+f!jk!HTZ)pYGP$&0ukvAyndelw&dC9?svTJs z!KeFx=|)+m*JsO+wb}D&P)7+3oWCZC6BU;fWbZOX?Cl>WYBQJa1i|9%1x1oODb<0Y zWWaR;+?cA3480%g9M2-&+pj#yx>U z7Fm6`=vh!z+7f&n&bD0Z#*tV0kgy$@G)@!41GN7T3|PbxID?in+KY{>G7wFnz6At8 zQJCM`9g7dT+3b}@pnkCGD`mFKCReUtSPHthIn)l0F)3RcSfVYdrs+@8qY^TdB$-C{ zP=DRa5l@OKgt(?3h*IQ)Q2-{TOsi*7)yf70Pr30Aw6c}A2*)5um>G0}o-L9kYHckq%g-n73{4^W+3-Tt z8NLkcdhNbV6!?drHwFNE;O@s_++q$U@u@^5jjoMaYtSSL^t5G02{&WLYSBqL6E6xV zm`0ri_7**dPLPbA)(uA;T&#DIw^6)e)WSyjcWO~3t%)EPs##eL;R51JWJ4AVXhUgM zr4qw|{ac5olyYT6zb)cYNmAtkB2ZT5_ux*};*#>vREpE*byfkU3gqVBQodY2@5>e5 z`}dPQxnGE**r2PDcb}kYL~aFqN9Qc)2g30z1`=XdM6Z5E_RzGpR?<#oQCe>&bHbFX z^0>Lj&hc+zv@@o5)cm$-)%izSlg%Oxh2seCa3syX?oaTXg$WQ#D}I|F1VW-7j)g+u zQ99L~#D!NN3+$4RrI^k-A?t_Esbabh{>21*+Qc>1A_2?^rc0%hm6^O%!n%}aVLij_ zeljx?*1FX1NExdpwhhyDAzprf&I*Lhbvv3r*b=NBt(*l(q1TEG{$tz{;4W_a_!9jC z1LuS-FXSE`=p&vr0>p4yC+PYC!9{=dv#fzTVw7OE4C;(vz#+RzsAn?(7<7EG=}v=x zUpYC(Ya~))sBy?>moL-ib)x@yUKhwa0>L|k^ApqB3d_nsw-C!aOxJ}6!OJht3lXS> z9J*d_W?(io2zvx>EP^wFXmo!|-&0!ue!z}RY1%UAvst5&++g8lrbb!Esyu5P#BFjM z2rDpL;x#C4bu&uF_MrY5VG-mD)ckkK*-z;6mFty}FW-dEGC2!syz>P?_Cf*1f*NiZ z!qWGW0So2)@rCZtrfOnG$mNE=dd4kKruyWv@G(1~!6<#T(axeg?aWp&G@76cT7G3u zm-4}rA5CN!Q&m!62WsU4Qv1HVXb)9nhb6Xw9L$=*n@nQ0m#E|%DkDK83!3e@sG_}o z0T=kzQww7OcW`cKM9bU5?OX;-C& zuYtxqQa+P>MSA(P18xug-R3Bd_C>VL2Z( zX)VbNvVGkWt>YEB|1xR=!KyGYRay`|@se}m;v|ec>|hg5QdrjLx$1De>frs?VT$Y7 z@P7R7wkPBcz?Q|JRp{tSRBI$y+)hl0CM%@@3hYl75)J1VON^LnCp7m&(=NCv!Vxi% zkt5y}f4D>z4~nL!LmOEEcCh4(LltYtJ%S`USE$6u$jRYc{OoWMH9qC87^qMa)~3C& zBX!a7z|x$9p2GO?V<+%jBPuirL@+s3^AJi?CQdVh+N2zV+Wi7>K#6ckumMyS(-=5) zjl>9pWtm&=43ir(H)1+u2mw5kyS+6#5;rzGn^vY9I2d_ut<@p+ zq&-5q+6;QTjU!CZzBzx?G(BUP!aRKNZK!dPeRCYd0px0BmIIK)J|J}lv|`X7Sww`{ zMl2?(ezu{R6HG}s)fH*@)#OmU(^-CF?dicLH-+OrYhsgLB%)C;H z8uRUlOOgq98B6iUO^o>e7i;en9eBR93wP{}ZQHhO+qSKaZQHifQO7nrw(WFy(ldL% zXV3oLnRPC{zDcitZnCQCS9+?Rdh)L5TEkCtiX`rHr(jd7A;L!TD=QflQA&88OjMSc zLX`?BM{^9dkQfUOC5|0cgedTLa$9E`Jt?HdAnKm0qt*~^ij+}mw>998k}jKT2O-oR zK2~f~mc!=mgDaDxL4OY7`z38h2<9%>0y;2)4(R;Ckqd3@exd7Rgtp2B6`(=7m+KL6 zZ8DrzEsHG#%B~o$DNRqO45&V;!BBR13sg{003G5L(6V@0T_D~tf9)_%vlssi5ztcK zKI#5Bd6sBqrIfM1nE=1!yvEmSG}U}?GOQ)uvF7Am4Cc(k`km{p>)ea zwM4QNbCc}h+?q4L4H+Q4=$U8_%kwh3_3^S%{AF_?)~P_gnfA-kBVNf5X4CIRcKXP~ z7G`~U!qi!?cA%lyu!55St$6{{ukc|ZYp{w*bZoA0sl`POWiw9S^^KKj3L+1j)qQ5f z9Qwt}GVH|RacR2(d)#YM*3zj*n&(*(TF@DNRL+G*?t1HonkA$#P~c{SL8piJ$yVEL zb5MAxCR0~1Yoe0z@PqyQy>2^}=RMXbJ}FVh*tB9&{1vvC)MWoWqdaI?eKEW->p-8(WBz>PR&Y$6H46CspIk_2^hW} z@gs8ozzd}vc|+i^7yjaknq|)#4Gzc}cT*ZOI|=dt%R#&*h%;no8)la$^iz-vfz$~~ zV2MHFM@UEVEttSt9Gnk9bxsAFrwTh~*lm}^qzwfAO|GBz4m2Xcqj@{v0d8Axv&j77 ziE8{0<(`&pHWGk34!;E8et=6_03W`*>#f08&KiDmKBp&+hw5B!7ZB_Q)w+RQox#Pd zu`4$Y^SVfD)tUSCtM{52Z+GTS8%XS@EP?lc$wOI=qaR0VA1L%s5l3?N68&_+bD^P( zSco%M!B-LBn3U$1DRlcT_~DF2WG{hW(?aIA^$b0$1daSRX*$+~ihIyl9scJwkEV7t zxgj?{uaSQq{_IP_7Fd=X%@SDd^5;#^S*zFCON5s`f+shPzk3RQhJz@%9tj|NIB&&M z8*NIrX!29{L$jk-o5%0*V$DzR@Bx;m=MorD(dTPA`zo7nW>LY2xCLKqbX&H4h5}vCRq!? zW4ACR9jLqt5(0I0+M3tWhN*V1xxE(f%1!CcQ8Q~gR0|sWsR-3SVge^UmqhBiFfOb) zWtt&=oxyA$*?Le^?Yr10fn&{LKC|g3Rt>Dr#aG+~&-oshe9;f=GL!n*!zN95_LW;O zu2u{)5X*CU5Ak;#m3sv6-~AMr|6kfN|IIEb`1d0H-`ORFjIE4K^_`669Bf_8|7VFO zE4oMGvmX}xQO0a;F~1U#s|o^Q4|~GjFW3YQA}_D2mjSIm)`rQF@nnPJ^#xaA4IH^g z=M2l_AZPo-gokHy10Yim&5(PLM892+*X1T@y@48X!f;VbY>FN9j}JpuS6wyIm7SshGdxL@{+A1=LsePcXxtF7BN zxG>1r8XCD5yg?$3xO#}=gX$$pRIX4fQc!VOTO=Wfq!lKfNABU_kb#gPgOW)V$=`8Z zr`VP5tyhpeh#OZ=s~3TObv-IYok93YsDd1YBs}fnOpS?rcL-2%igzGQ>wq(=JTVW_ z6Jflx_bQUw&$~KDe3}-+T#5Mg9Z@tDCOOw=!O<><+P%8=lLUn3thYyOSB(*>`l1qF zv%oaFh&SKf=?2t;IUYuvJBn_R`>E~LS146)E>I@Q;Q{6k`RaWk{M~AF_=`>dH-iB0 z-^=&Ey#kTqpHumApU3t-IR!quBYz5=^WJue2NV?45LCwn^s5V~jR@%XyZQL7S%3f6 z{P=JE`STqJLwoV#_2cmpQymC+F>(A7f^($wv_)jRjKaL^xKyREaSbL$Tac5q)Dkkz zW8>n+MsP6VRFhw6#HA)(C?>|m#i?hlv{rj7ezUja6Z3S(~T{$@J7V(V6=H|iYCfv662mTj593*%oT}Xkvc5gLuB-~_k z&ynInR($a{*7gs6FF2uB0G{u@X7)A<8eRxM-x(bl91q6#Hr{@8fz(E50H7?w;Oiaj z>fnCd4D0vxszPl7pCzPr#3_~W9aNIjJz{;_fC2i)DG(}&OHiE4(Itc4GKia}7n?Bw z;LBzDle=S#f$v3o?UxKu=~=cD>aq0tA(6Fs5&K4pa--)c(CYP@2YEwsAiZ$-08ZSs z_<&P<=v=-tFSLc3wTHn9ah^QiT7C5>Xr1QcGU@(NztIEPVi4$knorIm$!Z_3lFB zwVh*nZ6RH0PJLFD_l>>NyVEX_EjuS{3`^By2gD~&RKIXEdrYNvVzCB~hJ;+w>wwAZ zqle*TUO0u#ObX0Mx4P!8_CORhqD$ z@$LPVpNc;3A69UO%g~?sX#sVA@lyXC8UEqA-0#TndtB;2-BgjPrY+|0yT~r}(Vfv* zp6kWa$%!N`h^%?2ctr#D@q=ZK_+R~kCDm3j>zz7JFRJGrKmy&01zx|%^$Y4y%sk)= z;Q3oPOV(dBK-SJxM6i=9lziC{6@zP~fI zyAV~e^2Ov_K%IMnP-B1^2)C?lH4ANq zy|Y4!L!*gs$@27M23Ao~gzp`rcqB~HEIZ{!>GdPi4(c;Vr;q`bdUk0&*h>uzf_P(FA~qL*HBs11OBRbN0P1jnWS5YhMw;HQYDJ^kF@xezZU>6DIOdr+E9&} z@Dqn6z_ewSZZ}ND+9DgxQRqM?>zQd5P#RVbExJt=Xx`opcX+xovbP$ErI*>kqD5!a zGmDRlER2oXozwk7R;{9ltm;l6_xs9fGBG`*ydhtSLGbxEn(sSHH*=G_#^8?mH)L|x zZY0wiN%(7%0kDEsiEJ>eVVF&yKO;Ce75)Gv{(dpHx9XWan2k2$GLtb2B_fio;1=(a zy!!PAskIn^$28>@47{zrSobPHG$DnaazA+oA>Ym??J64lhLI37AqByhwGsT`Q{OEb zBE3H|JgS>x+?2LJqF3oykjB@mlaYl^$?xi@aD9A9-tFqBhi}-HuBQv6&^6zj%O#A_ zD@&K(_eTbl41A)?XE(^0?Y)`lTZES7P!E~bH`~#lAv*SeOGOYZQOrsL+yr&`FZ~d;B@*hIq z>iCT_o)4~6^TVlPTb8`VbW2eKKzOs(C)nmWB ziUw-US{BbHVKYY}1MiUd)EC#4huvru_xaNrJV|4Nlp1&XNs!@VcoBgHFtIUELPLNp z0-tjSUo**4Ravy5YV;Cx)Jb03vG>Pb;E%DH{h}++X1u_b84dDd!+0lH055@08c=W1 z>84BYP^K+{V8;dYwg~7A4CoyAzQg`nacEtvUOIpI5dAc?*4y*10kl}lezsscI9?gv z(Ygq)KyCCfR!7G!N?O)|+hXxc1i?hUjVSn`_ zSWpT3Al&{C(*NbI>-M_Oj)!nkG?WiYA@55(zX^W+IF#q{YjuiWyNG<1IT<=3(-y9S zA32vB-CfSU(096-cgFvB=|mF&5d&O<3ZOM8DI>+D_d$TS1v#PHq^c{zdM^sWC>E+s zv;*?2d6S><(XQT;VfKdmJGKrE0?rT6|CIZw{C#fnzaTgNu`ExdY~x_8Z}drh zVcnx1`+q|iY*Id~ppPTU?2Fa+XV(75xd`Ru8Fk7fccl~A3)`#;Fmol~ui|H0T%7i9&?qI6o}Z7HGi)!` zUnN#bsQwJcpQ|czR*@Q$HyLrklpus^KVYv{xx%bIbt|uRY{1iMnJyMqL9a(>GM=l3 zml#ng9{lmMegRZ8(1<~b#Kya&&t#Ya%J|trSwkpjpP|-0_?_Hbl6k_8WeNN4Cx>9= z(R?Y~aed>&KyZ_>M}ST98Q-7 zyQJ)0Xzraip|Tmig*{ z(N2vj6dy=+*Fbll>$@MGP#Pa#0KVUdHmw4rn(!3K0%I??-{2gAobnrQUi)#Nu}}Fh zcXE@jFK32M#q2owI%nr?^BlbRl=T5z15S|f-$`tOo*4Cq0h~H0e`@>ttf5rS_%jQr z1;bv;Ls4O{vEHOS#vTE_q;>naL;M_aGQ>DT^uq9e3v~O!QV>!01BeLy9gvrg!rzxp zEqca;P$Iu;w3o4vbuf(i2s4+Kho7h}CU4S!y9fLOx!|>>*ch`^$Vik+sekDglh`MhPDnyf2R3WirTV>{7Bpl)Y|PdIg60U8Uy7; z;7~qX{BGt3vxUiGm(F4qoe0QoyCFTzc1^ z8Kj@F3Ir%iCuPXbg7zdhx!L%}Az3wj7+{DauBgk>@GLaQ!nKm^a1@W;mkCcOb{Tio z7g~9_q4jgKb%9qt>Odw{sLPEKrsSqcZFSHRmGYmfMjj9)-gM$ zmrQh&*$ObN`_8_Nva6;j?O@iA`*n1T7QQ%qMMmH5N$I+)&<*44>`Q2rD8oehUE8)v zeID%*#c;_)O)>?MhhlG$oC2Y1d}VKs3zVv)XLdDiMnC0`;PDVgBhplQ=jtwYzc*qK z^&&Na=vif>D!`jX21peM%0-M(6?Dr+-Hva9=%;+?=pK=6vI>zD7bRrqYkeq?>>)B% zaabY1%2#NUw7(MvbHRk)9?ZHh;%s7{N zZtC(aZE{@CgrOmIAQjulgfW8AF_lq5sCKC&pPCj|#1sA`aTx4aC(R5}- zYiYEs^7U$`6DEZjD`6z>b_2^bSr`<~bqy`OPnI*Ym&VW?vt;zf$kd&{$kZ?7(H0T1Fw!zU%rafGu>z!W3cPRP0fCm8 zI}-Se+inTg=o!eI`6nHum{yv{){8s9K8D7(KKro};UZ%DP?RB8Ht4I*dtZk46uiCVh#Ou zBlU`Y2cgm34$9GL;u1fWjR|`(zgy|u?DH3wwu)Ob-f!T46$RVv>~HNb8knlnOFxNLCi&7 zYq9qj8Ci1G7->3QRSi^|Z|PmexiuQ0g8M!f5hnJgcZVZ=m0 zRsg#x@f5v^Yg9Q91K1Q~qALQ`SLqzIT~dz~bn(=raRUsFNTLTNww z%-pRs4fzu_f||xtSFW}-F!h|g=aE9zf%OSEY?=%nvoNMxN1RR2OV1wbd3s;Fi^WPc ztP7=!8h5JP1URpB{bN~s_!3Oo3ssv}lnb>3UsH?aiN0SNPGFx#VziiEg@s!5Xo7v0 zYNXM+0GLHLq@y2tfXtrBLgeg-q)fcQ_nE}$d%J!W$j@sqsHY;WvTlu4?8&7QyB(5}EI?*PWC>xjXkX)#O@t-KF0qf1i8lY3e z%FJVnnL1y+*k;n8A@I>#gNX`$K&GbN7d>KLNbl%iAunH~Uk`3o1fxi3GZ{!5Pa++5 zO*8YBi98}F06$k5it}bdL_#|9$K9()ky5%gv`m%Q!D#8x=C-S6arwHvMdNu@!p ziC<*iW>KxdF1Ljrca_q86UUdEQ(6Gg9{2-9C7S6D&{8CW+3%B=3bmBnNPL{1*`nKb zH?(vG)HtN@OOyW!J(R2<7HLn2#tt#pQN<8K{Qe%8TKH)xveMQ@tO8F2Ia&V0mim*6 za*hzZJpBw>J_13Q8C6_PX`&fcoD@^G8K6A+46@L^5V8X6}ms%@Mn}9{Ds?l>m0nMu50l6sEYQU0k+9 zAofjN!h(0}iJAzKhIT+g015Bru{wwerp+B|C>(R*vI&ruv_k5i=^9krSW8Cvn<<1?`i-6k&2d7!ZuLTsE8|Bv zXasF{3FHxJqf$zB_~TAS!iq^@B=mu4>*_O9<3f%^HR!n3ChzYiR3$Ey633yBdgy}& zAWf9pCEq)3ICGv)ORMr8?9+Mq&s7I}yaIIVqE{G+vZ$|jvEI8M=Xqrj?*C+96F8|c z?fM*s;79qVqVoS`pGx0A%+}F~NKxO#*ys}|b29$-ov^F~OIrkfq~OiGF&aD#g%yt; zi>k)`d~LWWc?<(VBH|uNe{+LZrf!KAb(fJd{}tUL-4&q%-fmoDt_G`G00Xk+@$s~V zOD;yo$;?gPuFvdLfE*OY9EOuVuog2QJo2m_!vW(41BapXrP$g7Ik-sbA(X$213N(f zyZ*}HDSwS|sB4FDoN3W^<9Fx&Ao4>$#p`J46#T_K!GgKFR?#lE^=26Prq)x8J6LF0 zjI|5!p|hil+)dZO5?I{Rj?E=Ye^<}obNKUV`_4OFsWvqevBn^N7iqT67Oh5@h;2GX z6ZUGJo8*R+Lqu+)73dLkw%|}}FAg|=UwyaqGE-ivepRj8#NM70=u@7(K-lj#_U#ov z%(Kv}WwW;({q$WQvP^~xq#G<9ZSg`Yl#T7Mdamp>IA9WgNq|W{pti~uQO%t}hbl7~ zpQw`dd)~m^+3BoUkJ(GNzl>f*XUSm6_cNW*Bhhx2X=#S;a@h38^-~C%`?(5DnK5u- z47Xoz!qK0Nx1Xj@4f*n&5=sGtz>9P*_EkQwt>F7K_-IEF;%DVWiz1 zO!joe!3$)1EVz2KN_cw_bu(A;B~t})s%iNNc;Gz%JW{2Ik4C;g$jVH!cp7 zvKGIBRGKnLD6`!o=82CVgGjkWLhO>*_z`~vPk^MG5+_u)pm7E@j^EYZDm9D_Uj-ly ziz1hKhu;3hexm_-@$@Xcb~{A9R$`A-4%|e&xiQGFFLB_jj(> zYtR@V@tNxte}cJxkATtseOV&#iQ)bM|o~ncFmV(VlvI>M~EGxzeVYLSm#FMkN}gfU<#Ys2F-nfrShvm6ysWX#!YacQw&+9{dF29NOr; zpsZEV^YsHl1MY(}Cx%W4wnFQrpT+7OpZop*{t#OdnQ%6mRg;Qm?n|V{V5{4!L{mZz zHvf%>%!Hid{p)WXTVm1&hkW7(ga3#hNd3Kz|952hfBpJ@Vf&=$I+;E?w7@BAaXch4 z13o&&Muc7Q7F`_z=#v+)Vah}2J|>GuLZV@XURuu^Hb|&Qg{t~hE5t) zIaMbIi|fFV&^%YcfbC5`(R(=ZhDiK4zy8+|9duW~xz_0#n~oMWx@B|2iaFC9dEW?b zyGx?6(S@QuwR-TRg?aGp$NbfoV9@e8D|)6GK#6t#7CGG2{bIkY0c^b=^SMrRX9iPH zJbxUKBs1S_L;O^R&R>-A-;gNP-z($a@ZG;k{Xbt@k@Bg{Z#1Xa#o(+}I-}Vfk*rfM z91#zyabF?i8?AWzd=!jKB$AKP?)tGyICuL>R#a%e(3Mn#^tS%~DfCzxP)j?g5C_C3=&*U~`@P2Z+{ozY=anZX!rEIG- zx_O?^uv{aue&t{HLEM9i)(`4GW6kT zS2&Yu+t^FpupCpQzKb?R87msYeiDsf^F_PAeiwPt&uB1i_=_u@92b=IuD%y-oKYbe z)`sVxNVHMu>b2>VYUBa_t&o+KAGX(cwao$-FoCnO-*>XXDWOq4dlM{3_b7Ivle-Mm zC~KrRcnxH+Zhi0u$su9j1ADhMTA?L3`z6Nwjz+~45|xX*CJ;Hpo$7wYUpiLEHZ=vC zhB~Uh;$^BuG|N>hZGd|kNi>M&@urM&hnKqOB~&OZXQOe(>0z+mDmu;2`o#wh3wPEQ#sGJMD}TGMyT56z)eD`KX@Kn*}KmHa5*2DMt<= z9FYF!#Og2hN1^?weMyM7t;w;d^f3{_R6819SA`qpj9WR^x#m_Gp=%aA$+6NiPd>V! zm;gVH%MYea)UvuP6QUG(AMlRmfaZTzp7R*AvTw^huy_la#@C=F(}fUhyT?y%16I%Y zma|l)jI*YA2(dLhbN-|qH2S1($Co3G$F)y;M~02E15x#(lH@QRu0b?`j&qi}!<>Bc zl47!C@#T;fuqXbpKY!pX_yTH!=7q=#v(alE;7YauyeV<-Dkrhu@;PEh@x!n-5;>s4 zZE4HXZF5T_9EFGO37?0-4fc^d7>wj3M*JNZcEX4Fz9o7}JY@*9i%q>{UpJ0jp7kMf z(#??EH>|v_EUhVeN$Lb$f;(c(D!a6S4DR#BDv#j%AIJmI!;X2`XDbl?^Oo%2$J~EF z_5WerO+erAUn3D&O4h%pXnkzz#hWvz3(bKVQNkJrJCFnbESa0c0+RGr%6m|d{LT;J zZNy#rE{caE3v^!rCa)%7Wx#mpc1bz=?u1QW0p1}#!1_uLFN$epFdKb-b{=NGWIA4W zPdZ*+`o7;_euGj|nhvoC5%0hr;3N~G%j4^HL%K9j;HRYtJN7j2P#;W8MKackyY7lK zr+?uaR7NM(*NMo*>X8C&fZm4aV_Fjr*5hED!b7g2FlEzVk>XjkpmKO=YgQwb?XWu5 z@YZR7p||BEb{(-p^PrSWpNLQ?DEnR{(!f*1-dLI}m9RR{cEFa&w`)96xsohD!C7T8 zSHJ!`I?%Cbb?^ubiyK?oJzb!Az+JFd{|lN`lQ@Ny;3+h(-KcHNsYFAhbJRN6!K0)< zya)H7r6=e^;TP_ANE~F)0S2tg*hKu3P&eM#?bq!JISL(n<-NF#t!1|YCQ||fO)w2AaC^73Wfx&G{PPMG!r$J#d)n^{U|}rs)a`M@K65-y z0ZwG{Bw%H!k{Yobe%&zqz1DQ;qJXtZg&d0N;?10ybn68&m2TZPvOPi*)HP+O_b(j`S z(U+TEHyG}UV3EAkN}k3VVaT;dV^?~G{7GvWUz|O=la`g=@CJT3eSfOopZnPO>QUr* z{GCMM_&oWDP<-wTSlt~1Ju2@E^d|;7z}+108T%nUpYH4cHU{2N~S= zIA`EyIA}e6)(`H`F<~u*A83~F98#qd zJ@n-GSzi84S^_Hqs$UHAgveOx!Y{0})J2`P$-4-L3J>MHhgkQ-+@oza_2YL>ar35Q zz5KVWUVyI&8#BSHcFnj%P_TPKbP-yWBT0ykX_9!75Q9~q>mz;-ZL` z;7jm`DH#U5A2ac|kL>MX?4M7M1d=>_Vp>b#M1b3qVwdwLC- zuDNmakZF8+As5MffMU3CNW)TeUimoKMG?Sv&_(Pw=BA5>2)V`%Rn$<;n77nXM<5lX zV;A#j;f!cwjq21~8Mx-}v9=ErqmS;>pHO6G+4!z>yh8ac6ygV$j^H3L4tsAle`kxw z^ZR5>pPgS<@c;Bq|2=K;4}0H#cqb!aD`V@=5iLP|D=UM~65-D@rAft75m6P*Cs`}G z9|Q>)q6wvH5x8gGpbX?R2q_k21|cwC*)zU!q}PP?!p8r>=2F)K+tZ$7*H+FlK+%-r zykzo@)j6~4&6#6eKPx2C;N88^~3$@b6XAc+8Aw>4p9W5K|iwxYjYxGI*8Sn zDiD6J18*`o)GM0S_Imdh9L<&i+PRx1C{zJ5c~@cIFkh0rxCl$+*S)9w5w*lRB7H?4 zl?hZChN0PNu}~>`Lc=r-lI$im{F0*c)-jAYxKGZxbVnh7T8xZ@E!k9bWr5X1lhU~X zFNr1-bqP|5m&7!aXRHP$pK7=_8JPy+vzqPI0fC;zOt)jbOk~JwqiA&t6Dif(@@=Bj z>Jl}NFq(A>j8ir75cTN5o}+mJ$~w21nY*V%6HdYy4#$Mm^Cr1Ds+xH5j8kIb#_9yZ zv})(T!X8MMNu?L7lSGc1zp%gQiuZ=q&nT43IwCh zj_9HiD&=5nPxTl0ZUmV1T7TJ8?24ml$XXy85+5U3R^HP&{Ni{`S*hujHKcNAb% zl&Xow9FWm0w}?y^CKPOOVy%xIRFZJKsidnh&ddZhk9X1@g-{+lI9km0ykl}!s%UJNpdelv{=jDm7C*)~Za-j;v=a3l$w=eEG z%wP68E#=INIAJ{sYo9KM@(FN>=#F;;DyaC);xS9&+Fr|NUvHUj7PJ`*|Sj}H@u~!T8DrbAc2_um!P`$*R|6Q1p~kqz;#mFMYIzS!6VkWmlLwssA^pJVxa+Z8Jhh|px?{U z+J_mT$-65dXzdS!{=i&!v^uiLqw+7681SefXH`KdiUy5sTT^ovUvx^pB7FTWjDL>bZ<5amWX!Z4U^^^}$-4<$xUE<6 zK{EL{9J(X5sSW%tV!7!JjH-h7A)+jl_|B02%W;cFfLNoqh=FCo^_dgMHFr&L%R!8PQ&aC65mUD^IIwEugdO1e`a|BwkCxNu-hz+erA07a#Moy3^Y#kn}NK-J-9(t(E zU`5~W5OM%m|_qQb~+#j2H`j>jVeM^K(#+y@4)g7^OH+hnrkugx~)-D$#RHkyiWJ z9dh`~sQ-VHwf(=eH2=R8QH+0vg({`Z&z2_Kdo!MDwJKzlxwYj0ZYiH7EF=jDGe$ro zeIAck-;0Bl-hFHP8upW|`K-upKur46PQ>8HAe(FUH*s^rQ|)?A&X);RPR@qg{lk!$ zFBGLDaosS;kT#&RRYV7$2O$QmL0pmc(C2;Dy5?ofNL zT+tZ>Z4UZzjU>aDAj6?=@5PY=9>(hfH5orouE%VTgic|yeX=G#*OogD%{*#toF}a3 zjZw=!&o*1QY;M2Hus@;_y324SCg0)Gb4}=`R!tj(E}cc|shNpMa^c>s_Hyr8Coo08 ztZtb^v@@uQj<#+lAc3P@V-2~WUy$=iFYF?rgoA6^}(iu(V=AAKl z+jMYj$sk3pG=f#*KN!^x%kVxvNb>AC2|JI`S<7my18qN^Mf*#`XttK{3rq9?HZzYC zl<|v-3!-yECpoUg`9lWySWxXUEw-9BlarMXBRa*n)54dxnl^_xMFK(`Xe8|7r}c2BcSQq@9sJTAJRTqa?punx21YY4ZOU zyWl_Ej{fhV^Z!DrlN6+7k@(@f2Ye!-+x@+0bsc~WtO(Z@W50xrq(`OmwH_6@7HeY; zUf36#5`IX?qQSm@@j=Qf4zcoY1LHidK2cS!(OnpyIIr3K@=%AJA1xEgTnY9QyjI+- zYgVLPP{7*sF;kAWu8v^*p-J90f)*$#YlOdd*lSaSfjuRS=JHW*-FuOJ+gLZ9t$_o@ zJ+7F=(ZC7MC_S7pO*fkZT^k3LBTV^0gm`3uPkfHJ5+;c=JQK&fMEPAOO)W!zip>}c ze*;}nWYKV^uyIqX<#D@4PI=)x3Wx=DC@2hZVIAABC>yM%HW;s53?eJ+65fR2zDe$T zg@_<`^&C%#=B1R9pqZD%UaTWv28T6_C)9_W7`Uu;obX8#jc6OQy~z~qo>=oVA7i%) zl6`jcKp zmw{z6n=EQkjb=IR`||R#ZCBcx$IUOOZzMR!sYBGnHk5VA0nzo*8Lb7oG>eW#%1lbk zsTdZ}w}KZ*AdlF=0}u4L4r9Cdw$4U-;qQi^+UGy+-FQv(sDmrH9CmL&1v@8%X(89L zkzsr3LJOJK8r{$|+Tkx>qGMmQuDTGLUZ)GVmPxDa_EGv=jFSU=1uc|e(HS`TW8i2T zwYNLap0r6l2HJHL1oa#*V@0cFU4#P3HAfogVFk?zePZUPL^xb-5VVI z0*aGsu7?O4wx@nYzgJ?_d4|K;Oe9cT9pDGY3qe1XlgtJcV3)Ca$q^6Sr?8L9J@Z!5 z>=aV%H6{0kTlYgCZ0_DMc((F+ihR+LVCUr#gx^ZKBeB8`gAzh~V3ERfAX{Fj;u*B! z&d3QP5o`8W#|bQ7x<;az1x9BbQWYQy`3Zx%=3NfHHj||xT?3EEs1`b*wU5AoAc8hg zT2T5A+g5?*JgXa;ZH#$29Z~amOIXK|je7QcrACodOngZd3Sojb_?1)h$xMOXu7Z9U znSJf-J?VrZ0#&;Jr{L^2ifWRQP%)xS*x&UOcbqdK;io(LT~qzN3H}2^$bXq2k*v-C zU@pI>zD$jc{ypvWFXTnG$D&sbE^{GueqI1xHap^|=u*y?4lWQ4n$Jv=K zjOtbaJfLX%OtkUEWFjr~(LV+&Pc*eoMmniv6z8OkK?b`d{8ZzO(@k?7*n5953`G!a z1JN^Q2QasWXm!${d9LBkqK983RBEhv`HEDs&>H3j^2QQ#0(us_?7DI0vf*7FZy z$}w$z+n&!RIMwIl{d=kX!{*R`PUrr0T<-T9{*N}9qO|SY=epJ@TQhyI0AwP{EG$_p zNs&lCcpl!@C?#?QGZ21m0&A;XoBc}a)v`dgZji69C^TB({eHOJF#?g;2|ncE!#$ks zyJ?Rm8)xtDx3{R@hH9k~>#PhwT2I7$0?ZH-@8EYi&@yz zPNTpBc%N;R2+FH4Qb1p*CV?4a!Tlb* zr~x{sERL4F?|{yxUoR3Z5fsRaVe2G|# zM03PhZGc!{ad?qw_m9yyf#yXdiqFS<{g=o5-^sA>-=jBwUBzLbC;DHzCI6-}E>e=T zMWlzrDOn8;s(#)?HiR<2MIfP`gMw!tE4SJ|nrL#;s^o!SZfmszsL zQe*&!|Lps@IezHw-m&TH^#=L{?5Y-AvNkIO%>Ac+?QE>XiXf=uf<}nn;i(**nzcBw z4lJ0qzDylvT=Cj0fCx6z?6$7N)Pr%aUd6g7VXp}hsDL_dL1{$K%NsXnQHlh_u4pQe zf2b(6Qr-;1-UwZEQ=Qjcq#@RALHB4}V~!Vh=*-0>x5if8q@H#Kx#4Pl9rV}oDn=}P zTn+T=WGSmR+n-6AW@Fg`oJ>mNA(bJ6XriSa9oA7wozMDY78R37DBR17AC>GqxXH9s@w}z|K&`q|jzbT%E=HPfg)~x3RIFdmrt}c!a z{ao+AJEw?D=xR0xY%nD)&+ciZ4G8R2$h~C`MzlDx?_{Ar3j86A7&;tv<5ulOI32!; zul)sdBBIt$C0SvoOLNNF+pl6JlM5Yb)k7@N@OWcF#APF=O(dy1V4v%Z!RPgOT1*`>)sLUb{7|23gQT|K&Fbw=}iJ{H_sf2C@@}vB2NeF-cd zgeVaHnwAaB-j4Hkx!QcSf1-=@w1P1I{bw9x8U$9;(CAYQ8xTzH2H@#@ZU^# zf1$klGu&pyO?I}XG*5gq#M5#i?8UVfRZ#nfZ$X6fPYU58=RYK!<8rq#OC<>Vu5x6)?d zV3mlbSj_BI5SSd;w=2ejezue>Uop6$beajVb-bXYW>S;!BylbnfN-VnFBZEdpzh_r|&SHWpW@io1XvJw;oRTLO}MZ z1Flaa{=ZS3BRlN3$NZmvBA@^Jn=4%Z!72Ku{r(Q*ME~)XNJQVz$=1RBPu&#BamxaJ zmTCcDLn+~ji%79(Ez`Yw2nAXK4iI5sP72hnh+Gb5*`Doiz9Aojy`S8V3^*uac|mLg z9U~bXX{@*J*Uz9^fZDj$xT1k4<3;K_1%hVlw+fokN*7dl*yIBw<3{p!{BFlFs1C%! zBnw(nmEsFrKlOV>%}HMO)CRDmd@Z>mizFgt5c8nuohU}w(5$}q?tf=dsiX-ScdXkb znIF?y$)jp*=>rXH+qtizze%%Oj{%+g7`KpVWTcOojf5!SrI=)Og|~TFpT!*cX`$G5 z-=ci@qUzcJGPF1Zv2C%59N6$f%o11tB%{g{f%8@`4Sm3 z&R5GQ+21eWetC=J>!$`}|DplO|0<6EiTu&l$=t-;@Q;P2KUMJi*7U!4T^H2fT#-zX zeN0?UNYz0F$Rw8oYxn{uO!{UMX=10v01Is}0TGB4teoSa^^Z(kINK%jR5U=&Q>@=q z8k3XDpJr4_(E#T|HOh8|XtQ_OpA&v4e*ncClJQ)Qo7DHL6H$3^?PsRBAFjV_c;>vU zd2YJ)Hu-8}fZ37yp!QSjDPw&#z{Y`ZA>46c0>{NcE{FlUM&rTPi3wX88aRTme=&ly z_bSI2vL^^ldUAqueu{+isZTE`=|4BO_Y`@(dctzrUB)}PR;TxniOg2L_79&5+dd2m zrVX7z4eF%@aet|A^%fpbRrZn|5Qnf(-H?JoZw96|R}b!FE;4NpQ4!E@bvr)-Jo*PTf zNa4BG>(z5>_DH|y9Q*Az_R_=g#wKR&_!-A6^af|`_CO17vrTOn|5KbOsNfQ{T zM#aP-cod;Qi7GRfz4I5K%n+0Ksl?$i z_KDc|r`a;tx0#b#<0{*S_fQJd>=;A%l1(Xl))N>-fp{8|(>Uar+0Rs#{^39&(Ra z^hHkp#EQtD99-=BVc=T=?7`4qT^r~f2dVkfitk8K3fVNCGevo3%FXSxczpux4B&uF*5LnKq4!HHitah3FwGfh!z;qgT=LX>y{!t_ zaU6?8bE8OQ5PQgHM(X(2;7%bwmT!WBh;}Q2 z9NkpSIhT(5CX7$dEj2 zleFiy<}dl}J=E{skISZk&c4Z!(%=x3h(^xkoV;PG0igT-WL~v`ES03fImvT#Lu`GK z<#}qxa$79UF+El7WG;zk2+= z{@Pf|M9Zbj;UpBD3x}HVxqJQ5JpOmxNkV;`W4W9C3+~cAHKdN9&5K@HiI>d&Y$duv z;V?0`mB5&Ws^$>sR2F$IeO$$x(}6jEsI)XDr=)8(>JZm-)q%M%Z0-j-3N-40kTj85 zDSbo&pJRfRVj+J#a(ilu5u}^COd%n5_pxVqo74It3EVEP@4FN zz)};xuwga^BrG)v(cxo@Ie);4@i@N!Ku6FEq`-ubU@jKK#S7#JYkluy?cQ4jX+a~< z4KSVBBjee@5O~@4!(93Y@{eqT@twQ9gLyRhE@x^)f7#*OW*{puM@(|~NjfX06fB2N z4Gy+8a~W_fY(2Cw(2V?~{PcR`0)`3@JGhqQ(i9hcy3dSDL>hkHwCg9*>=5Uh?1S>ssOLUoZ~aRov)7O>GJ+Wi7i zKq$0$dHE?scmSIptTy!9&Un><8HkNK19@MjHhYeZo$fVaPoPNNV~pE+nW?x*4QC`q z2Uo&>4zoqOLv|gpssX_Zw$p>&I`&J(T^9-~gB6@5&S{p0@Rxq?*YIU2zJ&@=AuG%8 zJ=WmEH8hn@8ZPDv2%UaNk2Tg4j?)t0QDWawrnV{MqA1M&VLk4vm%MF7o93l*QK>5L zsTn)hIbfpOLpr>K3SNF#AjU?rdk5{JyupWEQuf>ZL_@e6ksN&&J#!!kylPYA7QUAl zarV7Dlf~)gyi)D|I)R-Hm>{xb?l~$t=2a}HpNtr|z^Yvd*7FfT8l~SWuI0mxlR)Y6 zYvU*+CkswA6E7{g3YegJD-;V5Vu0)Ae10SWb_Hl<O)*8_J)L(Dz3lLYNlo29lPg zxm-}oyrAkn*coj$)(B}qsf~eao4XAP`jeQ1?azq`)W;E?7p~~Ew&y56_*)Ea3g8LIf=lCW`DR-}axqx{^E|8czSR5S%{v8(b-@&_6< zQsCD&Q$AOo(vY0RfoJ0>e#gt!t(U2|yMwdf=`Wayl7PVoIQ~d%vw1}(%E68>NQ`hA zTUM$k+28l-IJ>Ls6o9>QKt%*8TC?YJFy;AABU*nYejgai|X+F^4E5=P?4&y6a%COaEvu?!MlmF z50o^b3%fu=W`t~v3}N=uD9e$1iKzm~r8sat8cLn{zEZMlZgv4G2H%^I=ntR-7(_Y{BZ3kshL)A;qHkIN<2 z!eK#5vXO9@SkQeCT1yaBs)Lhf^vkrQ8r%Ih>wX75>FwC-GkG}xoMq6>)_hFXIBwN; zSE;E?4`eE*UxpC}VKHHgJQ=`XodhlfG5fidL>eK4Dz*oVqi2o2 zgn%>7Q@_U>XCw3CR52oOE;v{O%k1J-`9D;l$Wr)e5)+*i?hhlya)ss-_A9M%!P$y) zy{ClOoth+$TE3LP1WRT`Ez$TbiO<7S0wEBa^GGa4#KmS}!ozZii7<(yMv-0N=A9@+ zKJ@;GpNPYvv@?BrVaG}at`U$w{L{?|Ms9qh^%FNteJ;5C|LE;Me+c^j9=-i1vGy;J zrU~nWw}{cX6~|u37iv6+B=tEtMI{+`!55(ljyWM;y>3lnXzTq^#988+aM0+-5g7_bQQJOE*eEar8Wq{qoWM zdg=Mm`IH?+^t#m<{3XLL*_#WIljb?*8+l7D0-=|NfUWX13ej-%*zlyo1t!tyH8YVw zl)^}}!dRff=x{N{x>gk2`eDEMwI*ctU2pWXOsu!VA^hz{I9%8H;Dw&oU~u)W72M@@ zE|jbE&AY=p1ElNt4Iwux#nuo8{`GFoH_BbT7yjIBtJ#>PqayOByPm*RoqSaN4fVA%f>;y=Gv(@wDyRJkGrfVYt@Gc?> zq0tigch|QIQd2CPCW*8qPTJ(i&@rOnGb|h`~KSUK$Yst#@ zP9Qy$0h9db%TNyt^u5Kk6(v;m?)$GO)oDtup9VO1#C0nlxtp^%;m((+K!!7E5xOrRa|6sO8|WV3YVcwkk;U?vom zA+t^XgUIdMZDY_($h>?wq4C#zcjDMb|1fM7JswsqlW2;TJS|LKM+yt8wM*5y&kRG` zKB*@xUls*+xzLE$rR15Rt9aL*FLzrCV{7=E>Kn2`DYlS^nBbIgAN~b_?hILcJAp-;>YAJrSm2%6`5lWQytpG4N>9S>jUdgZw6E*hR1C6af!-f$W{a5Rs- z+ItV~_tPNb-dJz?ucU(Jnrra!kJ!{lPW$x3e*F#;UkyxQFq6_e4vVFacv0wU*fiW~ z_g%S%<>ry=aAGLA$y*_ku!QMGgx#aDJ$P`4MlC^M4OxMH)pD+|QgYM`nux3IM)oK{ z^1W5*LoXX^BS>n>m~VS@`Qc#I9+PU-Lb~(!7cPc(6g~(A#>p%TQ>nt|7I^vK4DfzC zB+P(98T~tr6tY$RCGYuE{QY-Sx;J}uE>h3Tz*gSoE0#D<6LHNpT{T)gdb}KP+d6&8 zANbOv+lFWkdU^}y7|3GG@kafI}vh{MQ6eJpCX17sdgnr_H zCRrc5c^8zyKWJ+_l+9}Mb;oDFvYhYow~6?ws9EUv$6ajsia9$f)1$Jy&Mvsl`s|(_ zGiF9?hn3yza3MBfI5G1vY`lIzEBXb#9h&yIcAu+qbq}U}yGxe~XV)irMX7SSvx3%n zgDL~;A?Ly-+(-92e_PKD@>KLFCU2WWb+~iK$xhA#PtFg+()ebMX%b-1F$Gr9tVd%w zP18=GJxHxe%#|e9Gq1otMu1c?tmT#rS!l*#SUgyV;0-}l`z5WFWLX*jy*-K5MJ>^? zfGM!NOJV{rb+jmsFwr7x!@CS(PWVja@by}nt6Xr`j#4`Kyt#<5H1Id~zijsKGeptC z9G-!^ATSUE7zh9_*b7xd!Ah7Q{QitCi8;LW*4u&)7TDW1ofA2 zg}8&q6*upEp&{=z-9I|BCAk}tI^4*m2zNFnJX^eHx<<~m#3AhU;tSim#s;l&LR~|o z3Wj<-))&`h>V_9%$0=wh1xT85yGkuFoZ;7TG?Kz)Cdjlrk!U5?hT6M8++iSiL>myx zed?T&hc4;>xzPeK!78JQ4^J|ihQffTXv?%?yRr==v5gDPpnk**N zGAmhLK_PST1S}Rqij7lquD`mS(+R~RGb#$3F-J6`1X^pZ7LT6nuNm(dd43Igqm`We zz?Hc8>O@XUm{t>JJARG8eA$CJ6OJ{qD+blKg@ey%Ki%DWW||SV)$7EBi*7vTj3g_{FvCu$`UA3Qta$Y;BV^f^G z%yIWviZj$big3492JvXLAP~=bzJ4138nW}!`x(~C4ZUL@;-MiSTV>9g7}-8)<{w!k z%>kj~fbIN}67I+ZgjQ)}4m`g(Ng-*1yp2u5tflX#Mng_^Jb=@&bky$0G1R0Ps&T60 z(Sj6Z%T=wI=)L3W+MPzk+tHjFij z%c<&~ZS=qw_Ibw^>15f&#R)=e{%%moPUs+U;NTjc?T&X^|F!N!o|01DXilV|hjJ-b zx*<=m!LV{AWYP%DC1kQi$XZy{+F98JI{fW-B^N1hxR+aKmQC@hgUPGEXp9g zkB0miZ9lWAFdb&Ej!$1j=11kk(_1Td;?!Bm^(_n2#k^ZHMi1(p2VOiDO#H8#l%vkW zlMdG)&)DC$M8Q(fm%}tCd19AoYeoKCtNx?AwL-h$*aVH~QPSVZ;xriNuMjS5e zTOL<*4$_@s!{zx#9b$hwpj>s+*mi(j)grb=2TAr%XOXS1+8tx6CG+CabvbM%!u||y z^3=8I&;4EV=@;LgzqC5*=^VQ9bn1xc{uI%If3OSpJP5QvS2vDqfijHxJ>VSmq+XZm zRz3OG`gfBJWs81SUlHO0`S5GsEJ^fGj$b5!ev;Y+4r?p4%Y&Uf6ogGV0Esat+{At+b5 zAz#lQUNaGEC>+kT>#?2<8Ejpt=hKW>pT4d*iea40Bg_i?yRESJH&CEIG#IQuiyNhc z$Wozg65%G{VdPFsBB1HfPx6H5nbjd&&w`PJozdrj(is>iO9+%eFlsK=Nxm*P^xv;Y z$>c^j|7Ca*6FhB9JxZ#AT~wVcKjw{LrAptJri* zI}z~Bcd~6IT9}VlU0YB*NTx4^davaB>JWsO>93zdCjJs zWP(WqFvVLPcPduCl}WfQph}rEg!$?r9dB{-|}4Wpzir5=ZW$CRSv zsuL&A?8|q$))~A_Jr5KwR7>~$U=LnJ%dcRYbX|U^ssVxaOaGh)IbHDPI^m*ViXRw0 z6yr~^;-tlUq89b5WZ}eRZWEnM1k5SHhLb{dodvL~?zpd%7~<<8s;rQm|NR|JDvKn| zWt}}bgK8Emmv-HBBN!A3RDC9CFP>m@h3LYzhU`GQGXAYEtiM9FV@9~0@w9!X)sE0Z z-_(<5zs@k=slE%J0A-ZzY7olG@Bx<6V}g{@=LF_9t*4&Y-Fdfd*y-SVyOrSF#OW~h z*VIJVehI;%HXj(t!ACMuNb#6?~Th-~Q&GgfHuDTjAm--8lDO^q2psm-!z? z2LJW5`Tuk=mH!Bt6Gk8Y0Kord2rnEFgFuJKrSDsFxbd51!$51Gf(;VYpJ*U3v2Sl* zB~a{6?8=!PkRbYum~%6;L>}W{E46WPVKD#c`1dFyQ{SiS{Yy;%J3;5jKLnTrJeaCK zl-P?vw&fJnxjCf19jF<%y4b!eFJkG0`IKzP9{rgfV4n*kd*IpiUWF^j=`%^O zwNlt>Dwv{p>I2Q&1q*Mve0wW%Gb%mB13lW?XA?PmeV4Rqu`+V}S64prbxn zkd`izhPoJQ_mEo}f5|%02y1k#{x_Awbu*2T<~5H7htL`OXHY3TV3Y|P_y?grmE$(& z^!3JvDxM&$v+Za>AwRedqD`$2K4zBac*+~>RW_4Br%0`s(?SJb8@nLO-a3F7VV+m& zq|*V(E}+V+hYieZ>WjENJ4A$G2N+dcVV&IJVK<3OfEz0rK>Y_t00I#n$M-T$U#kEq zW$(s5XU;uLm}WOHTNY(K1y&k`Te#TUA`&nyR)fGVc*KUAD^I0N8E&l{8&bPTpNYj*VSvTXvd3G<(BeEq&@dJXIvFM0bZ zV0Z;hV|exM%3zvbC;C;_0(&_lx&~e0x`w~O{WRID=b|+1U(B{!+lD{K8zaQvUfXte z9+A_jOlF03{74^k!aP-pe^yEMWH;0iq0jStKO1Q$8kT?*BSS>~80+KSZcG}6IwiWq zoq}|ZUNNkiGm^y?)pdxYE(_Xm{3%A42pR)E^!zbr6VZ!XT3GWij+D1n*(_%G@?i@T ze`i=tzhiK&Wjj}NXicw;p%TyJxVA#Z`D&B-hi5UYNE>Gu6J+m}C(28-+wt<1V~7E7 zRtM>Tncu1$$=!;ZWt-BzpiC2mcWymvENJG>Z5+L;~hL+P{(_$<4HX?5Mj#$K5R3*gE-t(lh* zuQcPZbkTW~ec(uIY1Q5J&+fWju?f}fcLhZ99Y^$^EU6IW5p%x!YjY5XxXj7@4N3y+ zf3G<-htO?MUKAH|LCK>zClLX9HY^5;Kqv%0Ufm!vV!pW z{0({r`P7^OL2P&Ya_W&3(rJ(km{rcT7MbB^`RD_?RB}FFo$2iDjT81#c+rYMQ1p?? z2Aq?YjXFXK!KI=5^aViFsUe3#}F&zqU0iI8)qppS$S5x0LnwSJort;^UMFEVHh){A*0B zqxt32Mr!NU)PA$N;0K%mu6}ul5vw1u7e(5%*j=DSljvQc#XVt!kv3Z)%-A+um-4K? z93(G|N8koo+ z8N07f;f!5cNKerX&Kinbmve%}6}x8!D64CZJ+iUUhp&+c3>CS9cU;peJ;rt+A%k=z)1)%0wb(Y^ z!(ri=I5=FDkM@(PSle`%V@#?&Np`uijyk6IJhBlV(7~-)u3p}>NAYA9=h2upaTj*s zAjL&2AMt%mnMS1}wR?DGo~678Ma5&Zkzh@y?Q36zZs}=N$%v>GZnQs3;32}e-4PCl z(Ffg#QnCF$v&}QUkXL5ZcjIJkfc{j?GpMs}GBdBs#vvEHy&(Op%@}425239cD)Uej z`Zb?GG^5|cH9gXSw$MKg=~w^=Z(nV&hUBWf&w?KQTFN4;locheA8rvJB5f~6pBXZ^ zl~Y6&_~)dQ7L!s;%;Hf2X zw=ackzf5?JBhL7XnRb__fy=NH6;zMCj115LfXCw&*~$02ld3pFHF{xUjoH2t^`E z|1k>7`0NE>3#u?ufi?b-qC2CTxwH1sDTpys$o!TTXK9Ic7XBjgct|sPTcfU_u{u_T zc``WSLYCY=P%!t1z$JF&m_X>0sCUmCF`w@d*6~H&7~-n&bLy0Bd9yYAYlhWYtZ150wTICO5bvT+zAmjengZ!?A7NDm?h&O-F>FTjiXaiRaB8Gqt^KYIh*MsOM_2`OP}$4AIM+Rm$i z!x$5|@?G+WLRAR_t_j}L|IyDo+H|y-&hZMKH>%M`dYs#4=3aS4_1?daze61^<-A7t zB$IFwwO-@nI`SA#7&8hcU@?0TRE|pqP@KhrNzlC%L^!TFR!!G_eDn7Bfl`rt&a^5} zM`|K5ngtVhgR~mY=Acu>DZ5Wma)eZfbxR(kJdN9s(AMJQ>)(fImY_$ z3FH66C7yrj)&BtqKdtotL$)4MEB~qU4f^Q4!$iht{I0AbxtC^oRj>86Wf%hxz7v5wuE6L#HiPts{ASET z#Hygtsb6-#bpnS0##*t2E-^}RGa^tvQ;B*S-YW90!)v=wOMqE#5=cT5o%>SL_w*CN zv-{fd!!BXQi!)GWKYffW_b$0bH%u8h>rwBf?On)O+ne%tBHna>-t~z!HQKbDRLk$> zjBB^!(SX0*vnfI)xo}}H5*83ZfMdD>a_}1B2Fwu`5-X-E!Lo0t9WH0rKRv|8(H*DH zK4&qQpRnS;f3HmcJrVyOD`o%Ki2C2BQ>8bwfhut6y7eGYmV%fJf`zPS1_0NI1N!wv z7=|1S0v$gNOniQV?E9l%XWi0w8iUcY6{#<^ST$9hXH{+GRi+!x&bneT9~rNk9qz2D zUoJm(4m-7{`JdJu6|;z~SO60bQT5qLWX+;$rL#-IiaxI<=(+&mRD8hw zwNO*yiBz=S{WYcG@MglPaYz^8G3g(iyl!GBx18?nB5cVk9S?*&i7eu2G@$FCZWCWn&q zB(0)4XHv#TLZzlO3R0-`9uN3d^$o(B&SV;UslOF{USv?-(edLtQ0}svaJ> z@bnGh3fDtNMy@Kq?(D?=E5B`l1S>zs>>h=Ob+Gwo$~u6)N##(_!(?Vpz++t@;^j*rVZktftuh#~wjaHc&`q^q zmdQr7J|5&UYs|?{m|Mqx@3ufnh!(AK3LEXF%qP~UkiLsUU*ewmyE$*%V)I+P63KW!<^M%|*}9&d*VV zA8do&78zIkyIZ@^G%vB={{|}yDxH0x8vnHp(YFvhFP^9_;xY*HPxy#zBkV&$<+ds_ zDcWCAg0rS5q-L*3;^CKMlblbGD!Nw`NKNyUOBK0NRdHc4O{3;bXW2+-P^^RJXW@@w zXjhK6Et+5{oKD!_XVE^K$q%OXOsh+#elI$=851Zvw;KCNxT=qobLv|(A%+y^50lL2 zu}|4QTGta3IBH#kFAIanys!8TPkfh51}T5o&Lcvy50PgrffN=Rl?j#AxF&Z(!f32^ z0kWMC@HPnBP9iIX$`Kb3NoGh&iTjDLDAVg!`la_1$ka%hQXI;ti)Tm3i!yA-aEdZ4 zN0h&%Q<|sVY5=AlYaHT!A2=ZKj~z2FC*0LEXDBpe3-@5A)U79A6zN!uiM8tYQ zkC7MYNarM_-nyw|8H^pUrDCwHhZZ5sc#<1xOGVRoK%CTu5tg6S1`!f_WSBURJ&lgm zX)Te}PS!1vo|$w?WRc( zGas}T@l7Wjr91djGv;h!&FztR=wy&F#wO$5vT&~|_?hN+=*WAZ_Qa^WtvKI0kensn zw~WQ8<2mFLS2OQ7BE%JQLZ~f6SmDuvm*cp}SXucas+51-v16L}f^9J`T|}4B`-|T6 zJ53mKqQGlG&stB+snEqK@j)bF?%LuWc7beVIU*+%2oDRgEZq+w&TNXFR+Gi~GJ_hy zLlvDdMM=5VNO<%uko*9HwrDC-tuC)4uO-hU5In_fxjjr7D=~@A1}D)+{LrsBw@9I)t<;M-JW{8$!O{h@j@4P9eC)=_Z))u0Nu*)fBtS}`T?)7=Jy zY=8jW5|Cs|X;)WOuKmbbECBrB0YGAv7qn~@R$k@@{5)278+{d>si&Ib)F`hc>!~Vj z5UP+ksHn2isC~!c$MJ4@4d$-;hE7_(YiKSj7WNb_$lAa_;ras|{Tk&A(>mwJdaKI= zf4su!H{2|+hgie}eIwa3)O~7gv`+-aYC*|-P|{4nENA6eXy#HkN`};n}xp zP#-Mr2I4NWVmlQulgMEd+B332iNNi3kUBf9MUlFsVp;UCKy^ls;2^Mo#{4kfWvrGz z$$cQ)-99dR;BAkV5st!SgF#Det}VZ5+fu?JkPQOV4;C(13_<%60fwKYkZcEL2en)yaB+pLU$}ySZ-55>2%#(qB6-F#AG54OUQGTjQKD<=nIe;VfoT_i`Fs>RZ70tOrT0>bbQsLg9lfIhgyQT2w`yv zvSM3U214VW;qJD{>v9!3(O_aIL02_KBpCgmig@m3dD zi%DsUg_fCwxVDe&Nz;}@?d`Ul7ENVo>!Dsy8}+U=x~Su5b9cI>l^0|376C0?7nJHE zzAXmfQsx;<6EuYQW@xDg%B)**)ER54OpX};l_s$ zZD_N7;DPc+BQA5ZbJ;i@M9dX$gmi!BF>g@Zh;c93#LXN-C+9tcIK_ZXAnZi)7Ib=@ z=?6S&;OG#PIbSeA`8!5aaqC>zhg=F5ijt(ycIqy&5UZ&!|M88b7 zf50p)R3Z{0z3l%f8iJ99Dr|)vuzfY<&6~?vJ*Kr$VvtALRZc0-P>Qp^$upkf`wYKo ziQ>|48bcl&X<>LCaXV?@%sX9gniFrN<>Mh8#S%xvq^1TIS(whK9TFBITuiK!It<1Z zFEGNzoYw~#w3N1?c;f9QuwJ_6$cajv?%W`>?&y@i@*{3Anae- zO=YD;S-pJ_+KVW_dBCDDeoGy(ssayvE{t}P!MkK%&~-I}l4j`m9I^NAq|mwl=N1?z zgnFPI?=6sPqatdiH|Puu6>K#0c`k2v};d0WQgW%rf3Blz%k)exykcggnwz z<+mmI$|^uUaoz+Dx&^ zFr?M;F)M&?%cBg$VVqTz%6JRTmt*k@s76xM)Yt$H){&}j92I3&B~sRSPrPuNbs-Vz z=#LoAO<%_N;lLA;7z(4L5|t!KXkF^UubK06t4gz)cC?yxFI9~rHSu(?Q2Z#N{U4Gz zK_TAKx#i6FLJw^{9=AY8(*B~kxLj88qQ*EKy>ugvR*w?rDAG`w8qbh+lBnurmcm9b z-t-7*-ZJAqM5&mV;tX&}i@AYGAj=u50x$^x5d0vtN??w1|NEgXTA4%dUC{DEWw@D2 zxgXWbQVSe-WG$p+`3zmCNpS^ZCCMXKT_PZzxv7{Z7$;F^jtG%%R1mrY!*?82#goUoQGszm zkeoyvovP9~@fc($JF+@>fDyDF5J{sGr)0?dNL4(~SValD$&NX- zUqzV$i^{Q7uA@(MLq~}}h$1}PltV0zeM5Ed?*KCnC^ z0pwYp<^8YJ5Rk>cE{GKnw-U@y5o^x~Tr3eQ#e+yAOh;A`Fy9DgB>H8fUo^`oJg{3Y zL)LdQ#0lR|_LMYP%zA`Hs+*%}c$b&hp=>7CEr@uF)B^h+e22!^mx!5_nUs-xCj|J# zt3nr6I1=Zb!90LY@;huP<^*aU`2?pkl+w{n67&t5G!r4{YgyPA!X|+&%23=$Ss=u8 z+=Rtr$!D+&Iivj|V&+H;-ME>lu#x00iCO4UOdNNYjW%wJ@tM*P#w3vABA8kVk{b>} zcwQa?9}U5BS4o2l(D@f1e<3wvU5xaJ$qpG#QzVJnGW)^RRSg12>L84e zr;A1`y<#Hau{tS(=g)r7dumW<!rd+_@sgvlYN!0wanCODVs_eA5}&)PZcQNiF=3fK z_q>1=f{kdm;LRW}C)s$+}u6;1CE)pK=R&(KGN_vUyy?-db%>=2&ZIix2si@e+y zv+RDLmSr_!qxYEEfv7D?maM-jCx+lbbi9j!`f=`|98b^})wD zxZ^h3t2|kMxcbA}P8=ERQiN#JSzA+=K!>1&!B%5Kv{F~)VySlr`*tEhC{a)qxc@ZP ze!zdfa(VF8y-Mz7%YRn#)Ui6bkvYJT=*jKi{TA$g;BT=pi1By-WoU&?#oE&t^Z`Kc zg^Ay#h7$W8BmrJ1r+cRmhEPclB-Y58g7wyS;_`YV$df z-s(`R`ej0U$GNabdGy!nrYU{h;IXP+B0daz_*eBs_Gbm8Dv2Pr@VC<(g80rTp|92J zk*_gZ<5$KpuJ`7}qSq1~=k84yDsOP>U+q`2ZAbX^UP`~sio@g>&#ajgS_Tw zv*Q%@4!Q4S%X)nDUJxqXvCj5;b462lavNxG$IMIhp5MJ|sUwF&e`F<2yRY_(Cb2nB z6JBVT)Xy=LO@#H;+hBDo2UEesSzf$@Zo)gPo3)-TVz;^;hsq?-a|W7s1IF}Pr(>q~ zN^T(;+qH8|Jj;Im<{g}!`~7-Eb+boxR1F(QOCWXd@S53v4r`(G8He&l;kG(|j)UH+ zVX+~gP{Sk2&<})OE@W|838oDi_!)~U&X_`pOs{`m*J(|A3JjR}>w){))uWj5r-Wlx zmyKgZ`0i2`yWNi<%ntIEaPWn?7CmqAqa;ec^hQSS5z2F(RzIoQ?I3%#hUe^a+kT)dCPplqqiG)7+!$$S*b*_4l43q$w%iW{rA%EyRr6mW|E$~g zcz3j`{|)C4e#2ePA$F677<(e?@{0A)=?cQI0_-3=?1!-vqr!hA3A!Cb2fX^MIO@Hi zy$;cS$V6wK+`t3Rle<~4*L`QGew2OV$kArTkb5;qlp#U7RSztqgAD=xY*V$>>Kuw* zfKf^Ab#5FSvm7JXPlSGk)pL&-`hz$a$yea3ZjAc`0zWC0(zCQkQ=ez=FHg0mUE|cF z57pmU;L!7t~-E6q7jH01$SflA8l)t^Et?ZM7*^jTdu`O1s1 z7EO5BLyz|*SbcvC17|!`_O|j9Bz7?8|6tdxmOm^)xi$K-J*;b(=#V0cl#7n%pOUhU zG~`Tv@4!^*|Fo)+iW*0^x9`;IQZuj!)U#pQ(U;2!-u5R_V8tmzBqfM~5;=0YQPZ>G zO8e$j!~ys%3c5tuc0us+uEh<8X0kE_Y_<7w1F>0!oZ^tdZdwvd9%+Ul9D{kTB&3 zfpXL;BfOh;i-l0T3!&e9ffo3$N=f-;q3uHib}c`N?}y6#{sLPUs%J^yo7KLw20wk4;ZzDjeC~_xZ=YaS~qlj_ouydliex;2|&#d0kCQ%wahLxfb}{8m9CBMV_^OvO-M zfs}WnYD!O)7Y#*!*1PkXRxc1gPoHU%)mwMbK^Pq${(qe%~`QSyen1$WpotfC-on6f%UGue< zXb@|u3QR%>)!sj_5VN3dK(l9UJTqp5A&Fn?ih3jmK4`@t*8%YMM~}+}+QbLq!FXVg zgQZDKAbEq0AlsGCKoXQgBCS{&iCX7L%bk|ew6U{m&LM@hC)1H3@XR48`9kIQw=yrL z`>mp1%32}IB`>QVLBKbgYRm%ft}vhNMKu)=;>SdJ;PY0;n$$g4s!w2BVH`;pqWdSI zw*>0YqTjL{(eBX7RQoY9sds@MYSbYN@7X90K3h=v06J3~wk)3G$kN_dN2Ssssz9jJ zy82Oum^p`jFLB>oqc{Z|+=3_7Xw&K`PQkzH%cM=r(5h^SctyjN*l-`-w{1 z8WQ$szB@YG!QeksuVo($>6j9T-B-f-2+eXpBZAS1?hgIR(rr$Qvf_nf4u=(^GL1>4 z5(SeO8F4o1IWJ+QA#h9JR6`gd!hotrt7sG%udv578oSDqhn}tDX;QzD4TJ@-@WA~x zjseUP5vYHA)g95SrDehAi3I0VpIT7m^)=kY*4%H@TkE&938jmQhmOhsW?-Ql} z=HH^H&`yLhgMyeSi7%`pZ7j;rg*F&B7qMQvdDefLM2UFemH-}kW)9V7RS|L@5HI{Z z8tKgHUo5^$%Zi4Q(Ko=uQ=E;dv)bT6TttQKOfFaBg}78+ot>I<87Ku)Z-Ph4jYL=EbOfEauK^J)ovIt!{8_+&$SmX z#j_#z7eUstnDQfw!a3K-%`ud;NRfVo8MbbyOL+HM9nJB42E-tOa!oa9H}%Yja^W2~ zB3PKihynt`u2(BwG;0IAF3ST7~!jkx0DLY5Q+T!3@NOb$k)|c3?SE{q>(qo>Xj%CWR=%DOLwcH@Jed&Z~ zUEuwsBv+OF(>l@`s>*C-!GV+b9^-i>$8(L6GpvBxsR{8F+zvB{Cc#q(T2T!oj2yXP zmrq_Q*(qOI4lu9bsMXPt7U8NiGvr#S8R4PHEF}}Ce7)w!RZP)jbw-p<;<6E%O{~IB zZ%A`_5RY`$3M*rBfRo;LE|Q`d3jJSauOywz_PaU9K+s zE!$R?t?6&hxiNQc#GIJe8L>0}uKbZ}=UV%Dkd#@u=IMFbptJ+^$XbJGp1fqq(~DiY zYz!a=(O_Q&^*>bL#o!Gm5qU_S8*=}NMfmSdlj!bnZSWQ2-sYDk(A^87CeJNjmnO*U ztblRG${mNZB zAjjSq6U}H@NtR$s5@b1$WC@v}}{CN8%YRVZDD#LXzmQc}+C#mH8U_q}=` zKC@F_H|OS;5V_-4l{n&L(h>v>R3AL@>3YT+#~~iQ4@ERv8k;D;A%Ce;plnw{&pF-p~1wGZ=Rto`8{@0 z=xFu8jP-1&UrUjlv)XPd*_>#b$T2~@th@p-7JqKa0&0cJQv#d9l1lBU=f&{ohMv7C z98%g?-qw6^ey(mPIsGQZ$_A)dqHU9Jl*--=O?MLM(owaQ4bqbzYd&+knrU(Jq6J$@ zlP__qm?^c_=Pl1|1v$_`ryZ9Y|M)6v-;}PrHf~HQy;`%XA^gbvi z{&#FtBPzsc;ZjGl-&P|Q1cz*)EAd>}n!0QiYwiSwRI_WtE$TqExT6(`c{=*)ES~A= z^6Aw!j^*ieW)=1I(OeD5wN_V}S9v&Jgi{`tctaRbZMF^Y*e&po{*r$3 zA7jQFt9DxMyq_%)nVEfqjC~90Uq6m@^X>ik&`eopO- z{w>cpEJmh%^arXdUJ=DlUOOJ?vg{mBTn~NJbv$()oD)S|^o^zkz~3h{Q=t?7`*vP@ zw|a{87M#pez3u_zy7iiYcfPuF`|rf)Zum;l3L>U9z}8XeS9AwFl^(x%1-e4wk$(v{5hM=fg{qbO zgjA`^@M3$1z39Q@d*XPPczjL&9K?-5fI>L+cu|nyyx$s)A2K^z8>S6VB#&Xr)1m(XkYTeQ)Na+H6 z!yFEQVnhAohfM`hIP&#|{TdcK6{CY9)a!D6f<4?_e;ie(>*v55-42erM97T2V1rw5 zS?y{7*WCBi%RRdE(;5^|Vatt7&5T9vHTf2!W%N+t67_jXeZzVuq)7%dyWF{i8Y&k| zZ6I0;Ku*YS=%pGHg_gp-?1Ow?Gwj2*6=V+i{G}6~U|O;X;tu>-jY5oWm+~ZpSsQZ= zVxjC>)gP9?D3lxrTHNn|*NH2)uaGI$3kUN$$b%{u|^k`y}*D!D}S+)(;q) zwhs}u3)DIk3{qv#O3sK=Wr&qqGQM#&7R!sJ_AJCw3>)AZ3>!g)iX+)1zAaFJMHo&W zv+P;il*h}byZW8rbnH()L@N7>fFv$VQxg@W8*e`?tmIZ0_8Rdw-)PtdHdH$cqP>Z+ z)1>%ja>wY1UD@<94%gvsPohXY0DB%(MQl`EZpNoei+T`Oa$qsgBQI9TlU1>?P+El%;l6|YdHyw^C)>5gCD1z6kXjgxsQ?}|S_2}kJ_&UQ%Z1Db0U*ket|K4ZDUg_$4U z?<7Gwn&2Kcw}w;fa)}L{3z~b$0w6t-+Kr>%1Tg^&{>WL@iXe*@j;FQ_DSB|qRI+99 zr;;0EDrmD~X7TS7j~w9|J3uo6&o5CLZ#Lwuh&|L-)?-UM56_OMR>Q2aK@ny`n!6{F z)y9oj!##=p0NsX6p?uoaRchl0f=RRBaGTN{4ioFedSdPxyrKI(MBcEH$P;)|6K3j= z`#J9@dpwLoXpW16S0?7xvc;(}GOv2orS)6q& z^AG2D1N()Z53^`1>Ipyq37Tb5%#xS*Tb@33#X(6h$)ZqfXMO3L>1;RWap@W2SuuWzi^Q)2T$L zl8G}n|HZy8Wu0ubUQ96@Yu+g#`$v4ukn|&?LDZ4S-olsURF`=4Z?gU6}w= z8?UZfU)5nHRU9wh7|V&{XGktwyReCocS>&d8l=r_Yuy@%Yn6WUOqDhf!9IJJIe$@P z{Q?7M9-(MI+a;i!7u*-wY=%%EO>y)}AeTtiK^DA$m3p*kfg~kAY~s^)^XsI5m=8$lM;%#=;VS9tZhsN=N?y694THMjbD*V*!9z#v=cT#TuwK3i6 zR!#WM;PUO&C8$4BSKhyKdH1;)s-Y(Cx?j7csoV?CC+ga?{#O4|v^U#thR8_phF|Ya z(hGNIy6di7DOg}S;@;xL^b4Qq;QdA9i_c)jU^neU{O6>>e)(O-YuE>dKiD@~AHu!I zE$1uZ7iODpc0m8mUjCiOYr==0(G8Lq<+swq5m6N1S0ncDH$CNz;t=~+W#*(HTFmRt z5boD+=zFH2-yhd9YF~IwKvyO;+WAlwHOdfWJKWPq^zYaHq6$|KiL()RMq0WF)y39pFbzX>|A1x{>*TJBqg6U+xicoUI(mbIzFa&x zl(3%F%R;3VE6FAC6`W3lL`K|jnYiPUNjIa5md^jwy6{9XZ7O9Id!vTD@|8ivuCE9( z2tS8_2Q*(0Eg`^&MuP(CzxsE0@TQjDh2i*Ml-xz#W4i})C>$@~gMdjxrKka_uYVpz ztEqbC3(d?kywEYl{S>>$7XoiB%HE8>L2Mb3xsDo1ZBR2m=i3c-{8>NoKXw$j+NGY) zkOsW$9D5b7LGjjiMe>gqHg=2n9dDDrwhk3KO2%$*kOoTa9J6MX9(-f+(F^da62_(!OmR9ii^n(k)F>u_ycHOU8R^xCzvkI)_`7pFmy0r36 z7dr^%NN5*wM2XlShAD5R4bWkGf=A4V2&E@7hO~Eun0N@xjx_S-*E>EGFaxKBeU@!jHO9MseF`(W8u2wFX*c^4amqXaK zYn{BAO_Nc%gJ3OCAhDcgCQ^=chz6pQEk*EAtwP0y*E7DYe-i;keIVaAl8ryEw65-A z*AgCG-yEGnlSacy(++L+_UJ>hrO-Nnz`Hv#mu%gNP3A=L*8*937h_zCkI5A!msqz% zxb8Go!I1|ZL*J<66tY;{Ba^tvD0(c&st8LhX1n3%Ll~TRK!*f;D1$NbCc~Xk1UCF^ zB*{%UHsp2m-c4`jA+sDK<1J{f63U+F=;{ZM6`*dNrdt;GZrQn|8-tQEigc4(2hP~ph0XKE4X)Su@Tx$X^~%96yak{2)&VNz zCmMa~0*#&RU^-9RVj5avv%K8kbGo_I$jY)jG11U-TMv*Tzx7XBx9`*zB{(jBb|v?1 z;nBJO!iH`(c+ix)Wb$!PZWAOPVERFd|<7&aS0eyBU z*|#k_M@2f@*;&=!J{!Be8XZIn&(~oy8Zl6bO({Bi!gSBbq>qktm;F=m@<19QtRik! zw%{$;+6P9Pur}XG_(GS+CW3}$2)#(=I4NyK5nSOs4|E z0MP8#t7g9lK*427c4AC$-=Xqu(#>YYUw{Z8`ofED7c5=GvPa@9W?m zjp<(V8x>((9sSvA+Uf&1hK|e*%Go`h=7C#N|3-qWcH3YF?WFk1j9(-|$Ji7egOm7q zp_)>=m#TyZ`GA2%zURidYH-+Wojlby8_dI%$_j+-f+Ei1kgHH%XDUB$x^9fzYQ=>7 z%Uc*qSSkN0u9glD=KD8;wZGa~5{d zOqMQJfmiSSCHKKhx7XJiAxAIXaQq0SY{|auLX<1SN$&O{W^|@!~Ar3%a8y9`|kjvt?#UL%2FuH6*T#;Ezm9KBn|JD z|FnR*qcSewtM|Y64`=2i&>Dj1gkt~|>4SxhY0ihtn5A=mu!;TXX-;d9QX7CF1*aR9 zR-&ug(@};)isA7TTO7RKNB7hX-K#Hx>BY3!vuMma+jmVToiRMyms^(48TPd-f5JRz z7B&W>L&0j&-Y0Dn(wj<;lwI|9;^vjq8(_rLY_1-Xa1ZGSx5Hd%+8Bzn%~&1EL*{Js zGiLJ<-JB9YYj3z7#(YZY$o-`KySp`<+ud%t_c=u5)!PxHi0pB%;)K*E#y3=tigeE_ zMz_NVghSzdMKi_<(6~IVkLLeixTW@nOeluBA^(=! zdD&Unhsz@GO{Lkl$ztqH8XRhOPJJn-NBvHg9eTbKyDjDu|B$T15S&~XV!AVKH26vB zpEkW8*sYJB>`_?Tq0jnT)cLnA>}&T_Vtujco0NM>{sjGN*u%JkY5YgVCCN9P&%};t zfcylAPBMN)=>#8xD&kz{WT6fdw_Y~2q$P!Oi3aVcrI~Y0n-F0!Lz4KqH@7gatimE= zVoD30Y2yx4f>h8y>Gw-iO(-Z7F z)=UR&VO-oHUy6EiA1RwCY-F7nGocE#G&3Y4>m;6>l2kJ!W!gwU@=qzG1i=V_@6TL+a zJVf&=L+z*8EeG(pPrPCIv`ock$gtSdKodLd~BF?JK}7W1ufemX+I zjQ9b$yKq!aYdAhfbD6(jnqtnR@+};M>1dgyWvv_$tApV>Th*I-?}~wRCIt?Ei`?Jlde| z7M&bFv08<&gs^fRoD%6Xgv$5`-^S1i>iJNd&3=TBr7`Pih&0v&|7L~8aK@m|s5VN| z12dvGV6xez*M>V8SKXCZ`_VqZyvex2bNr%rTCUL_sLU+SJ;ehb0qKw0h> zb?qqk!22?eDQg@(W|y1c0ZGPoMC@vA`^O(R^$E;IG|IJ^#cQNdyCvI@1FL^KiI?k0k0F5P-Csw8rsn|Ze5c93hr+obN ziMeM5n?c zreK83?*{+4QyI(15KZa^Et{+^l(7$0J>+m~?OtyE2JlpO&K*@|7GzuHcAY$mi7fJj zdJYH_{9{Wfj6q@e^W%T8Vh@pGXTcYb15-^ROCp7qy0FRCwG`M7?BovHS#WZ5dEyc| zcQ5US*0w@7dvPSjvyHmDA#Qe&}Ebdu7|0SLbBaI#0tNMXgm+b%wZgZ>K|O zck~X0t;~UV!iP_;%PYlX6O+n}Trp%XzMis9;Z6f5-E2|@{O^_S#)&%)@IRUFGYQ_UhKPOb#loI zfs@WmiRZ#W@qr zABwLa?2022Fgl+)qByirtc%OE!eT=;d!>-gMH5#7*|O&LM9LpTspB~$D~lA=$3=(C z=TwZSILJ?QB62$YeAZXvhv(PV+TH;JdZdE_lN#3<8Tn-1iPG`maznGp>C<-a>gVi* zHl)cDfMsr(uDxCH^`79SeMM%aURa1b4r~&G2$(zhOwyfTlOx^=$?cFtUm~vy(ZkvV zf;ahwXCW4LepY#Y4JWa;0F}(Y!j<5s#ViWVU+m-`DQ%j*_G8iyx9;D zK>m$X-c*tuC4wqSN+?+|kvyMNT0k`U14H_blYAUYDw!#X+(7vE2judYL!pE}6vCYW zW3sE86sr6G8h-=H!%4?083A(`EpY2e{_DN}JJp%ebdOpUbmKI*l0O|`31Ot_AtLB-0M)cK` zhnt}ra4y{G3>q4dZHjw{%Ls8MwKqWsA4-#jeOkx2%p2!X?!SCH6zW_~<`RQl$3R3c zV6t?WPHSHal`arOnFVDokPcddm}Mu!#MgtJ?$V2NehQn_p|SpYZh^+oRKqM6l?p7RL~nL-dJ zbeYM~HS<;$gJ!m!1bR~OH--2!-dAY9jX7&BavQRN^0?rybxZ8ZxS+XAqWZWHoON)m z3i;4L0L*#oI56;4wbcr-_D$3xn=y+SSSH&~lYO1KXG@@yJ2I;RGKN^onq@Fo72{1- zI};Ct{o88AG4SgeJLftw^Ytkq+o4=!GjJ;-^~$a6z0sy~;?IitzN@TLXR~AH=sspv zoUJnKL5tT6<|&fZObaBJYUZw-5vbs3R&d0=Co6+${(|DmdPTm~s1czk*2*-xEStMD zk!^?%!jid{``9Ua6ya^zbOk+e-z z=}9QKbIir05SnVFiuf9Zj@?mmX?3AAW5QhvaObzZ6k%~@5Tkf))0Q6qv!r^jEq3uhpzOeTUkh4U3#kehq{$1@X+w2TwODXd z6~>~&FSo1^WYP+$RTO3vw+tS)u9NY&c32~Yw$uMpv&3>Ai)+~e68kj54e-LHcv83k zFW@9NjC2e4Dh@DP-bnRgcNotpuN{j<=WW_IFMXsnp;oqna+Omf^(~MMeZLB9f?w{+ zWv*9ixlq2DatE~w@%U|XRru&s@Mwor8*z66t(Qbk410i24qlkHiMCp}UE84BvlaR? zAyfc?V*f0$I5!A)pFTCxg3M@En8uT_W**R=wGII+(uYQ}#uBb}k7_0e@5km1y^_PW zDNi&zgCw4q~I7#>o@C2H85ua3$vM9 z+Ij|K3%4S^A>*F&*EY7Xt(y3a`MAB2lP>yDOaj zOnt-ACSCOB56lhS3Rd3zA}Z4QjmtBlII(yo&J9X?kohrsI?pm-nNn6KX%-U3xt(%F zLg(LZG@3=w%5|co=4+9S6GC*H4Wl-9rt{}_J;o1Xi{6;pR|yehq(CBzHJiL&xY|>i z|CV#rn)5+!jrMMKB;0|ahl~JVx|bdObG+0NaTV%;9V4RlpHT8+N@lCI*{0@-8LhlK zE$!_C?hRsYrV|#f-)YLs?vbz?TD=su+QKyjZn7Fp5S&p_{K!H8w{sR>PCC{fKgcMLiITmJWle z>%2ELPlVkiJxKMIMEy|f5jUkzC?6Gm@DVLYnPq-|l3NtDtDbOVR|GVDnbFd|r-7oC zE=}_1uj(?50WjJcT8!PW#aHW^1!4pm^A^zhwlg@O`S;b0Q~NovQnJ?y7QRq(PLhx! z*Cp9+e4#8D5hnN|bRtJ2q<5#AdKH*IpoAp%GMkB#5rZQdNi6vZW1??`* zS=X$DYI4@7MaPnQU;XusPL+)b7m)~1qqa8t1q10$z>)9~vKxNV8wb5lA`;zqq>1`` zJ>L22ODVy=cf#$flo3mu?@g&$!%(nD|W#ry}KTNJ- zgS}8vM+d4G{_-C9DaCYiW@nq)RQHH^V^prd@B4-b@P<1|0a#iF{B2Gmwaqr-OGjx) zx(al24zvqq4^1TuG7a*gP<6Rk6S=v>P|BzQ{6g=q+(OhAP?s3^)kiCDX86r?22kU0 z9z&KUkDAMqQ!I1BbA3L`B7~#LKa&-KwYwoU@SBO|Gj?@0XKl?YKlC)nz$XfE#^9oKFX}8gwXf_rM!=5JyN7c|_zUj})Aa9JRP!Cd zxm7f=oDI9$g?brcYMvtX0=EX}Rpg9|k^+0$-)kEc5@*HgNu)_JG~OoT>1vBQJP>X|01AIG(9sv+7R>Dcq#CS{X|=~vpm}T z{1_E|U?4^^hedgh=QwG_jCuDOH+IW|E=sgL^%a_Ih57PADVIep47J)yBy2!8{3a5Q z*1W1(%6F+(p;T!K-RNDqz@84Fc$>Y-ziL8hdzh`B@aouzJ7_AqXUidh$_tmim)Dhs zIGBaTG%Rqa`=arfv=(t*OjV~6Zgy=H-Fubfi}#O42kYUl3+^G8_4LB)u7yD(2;V$x8ZsJ8G=fkpfMr?}x;clDe2kkA?)I@Nt#F894 zf#6T|g~YOj#E%$keuJr@6y$f-y_ns>(pp$OA&YFePBMR4=g#i;CF!5>2m+aHyTN|a zxR!q4^(!;+fO`5DSH25N=c-Az(a$ddsWy+J%MTH=^TKfdrUoT(x>BGGRP2CVzwR2# zRZSu3I~~5yx9x5Rf8A6-{~GQ@;~L zS+h~40F=TY;NUMNGT)ql(gvXX4`x6`L6Gp%$s~3< zCF>mMg~v3;Pqx81K{mY%9v-RY7zK}*=eu{?=TLz@(u5N=02B(c%y(l{)U$3#R$OPoAIB%vX7 zy$}*9T8#vy7MT7+3bCXh4&>=lV*N_LQV-$CX?edVKfLOrL}nr9fSw-#{hVS5+T%i@ zj38LmW3y4Mf8J!Az*6B*<?^9({At}kb8C5w|>B1<}^F5U9qc8X005I97 zx%R3UBIAWi(TRpuCzVTm7dD89^|RZxgvMlUB zJ7YxYvXrv9#ZMr7nwmj{c;9|9+H*rPg@7GZb`%eX>f3{}HQNs7C3XNd_p5AjbG)k3)ii<&1(<-4LIJ~!$=jj zcyhKu=q)153&DP=^kW|5!Q4qfXa5lPOG^|uz}t_jFv9GDnDY~PPBtwZ^#&-dB-3-W zLNlK|g?Bk8-zSC!ns;SaT(uUExBiUxl4u?+%qWij-?ODn1KCElKEb>U#jfRT_MLQM z;T@FB8GII(Y*O<52qdg9uzHqLszgVNYnbpxI#Jy$^-?hfI(rMONgem;hcq!Ge>iQZ zvJJNF#~^M+5f#`EpZII=HLHR}fUr7iB6{F!6PR;4Ev)Q1MY>mTT#)VS!xb5fVWyut zQVR}&+i!6|&7D}?EAvh3_I}4t4eWAoqSP+5YOTsfjaEwR< zL~Ei3iH03}I6Ac~@e;9PBKlzW9vIX{%Hz1O5loivpaBI3AAX1TGUy8ho498=*sfB+ z(G@9wZ0AcQ@;g<2x9i0osO0N>nhuNPl+8>AXtB`GR(-sl_gri*I4#oQGj^OCB(xvVZDR(Sh%zAaM5UgG$>AhxR-y zRoKNRJ6QlirqI9uIZfaSF(^LfQan2jIvkbnADcDOPH9(ZtXvVTmOd@7L7m@0A5wd7U|%HiiyEQUL?=CdcJnMdD8*7%S_l zL_;dZwsfI5f9`p!xu2^Tg_oo;O_QW8dZ8`dNfO1bW%&5RwnP&t*p1l4x(xFZk0^~2 zSngNUy{zf`I+yZ9$7drz0pY6HAvYzqY+H4P3Kb{ZNyo8apS|rda7SL=LrJb2JsLl{GCSe`e!9O(06Ju6#9x3}&N$=k@ytIyII3PjEOCmgGB4~VJV-dD-7}fPoH(OJ z0W8^qmZ`V=tH;_V0s#YBV+L%Pw~DdDA4DTgzI}~ifsJah?D1GBv1mi|Cci6~70@T+ z0=3L)(95x7hOI_uo!S~Dq7DHq53qZDy2wmnVQr321Lm^igTmP5)^0Db_A0Ho-C(@< zL4LtY8Fry=8aVmj7FuTANSoGaQPPQ({x@P+%|L=;B0iQE|4U)20o-poJ)4AZ=f&5F zEBpt7d<}!&xr6z_!;HYGfhHLY&2z&aphFc8gtgWA9v) zE<|5^KL1!Dk9$;27O6IK5q-N~jbLv*5m>n{JxLE}q=!~OBWo^3*d^#RaQPNm9=o7Vv)#WZjF9NN9>{(e^@C*1*H_AUebR;#J zJi%t8^O2YH|E(#5-AMj)LL2GlATL)V)+ht$$p|T84l{!6_5OkyaS{KN z4UE6Ddk{PQ0Ga!ZIrp29gr}ZLNK!U*CN5IJMZ|Sm>W2s=Xd{mBW)AXDHezHN09tU` zvg~gA4jhE6Fjpdh$2(QrsCvW21a8Ke&NJ37(R>p!Yvc;J)dA*><3ahNPBXHz@33)T z*I0iSq4QU|*R7~&Dr(kEk`E|(Qlmok(wM8Ml4PZwYB1;Xl&D41F&e3zfTd z)_&juLH^tRI)aDSojM?*@1nOyvB~}#Ct$X4#?77U78!1X@8V|bPkNnV`tPEsxL|-r zG2-qwe!?Z9SQ|!?ov5h?X;T+5)_q8vB*FCtQW=3<4)|v-*(*sMnHS!09%l6QJ<_FW z6vJw^0Ob}vWzmks9=9Y=yEWuY?8wWijiR`>^Xz)z9%X0Ud@LR93`?auDa71&>)_a#2pYD2Gt)A2f3PEJRfSgNF; zJQ4jHc2m6B-F^O;2T#NiT&~PUBubpwLAe9*%!tRB*p*%I1GfsmcHlxR=N{?-LkH^p z3hwnF<$i*yYA>+T+rjO2rb8V znqQngj2;`hUM(Ccg@0=|1-jwNonYlny4Gi}fBRoZZ|&ml>=C|F{Y?t^_ab~A>nrSk z0rA?;x1{*ETwko5DVy;CJX%`77Qdc+#H`A1&Hj0x{3f^#AKdf%aVrq%nIh;7{br;b zG>&{7!aTqDjdb(H`+XjOk-HaKwD1sUL@A230O!vJ!J-f*oJnL{_Ki4KiCvm|Dz|TN z?_g`|pcD(vtPy+dkEBIZ0{8X^@O>U>N3C`}i@4sL@fYZYP~k0S@x{qqP?{N;Tbly6 zcNe#9CSG|E?#+tBKIwOCriumlbj`SoRv}59Qv0xfFaO?CEW-Qpms@d?dH5!@C40pt zm5#)pq@pG-rxJ3`i96iAG{1P0$p(V1rOvUK7*eLOn!{OIy@lp@cEh1u4@5pIVcQ~x z7#%}nTf~P(9a~a!Bsk^v651Td)4Tz4D>Ns*&pzUHc*Kn#Oh!y87Y$hSfj0rS*R_?A z`N|^{2Q8DVS|+`n0*k9)Ve}y!SLQYl=;OhEB33&A?zEjv)YmC~rfxNoG{w@}BMNx6 z@9c4~@ON9MqS5R`-d7e{`S(~^52`}ruHxQhu-%Fia{Ic5re*Q70|Mx)A$kTdSbxne zDv>x@SJ%#Sm{F(Gzro!*Flx)?)KE@DDbvC*w9@TLKu^ny2?bs=>=Yd^I*E|4MRbX|{IZUQrf)PVnv- z$THzFKV>kalcFd0BhhfQ{dj*73O*t3I^&rt`^&QZGGASPBd&u;W?mRct~_7!0}6go z_1ezs5hBo%gO*erx1efPsNr=v=j%(sIi<;nBZ&|N4UA2r4VWl^)^kHNO;rL%b0EQ{ zQ8%O53~RX2D6>nIj0xfHr&*~vPX zd7QIG*T1lun5JV^6OJit`@FbMjxoCPy*P+W?GMSOY+l6fbp#f=1@5-Uui_)&56qH? zT!+v<1EDl41MZ0&In8h9J|t_>PXA!seBb1swxxThdlc}<9aqx2F9nKUTD+;_Z=O`I z?z{#x0$~1Hv{zYLC9Jp7ku3Nm{$-1S|GF1Gjae3%135LlF*uD$Xry;*;@Oz$w|HZj zT(ZM$zUFQm^$+>Bb~8JFlzj-cTdY?~N-0K=5%-BE+U;8dt?mE%&7Oz#9O86LnPD_z zN1OSPXmXxcT!JiA>4|M05UHP=-o4aY8;~i#F$gGX|A@%F{1vgsN9R&Iq1PFqZ?UBJ z&D=FGp;yhyIr0s8MY;KxvzYsd<3WOgB{LxAX+)4z@FWv}bCfIcBO`1p_!?5mEL)q+ zokg7wzhX`M`)&2w_Pth{36N=LoNzA99Ba4#(^oN~GDl#c3rF(-^Nqyp70O>p5mj?i za58~d`huz#_;w+EhkAv7#V7R^@E-&p4P5frwET}B~!xs@?BBwDc*eGXZWQ4r=$JMwn7#X@u zD#^RK{TF}ymWjt~MDq=ZFZHd00&=ivv{Cr$aW;3}6VwkhJ~lCU29XwZqofOVjrc-Q zLv>NhKD^>hR*Y>rMQnHj!O*DOB^E60krlvcTso_zal}ybPLaZpIJ~kDPg*`LKa{PY64yty4D_^T~bI z#|Kr$cvM=dUV-B*_aPIUi81QnVd$)fO5wVPH~!YgMVzXHjB5YG!oRb9r#tKUcsiTY zVf&-wd4TsC(lJZxLXzlb%`Sz%+Ft2n2M&|TgEM9Q?lE1~=AY@5*q_6vOR+x(Pg`Su zjvhX4`hpd6vU;NxbFz8CrL?nN+r=udc=M)sFndwmZx5et$!!lF_Q-9I9%@jQdyT#0 z_yvyRP`0z&X6BeV^QQ1-ZjK)^QWBZokx+WDy)vixWcr4VOJ2;yB)r}_`4)lX50z*7 z>I_(PT>lglh?!-1>kek3eMt^xqI-!B#Ku%=Gecl2UY%02oN5zfxwHtgsw@;U-Y6cjS6DCk&<*P`h5U*q1IbPl4B0o@86Nz1k8>rHjl z3K}cIEBim-LQ{n%rIy)EoFrFjgN1r3xuyAWPxPVF5qO$7uU4fcXHDI0Mj_5&8G?jB zBx*wy@KRanrzsR8NpRC~T1S!M&P%#zvggQ(wtFg)^X@IcaZ?js+`C=h6fyXP$X=TYJ0K~lz zhZPJ|*UR#_1N>?g^s7P}ZD~un=LMqa*H}EP(G^SJk~Y~=jQsvFVBxeEuw7bT8n<+G zCMIHE)FBL1Z`>euly2l9c8Z27cQ;^rMX{oSuaixTC6YgWxw(?qdyy|qlP*nnzKiki|PLb3%BZw+rSp19j%U`mh^A8%L z4VYgk{7d&&xJvdpUuvUwNXqt~UqYe<_Z4ZsrbNGj`>I~>zUuagUdp2bSg!pkzs>J{ zd=>8tOPokG|3DikiS{hgc~Mg)vsN!;t~61Z9b&>&E8LI#*KWZPWv<>5$z5e>76s4% z&QKE{R~3b1--{_>q%DnzQ&<|SZJ8*@O64(o@iQm*p)swJpmZtDfrb$^fy5=;+%dFI%I zC^TzMDF|Sdr*`vBlyG!vOoqXi9%e0o>2DmdVd%S=EhtCfoE(vL>YI--fx47YpwU{E zX);7>kvYB&;~NE?BU=R5-9;HJ|2()W!{~Y$ncv#%>7s9`F1p_qLT%i)>!D{?OG=$h z3=`!KfP7%tD(OnWC}m%mT0)-`owGE9Jj_U~4*DpeFh1clwK)}OR}f#nhtTMqAU=XJ z)!pp`4sW`ql>%es=Y(#R@okfSg~SW{P3r)RR$YtS7>3QjS7Z*`bNa)9>`@cG6|p#j z@io0w@s|_aP7VFqggh$Rd*pD%<_z zaiNKfQ$I70ZqhJ$3RpAt+hpS~(6$mz&9(MaR_8rmH_HOsr^+cvj>2p;aV&Iz>};y@ zdStVSPHo?#2%4t*?yD=3TrW02(VDN%vs#J(Y9a5#r7Z16*!xw{i{hs2noa=Sx%SUw zNU;N^hGH+h=d#TmQaBxzCbKr2MoB8trGh`z7#MF4ehoX1hk}>Qm?bSAr)N*nK3#=E zc(U&p`$P)=Yx*Ab2InJpGlg2OeYLHh#MgciFJO`Fo=p#DiPgt+cL6~hNg$sB?<(w; z!c5$uj%Pa~;I=+jy~nw-Kk4p*2G{Ra{ONK^o2tQFL)D1IdoF_3b_7$&{WusYFu@Ug zqtfqR+ZH&77Ifq^-K4KcpB>e* z$e=j_^KI%DD3cF(Yh7U4HDdJRv9{-f`Hx({8tFcBPDS$%jEsUTOnC~|J-=)1Z3D5C z20eW8zHBfDAtuCl2j4JaPVBHJc2{`mz7<^v?v$z%3x^_BGN_hJzq^9LI%VJzg}-8-KrZ@9Wob8 z6aacNgpQLz%PSm`{>E{sQ1#?5FT+-6h$WSElte|VehVqhA8ZUfqeub#VFl-V9eVOS zq686iI5A||M!1!t7|tJHtMW~;Plil(sKtJs>~`qIpOJ++MPQ-6s08F{WOKxbw^N~Y zgGSV-2z$`yZAyRmZ{VV71BlEh2~MNxGSV{(9^t< zMdXidGVC&R)+u8Jt!=Wd@RXparBd#7Vwi=9QMNi8d{Oh{c&Vq}^D8t-qTR1!iK2_$ zOz<5goN#KTyMmHnUFfki*qV-d17dsEQ6d8=hdU`@ACh`+TLrrk5Q=-0alJv@70Gv; zxy9UHn(9m3>ihU!rzp*|oHhr8r7@6#`020F>qB7JYB!7Tjo^x8!|I+qVS6xqG1N!$ z4`>mHl;_+iHJt=_ij%@QU>{9`Ma>rXS>+uWU~nhdz~)1WO8YH7gr;DS1Y6cV5r4CP0Sqs zGx@J9E>~Gz7K{bi?`&m#U8lCqUr+6(Kz%cWRAgATQAvw$b>62F!OoPk%haPfU@~QQ zfM_=XmFhxsKx6=%m5nKd(}B|AnyLQBOoP4%<^|?CCN6v!U8Sk-G?35r?`!G?p{7X} zmQCeIEzaTb9EK4+*b)ye^Wpk{6tfyZ<&fPzQrO@7LP@D<7`?v;9qE)`pf0y!67X?# z(Z+Sg;|Q}zB%;5oQ-O8~l1T;KvJuruh=*hG$;|Mswu-ZMgyHUz_l-m6ck)KK#Tnpu~bkfrqX^_XLX{@aB?|>1#HzyCzbiOAuQVOOh8%WPNK7W6o z_*)RX3VwgTp#9Ljy#{aVPe0NE9aWAzVB~T_S4OQP*VFE3a-<67CCQ=7q0;p%tXyB*gj~>!>*D^%m|@CSlK znO4i@c(8V*76t;0WaC1aiPdS=|3%q52KN$u{hlYbZQFKoV%xTDp4iTbZRZ!;wr$(S zi6;MhpP72@t(sdiUHxKLzwGY4_QH3q54Rb8##x}|WT`pt3jOg2t4OvClX>=Ho++yf zr}ySx7SkMRRX(X$P-K=H4N-=~LRa&8l}DLO`BC=$$qY}pt!Y8&;B=!QmMG0`RChPU zzkF6lp#5?j`e-nN4Q}JK$D4n%rBkWTBCMFyYr_ozEXMR&ZU3ZMa?Yqoq`~biH!D>p zj{aU0W8BDP9yzu9hN(S{1$DSjUkj8Sq}DsqEzq=K|Eux6_dhcO1aj%uf(wJ`MbE6h z6`ZN+@;AQxTR))LQ&=5omNpoVY*N(BFt>AT3^j)FUbc{yq1G) z1mVJeyq?3R4c)m?o3Gl-Os&r}ozGTactxYs!NFepVHw2&!zb`{HyX z%WJhu*J*2ji~{av*b?gw`vK&)cvl@Dur~u9yUPIn73mEAMgFog@D9%3`_4U$^NJWP z?T)w2-(Yb}=Qb63tjMI;1jEIpnX4(~V`o6r$!V}lq7y&Fp)i2MO^@9g+=KIqnF{v- z^38e+^)(c!E87RZZEAp!7TdRE!ICX)@iIfuP(L}*p7N(^ujJynC6sMqI(?(_sGMsY zT@p^0O*C0ye}#1aV=vj@{8`VrkjedB{Wcm*M566??z2gvWq8n>B!jXr9mRQx>T_^t zb-TSXnetJKeOp-H+-g%_x$tQPD^@Gh6WB{J&1A9fI5;3xjm~2pM;pHwy&7P}iKzIh z*g==9xpW)zfTCvj6@;Mn8SaUzdFHjsgjGu0zXX;5hl5ETswr;N?cdr&=JPZ9>)bdloqH!%Lx|!Ol*X<`C9Z z#zrIF}vgt*VMKMB9uW0XIn>D8}5pqcp#Hu z7o0#bzdbH(wlywz7M>tLvCv&1#W( zzWBCik#3**y@*7NLQkb6!&>7_!Y6n;%6!beT8EQ0j54?rQXmUtW2yoKlymT}o8eEH zb=*GueqoPaT)1KZ`c-5rS)tbOt|zDSMECEApRkY8BOu&07Dc&|xC31Zw)x2p?aA?C zal3ttTAskRrNgBI7_;snKtyl;(l=<}0l{Be8Uv}J9L^|6ePljs;sk9m>cC1Xt%x>% zHc{*65`IL7Z)pg+tKo593Q4y}2$}=p;-hYFr?6{9ao6!zcXeVK=yU#Y+Wdp+(*->z z%M+NqK1eN3n|cG}T-8LX1G8kX1WIW)b(ItbB}vnUTpT2aB9tx;!mAIyaK8F;Cfro(tKNAiEwHOb%NsiYQVkXfLZ<=wpj4+ zIT-de3K5&oI@&o!=A&1}a~IntkqgP0k|D&WR|Y-bP`XnnkOwvu?||kLEyaTK<@$-{ zJj3i52G)FPHT2&t$iFdF)K+^=Sz3beZbbhOE0v*}_$XCmsh?^WU0}{!q^TS=H6THJ zDy_)#4w%I>iO%92PCU`ZiY0o4k~<^s6_pVJ^7DUbiB|n3HpPj zGeG$7$-)1fZp8opC$~lVUwn@LCA$Ssw^c?_NA;yAZ8Om%9t0*fC?8^nGE%6c&O<|F z!}bZPkkHrp3#OL1)w;H;&9iP<+EcLezBC=a%6;{in0*#^{+N|XR>al_`p@u&&--Qb zA*<#6@|wW!>x0I>@KtNS0zAMPyWNp5ntt+@abkc18;;}kOcsu>6`ed;8~fNHv)B`# z|7edz?JcXAf%MwK!r0oDF@q@tEQJ|aGeNJ5rvE=)0l_u?ZRyPZZb)i(z9quFO=3(jh^eeeYmhu)r4mc%X*Bx z^RKjB%B9ea6nO`Z`}fh7hz`mCr!EHW#7^hM78zEj86>q5=08iO+X1 zdOMmHHg1tNqknX$?DcC;ZtcjG#a)T8&66Ht$J>pHw-@Mo%w4XH&l;U(?_#5c72qhX z4VLYd?+)U=>>W$~pW1yiC-F{nj`DeyQe&G=2+Q3YdFoJ{Q?1Z4*pt0lb- zRla@}9oJtme(;m_bh+!%%1$iDTv0s554Qfoo1eh8_G~e+oKC!1ixDp`XP9ESvAoY0 zwR^Wgfw6j*iLEsQqKYFORk!#wopHW+_%yh^5QAlG77F4}G~Cns0kL5oq_y8Y19Nwn z@}%9Um=zoWmp94*C>yq*0n2b1Ki=5Nq=IzrrW+3=>u?&=BeN%@c6j{D`h5gKD9q>yQowXoS6R{`L6g1aZlgH?=SrQJBfE z_&fb%?$tIR**5F@iKVmffPhjfPF9uv-)?+PA+`n~dS=a@MGRZOYsws14%BSR+{^ch zw52qzqPQD;Wi?irF$nyExgNqFZg3>iW9A$Fc}`EE%sY6{*CxD=yKASmT= zw{Tlvme;aXL|LbLAt{`%&{LJOC_$ALk}hCsNNfJ9(h0(Pzkin?reMsGGvo`G%#oC$ z9XhOOfYrAkTiBD$>Io>Mh*53;dGSXw?c`(48v;gqaabwzW!rXSPcoShCFMJq#UCM4s92jN{rf z7r~ME2zJL-0579|GiDv5Pz`O0G=#&5R|3)>B-`0mJ~vy&HjLXbV37Ce5_xAh^@y0> zsXc)J75T^3eta4rmMW(nRS~K&upRSj;&rD$-d8*HcT+U8MVXvlQZ-&-htQH~$Aye=d5tr00JGsU(4HHY7i=xqtsh z*c|u&yE#_2Fmy8gFHX{bTmJ{|BPH}-A*zzB{URgcpXpFpP4s_2Hqvj@WnsF%4}WVz z(Fp}ggy)4wDQUw653YM~uHPiXR%Q8KqzvK7I z!(W^4RpVk0dKp9q#vwcZU4q(@fW;-WP#0WazT7|~OM*;qX()%W=1os7Avq%F-X|63 zY}$6VCA|tWB{3QY>8#+8oqqgdNIBHEDv42Xx>5?!#JpeCs!?X3f?nFzhI0ejQ!~_g zaZ12s7?w{_){`n{gV?;4Bdha>1^-y*Dhw$f<*pjtih8)PO~fch<$ds}A+*U2Il@rE zw0(Mk!V=q5OTB+^9NH9XIZPaErpSY!8?_=9Ksj8Qnfa7w3=K1FGpT%!Dts;~j20)%Y+D&eH+XVr*Kw z-zibQZ%ECoH2ID@H_p;0W8pTIl~KK zQ6;TXV@s@N=2*Y9+RXfbEt@UbiQC`&{ykZDVFVPWrbkXP~zo!wSbvHk&FE!bb*Y@-1EHv_fsR!}S>oNlibgV9KM0mO0cun}MhAS?c*6*s z?MbhZe|}Y)C*rQ7b2j$Q?%HC}i?$NwsCm2^b;gS(x9dCtS(zM3AW_I}KPxpf3huIE zEF>md)O^^jF(|R<2syiGsuuOer&Sm#JydNt<{z~+G&W3ZTjZ1qZaI52ji#f=bMw<4 z9KUJIrFcLzqGmtq?_XCLweb2~knG5+CDpOLK|H!B8aMN0}rb54B zu*=12xmpG@lc!n&sKu0fSe-GY@Z3WSXC7w&bTcQzcNL9CzD#Zl%m>)gJV;N6WZHo^a!8_er@mE&_qxJcu|eH6l;Ql0?djFt5MlL=8Cm zgp(r~mvh&xHrZ{WbS?P-jc*j?lLH$h#rti3WSD@SJhP4W7}%A_t*9NwOhs zV)!o<#4rX29CKT7DF=va;6bR(pm%I>*4Tn!kVVTFJ#JD2lD;%G%=grOPBFz-31g{) zqG76-I79A!3dX{@a0m1pG0w1J%B+=FT)k6&C@190Vz+x}J@MAOWDEnQezK`lRzHvl zq;A!4I?V_%6s-dEJ+_D{PvSR-|LjRsXK+OJpZ(|w`QKe=?wknGA2a>`Tr58;Lpu{E zdrK3BpV6xh_D(JgZmbN34h{_ey}tfGO}CJt^MB>3k`?RZ27Zk7N(mfXK*}#u1H<2t z@x35hzahhegH@7&POr(qb&A~%IX@Z5Nx}L3kf=l5xXc!Jg}|VFiLjStVAIRl90)#Jru+H#dBx7Wzox@lU3&RP%=g+i~}() zR1n*R%LmJ{WP?4A6DLIr^5s0(kHys9zw^v@Oa%>utCb2($0M0%n(A!$4R~kPB(&eC z6aS&rvj6uF@qgzD|EEO+_(1unEIoa< zy~u87%IG22BLV|4SFJ%+5+gEJK}rAaC#F1)hczT*K`|$%t!}-6x!&y#jEsZ?Dy9cO zTQ#X}RBSZ@*4NdnwXX^azNXu5rvFodH<_RLo;gYE*m3ST*>s+1o50a~zfM2-We|8D z4Dr>6VJ1waFCqv77Dc5Y)F+8bTb!31Xo^Z(Y5)dCL&cdMsES(kY~TQ0EceuV;uAA0 z|8TqThJ}B9U|n7`1tQw1d*F-hjAvR~9aK|F4-{iR`zjXW?v0TYLc)T`!aF6TU9B-5l!D08zP1)b~+W0!Ne`M|m zCATO!;DGT^uAUvYc)#L($O$=>hV2a9lPa@^zoAfRw9%<&z* zAGh@pXZJ8Ed%D~_|Vh-R%-W^p7}jBCE)(h)A1&-`H`#g7Lw_AcKq%1;Meiy zxB1ay_l1V$cXhlodpffDp&i-d{BW}c-HH~<71Dt=1Zbs9KT=a^DIn^J+yIyqVxqQ) z-^Kg#0uC)A0)GXD$HAe$=M_n%Pr!a zm<(oRWiuv9OL$S^ZUx%iD6sx~F75RX-6VrNjxeFG(JDE8*7G>4aa`~mwHaZo2F8?#gHVvJtai_~rV1vJrpmoNZN6aO;Z3U+JFWD`acOw9jtY|#o8dJi zrwBu&Q=kzJjlO2?WnBw#r1vq+A_~noCe18^+ec9%aCOEHP?j{Mnqv%iqU#^o-A$aJ zQ~uaC@J;V6j1FMx)d&XI8=t}XbzNIKu`KP_Z1k;*1hDqV^G?Rxkq1Vqat?N+xH_jB*w?X& zg~tlSF)>DakWJK((~nKIB9=|IHhn^ZMf!~J<_Qdk7q{Y=i)O&|+U$i|3&fD@%|pPM zz)V?J6*9U9vUU33yH!sC)6YqJ4?&zz8i+NFtt|6XSEMY9=V=W7(i!#iNtzI2T~z)? z&`3FJz9x=*j#+V=%E|-Gjc=Cq(a2PNo60>CQgVe+<@u31Kn%{>~rjPA(&iV|g<5=_^o zV8eJmyAhpuS5HlGrY}{jP7=&q=+60rn9e{mgITum!>|odL;{nz;asWMvjdbgn}D0< zG#Y+DaN=6+LDr5wxe8_dA$#olC(!z&zdbciBLN6`Q=?F6u`n>&$na%wO>hB=iOc!O za;98S+)&tk1*JU-bmwzgjui|eByp%|qFq@EegZbPLNt7DRdVQ9;! zTkRI1Bhb7;7UMdy>7`V%`~L_z3jZQ=~R_Yw&hk)!TelyGu4-ZaTe zM7~Cuscgcf(NE%%DL^a_VvK$Ey@M@1I=bR@q(e4^ZPfh$Q6XI<-=biWPI9H>-Qv?< zP|KP>GsR*e0exXzf4N!LLYJ0DT1-`}i6LE}O(&qVh|r9pk^m~*V>|VXs@MyO^Hl`s z>uzGnXXdo!WNTlPSB=O~d9+JO98nUOplpQm%YO<1XxR6pk*&6cP#1&zK?{G;C%W}H zQEyOhn2PG#+Bi6K!YwRl&D1*>j#)}ZW>b!5+vQj#DC6#8yU9E+GB?dD(i|d)g$FJj zB#tpBrK3gW*{?+J`v6R#)=swWlRM{eTy_GZ(Eld6s2ocoLi@vl9hg#|gz%~I4U8Kb zXTOUA#6i$^V;T2LK>&^^#eBA+WcY)&f%ij|7gM1o8%D$3$bu07Hh3K7INWPaOV-T0 zBF7vJ<+VzOg={%y`BL7(4v-RLlNPdAK9W?o19F;Edw5&s6l84jP0q+5A4*&lnS34b z;ws`?P2HXOEz7JrN2Cy8)|@`f^~4G(2u91}wI)f(K%XEYGs0YZv;DWnqNljT+98|fB>D-rYQipSW;vZ8*Zwm6 zLZQw`(b)Hr^-BjfC}PFR%26_1s3;hyx>2}ZTIwcN=9@p5c_e`=;Y5Wb&iuUmNZIbc z>n|fg1qt@CZ$W@BIhTD_vLM`31(>=&u3(HIzTC1XL_`ym4cr5Y<hr>DNtfu^4 zRMJ58;h6_Z&3klkxag0IjWOculrW00Qt~)0$C;u%;XNdXLvMm{rscBP zXh0cxNp4~DPiG8jKTYW7W|03p9rN6I3n|VFbK#%*6&usHAW%Gc4@&d(FbTH2Z1+4S ziFU9Xw$ofVA7%JY)4WHCjUP-p@Tkru=$4YijGaw-@`woR7--NRfML zxQ_7BwLGp^mD=vtBZ}Cuq{Lgdt3B#{RHEQ`m|1D#l%>3fRJIe!Ln^y?!sqVCT`*n) z96mRHml90LYLm`}(32>3gJuq?i2<7o$T@PZEPU0{?CWFn3bX5ryStxB7!6DX!dK*y zcy7E6^7fO)v6e z$^goGab8+OnmLVFrPS3_#uA?{&EZX_v>1l9$k5=*j0wpXHrQY>x7qMJM!jZAj8TDW zsFV2y^k5Hbz}a*~dCA#T1M0U;)wC+;`B6<<>z3m>x|WLQ*5k;!T#}j`nI9IW+UACYz((avl-{_B>b6WO<=U3-?8(0>VPsCyj`0Y$) zjFT4#ZbQvp8>e@S^IM^2BRJYOQDo~Em$+{9a+yw6e?jM&_NQFFD`>2f7F^T@BVE}; zj;zPe+MPlJBbg$OzlGb`aTBN8+zaRP7h_JaC-T;u0rMJB^S8|q>s_rkFMn6WV{bVZ z>vBvm$*_%a-9D042TALB{F4iwGK7*&@nntCkuhFTvtx*}wDqm@L?N?o- zayo0~PeW5;4vxF92me;Br*0Gqbkv`0B_}R9I95^Sc6CGP&{PiO?g-hcXut!tf#}dR zFVqZ~u3*|Vb_}5=g6>CkQFI^&tYc%FQ_3!AKzE`>=NVvvz0}EaZ^-sR(dw%cOR1+|;WcQ9^$)q2_s19}xqa`R9*5QO>Q-`51;PkKkp47mJ1-yvMu*IF*;Qm!?hngfe zZI~`WUIJ&=HK$Or0tX9AqHC{L<&rjMpfa}}=W2JVcFLK)Hgvxje;W^JcS>-oE72*S zNkvYd2ru1Rv?m2~CGEXSY7f{dbKZ@t)~VLXe<0SYdI&&;-5bhqDz4Tk)&Vq_g)Z-5 z@4Mq$&nH>C9&s1LU1c8uH5h_wk<~oGB}%C<@ENn8jz2BxvE+>4l<{Qubq=$*1X+aT z;Gl?ZCynU*3^3G<@ojHiNx7CP{ipm zAJoZN`DbLMkWy0)_t=}}GZQA-&T;n`xh7Qe3Dy{ZPh{&28Q2Fih|{sCF39`FoK#D; zy^Aw=0!Foi6z)5g3(Jb=J-o#Z6*WxtT*BYSaeB$A)rtQ=hAACuo@lA!jBRN*SXuMS znE%~qf;UB;pQRreCHd;xy{#P~cZoxnIf9_BUpQ&Zi| zsP{{Zecz4v9_(F7{d#x7Il*MhSJV@SEHghycTZQWRY~9Al9q10o=a&T8$vxB;JIOoq;CAd zauNa=cOk0PGfIv4f)!4jdmR4~e}O>gTHi{QL86EUlW__MRx4fbt=fjg9Z67{Q?Btn zQMS1$RVuyW&{FODhEMAbo)lx~(kcf!S8Lt4r$F;NH-QrOEeU*i-d+s^BBq{JpV5er z%n$AT2|I_Qs%=8`$GazN)6ENIHY;s!!u6x5CP3Vd@Zm7bA>WX{2mg`Kz$JDMLq1tM zGolrOy&n3uL`@~xSS}swOc4Uhpmvc5h-7C1e2Nci82cMH$kp?E^y}6r@}f&p&?_Sy z@g)`!Zu*-w2=c!O`1Lw3*PR^sBXMhxL;_w%JW~8t9OlB)C&k9iFU+L-e;UiuY|uRb zls_`gqpZh?3w{-emPPYPsY`AA-0BBs7mk~?6R>>P&r+5}HWK=zd5SC@s?YyWEuM+X zRi0hl5Y@ajs72hoS34K-rPuUyPdvh;zqfVj{s2uNd^mi_J}%wwyB0lH0-`wXpz^wx zB_eM!=e~G!!kI_UBg0pGWe2k#vx6KFOB_F_93wEwM4RJHB^^>g?3Epv+X3p1p6d%M`q=QMGC!hY-*1yOulhYq1 zBW0^)?$U8~+%U>c)}rvc*-RI)Y6tQhsi4>lY*mnLjTxk?l%k18wnOf^gOgS4G@M_u z7WA<@4W~Y#*jYxNQfQYY4?_CGNXQ5)wMWpqmwO8)6C&s`6B)K-e+mKO0DI9La>J+# zy|WNUjfo;ax~njbD!m=@Mk}p1)M+->!IWz|=FOOEJa&;bSxh?Y(TMISkj`KbLQHQo zp=QuiiI2I;`Fa$=j4yW_ZAqS7?~TlvnB*XNp=xXRJa* zhwg#xNBFT;EjMgTn&TyDUKKqu=Fu5VG3rqeO)>V$DS6_-t~p2{;VF}Fr?O_35skCz zf;1EVhGM!&c?@^zt2@|W!mB;(Y{IKP{GgE-o@vUPONV$Tgf!w%jb4Wii(!22xCj^6 zR{M_-T7>IYX9mHq5McGDi(e*+d1?(Hd8#)cFF>OujUy5#3R)cVZAsIGgx``(4bqHR z@S{{6kUF&l^?PKaK^*zvaKE$5gNST^Va-u~ywyOaOU|^x*f1)}axr$e<9cw7UV1YM zBDk&Ik(5ZyaWjBT`XE0Vst7`ORVZGdulJOp>Un=P@|JWoxeb>#k(sbDjiXjNp-a7B zIA6@KhT7{{e#)}5fPRd;vf^vX$C~Q^qsbTh{QGu%O3jEqe~dhr$jWEP#~QrT^MC+8 z#xjU;@OCSN-ra!eF1j$o(~1Fw?sGy9n6Rf_2U5mP2T(8)rqcjLR|vz$hi|`3pwC%z z^2tCV;_Y8(#M|)6yY(`Iy72?op+0U5a=m{TqxpU#{BZ#BmXdIyY9)doZ&0;ii&cmFLEUna(Wk)`u9e%srP!jDFEF|WNo3PI z;4z!}NsQ+xneP&xOj1y+=5?T>E{Bq-#=F9XT2_5x!Y-wKduIuW8egz3=hr>?KU4aj z!M(O1ZB`|M74vrn56t;DMOf;nSf>w*s_02CXn+=Ds$XdqT_QP9JB|`5sR#=SD|Uq! zctMG}f{MDLiat@FpIK8@6Tm2{kZf=Y2Z?890m?4?Se<` z95`$m$T@(2YJ`W7iN73hiZr!(38)YR5Jy{4u7NZ)&R1CWEvu5)8`n14QABgXK9#gb zi-Pr~96*oYWH=#`^U6yrBiX=@tbsn0SBJIa#dpDhtj-uRzJt~OgIB3{&yV;VulLP3 zx-V40nEnaU2wQ=Sk#5sziGg-VO7qIwVF8fzeoRR*F3tUftd5R-MCHb;uXSr8$sDcsVRG_Pq-sNvkKWrH z#OP}1Iz^Nw7TARsX$6g=FivA#l%;OO`v)Rv5p_BoLtX%sLJ2!DM!alb(nGdT;*qBX z!VDk+z-d}ZT5^n!V(ji$ePD}x#ZjTq>A2J`GuRox3}%U7u{eZgb;O`O)^uQA*>$;Y z4lmNZ{|i#N>Urr?ZiKH8D;P4|3`Z-7q`ONtvn zQa#2}W~_&z+jfj`5VtBjC&aAy!euN?F|~LX&mSrsWIf;a2x4XAviMbxo8aD7dkLEau+A> z?@XvYf3ugH(3fu08hQVs7hfB=Loc<$aPXC*G%m{B!jC|;k6eBvZBjFg zOasInM>atw7{|6=pdsehK_=Y$990U^$!OgAB&f%jrPZzjg{U33qB2t=m1Ah14+7(ne<19fdOPf@pqqM{xWfxK|j zN2|JBBXBwS<(|>}yaS{84wBY|9fV4E&JLNc&JZ=n`UzT8`Ul^{DzpWv=cngLk`f49 zo?NS&j}+q*2t1yeI`^*_7wgnK^O$#japGE$q7nU0o6ERFH)6i`$sbcL>uyv$0I9@qieb`$b?4Y zxnyZC@wZ&yo;)LZYq@o!1SoDvu6iCIIVd-_)J$)?{^GXOLf_pH`G9HnB6Ru14oysc zvwv9uDyS@!N25y_#9|nT95N;ai%z|T?oXi!3yvTCI0t!;<)$ITr=7zy@{Qn~aE`qV zV)$;vjZv2cfi}*LS*p?X?coeR+(1xkjxw$gFm|%~fILbjA@Y_R0PFV4i3_+5I6x=l zcXhK3o|1of(yFQ!QCF|81-H=Ov>?Uyg-&b3W=_ z5|6aH`u6D4NzqY56H`E)a`^M_D)zlrxMBQYpCcklH8;Vw`i=foMwEWWgHiZ5k6D5K z*m?HQu715_5QZUMK{d&db7UD$$clS-6RI06%m#cNePaRi=<-X~=TP3|d5OVQ`Bizc z&$HwF)rhZmiSHm*2;(4rWBd9RQovi9I}~*DRn&bQ7zu}^!*eq#zq!Cb^0esriHr=* zAFd^e=x@R3Z`q)^c-q35;#&C{Ox-t2#_lj@BZCjJOj;&ru6lh#?w!|Me_vZDzX4ww zh)g0@R#hxrVcHA>)!`S-Zk1trM<8($6K9w!gw-2T+se9!HBUzelgk$|0O=z{68#LV z?uyB%Q}%483z%3;da%GH$)2Y~>zN{8>YC z^?;%_%$4%=w9;{5-c-;Kg*Uby^&8V}A6T;j$)h zx%8*!#;M3PghV*^DWTu3$RUU%q~~WfC9#Jt4xRgw(Emqb&sQAUkAuo4v4VrC+Ut*c zi!78Y3J%Z;3Fo$PnO$6AJ0DP?j=T`Snn1?ks>L8Jt;($M6#IsNJVTyT04G|V$nBT- z$knnHv|RBnD>S=uZD=4Js!WNSG?hiM0Z_7RsR4~C4%L!e9~Ekr=+6qRD367xVX2H` z*9+a#1D?0~glOjp7`4L}5=2)ZFuxkZF!+M3%%uy~wVH%++Z8p|y$g6jr$(sof-UXh z9}}%Z7reBNeXrAsyg}1NsYCmPtc80Q7|_ZF`WHu<^X&}(^gaX9Tn(=I9n5oaQT#If zH(8AC7sh)_t>?4%AXP_3H<;KKuOPFVKDvUoZGlWSz< z0aV5>FIifk1@;*uF}QJNTQgFj5?zfr|dJhLy4I0I;?SeJ1^8b=d*mR|<7@bNs$rZoRMUg~@iCkR1AwG=tr3b=-9E8-eja{)P;8yi6#2f{NK=Y-jJ=rH@5B)AwepQB`nxzTNYA-Mv zW$I+V#iv;Ip3w}6aRC&m%#h)KmLEJ_(%Db-Rl^Zwse#U_B_uEebWA6)~FDi zC@*#Sl>8&rujU_;SABV?_43axe!hiS68?aGvh+>-2fI`HpYW^XAL&ulM?5wv zFof7=4<|T48#Y%+t2k6O$!AoZvK|DvW^x0s0ZV118H#^_%VdlHQdLmU{)W?{$s<6Q z+CWPxsqGxD1%+_W^Io@>$&*8x9?$Qh-9s6CYW+tnHz*xni63C}L-@5p zBza5qPW(s+K1^({Y19oZ-yu4^A(A&%C~~A+LZw{MVH934s6GxA%@`?2q$6jcLw_?3 z_{+hLkxyVxeKc`T6UlCT+0W^Mgr{p+I}1|tINVoh$*GaxvT?5!n0r??ly?+ZazrHX zrci+PJ6$dO1GUcrfcb{y|B=+sY>Svxkld$b8!q~?@i+HM`rJ99c#K?nMj~bTae6+^ z+xX0tNBZyhJ!di~%lNeOUzxtN(%e7Y8=YJ+cJBe|t; zQPSdzIKLdDJ&b%}Nrgc9EDm@yu4RF*k$3gnuwY84(GvOZI`**w$WK|(Q+plaVYb#Z ze)am*lGl`K2;U6W2>W&M3|RUr(9yY)-}&rxQ_t{c7{s6DJ{d*dc{({L$!Co;>rjtE z2RlTA8BHKgIt!I&(hDuo`43@`>~*_WwhLjT&q@0@G61O7W!SZKAIvEaFXIqK!Ns?M-eH{X>v+RveUeVPi=-Qgug7X#hJCGbV-~pP zX>k19{hR<4atmE_K!yo%w#jDppst=LQlK?!Up7sjD&}q|QkFa3Zl`$|$+dA4X8&2J zk1YzSh4$>eZ3xo3CMD;Et7HgNF)@}DkYKu{UPU%YM2lB2^LV^+HxUH~(7Wk9^1G_g z9YlUM(3OygGZOTP5oVDt^g!c8o>T|(ly_HJH|Jl$Lprnc?R}ea4L$6~mEkKkjhY(#@qdQ!GNNgw90hFa1v#8f10T$it zCcmEFIco(T!7m3Md#}X}5D06-5Lf9zn{fj8qI;iBezC8BK6h^R10;c;k;MA&7JV{jd~^y z^n>an5KJc!P45Y0_CquM;+~w__77Q?r}M`kdmrfZy1$UcYTRGo+@A3ocyD>sx??B) zz#{$tBldwn>W+fk5f1LTR;AhOTmxm7qvd|A4cl|ZeZG+w>@$3YC|OnBE!or9uK;s1 z{-AW=Cs@d0@b`=GR6~-X@`)gR{~3hU_gYIBk)m&TtTPqL@QQBQoB^;o5Ky64X!!mg zN=_VRx&(KsU%%9C{=201f0w!cAC#POhHk1ZmNw4+rES+ZbH`Cf`{vWWmq@%r-iR>f zupE|*w)Iq$f*q=>bG$54wW1kTgQb^FlQ8x~wiKI;)(NXm>Y^)Vz4WHi){x39G8kcE z?M=;6{sQ8^OCI3rA2Z;7xy~oY0-yp0QQ3|#979F z96+~B#;7ITg+daf4RZ*YAwWXvOC;uxj0?HFL*z&5SN8c%BnEy(RsYAT?hdZ>9UV^Y zlVa}|Tf@(=Z^=uttBC|rI~m4sdv)@9D~dF8APrpYB(0BrhvuU?2=j{F^5}Z)$`x(D zn+e=aRsb>q+)Y=IIJ1Lvs~g(hTJN&G%&bP6Ig!OTL^$N4%QnIiXmFvjBjX>)mcPKH5Xk_TG-HBes)F_y6!04Vk6pek|d)CxAzYFv|!9qdJq9) zd=Rm!L(4?a9|aq*y7)*c{9RN~DkCf{3h<#fPjhpzB&;}enhP8-KFS&MZD_JMWGR1W z!(y|nhy;+MUN8>`>xv5Nc+*;1OK1EsEo;qWbGZi=RRKsDK(VYgg^f8c zjRi7UT(pMHd?eiE*GZ99et~W3q6#(o8DHy+q1~6ZArCp2m`L;@l)YjNE=)+WnOm#y z!0u_%0chN|Nde++1pIdPnUK>q#+Kg08<+su6lvzmjU?`CUz3T!yEY+Aj=`t>&_BbY z7v)9{nBW|SW2S`*DxgwY*-9?hQ^wsDsOOci2$P4d+7lH_egX{^wOFdoGWdj2T`?HW z{kzIEk2173TZ*u-<;-|>4JFy=C~j%RG`TO5RYEu_FQrDO&RZ#6ApZ=5+D94cX`Vq)}M7Zd;C{O}JZ0*s9 zN%>mLc=4TOwB_~09m$k5V076+^x9l(<#ZNS6}fwgZPr54W9reJod&l~skXvuN>pol zq<=UVKlKd$(X^-VW~tg1GZe3mhs&gsR$?VDB(P=UupU(vSi@A9#<@wqVpTiB3#2-L zFH#}cW}@lbV<7YYGJlc=Vvv4C)64G|?71fGj8rGpasRW4=%Czh{o3Te!^rzVJ`tp? zg;YzuhrUd@Im`|5s0~yj{mSRGSawq?|8Ns|@KV?-z)7kHynD5Ml3da!iqowx;%kDy+Y9thKGPtta$QQQ-1`t)#5pA}?K0vs!>mlB^kH zPZvXKVs;vUFo&7Z|YJI_o5%pIynCjAMtE^=Q2xH_c`iej*jfIwvh z)~YgP(UJd)uXhU4ENa$u%eHMBU)k=mZQDkdZQE9tZQHhuE?cMnwaz)Q_Kw&)X3m>& znK5FH%sKLT-xImnsgarC3fdI4M$|an@L^OJnUn*IGJR#__ja`ycDzv$0}on0)%n?0 zHMnHH-k2Tbe@6A;Og9FPCuDpviDu~2-gbdvUMmW!F=_ZA#5mT!pgfQV0e{_xZ{?za zW~|U|3SSJP_mj=9XudQKm5LIy%X6>VqfjrQrfNw!dm}T&4Z#b>Ur9C3>8RB`O%i?V{fVzzb}KmixPFev_xkaJ*sA$@-h75Xd} z3U`kBaclQFT5&icb;M4WaREP;usw$a`WK(M{lJO)$SCdoYydUI&JC01XsYcgqPa959~*&*A2;74Ucwr)f!>kDqMvsH36j=Hw*JN6%x^ zl_bE!0hegcam7w(RMp(;iocU>>6v z3=$tG7vq4T%C-pX2Z#RNAc81rH$Y-c26DTT53D@tgg^7cGIk|6{0{aN=`~NecMw1L z=fAL?9Ob{4%>R%cS=9eog9zpQuUHS||CuKF|7wu`pSx66v|ms_`(`jktD7*fnUdXJ z%f^^fE$ZPcQba|C7djk~@###S_#50poksCZNeEzOz598IFE@A>zFk32)5Of^~h?V z{_@Li@fp#xQ6$%Ay4mA2{6qM+#7r?S2483nj=NS5t(IBsjb{zx^j^R?-)!|mKCxKY z%ljL@NWJZ3>sBlN+f*V6()|Oi!~*7^uCZvo!rS1m6cNm0cx;B;ZQgEkdsXHecvJN)&=- zVkq0oEL@8d<`q^FM8rl}D!C)et=j$^B0N(KZsGRV0T^y&ABI}WcLxCVSSvApIw3J_ z80HkMTxH4~>pN%x4~|cDA!uK+7n;RsU_ce3sggX(I}?a?_9kQw0V^tJbi!q-gkXCl z4D-3f%c(|t%49uq{ad$=7jTft{$5bz6iAiDj7Ii#_el*!2nXfEXM} z6rk`>oYXE_WJWXtNQHYRgZsOixu(-XCA zPj>jqs3m^yT(@KQAVr$1hbir5NTJU7-Y;&bNQJ2*x;Og>@wf~d6d*0^frGKf3 z_+R8%|MzBr?*E)TVMAl@TzI6@!0DQtOBh%B_N^-BwlK7I}GJ zS>|*3TG3S(3+}Dl&Ek-tKvMYm@>_Y)bMO6IdGVjemu+1=mj4a_6phZvv&Tdz);jNk zE7Dre&OZZ;!LN6WdghrKB!5)K;{ly#GP;_i${&(hrevBqQC8KJe8FmAlL6}6XI|N* zbKF?YseSBRt`Dv{lfR&oqF(7kfL>KzpDFcl-Xi#Kp0Fo8lFdcC`ktIdUuu~3yhY}C zQuUh;#|2|qeeT*OC9mk-x#CRyO^T#g?by`~>ehcky~3w?Vzsf`_cpMjz8*e5GnS>2NaOmvm8~QASwFg_fh3;%+2}-{I!LuO6O7s(`r0A1GR;l%LuR8`o@Q=l|HzNJ~TmD} zoKd^KZtRubrXRb8NBoWiv6=y&Y8|$%clb2D)4)%k;+4C0rvfMLoUb`PWfShmm7O-9 zc7^gvu81jaRX&KSS}MMb$R2qUH|lSoG=6jaga?SIg%T<~>c<~8pNb&w=@TziUCSez zcy%GIo3FqJZ-+E~fja~)MA4Mz&&d;cYHzGduhlUEr~bCwB?1MT4`46g7tbWb*9vdM zDZQdkY3I){+j=FN)-E3v6Mo{`zH%w6=g*;_qrH-?`g7OxfxgV!JEguioNtV8wNSIQ z=g+t){|;_;A@dK*3YH>pWz?b<=OIgLYm)lL%$6V^_7m9 zwtEUUkvo3N4#q89V@-$yrGgcqNC*lWU=}E3fjdH1$*$quN*5?K;-4cUba0*L{F^|> zc9|@;!f+igRYL4&KNCYp@j4h1tC4+l>Vqt76?sIq8%Q?Cd@E#xry+9rvMKBZ<;Nh% z4#pB}4RFB~O@=SsL?ZEIb;XxzHDp)(6%?jCY>g_$zTX&u%+4Gsq$ayY7`-HMDbg>d z=m+Q%tb&37-EV;KBSQ&i+FO=|^A9Me&YA90_009l@iPe$X!ANMv}ogR^Fj%VZct!C zd4epG{)C@~60*%cMSNF>9Dwsl`8LqyRMF>PS=d@agOQM^!R1)kT>?0%t@U;=BSquz z(c)y`ASM3s`sPxNqNT;Ig9%_qywj?$a5<5wWQIVfrl-r(*VIyzqt6b|ZJDalBf$+u zFqRvZ(NulBDCAm}uCSW#oTaO!rq2?ASL-flqF6C7Hn7Y_yH*xtJ+l>}6d=EKk`i;~40<6abbaTPiGmQ(NNP+Xo^ zn;Ywpz%}5a9yitlw`VPDXsN5CvQ!A_(VNdT);ARpH}OBEl+;h`Vi8$Q2*<=c&0FNh zT2w==fU`4=S!N@Tw5Nt-;i|7JN#KION*?ejYg>ch7Q(%gh40pmUv$DL0RT=a82y;Ovz{9XI-x-YFD znK=-k`czKlqnbngIYU%`=mkBBrU~OghUOV_H6|GZrM`YQCLi3G9d7g#UfWWSz;hr~ zK`Fu}AZ`YgK^!>U7M!d)4G(YeFh`tJe+cO?cl2)X+l3}5L05`AM~o!9<)7+HWB!B+ z5v%C_Elf7U$^v~}SMhW5@!kb5lmr>I?!?B$HaI8QsJ^;Hs+p)edJG-<^shZZh;LLU zBPE<^&Uq}$n$KpF+ISDwl=&%xKInR4Lq&m_{LoQf7Ene;Zgy z#x0x|48*>{P0iI8s$+f$#mp&h4s9s%pTn#W<$$ z=0nS&beE44#)6snik}p$4+KV*IHv6rfjJjvn)H;A8TDxAErFL!Etf_^%uj9N3K-K2|W#lrKY7FI3%fW zf3btLSI!>lF=Q9zt&Ao8_JyTPq%xhU#0K!%I8ZPG*0`Y5_Nnspn!M(G5hZRdwE@hX zmB{YzO1y5L>vBiv2buK#m)!lLx*mIz<xzWgFV(AaL^~NT{8ZeVm7fEvcZvs+73tryCO5&Tka?4+FKo-Sv#?7_ z$v5R3e|lx3#W98F6u(ddctjlI3hgTrTW_Fs)7*>+ovngTmfo|@iUYz$AmxxTwQ{3i zcwVl}Z1S8k=S#BEbR8N6sOdE`0?^Fb7oHYCBvp8*U|K;@$|0yw_TrA~>GW7QY_ z+9eW|a;2Svtf1~<1TCU|{87x*Gk35*v6oU((>3p@Ko*F-$W=&Z|3-x9{HX%C=zsDt zr)sJ8;;iasBbe;J>E7hai~4N^ekcE@#Y*tUS`1g60{XR>d4@wdogGMQFj4BENjbN8Z;z_Z(+T62mxMQ^a zw9CS>KJ-flYxcuj`1*T@x0K*3yAKo#<8q#d;Pc>`_MBd@nR*vo#qr0v@a&`PM?W!l z=W5Z%YvElMMa2_oupwtR$Mk9hP7V)@=(s(>#Vn-1;HOOTriF4C+w6d%h1ZP4lCqQJ zdMQ!UxiTrO(`=E5b~gWwCkd5@dZW3F&n?y01LuB82b`CU={piX>}R=Kq9!L$|2ct?nd7G)i?4& zbAFw2T%_#LgsGhSIAjjIv^v~(LS!`HLoEOzK9C^etnTfTiycts40) z1s_%sn~){lS&BvOBZ1Gw%B)FRRp1V-Q5h?o6)w9&`l_Wr-n=Ja$OqgUz+AMKX`d2m zZw6&v;5nZ@x(GgRyx%Mg}z9`c%y<-RUm<7hpTsVTH z$oTv8>Z=zc^#T6yjGdo(U$g)>aurX&6U+>Dj)x}r5 z7n#SBGIK>cAxqwz4+kxDvLN^|=f{$1A{-&*G|L*uF)#D4T{S4DP``T0CbzhbWC%~h zYn8Xrpe{AB$jPd%v7|h2^C-;bOwjn!l#*w%BZ$iqI3lK2AIR_cjwKI*?n&!4XQPG! za}gsLt#B_D#MR=;I>v+0?oi@JW(-fQuG}&Q;-JG=4q7NW^!eLh z&ktK!orodG;?zbx4R>bSr#vTj7r9g77z*@q1Cc1I$6brDka!G6O48ykD?|*fw1c%I zhdY}f&fp?e`Y@7_pUEv&ryXba9)l{1T#4kC1skGS+6tK#3KRfviIh9E2?dYJcQVGw z8SFd6=*pUP$g7W*;&=yNFRv+IS;|&Z@N|hUSs(CLz~60Mqa=deTfzLvRshxVs#gP8 z6eidSb%dO){JV)bVMM4I9!7u6XBPe-ouMo@M4lH_0azR1Zx%*8xoi@#TNxz@-nay` z%~3Ec3=OYM5tzMLU-7#MfT~-~00kblccoDY|L>x;fT9lfDD%Iz&ttxv+;&Emp3Xx=WXj?1~xE;Gk zVjbs(;ICTQnblA^BC`OwqYrG3tRM8#DAKLrgay`8KNY~^hO^dJS1n>gNy zuU=JaH4*sXLR%DeWpAGvsP5rB38K$5*e2P1a`jO{h8&t4nFd=W^?nWVY>pg;ZDDqu z!vwNT;U54;0dHMY#BfM9yHf;NUNVA}AyT7Sisytl4;9|hh_Axt52#V30ro75)gfR< z1yuP+9@_)z7<};p2izId=9BZkLAcU;x${GfWQ(wCgn&CdF=_#1ST?mdjyvABa?GJ9 z3oNBWni%t2nT24@rh|@hEWn3M{`*|s_C%o#b zrLm;`f85wpc)*QGPpKlmm9nz`bHcFYB39>2kv!Vi$S=TLxNI9Hg7{?-?&&M3^&{`k z7C=9rTA)@Uuy@!%yaUP{0HCZRe*Os1nP8VqI@#gS_0Fb~MqR%^8-gCiV}I)*E;ol^ zI1dz-x{fV@nJkY$@x0_vtSR2|DMK>%ZBz?ndAbv|N{z>o@3o*73(;1Wui&7ZYKnFh z(;4hoSDgi0@S{x3lW~^{>{>uWs4mi1wh#*>a|-w8Dz!KVL37omwIrHXYk= zktniko@Z(F897)_-pW23W{&Uc-r$BV=NYwcB0A_S@}=2VFw~*34f>=rU=;ZM@L*`p6ry6>M@nG~_%ln$g$|)5#qXUJD~d&J8>` z)sxiWHkk8Hl4AXdoFj#X@}BUE&Qw%>Qar`+4-6zoh1M#^4B-Ye@l*mB8oIbZ^5}1r zzcQqc!eMrrxN91bg5D(R7!cg1CS*SrQ-CVXX7~bwf1TGHDpsZkMuI4sEdnJuz)NXy zkK6q`Z=*zcV<+;^RK3La&&@ks*X31{>QjG5W$;iOaR~L`f+n?A!#>b>a}#iP6py2f zCe#bDS0=yaC4UUHb7UAe7xDW>>bs+*0ZCocgWy#+Zjv(6p&(l(k|LKeX~u_ML@%YJ z4$_M2Ef=Or%zT-J&FM7Ym$ zs+&l+kXc!YDo=k7eOLJHP*hiK-fLZ?8!EZPu@r;!+PqB3kW#a{fzO2_hZx#Gz8&r% zPLA3ibAESUrq0uHG9W&R>EmY;B22-3tg26V1TS#t3zyATWc0TIaFU_y9m<#!q0}P< z670;hpY+~w>G}&fmsKX?p!}e+S9Kd=)edod)Dg2p3zQZAGf^FUt1CRNqMwT>q z8jZIT6x@w;rOV9?_*e^aL!PdJy%4KAQ7*VNZZZ^RhrMcpz3hSBYsi0YC35ekMqeJU zta)Lh%>@qEcRjqKPk|1(;^7l#`$wFi7Ju@`6pHw#&eSb71A&~5&ge_ILoiL5ob1u z%En60?dvumu$Qveg{C#@Ph>P5OeZC9AJ=Gq2L8cxaX^$iKOrxEL9qNH5#NxZeW!at zj0U_?UMv$GaHhJ@5{Afl#;A4fj5+LXI9cKHlvBoKjVQ%FC@WWeaeW@RSzEBUrF9h} z!7~uxbgwGiV#89nZO`MDsK5vyp>)m6VjzTNFRcE`mN?Yubh73pD9saQbu35?fTR>s zn*lcI(Gs6n`zy}gslaQSV8pVlL+7XB&KaocV;r_4HO9QER>jLj2s@u6TgX~wnq7}1 z%C{K!-!Y*e>vM?GU+(^(gt@Qzz~Xt|^+KRA5OG`<@%$DJK66M#v-xZJ1>%DS&T~w^ z6$~NaSRvp!-r=I)?{VNmYz38G&PgK=NyV}7ed>`(V?vF750xW4;}%_73`uRQA{f^R zxyB6RTFFHSZ%fe`1uom38z6Sje;96kDJfM6{g@9%EoBySf!AhuOb=TV>rLKrud?+F zt$;k}pq?>Ly5jJawo@z^7hbw}MZ2ZU4PIu7#tGGoKb~2~A7%y?|LQ8g5>1>Y@}${z z{-adBSbo(q{!FJi0=(#$3cgv8F;T+PCpn9~*>4`r81+OOQ*UloZ5qk|L6eFLYCa4( z6YEMF2cL~8bD)fzGZjVQ-H)=Ie-8Co@Ody zZ3Djy?9;@NivZ&03)5C&-5613EJ`O%vKXN7l%1n9Vm`_E?QQ=Ct8_Yg+2f zfjubB*wlwRYuvovsV9E=gmxWoXN=}m+zp~Pefn6vp2iol>IAXz%|}4HFV7VAZL&J_ zCz}4mzP{uW)Q#dNoc=USlMN>mePCn;1HmnJ%)r+&VFrX}7yPtteT*?>dnV8(wn<%D zgQu!5F_3kAbVe{%!+{^Mv3+e;>Y37Pu+C(Si7w&zpg|=9LG)LVCc;+_h~J39=Wc$q zkc44z%yeTt4g0*+ClAQ)I!i4>wSD9<(?Ps$M3EWhIl=mRt95t&B)=6aU~LPmEmmac zjEUSGxAYrTEyIAc*1$#WB^cPlkycD>ZM7(f$KQYqLSc%kAUup;b@zO-B3nuH!m~3- zzVO;M2H29W@7@|FGK7GBB@P2?GA!8}1AoJ@W|yF_5(K+nJRX)C{XI+lvX+o}JIejx@2;;fEkYj`Md8KqaQ$ z&xfadCbG;8ZM&gDd%e3t5TeA9g8UrK5ylAwAuxKiNG9|Dp8^~6Qf$pvNsQ`L(cVDOW@T; z(JTIyrE78~le+o!odtxQkd+5wjqB^6|_P8M3(%CvJxZpS)F55$GdJLJoIw3t77A z-=fSMnT{FM`bTv~?)S^1o?Nq^JK#pig%BjR0&bc|g{*k^7dVj4v%()S!yoBI-{o2p z*zq7MynKp#g^F)T7G99f?UB!KI%AsVMLR|WGtEh+`GNg@f;Dy}uz#?>t{|y8d&vx@ zS?f*3K|D$+9v;tVLCnbV@C#<*lO zBkT>b5OwNE@bsG#5(UgW?wH)Gph(p;{3dJu@lC)V1?Nb19EbyNRQ(RLfZ-@)uZR&Dl^fuZfZ`rcB3>!9od^_*vf! zs~jhcLo95uC$DuzRYn&Kc-1A9#<)y+Gn&8+BKzNdY{Wo4AEp_vUmzVIsJa2!@KM;J znM0;F(wS|JLQ-4doe?gMhsRhqXF+L!z9{pMkhPn3NZooU^i%_K%x7I#=lB7SvEp8% zWPN{=@RpE6)YENpjq5Z?*%2QK3F&0^nxoO)z}`W(_x4axvGOzE=GGA5ef0x~wP;j? z6rvV{a-tQ=h?XjJ1-B!$B?7%vy|jLdT02sfvm#kx3+H%(Xw^!|SH)Re!?_{|{}C)V z$4gVoCsQU(??4_+$a#$qZUs&L9XAkq%{0`^jB#%>a5f@MJbU7i?hM3`ugYnaTMPPZ zgazmZl{ybFybpQ9qR^)bhz@-QCc|F1)0@3ph)w^a~p2HENm zfK5xLvLnat;K1g_2Rf_UmO?qAKhT)0|AMOY(wnRgxvR5=Fd-eRRKTp7x1#e`^g)h3 zWpm)xhg*C@Ngquc5cA>Endyb(xNkI|)CWeqZQNJa_`%nQCcNcdocbFafwi9(wb2b< zc^sQ=GZ98{C}8r>Y;$z5r~@{Edk0d*bq#srkJ@i==U72@oI5UyNn5JS%PIP8D&tX; zr$YC3fU9kdoQ8m!v#nm9SyQ6f;|8E8K&dolJ}gGT7BvTSMD6*-(o`B*COT@5MMN5| zlrWfnQU`Z)|K1aFA9B*?+CeO3^+`l6n)xWjWE@U;|6U0!?y%*6q6?gOY?_m;pimcm zlkf5#C&&c^v0&RGaOcw}SshEt18l+rjpmJ8qi=OE!w0nbBr88aA87hhcyS>u|FS1y zJGzTX#Lqj*QL5t~xlFNj3CChngq}=5?s)`dZ@THquVEFB82n|-b=`Aksh`7Z`&*4K z;&v0>PPYj6hP^FSwZXG`;?@@wVSqi@VVn0*^Y{t9b@0gp^V&hgR1tDb6!ty&OMyv9 zviw-KZY)W>YICE%42Myr)m0!_u8v&ITqYjT6Dpz~{ulNpnZTI|xPt_OMIBH($Q5%W zd&S2iO6O*7l;L6w8F(wc>fcg~=gd2)-Rj*fV8STqSe-D%lv9@*oD`j~dcB-P)xm@6 zj*!&S9E|h0@}p?yY16wjqm6=rd&6#FW=l!`oW8TOGswTCq>$2VQO`(0JjE z(ro(Jq}m1&tM;v}ec?!D8!wfDvJnYjrl^5IZ^BS;<9)b>cI6`cY{WN_3{SDQbdSkr# zR%Aoz7u|gOb)~p7;X8|17w525_DTKB<(G+nJnN7mFq-q}`S*a)fx|BW@fhES(=Q_K zfbn7RmDY#CFJ<;b;8^w3+=uyxOMhJd6!@FMey?{A`5U7*xObZIu=hy&t@iclbM+J9 z8@DH_cQo(VZ!heX5P2Z))&4E-?c)>l8+rAG))s5;6WU#rXAXT$6Pb6^ZZI*4YaTdW z*`ZJIWNz09^Kb9d0#&1mX)4at!ioko7e}@)W@ywaajt{_!XQ3$CfQ)Ptk}+0|KA}~ z{v3fJw+3B{D>I^-zXOSa)Yazhldrz8wQ2qB;N(iQISDD-#zQdgW7{WV+auqe%pUJA z{4hl}HgPe{bAG06t96YmTefRh9gMc6)r-H;CO>eTY_9a^)c1@@xwzZ40O$TxyMa{2%^>Jr2(z)K&u5k#Uk3|0}&;^I16L1Mk)BA?zj*y?ePQwqahm8I`Yw=8U4{jp)_b(Zu zi^Q)Rx6#2l#gWmmuv@RS;ujcWjzv^bB1{NOtU4P=Z^Zycc*#6s$seIa{?VLq%=p1x zmajy7&s%?FdNKlPR7aWABS&!%M?P{#Gqk)U!7WmoS~y)UDOe~=t>O#xKx;%x^iqt|BSs9nR1W?yP z%4*bhhmbSyO)>j5>i0f^1V}`qkD@{WUIyOVVk|Jm@P3D1a3Oh7hPS0y2sbc{pK`Bz zpo(yQ=%o9~%oqq!cSu^q_SPcS>>y#L*7V>Ll+WpAW=#xr1k3eQZ z5RXvMPf(V)a~-x4AoKHo~$Q)fE3yfrK$k5H8vm z&!e?2wT!in;d3z++%#+Os#!Y?kX_$pY?}qiFiXP=#^}EeN~*>Q_ee5AHGY!>UufJ` zkxA}{iNB6aXo(bM0`ySVixR+NJRJ%#6=mHg72PB>B?wO?0#79YpZ-s<6qhX@{`2e30m(}3Q9&$YhLU`kTJ||`_ zrt58`hUs50kU8~h)Eb@g6g&mhL1IeOB@htw59Qc;uw&Ln!XF!T1{oZhSfI zLMlSz4_8H+IAUb%HJ@BKABs`XypPWCIcYky!cKauqBITaU!&!)MK1pUJM}FH#5r?a zv<1-3g5K7(KYIsVhI+6^M>qa-+`egLERcIbjH6JiX;{r#J`svlDLt*pYg;V{ZeffV zr5n#8Z(wZo+}43P1Ra(27ig+gLs4#BwFghgJp-N%$V+}+5rfxb&7%jz5)3%WVPoH0 z8v~)~_}oObQF=?@DUUA9{TY|Z=$7N5lSVa*b;g<6Q4%INApzRi7L9uL0jCF|>G*hF z*=>~Dw5Y71-f4vHAXxM(_?RFNzfDK49ke^j=Th;|ja(%o{v2D_e!IPy&P2nx5~1NW zc#3Pq+~H*0*KO6jJ!isRQ^^d5xDjX!Yn?IT^wHuNc0mmQ9Ql(YnCQ@uIkf?UQuPRd zMx>%cW;!;Qee90J3{6o6VQpA{QPcJgI?%pJ7=q-7Fka)@vNea%rx_Piz)8!puo1cgp zI`oP52#mv&zh4|y?$Y8N#0<~7WgUL#QtRql4M(s9+Ziai4$*1fZrTgoC2q}9dj<27 zPP#FOazIWJnOn1DQp16zoD4l4*(^sE;9g^Q9@1-k4Ap!Gs0Dtkr97qqG2!s`vCrp$ z<^u?Q^`>48DstFc8$^*w(n@kz7>ZG_$-o&*{Zfz%!CUIxO@l2$veq{jeytyfOT}*4 z#%{$VQj)TPzsosuH8#~84$MzEgFzIEa0d?gK^uDzd=Z1gfIWC)hh72UG>lH0)DDr3 zPbG`E-brncj#Do9Le5HaJs}B5^Sl~t^n+If?aJ`HNBV-_cD|delH|=dQ>{`AUgVyS zc4b(v2k?Lk6X@UEL&@SngmFTE!+^$-^p#OD$<_D44MQAjx6~t&%B6i^St1hU640haPl3@ zXAjkZ5r#_D`hpa=6P3Cc@V7YzPY<_=&>xiA6HW@4N=o3UoO0i0Wm>O~4X)ua+7m1U z7o@6aYD7;o7@tz`wJr8G0ss|8G*A#;#{|7!fJ)>O(QQKnxA;SkKQ{{XI46ceZ8w2e zZVc&KEMF?b4WeR7#+f`1o!1RBrHS$DQ6?3NkE4MUJ!SZ|cR-KrSwlc@UlDH^^v>MN z^5vA4A4q=sX@pH-lna^Ci`#@c3AG2|#h|u6Pb!;FCYx_Zy1yYNy+< z$D8&0m~%4zoAK5ws@s-svOs*O>y3yv#_kEboz&_AXsc&$pyLCGH|nF`hND@0W3Ro0 zo@KctqSEdd=(AX~{{__X@Ript=B%LCG6=Iv%ucLnFp7STaFge86~Ceuk-SDELnuEv zP`4kwA~`@iBjU0iuWQ1FQ@0|RdV)8-LZu(X6gaztE>NokA~U(9PDnHNw#1>ay@nl^ z5?Y1Z#7BPDrka)~nEVFKS-G;c%hDqdu8sh>Hl{mieKP@7o2z%|QvGUGJiG%Tdk)p} zwWoe_%nwiR;FhjSrYy7E>_DiMoG=D?SjQsDNGw_l2BD9Z9E-R^m99Gy8Iez)*0JN- zh2@MB453vS#DF~0QAQ(CC}3A>OT7~O`c@g{U}MjmEDP@F(%8jq4J6|)oYl7{ZdVW5 z@qtSf6*4K=?;f(noOR$qXaZNSBK#e?@yKOgxn>*pQl8127{dofBMsJVD6p(%&|5WV z{0cGdJwWRUu<;hoa`4nIpAXG7^~B?u3xA*1#-MU{b9{gIaHHrGlQ*JIr;Jrw>o9#o z37gse42?VdyS|)xgx*-gsaQ)RL@v;#limbYiy(K(wkoHe+{}(BzEiQZqh89jF z1q^23+TDXE9`}~cFrGu8&z;Mb_xo+G>sv^71XsbBuOfB({_6mqQ=m`8=RQm*a$I6_ zl4`j1CwaRq-7a~ogIsy_1xf=jjMYGCOaC1yQW{Gr2wGVtCFns*DKM!NvvR?0PUUr= z$rRZ-;dQvGWLSegPQ(CO%>Iyx;X2iJG&?nhFz*z?0g;Im2ZePQMq2fL#$?;uTqpcb z)plrpWjizWV~kR20VBR-ZB0T`NLmFun`9?K+}f?#iIgzSlzS-c$}8hj>bUwR zDcnv$OY_Z?pews$?C1DB#6R<&$s|$&07|&O85F?_!nVh z@3=1vmJIlqjhnTQR}9z9&&>NC7ekrU=v!Fncca1uIc#6W2%U6roh#XA?`KFC*PwaZ zg#D)eUvRe;#FY*>-r--!@LBj$%sL;0bX@r$gOV(6avJ?L@lnb_s#he>l*NpoJI0j& z?+hEXD+xM6VT`Ik?KS;yuNJhL{=OSmfY)h1#WP3o#PEs;DTKd32wwZptgy~|mqf;c zZxCK@@$Xj254&RB(Vx95^NqF9o?2i+!u2%)grEl~51Xr`+5*9rE>=|1c?z(n zLTBEI7?=7~2Q|o1oqy0qhCJ_X*ti zG9MCEqXPb=rmVNp?I{UlJ*sQ79<;>x63l4QJRfSAD7pj^4bzArQ)$kN$uzj=j5)vk zC;R7&eP6o!TOEY&>VB>uFd|Xs=fBSlU@LFujA8*RJMyHqEhUldcS2Vk~B3ZqJYCSf%h-oO1W4t%*+Ce1Yp+3Xh%X7+0#rgTMta5Lb7koMMY8z zx8S&_7mAM-5U~D8q1d$uiu2-JR}-+tOPj`lBD|$)mcKU|mYX8T zG);-gsZthare<9z+Eq%lw;xST3pzH`5O8)v>xlJep`e*M1r}QL^@c_)6#ono#9^J+ zDr55`H0Mu}wEogMk4y86@&SJ=*dq-6EjQNIu(XFZBQ+7aTO-dy+`NuZ4bFL*I08Smo6RR zX9uZ|3@)`)0nfh;d>Cn(5m+6JiI#S9ZZCSD22ZtYN4LUPW(h&}~YuV`Uj^T|XPu`XQ7rS7!;Byayp&;V9{CopfjkMCbIU z2Nou>3*7b=yJcb3{5|+NujHczD*J%2d+DvH#1WJ)UMJ8L-$Z*wB-a$w>P$TQngT1} z$uSkyF!9)EQKOUUV;1SJNp4IBRKwEX>+zP!-^91yj>a+F9=EBVJb# zsFTOt(Ggz*b1{yb^~{_ZBo*)>VqPN)r)|8()Qv<^zzbKLf9!%L7(AbM%sh38kPF6o*;6r{pd> zgv{3LZ&|FCU8=1cz=K;Cz)-1c^KwsABs&`0Zb$HTLnhO5gkZh#?7!u+l{*skqpG}d z-%l>*{B#k?Q*raRoJg|`+o3Tu>_UfAwewe;Xu;~`mz+91JDPxC$Y!thg0K_g)VA2- z4u79hN-H1?mh7v~N7pjJ`!%+MWlodN*lN3cjkj+^3NB5qE@?vc^=8cv1ZHr_R+zW zusXwmEy)6Y|AJp*F(Q?`7TL|ZD}2Ci=;Cnre0^xan3q3GB}ukvdfz7)ZS zi-eLTkkP@>c?x-}B{Cu~iSW#P4mH)ZW6-lm0}$1m76Zo&z>M~EZc{;X+YcUw4b3*; zT;;OT&|E!P*BEIDwv1S-v#}5NAemRqpiRXabrZAMH<)tBUc(7D?A*g5nL)y8X`~oz zQMAjbP%<2G8I8%{mCO{sj!wv9(qS0QRhUdpz;feH0TW3NE%lzKqiBGm>qla-ci4|< zEe=V@kjIHNZxG|oprCq4Y@C>6rPX6_coD8ELV?mW?-yW-OwE24_xs4ijN| zyG*TNonG(k_6kZ5A6=oX%e3AE4vV&W2l?^+++8Wnl5= zpDmQ)6n0GpUkV4T3Lo5N)d+P_zSKQ51Kf$SPDbT$1DOZE+s>ZdmmJd!QnFzI{3eTP zV{#zIeDV27g_dZmny2Vw;cPxtk!mxfJ@@3t?c;mpXfAEs=pjz51*ep1%1L7?u@pnb zw~xr3kKWL``wg?5qhoge?mC;$Xv&x)%yvMBw8EMQIW4U*=D7~B;bN+yQG|+9Lufwu zSI(1WT9=FVk<4n+B66ad`HUq4u=}zK4^dGOanaxqL1=*&(aTB~6F_HmK2j53BtNOD zl^{yVTtfn~EtX-b8;BqD3+Kf3k(kjI(?UW(kr*z#%yK^ z3LfnstT&pa~`^UfDD@!g0M z_uPH{IdOCE%$2!!t~Cs2I2Q)oqKKqG35giBMH-CW@M=NAONNvuFUeaaDG@!dEGxk` zM_Fd`3kAc?gXnNsObd_`K31To`Uo$e!?W3YL7lP9-dS51}v89xQu#QZeM0-{MBf2 zSp}i^faYwRfVuw*LjiV_rR&$H=&{~P;CGMAAY`LVT2Wf6fMtnoy%*y8brtA*NWJ8V zUGsyRNDU0akVJN2DxNj_KIX|I%*#r5q-#*(dxPYH+8lROaG8hrxP+@;%wC>kLkssQ z<-``mBZkCG#bc3qfh)QQsqj!H>LCHqA{j%_55X^>znXysqLHQzKmhV({}9Mk zG_kRBHj%KkcX1~9KMM9KDZi8!_%TNEYzhh(P<{j!mOpZ#u=x5>3${e6<}}1I?O0@8 zCG+!IX6EZY9>`pC>hhdLPef0h$e6tsExIiLsH`c#t!`RBeehiK{z<^+j5NMKEDV(5!B9&WFnQ%AjFQkmIY_65s;xW`QRrs@UB*;Ct~C#KwO8Uc z7)w2R0b;Yh`W@}Kqh))^Ei^%S8(ELp+U!j;<=FcJFLZzfH0IO+swvkb5^V4$XnGJV z8*=>#57mb-GWS}#Cs`wDH5N;q3z5|b?F9c#P~$j1~cQQeut|4w|25# z*8Yi4Xl!}zTzm{@av0q@Y`2hoP$EfhI~?iNk`EPluSr0*W4l{V64X_05ik~E zgmv{rE==a1yi2y7kjfF=hF>h*MPKJb)JKd?@gQq7*#$GzNg0PW^cK1`v~{1sTc)qe zl!-_TKXj1$8QtaaZ8{r%QZvRH^nUVDq2#A_&$5ZkCH^VzJzO`i=nS=KFEC(grMK2D zDl@>)!gQ^polUlh!fGRb*F1qpYh)4Ospn3U)wGa&^`ftrvf(z21V(!!=NGd0i>RQgTg(ACpRR?Rrj zlBX9U_4+Mb*cWpAR7AeX>w?QOEk1LaD(d7l6aP>6gBMoT5FC{o0%ZMc2-G~igj1~Z zQ3Ey{T;H(l8|R`iaTpK(;+hl(<3*7x{t6vdwtT%_0f2m4>>PWI15|QBB#O%Yb>VwS zC6)`_tT%oO1qC$})Lk;9P6NhZziU0LmA)M0Q#J4f!lT5B0fv?Sda;Jzpf19N3HS=) zo!CI^o;nQmX#La*o8$#B$0wxbkhN!a0hYT6UT z3+KO)S&V$Y>;ON4542#5;7~Y}XT0!WK#wC^WQcZRy%h>RzdmNB>Q#L5K>wa(%kG1 zBHl_vDKA?b20y!(9^yytyL?$c3>TqyowX8=eN;2n3(cudG9z-ECY zd)4Y=l9K`E!!SUl_~v>)(Lho{;(k-}i3(5lq#ZCmgUn{Tm@3hE#unorWw-YYlte)! zsG1w~9WL{VG0~=0rTz64)mCXG4JIL^T!YM_N6pbPPXo9@^%pWsroj}0vuJ!(M~mve ze?P1UOe!Al8w=oR;%svKs)gC;BGGQWcD`b$(&XkSyhrhs?=oKm`?WA*pOG^ z*0^hFB}!vpkv9FHmS4jGzqkXm}25YHw2HG2UZ?Lq89)gjq`rm;vpX=(e( zly%0r5wU%O66Cca?WmyoYiECTky$2zvnHvS)Rs)yN3w;vfev!>sag~iEQs3@V*~5= zl5}X2u^oppS(a>8D()og(4sS^>yV;ZB^R%C>3n6kmzukO<}p*uJ{q5O1+!Cmdnhd%I`}4et5gDsRR0c_r=$+ZG1x`in^-3#5*P-I&{1D9FDmbz8>Q${4bC?S! zm?k$^tI8JEYgKmKdAdIz<$1n@S~8X}6M#`FE#_5`kH=;m$O%Vx@|eFnO7Q1`|H%01 z73C0txtI-!pO}UkMmu=@mX>6vGlIKkY~7*7)Iv;ckg;EH5E2!(E(%lvStf4ReHdS% zY)_AW+z*U4yUh+hHtG6iM$}HeMbb^Zg+e3gqS|NaqTPkXwA({6`LR!Pk#x(tMYvI} z1cP}US)?xmXxv2(muXj*68(G|5DahP9UNz(Jwnb{yQ37!<3=y0@=0Dga|aS&QcaeY zgm#R)fN6`!7)+jeM0=Hw-$wC=voUpT*I?zb&WS_}GN($EwcA@1`T0DO-I;4vS=)|O z{6%kZf}Mmuq-RW63v$qoj%zSgy!k0Gh3X;XR8t|qpnF&eK_%iTk( zT7?>aA#;`K$ZIxD-?GMU8VglZ@g89#6&|VCL&7HvatJt6_u-W|u9Z!+iV$%#`m>D$ zL(^vHjSO5tlQgB{)-m%3LqV={bHmK39e0%^}R@Gz*^UhlBp)EpDvj9&T;P zv79h1NS33y@?dTc_vHBGu;Sn@5BHRKI`}-KyW?Fo!2oWciMIG&*RE^AvjBJEHY0y` zjT`pp?so7!79YANRHLSuT|wgUTIy|o)Y)Q``p}h7>=OiNo?4*axm34T*R#@6`>Ull?>V_*JcoCJyyyZygQkweX8&!n(`&`H_-X8 zT=fj)o`QI~7(x&;5bY27fUx?!y^NC~zzsPQJ|P;Oa3SS2YG%PfW&634^O8or($u*4 z=w0y&Qjtk;@pB4^HA0b~{_O_QffJdBFF^cnT1*Tb_gRZGhM}B4F>{w!WVJ!EKM8qt z-}dwOc;n(ipI{pCw*SFcbm2AFkoAqT2VwqKP?rDi5#awTdQT!`;3(qmY+`F{;z*)m z>u6$NEM#ZvYU1eh4_YG^vH;5Hmr|<^g-eIJz!0@^iM)A7q(2lZ0s(3a zLBy@aT5P>>XXk1T(#=O&bpByZqrN$1daHVcYUF^{ zzDShk8nkSL*7*k0lG{qfxXi*b!}x6W@z#4RimQe@Oa$pVn(o$K51sd&kAYWU+I?&{ z4R@Z@LIY->JcWJd1&1lexth-Mt+A`uk4YW2&OPz_77ZxVqnyY|lS(q*GxPSv8)l(q zb(WgOSjqtpTB=wSsaCBNnC(BhsI4!oGnyM)W3`eq&1|J|nw=v~ey5`w=oOh;z;Y}f zn1l-Lq**JnxSU`H96q){@^3MyyMMfeAboGshs9CqRFf;-K=W}QgRL$lr-#D23_`GzKSm-x;(l}JbV#;6dsc)%jQSkgNZtJ>BI2+tZvhM5CBTE z&oFp>x6CSdV8@~WKRD$jz!L>^hfTzKIz{jbJ(i$ZW9ru(gj@1ZV^^*zT zwaIaD%taMQ6Mw5?G8oGiVG8YMiU`KpbmiP+j&a6hofTpc(EDXp1WXlK2wUeHE@^|+*8L;lXc{G3r4&f`)$k@V~aJ% zlNWH=lafCJ>Ji)Sh(VSyz`e)9#&a};?(O?r3Pa;gqprc&k~1ttBoM|JSxMlf$RI~} z_><{cMB;lf7OrUqE<^h~c%;5Km!Xc<5$RFs^fj1f6iiteoj)%#ghWm05Nq=cEp-#x zT{ZD=#~d~b7kjeN&f0WoW*wfH&meyl3oQ+PC*BiBf-D%x^mcIuheJx1J{iG6J?ABA zbLo@aUMJExxKw8_QckX+uTY`rn2Img(S?v#SalXhBT2`p2KSK9F<$Vf)~DtLHTi?} zANXz(uq86-J;b6%P5p%UijOs*fDcB8g$y#{hBIt79ESRK5etoRyC3WiL*;+kN^BUa zzdDJ!!>D-RvDms(7=4&o*DQ)NNHE7OkAYVZDM^3KX--D#6)aR91F{E!NrXC?qmA=K z(k3ismYBX0Q_-#d!4#O}-Y#E!j&>xB`$19B8n{&b;&FG_g^r>`sF8OU``PzFurUL( zJPvHu&Pi)XW7V7+AeG??nRePmsy)uG)*#&|p^19VF7+ei;4*dk~S>!yzIH6hh|XtGT_ zSq$#Zi6@s>nHAj{3&*Zl!c==t4Hc(htJnI*cXu8AteH*MGI9tVEIfUl3B z>rZ&V^MfAeD-J2N&;(*#do%R-7g`Se!Ne0`+vkKo>KhL5gAoo&jrv5SDxHYvkx{xg z{}KzKBMS7ASpC@>aQ4{Pm(iILZl0un&s*iK5KgD%|~wlDR{KA=&-Fd`3dNKh?<9xubVpfIk}- zSzD4pxCoQxb@j~ieED&R+Q$-$i^E>d&TeS`hYT*PkTgY~f`wGgbOY+uovOJz`zDx4 z*|VY5kqXa*1YB~%(&k6o{7Lw3Gt}fxReb zhwpR2a=TGEEm)gNqrrnl*tvrF!C2HD0e!*8YD+ja}d?w(zWh* z%xF-b7T?%w+G<B&QzhZ-=iM6$dp^1U*-vOdVdHWk*A$+EOwkuXH zO3o=(l~d3t!_BoJAz2LJSS%I?54|*ZYfa7@)osOz;=kuTh(wc(n0-;~Z|E#ge9OY( zyB@D+tlF8Hk^T7?J+1@5)2EJtNoCoXG6ZWw^6(Z4w>4`B(*UAHnn4mZza{< zFSfgeUiV!`)Mhw?AsM$)sy7#Z7hf3wa1p~Y-TtdqWGr$EtYI#LW% z5^*~wC5q+gWMOC@%AwW;7koTgVg@F3mh!99S<30H#~Gzy(umP`tTm^PWjGfmOMzRf zCdP<&hr{v@&fwn5Nr4Mb80VG6%9y}tY3LuAxG$-oay|pFpTAVp{C;zwk)>Gu(JRM9 z8>yN+?&SSp$G(VZtKsD!GO1F;+JT&Ea2tHNBpD2n1JveziMkmv# zDCgZj73FDojuIhwN33}HDA}Fb8JD%Oro}g>2KK5v}Y{9_B~fozY~N14qKT2 z`+QY$u{Ux24j@7X*4E$g!QIH@AKR$^L@x3?a)b0J++~CT@)XK@M*81eL6y|~s>+Zm z^dh(rXIEsZ^pY22E>xdr$Vk9^{`ev85&@tL`cgA)$8Og@di}b30NeTb1i`xzxCmV_ z1F1_=u$eA$hT;q<-3gtikgl1E?KD}niv!3@?s0IQ9hl2ff55?ctfB(Dx z$7c1vT=hT0^k2^4Us+blcR(JZN8xc0wX#~e{qPNd#vP`DqD2u97QnzSr)ZySHi&kf zPi)<@gXHZC!4~L`L$W*b-$Cd?iOTib7P;LQE&=m;?kw8aV(^)xjVhFML zu9@LsNQ$mPcT{?aEm`fBB|pGBCsIDq{7Nr_r=o(^f=}w_q z22-WNJb%E_JZalSSQD7Ts)5~0M#t-$kTdU?oM~r9ikkS0l#SFuMy`V9q3=Es(GxPr zF>NwSyY9zRXn#Spk7o7~;_~_;HDnWpI+>A!(~mzQ>Xyn+ZYn<=>!th4&L332ufxA> z-2Xqr0RMkqR{svk{)xrZObi?i46RN6m2m&P#7Z=wy|dI@_?BBAeAM2osT=nfUH7_> zMO-hsGSRqXh}RoyRDJbVWiOar_$DK(Rq2dZ9o&-x@eu&Cn23c zVPiUDC#S@~f*EN|vSM5;fm@UAW>?A0o1IQrTs$3L=Q>?=9DiPO9B+Bm?wi&5UReOJ zkCj@_Le^2-RKiZ|pu&Bho_%|d=KWHGJMI%){8~6>d3(?1RkN{=37ANS-KdUEcSNN{ zP%<$4rjB9=si4{?X{eZzttqXS#F?yAc8?cTuDTHk;Sg_@HIY@UAS_i4F;i*PHF2R@ z=MT(Mc9%7I6lSHUMnv631({@>H%l7GEZ?l|^RhUjF*c+2X`M6c9B`$uCQs*L zc`Sk=uN}QUC3Pw6^a&vBHN(*fautOMA(X2_N39IMdT`!c<>F@NoQh8d=_2yD zx{46{I6i`RdwzSWOvJd!%9SQfrg+-=DrDoyxXKzYE+#7$$eD2_Ih5$>DK=s|s*pW{ zbslkM!2F#w#ZHkGy=mxi<3^TYG9SStrWD9~V=XW*P>#T!8UQu81Am*I8M zWlK&CmoX$cPV6SNrG~1Ii+0dStkQyhZXZ3*U(j>6rWYw6<{ca>FD1bC0!hU~z{ytwd+Z_y+no>gu z`ZPJV)zVQDGMX`z4{PA6l4<0O5oyCVfSF9ZHy4F>C`wqHJ_f3b&Inp3zdopaXu3mO z`NeU>1z3t%)a62B7$e)6itDsrC8iCeD1x2#uKZl|D2)WbG&Od0{PFbkLL#9Hkqsk3 zml&$bcFISeMZ$D4VDtjRJ_8QffuI&Kt7sNa*L?E%`yE~LT+vTz@A!H2+Cx=VHTHkD z=%a*i^sWsQILA5|uAzFAl!>=b9CF=c)3l3^=umHvSjqH+Gei(;GhdS}d?xA`K$YU@ z7{bU_J15pU#E}idR5GBy^_CPDmAD;tm)uJf_KG&MCa{6Yqv}}3*H9OSp}3Hi2E4}d zT~T?A*P-4eTVzh$+*x4DP|9m-D-({H91dU7Zfg$WB8FBDfTlLs_mxe(9U>n^#pVmQ z^ZrnCJ%}-u^Xasu^~TvH0>zFU$CMw?h@1}bMip_5q9R+bj;Mf~R6cVAhMu50j}}-A zkuqQ0lkYlHQnn{8oSPQLa-o1jwu=5{!!oS01|o-%A|JZZKSon>XS~WbE%JBAtA1T6U{h5J;`?xzF zlnE1*>+xXU(?pFWL3SHH6vNb{Xs7hTIcU}7pSC6wsAF3t}pjVF9)!NdM+OFll`u-N z09nhyN1*^vBGy!ZS`cXAmgwTgg9n$-7NBm(W_82h1=>SOLPgCgRV&Na;_^z(1uT}8 znHaMxHdkf+I*V(x2g>h?2HH?~mq`mxUyG?p&zqM_)@^;Pa}yto(L}d&uzPz^BVJc< z+QuP{u(HK~!hYJYor4MQ=3e$t=P9TLTrOtU zz!)VEa%R`W&Eb5XM{qb(B(9Q%&Q%hTN4%KR8-Fmq&^+@St(*0e*@5I?!`H`|R6qJk z563UqUT%zwvB8ri9#v-AG4%i|6nRC_{JNS)J-F=(or=OJ+_nmQ~W_jM7I>Wul zNpX#*{rcvvuA>1ye{No=MGvD$i`1vLXU`>VONgCZ4x7l_`18|>-4A;gIa*Z-U|Nr) zUUHR*$U>aMq&UBFRk}Zyk7ZnTWiTgr@v9&7qlgO8?yWsiVv~l!nRRMawf*BJ?l>d% zy_IoQXq{Msj?PVjE!d8m_Dm-tWz$HUNPern{~GaJeGgZPnDR7|pvs^sXD_s(A?*6q zcbHhCOEjqrl}PbKayQe;rCk-SU4c_AH9d~JN~2NA9e2aoT9|@b7><=Pc{E-&&Uk-E zFmG?hAPwe4$|{+2Zfx9L^({#^(sUei&e2@T&eFd=B2R$VaPL~=vj@ma0lAI< zpXt`&y}uFZl?{?NhELr93JaQJjyC;mW)B|CF3`8C;F-0kd)s{5w)r^v30Krhx7oHi zgoW1E53<8aJ{G0V;8{ffYEqun7jXi;U_hq5QfP5Qg<0YGs^e=SbCjpK4%EUBSFT^d%ugHtMi##aw z1A?kAvN269r1TZZ{DVe~-^xLiR$!?}z8~yKH$YA=@T^;Q6sg(^D%)gMS3%DKlxi~% zl!R8`m&3EJnawa#bs6Oo=Xt9BAd~$9(c-lWt9Iast5i2>k!?*I#u;|Vbg78Bpy@r5 zwMKA_xQ!FlKy>886Qh75iCZ%CeCUB}K__&@W-K9L3-Kk=JkP zng`8`JMP0htbOG2Aj+ume%20*T_E@iT6GO=!>m;V&{&*;ck3h|6R+l$s2)}cy=PZ zFg>A49Ny>;+IsClr9$lhJ+&QTsCTeFhWAgL)_t`ApE`jmAovd$cvvv_!O`eGzPP4j zBP}n?4UGLGU#Jlq-GxAKe>S)Cf^dF^0pN(?8>d|RuS5P zK`V=TgaWt9FHaiDmy9n38#9h#y?dVSV;Ia3-vmNkT10VLe&qnXyyF%U&ydz<|O56Z) zHwx`TqdQXGI8ORNxyNq(ZLgH>0dfOzuRJ$Yd4W~jW6Hjn93JWiL#fi*jkjWFY`gpX zegXLrQNfb3|!IZA5EepD|iG?ZXtT%7_CtBD|#7 z8JrYbgitvdB4wld!SF_7Qv5f$A;Vs?b|~Zun9L0P%M7At`ZvAtWbc^}j-lyiW}w0r zO@14&3lBHFy2Ts5d|eNaM=!Y+z*($X1Yk_8$9CQWoYe97_d>J#wTys4xY`3WY#xnwUAQQa6a#-TFY-ly@Sq#LH z_TI2R-p@-xsXIWaZ${l+kOF503Js>B%X<*!+DO7N@MzFUZ<{CfUx|Kxfs=0dNo1$P z5u4#1F9d_4E8o7s_ch`jOGHXhSK3<^s zgX}JfHd88y(+aEKu&GRxt2dMwhTskPsf_eJD$G@U`_A;@h?pq)^P4G!nK&^ONxU|E zFQz|lP>n>ql~>pQARlF1?NEG?h@_1$v4}LD+lt^7ni8o6K_U-jTyG-bhKK|?{Jqs!I5Q1Z84xP%j&p*G)1N@^OTa zO&7#yWW6@n@RJ8JTJGS$?)nWb!!uu>8?2M=VnGFtG64JHAAFz^AnIqwKo#4-M-${9 zVFtH@K!zGi42-YcI0Hstf=fDtpf5P;Hrw=o%1!_(FJizu&rSfHu>MPhQ$HfExyZbi zCT~@syuV2L%@X#!0B^h1fwuXuUp_@*XB3gPeb@ zwX5nd;-uW@C$`M;*HMP;t129<&(2>Fv#W04;>XwYKOADRAsf` znQs6l=u6~RTJYy2J@kVWG<5R-i#Eas>H~{A`r;t*iZ9A5ZTkqEI!BZKx`B${KMKrn zKV{G^zE8>;(EP6o()U9E16yN9I}2kvCl`BrJ4a_aS7tf`dwaTnRgnJG_V9NZVc5&V zJxS&1tApGkDYR`C4Jx@+9<9K+;76o2s1_Ep%2ox?@8ifmHXXmLMPY*K96Iu`Xd&RoIgdVKJ(@>|Da)OY31xH(3SU2tVMk@ggktbb?T<>QUl#w<7pP?K9(;p z@)_^Ctlot(+fAgl6+gE=Y$Y7&SbS1CT}#~e0KD`S@ham>+&2Kc2)BAuRpm+Ccl_`s zbkdu+p+5DY8SObO=~4MgM8>-Gn;dX!JmhP9)B9#lJ@UPoEjr^&dsFE7ngnR{DtVO% z<@4$bh8>9TF;6c>^kCX2;p!uIouG#$;LyQJ`_W#K2KaN8xLenj)gIRji1s-Z*2kDe zD$|-Hm)OaNXCuyuXCn{1-6KEj-aS6+-b8!nNRSOa^$LLvy~CqCD{S1nJxi?pm4Gb{ zMZO4Rf`ScwQm2SVd!S^VI*8GsBW%<@By9AK9W(a%2835VQ>ZwD;#a}EbfRe^bIQDQ zf@vl5LUBdn5j~)N`$J_(2CYmCGt-7P^>#+A4?PUqjN`pE{PHd0{8U2e)-R_`?wR5H z&91&*Vo;vYIvYC$xLx9zMZ(NpCY}xQ&BB>QA=M?ZJ^*KXCbqmILeKXN1FhS}vjDts zj(dl+x`cOY1mInaO^Ti|w6=~7atd2r^7UjW)=zECVciOT6zb^F!rlF%dcp|`=rC^s zEP!?-L_&%O>dHJ)3bG%!TP$0V{%k9Xa|p11f@qXbOn@S@qiLVO)&SX^jt0&&oUD#% zEY)k_O{Q}B>Rc^;y>~32R&c8Scmyi$fNe^ptFEc7)BD+FF!v4$ZD}?Z*{FsUo2k|5 zEpXX|>2hy64n^(QHvI(lE$>=i==*pQBJ^1rDPKI02}+gwJHx_?V>9ur3G zlc?sliP_CH1lX1qi8eOV?g0KUp56Xne*k1uSo551GRE+!N6_{2K&vi5za&TpeXCzo zdi$1o3sds#yazUSAvDdXj}|QCM6e2W>UPr>HE>)x=5y(mnurZOgblL39p+o)RK8nXrfj51;a(? z)Q-P{GyT2uJjYCRz0M`|+!NeP`p7G>Eg!(pyas(SwUVY!sQB2K-_nY8HZdOSZpFCl z^;9V^up`oe6+}XYU0hg$MJd2!l^0KEP-2vr`Y5p8q}l*H>*}wAUG+#T6?Y-ev8Mu% zp>{)fADoj4nf>a=+u*<;e9X0B=gg@PDHu?pWJfoE0HVVSQPe4>K<71qK~O~Y70;4q6YuiVVf?!;BBGY9{V~9FBmq_3UJ4hgE6m*C45-xe3Mg0YqdbI1ui#@|Ix` zgF^yU-A2hrai~{N_!U6)8IBh;j6x#GSt26(>Lo=|=J z=eO$EL-L$``t(@ktR{W+YMG84Zu^DxlG$4+d%*W0&>oDW$XLp)IPl0@t@jo?9p;{V z9t{_ib+uM8A6VXW%R3VwoHUN0EmiutC37JDjSEE9AG6T@_7tywI=~pU7h)KFGNL|a zXF@Lf%X^o?2zKIL2vs34F!*_@g8Jo^nef@7Psljxy0rlfep$hXyG=oWn)T%b3*r9c z8(n4~Zbm!H*;c_&uh1#NMFZK>ygaARkPBFjt zw6U{OAl2o?(DB)4i3F4!BXg@!Bb07WK&&!)@7%}4m60+>0mB7;0owvH)yOM*PSrsT z$6S8P^{{ZrG}n!p$KKN}Z|Gx%9Uwm1?+~5Ui}v!m_7bl^484(uUB$MlzvL!EO)cud zG^x}#@9S97Zn4o1$=3tQHbu=ihpiQUW>4Q zh4?hsd~2vvGYKi{tb ztPS*-@*#oSrUo~W$FH=j4mKPvgK{H0hH4SC_E6FW%Df#aH1Ka98V1`4HM=Q{ZRDFP zQ_0}xKqXe$xI~?%ZYr1ut^V>iAH+4)i}*DSEn*gmaAmp7^0qcr&P!{86KWB*hA2Wz z{1X>(0iavx$q%j*M;;>rR;M9n>k6LPVynJ)yu{Yt0YHvNpPUF4%IuGiLGX==eeS{& z`L?iV*&g!2i8*8&DOvc_S+#w6H>~6~KrUOz-ZcV5wR^_2%D`<|IN=2DHsPx+%IiU8 z`YXZHL;A-mSt)Xl=^tUdi~Rlx_9T40Jyt)4kJhKah!0}J$cAbVxk7a~-Pxk3I%Ms; z#F-GG8VASH4@QnZVV7++tDH_T_zA4m;<2biYp+xu(5dZy?G5#hWz zZRY#Up7-wM-hy=t*kR!m)4{@35GNF4ZH$ond+9t2Qt_65Si9qAc7HecVw6 z!c#!8pobh*$ZIgW=JXrHwzFH>bJa1p(+pm_V0aUK{odKWmAIkq<@Yaa(5Zt7-D`XM zO}Hfz884m=al&=F{gBg7et!)s@=y{b$MB-e`%6Ajj!hX0OE-@2OW=qxd31-Vm?P=S z{6@pOHEM?8MVohf2l_=&$fR-$Ot09Ky7H5+7X?N|4j=mg(FZ20Azwvvmg@2V03I@k z?uZZDGJtb_N9si}h%RVFxrd709oUZ99a-;cj~ccoQ&$*=;RS2Uy1c+LeJOeJN@=kI zOfL%0M>G%HJI8*{GstcS8D@=& z^MzJOrRo%{TgndmjLovO-|e2K{uP)-F6jC&3C0tC^p)3hdgsq8U=Y6YJ*=_aJ*+Q; zwW^eeBm6xv7~e!3<{5^-Q69U1-FU;O$xFe5tJF2HCw8bV4qQlK5v)tX&y^jX#+TsP z+hS%p$j?#9YYT%zCNRFqvJQ+izPjn83mwJg!rBS>gFSSZPwHNXFva5g3dtb7L||>@ z;Cf{0Y#C(wvWZ|7&MYuDB^2shgLsu>ZQd+0eS3l`DM;(gWZwtrgkgH^A}ZJxL5~KK z{`#@l_P#^A_r@qahL`L2$^zdiU-D0L>_(v=y?wv-7nh)IeVY-xJqObpEqQ!jY@{Q% zVh^=UKgs)C=4+|@0A_s2`vhiusrv{V==(A-KeFzbl2^e@x?xaepdF$tk#LxY}t`GBIJ~M7_FkJj)p|0~+WHn;t%-pC` z2o_7KTL~s*ZePUx_3u$N*B&{NnNcVGpr5IgL`-_q%T`PzB^Vlm3d&!z16aq9!5cP~ zD%-?a820$)%A!hL>b(JOK^t^)sdQH5WV3SeVf!@5@w*EPR(o6+3LT@)6-#ff%5$E{ z`6MoJH6%!r-w<3YTi#M;g%Y!aopXu@d(7EDE{@G@waR5A3xBF=E<@$*FKfWD2c|s; z@Yr*X>}JYaWvS(}mC@!O4V$F6OGBHg!dvzB6m#a+lu?-(7=Io93MBIb0b#C{)H%4g zT%z>bp#6>4eueu&M-KiFIrdxb1g==srT@rZjgK!3#jRqA)Xv}e{<$f77AT#mJH~y{ zwcQPWO{HHH}S#U0)szm;=AwQWb$y>&JvgoQ3WIKEp8120Z zIFKq}QDJ-7FUlzTKqEUXuIj~JczH&@jL3%idg>yiv;a|E#_(dtk@meSF{R{YYxAPC z4xHdHn?$=%Xsm{IR|BC zIwW3(pmKL$)f;A)!3r%A42E|{`$&=n?v0$#Hpd@l1t?G2CJSC6Qz=yr4~jf=04C?u zb(;OCS|iz=etxM!v2{;GEhIoV7Kbkao*mq686eb;q;bPTWHeaS+*zuE>=w4R(5xBQ z43qY_^o)R}hk8cR&8k>xC0qzvvcaI1uz-2%>NAh^kW|1~+Dgi7FxFg4pvqOi$6Xb4 zooEvG%BxAuwYWrZ_bteHKGtz=x{#=>*n8RJo!DxFlEVDik%fKTB(-($80J|wGu84+ zbV<9sUXD5#Tss_1Hx?^gk(;S4jaMm4*2}3G?WAG18mHe+(dbS-L~!PKvPxGDySP;R zgXzStV9!b&@M^Ak#-Srt{2SsHA~;7-LRFdapIkls04Fa zfb4;0j;F^9dhDH#dU_$P z{-QB>XB?>`iT;w+P(&BzldAN2`vcZ3ad%DQspYrb&~vT1?Wei@Tz&oL_cQSMpMuAa zaNZG~yb~{8kw2I|v8^ahdb4Tfy#wZ?9CO4}w5uYO2fBMDC+x0?$REumofJOg9kVWz z&LgsS*2}X!qU(9{v(x>r!+ooAug=^tg^v%grm)ClK2l!;%ap^M_q;CbqNnNW>Wx9# zIg8YM)aOGH)7r*R&Hljhky3=NHAF@N@nX&0Wnr%s+gM_1lQG%H4D|ePy@CK@W47&AlXi1zu?< z(1CC>`y?UKPLLeuN|Ghg1Rk&{(pcv~)`ag*p)~o`64Gi*O@D@d@-NSUIs@y7vl%S^ z%7j!QSd=n4<$KWkRT+cERs7to3V8bAk9WQm_rSN2Epa@rJH>HIK4q%3rkj}$^)%m4 z`?h*t^nRPJ{Pg3S{kqQo)X1?(A31nQBE$j9GwEGrmGy4c_2F6?K^7l6EAK&fN$Zp1 zS14D1V3w*QI&5szMiGM#LOV|~0Oha1;+r@c0F@O=uLUW|>q0^uLhcx*8FPq_UplO2 z^C?0Rf>bG~SgHzY>UBWBt$6w*+w?mWkyx9l%iZ`_Iw>KY%0TF=sr};scao9;z5x$f zhJ?&@;=B&C_JQh}1o2+Hbc9b#(>6bPk4%1bn~a9tlGHe?Y=yQ~C<}xeS3|2de`@}1 zxhyBd8hvAu=w*TK{Gi{kCHd~48ztD?uLEtYmBQ)v>_5oEYywMRX( zD|GE?u|sKSOkCA(cLWLfZRzq$fbt83lS2p!g$&18b$Z`K$+8N4AK3ObkOTZOPYXjy ze^b~;B_HKfGM5gS-;OCYj{LHi%sq8y;DsU_Rg^Ykx>zTQ9e;MTa%h*fOThFG6oDgj zsNnTps}>GG!#Z{pgM2|SNKIU#zSPvcsb;o8o(|G33n5iP1hp~K9qq|+9VM4=nHj2< zO(m%}&NeKsRxFixFs}UlOOzf(LL59$HK5H%jZZVOwE( zwP6)R&_XbWya0E^YN~{m=%t}cmw}>RV(zkq3W$=lyQENUo&mMg2Bk2s!( z(C@O>t);;u@>IYTLa`)PEtyd(k@PhsNh`IDJnA920o!&tVwezL}uw;v1D2 z^x2JGOsyi40dTk@Udd}rT+fs7$$z-ALI1hM4SZoJ8Jd$&k`c)al|yBg=FM?ld7?GP z2O(Ba;kB zsHUZugO_F*TOOP#;G=>|%N2OHsO_VX06BW3kbq@1UMC)-v`_O27{E~!LD^gaNG0@=4h{@lT0QHBVX0-d6`NwFlhtPp7B&fX@i563RP#0Q zN%M&#`L7L27gHOTAxM@EFC6wx9Jjh+!zJN;WoVVkePoDSOJwdP)s+fMA`(NSY}sjD zP+PW}Y!Ju{_u7^l99zOPI%oCv#}@gF8jJEM==B3Hkgfb2s71~bGch2nK^x}Kb#oZG zdTeqBKJ*oJ3npGei!5U%v1EdnjG(L>iyY-%g;DX-=@6(XrVvKH*a(Z|GJv%T{b`H7 z6KDNqJV)Lj(F!IdW0ur|D0}0`OiMy}GmmF!hbHK1oU*DDx&mewO3brHkmFp7g-l41 zuRPZ)6;>TF4d=t4T4EYbG+IiBOpv|UP*NQvCKn!n4FG*M#n?30TSmhgV$vnYfl_SPQa(()DpFojmitMuh;?9t`mwXNspUL~| z*GJ@QO10>(+O!Q>vY(6ZHl6A9X|}{Wh|Y!&-H4~xK7y~$!6lR&dUYiqqS)AWHo8IJMvVOOAk47 zWRMq}7U;?ZJS;j+8~-0^?--<8lyz(7$;^{^(zb2ewr$(CZQHhO+qP}`|j;~ zZ&!76bj17q*nfA7J=a=u%`u+LjBT;)5L2Onw?{9HXRpK9Bh8a0MLdjQmG=8so0>tY z>2j*X4A9$($UvUs~3L8_*N^oPtMjxwPa zl_R#ez{n{CyQG^!dWLv5CISC_$;FM?7?)g|8^1%C-8>$_z|TL}2MXj$IdiU0Y*Gq3 zvz(qNWi_!@o>JUTP)+4FWR+i17E3OT*bgQZIH&S~>rm$;>y_TcROUEaAZA-*;n&8+ zBCC05JCIeGz%a6)b;SuW!MNm}&^UF#ZDDLG;hsj((u*StbLH4@0*nuK5{he$0^Y^J zy7#6PAEPjGM+;QudDCFb1e+|l9=7E|$=w+p(e<1fY;93qt$jra=|iFhv4iBMEZAUw zJ;Ii>(GTTCzD3t|6x4}(DWi`37Ons8ao+KID_oCAxlT8=ui8GfqXY?1}^Gr;ms)kV_Ad zNgILwX6eHk@c1qD!Jk|Z*@o`9!7SHxY0B^rD9Iqhsuv+GIFM0VSV%~M{~jwZ=pvug zR+Z!FEc;%ps&D7t`zOP8CAFMqL;kbuuk1(L-|6D={s}YQv_s#cAi5|Q-UA*7MWkaL z37`q^k%)fhd3CepDi_`wo-l_yLqdYVT>zMT$mx=8P2Nv8TBLhe^kE^!^pFKrY`z3n zLagBeQxKE|Ol&C;J20$?qQ>-zGZ)Ta=@Yw05$?e0lQ2gz9C4L9!uDvAg(^+3sZ2?j zd&Tvsg;TTYe3VyOceH~QxAxD)O+XyV^t0ZF@q(r$F_?j*GzXPF_G42NCoFo0Ib}OJ z8^XbQze8*-_3IC`wB*wD7)D(h&zqOoUnL)6fkoO8m9%t!>aSpru`R-!_TUpHNSwnE zG(o2)f0>+ujLCUN$Rq1-iq5hDDVSJHvzQ6F&y3HF)BccO}+2S*|AQ-rckw@)vf9a>RdGK z4hP(}Yy|zZN7YsTs05Ae{;9OYYMqVa71=qo#7A(cl+~Vy#U8dBTbZxoz&vvO^HI%t zLTF~UGuEE%7q;UvPo|s)#9?nQ%~XMzWOn3c=00Hd1`Jt~AWbu)W)pRMI)_s^SLf~+ z%w&F5$Y40@8c{rlYqc|1lmM^+fY9{kLpc^Tfk0ZJ;fpd=ON;+MaQ>k*(EI@1gx7^QbBoK2G|xy*;Skl@=9%5tPD z)sjzt+K_&Gh?m!>r&l6WSal3bQ&zDcPW=wP_(L}5@3_j-$Y@b_x$Pg~shqWTp_0xt zap@-BFr2!}aV8&lRhgziO2zGzCb>lXbF)@PN6$pS+$2|QOmekOs1T7*Or27eURXw9 zSkBFDG*3jK;yiLho@OqZ-mYGZT*&StMPfDFO3B>4jF~bryyB$Rqdok(OG{knckuKcsOnwgX(7Wkd`__I7YxW+b4 zp|+)U?y$oDN+ss5bk0(Xx@DVd2U_ zhm3!qL{curj+1%c_sSU2cgq3KoLcBI*4dc{8P>Hij*>W@yJ6&KFMsRBZSk4&87F*?bY|~HY9NfhhXm`F!;7aaWH2=^vi$z zuLSyx&K&Spu<>1sBjI;M^gv5k&q6po#wdqA%Ahnw4cD)1Hw`3;!WJxv&eD+i4lNPInt59vWIuA;GmRfc~<=B@lBzY zGxLU+i&L5Q-OJ%Vj_B7SO~!Xfq6tlWUk-wOR3Gznz>=9OY^mxi&EQeV2HEhLayT6y z|BWy@ky>LC%*jE6g#sm2w}%AfPS=QJ|8YAMD~EMiimWRavpVD z^2;|i*sJ(mHfV7*4jzdtD=h1VZRVi;ws)k%O_zJ&@y?WMo%DxZYWLf|_<4V=N7fEnrJH=hpoZDuy#yiSJa%%b)uSthc*0+OahsCz#s}vv-u$BYxzv#Cekw^9Y z)}o1c2cD~K_!JgedOwFkig?<2CE^i7aR)_tnh``@W+=e2eEyL=#$`Dxl^DCQs4dor zh`CW)T9^)b6f1TcNSj9go6=8@(GDvOGV zv=mq6AcE4sHjU?WM=a5gO9Sc`H#RRKT7o-ifm7%)7U-S2nRz2TigveupYubMDeY#% z+QpXj%Kt83H}0OUOvz;UijN?xYdohD!d1-PE~r$3&Jpa?P}CFGXr}(y%X08pY`)#@pll;Mkwwk zsq3$n5Q#qOwfcR;syq)XLhwVF4#(nVU!9X&!17MNQq7XJ$}xB_j~=2p`$VJmb-IDq z!a@a{9eQ@kal6Enz5)Q++G@{&|I61cfuH)iTLAM#Y|z=D zRW}!_%DmR*U~-e`aI)F)@OhF_1HgPo3xUzXu-j@7+@WSDOE0h{yfn-e+}Oe-yA=&- zwP{jo5Yp#%_D)~vBGg0k4w(V9=hDyXwE3000>OWU&0{ZAb7BpuepS{yOMZLdw}Rl# zHS9W0dt_Di>Aq`mc7avY5udlpia64L1@5y`g%es!wgXkTlZ<%fI^}l~c55ioy#m=L z*Ft6%)Md0glUVcU5Nuf1Iib500G)S?KAy4xR6{g?HAm0M5S2^S-hr<;9D_pTm3vBC zR?JOjZ51gXq(M4nsdEkyhn-T58zHt~{TZBUX+Fp8PULPEUUmvGz+dL+_sNnwH;!|M zX03^BVGvMn4H8gGr9&z}_hMs@QA`SL9P2_GWCm)+3a!a$TN`ME!35$WSylSxL;l(B zM7p8ax4vpGH=^mxXs%5zEZNK=O%^;vsZ&-m@!d71UZgW!{5_kW0vzN_A zNZc3s$~YbW0t}Y^Yi-=5R{S0^OyM5B)p~i<|3vqW6a0{4Ky*?so6-r;dYDuMQLIk2 z+>^il?bnd_6QtOIXMlm^5$1BnLg*GQN-X{%;JhbvLT9KNcZ^UsY#m~-C|yJvmEdH= zz$S{BxEDMEL_IO*47xxwn89?Mxgw8t?G&ogD?PmDZ?x`kvu@`8#F#Yr!f9}2gJQ;2 z7|D%Rp$m(-6(>nSRj~GXa#|D&5{*Xso*$nX=pPX+04ALuFB0H?wD~Fje^T)ODe8Z? z(Zqh-;y*bcRti7kM=oXtrvK$oRnquL;zRsO*2pWwE!`aC(EmlGFUJd;gpW=oOEv&x zvtekak{~4|ziV<9$-vJ23iKftZL*<`7%VNv@ZiCi98*{`->tGAca)?#fqcem zOEZ$>fO~}>phrgJ-#9TK8@r<%%;-mh#Xy-N?hTvv-at%~G?{QWoGwu}I-5-+u@a^i zjn|xCg0H(OnT@A3Wnq_p?XVd;U&|?QPUBBM=-|y(JCweNgvn{f{+WE^0QAXfql*mz zf~_~#3y+PVy8I}(puovc>)+_7#K}@yeD+%#y|(c(sd!~{u+~}^D1*)rt^T`X6|&+R z-99KpF)&VeJdI%`HE%)Uog6*{Zosxnq#3zvw6d%e0qo`lw=qT-N=DJ3+*Cuj-9Z3t zi)7)bT(>xab2RM5D9@6wSa_?kKIm;;-h*49rG@Is1%EYe-&e0O`+=AJH(Z)V{{ul@ z5?)Za+fqv`b>`5l1ELtiKoO5~CenCZxvWyWLr#mb^HwI-pFD53!7fM`@c#NIznE}^ zKdxn@SF@UNaU&8*0){|6u%Wb?Cn1npPecQ}Ue;tHg7~+E`*2HvSM-#OTQvzUWl0>+ z23TVX9?tFo(ig*NM^Ni}Or_2Y<2^i*dJ<@P|226jH;^|I-4t@hQh$>Da_H39=Shj0Bnr|#YwD_vAGdK(G}YKR)Qmm7f9 zsBIiGew!MDT|(mdsN^mmEKu*f8nQ>0#&uQD_81vE1HR+Xf8PlyVt8PYfBI8?s0SkK z_lan{21IrWQ@S3hXuLFvckbq0x*o%8J!J&Fbf&+0MR*Ev#x6(bKL#aup5|swPq5#D zLjM-UXd~@2vE8;q_P{smM8xj=`Ky8R8NGcwd(-s@ibIvpGya@o_}T#J6Sr5R{g#1x z>w@=%C-P0!;4^l)L;oIg*-bX!WAvJ1*-3<9GjWLp({+*e!YPSOeOsGQR!WpFi~zKC zh9wsz1~zn{Ue8uuEUyl3=rZ%xyc~saq0aIQEMs)v zVkH-{G+g?#OkYZq5Zw74(XQ_<6R9cAtS>vu7J)2bUYc54K`?^_>=^27tZi78>yk4d zXZTN*gmFjaArrey3ie}NtW^%tl7%x>+<8-#KabJd0Fc*RPlZ{L0kPs`EPhpOnL*~! z`bHTsk8doxvZjRwVl4Ib2^$~{rwlF&HCj=rlV?d@&f4~eAe5;B$6f^fiD9`iMIlfY z+>d)CCl>k4bdsDt7DTN;SjV@kG9XfUw_rmw2}#w9|# zyE50rnvI_r5ms1q)gNYFpo0J;HbcTiu@q;R!n#qEk&h}_{Bk6O8yVYeRlodjlN826 zENY;%#kCZSEgR4LT`)JuObb-oxSSkY1$L}Vn!Oxv#{~X*&Jy}gR8FgriS0~>1Z{dI ziLbOcGnON+O`B#G4jFeY_~+{E{GtU;oX}`z0F2Nf40tPhT8NB8i9WXBN@_5`jIhtR zc`yGr@BtWVOedf8BxXWbdDGTvT&N4APyvXd@To0+MF)?cWO#{` zmb5k-ilm8ar5SYeG}pS zu4F#-1g*fVz5em<_TxpW$}m2{>O=o+xRtYhudT2=!=7eh{4{mucBQEle??OWD<#vP zj6la|Nb)DLMH&Is(JA@}*_@CraFlu&p(0y23UHJKBygzF=OM>1esnAOQ~uF?`0QL; zG9skxQSYFMz#DPBwrK8>*{A$#kaoE}`}4rQ;)jVx=rB(OS9q1x<*Deinb|dQ#n$+W z-6WzuZJlLvoo9JDQpuDJF27kp;x+qq9>gIW996;mOLU+dJ@? z-L%o3g2U$ihSuqUh6dwxdzC%+?1I@NzyV}vQpXzBon8kx!=RHp&tkK+Wz=xtre93u zBTY^oJQ&_}a8#NZ(u?Iy@tNe;O@>vgWat=3+Px4++`mpA z@U<&%;kCm-Ec%GAa)~lh!E;7Q$UNyQ3qc802k0-6>}hBeT-j=5U5RSsUlFydW&_~w zb89&THPVc+7O22dM%vgoHwPPaGvhPX%#s~62!p)LB#R7EkfUjaD%UU5!rYdTu@fv9 zM7V%~M!fm>&r*#|H5$@^6t?QNt^f*TFhU1K&QfhUfMU+#T}t&Fshu_}xOYCk_88mV z5$aTd+xA9+7=}}NUxQ6{7{_(>XWgav?d2ngg8ht7UadVv3n-up9yk>eRUL|vkGL*^ z74XJ9H75;X!N&>)K%FW2zgPqjM^*#t2%*xQ-14jY! z11|h53-n2jK*W2FqI9#XiJzibnQ&t2+B69deeNeZ8rEd3OY6Jd>(c`p5HqtjVx!bt zCJfCado<~v58k50E1#$A|(;6SC3O0kOA3|=sIUiZqRtSZ088Z~ zN)_P&FiJ9*byU|b!W zk`_OlCd`s6XWFRK0jp!C>NWJ!@*;-=(TefG0wj3YMANbKrDo_&N~eo<=uTSqdPhJd zpe55WoC1;>dl{n++;8+V>eZ!zT>BaXiq})W-x6`wXf=)?tG6JnN8F3r9>>+fz(1eF z@!m^}B;FQ-1%QZjag4R;#NL7f2dSpn1`>~&1d0QB0yvcL0*N{+80iKQk0Yjkx_4ja z9T-97S?2sCZ{I9tDFO>lc)Y~ASQD2E+gJT^6pX>G$%}%<=Z}fc!4}Bkgoe%G1?LJI z#m*0MOjVv=SQMX;=imy7zU93C`eVNLTX9FEZQV@ui*=Zd6 z?KM675UP{WA@Htub-sAEzC-@Fq6vA~;69XNLD}JNOr#9=!HjZ%Lz!(M>=SJJegc&N zICV7BTNyr!*$wA_p7m6A+A6*|EE2GV-5g@x^F#`>PjDT0xT{($_SJ(7O z22d8YewFI zij+K+!ok66ty6qk>$h&-$Atr!Q&Qwj8F&0x=s1CvxmT8=g z$S(HpOSp2M@Z(D$EZBU$P)rw$u>pwER1~@2G{r-miOLV);CJNgSu%MJtz*a5llCme z4l4rH`|bEPzehFBm}$dpsEh~2b8_1*=Jt>Gc0K|YQy1u8Ei+!_B|OW>zMK#{44n{+J*Dt~2Cl}43HS=JFX zuOeC$S03JVr6n4*xH*jwmP17TIT%OH3%YWMk!4E%023*F1ygU_?s>(fVxy!R*q8qc zu1(;W&n<+&@57)XL*GL}a72OrF(GW~Hp1BewLci1sSyAgHzBr~!|xj+=ePlTc%?YN zVal8n(#ehE=Jl)TK4@_oWiHK=uIfYr_ECatGDR+trez!IBvk>Z;f}Iso4nti7+Iq&3b8kW zE^QI*uhxRQ*ykr)jY&5Jc-=egEfanfg1q*&tKq%0UTfrnG;JkG`#ff|FzUH3X)B^= zyf$>Xw`j7B$Ir*0elG&O9yszxdKk+_1$EB`cX$%stB~eUhc$GEDJIxF%NC?3Rg*D% z3kS1~f8w|zN4bTTJ|d+Irc9%jX7wDSKV5rHv67_+Y6_a!alEm*W-h4*Z3QHC%5fmV7|KE#{~e zZ}d0xh;>`5>M-m@)>$P!3wY3!DUNs!ds~YQSp;76kDqM_h2N|_qC*qwFZhhu*xBU9 z#Ky+ihRhSEqRgT{K{z`kEVxP{3a(mg zOv?&vCKJY>n0SrE%!k)+?6&8qXGBH4j|MqF*v9oAS!f*2kv_T?Cg(ApoK72$cm*|< zqeMo7f+0_Zge)VaA92)K#DKANMk;v2=O~52i5OvB`E5;!4dp6;;7kxaAUn&!3CDqq z*76&z3ZYWel{G&kgapvQkM{8Vw*t(_qpButx>eb(7%Eoi@ZBkjS4V_+SHazA;0}ay z>;r~w&u&N`6iBDs^yYA>5^V_nT(50n2NN8G;K-wYb%BsYbYF8=Tq$@^i(+0;UTGC7M0Ju3UIh7$e(m!Bbs^kBhuSSvORh%Vo)@j>GpgGFJnhyGv6;0fQ1AiY{broDxb zElR)?OXARsDBSbkm>5rMofnxXPq(sz#=>(Fab-Cb#6VFcmiB2`#A zuo(uL!(s%!>r4qT!R)|TI{NHX8>4U_dTTM_fHaD(V`7B!4vwNhH)SG^Yyp_N`s*05 z|3m=`*&v9fe%j;G!vmirrM5X|c77c^lP(Hqw{oH{ZB6PfDw@Ll260ja#Bs#NO$p^ODfr-737#$^;f6Aklze^|%&Mqk>6{wu&gL!O`RZS^1xN{?hz?j zY+{GCt<=T{qszr zkd#wrAIY9#^T*wizPK1X!j?MQ8F^lG!#;6!|3KM$SeZ_il-I${qIo1^3jKkPA_Zr+ zdJ*+me5b{q6{)d*oZJHCJfKi>CPR%NXF6Xhi&EWd7d|RD+TSTuTS5p%mQkF5JBLhI ztLCwPFNwnqIIA-3C~A-jkAT3j0+M@axbiHq?}a<^`oqciC|>d~Z8H>(fLUkSHIA9D zEh*iU#~lHTAw_^&MK_6-KebRQ*%B3|nm4R-Nf3lHxe;co2apTmUBy(5L#^Gws1d$r zyt!l6Wr{o?{K~#scO)BWBxUYs!C2cGS-_MuL;CGlUO}_W2Jh@lQ^t>@)|F!3JAgoW zo4|eVsmFMJc~y}QFMOZsm{XI^^*fSz6Bi;1buEx>q6BJ2AN#>!TqAbFG0s})4XqgU zV<3*uLig>Zk&0?ld#>~xF{Q7uHPzwiG@mx?x+l#kFBc3exHmv zMH0Q!24-FVc8_(YVFY%-Ma70j+C<4@&}s(I1I7e}4+k{BiUMpn-ojSygu8mdiF#2SlNtRp)jNM~-V$0!%b;Yf z3Y}wM*YHNXp`>2L>~iU{sZ=^e`S2%CrbElXrFO;a^6BGD+PP!=dVUpSbu03XrfA>n zGU^d4YHMJ7@U&c_+5z2zp+m*MX0N5i{$hK0ySm=R^fK#GEA>hOiacs-WV>pP=8P@M zTZqOqu%TkOJT;#VrD9nX%18chLIxSRN6qlI3~I37QZ(XwL4S=949NPd`4b|K;%S8v zVbw7~#ZuGj!ASX30(SzYPE~b040%As(lAdKt+`G!Iwl|TxS8R-F~cwAll!XP(~TBS zv$GA%0)YvinhykQ=i3P%x4oilq-%~^B{e=GvTT6pYUYsDfDQ8Y2j%RHIaU9Tx&{F+ zJJ-_k)oUa@YioLHRw$w9q;@hbT_&nOVN2B7Z{=M9Nsby|-LD*5Gw5q(3Mie)LY@9< z(lu$8?(7jvlIKmM;ApCMEr||)r2$CF3xf(kbha=xOy*nOOzO`R*~d1Ds9k^7o3wb% zQN-{zOnTSBnQFGPq0TVc2<`JMlqtvH5cdKE$V~s@ItEdxGckj8%qe}FRZUCDbcJNN zfH{4K#_mz+TTJ3hDFk*$JrRFL@-a+&1uJ4Gi{ym`;vH|Lfjh(W8zQ)V!sNd}p-YGJ zU=zDG>1y6z{oS-l2L@o7o1DOlnQ2^BM6Ez-2wlW<{ZakWRm3SHa!~Xa$T^B}5#S}X zj#g}d7aQv-tozfbZMCRa;ut#uZSsJOEn^t<{J+suwdGVjMFT6QO8}C%e3LxYMB4fn z_ljy-yADC?g9(vceAt85a$-=9=Rn33za!(K(n^je75On!;_HIg;28GMz9mb>GzZDf zD5T?#P;kwtG$3xoeNVn=O!s)U)*MJP^%7Facw^0rG8Be%l7*OsD4Xwy< zkBr&XlOJY8>A5fI^1Z06TXrccTK77fan6}tQUzhJJyLr9Y48-}D+7M(&xbu&51=c5 ze+@7*AtzWSsfSPbrB}n{XU6z;PVy~eEzw?vpH18?rLBBF*)F4PQWS$@`1df7wQ~IU zuM;9pP*3Qh^`2Yv1S8bEKSG?f~%hw~=Ki~t+ZZh`(9An&fg8{lq`muRy&x ziMIj0IPteO0N=%dJdhu7U_OYi2Jl~0yD<{4l(!^=A7Z;QNkfnYlkA1~;w0am`0~)~(E#w^?}_-$NW22xq7Z$c-lhTs%Tv`%HdE^MCM)D{kG9D)A5segnI}kjini zolDQM+!i7Qp30of2wt$9X~gb=V*@z(U0-?zn)7R+h#H|nR=L_TxXNN&uX_1$impcR z?4E1!f3kmt%Zp$jMm3XLn1;yHw4VX^0F^zSJfallc2GU0JgW33W<9PvTG83K%F+#j>|h?lVEqoa6mTNu?A^7!?BM`8yJ$7OO1tyT*;tm75ow#-Y&_ zoaL3z;OovrIMGYfzQVi#N}l)6a?W&a89_w8lfI+`$wElEDDo2vaOPt!Qxy~JkD@8y zf^ZgOE=f59cvS-4*khZk@~TTrH-HMAxul%5WagPacvhYU4;r~DFI}2i+p}N)Fx`My z**$TIZ5X(;t*)WuT%B%y{<&K9nzlO!FBcN#7H3)?DU}-tT$-L&zCu{6_KJVwgE7k~ zE?76gG;zjV`i>?W6^V)Y3h*X}e3|nJ*V70%I_Wtzv9+Lp|JZqScB6bB~*fph_(-we)4M;tCs^)0QumPvuk z@fan3d>dn##H87_nrEZ3DBF+-WffudYApnHF3;RZ)4Ugg#MGKnpJz}9HAAyJyKCH3 zs`MKw1b6B{YhlhUTN5U!JIcHzHV*x`ZbAyG;@}9xov|c1@l;M*e5N5f8wZTbLba>P zq#;&BE>L6>h1kOHP~D_E`Ehi*OE8AV$^DRFYzjU6C>yB}*6UR7+|u+fEfc4(770$# zR!%{AgCmUzGlVfqDwn@oIzt9<1Ii?qznQIZfbO$jn+k0}rW#G^r|vbvBv7UrN$Pta zCvGYSYlAW^jK5owZnaw^^e;#NO2NgDcoA`!wj^zHx#wBrq8RqXuEmna1*UOs#PLr= z73kThalZP*iqk~NVbJx+WdCIRPc_fR&w>5Tl@HaB^Jc3dt zRI369oxa$tWyM432$ zoZQ6h0ATAgzyP^GD&C9galv4@EY<7fn&%ql_T{o*&49U}&M&S13TQrg0Uj7?J_t)0 zIH-=baa$phsk_?P)?4rnpKTo&aHMzwzde@L+5RzrmZn(VzyHH;IlW~wFQAbEY+Sfxajwv;7Sti zEAg=&TE_CK^^ieHD%)=Pp~@lIaKM;Xuolhhrz({#0=*FOn-i+wsG*&1-s}rjub2=4 zF--#*roI%&o0Fmk-lZ>b%y~)G0qCMhmk+$58;+slPJS{j05yAwO3O;X4|YpL6S8f2;@nqI z2|lerZn*#xiSto&D~&1z-O3E;&grhilgPgL&5;?n1I8rj&@}s$YWu0X+K>&hV};8e z-Txx4Q<^vi7s#-&kJFWeUN~e9lhKc{l~Y1h#Cb!p6nr9EFH{Si18xb`Ka%20s9>=? zZvL}JwA@-Vg7-5n(D@(P4F3TO^51bivj3nm@EPjaIvUykt4oxn^6r4Kg!HwnUV~Y8 zCtwFpQD+C3NM4V{WCd6SL|oU`*Cz&fN06$rGQYkpxUS@^0_}I}-J?Sl1IPn7AerWu zhR=Q_S;FHupY|n%RlL*Ik!(b;V(ruRa@}=u=XH|p;P_O7^L@_((9>^1_P95Pbvk4~ z|Dg;*5%e2TUK2^7wvM!dXiY=9uTSW2Ct-y=I2P%|F7e)&v{3K_{`rJ+tY9iX3$~Sj z(lHWRb>p60TFv;aAiNB*os@w7+aVd$*;vGKcoL1;wfvXoDaZA^9Tdk1C(9oymdqw` zr4A?=Gt;j3>^Zb?iwCfJ-{9%{RvW4$D;7?Jw&nOMi&1HH>$#UqeeP0a@@$-AmFVLt zaiSi+cx?7@10|pJmd#%B!03}7$eDN>Upk0$*sq)og>HrBj|zl5tz}zV3W7z(Yg1xuw0c|@rLA^QJ2oLkO}ErJyQx81^sWs zx$;1AN~#FLIL-Qj&}pi*Fo6wSN1&T=7!z_Kio%Oei$-P4cX99J0kWM6WyC0~-!o8D z_PbtBmc*jz(un}jQo^di%uEuI7Hp2zd-+pU8QP0wzfn5#-i%`(W26Wi&>t8C$fmnV zcZHtGNFCCIr%82%qe*M^{RwG|REc+88nkfTGECtz--qfn+o$TZ+Q;gw%JYffr@yN% z?IuCq8385s4%uNK#rPYkoD~nQqGD;o+PWVYWVC_9e22#!zh_X~_VzY7h;vJ(G4(wQ zqWUaVsPtBea$#M))dokW;iW9Uw|wQqp{`n+g6X2=!kxKQ4_9?FoW36*(9r1%~o96RSDct+nQslAg%X#Np7rrC63tw@hbFb+h2v6V{c4;tb@O& zyid~omrwokTFgd}xv9*WbsP!Q7od~b!yL?FrMXQ9#(aKVA6lTK*Hgt@-~lm{(9rhf zpbwAryxwy32EPr{QAdN6dYpGGOc^(~j(QyoOMcEwD$s{{AD{P5V8+Ex3og~CaMhaM z;w16lTHz!B2pja>1>lPYtILVEZ}LL7NCafqX79^vkAiv#+jSn#F7_$v5Oic7*1>9! z!e|9UQH;)RXlF(18_}nEJ296eS7Y>E^XdkjQJjZGF%vxSba@Az zJ>Ne&w3egUKaWaX=#y=cmn7Z1BEzDKwF*&JXa^c^QlyJ5dL$!e_-T5%G`XNKbRRGX zdjy5wsMr2Out=>9qbs-Y)Ou(sY~T}c^tfN_6ST%;6$h;WbfVIzxd$BGU4vnDoq|qD@6?3qqXS8 zJP+Eq3Uo|HowWF=4Lqm|7|>RHk7M^=fdg&{1#F|h9uWJur#wB9**-D#xMf0V=v`?j z07VFHoB#>_^`rY0Kth6Olo!vxzjN=vwY(<&H_RPGC-S052Hy>fi+*XA2_-2y+@T$> zUT&{*dbFFb*QTCzTmM(jLhO~7ldTtBD{Fk0X7;dG-Hsdh#CLKvpOZ%iNVlN;H@N$L zjFXNWkyoxIPH5moa|dl0!+EE~oRyrm`rN!7|M&&v^pH1*Qd=EslMPGa>Bx93TGntd z6Y}+E-LV$9Xu|qe=Px+}D<0p6b4>%RDOrI87CFnyXV%HEPa3a=zReY=K8eLCqD8NJ zD`K0n)zQyQq!KS5p_c$2T^Dy5D36z=*@S7^IUS&tcb54N-gwi%Ycv5R)GZQEKf1>EbtQ{Qn ztPPAD{4+!UU!I(g8z;d)SV7QC1~E-B+tt zLAJfXJSm>y@!;~5J31SPiz1+p@;zkRbYo2o-RPVEaPMhhNVuZyIR&x+QY5l7sa#9y z60jAq4gEgj{90D_uC3|G>#hIFQ=9;(Bk~YT#-h)Q=J;; zf37NOARur1>{C5T*R(3?J&m^NqTn2!CeOP0p1AA{kfAzaDAOXE?V<#;{Y5I5bn<;v z?0Q2?teAYa2T0p15|k&Y4wADS@Ruqf-q%Yo-QFw&5?;93U7W%Nx3;mvg>n`%H4>#I zos>%C$rAsHB^`18n><0@PEy&;2hOq`VaTvWSQsWUyS%gcFmX;mi*3H_P}8KesWHI6 ze7qyz`zo)8HTp_}F3r)y@`sTja3tnf)8hRTW2Xys0k;kQc*7;9d-cZj=W-Jc8E0H zmspFvi+H&w%d$n1IPQr$_oyF_I_zNeYz6o;5NBc zjOJwrt8Qs$vUoZ|uzUrVuB|&eJY0s3<=0a8^t^0m zlH1xq(aJOa$YCDf%8&s}i0gh{G*<9|4;moO;BHXc9;1{Ph%OtuW?jdvuhW zt?)YdochUG!wJ+0g))28J(GCWOoSi?>D;#9mpx0J2}1Uyzvy;-sCi?vRUG>DezuV6 zfY-iwvIj3O=EP5-6H6D&@OfeR$BiwI_}kt3kAevP<8GYu-z(_9>x`nFzNn3ZBcY&^ zm6hAigRq`~qm8}We{Ia=tt@_UOy104ZG_oV5*AiX>!nRyg>@vP_=+F!U{r)xA&a3n zEGb9zL@p@T%w?Y{;O2aNIJ+_MCN*w;%>JWx4IDNzoD3X2-ag-8yKLDWa|Z;s7;wNVuIw=kI-0hW3ETVc3|7(ZU*4WYpD2!w(d!8P_X9hilZsyB>v&I6tExjZaSj3QBSdm>LRjfXTTRt-)03~pisTnzEWCC)0$<^R zGU^vx5`<7sSYF4ZGUwR*9qp0qu z)RwT0pFrpBP`PUZwqY^Z5)DV=&@*WAvrC+RsBdGe1_<%zEV%W*)UW@Y*2eMwuD<_* z{}BFUGC)<=g%upwvH+XR|bj(pY~Lkge?#;0wwta}&Rs}+586o8K~`C&`A z(ID~hV~ic3bZe>NU_vAEwV+&l!y*hJnVypxOrss8tpL4p1mp8~IcemEhPH#I&85pHdOyBgKQj_I#pD^;kg zq-~8lpprdrse=pVCjgOP=yNr$$EsHn(=R4H27!2eW% zY;=S^j5CJBmsX!u@K(3hg@k4z&Vq||7%Zag4C$7sSf)gH?SbQN8qyEG1d0iV!lHMs z6{k+#o1LY$i}M5836lL~Gs;!_mgfY?E*;H0lCc?y4uC?GrWicglhO!}B~Bst9yzGu0XXk>KDB$d~U4 ze^VYk&>tw9h|eZBEOC^@g-$NoF-eBRNDDWnjp#XJOXXIdpafC@yB7jRiRE<+1vUKd zn>4@630`oY$Vi!zgt^q|;e@mn`*G|#;HYeXU^I6a{YN;M(?lXEk}*+Ym6%>`p=*Xm z8KL15R*CORTmXmB1i~*p@6->!eR)EOrdO81?4|t-kB#WRyltS)kTn4$L z6yTryzb))SXgz@{-=I=OFce$5aO%8Jp+SNwL3R9j>O9G-L0h)|Zhr^DheET~Fw8B7 z;6ror&wr8~S!*d{*nesTz<)GsQUCi|@jq&Vype&8z2Sd1EwdD~epHFb1(f)E6M1nt z=50>74zNnAYPy)l{;{;TIBc322R4TX9cv$8|A_qV*qIwBhQ^Br=^ zHjA%`dCerD^3j+gC+@|6VVM3iR|ia zQ)gVXcZidB-~8zQ1bmFZ%e>8CWMeUQ68Zi1RjP~3<(g0oGS|ztZ*;WfIDMY&IDMTt zY5VN+3ewZ?A|S#!C1Qq=GV2!xPC`Ezb4=7pKp1H5le#-jrOG{B#xA2BdrLtx)*3j@ zpwoZOu+@WtVJmQGa<5e$_InGMO?hX^S%z9nEzwT753#>_4`VTl4tv-ka*hC~V*s9J z3iZ-l`yPF5Xi=fJE>gf{R{pXg_{gM9FBD&a%d{=nRE?Nnj9zT8EC@uEG$Yn^(GJNQ zx(mjz#cDly-Jk)m*slZ-xM9U6OQiBk(bJTaS${$r22XW~Bm77*{Rry0NW? z3%0{{Jlv3ECLMHDK@ z)@nTvR&WH!tszdtE#({BtrR=O?@J?ceWH*&L)0K8c7nauUimwU-OvVNy{5TqaG$Pp zj83-N30`5jP1UFU%=a&VBqGZ5nWT+K(X1ocDgs6)9`D>t7+}+}@ zhYEh}Hns@>@3Rxq>&+)(XV$7!C!a72e)Z+%?dK$*ui*D>s91E1a=Oc9=v$Dxzf>7{ zqA)Re(IORk^JnLhH)^ZVUmcoBe(q;UuP`}`x=1ZknMSvMi~2GgpJs{`Y$bB>@tVS$ zCBS16YSyGM8L_o1r2Dx?NnrmV33G{3w~;LRf~qhaPcP(3ZhvdGqOUxX1(hy#Uk!M@ zvpLNwFNNXlw`L#8V(z<(w0Ek`ufbk$BW^MHj^XXih+-ERonA42y#5$h&C#?q^a-!7*QR_uFQfOZ!gJ?^<}8zz~LXwvp|n?VkaN%Ux=ER&}-T&x}P zPjn78oH3^?KRCXa2?Bm6IdB_-f8_BAM(cEeTlW>?c@96sXXwZ?j4S>Wa(*{fQL&tB z|Bb-CZ~i1;J{sa0S?&`xAcqQE=#jxBDO3VZ7eyzNFmkoPs8Zb};B23^RgHltN?nJW zzZpbp5+<~g=b)W@Jv{3E!=wG#|dit3@!FRZfp;G9#%>a5fgq8aUNK*9eVZ5xhb1m zL|0s1$UYl?nzJDwDMSX~D}6W`z0@=G+%>X%eoPp;e@HNdq&|z38OM+sbl_~=tE6mP zw^&Ew)I+7;rhBd2h3nUylXQ`NTi`sf>yaWmo>!&^gy~3{Z|C*Cv60y|!MMw-YX->_ z_+@BNSst_&)a};@3%1bbzm7sMrc$R#e|HKZQ2*ZGa%6`Ie`o9e{rBx&@c-SQ;IH%Z zM9MaQAtT>Fnv1c6g%J-oL~vQspg)Gg29E1QH^c4*>5s@hM^ebtuZ%q7}=4 zdVoXlK7hfW)Vr#HIoYvgvg+hrdml=I9n~fVi_|d9@i4S`^U@m|_m(_Hp?YYxn^7SOqRkC+bmr`7 zs*f7}s;V|QCWt%CgO=fPfbS3qZI1_E0ydaB|IaYLMC%;8gpS1W6U5zvn`~(y1v(jN z_?e1iBgk@@b-3jpw(NI=C8Fn8PW?^439&n>XF-pCx$R{nqzD}K3BAJ$5?*r5xgIVH zd=?BHZ6^Wf@!y*7Hcmta<+qQ*>YNRp=zBl<@4u{h`u81C`fg6R%KVupX0a%{-D~rU zh|WK6>0kXM;ePvj;~T<45uF$MNdt$@{H(AC>@%kF&s6KHUsj!Ycs;Y)>~pTM-6>vf zG4TLt;eIYpaSbh7sfhK4y@Esi0Z^lA&2LJ59TzsAr+|7VQcVAyl)+MAbPe$F8J?ER?9W zd`nj?uEY|0YneptRyMhdx!7?_{?gv83UV`5MxXTw99e+pPc84=`5@Py zV^_eRZOA5e_(AH}lDo{zT0*ORT97pX7`hU>Fr8_A#!^s`++NQRPPVt5wQh^mz?!Q( zWZ8VT`V86WOOp=3J&a(b zSDb!0I3?`Y>C)FU)|-K6D-XNWvDD-%K%7l4`<|n%Vb=zUe z!s+6vn;@(sT+&<%Y*lSkELcF@n~HmcUIvuzZ`Y)6PKR{9*XKE8JtG|*UPwcCfnHUb+`qTaP6@N^57eCw|_XkfDLp<>>#eS7V0ZV zhro;M$aA5B#sv4?X1{z1)-(qW70mE+$CY5(8jSoc-x$m2P8sP!Ae+GttsG~1W2H#? zE^OPh95^>Bh9#W^U6qjM%#bJ}0hLZj9VrK;STko*I!G3caE=~*-c~k9_XhaltIJ!6 zif6wZQ#MGtu&4OCJ%r#Ta=p$LG|l`>z?~*L;7zc{gJ7Qn-j?x>AQuTU=>|~u3&L1~ z&0x25NAL-LeFg1w!RU({0eXtPK4;4Osx2_czgTjT>rr@ixxW0qaA1KlblMXfWqR2ZVmDkr_P{l#Eo9`I;3Yc-#6_qj)oY z#D2$DCG3*ypE>A;F8aUoeDYu8MDG42=(sHP zk?~W;qh2-=BdyyVVJQdkg#h&Gu~dqFCk&lCJy2T5Kb2rLI~o|(j-y)aHhhnIxR_r9 zREXNEL?0XY|Cg7(jpjI4G6(=xcy9- zP(~#1nFg_aDw)U?qA-eh(==1(E>c;tryJcxWo6`xEH7TtWbEPr@R>NuldaYmw{j#I zGMddu8XPDJ^QUq-N9f6`HETf4?NY^+LIg!{n#JAu>Jj(AH))Yq$cfd(P<{-helS0z zC$<-uOFDK)Y&}QqRF;Y$G^I&lsFA`GSYhdyYFSRAfm<{U$yD#FAx2sD4g4C>LE3-y zKlO5^XCI9>l3)-JZW%0%FE9r}KMuwv$ly{4-s|k?mCjMk&q|x}O`9cfeMH8eOreAJ z-^>@~xmyO^_JwhjyI4v|M+hkY zS-BF#+`A!T3o`c4d?i5IOe*Q&OGC)nVF`&$s;n6qA+wE8sO@=-LtgoYS2v4|GGK4v z{OAv>O_Cm*L>-nDe4IGMe`xgq!$nRQfsofn%7E_1R5{fZ>YL8NQ6%8O>_c zS++ynIcawg=JHbQYSdY>1C*I`o97>MQ|B*xLoR4Gf7O)uXaBsY86?o3kga@&(Tipu z3Pg905=8f2DAT80h;9LelI>ejMZ*TVEpsSQr6_s}jfCNyCXKRHn}=cLjW28t6Ll&x z7p|yJ5e9QPGzsR)RSA1x6g;+0mr|(-eC-v7o3%+pv6dt4{?cda_CZCF3GlY$Ds0A_ zhh*R$w#|zK<%9^z^7xSsicvi(n&=#+;C%)`-1POh~8I`C9nU z^MVyIypM-L(wyK_5Gb|?(g_EA17!Mq8~;AyYf(UkN;V1{PdN{bwKw=vmz;NW_xmjv zFh0K^R8(RnA|Mga*lc)n=8tc`k&WHWCEnb3=w+#O!B$a?Um+EecjCMP9+7^{%85=% zp=mWjuP8-~S5GGt2j(;s;}Njj0&THd{kPSKwn3`5Nn8TN(iyEfi-t-Ozb`9FyF(xq zO5Fp!=c}F}#0hB(Bjq|kUZF~hZAtTZ!z40AsHb9w*a>#HWbz`MJjFY(kWTVKENHnk zXn#gWh!w=pB-Vzyp);I<%|^q9d-_}9iHgO#qLJQk{S?Xa=i}iJ_R%tM0yTvYrA9os z<Iq_+f&l%d9LRtil274b7J5pI?6w96$Qo<*B~)6C&T+sQ-uHVEac=;{DH^`oA~o zg0|Ln`cD6EAFn1=Q&%Ka_^#>XuKLbCPy;?bKzwBRB!Qnl)2RUw;v{3~sjaEGN1-aT z>oitlB|J#GVzXNX*#G?S+S5HCJnGU#W&y`Ac?burnx=;XX!J^ti* z1M}6iV+ka4Az#4}KzeG_2lvFdG;GWn+~n#CneB?aGIZi4jGCp3fR=5DBr3oz;EF&% z;}{vylh@O)pE6J~vJVZK%pd66Z7~)ppc+!cHn9&J1fs%Kx{37<0nuPRDZa8o zG>fLeK?EnNtVBK$J1xGTL<=tBE``A=OiQk3NT)Ac<(M8$`e7OxcU43(cvfHBD&AxY5uDxQD7Uc<5zrAUDJ<2&G?KbV-Pw$hiIX+~xwsiV1vTN0dQD|3xk#bLMeV0r7KD?s{@jFw=o-l80(N=e zis&@mVp~Zimim;cbb4_kQm_hzxPz8lOC{8>w%MxP+AIT@XH)(%gcB&4n^127WHg1F zRPR1ycJ5hGRee_6y3>{)v8qk5a;GRovH?aAV(PCVu9b)HGatL=DAPOYDAW1{;m7Ko zzG%vwfvw?&Zt8=SY889RoyB|3oq2oGEbdUY6>ea|%AFC(dz`4-`(P-%1`Xi}kutlaD7^cP;kqj;gBU2k_gMX$ zRlU{VcLdh7(cxSq0;r0JWTDG(jHLC*Itrz;N%kn znLn*H^P@PnRUd8xz7MrD%HQzY($tcAFo)FFFl$PvtbQAQWYMvZPta(VxZ-HAS7@4t zoHDx=igDr{v@2sT3DMr)s0tb@;Wc+D7Mp)XOCW@lrw`74d_F1B8#Q|#KV?Inv3kxY zVi#yd3#}I9YF-O|rfk-It zxKM+LDjsOpQ#op^?-g&Fuc$(55SIT1;Ua}-^FFpFmx9p^C{qS;Qdcb^-?qVFiGosW z8_m*M;zeCyQpCS3&8!!q8mTeqG-uUu(Y`)srvIyBASx%llZjR2d@H@XkAC`f$ku6V z&Mzz@N&T3%2=;6}0&c5q7WCJ<9#8U2&cge=5Zq<}yqXM|NI`C$@hV2B;?_9|ktVk> zFr|1o3Q#41;m=Skd&R-FGGBn=*sJ$zvo*;d=_xrPJ;G2hRS#q|{!EQ+;IlKh=Jt7r z;PZ@w!eB62G{tjtQQ4;tTKoAC!5Gvr*dd5)etZoPX_Y6?OJ*kS=~I}}flLkB6Y9GL zR}yH;B4lCb1dZ=p9`xITj|fwSLrU0H_8Rbc12!iX&ULkv3yWJt?P`rY*bp6RUh&;! zs}+JHl*?S1{g^eV!xY;Q8K*hOZf49jk7thAR7)O9$M#rxCU8}R$Tu?{17*RHEP8~C zDYGP2!Fzesf&RE>B5-S5i9b7HLz)pSo@XvsMBeP9-&+j9`dSkje-XT(J&}oN=ZdTG z*ZA{*d@OGN$lIa0b}fN-@`}$xf5EGwl{5EJpPNu!I0~m`$G=2yf)}^7RAUU}oO${e z;r(r9Syb?i2eQHbdp!{QM?K*F|5Fbn&7CCmornaS&8>|7mjeA#-Q5do5am;cz|+{% zThs-)FAg4TkbM9F(LVuxorpiok!kFQ4BXPU{`{x;pheQa3}BZeoCjWB<3q7)9x+z5 zz-dzRL-+MtH+dHnaVIO~XgDz#@w=qYwKbe9ACyUE7i72tJ~?y{o`)C*N`M zd$ERIgWP_IyaVuB^~Ky6^7BIMmCSuIVw@Zc_~h-XV)|6=vSRv3<|6pB#I`7i&*Pue zNewxHDvHpU9)aJ7L`u!oRT(Xem=tJQFJm?#23xMCfdtWbZ*X>f=ANTdZK)%+IL`Wc zk)$!Sb#ZUz#L{#x#3ngHSPQ;Ieuyw#Ym}ARsa4|JL>WV~UZ)0TlTTJukm-zjpQ&nM zjB86aaw^1&tzaxqw9fLA!?k0Y$%wq&FgCSgRBVLUC)F&&|=+EeycG;cJc2qMXyH^v1r*9>Tr&xOB=x)DVkC%% zlUkL8#giifAw4|aV#a_v8KVgzsyeB4%*lun!cn$y`XU0u7&lupaz;ymFwt%e;wfFW z-;5_IoD_S00-2Mk5ZZJivM$|0Q0fsh+jgmL7@IL=-2j^iID%QA6x=Ya@HAa!ZLfbY zIaeQbJZc^6DKew7gE)r~Y#4{rutZp*tk!DSfz*xC;Sa(#1q}J>g>@RT<9S1I7D`5N zIR_S0YLFc~w&R7DO9MOpmcp)fr)W8MwrmNED9mtneql%Sb5)qt>~Bl)H3<3MvV*bahGNQCylJg-dPE7I zO}V=@7mPedGYDneF3{-gj(*$nrF z$h$z)t0oWA8lSr@**O%~vqgxOSXcU>S-6Fk;I-V#^lj*ksvc%62o2M`N7-Ib zcvkJ3uk?}z*)1Va>o#&#?q9!zME}~;<@k*HI(eZTa(b5?A#_t3{?b2lgC2GQgw6^z zIbliwB}BqS4vaIzXwkx`(CEH}hzK3|ZGaMloz zWLH8JO8)ahuEZGmaD{uZ%b6o(%5eOu%E>EhssxHH8w~}e(@~wg{j4#Q=3w2ToR2>C ztkGWuaVmAq=8y#!O@b1bZEU!TNYo?Xz5_YWvz!nA$-*g4rsBjP%B{Y_JW9s$6!Gb@ zZ0~TYa-QRC+1wY@xf8Z#`9z^_Oi>CTy5YDv&fCP_Hiwy+jPhaIux%e?B}eS$(zIa= zO1Anp9*jeRNV*4(l#N^vW_L$wbc*B0w{eG zA%oM6Q(D0!R9v}LAnSO`b*B%leA4=|;?UIr?!6-DLQ)1T#TwtD_&iYZ;E9jD!FDnU ztg^%$QtHS7gC^}R-v(FK*{8^kuy?jKO;*}48Al$zlUt8Ru6iZ1 zRhCLv<(Ua3!KI&3hA3|?u(S|`wW2swY1Y|QQzB7 zCSpyuxjim&ItXLkLDq#+{?%&1{wYefMc~tT)4{4>tm}qnS{B0hwZQaC-019^wJuN= ze>aUNLNV>=ZS#`AtqIbOQek{=EMI6oB&lktFXvs_o10CLIs%uJwLqhT!?MRP`57#o zI!bJM0FaXDTM@ra_;UbdD-2*?du7rMPHs7xV*>PKZHq8>%aeXToG{fL{YS8~Dix3a zE3vDzy*>O$3ASqe{S77VOUQNdDRop(UiL#C> z_{JV<@QDYzbhYCV(OxTwL# z299g?g6hkTeNngs_}Q=daup$4av33mdBw4~d*-z4kwu+7#+^$i`k7eS&d46uS%6%b zXjfd}AiFYf$J>!@eV462H^?6kpLYe|C~jPkw1%%4{gD^MU{o@}W=)-R?y zB7!;zsXbXLj2|LjA;6w&sW@_Izm78IXc;2#W)F}BiDML!T{Ht+%`cW`sa`FaXUbTE zHN6{j7Q}ot?7VUB@${zCh`k>+xnvg*d~D&C9ej-TrNf7*Q~IeRbcW~n$FnXt#jG`M zHYzpmwd(=>oJSdj(Hq4nQuTF#iKL|NZ1hYokCZWiPaNv;v2nuEj2d_>r4FtOyT)it zKVGmLSS2@M+S>PbQN(p$d&lfF{{t*B&2Wo+82Uvs;n|DxAMNnrnAwUO3l%Xp7#&SH zY-MNIf&7Q3_;QayY-I~4-Q3*Z15tm0;|$1#_z|R5C?LUz7*xQ?9Rs+OaEUT^wcnz( zAuuf|2GS{+wmiT2d0IGf7HD|V?*B;1$aJ>Q8N~jv?ZI-N*jv40w>5C;vM3RqE!u^D zZdb3`nOx~R#Lm{nu^EIv_&V?@8&ln(Z6%+%VfzdGnDj|1@rMKeNW}j4X4l~#&F)`J z__rmwgRQv{t)sJ@ovnittqT*azMUQI{}y#S=-W7&|D|F28v+_(I=1Q0)b<&@=QdTMH^Dgsw2SV$?WaGahHxCh+<&nmQipNUCYR@C;P_{|R3 zi@bqtq(2xO0TA4N4a`XmY?_r5$ez5bBXg47r~~Y&3b>EDNe-bz z4-kNkflcRv*@8%MtB(dNiY0?Yg6Hi@GSqA-kGgl*N^0zKZf`g zmHi)7>Yx1af1_di-w)=0s_p6jegaXE{E&Tg@WNkaO&U-xyFau-TNy&P_^8_9(LDSb zVVa6ah{ZkG&~SSM!w_7nGxa}@dvCI9-hg^A^We5c`M{^jXUjq(B;ZNvj{ZoCdG3zt zV02Kqk3;NdNl_X@rr`y3l}`+Z*6uLOmye{HpJ|wnufgm)Px>G?p!^8D`B^lx9*#u_ zjsF^|K4?58BTlX$nfi4cQ9QNO>)LL!J0dvU6w*DO*U|Ga6O!NiFEuBcYPWgycL3gf z|NrM-g5^JlsG^y^gYn-{NhJOqk2X&KWf03!bJs&YMEUaeG;(1@`U#a$8z{$DI%)%p zA`}EbGcLeF6iVdl8=f#3OLc+ZN@`|xS=803VF@?b+-zZ~>8VEv^_W|VqUotxv9y%E zRG`tc)`9D7YvNMhk;XTM$9a!){nqvDv;DU9W`gH)Uo8lL3K0{CCnQuOU9 z?KK3(YV)wu@ZKE;#(Ug*?A?mdax+qe>*dF(doX1!;|5^k9R~9IqE{9D+U3e?F`(x5 z?Ht!DVEfHWEu2&BDFfGQJS3A4C6P@9!Qt~Lg)4Q(_nQtaGqWU&d8Us|#lK?PhB z79){TLNu&#gFEwb%7Ow##FfGm*(EtK;|ea0fKsDlMh%@GJ- z@Ih#@RFkL!yKy6DnyHYjtpitOU z#u>)=x%hsox)l;SVs(18`3mx|P42PUQx#@&bVoCju;}ogRnkWD9|MWqF?A75nFR0_ zn0WZjy+d5B%7$^j-Z6iaFwp&^qo$7^j}s)GW%BOGa*HBgsWJg=!gpYnslJjjNmLr0 zYrnI`#$jnz0Hju<7azBd0q~qR0@5?2h)^M(#BnlFJSa@b7VfARQCY*3NIo$4mx(G) zFX?POchFIENM{#=myTp(uCX{=&FwJHce2wG?XSY9EnyjqvE}}QLaIy5kQj!hX4t=M z&+j=m+GwG7c7m+zHT0m$4C7>Rnn-_wQJ=1pPFEk#S81*V$U!66>5db-G{1`uCVr1R zC!96t#{817muR+z*MQ*jRMB_^SIQ_$oE> z_@*lR#P5PbytlL@N81d|`W=yrKaoBIzQ)jZug={Bhcdov$sl@?J$ZIvxrL<)9=$AI z;sgD#N^V0PU}ZQKp7OSuJ={^D(BmQCwrj1=hx?hPJxIu$lVOES+^V&U6R3qH<<(J&_)i~V|&c5(4hFDmYdi#dZcPIG$6;f&#N#jA<3 z(+k{1B38YY3Z-GJ&@Xzhs#Hc*VG{3-^p)+?0FT{$P0P`)OCe5AD_V{CnyDG0W+QWEhv*APxR0R14Z$r4yQ$`ocp zO46eYyp#K!*0_QJc^yLO#JZsgmpev_va~^tH#G=J7)S=Cp-zG6>}dgm!ydL7&?AC+-(M_gu~upW7;P1_ zQ$pfhbO-KFiQ_qdN#KCb*;be@kH#>yBNN}Hhqn_+%fzgQ1z609q(8`n!zSdYGnUpA zEX!|S(60+X%oNrO;o}ReT8-y0?`;DrO*5*D1~i!0h4t2JD!nWH2}4+$0INtex|}8u zEE~Szi!L^8yew`|reVNzdQhbvh(qv&9d4&Ht?U>NgM5s5@H~}3c~Xs8vbE4@m&VY9 zI3MgPe({R=q^1$Jy5y1d7KKlMr?QO0e z>8B0~Lpw!r=yqvt*ly;z1TsdtAo<)HSm)KBlxi=YFGA901$Y}lKC59adz$nCccG0xY=T<8 zivqJSn)+ld{`A2=O55w`+c~O;3A;{yas-E#0>}s;c8K+JQT5nhIuaVQ58v5G&>f%O zNQyBULxC_)5N6JLPp1!XO9MFR%wSODx_eW4{$4d^1j7w2d*7s&UHU`wi z<1@pEro8fIx*dc~~G7|&W_Kv)(0sK9K(k0VSy zK$uE_TXgn-eiS-9OO;JlM_{FnFa&nfOHb*)@E&VC$jvk`+E9_&Ez21>@2P>CpD)fa zy)q2(i7%BG-kwNt#=uZ|7^+iHsfAZKayfG@sAe09fsqg6=Z4C>$1d?PjigK)n@1a; zN1LbI8A-f{!ZB2%z~WOy6y>TO?3xz5tjEqHMNLTghmCUfwlklF&rwz34=dLx>mO*$ z!6ikiI-Rcvx{@UOw`WwM_!J!21a#Eo-`p5>g_4O}hckhJe-qN?K zd*r_ixBr}>{+r3+|7P}y{#Ky%O-Kjx^H}&Hn^zUFK+MGQS=S-M z)HTi~s_>Cnf1t;cOJz(HCWxbbqHTNM_RB}eZuMZjcXZ$<{T*X{jz6_I2O0(T>)7Bg_uhTaW-tLxxZ z#8)M1jtv5v#Xp6N-OqrrkZFGA(p;!q;gPgY-@lVwy}BkN{=4n^#6-S@-36nsrjr}A zTZ>WRfX+9QfxDrJqQ9)u1l4++jHJrKq0IzU^3^%`^DbSd8JpWw#p2sl)N2L2Vu=D} z+$DbcI6^5T87FAv6;q0JWb=U!a-SsSvVXP45`vHIuko}DEx8$5r4fC*LS{xFxJ04KWU5|q zmhea*3AJuWrzaIqqEG0a*7!lJ!lXo)!YR_b;eg9^!0n!P5rlv)Q6F&J~+r z^*y5!n@;D(7kiRk#i1I()Tk_3#$Dc2dwSIE#nxYui!{ZE7yR0sg_ONELwRYKesQ|b(YK>6NsLwfTzO&~`}XdU2xzNyru1A}n+ zbiU#Yjdt%MC=iF zvvkyKlnhJe-u3};QhbSEkX@8!P7GZ-YZ~(SfXGQ}+k%@vy zkf#p-tawy*VV^!=+}AS9YobYL$k&pX+%(pzox4-&S1j#(rVKVgB08^cX6h%#JHYP1 z#1De7(g&O#QwHaQbLXB+%~RQ0^({$tTwCzVte<7a%&}g0mbRY!8QkpaRFfT z@`dB{1*+O{#OZY!cLkuV+EL?lqZ8c8u-?g;Sq4o0x&VMR1ZnZe-308u^yfc&U-|C5 zhlK-A0!oo#aL)aXxNVmAF<%wTi>hf+a@<}O;+`Lh_M%H@Q7Wpt1D(;H&8F#i2Gdi% z{38mkydaVWw!eV3+;&x(<9IrS@y}_BU@TnVmEIxNdf^G!gqJcF_Dalg;|S4<+#|gf zH<_eNsSU)!cL>z4=kBQ_UP9locZE^#X1Ib!w*P|s6tk@)>%T>~vHwNy^v|sL-#CFt z+3J6@*#B#f{_l5!`c_s3-%fx3(;_BIZc+x29z7GV-v2#}SC$WYAQ1P!muB~8U?8v| z!I0;wwVnOE%^D5daWB|SULj->6&La0M^zAyR+TQT>L>Hdy^M| z`dCW;^((Jlp;9Acg|bs`ioVphF7A?fqPVe{OJ7h0bQ(kbz5xA*(mesE^SG)dtH=-<(h_8ZMqceen zx8WeR>ACJb3r7NK1ST4eP@2D?5S;FWk|4k#?Ml=L$nuSDnJ^qd$u0 zT`A^S^v9&|a^V(FvkO;-?9=3?-JDxm-Y&OVI_9>&-v6Nax?7#5_B!Jt? z++$4DI4<9DuQPP@bdG;C+qsP+3=a5WGs1N2-_@Qg&K#Xrp?M7RySgsl3p!qxkGi@} zD(ASm1Y#+8Sn9x|zM+*-D}WpKx?I}D?K+t|`L1n{^sm&L%EKm{H&b3YxoQY(Eg{@> z>tt|dY_uHm$VUfhvfMI!@hT7$kE*>u%$Ix;k_IOb&P6FmuhR5~A%s99$$D`jOVg^r zzmi3^1B-iZ#_GS<^>aEQsF=~dU-WB7_E}5@NyBhxqnc;EfgMxmtk~=J150JSL6yP!-ns?t9)=T|xnWLe zZ#IO`_0TqCV}xF(J(vdd84yH?fqn-0xN4x~mD?H2dBJ zQOhWBPrb4{w;|*3r^$ioV!mz6vGX3tq|@TU6$S!+ln}}#{3GhOwb<~0AvT-i!4|*p z^TC7%&m2nbM7&BS9jZ}-D63I!3x0y3#k^=&XIcqo8rayCKbCI_!;XiAv@u4Y!!$s z>FyeRJA?zeQ&@bpaVy#vs!kHl4bcRcN>x>kSe7KD8jS!YOIb&tCAjR}5%>LOiYdaoYJ_N!a% zWybd^&lyS-JekAerTy*08Z0D%)BKnB3HZOG;Qap}YS{jBYWTl2kkCY37Z3XLX}3hSmTN#WaHSDyEGh+Dvz@7+Gz*D3C< z?$6ntQ(sii8*g_bzwy{agd$#SdCvCRFm)3re`FsQFwrE5rg4oO%IDpB;kg&Bk0;%! z{fwb-r&@4}iy;~72#42i@8b9yaIM_F_iJMY!x4MbLBa&M$wa-XdKXeWm z%ING|9oBqdz_UHHUVUKPx+*Anad6kdkD>H_5WPxVs|XU3v(RQ})lBE^3)<~B4B_(V z>QrnO>^rA$cTJ*lZ(8WPJDF!A04mVAN_ny@L`cxkD){BWjt>Ye=9!X`eLr`va3(h}#-_5~4yrt{N5EU0R3DEoF{QZ%)coL4CxHBr4> ziym4^mRU4w@mxPk*W^6oz|v%~I^(mAUR|GAYBv`=er?}fHIaQQJ~~=sd5~f9T-RLZ zn9v6?87_WmpL!aSJmXl_(O92TSUxyhPwhmXU2Sb{3L=**$BDv`c9u#gw6R}YnUi0h z>pe*5CW^4=Ap>pLclJcA)9WN(^L`W))99#XXh-rDY6)HliL`@D*rq2jxd1nm`&NJF z&1VW)c63C!b@HG?Vx#y;e=E zMvNj3(|AABxE#7N8#qfha&`_x)bBqVmxPTViWKWR%Zx8%j(?s&$rB^1gA7JWZAlw# zU|9q5aYz?HC@{{g84q;^?&u5dLA!(vW(70EH`mO{9+-kJ)Z9Rhd>F{j%N~2-`}K<{ zxpbqcm0@LDcNI}O&?T@v05Z%>_ZMB=6nMz93q~(^;W)(8LnXwc3%V!bWmuQMb#hOe zT)osUNwT{6@^k`WLuMItS5U*tAxqFmu@?CT>ct494}TC>dTp<4X#TNkIa+L4raUKL zNr@&hE03Qxjc^Z-AcmfUK9lJHz%kbhc?M&l8D^)1y&WSa&P>0Er~C|5F2nSm7bkmt zibSl?ACM&Qit5G@-&1Ruw*cS?dG^W951g^!godh2163#-(%+%jcSEgrlv9g{MiI-$k zQ7J~eOaag-w!fZs^~URWiXI8Mrr2&I&v=rq3C0y&#3PvzvSM3;I=~q2lA@Pngx&Bbcmc|&~2Z^R)G+!&KH_uzviA8FyisP)qKHIJ}k)bI7|SEv*MN!OH<3nM_J=C z9=u&9FR$VB`-)I2Y?(SCk>(ME3MIpm_9Y4k6`Z>*uzkfEpIw+0t9y*a#f>J3L1y2I zm={(ub>T^_q-RM_)hJ{qiH*6XWXnhCTq?(xj^lN}9tN4Cr1+3EHT*N7nvk8?TDtLY zyx2JKlKEX8p@UcF<_+;A+2nmTBL!Q}!WEY-|6(==0TQWf+vr*lM{%HH0Bm4LN><)C zbEYp|*EVMoQYwT{LFf%m&;Imd0rI$&u~>??>;6{qsSIN)$uj z#l{+j(wzGb^pEkD`S9s<#n{txpj3^g2xv|{Oy*9S`UrxmNbO~D<7P>2E66D12@gs+ z#vB8hQ06#tYY{1yo|N*(-VPzlOp%sP4zk zj9r9ixB~C|ep44~-=*UF--Z-)WLtmGdK0X{VXk1CyQ@2gRb!LsdpUp7SPDzp7;VGO zpr<~)hwA_-jdAK&ntP(l-W~lhO7iYM<95f(wH*oJ7x%*uD(f6l@5@f*;^;G9HeWbI z$?l}{K4+Gr=~0*o4<7ze>|RpEoj9lP@vk>VYlo}xni>3Kc#Aj4Z2oZw=XVsp42uO! zEYpmXv!TK}v!^_{)kRpY?(m0GXX5Q|7RZN}(XY{`rE8MToNXU?8 z5*^@+hMOxYbW=xgpwTm-qo2VuO=G>X46B$+^6%ajJ%1)2M_lgGDcjPC>wE&g=|jz;{7GuvTfJhvt6}yI+;AgAi6nXux_9mw6FfFiw;(s~ zfjYbN4kkPIyZ-qbwy)gr@iSPq-(>INv*`P;x_dUueUrY0XZW{KL*f>Qd#NZviTP*w zH?y_=lgGlsxutoKgYmc|ZZ0Pit*2Z1y7UVD_ada%#%avA$!WW?Q33C-B2f%ow^Og2 zpOX(>MU;@wWJhN-oLfB_U(rj357#x*)UxD_@^AFhQ)1cM4YYiEJRoIWt&fFDl8;@& z%&(l->J$39lDtX}DY%YtSGeSkvPKjpv%^yxyz6}+~E z=NPeiwq$%wjgk#dbHp5FU^`?oEz>t#DonKLb5B z8V6*8RT6+nZiwkn*1}}vO3Fxxh+|xhESX(9&6Rgbf8XCOn*@7Q;4 zVV0P7i=Hs{7MVmrjwtIMAoXXR2n#o_B3&~pQ!$+Snj7_P=WG3@Q7IPoT$^3??e>Zl z3+s=j?tS?*N>1!kP-L;KYlh@#$PJ0NY3^GSZ6BaoGWt64IH7tQU#%A5d5&4n-STI!p5Ce_u(@l~~r;v_O+E`g2PMUG%_m}{u z9Q=VmFP4G71xm;#+wglx88xWbG{fpSnlhoFDb3)$!f|3CNW;!)e5KbGb>Hp&>ytNY3=6NO38NWC@PW8F z_iY=*oqR#Q;9i+Uy0Ea6Lb;H>3pABo_B~SI5QEn||Ara?^|QLY@{3d+W3q+n{?uz( zLDThTS?Qp*cgxsar$DF)Ii&~1jGmvq8S^S?6xS#_X(O-l{EDt~p$2s3$Uc}&vC4GT zrExt_i1Gq+i7JBdLEjHmWMio)(2Tc*$}R|BkiK}CQy$@tPFYtBO&vIq1Sd z=?BFTSqB7)?C@ImdV&7nE7^uFpJ-$ZwAAbM1mzH zx84l_$5gTUyc|_na41zV?%+e6mjtpkM?}&Q+xSm34N4-V~6N5BEZ<3-@}GuOD=4hp>@5 zsCJ`mf6dbpjE<1v7v}#$r1sKXJ-c4#Z%1fd5-`B>!p1_aEriA^w<~CqTEUy&J+Ba!AFW{J_y}g-eDU2|k zLl1ILn^{hwhM(B3A3-%4c7EV&YGDAX7vc))ST{)$LR@sAH~*(w+aW)~&PQ=k+for& zdu}t)X)R$Vrev=217-8^rNj#`!cAF*L}tK_(cUeQdxNoM4|s6H3H&{Is8_43BOC225_;I}rlR@bgj}qNfPemUR4r zJGaKK#ucH@X9sFR~5Vw-I&mo%z0ia^kOC}atitSliIuz z&C7bdkD#*mUS=>0Sdb>^-%-QNtF2X2aSFI7_iLWR%62N)o|wZ1^GTxvTn#_Ujr0lM?Yzt1-nUb`Uji!#e7|6L9{+5u8}Fm$r1Co zfFN7UZ@^?pHB-WzEhyHJ$>vE7^hVU328wW`)EzX1YMmr}*LkWE;irG|1^I=omkN}X znM`H6Xr<6ns)%3}UMk7cJ2RkeS!&o?Wofi*Q9-7bZEJ^n1QlxlHa{wLnp??)yM>=fz@{1+o=gz?p%R?_3z*j0=K2X>SYx;@zSB@QKS3ptm$Vh#lbBxjGo5(dA#Nmy(Vj~4KIcRjKh8%*c*|Sxed~p} z(ggo$XVW_$ly#6Ev7aSWtm=*F;Z8lY5##U1IlV_+2K=4Kx4HXKCO}sLobae6*heBk z0w7g%S5QehafHZ#NaZ3@>MVW`eDhVcM8iGtnLZ=W0j@WASoHwVE%+drX{>sosv|*c z>8et>@2XZ&>FQQ#^5QIzC@+FlPdd^K*Zs^y+tiA87Z*n-WmA|{Ays7tZM+ zhs<^;&z62w-cPGCvn4=Viwc6^d&}+_{!6-T}y_voN56t&XmLG_R3?IL<;Na?%^O>T4`jpH0udUp_0&ssrr2gMq zxg=amz9Wuh1j&e zX0s8;Slq7Oq>OJA>pqp`J=4#FSaQFHzm8?o9-#KRz)i92D` zoE2p+PnFMe&Y^l2j<##^dRr^EY@Tzh*SGab51%J?bela&jqN<8_!4AmijLKIN(YyP z_|3P6V8I)=5-(G(F;{L!fkHITJIERx{3)UZ@)kOU;_D)gsrD;6R652Wo(=7^Fq-v3 zi=g(AosFxHIktA8u`#S%U2q|OO)Yih?4n>RK^%j(OKW9-K_8-}#5EcmmV}r_X===u z1gk=0My0oj{@}{c0e?LSR}^EqogB3VS+44|uN!YJCRY7uR1fK_cEwP8UrfyxW;lhp zUv+%96ln3&Ms^;+V?v41fjF{YS!5ZE;`8)qkknER8F{gS%HCfu2W-BKo&x}3tgUJ>cBZxV)w_@emCDeh?ncMZ4P zcOho*0vkE-1L$E;E#W@@5}1k=4i4?YpabW;AHyek%&$Yh4&lNGGk}N9t0Rjda4Jr zox7yoZjSyZ9D_+QAXRKDjaG%mx_$+oq<|%HnCCB*vkE5_@djmWObEx!eiQ{(SaPt+ zF3IAHe4E6p!(zro1E1GN_{02rD4-(cjw zk`XigXRPRd{AK?9O#mF&iwr2dww*AH2ZuJFEvyMbTrn+6`L3DT z%UOAlxTUfPeBpk01)w9qzkTvWIUtLI>JMhozU}UL+&XlkeSM9s-TlNfu#I(OUmbC- zQL_)OMzhsaH^J~BLS>P|l+>AN96C{x0~LBCK($}IFESM7jig}WkmrLJ=>b~Gsu|N_w$S~jC(ivvGeaEaWRKF*&N$BTzdHvz6g`nNI*^#9p){xN~@4;La~`onLc zl_vp$k0`u}X>AVMY)vGDC={^*cN8v^+cyXZWhj&(qKa{AvKNHuEcLXTlFRf)gTN%8 zk)Ts_uVp_wj4}cfA;f>bnaXyW&GI^WIe(nh|FqR_i-xJgoOjp}P)Sj_9~zLkwxl?( zxU6VACc=xE;)YQ{d&Lz%j!TX6+=DK%;y!!OV|NMB#f@TnKNj;%LyX*w@-)ZU^xogF zlF3c2c{-1kN1UOmsfao!IusYNYcCr}R82c)8o~xoqFF95BVptdc;jgYkvWVz22{k- zF>h0sw9)kHg3E>y4nLm-7fguMoqD-3l(uE8J*8x4)p*{cdzlf;snkzYRWBJ(JlZ?I zqwc7|q;_Wvhu0JT*Lr(g7x2S5Y_OKK)QY&bs+vnae5c#}ax3^Qg^q0y#GgFkqbcDu zFvyW@rUy8;WG#k>`Qf-*CEOXEwxL;EgIM;hR=hv%LvR^Y-V=AOx4teegTh$(l_wcG z&D zEsp_=6x32pApQY!rZ7pt;e|>?Qc*Uq`K(l&2$Zk5jF{A4nDLT})r< z1l=ADy-v;!iv;;ijHPG;o0#tyg#i21!2NF`%v1{+%F@B42nW~5~_fcOOqm{j^_ zcKIvb{Wqg9N~Sh;&Zd&K_AbtUWR}0c-OcJ2&d95%?;{DU#vW0E1_A~ka0Vvh8Uhr> zY;kKNbWlv-n*uO4TlGAB2%1QRh{0FTHj7QNi6zn!i_vtFZi}Y=b8SW18%?s0K6ZYs zyG3i_G&d^Shsm*Qf1G?yhBn4tLo#y7it9916 zlT+LT1hmE)6UV(h^IZeGALhG#1|Q}|vpc^Akphio=jBKG*ociaxJjOfsv$_8yc!N! z^mAF5UUCM8(rn?Zj4gmD(q%19K{719ws)Si#$b9twvshZwWYI;96k%trLtB(jZZt! zrbfb_A!|y@n>d11l5@u|R&n1uzuc$Qn4UOZe@)Lmp)(m-?1++|4`8x|v?NNLpU!DY znLYQw%uOM9w4kK6%1OC4FxfC*!>6w}@$SdyXzuDMv37~BY;F8mqB@8D(e}jx3C)v$ z_@0>bWZNl>Qn0>3bQuYph#kIT8QH2@Gbc2reW=KnY*4qPeEwG$QP>B6IX4eFU})n5 zbdlv~&rp>9HgLRvCK9%t>)52(c5Fe(?a_+!m|>h_tXRot+x{|gs$Zxw6`tu~v9qv) zwd@$$f_irphLkBK$FOE~7O*mRUNs!4jY>so&=x37JzlS(Y(d<*$cZ)i#o=e0SAhx+ zA8#&Gbe5?JGg3zPx|znwq%jkonbpF`sIFURBdJ+bdvHwxKb|3iEVBXEO0DfBi1Fyp zq(w}YMV&#yYBLTM%(pR7pcI8{>EszFg`s@&Xg6p(PC8gq=r2+~n1|jcCTN>=*VN{L zHmWEqwySg1ZZN&ogj}?+7Z<7c!e$q}&oovfPCZcd`_M(-7EUk9`IJ{*8;*htwT4p} zBuDSPXq1U}J-juC)vr|{p}&L(46hngw)sa=(d|Q`rrx-q${R@yv)hXfD?gP)*zIpp z^#uK>aL3wJzVYEH1P~0X$BXnv;O~XWltkd~YeGuXXhr8vMYVR8Y{0VP#a2Gm`!{zr zDe}aG3T$10D-FwEE2Huc(wn>~4cA^(&@5{XDM0kT!x1_ zTV@5HTjs`wIG>d1wSV#KCwN8a+%ltGXMj1Un^}ErGJU(Qb9ZXWVDd6(c?ox>EO)uZ zH4>l7eVw!Us>i^+W%{x)7%?y1RsT9t@+Vah&#_9}>F;7nr9Z&f;6j-X(o3+IQXS8~ zw~N!P5u={TMc@rZ5;$h#tU&v#qXwwIP>n-N3zkAl#ndrn$mLqBeg{ zgk@Q0tqkX~vrLhSyLaZLeVFr+I6(kgK5x=ibl&++ETm7>@l{=;>jyb$VXmX@CZgoj zWwi=*0rxf})}+7Z*4f>dx2nE|Zg}s7R%x`cR?lwQT$uc^vjb!{h56|ltN47kp0qfl z;VH6iRGU5ml5Kt_YCtt256hynF1UK_YnH|lkoQZxviL|h){hhC8#BcVv0nzE=?i>P zyKT~P{NyM{{pHAzt=)Y{Wl>$B$%>AQnB^)5?7nE8-+I{e^(bT;cT*O-3Pd*bWF(DH z{o3t55fDd3uYtaUey@U>&a$J+Y&F2tQ(~(<@RnZRnthg@JOY|&O_@fW(N|-GUmzNS zj-=j{80M71sVqb%$ad3cxx=J(GkQ6!YD?3 zVTk%A_f=~fVVSuZ!ah#n$2Ut{?|=^i3S*HMcC4@W2ymSeKT4_cjcgDtoX;eeNPRZ3 z!KM_d7&qEZiBjOR%ZVoZMruUYrT6&?wuZSR3=nPD9dxGeKPOd=amOBkP8bn^5h*eo zLe#2+%BI{v8EK1H*AD5@wMa%lT5qP8jhIwnNMXzVvdKqfQ{y8#vSCvT$*|dSM3Xk+ z!>+Wcs;_5TGBVyqU6PezPSaKx{Gq3I&ZiVqMjG)vgh*ENeW)RZb#uHgscw-$?1rke zr&VYW!*F`kvxwnpq#3X0Sby-fj>;q_PTbgu&3_c}jI>1I3W zJi<8zA2{s6_t3r)xOQ3^ZdB}31pvj2Id3G`d3JG~BUp9SE;CT*$NJ<~C3zWh$mXin zc~=HBOSo71K_8;L1RSbCV1(@NbS9F|=G8!)S1;NA z)&4&`s0>@gO|s$)x%`NcOgBG7f2odfo6Qf%#Y|G{M#~qB>JKWNi|OZq!yf{@;jn)E zF6*gCB6FVw81~Zzbc+7@0Qzf}i1k0e#Q%GjNYvfg(eTd+?c{{n-vro4%odv<34aMg zH-)qaOagHXRqTNaMbIdVx?D`S5_vYT%^Y)Q8(4&^>KjDEY1)hHOS$8NdZ|C(^kIMCeN5n5wSl~y#Tx=$-1wHibWn0{Vq?8Da`I-W7b#zR~yCm)=*UxQb0moYG=3-(2ro|d zfyoIXea=}1mAy-X?WedN0*6a^8r68In&MHr%0`E;={!#>Px&)Mj>2?tooR~lrT0Pv zn)@#~3hCrJx2+}4x72zw@YN8TH9~`5$AnKPej``%H5vtw7xWSLXri9w?J4vNv!D+t z&FKlIzB3A3S}E=hUxw+`yHS1+8*$_O+p*cdp-?cwk z)xpbZfO*pwfj7l%vi5{*mEYKWvyEPjXSeJM?@~SFep+TQ9&tx!MiUEk_&Kajpiec~ zT>+cuyvGNSWCn6IgeR73apZjh`>kGU*cwwG1k`J2e_O99{-1aWK>pR);){i`;Xlbd zByH@i|GV0!s-`@$BFg(!(n1IjXsc3^sGwFEOeS<7cCmqRBnc@A-%d*^6IXUQbF0Yi z6KT&&1!UO`K&jD=X~d~C1XL1nY3&!>t`x(jrO}^k{=;vo63`KL5d~B#_ z%A~JE;SR&HBJl&V!?I!$UxFEM2VjI>3oJ5kfrJU-w@l2XxlQ}$vYBn_)oRf~I{PEh zBt4zv!nHHESeM%=trIs(Mj5(}B%CH`94xq8H_BJqrqrxfDlF84wVlD}nNKt~(QG#k za>&O>at~eCU8WlLm#tVwlSgK<`mIF>IZ*g1l=Vdevs-K33%RbYF)c}BiL z_YAr?=WCDJz?`%Nb#fg!$d3jJMYhTNI`i}ihGRPHFBSBlT>TW-`ByUP-vbK_`AhFe>()GiHSS+;C36lW;V zlpYysY}H_#+FYRxRd&=#2dexOR^7E)?PokU4t*!qAL*!@Tv`|*)qM06I%-47nYwrq z(}n|(3@|mTc{C-p!quP&%L9njG(!@ogMH$zx5~-wza4(QX4?NHavpZgAHh|=lbB;( z)Nz#&V>Q9v1lQ2y(L$q_ADzPE!ps1gozn7R0ebJ)Zy&=EL_v&&^8xzM-+M*4RTHem z?-{;|4aE^FEn-1Pu*2dj?g>;-iR?9ZOE~}($QDQ-_$nS8GyZuX7jYapx<}OQ>=}>C zv#zrU!LAN@CkPH5`Sa(o#*ULX5V*qU7E8?YauqU(VhxLB$Z`a4pW5KEqP-T7t@c;f6 zWC2V#fRM}am#J#3|M~hj*_)agn*-#({&9}yFX!<7_MEe`)9+_dK7IcD`O{y|{)er^ zKfm+0v%mHGRqT|1|0g7cm1ULwWO!*-+f)K5sPYN}X9g1>A}Ans5r8A4WUdkbj~6f! zYOH^{6`>th(b05O?nJ(K^S(v(_NS`81$m>G+>!mP_^sqAAw6dbKw?+g>Dl}7bPL-@ zqD07Y=!-y%0V_C?7JP&7mS!I<38_pdfqEDa9EOA^={_~rN(0);$~>#TsWyKUlemK0 zFKbJFcxL39MVQ4h9)X>4Xdeay(@kk=<0F_pNo$tuV(OqLNs=_w(UCIVt+G@!F_+?7 zYGc)qpDwD2+G2}l3`6TM=^Xqe0(F|=?o$rKRvGyOMf-BG^;sObe<_UYVn=x-Cb+({ zeMmokD^ylKYjq}%^3KMdtK23-+xfzT)kwsb^BP^=`^Z)<$s7r*Fa0g|ffq^Aq?2g3 z4@nnE9J9U2A@<*JJ_sCB&Tv%<$l9kx>CoE9CR(svh&;z`%nYiKoHS2DFD&-!`#Xq} zp^1JXM(nSY>!7smJ1jYB&Pundgrw~1EJ-a31Xbt(_P}B6=mgI0=OMBPTY2HoM^~T+ zA24}xA4y;2%V*QHQGp6e2)%CbFoY^pTkgCC-JG^vl8lz7)iAP85*TntU~;6>U=P8M z%ARJb&9+Q4;E7{~cKgT&6s{8tFS;Z`$M!4fZMqIU`mbLK7A3QX%k7}S^v2q!5t!QD z?bb6*BqW%e@j04sJbJ3IL*7wIE6GxsU>5e}WQ$f3({VtEC3Y!QNA1ZyQ?7Jk-g9p+ zid!_9^68RvoB(}UZK33lxF88TiHLAW0~9FY(Q*QBl(YEowTNd8^YJj z)9JJapPPUHSuW^x>?6@Ep6x_?iwPI~Bn}iF^t!&R!{xg3&`ISETXHyT|ZaQdjfk8pr`0U2^gYA!VgJv zQ3AG6RE5OrV)kNTKEAkc2i(m!)IKEJ3IzwgAW0d@wmhPMNDG-#MFqwn&GuYnhFXIF zLdEX8I70pPCasixExkbo(LMKQ)KKg3M zyUMv7{y6ic@qVH|X9`C(@Se&wGsf_~R_X-fy~mgaPaQXCqC51WyIJ(tbjCn~K5t7# zwr^z#J{X(d-q`eBPYc@jahCgh{r-Z`Ne#dXPN04$J#&=XKt%Q{bxTU*WfYMqgG?%o zoz@BH`phIdm!YS2$(2_}7Et$$cFZ)Y&b&S9s>%8}4D=`#bg0gw?aB&!yX++$UTpxB zEko4B_osXZcE_z3mCJYJ#;z8r$F-kRUa@*f>Xk56Qwq;+AY>l}TY7RNIICq(utpxT zHZ(X{J;F!v_dFl9ARnCr-FSlHp*!gQhA`xL@zV=65Z(8Ja;Suyw=fM+);})j*1|YU z{8v<9D#jKonnCQ5f=m`ULgwXexrLB#Szo{A=15{n{_+mer>&v6HJFIAKye&DtZb8m>27N<+(#9}+43vm zM@R%T9)|n40-s_8M2r2CBEc&V{Gcn(mZj@M>@GqHDTU>WE5>cyewz(6dt8oHNa4N$ z_yiVvmHk*db6pZtHQh&9M*}h`9R*b@P5p2jKxMadhcQd#M~?4h65(G#dC5F_P-*V}njw!e;% zmNXou{e_x-@F{jDTc+u!Uk114@=9Dm;f27wMS_ty)ER)M-m^|{RWxH`>k~DKbL1Rt zLY^CVV^TJ8tziAkH_M;&2Fc#q>5@wtOMXnF8*h{b99!hp_!4|t`Y zFjK&qG^xETTO`RkZowL9MEBPwXP_v_=GLzeBAG*jpId{)?_~`!W8=x~!o?a;zAs=> z$?#)RRR^MBdoSF zWZ1F$_ivcB7EzY0hVoZ*m~mQ#=9QVwo;_J`q)gu&wpWE`Ize_ZE?b`=7E=V7>_aJZ z8;0?OUHOsXJ%;U-dOW=WBJ>txcxD=wqJh1*-TdDxaC1gj8nzO)8Lon<8h(u%jKB~< zp~C!p-mbslPy!`W2{kO<@eFHL7#PG)QvarJDi&`XbanDdNG=q#KM)qoH1%U`)jvZ>U#){C&NCrph({YMc^ zFg}rOa?NcbTDX*+K&@J@FlxU7m&DJC6$sKvvHM106Z8r?HAZBm8`pCXu#km%ULdO; zP)|{25N(;7g)eObDRa{07}T_fX@MEFIhp;_E%ux&^>u)CG9kOzV7E#izK8U&T#;C< zIIwdL!CEiijM0hm55cyrFfxmS%wg1z^4tR2ts5%1(E)8vs zO#zC0W{###PBIow0E$6V$A5j2C(C!r0R|ax67Au{-C4dSgaTv11jaD=qfmbR4B_dd ziHn|nvFM3>V}s)T2|wf-R{{m)E3K<5D|2P`W9%yXr{lHxG1eB8hP~QA@{sPr@qy~B z@@)EO)EaLOkGHbCpx!TVTe506kwUhE3D6zoXC_;@^N~}5HeVx-Z^m|ZaBBJ(S zI{DkLa?n(YK9zp>P=lbX%&FDZ&I#j7w7o}bMuxBI;v1wf$is!eT7LrJl;bd=Z=+P`XYky z%p6K0X1Z4xR(_>vNoGtcH!rg+WBjJam4l4OIE9g{9C}f22Oaucav1K`9oZ6x@4i_q zQGTku#ru6hao2$XJBJf!u#)W2`joo`^S(n@KlIB-h{s5=&v-F|4f#ojw?PlyGxF6< zOq^ZFIow8|7kPtkU)>twK8e5KXxmD&H$94;IUe-~B~Ka4tVeDp-6Pl0>qC2;(865R zJe@FS@|Z%`_>cngJBp=B&AN}cj^1*0L=!m`N!OXQ5NQa;S{n|5AMfujv_#_=lSd23kqyU|j-}5AY&^RuBOSIxXRAjHvhy6H-Sy%ThzU zFY|=h%O^`oNTsFQ5HAXyWJ% z0NG53ylG>xqIe2{Ik)uWapVN+YR^_gpJ*NNSKJ&XYUR6ttIOAQi-2Yc0}s#vC`cl$ zWQW`bXqJ;^4NHDLF+EAx_)N783~Ew*YRdPZA|*?Jau;wWWiii?XObuJ0RIc@Z#RN| zUk#K55PZo0E%^M^ujT(gdF7w1rvK`kzxC?=s5q+sF>(=1BDaMeE3^R&2K7zQ3W_F9 zs1s6%si=8;hIr8Q7pd6t))#>FZZ8{62BQD-JT*0#G2Klp3?EET^NM zqu+;hwuW8dG5^N??uYEZAVn@R81!%jX5?T3iT{?ZR!UH}rVINA&}%)fF!uqa(d z08kjW36;N~xxu$NFY&pS3<#4OXn51;w5}p-Z6EX0GUhvmFs zqaP~vnBy>3>@!u&a3P2^;?Bg{yL_}iQp84@SPzcKjPiwSFwQE1L5;*qm5kuWvyMSFo_mTOuWX1VS+!Erj4(O3I5#rni+}qq zdYxl&?2s7=e*$rUN5h>&f{$p?s)$Dr*aj{9XN@6D0vI(W1t3k8Inr;wz`r>yHf0G32f%6N|JG^w{x6*N4<9X7)s@Eeu}apwL=XoM#AbCqeP9Hbh`o*^(g& z)22FN9g0`4&m#=z+Ulw{QrzG~b;A(D`#ie7i?mh!v^tfYGMJZHL;Y4T7$g7+qov8x z-n_fM2)qa@bfx8JR`nMA!?6%|Bj!fqx|Et{t>#)ShfuRQlMa5f$G|@3QH#QGW% zu#Sfv#nv39_!r$2z76Q5+T@+EvD?hrk*{&=>wx*1;N<@6h~ubQ+hk@^RqNt`p>KR1 zdCK%zp<{lJCe4!6e;sdXKspTM>t}^#u6;};pLoeO%dzTG=WIlW3W^FIR4`O& z6>5>ZNGZXEFZ8pz+84NFOQsvyU<*z!o4z^e_phz1yWI5#oZHe%6?&VkL%iBMa%UX0 z4NP@0C?hUW2Td_VDVUDr$!f#AxYTJT4Dwh;XWJ`D>+__j@;G&?<6L-qgoEkE+KGB0 zITKde^1-62ahC;O;PV@F%c_Qj=kMQsU2I0Pt(00~@Lh@4+Pv=Qm6{o;fWfHmbnU~j zp+0#@Q%%5_!6SC{X;^N`8Cw=M=|%S~@04}C*)Qr;GiJTUq7}f!Hg5#ya)W>PnTiy2 zXT~^&<9#Fa%!6Q{vw{-g&F~RI_W;jb@TSSgEoR4RxHtdacp_NpO5$aC1hyt0Kgs!G zX#x}!s5cB6eIJ87a|panLU*9V-bX!Tj;rAj8sPa1|1!fPe&I%uyv`r*5vm-COkB8Y z{PgLD%djjNKM$XPaCAK4KF0^{^2Yk;d+eRmk*U;kblhQEB=9gz9?H5#(jts0*jCC~2gwkq2 zt1Je0T~25yBzGX%Dn9Qs2?9HbFS5`S7ny~qlb{YyXCt%S&J@qb)6ZvWe^u)W2?A_! zIZ?bxsG2B&VJTq76RLx@ioFaez=*jTY87MDa&DUIvW1;P=4$XHgZ`20vddJ(4wI-h z|AUqR#twtc;%-r!4E>zFwfP&y|dx(QV7jPNCWi zy}<+AUwW&d-jQoML9hwPSogy;P|_$(W93P`3;N>g9Lp#Aq(Jq5 zB_`t~F=^ej-xx)*2Oe1v!i4*B%CAiFVJBtHCOvvYo};x|c@DeDcB*0E;Ig;TTgGh0 zJAF{g_rsnw9kA#M^DunJ`y!XI8zHmA5SrQa?wSVy*2+?K$ToOk&}=@(P_YjOg~eu{ zYIsYMf(7t-;TwMIRKs8TiWnu}aEux8fjL+NXrUyuwF@`iinX6xO|e);ixXR%hkn|- z>0>CFAv@k2aN244w9A@-SIC~9i$KMsCD(m=o&;$!;p`5B_XA`26PoGDsVy>6+|`$Tlx&2o5(e3{BBZI%HMZfgDd#KR zP(H&nL#tq)$l5;cZMJyS(cMUX_nq){9>3F7-L8Z74&13T3Geuwb+UHpQE z07y7X6Z1?>Of>Hw79?VNuHVE?6%`RhUQzds0|x)(A1@<*BtiPMz^7DNf% zJrvj0D)$i-xpyG+T-0-3UseJSy@;R_^h7L-VPcw@;G%w7?KpwBFDz&jSr3^TW;o7z z^q6J%F?zho?XR81!QpKGZ7(fOA1Yfys7CDvKO$8QV?3&w=#gNIXaTLXF)dlJb@k3< z1Aed&yVOCxw@OC#a7q2tj?AzUf*f~vy(L-hvJh;OPOUZqoi^p6r6F0(6Y5q>(?ZcQ zZvG4WLQE4@4aU@NYnN@Rea|{VggX(f(`x3=&=lq!jGCi_{Dk9I!IO~bK0jFf4cLKX zhC&V{Vz>CIV@2x^09qwYQOgbyRF31Qf{u-^9i~7kM?Xjo%anL%9e->a*=dcx7Z7xr zD+td$g{FigdU5MBvWz#$8Say$AUDY;Q4kmeur|c!k=!F+Nr?!_ z^@Z&0td&gv9JUBi;FSj!MDT$gfGju=H#Ss(Lc*@iYZBrtfCP8Ui(Yn=8A~ut-MWmw zUZweMhvBe_(a0e@b82+Pi`k9|KiBTZCoT?Hdz3wnzHk8_>pPbGo&}P*wnnwlq-~mS zT2NWT?GBcb^i;~qvbx4qiE^5WkUFqD)591=I&x|wHt44`uy!j?hN4zzan%^>9KrV@Gw@v0! z9A&@6&ih-@T6`&2ZDg2Kr_Su?HTH!go!hE_DTS8G>J!bse(^idSb4b0x%8%h?@qUS5GQ@}2!S!5y`~8urSt7oI3^4NS-x`|o?+q<%XKm;BFP5H^ z16aBW$Pi5Q#^J`mo0LRv3q)KVG{rnHfaYX)vCerc&M@?1CgIu&51=$Rv1VN0zBVNJ z!l=8foBjUe?FBJ6V&Px-X%t8f^vpQ36!K>>S%BE8W#&lIHtoNg8uve%`tjdQy-@wH zrgkF^xI2gmmpT5H=C1qSO`Y8~_+O@GUzk#={9>3=tH$QyH~OX{mDiq(DTkiK5fCZ# z{qk807?`w$>5ba(cvD^ByZhv_{~_HWs}Qc&+T$tpL@+p97x#V5^Y3#a&BA^TC;&6h z|E;NM{@&DrwiY&q&i`iZcDcdd5_Mc!Ff|S=*Z~F6{9a(f1W}9tl;bxHtcqyf2sTGo zVlQ0EUNHdEqvBUhsDuF|>gmk&boQ{F)yGkCf3GYLjtBdLeU&_JM%DNQh3_PD0M<7N ztBACT&UPKifV;K@HQE!|WXlZYyyp4^szT|2^Z3K3_9bThcht84$x1K_>GhyKRbFzk zNtl?l1+DR}gUerjWyXn>&eO1$lJ{8rp}^=ral>i8n54Ta>%%)aK9Zi3wp-8}-lD*Q zavc)DJt2>HFJ5!vIMmR)s9_{On>OoY4A{o5BSjW(T1S*PNmcimUfxCr`Tzll{E@F% z>+T|Ho7Q(7SB!fnf5PQQ@?LaaVqz zT{xtRcuu%C(8J!zYzMwGdi)C4hdaZ2&kMto#psNzi;5W?LK6D_&~_DIQEgp&RIn9A z6b0dzq*c@FMXlXB&Nad#FAf`KJ?J7g86@9X^sW7a zli@D5i5D*3jt>sLajEC!`E#1w*_WQt(#3E>-uLt@V|R-{>y6JGU1MI&lO}9i@!5S| z56_16x@>P${dLnRak*b@r@SthvB7!y@!a+sy4@K6E#~9)aua^{5O*2WC!+4==&@fW z*X!7!)9bk0#pSCXim4KJM`r%Pe5lLwWs{p$D7Yvrihq4(Qkyl3a@2pk|Il)v)YZI- zEy0oDkP4hVlSwscV}`^0Ml+-0?Onw+`!~|Jl~=8H?L<9iQ``MB z4^GPpT6w=rO3P#B`mUl$v!C9aFROk|+mSm5%U#(KB>bHB@#y9xvDT@@prQpUtvcZj|?M2^>4D`CJY*guMt>y>( zip;9pUZ0!Ruddanyy(51#^+17Cz zo!ch@H+*{Z(EjI`F~$kcFZpe4Re5$+r?kQyo*CPky`2#5_k7UD`v&iOPukw34tnzZ z5g(t1J$v-=O?|tDCmU4nW|n4S80GCbzeOkCR+SPbyqulrbo`v}=2bba{?U0?x3|7( zo}GUEgxiKG?eyB6@OreyxBc*MrtdSFx7s@)``f0R)SbIM_j2FUJ04#@IBHd` z%=O{tDxH&jHOkj7yXIQGt!ItHgHwX*8~DmU9)C3@War67hYT{xZaUq_4TOv}Cm1R9XGESO5Jq6*g-R zw0yNS|7ptPizlilFa9y6%kr_^EBvUwPvO`jqAoYY!H_>gm!N6I`CpA!`)~|~V|#l$ z5rbjG_O9-^TT#HY^KKt6k(5CIXd8cB%rcIjrBxTjF;UZ_GZ})YihZuUCSY5 zBeTye{FtPt2M-&54LWjt_m<`73m0rCb29FP>A2>}|Gv5s(t%v2K=ak$$48& z!`PAs!`A$RpG<$?gKlX}e4)m>9N2!z9E-;8 zXQWr8u3w?>P}F!8-d{ZC2_AiLzV-Yq@1}bTzSw+ZtFPX;-B&XE()gTfr-uCWf4R54_2`}*T=xp&B%d3_2cN5S z+G4Eb>P~?cZG-oJF-QvaoxO4I@_JJT9X)Ax|G>VcbG|JyueD`EVWVcd2OT(n%5xaJ zvs-Al%<4tPh~IjR-*p;Zy;sQonQ3!Otv*h+$n%i?nRaWD8(gzf&)YbwZ~A1n7jJ&0 zl`U(vtIORDqGva(FFsDm3z!a-M_UKeVK;}q==yS8xx__X6F2`*OoE=Jy8prqa)mcx zmoS&Hm!@)Q`e)Ac$rVLwNd(qG?N4{_xT0d3|Arrl9BGnF~J~ zoiKQmZWm+dRAyA}#GxiVCN$mrX_Z&PO5ejRgW6=?fnxft@M8WyQzEOlZOn1be)~BE zDh`wW_1|8DV%jtcis|(yp_s0-d}{U2A>aS$0>$+C`dx1PQWVoc>sH!e{y4|0=MpLo z`@}?MEnV!=ebA-XnzLCH0s>go;eN0i>!Ke>og?u z+s#zjQ_rW$^x@Ur4C}il7ndxsm@ZlCYxrF6`qP@Vt=;#|DI3{m-KKt*Cbz!YE!!?8 zEIXi=aoM1zCky@786Wzo|1*73UTul{>BTu>s}@c2s-B;Bxo_T%@F%}}UY+C`aNxm& zr-?t!@-xalyH?+Fe*04vTZ5)%wA%YCV&Rm#JJ!U1?$Ds(j^_48?^{esS@R&w=3zhY zmqP2-g(`>sW}9Ua@+_ro1xD`z9_QCq>sLnN}jcpDtl<==jwM6k6v4w+OmO@Q_V_gry+av>olgu ztQiCJPTMzkHEr$@G51_-qr*>+V0kyqVU}ag(IS7pfB_yC6a`3Evtet~)~4DtF?x0; z+{0$?-Z#6OM{gd!^7T!F0qfsK$oS};pg)k)E)REa$MfjiaVS9Y|wR=yDdKPTVLjN?GkD}C%I^-C^S~g$Rnq{j&`UqLMn003!GD>!ZG>U zW8=+i3wRc>~sU3>G#3l}}k@=3Lv+oo0g0{`3V^$)J~?N}3Pz8z$r9> zKHd%LR0%S7JiIogT(J!3)U)KtO9?5vZydA#QCx@&zYm$DWdoN3dn!y@GSU2!Ub*0l z^HNOaRIg`oc1C`%;mC7i8{Y3-Z&;_A1`BOmd#>KFZ^IQ@10*H*<-BbR$A`G5Z@01b zYWpHs9KC*B%#@_dtzs#*I;?XHJ}kD`*>#0Q_9bh;x9jsDktpPAqN zozZ1mzhYOO)XZP?er#V+@OR9@VM%UuI9&_Yqgl4 z(D2#a-ftB-q(Vpv42@48ge>cBDQa^eQ7#=(LAo}6`}-|A);-u!C1c!B?M({@qk zn{RpG*C;+BpKeXy*<&dCh`T3h$H1c^gC}Wt_>$t7y&F^$QpBDRNzO3eL zn7Sks^l4%C;O3D@W6v94?kF?w{`wk_H}ZIMM@hpXG(H$wF2%68-~F$L#eQPOuz2RV zbM5FQzRHeAmGlkJ@mP1Y%Ant6f9D(%_qy#XZvl1Qq*IDI?>f|Zd;egaS6jAcxo!QP zy}vBaNliNG@wCb|kJkZ@L~hc|CHSo z<6bX+bUEm1r5`r&Z!hkBYmAC+cdRhwKM#u@qEuN@BA2SQi)vR-SNp##s)xm5spsap ztk#*Gt>Qe6=R3e$F*pQ^z15YiJlAbew3k5H7rBb+Nn}wSt|+Q)rwx3hD5}Gne6$U2 zJ}~H!Jt+Hhm!{Tln$7FxTrU0k+J;}g)j9^swyn4~x#=f!>*%M(;yI}7?Y6U_2C3z# zOHpk);B38;i|RHdWDa->H&V=5@AbsO`cdyDlZ=PGe?G}&lCZAJx`Ex=iXG-;<*&}4 z_5Mb;ujPLBIT37d-LaPSd}~-|gM#nlt6$}Ex@!u)`AsHE)*2c6ig zEE_3WzNz1p4QH-(TYg9}H$Shx`NXtGEqvRL_}2e@h34(99~)c8pzPdhi)NTx+Jw4= zHO(AzeApkKHO>1J&M{rE{j~enx)m1%4Rx~UKTG^DDXF{5sW--Pe)20z#y*!=)QIx@ zAzIo~okXmC+gq%xGjianb*En!bbPW&Z(sJs@IxygiTFp)t?;^%+P53VE<62u&h`dB z25d&(78Q(_t*uo({`s;;%YG;ZM7{lGjB!A`#+yV+n48rqw#KT zCI?e)uXemO>+Kvy7i7$J$DHws;=0<$!f&6e->*~L1)1(Se@!Q!dX*B#besEX-aiYm zahkd3Dl|?Zjm+w!P9u|-Kl(Z!8>eMQ7OZ+QW=Hmm#W|@~*f_=N`t-)|7x#Kzoq5`S z-_r?CZPKQ_b4-LudYv@`IgO}>d|SwU$p-D*0Zgjy;7@sQ*j!(qevrzZ)9&-TdT{> z1ZjaPjeM#5&A8;bd0T$ZR}0iWQiI*vaOK6_^J5cQ&`ZX5=?=_YA1@>KLC`*X-cB zkd7CvPIP&ZWwkfwnyLmFg*C`ls6lXgeqLFFTn+R!HZS<5s6k?+Yo}*yDGY-e_ zx3C7uQ`R6}r@eiCx&$sr!FU3ca`Pk6E=n$xY9hZ;!6?6gF|6jhlY!&>Xv% zrdEnxh;jDIg|(8^y^!-;uop51dLaX_7xMYvcUOk`SE^uB^!C*L>x%JllIhnd%p|vX zUAu%#;uD)B7sVzp^7d(5g&9#Tw_>~d^1{I(hOP%}u->Z*^xBOj1HQ;whFUF?7vQj=+i+Ty>vr=k`f8 zOKn8hCQTbG*mHXL>jTywn=2B@vWx_S77e_*FRIija`mZDll578{lYFg zyL`*{m9ENh?i;lsuxN$c%3C!;CZsQ9mLtdi*^&Kt;Qf7zYRwXtkMvj<7vAq*`Im+- zudZr+PwqIPb87X5Wz+LMOmm6AawJPJLPqUxZXIXlG(9ujF6_3!kDrws?m^pi%AV^p zyPTfl_VYmBEuIm7rr|7o*cyxZI7<)8&fWhiNgsQBdxDPKQ}p=ez$|?P`gQe-@)vE^ zk8?D$9r`*%+2ad#8s4hpa-@VgjIU@Yq35!28J)gJzqsx6uz^illWk75s;*jQ>@A)@ zV^(&v{R671yCL!!^I}6Y56wS6>`JP#!B>A#1)ECoCigv-_1Kka;y0*;@ZyY@1ALQr z`@}ShZ=CR`Xx6}_)oUsxP2K8c8|T^lqDhM9yq1;**V@-n&qSv(X*2jlu&G=${YvZXupUpfQDCRJ2 z_WztH9QLxObGgksv*u?9UdS~cv?=!G@49#1x-Q#mY61Bpxopt*grRvcRVrqEo%6uE z(y;y;mz`1Mj}cE}#&t2VdH=%n4ConJIv0N`9J+glAze$J!*t-!*RWMVERUDPYAr5$ zdMgw@ME|hQ-jog_&0LD^V@GwHlVR0xDE`h^G;Wri|2nz2qk460-R+Y+yI3y%^7NCq zM~{MgW$rGoeZOVSkkPf$Pu#2%?9e^ib=fuRY1^(wzlg2lH*!B_Z4*V-UK`?Rl{96m zR~NBoyLj98i+tQI4W1a(NRIP0pL8waOIc$@9@!J>7S}B4NcG!)e0m3N2tQZu&Z7qj zKWkK4G~3%FymO0_$2Q2jU4Hz_^Lne)ov?In^SbiY-msoKy=8>=!I7Qr-<#TL``Puu z^Nc0YmS6fmy^yQ7U}3?8EBej6?jN|C6EPW<&MOzR{<&`OtFG7oJ@;+F{xZ+%pLjK{ zeDc<3dC;E-vCIsoEo=Szz37ZG8)a6)itU zRc|n?@`4pL;#|iVd*3PQvn$rR*)5~*ij{M>;ccS2>xJCBwOjV|T+R<%Igg)Q%V2~- z?*`NK_qh&)1;(uA>Gu+{cP@(F7kp}`kJm4CaUk*nVMmla^m>-4s_+m;wuwY}9bf8#{w zH)}eKs9R7avAMk&H27>qMRj}Kh2??3$I(ycUW=Y>{CUf{3x;~%@60Pqw4YzwW{c-N zX+)z&7w_L0*R|T~;bB$cMsC^rVcwl)i5HJAX*1}O@b$`P_j8UsP-xb#_4%r}z_?bS z*)nB~1j_v%>K$*epGWakNdPyK5nrCp{`PHMy?V9(eFnG6k$;+HZa2>n{&PHiU_|^` zclfFJPd)9uTzfhD`M2}zg%m0alzWD{EScoY{G*D@9|XDZlSmpamr2551B>RblC;iF z)FA%qIpePqlH%iK@*P+n1n|&@=Bqb10STr8sVJ70 zQezDn_*Z%fl#(Ulp$c+LQ+^qe;qd_e*b)91Z^G1k<&=h;pHg8s5-X!e+uqHpW-Y1; zzEU3ce&Jbu%~u)NOv$0SV!;*cGU&S|isQI3-q&kUVFnPs2j6%RjOJ?ypq3WHFDaB1 zL+y0h7lvY0qWKDkD-$>%L}6iY2uczviG`b86U6dlNf;jI(FB7tIOW0eTV)QQ=98eH zz8aG7ul0XH)t(9Er-X8qM#vb~{W-wvcAj$86_iXaP&VVB1HVPUL6r&uK`gTVui9Fk43=pG z$!!RMTm$0&e}hcbiQ*UwugN++jCfxSOco1n5=XGt46aG~e`e1wF)5VWW_U$FuiBpX zo`U9ngXZuskLK%~@&Af7a2js2<<~A4;tk*ykXzz4$ndWYaCyo9vt9zl@&wpSL#jrd zM6^edx&(LiVNBrQE-6u>8~~UZ`(*cw^enLb2T*V)f{Gs>71)QFAoNR>hDFI`Qc0RP z+y_2kYY{Kja@V_I{x4|Itdc-LCOg-LbUqb*9ZylbP<1Yl8O$jCvPY}uJ_f!!Lr%u| zhUUw=DV?f^EHX$gfw7RA)j`RZ4n6{c)8P?kJe{xknh5I!G?fCEuw61%tl0dNAcP-b zaFJux&5iQpa*Yfb<*pE1 ze6DkGt4_{?5q%sC5hSOUk#u@wtgtyn z)2(S!{=yrG!icH@0k+6AUwt79)AZ{ok%uM4isTf-p$fW>ZGZ0|5IzC^i}%fFzLq4@ z36m@f-NoEthXBDn=&*Y5DeZ#r>RIC+)P&P>z82% z3c#rDLJ%z2Oed&iKLyY1F^g7gkTcGVZJapaqC`=sD1n@%pbAc8$_=)H_-|lnBBxhJ zN}%MVBB^j^?MNvdv)6WVG8-uu#YaiP@a8zplnR+GTyiw|71-+osF(~7gI)ZT93+Wx zSQo^_ixPznpa|s$WI4wy#O69TtR4eUIFWTGEGgde7f{NVKA7m-kocm=ozdf)bppsb zU=FhObKF;YNaoujs6Uz|nh`?X+Ru*=uG(0{GD(I0x39|4cOaF(Q$LI^vje3hsou1t z?L$m++#6Yb!WMK>2&~==5P{%Rj!rN_4>c^eLD1a9u>1n^uyMsgOp_^eKN!eT%*A9SNy z+OG?{4T461a>EJbPCj2sa8Bj+g3}frN`km(vi;>mu~_Y{sAL75wru|m7ccHEfm_VOsTlt z52bm%Y5Gt(AbtjkNW{d#zd&>egBzJjhuBvX>GmFE%K}t#K<@kTFA$Yr+=6ug!4g6v z8ew54$VxZ(Gbc{GT$U^e7t4uCB>^4ltHtPSaH_^IVY4BO zpIHJWCs|k$9PUblITf^dAkW*!OSr~Tg~9c9w%-KP!b8wC=t!U}`NhvKti!8;=-ruu z-qPU)Fbg^d&utn8mf!cQ8I1)6$J%}5E(sTEF$aA+Ew{!`@tchSaHb+pVq(p zwpvdhs0nj83qm=s4EPcJ<>C_PV?xZUdake>jBA~Zv`t(H+pRbX8J2dKChlmf$s)8W z8is7fSHA|FD6F-)hcN03{bvm94guuI3ZNN0R03g{54+cphnL>z9XWHs3shJGBHMvs3W30&DG#Pd9x0J3H{$w;_^)9k#WgQ8T zvl9ZpD*^qk1wXV(uQ>ZqIuOcA2TFDuP;m>$_yuGPB7hEC@c@ZqWnthm{*WPK#Bvp8 zafS~hf6Z%H8!&9)qx=u!fq`bwcI-wl@zI*j1hEq7B#wnkcM`=)Ryfy{aA0sq`t~at zkVZh>BU>O3VOGSEHIi|yJxC%Amko85CWvudK!x&*3W7=N_iX@;UW4Q}fDmR&PdWtJ z3U1tlo>*e4`dR{&T9uU={XZa$OUqu(309ui(^(NQS9pn`6<@1s^I%6E%w-cH5XqIf zR!}3*G)U4UEaxQ)$Gb)q1G!S-;$>5EVHN*FTn=}TOTr^Lx{~Ngo`T^{H$c)kz#++< zo|8`85pTJITahgJ!JRf@$0(6BQmnovmBt;8SxejmPac8ZszA};N7y6PStst;x>Gs} z*U}xXhR=7@b8!W~%!AYtNidM_qB8@UEefP^)b>)cM0%+@t>bLt`p*tti@;uy5SOG@ z_Iv&hn9?L%u6+|YmKh~|m+S%tCV^(+2(8?NHE11Nns6FYDI6Z7bb9U)-NNwx$vfaN z@1ZS4CX-gaIb3qeCiAW07)v@|_HCsx?bOR9?b zdyNm#Tzk~(Jr&KsgHD2`A_(?Q_tTlZl3ZIc3~;Lqv(fLiZM?ezKTh?un~JFe{|7vA zj&hiz^=cQi!260XgXee=x-gH>376?L#o3wdvFIkA`e{S(qN!a_q{#^EhEY0UGu?p8 zZ<)W>xCxs%9R97>?(ZB2PSOG<4rFg?LA1`yX`F;o6`)#H)_mcDdt1+gTI7UU(xKC$ zLylpJU6NXgO~&o2$lv<&p4Uf0bPs`%K}7H;fcCA9{Ao19j%@rLH#_LTSF@`BGal5H z1uXd!>{Nr@TspEtsWRBEf`h_b(TlGZ5I$$XVeH+hC`0h zx8^5Cf&2KvzKX#FM>o@S;)og5q=8gp0c}ekaW6I; z4BwG$@@H=auXqEvqz0aXv*>_{L8Ng~Mfj46uvhFXVsnEbGpwroasqHu34D|+8=6hj znH$naNoJTKPv5(TtU0&b-?bemDIE&U5W+Z?|LDw`Mo~h|h6Bxq+)7H3y;>jx1=&N@ zkVtUyYO2nhlvYVZ-s1`@#gw6Mz?Vu8=swVD>rHU@bCymVGTIxQBQ!?Ooesa;iokcu z0B9Hinl@V}&{D)Q^j*0VE@~mZYJ-pE!DD8@#MqT!=+9i87$VXgRS)rB+L_+~<<|sQ zQV+uy{&!e1d{i9KBS&GFfxa)%Fx|m00|`AmUZN923~wOWQT#%c^4YP2(?xhF%6BK& zWHh8$PlA{5R&$0hCf%j(_WuPFY}?Q#&6vy1`J{`j zKplr*f20fHE;V-R#0}FzoT&_>wOW09uW{g{!y#n)5UBeP>V(Q1?v>)wA{PDNT;Y!E z*!g-6EJz6WLx=xI@MQjCvd2BHAX~q>^%!{-SX#g;lFX0j%$CL-*(~Ajm@OY})-aF< z^mv;d1y1V=Q=U*lV+)V!#2PW=k(`kgK0C`HKbAoi6PJUUCPAs>MDUY&QYU^GLk}Af zXIXhin#AWq?$`-)oInC`^;w+|nLeR(+2Rt6tNcP9MqX(cya=rD1g7LZ1P`w-=*)x0 zL5lI&8o;1^_`Gi(o{uvEy_1D%GX59Fv!`uj7vV42;J)T0T@L_ve+KkJ5@qvFuzj$7o*HKR$yVVKywZY~gr z3BGb4{=e}>AA~VOB*DE$TRLGPUdYWO#c7^2sro-s237HY#AXWZI`Q7v zWNa$F0;b3vEvfD4OwspvxVv+O6K3GNGgT^I1F_>l1>{=a>yA7~S$5QaFz2@Ck34Krrhbva}cg zTLp?Hw`=a{N(WQw6>dZn`iYXo;fk#XG&hP_w0UzLh+z(HMA4|JkQ;-9T+WK^SuXO6T5m(w>xUiExOWd%q&LD`E!xzQVi~Ufz=e zBWi0xwvR4!22eJo8@f5L1+xXZDW~GU;{umHjMg0py6&F*bQwAW7iUvP`x|CVe*!ZV zK||oY6+zt$s!3V^X?&WaBE`DqlQ{187a+R_$dXNSNgp~{(yg$1@s=u`+c_m3cu~7@ z5FA&8J$h`35L!It%!mWv1e;kU)g3=Nw2ufP)L)VqE5;WX;t^Z9$JztV$=b)pI*Q^G zV4tNlAwnkSxHkuZA9d1ul@BV!GaFhB&mcN5TV~ZIJxswNwo_8s;-Ufd`{u>q35)*V z9^~nRu)cIujoS%(D-y5L2f4i)VfxzTmn{cc#e<+^8k%UT~#G8T-U} zhZEd!=heh}cpNaX9b_jhHwo?!;$wml*qV}$cDyHbS!VoofMAc*1H$Mqy~PQMNpi81 zI1#S(kg4|;bAF0WqhW(r}mfzoSXr9$*jFJt^`gn&j~HrDntSM)%Y?EkJQN_ECL7{jg#?{ z}QX2XSBw2!__^=7(Djl@g<))L%%?DYw zf-FuNAo$mqVRS4~U5eBB>W_G{7S5^MukT(K3kI4C5|ZbkrozOMF9?)F3~lucrKvu- zYAak}t^xi>N)s@KPFri}7Ha*BQA90&Hp&AQ+yQNg0M(JupVK%xA~|MLiWF|=xcc)~ zyIufh0O}*Fxf$c>fEwq+X$!8au&HBLr|#s8Fg&c5UPF6G>6AgI&NB;V!=RlOzv^No zg5H0A1E@O)t*xIzhfxT@oe0(EWd0@(qP*V{mxN3MXNjqzedAx&Y&s)6@^UvDz^<{R)5D%?<25qhy)*MN#LDX zNXJ8`RfZrp)uk7M%AEs>Wnm^rHcO_$u*xTelB(j6Zbvk7Nws84hh3JNf&aCjuU-WI z$CmLUF$y2;f{$ktxGi`}s6~vcEnq@dKp?JQdAI<3;{d)TE0jN_@?vMke!5V%j4uRMnfzmX3uqqg?UJ+CVy^#mdTd(Jb z(3VC$abx3PItdKgSjGm#=uuPqCM`EO`%d#bG6{22wi+_-Bh0-7?qCnH=)Aj?PFbq~ z#}_od%Uhf;1Qp>5m@nbVSvz7c}HVZ-TAmj!DnFn?*_XS$T@`m zu9EN-H}fdlZhR4od3M3fO0)DJTDw4*K~}z<_tRniI?oojbLo|D%X=nGqe0nE!K!wI z!jB!IbE2+pRC-qbSfYCK4h(+=`=}KKi8Fz=D2I-wRe*36Bsk!)T^0-A(L!e#&Xd4= zT4{JjE*+B7WlN}oN7Y;qikD~HfRVgCA>5#2bR@=6VZOk4*mY>3HHd+m_ZfA1vDJowQ10!O@_13kc^JJ&OPRt{qI5Y#bEysHmJ*$#+s1X- zxN1}Z;*Z?7V+-Rb4U!e(DxXxBKty&fkq2kfu#`*?`w;LzPI}WX@bjQ7J(vfwxfMHn zeB|TGfM5YBlsv4H3B!39 zQ?;DfBH>0>(~ddgF^530p)~=V{*X=>4acZID5s3j7q@(#6nP5hzlPutF4m-jHxHE_>p~gXGq*(<;;9c{9!iJuDcXu8CaRI2TDXT!7 z{+u6E<>CsJX+oTiBzb6A=L|@<0Hm`cET8$RR7fgklb2YI;@}o@p!^y{I}9F9t{mjO zp`#HwNxdqm7L<8*Tm3t_xR)(^Zx=!U?}X8nth4I8r!$~*^x}@SVwB;pv$92oclUxi zYlE=l3iFC0I*!t5uxo^f#XWE?&%`eH+U&T%j^HIPK%3;KlJkiULKbt>>H3bDHQ&M% zNALlNyAh7z^_7P>>%I%cf|cge5>ruyBK?tH!9vzB&m@-_ML+1c8qIm8a=HsUJz;FG z93Y(45GL^EkkHBL-3dWC-q@xM$av>jr5bJB*MZ8~g7L{pv1?5_Rak$CkB?1dUcJEY zW1s$6d?zOyLN{0Yl2&&^I!v*qxHU5FcI#{LV0Ht@JY>6m@K8EY+7ce`+8%ddhU#`frOOG+87*=MrVT4?n*lqSG%++Ud)FjS+KYw*a+TECi$5o>4@s$R+WpCsZjl4 ziJmTayrYaOxCmrEfjtpngVO1k3j1lbcGP}iA1;dLyl@(|`bcOwLbOKl6O2S_^#v`n^xhr(?rw4qe3P^FfYO6GRn4NmLp zEd;;m0ok3LgEpN=r_U)JH$c-2zkEFMP#-`X36nLPLI*&TG0GY3c8ZH5x5m(D8HXCx zz63ycgC*%BM$n9-X^d;UVy?JC4~$#BEcw3sxV2~-$mc}J=MNn>8e9qTsakq$L=5$s z!lBM}!6iC@OOUOwfiw9LwHqI*NO#~0ah&Zfy}$p=V~{Ng{GTip?`P7H$kDQdX`bDw zvHQOp3j~j0G$vPWTg;(DXjzM`Cv=2uS5r1^1B(>FH#yc1-&|_aT&h9h4d&ZEgUgQu z&A||)5hib;6GyYFGM{p8<0O$QA13gG4T{`i9M67v+z0wk{o!u0euRUy-pY@}ZEhiy z(Oel($rpEAq1%OzZ#{AbNIMdEA?v`hFi+=mbZ$Plc9fuI8zxM@*90{C2foRS^nD*c zj!LuMFfZ{7lf#=2Y=z&#iNnf4&aO^6@TFGd_F4S@0pIAs-fP5S){BY}7yAWkko znI7gR&Yb$N8NUi+f$zP5wCj*&enO$qk?@31NBC(gHB&tAV3SA1zcnsA77W8cUNh|` zbn6rRcU3q1jT?&Bmbl&#V=uIhXi} zt9-}BQ4^xvp@1+Ijy?Ff68P@~p1Dt{?4mkK>o1LH;N zYLm?s>LBOp!Qey)iK@UE8Q1PFO5lpIBbIa72ZhesKY!*Y7{M>V^w69Ty1^?td2-t( zn{lLEp^9E%0Z_zkCw&OYaqsDrxe8#FI=OyD55qABtA2#LiUii6H*%pjuaFL}3~4y@7i%Rp46AEjJ$J65(ftX&b@r7mQE!Gs<6mer%;a8B}soS&-4FZFL-fcIEh z56*StiavP$trvtXxyi&E7At5{YnA-eCS1|VPvb*@IxeNRB4mw%OL%D1QKt$7A>|tK zqIV_(xObQ~u0kiPWLmw$l!G+ZqxC<{+Hn-Pje;m6r$D2s(MfB(fT!30?bs1BKTz`r z81Fh0%2-^3PMQ|L>_Gqvx`*}r_N@Tt8d6=mI`M}S(|ih7x-G4iGmSlPyEmvs$SShD z>e1|EUWc@YBLm9Rlq zcyN-YAA&HuSS)!v=)kz+OU^?aKqaRI>)n(NOE!))OOEQ#OB@P!|Ndg#0bpUvsn*u| ztY&mr&ZMGFCgd((dY0Qh(|6fAfNcp5V?!vqXA3$seVkyM6N~0u!GT?!K&Qtbmy+FH zuhw*wzb=~jcZi=KxS-2C5b*+hlPSZv9i0hHl5-Nn4WDfJ&|M!y=YIbU^5wuxkgOIf zx2Ka<`-d{5*_5$?5SeBWf_?I@U>^sAYZc(%GP!e$3~DEDu zft#|zh>&oM(TNF6DRdr@5h0wfl~b1+pLNL&^al&1f(wyr3JaukhO{bPt#X%J|M?f& z*1HQL!~Nh|NPXk!NX!(6GnF(R1INJW!N2n}+L(drb(-$}ts;nJ0#jRZ);tQXp5(*feA8HcwHA_| zdvX5yOTa#EDkrPIhfC?CT^$2d>9P1<+({oxYST3ro~{SOtc7xg97*fIjgU0%HH2w* zEG(%ZEC=h}f@DY`omH00bu2v<`3Al?#f?e0QE)=+c$YViV3c})ckw;eNqz#Mgn7XUY_$))xQsnRfiQ9=yPY7>(L*1r3=$2!7t+TQ>au|LFpou%XDt|wR+#ysYttQ9&VeAU0D6;{#ibA=@9yIgM-Z4H)p^I=C{Dm}g`2t=r&g8@`kU^C)`BOn< zyC7@W5oWIRmKQ@?Aocu#y1=h{QozRz{T#tpCrZG5~N1 zzRA97^^d#&%rIufG+TAp=oxG3y6_m}@LILBH&hNQ;>99_VbexA>;|2j^%Bgnk0r;# zU%a$EU_^o=N8VEW2M&R;a1#-IlNT$G)xHpfPaxq^+R=dNf!@) zN@rkGN2|vP{XF`Da`0p#nOr6`;-$_sNC`$Cv*yI+`j9EpK?*YMJ2c_N(2_uig5Y@0 z76omv_kFtpJSp-P=AYzp>WSvOFxokc<9a8g?{jd$1$-&J71-I1@ZBS=dFeB4th%kF zWRF_w_wnIoFiIe_T1aW`TJoZ4OT*DHMQI|MEXw-=H< z&ZNngUt9z=^aNS#33cR4b;41fw`Ut1)pp>^=oU?2F7gI;zL2TOES?9>6K&urP87ij z2$51MZu)M0_WhazYFiBTAxVG9NFMsdW>Ek^r;E8uR_#5wFv-+VW9AQntaKjwa#>O$ zT%bvK5t6G{vCNO!z%F#6wB{LCN<&V;tuN3P%ZnRSaHS<%HP{Fn_u!>H+~Fvg1OSuJO#Lxi}C13e_1YuG0)%aRcD)6&@{Ph)U9(Ggjw5LU4djjd$#xhZr;|jensT9xWN+Yq8B$CULq#XDAqS*Cbjf-dw3LgxjI}t2YTB0Kh z#cs_l^oF&|{J#UDFXVEv3A22uj)fcPZZ6#OE$~3+B6R$4ua3w{vpQloNhas$C!uCNlY2(tVUIRoT4w_G zz=8h+OCR_2Zx@vP2Oxbw$7GJGc0^am-r__jafArw4<&{XR+n$~Hg|`Ek%IcbLPtVs zljA%r6jy&fVmZDqz*UnY`PyYBG<^e63P;zp_CQ3R<{{5jlXJ})5u&j1-fu0zT};7U z$O+!QJRS%|D3bLt4dGX9(e=}SP>ab6jsQLc89t`MhTc|Z_NBb5O;}( zeu6k50k+E#6*7|R(`0wg%3#ilhT6Tqjin){;MPw`n>KI2Y0#*U`y1gnw%`-we=MC+gj@ zE`roF93=H26ua%c&fr=saqrwhJ!gt$T3!eASSV4+xrgv$Y0-%wW%)3-%I{>|7{3>! ztqa&>g(&}2T3nXO8F`KAOFxs^H8cYA{(@vg7E5zK>x@;LRaIOh@R(RnXz@55lJ;20 zgyiOV^Y6Mcz^&HJ&2lPD0hL~Z(D5Ri$+%2;T|Jp4DmQl72DR&21Fj!9GAU)la;3ob zi4~<{D?;(imnw!h42mh=%&J+fZeUPnn7EQ_@HzUrAyJHnVA8#3Uc3OYo`d(0$w5-7 z6kuABs1!^ASDYbuh8S_@O<$gXq>ijCf1zqAz`1lv-4BVv3d%0347b$@vOrkUe}pwl zfyX1PnicLU6tQ#92X49szVir%Q!*tqu3cJeA{9}LifON)y<1`@kn<<#)t`uyP}pd# zW5(B#9+NKj@-%V~-pf!p3f!s*NbE{*P`9DZ9Pld{Vcj==J@7B2qINKEBTN12O>~Ck z5S*fWwDbA)4NdVXQp|{CI<{}6D+|hiDn+6~1_JsC2F!u+&K^miur%@K>_qKtM z2B2lK(R0RKH)M`M9UE!$PF1e^6+p1}L8kvF9y~zBF|V*C%x*QyDZUoWwIF6iXfiZq zxhGh#86;nF1Fow#50`Z6BhyL>yX{Z1@OW?r6kRhJ0C@qUGx^HFJM(Z zul#waD|ACP8I+DrEe6mc(UunBSHU7!fRGmH)t3j1-y#(2$G^M(ehWDFI!G8~@i?KM zu2|gB+vs0MOFZ>C0@O$zhgm8v4U!@!(f8A#;-r7J&Bn74Cg204;;bS|1HtLa99xqx z8QrarZ`J}@h0j58q`ys!{u?ZAWqpb7I}vu83O-fS&g0dRd8l*v8~q#(YHW5RdAApk zW$+pR^4yC5FdiJ1tMO;in^gnta3Q1`*oJhnmBV>ZIJpytBAhf_p`gIGj43qEsU(|t2Ru7fZdlRIb+ zEc$yejbkxOl~qkvb^HYar9r7ewzsz~qhhcPq&Nf4{uu2>Yr$?_`qh35SnLOUlS?u! zSN;t$$B1tUmb$!hdm%2#;594`gkyAGMI}#ljN*OBp0w9|KUsds*au!Q7^-%18kV`5 zipSO%k0QAZ*kE>C8g3$8404jUBpqKz#ihzAEOtrif5IJ$m<2zru{$*ZSi#4e$;tnn z4OCYCN(DkcSy+rX(O(qFapVeFkVi+x;8vy^thUGFO@G4z+KgSGoFbmQ=d9L;GHXWG3S-1{d z@{hW|xzGy2!B_hv)#xL9sEFqz7e%^=W8s-_Zci9|Z{?fq;01V6i7qK=_6k zIqwa#McNi0vr8#C1HEEA)bJHUV|A!`31K5#UW!vB~z)CsjdrRRwQ-&_{rb+m5a zH{?X~Y+pWDzgW1f3$ndPDppk%j89^fA0aAzvFP&B8UYQV-!U^0FK&UHJWLs*y1TB*Mu4KlDSvY6$>G*3!z6w-W208gAa&E ze(H*b-e1K0RIA~&x7Wcp62M2un#Ok_9~8qhyvAZ{5>cOdxlhgn#C8xC_Jn6HS;U8` zl@%3J=;F`l9+_CCOMq`pc&NR(c1BsYgbz+T=DCG=ywA1YRuJMhe3LCfpMUwNvsK8^ z;6QiSQ?dFh324g~e2+}?pSj`(PrBIQT-SnW$M7}3quzh3jL$AZ=_Qj5aJaGL6)-e zOMFmT;me=LPhJ`G?mE~(40BTwr0g|55C^!eDcnJvCK1a^E+_&$&h@_qk`%(?2Wjx` zclba!rlOQ&6j8HF(|6!fm7zi-5mE~N5}`BO8tAkqyDa*77+k3l#10v)ryu?$g11!N z2!Vo0Eaj>J@xXS6iGg;>fQHvFle3KPkN6OaQ;#x1&`xZliwUY6j;#vhu@Tsth?6T% z_#lXa!7&Q%H{`rLn5{_!4R4pXu`|fk2!P22H-FgTNDqGk)ET-{s%JphC}=N(PqsF` zAeIsM9JvAL{R=)6YM@d)ujt3Za?QcFD?yZ!OS`|O=)`=4B^cbId8T5vc zMD{AWeBeW(O5`jJFXfEjjpRhp9Z=-mI@+a5MiC#hp9F>@u`;VtU)w|3$~?L{-w))P z2Wg1(^`pP}0Ms{Tl>*}Mp(+)3f{#}K6_RUZsbwqj7|J;%K2|0dJEZ!{lER|sH4(aY zaI$^t13-Thh+hl%XDxgDdA8+~5qStru@qJLEk{j#}>hr>BjpwWq ztayOuu3m82{CvXoggSuT3EYAlI4rC1VKbvxnV@*ORdyeaWO#rsZ$MfngLtz6ABdww z9u_Nhje~pGaWoWqCyQeJqD0}cq1=l6>Ul5YG6Zl9L+#`qT8j^d9mF7>su#>Z?&hS* zHpANzg8HC7axrkV>E9tTcwkI+X%EQ8zIk4-4Lo!uXtfvNp(%}cakX8>Tk04qODMkA zOKD2Bb}=e?+Ppp41Cl*lAft5$(~>59m`qn;^yIi^zvz+ui}s7W0OlL0l@!gfS!rPy z9tqdxB#09e)SV}`XbQ~d{_Pil8V|xZImOa%Sz1i)7{ja>khN{tC~(V45Z~nR{EL@5 z!zEOc?7tYE%e{%%1Xm9We4xrD+c1S4_(Uo(hcVVH*~&z5-TSvVd=z|hEchl_#2Izw zMP|o+uHCUV71{K5dlZCl@6k4AZR|MTd>3SUk`5rkTZxy z?vQHHl@E|(;8Z;0;UJN6UhsqJ^K&fAQ|e0bUo0M6+u=8ekFKWrKR#PNkq^6s{>4txMa-cSYrydN!!qwEN1 zqc=7XZG_iS*%Nv@0q1+@6`Z2ZCR&}0Pv|a@of@$4F~E!hI41(GT5mo$c2Hx-GZsHC z&cbZ3M?<+3W%$kmwDaH`b_8OW3ooKp&Id!mi@h52vC+^CA9k-6TL5UuU^%iNmbmeu z5ha{Z`FslfVmCy(9us&FZ(qv(`7@Y){`ifZ$`&Da7kBd4LqI?Ml%$% z$7arHA^Lsv#eQF|KvaE&3eK6Z)NDB)Scw%J-8o_%7n($aY*CPky$Q%WL-`;%C)ebM zUa&?EYtD+>aM{X5d6RwjNS1?g@u_oCxw&b4;6ym6yQb=C8!hc`uYPEA6iAA<#E~(6 zaX23sHO48&D(oJ3#|Obmc2+a(F4?kCy5O)?hklvXM&gD~djA1;AqTMmGx$*0#R%gQ zVjAk{%h5Q)ec2CMrmYzTuzg`cT`Tft@j?>|IVDaiMw)z^whNqN8aM};EAP(bgJINi zs?bw5QW>9f4+NN1jt=TO;tYgAZvYM;!l42joT8VM)T{z~AvmVne2Xl;|AuZn1@H?% zZZZk@FXUr^As?eOVSLIhH9Aw^tHQM_05Sp~9SNzYFD?;Mvu8!fP_*LxKF&mkfK|7R zT>cMuZxx8ejs)O}r6mF~D|hbTxafPP-BFMQGMLune)0-F^4dw8o4Q@3L1SE*#S`b` z)Ntc!KI)7>Q?H6gg5=p z04Q=$xpRmYMsaDhs@VNIIL=3(nEY{*4n8)>w+gTg zcaUk#_JS_)k=D+s{LOCKf!zbQ&pbW|ihBk5fGlwCU*SX7n$r`#3#FqCfE7E)isT3(SpM#(9`wmSa-vTEG}A*t>~{e_^5LvA_*?{l%_3#xRb|< z&Tnce5Y&OfgY-qy+q}4}b|2eeP;0xwaz+>#8593$-Z7=aAdG zX2Z(CKW(&Uvg7~o0g-jC(nxGk5TUQ54KNcF|k=EKzTYNf~17NJo%*WG?!Cjv-5%<;&9Fy5FCi0yy; zy*~7b`$Z>vUj(7P0-img$Z%6WEW#(0Guo0o!xrEcY+6z23)oE#V=vhvT?q?6^t`TJ zL2$N6QFjfORy%tI|z0P0}KRY9OPOusjJ?KlA13(}Cweb!C+fEa~i$)3<| zk-6!=V3i;6O=g5f&G;!rfdv@se^_F z{A(^R86>6}O?))}hUktFCF1x+8$O-g4WH}+>NUWH>Cm|8jpS?*VW@CODZ*eGoFkl7%4bNysWmnl zhTMwP*0XS3u?gsmO!|2?r9)HN<$|=nb_Cn@e3w2d5N~tw410YHx}@mjyv!u}EuRso+*R>P%ti+fos$N7~@q z>%dqq;oBU(HD5`drNrXslc0{0|E}#KKfEVo6tq{# zPXA4KgQPT0t)g$i%vnq;&)stE9A3uV5JHmNdE-CuZxLu1hWqwJxv3@|e5oOm+w$wTzXH&(6lmjKUr zA0m{djIXjX8ja$oSCpeQTN#!>xNP6lGI%#Ct~8T#<8MP~gkc3XOdN}~r;@UxT#P4B zikI3rkIke1KW|{~(E+?i4*Qf>O%vqW&fhV=&ir*>)g}aM5j*Ou+@w4s1acYOV z1sxem5(p+F(*Q~#4dx4O^%-tm+3E`b;mdmD3h9oNzXVi|gOsK1@~3UA@CNZNU?{R# zT|2F`NJ7G1Y>BXc;p0(b97cErP$8K^?hmKoXn9((Bd`(Bmsbd$<>B3)wZWIk{Mv04 z4ME#T+>}QwtPnF4MhUogOY17GbMR;!NB)CIWBHecv^t3Ki6W*m88d$nEFI5DS`;5o z++vMHY&w7X@dExB&%LxIh+L%;@fF9(65*&%g_q9J)mXc*znaaG#9gh%<5bije#L zJ#@gBz!vlIVu@4WBIFPgK9vfD9S0Had=$3}R0(>eI=MHs?sIu(N| zjBA(}Q(&AQXkn-%EQ(u!_V3@CGy$2mfR#wMe?EhX*$eg{V(O!|gfXqo9rDx?9%L4* zg7S;pLlB-xrOcE@X?$8@Me7gfS$lOb^hLh4(mo+HV_vBsNbCE-Mi<-`0-Ih`zu?wc ze(138-ylu+f@GvG4BkM86(t8GN@5d)UaEg!)NrqNqAx_&{O4gaNE&vKG{~X#;8rRI z>_C;PMn6|aKW^sD`?<}~2f}bcrdF%3>rN_RwZR#iB-zyQa-vfmixgui-U~oZjF#-7 zQfIKuwW}1{D!p$E-!c)B$lChaHEQ#HRJ!=qhfE5`h?Sibe_3QC?HS@<*QU>L1d~3f ztUZoZKS`zU%Jf!-^C&KyWa|e#_FlV;*SXaN0z*&^+2z=KmWsoKQ3eJ5syS5FxS#!! zn}GrFtSgxm@53H@N>b!hmXQ8n8cO5Vz-$~m#w|DomLXStr1?}J2jvaeVKK^w@VF-Q zNc)yimAZpK05Q-fn;gp?QfaIGRQ&)rS22&oy}AaR>IubsQC;l_4tY`{aYfeift}xS z>WKriLS_%S;cyUOF$7v)BAfqtPsQN20_UfgKbZI0u^kQr^2XPw>v)qZ-atbZPGyRC zxxkCbyyG!|RClg%g(m9KU`_IIJfAWF!S;~SBl7Cz7%I97n0K7D; zH7MTsP9?8B@G1s&=15FWzKD6Xykq6E4#<^;Y zfK6-73BC;Cx`DXl>|uMwzW{`d^r5m8zr<8pcCWA~`UDQ9aN~+r8TzIQ4-TG}Qg|kK zYnQDMOWMy*Qld`F-OOctY19Eb$1~2%q{Pr*|7o zN`*$0JRNxGsR?5*7I!_joJ=B+@`P%u0o%lnY%>@$#08p&>9e6ul$xL>TZVRc{>O{$?yl8`3OaI3IRtDK#LN}6Jd`N3S zrOysum7%y$m6BNq%R%WSvBs6(JE zxIt5^w5ZpX3Zq?GaO`|T+7HTD#W?|OJlRIZk7b8a)7FT>Gk9G)Tx6O8NVox%H2DJy zDw0}RDxbz7L&$Lq9gUIoA+7K%xG`=*b|&0;uT_ckH4+pX1J|H@#js~q48F|m#rwK# z8jRfxxFkqxf%9u;DkRg($WV0@Nug`UJ@3X0^sc>1TB&Qd#_8W;20T*9jL-y zqA=(Ya=cTA+Ff&~Pg7#y$S7(?ncGNaTjZ+Vx1~xH{s5)Vnwr1^%^Z2m91Ya z*dEP(&u-CLd&D#MYlmpD{;~8*m~QLN^lzQX$lyOH}>J2QxKu0kn?=V@W~XjKg?&`a815d6?WDYN54oa)q0pkgz9U6~ZP#yoU9`%SLf*MZgaAU?@`Doqoq2LkuTu)n}%RFw1_jwVa77O$89 zQIH1#XHVdb8u1r+>^Tj$TKjbtji>>leFR9dHJCW&|2n%8@R+YHKGvpH9uiXW5H+^g zYiVjJS;QJUQLiZz8Ig)iWGSfjF@C~6|=IA7bzXeZ_`CgpB;)SV3F_&T6Z~3_av2tL2wt}Yo>@wy)>Fr zQCS)h&I&!;hB~y4K`UaJR`i-B5;pS7s1=N<`adi8>S!osRuz=1jXBaG2_6kj%oT?s zRUVDPqrHo{=bo8mA%#TB)|1V4;CvB6=`xEqFwoflzQ>xG?$BHYBnqt9up#XX8~Gp(tzw6YkQW>HKnM_2rKcPWoaurYTdiH9JHE zx=Gibs$1%)6{*sloXkM5>K^3IbFvjjMcSGWbkwbiv!XQikkav^#-cxEXKl|_ZS~_K zeZ$zTuHVS^P+@#<*8oVnU1d*8ymL;3F$#fs8J7}}>z204$bk=9U32NTVBTrNT4vgh zBC_Vd-Fl{6$voFW9W{unznzHPMkjDTg86g*ed<>cl=*K(M>!F0-odX-Ll8a>!hByj z{)$N0Lmiwe04YF3g@taP2!Q<%7B8D$z3LUfZS*KQ$Ej6;p0@dRV#2j@82$`Iah~iQ zyDlOqopN!ypzLs=ZTO6|A%mYnsI#DPh!~p9QaiaVQF)UcNhzsw&li4zQmizDhfP(y($3oY-_p=<3N48%2aS>*5#1PgdbrMmuh85PiA}!h0lw4E|ubNp7A(`r; z(;{>=MaT%chAelk;fe{?7~Bv;EuGqCi&4vnd6uc?UR@3yC;=Tn?Me4Jj+R~T%u`eC zbGyWpi=Z_HA_>>gM888Hk*ZHS&qh3ooj0Eke619)%0NI73@@;sh^LO7THA(vtpTy^ z<}gbg(z#T8Lm1#Y{Y60cmaa=o#)%N!KROhyJq3E5K$my#77Y;T8W`6`YPos(B=O3I0w(}bem-$0M%Ey4tOx5_P> zPh(&ifK^xeaR0%1O+Vd5>uUQkvY18@emOT`H@rs}YWh40`Z(UFQMkQ_kvZfOixXuv z_`bMJQ@eu&tKms_B>8@n2>ySqaW3?I*rpv7)M6Ulk4-E8W=z_%lSP=~eG7NfRPPky z97snSBwpO%58_mG;iaB2DI#&T4^jSB4lUMO7ZT|us!CXAG-lI!I7UR)xaZapA;)5N{KzlJQ{0O_Y9j_@GA{B?6A&;32)OehW1;a>++ zA;EA~CA}qLXj9R8oBd$&Nl|Ig;72A#Ly0>`BSk)I|JKfKg z!hjG=>N+OH16SP{BB&ZGZgW2_t2*$$++9#ZP?x}sM zT$$z<{K>q16qr8)Q+blv_FWNDKR>s7HP6QK-?Kd100`|dIj$OMb7T}%d$iGtXbb6& z@6Ok&0Q$W_KZ-H#-dvHsE){o8!nuQ_`>ni;je>@q>ULqps$FJCwC7DMZ+;q+#OZx*Dc@xI1?aM^Ep3cB12qK;Rd7V0K zFk}nd86R@}bs}k2G&Rzt{fd@1cC7ja0zL`<#TSj6*Nb$yWth}E$o6i=y}BS9BgZ>v z9!$BC<0FE~#%S>6Ht(z-1BRp_hHx9ZwoxQ))D)8m5bNI@wdTYxa2&fKS-#>~zg0xh zX^WBZMD<8O+VLXDvnp7_{omzXB30wqwGJ|KH_@=%{QQDwJcN?%c@QBSvl7y2MFcTU zg~Tv;!Y4DR(i96liePF#`st@7>iVg;kL<)GrjK<0=(cB?s!bW)QduFgmS1%lQ9CD?o=G#Tl%$Zl;Ax*sRLOY%nN47%ES> z7B3blYY~%`S=A%=%ZNQrPio^a9S`LmvRtIE3peH_djEdjH%-9&AV`*n%qA;D>YDE9 zOvmb8A{pmE4*JUY{Tr8nNBdE};mi9yD}6)ZjmyGL@{yir51z+FvZ48Xn2PROC&Cyl z)#{~~BV>CQ|1&Uv9^Q_Ef$$Es;2aTMFDQAqyWv#p?Q}&?7-0pIwL# z)6RhRV6v;fNd)oCm6d0WysV~6mVM$WYB^nrFVA>SZxMk}AhoB0xe@3o2Jg&6`Gb(c zYj1=4Uht25h^TEMg2p-hdR+Kp0WUdVTAjUUso%k36Jbf7bLYX8YX`$H47L%|H9Pue;Ml+V>iGmN)$^<$X!K zU5cP4Ubrpy%i0jmF1R-?_nm(ci5Evu(~gg`XKUa65^L}B7(4fz&sP>nYbs@a8kAg1 z)`5a98)1J`BJHBnSFBK~c_puDEH?LXa3*;~VnRl$GkE?&s8Op-uRx~BojH_SDga_Ri^=g7$rm+59F2Ecw@hTl=+S7yixZDz5K_C4 zd%ft2uM_z4TrDElE0Wud;cb=Su4@@OC#S2JW6rt+6>+%;joIp#WQkm4=9{8rHL&UHCY^u2}Pl5(1|JGg?b`wS4!*AC2ys> z5$$xYUcEC%YnF$f9_n)ea-!x>UZ-2ySVS{wpR-VBJi4QH5ZANo+t&au7AtW+!<$V- zOsSjJd5#~qDmlg}4hT_^p~U_jeH+7PM8T1AZS-p;qAB@lq72@6o?qD1>e0 zgL8c2r9&@~w!YTjI@#l1PpZe?e_2wGJZSh_=p4rwJ4D1Vs)D;lr^fI*H>qn&h=tzs z;c;X3P!WR_cHNz@l$yrD+bZG{IoWBE-D_+?%;M(I*hHLS@w;VV_NpZ{3oGRzu)_F9K(V5idw_i$Zq`vYa+7&} zu`l;ZD+s4P(D;15nIIx*83bE@ne_|T`nlBSXMjS-=J|TTk@aXOY85L?sGChM%#?>J zH)EE+Zn8*U6TLPYRkId}ysx$A?;k>^Vj*^}S1sQZiR)Iut`yXZ#Phz-kDC2cjWX>Z%2tA?7v`)KSjG~Sn5mjy7XYqU` zd|Ha#K76F}f-#Lwdk;ETZsQ~ZlL4j5hmV1x$SDbB`_(sg{0xzfg(>jG?4)Infif^1(VNbMBkf8^wWk$7 zkLf8eO~E2C2AxJ(5PEf=qUFjl;GV4bv1lw~s!F#2>i(<6s{e5}`Q+HC%0_Qy0B~*qb3f_=j(E z;E3+Zj2>9s21MYehh>gg2KyY1+6Ld+$y@dK;6^hdtd1F3Qx9OG*_dcIHql*cA0Nxw z)1F`(p2?@EX&WW2dL(p9>pr*F8)0#soC7bX;K~c88bs*e@}DL)gxQ?Kx4w=HYV4ny z5<;37X&+%^3K4y2b(ccw06UH^N-(-lPL3(jaEBuauU)IDZjQ(r699^|?#3>W?i0Ad zlxl3YW0NUWWG>F#J#oAfMxLxiVly&$$7WN?k%_ohLL{5F zr&f|$Zq}`)WSt49NcQK<9uJ5Qr|{()!*jNIA&bkq6GXZ(YgdF47Ygv@7IA;ODc!K- zOp)k}oBd{}Eh2uWInnfVS;4xF%&$-#!#rtVLBTFls;(yqMf+_wuvJI3Np#$8N>?k! zh|flCE6`s9B9)6*T<;^Hh!Ne zP4WsN)u7m;)zmtBX}>8|*P|aI-O@Wt1d_n0W2q72K;JJ+>C$2!mk5f4Z$I;ApxSo# z95f{ymYQlaF^8Z#BZ&{+;md32jq**&I$Z*l`@|9Zht*xFX2p_2rlk8Mp`e|VCK7%r z@{NXSjd<#aDdA{)a)wB?L-R51)CQ4u)RbyJ8*WJwBBkHiKKH7Dwe&(U?*lngU`mwK zAvML3WE$4`ha7vF!Wy;r@;Kb@xG8mtY5G!a87wK0HI?dCYQ(S-mi1qunq>JOj791#Uulys|ipYF( z?>C-^cp_peNCShQ06;)M0Du%kiUR!80SN#CAS zf@>8BWX2WdaCRn@#Tz;)*;xq{#~C{6F*<1)K&thF)4dbm-xiTVBak8d=Mf@*&c7A` z1px48VZQnQ-#7Sct%i0cPWF~2^#5lmgnyE9c6D&DcXIhBY2bhPR*?S(X*c$NQULlF z1)Tp`!P3sf)XC1!=HF-%{{LvYS(>{4P5tk`AHcsnSnNMhSNn4h1t)t4QzsWsK|4!Z zLl=7|VS8H#Ll=K?W5|;Xe~XNVJ<|P41}p+3Y&A0VRSL2qqIv0 zvm9>jT6jE-FuA85ska+abe+Rc5WyJEqm`h@bI)q2$C=kmXn~DIXsxC$gG{CSDq-%y zCb%S8>`a+l@atv3g%>u&rMoq#yGGJn2w(<6pkl8jkGfh+yN*ppf=XXrJ{x8e!@H*| zbsw3s+jOP*G>~>XbD@u-;xIa0p9=KFL3Fu_I7*JFYC{=Ik4WS$GQ{fQt}-Bx!s0Yb zTwo~N@!u_(vVP(ZE%QYj-x4#YT|sgUsKlXDLJ!F}gDRkVvQg_`Jt|^7&76ii^Y`n| z7Y@mPN$V7UFsgpZ8|z@Ye*>elvYAaZJ(x{8dWe>mDs{m-ELn7|8Xv%45zWqfFGM-O^&XPPs0&&{rn+UFGvz!>f^Nnw@$1HFA+lSxQ8AnR6N)+ zhY5(Da*ev`ja8<*ux@ILmnPXYZ9-o&OK=e52{UKNb1$8svfcVJ_1X9i_%D<@+x&#T z{R4B2V1Eag|JlU;f}j5anE!%~KVa~`ZToK)`fp9_9|opot&FUW;U@>NfuJT3qm{b~ zZG;WPDp9G@p@LNkN~~8T(rg7k0aZOgwxdh&5${*=6aKDx8YQEZIoIzp{3~JhiM;t} zna>=VZDDva7UnGNk#El1b9Um_(O$kk=pEuV8qUBoL^igS3v*Dh1bg3)kIGVQEIV<8 z(U>d~mhH#_R7=)O)#9$Ij_Wc^B5rPx!IWK~%?*03;ftW!{e0(q@8 zL-NN(M;LJeC5*P|AeU%1a&YDNlO!3MPBT76yDcYDQ?8qO0qM=0wvsLjY#?>4pO})8 z)aK|jI)j=tsZp)j8dx$knWOBHm~3l5jV9`MQf13b8WfUl?lOevbhMgFtch!+L2l%h?H(Ocu)&CtIofE=*?xwp(vjshQ`@eMFJyNC*@E8a z=~W8F-#~crkW1H&Az(4mF5x0uL_JSKfFzILC~xL5(HeU-Fqp5m9qZ&#=T;i2otl@} zR(YB-p3`N}ERJ~Lhar_og_AzoOM7i9Jj0|tIEfliwk9_|U+3}DP)7p=b2|od8Rj<1 z*G?*tvd_d-WefCQqeZMrxFq>`VlCA78xz&{S;X2`jd$3bsMH8+TAIdo3sf7os|u1C zD|;i_%!1pHe^kHc#oJ2md+&$Y^$PtUs=4&?^p?7to7O8Kzx75;-1u?8vGe))8LPXA z=LUS%>IM&z_PcsEM|GCO{dQUg)k#3m?1i9rw9S=7SEspYG^7$vZ0*}9M-hT+cZd;} z_-OqgwK)0wP`8O2y=#uDo|?-G0i9#MUl$jjploQ^7*{^wjBrIUptLw5slWf_ z77W+;O>2zOHmZZCSs<(3BOm`$Z4#o}jki z-0jZFgBw@X3k1HhKtvs0Rn~3pQ4Xj>(6>r6dl_4Ip4O`uRf2Ch66J5T%{zel&xEGm z5KbUDQT7BF@kO4nS|8{k=A8DL!XZbi8?fir2-SG&n62US)2-=c<&du+;gD;h?I7yU zOgQh3XqTL9{jUa@RKiyQP9$H%FTU`(x#zm#+GJlj)v|a_*xvJM#jfDA$avZ2s)8!T zf<7|S&UvZl`wrvrXYyR71g9ty${^~fQ(XE4J^Y2j`;=rH>-2ZnTy+oBH78s61+SG0 zTyQ4q;{Nn=#aA2^r?RP@Cb;2DzE>O{*C%2;?P0#vy-UC_SWkp8@)&QP?@obmad*s7 zQ*S7gI>WX;VVWerGJ0SlA?fRpoB2l=R5$>`vWq@F>3yA34OAl(Lk8&!EZgsZcCf;> zw!Y1tfiJnLhk3>`8=*$Bsr*u>Q0|e~CyZoQQpk?e&6dUA;<$T;)1{U3TP#?urw6#_ z^uA7RHQ~Vvt)xBg?xi{Sw*fO@Dlb3 zA&;>kl6d^;5Oj=Y_GIQ�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

      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. + *

      + * + *

      Beginning with Android L (API level 21), the action bar may be represented by any + * Toolbar widget within the application layout. The application may signal to the Activity + * which Toolbar should be treated as the Activity's action bar. Activities that use this + * feature should use one of the supplied .NoActionBar themes, set the + * {@link android.R.styleable#Theme_windowActionBar windowActionBar} attribute to false + * or otherwise not request the window feature.

      + * + *

      By adjusting the window features requested by the theme and the layouts used for + * an Activity's content view, an app can use the standard system action bar on older platform + * releases and the newer inline toolbars on newer platform releases. The ActionBar + * object obtained from the Activity can be used to control either configuration transparently.

      + * + *

      When using the Holo themes 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.

      + * + *

      When using the Material themes (default in API 21 or newer) the navigation button + * (formerly "Home") takes over the space previously occupied by the application icon. + * Apps wishing to express a stronger branding should use their brand colors heavily + * in the action bar and other application chrome or use a {@link #setLogo(int) logo} + * in place of their standard title text.

      + * + *

      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 { + + /** @hide */ + @Retention(RetentionPolicy.SOURCE) + @IntDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS}) + public @interface NavigationMode {} + + /** + * 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. + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + public static final int NAVIGATION_MODE_STANDARD = 0; + + /** + * 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. + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + public static final int NAVIGATION_MODE_LIST = 1; + + /** + * Tab navigation mode. Instead of static title text this mode + * presents a series of tabs for navigation within the activity. + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + public static final int NAVIGATION_MODE_TABS = 2; + + /** @hide */ + @IntDef(flag=true, value={ + DISPLAY_USE_LOGO, + DISPLAY_SHOW_HOME, + DISPLAY_HOME_AS_UP, + DISPLAY_SHOW_TITLE, + DISPLAY_SHOW_CUSTOM + }) + @Retention(RetentionPolicy.SOURCE) + public @interface DisplayOptions {} + + /** + * 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 = 0x1; + + /** + * 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 = 0x2; + + /** + * 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 = 0x4; + + /** + * 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 = 0x8; + + /** + * 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 = 0x10; + + /** + * 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(@DrawableRes 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(@DrawableRes 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. + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + 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. + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + 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. + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + public abstract int getSelectedNavigationIndex(); + + /** + * Get the number of navigation items present in the current navigation mode. + * + * @return Number of navigation items. + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + 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(@StringRes 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(@DisplayOptions 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(@DisplayOptions int options, @DisplayOptions 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(@Nullable 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. + */ + @Nullable + 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. + */ + @Nullable + 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. + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + @NavigationMode + 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 + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + public abstract void setNavigationMode(@NavigationMode int mode); + + /** + * @return The current set of display options. + */ + @DisplayOptions + 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) + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + 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 + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + 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. + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + 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 + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + 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. + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + 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 + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + 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 + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + public abstract void removeTabAt(int position); + + /** + * Remove all tabs from the action bar and deselect the current tab. + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + 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 + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + 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 + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + @Nullable + public abstract Tab getSelectedTab(); + + /** + * Returns the tab at the specified index. + * + * @param index Index value in the range 0-get + * @return + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + public abstract Tab getTabAt(int index); + + /** + * Returns the number of tabs currently registered with the action bar. + * + * @return Tab count + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + 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. + * + *

      If you are hiding the ActionBar through + * {@link View#SYSTEM_UI_FLAG_FULLSCREEN View.SYSTEM_UI_FLAG_FULLSCREEN}, + * you should not call this function directly. + */ + 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. + * + *

      Instead of calling this function directly, you can also cause an + * ActionBar using the overlay feature to hide through + * {@link View#SYSTEM_UI_FLAG_FULLSCREEN View.SYSTEM_UI_FLAG_FULLSCREEN}. + * Hiding the ActionBar through this system UI flag allows you to more + * seamlessly hide it in conjunction with other screen decorations. + */ + 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; + } + + /** + * Returns true if the Title field has been truncated during layout for lack + * of available space. + * + * @return true if the Title field has been truncated + * @hide pending API approval + */ + public boolean isTitleTruncated() { return false; } + + /** + * Set an alternate drawable to display next to the icon/logo/title + * when {@link #DISPLAY_HOME_AS_UP} is enabled. This can be useful if you are using + * this mode to display an alternate selection for up navigation, such as a sliding drawer. + * + *

      If you pass null to this method, the default drawable from the theme + * will be used.

      + * + *

      If you implement alternate or intermediate behavior around Up, you should also + * call {@link #setHomeActionContentDescription(int) setHomeActionContentDescription()} + * to provide a correct description of the action for accessibility support.

      + * + * @param indicator A drawable to use for the up indicator, or null to use the theme's default + * + * @see #setDisplayOptions(int, int) + * @see #setDisplayHomeAsUpEnabled(boolean) + * @see #setHomeActionContentDescription(int) + */ + public void setHomeAsUpIndicator(@Nullable Drawable indicator) {} + + /** + * Set an alternate drawable to display next to the icon/logo/title + * when {@link #DISPLAY_HOME_AS_UP} is enabled. This can be useful if you are using + * this mode to display an alternate selection for up navigation, such as a sliding drawer. + * + *

      If you pass 0 to this method, the default drawable from the theme + * will be used.

      + * + *

      If you implement alternate or intermediate behavior around Up, you should also + * call {@link #setHomeActionContentDescription(int) setHomeActionContentDescription()} + * to provide a correct description of the action for accessibility support.

      + * + * @param resId Resource ID of a drawable to use for the up indicator, or 0 + * to use the theme's default + * + * @see #setDisplayOptions(int, int) + * @see #setDisplayHomeAsUpEnabled(boolean) + * @see #setHomeActionContentDescription(int) + */ + public void setHomeAsUpIndicator(@DrawableRes int resId) {} + + /** + * Set an alternate description for the Home/Up action, when enabled. + * + *

      This description is commonly used for accessibility/screen readers when + * the Home action is enabled. (See {@link #setDisplayHomeAsUpEnabled(boolean)}.) + * Examples of this are, "Navigate Home" or "Navigate Up" depending on the + * {@link #DISPLAY_HOME_AS_UP} display option. If you have changed the home-as-up + * indicator using {@link #setHomeAsUpIndicator(int)} to indicate more specific + * functionality such as a sliding drawer, you should also set this to accurately + * describe the action.

      + * + *

      Setting this to null will use the system default description.

      + * + * @param description New description for the Home action when enabled + * @see #setHomeAsUpIndicator(int) + * @see #setHomeAsUpIndicator(android.graphics.drawable.Drawable) + */ + public void setHomeActionContentDescription(@Nullable CharSequence description) {} + + /** + * Set an alternate description for the Home/Up action, when enabled. + * + *

      This description is commonly used for accessibility/screen readers when + * the Home action is enabled. (See {@link #setDisplayHomeAsUpEnabled(boolean)}.) + * Examples of this are, "Navigate Home" or "Navigate Up" depending on the + * {@link #DISPLAY_HOME_AS_UP} display option. If you have changed the home-as-up + * indicator using {@link #setHomeAsUpIndicator(int)} to indicate more specific + * functionality such as a sliding drawer, you should also set this to accurately + * describe the action.

      + * + *

      Setting this to 0 will use the system default description.

      + * + * @param resId Resource ID of a string to use as the new description + * for the Home action when enabled + * @see #setHomeAsUpIndicator(int) + * @see #setHomeAsUpIndicator(android.graphics.drawable.Drawable) + */ + public void setHomeActionContentDescription(@StringRes int resId) {} + + /** + * Enable hiding the action bar on content scroll. + * + *

      If enabled, the action bar will scroll out of sight along with a + * {@link View#setNestedScrollingEnabled(boolean) nested scrolling child} view's content. + * The action bar must be in {@link Window#FEATURE_ACTION_BAR_OVERLAY overlay mode} + * to enable hiding on content scroll.

      + * + *

      When partially scrolled off screen the action bar is considered + * {@link #hide() hidden}. A call to {@link #show() show} will cause it to return to full view. + *

      + * @param hideOnContentScroll true to enable hiding on content scroll. + */ + public void setHideOnContentScrollEnabled(boolean hideOnContentScroll) { + if (hideOnContentScroll) { + throw new UnsupportedOperationException("Hide on content scroll is not supported in " + + "this action bar configuration."); + } + } + + /** + * Return whether the action bar is configured to scroll out of sight along with + * a {@link View#setNestedScrollingEnabled(boolean) nested scrolling child}. + * + * @return true if hide-on-content-scroll is enabled + * @see #setHideOnContentScrollEnabled(boolean) + */ + public boolean isHideOnContentScrollEnabled() { + return false; + } + + /** + * Return the current vertical offset of the action bar. + * + *

      The action bar's current hide offset is the distance that the action bar is currently + * scrolled offscreen in pixels. The valid range is 0 (fully visible) to the action bar's + * current measured {@link #getHeight() height} (fully invisible).

      + * + * @return The action bar's offset toward its fully hidden state in pixels + */ + public int getHideOffset() { + return 0; + } + + /** + * Set the current hide offset of the action bar. + * + *

      The action bar's current hide offset is the distance that the action bar is currently + * scrolled offscreen in pixels. The valid range is 0 (fully visible) to the action bar's + * current measured {@link #getHeight() height} (fully invisible).

      + * + * @param offset The action bar's offset toward its fully hidden state in pixels. + */ + public void setHideOffset(int offset) { + if (offset != 0) { + throw new UnsupportedOperationException("Setting an explicit action bar hide offset " + + "is not supported in this action bar configuration."); + } + } + + /** + * Set the Z-axis elevation of the action bar in pixels. + * + *

      The action bar's elevation is the distance it is placed from its parent surface. Higher + * values are closer to the user.

      + * + * @param elevation Elevation value in pixels + */ + public void setElevation(float elevation) { + if (elevation != 0) { + throw new UnsupportedOperationException("Setting a non-zero elevation is " + + "not supported in this action bar configuration."); + } + } + + /** + * Get the Z-axis elevation of the action bar in pixels. + * + *

      The action bar's elevation is the distance it is placed from its parent surface. Higher + * values are closer to the user.

      + * + * @return Elevation value in pixels + */ + public float getElevation() { + return 0; + } + + /** @hide */ + public void setDefaultDisplayHomeAsUpEnabled(boolean enabled) { + } + + /** @hide */ + public void setShowHideAnimationEnabled(boolean enabled) { + } + + /** @hide */ + public void onConfigurationChanged(Configuration config) { + } + + /** @hide */ + public void dispatchMenuVisibilityChanged(boolean visible) { + } + + /** @hide */ + public ActionMode startActionMode(ActionMode.Callback callback) { + return null; + } + + /** @hide */ + public boolean openOptionsMenu() { + return false; + } + + /** @hide */ + public boolean invalidateOptionsMenu() { + return false; + } + + /** @hide */ + public boolean onMenuKeyEvent(KeyEvent event) { + return false; + } + + /** @hide **/ + public boolean onKeyShortcut(int keyCode, KeyEvent ev) { + return false; + } + + /** @hide */ + public boolean collapseActionView() { + return false; + } + + /** @hide */ + public void setWindowTitle(CharSequence title) { + } + + /** + * Listener interface for ActionBar navigation events. + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + 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. + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + 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(@DrawableRes 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. + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + 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. + */ + public static class LayoutParams extends ViewGroup.MarginLayoutParams { + /** + * Gravity for the view associated with these LayoutParams. + * + * @see android.view.Gravity + */ + public int gravity = Gravity.NO_GRAVITY; + + public LayoutParams(@NonNull Context c, AttributeSet attrs) { + super(c, attrs); + + TypedArray a = c.obtainStyledAttributes(attrs, R.styleable.ActionBarLayout); + gravity = a.getInt(R.styleable.ActionBarLayout_android_layout_gravity, Gravity.NO_GRAVITY); + a.recycle(); + } + + public LayoutParams(int width, int height) { + super(width, height); + this.gravity = Gravity.CENTER_VERTICAL | GravityCompat.START; + } + + public LayoutParams(int width, int height, int gravity) { + super(width, height); + this.gravity = gravity; + } + + public LayoutParams(int gravity) { + this(WRAP_CONTENT, MATCH_PARENT, gravity); + } + + public LayoutParams(LayoutParams source) { + super(source); + + this.gravity = source.gravity; + } + + public LayoutParams(ViewGroup.LayoutParams source) { + super(source); + } + } +} diff --git a/android/support/v7/app/ActionBarActivity.java b/android/support/v7/app/ActionBarActivity.java new file mode 100644 index 0000000000..1834681d80 --- /dev/null +++ b/android/support/v7/app/ActionBarActivity.java @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.app; + +/** + * @deprecated Use {@link android.support.v7.app.AppCompatActivity} instead. + */ +@Deprecated +public class ActionBarActivity extends AppCompatActivity { +} diff --git a/android/support/v7/app/ActionBarDrawerToggle.java b/android/support/v7/app/ActionBarDrawerToggle.java new file mode 100644 index 0000000000..93a79a63d3 --- /dev/null +++ b/android/support/v7/app/ActionBarDrawerToggle.java @@ -0,0 +1,697 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package android.support.v7.app; + +import android.app.Activity; +import android.app.ActionBar; +import android.content.Context; +import android.content.res.Configuration; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.support.annotation.Nullable; +import android.support.annotation.StringRes; +import android.support.v4.view.GravityCompat; +import android.support.v4.view.ViewCompat; +import android.support.v4.widget.DrawerLayout; +import android.support.v7.widget.Toolbar; +import android.util.Log; +import android.view.MenuItem; +import android.view.View; +import android.support.v7.appcompat.R; + +/** + * This class provides a handy way to tie together the functionality of + * {@link android.support.v4.widget.DrawerLayout} and the framework ActionBar to + * implement the recommended design for navigation drawers. + * + *

      To use ActionBarDrawerToggle, create one in your Activity and call through + * to the following methods corresponding to your Activity callbacks:

      + * + *
        + *
      • {@link android.app.Activity#onConfigurationChanged(android.content.res.Configuration) + * onConfigurationChanged} + *
      • {@link android.app.Activity#onOptionsItemSelected(android.view.MenuItem) + * onOptionsItemSelected}
      • + *
      + * + *

      Call {@link #syncState()} from your Activity's + * {@link android.app.Activity#onPostCreate(android.os.Bundle) onPostCreate} to synchronize the + * indicator with the state of the linked DrawerLayout after onRestoreInstanceState + * has occurred.

      + * + *

      ActionBarDrawerToggle can be used directly as a + * {@link android.support.v4.widget.DrawerLayout.DrawerListener}, or if you are already providing + * your own listener, call through to each of the listener methods from your own.

      + * + *

      + * You can customize the the animated toggle by defining the + * {@link android.support.v7.appcompat.R.styleable#DrawerArrowToggle drawerArrowStyle} in your + * ActionBar theme. + */ +public class ActionBarDrawerToggle implements DrawerLayout.DrawerListener { + + /** + * Allows an implementing Activity to return an {@link ActionBarDrawerToggle.Delegate} to use + * with ActionBarDrawerToggle. + */ + public interface DelegateProvider { + + /** + * @return Delegate to use for ActionBarDrawableToggles, or null if the Activity + * does not wish to override the default behavior. + */ + @Nullable + Delegate getDrawerToggleDelegate(); + } + + public interface Delegate { + + /** + * Set the Action Bar's up indicator drawable and content description. + * + * @param upDrawable - Drawable to set as up indicator + * @param contentDescRes - Content description to set + */ + void setActionBarUpIndicator(Drawable upDrawable, @StringRes int contentDescRes); + + /** + * Set the Action Bar's up indicator content description. + * + * @param contentDescRes - Content description to set + */ + void setActionBarDescription(@StringRes int contentDescRes); + + /** + * Returns the drawable to be set as up button when DrawerToggle is disabled + */ + Drawable getThemeUpIndicator(); + + /** + * Returns the context of ActionBar + */ + Context getActionBarThemedContext(); + + /** + * Returns whether navigation icon is visible or not. + * Used to print warning messages in case developer forgets to set displayHomeAsUp to true + */ + boolean isNavigationVisible(); + } + + private final Delegate mActivityImpl; + private final DrawerLayout mDrawerLayout; + + private DrawerToggle mSlider; + private Drawable mHomeAsUpIndicator; + private boolean mDrawerIndicatorEnabled = true; + private boolean mHasCustomUpIndicator; + private final int mOpenDrawerContentDescRes; + private final int mCloseDrawerContentDescRes; + // used in toolbar mode when DrawerToggle is disabled + private View.OnClickListener mToolbarNavigationClickListener; + // If developer does not set displayHomeAsUp, DrawerToggle won't show up. + // DrawerToggle logs a warning if this case is detected + private boolean mWarnedForDisplayHomeAsUp = false; + + /** + * Construct a new ActionBarDrawerToggle. + * + *

      The given {@link Activity} will be linked to the specified {@link DrawerLayout} and + * its Actionbar's Up button will be set to a custom drawable. + *

      This drawable shows a Hamburger icon when drawer is closed and an arrow when drawer + * is open. It animates between these two states as the drawer opens.

      + * + *

      String resources must be provided to describe the open/close drawer actions for + * accessibility services.

      + * + * @param activity The Activity hosting the drawer. Should have an ActionBar. + * @param drawerLayout The DrawerLayout to link to the given Activity's ActionBar + * @param openDrawerContentDescRes A String resource to describe the "open drawer" action + * for accessibility + * @param closeDrawerContentDescRes A String resource to describe the "close drawer" action + * for accessibility + */ + public ActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout, + @StringRes int openDrawerContentDescRes, + @StringRes int closeDrawerContentDescRes) { + this(activity, null, drawerLayout, null, openDrawerContentDescRes, + closeDrawerContentDescRes); + } + + /** + * Construct a new ActionBarDrawerToggle with a Toolbar. + *

      + * The given {@link Activity} will be linked to the specified {@link DrawerLayout} and + * the Toolbar's navigation icon will be set to a custom drawable. Using this constructor + * will set Toolbar's navigation click listener to toggle the drawer when it is clicked. + *

      + * This drawable shows a Hamburger icon when drawer is closed and an arrow when drawer + * is open. It animates between these two states as the drawer opens. + *

      + * String resources must be provided to describe the open/close drawer actions for + * accessibility services. + *

      + * Please use {@link #ActionBarDrawerToggle(Activity, DrawerLayout, int, int)} if you are + * setting the Toolbar as the ActionBar of your activity. + * + * @param activity The Activity hosting the drawer. + * @param toolbar The toolbar to use if you have an independent Toolbar. + * @param drawerLayout The DrawerLayout to link to the given Activity's ActionBar + * @param openDrawerContentDescRes A String resource to describe the "open drawer" action + * for accessibility + * @param closeDrawerContentDescRes A String resource to describe the "close drawer" action + * for accessibility + */ + public ActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout, + Toolbar toolbar, @StringRes int openDrawerContentDescRes, + @StringRes int closeDrawerContentDescRes) { + this(activity, toolbar, drawerLayout, null, openDrawerContentDescRes, + closeDrawerContentDescRes); + } + + /** + * In the future, we can make this constructor public if we want to let developers customize + * the + * animation. + */ + ActionBarDrawerToggle(Activity activity, Toolbar toolbar, + DrawerLayout drawerLayout, T slider, + @StringRes int openDrawerContentDescRes, + @StringRes int closeDrawerContentDescRes) { + if (toolbar != null) { + mActivityImpl = new ToolbarCompatDelegate(toolbar); + toolbar.setNavigationOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (mDrawerIndicatorEnabled) { + toggle(); + } else if (mToolbarNavigationClickListener != null) { + mToolbarNavigationClickListener.onClick(v); + } + } + }); + } else if (activity instanceof DelegateProvider) { // Allow the Activity to provide an impl + mActivityImpl = ((DelegateProvider) activity).getDrawerToggleDelegate(); + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { + mActivityImpl = new JellybeanMr2Delegate(activity); + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + mActivityImpl = new HoneycombDelegate(activity); + } else { + mActivityImpl = new DummyDelegate(activity); + } + + mDrawerLayout = drawerLayout; + mOpenDrawerContentDescRes = openDrawerContentDescRes; + mCloseDrawerContentDescRes = closeDrawerContentDescRes; + if (slider == null) { + mSlider = new DrawerArrowDrawableToggle(activity, + mActivityImpl.getActionBarThemedContext()); + } else { + mSlider = slider; + } + + mHomeAsUpIndicator = getThemeUpIndicator(); + } + + /** + * Synchronize the state of the drawer indicator/affordance with the linked DrawerLayout. + * + *

      This should be called from your Activity's + * {@link Activity#onPostCreate(android.os.Bundle) onPostCreate} method to synchronize after + * the DrawerLayout's instance state has been restored, and any other time when the state + * may have diverged in such a way that the ActionBarDrawerToggle was not notified. + * (For example, if you stop forwarding appropriate drawer events for a period of time.)

      + */ + public void syncState() { + if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) { + mSlider.setPosition(1); + } else { + mSlider.setPosition(0); + } + if (mDrawerIndicatorEnabled) { + setActionBarUpIndicator((Drawable) mSlider, + mDrawerLayout.isDrawerOpen(GravityCompat.START) ? + mCloseDrawerContentDescRes : mOpenDrawerContentDescRes); + } + } + + /** + * This method should always be called by your Activity's + * {@link Activity#onConfigurationChanged(android.content.res.Configuration) + * onConfigurationChanged} + * method. + * + * @param newConfig The new configuration + */ + public void onConfigurationChanged(Configuration newConfig) { + // Reload drawables that can change with configuration + if (!mHasCustomUpIndicator) { + mHomeAsUpIndicator = getThemeUpIndicator(); + } + syncState(); + } + + /** + * This method should be called by your Activity's + * {@link Activity#onOptionsItemSelected(android.view.MenuItem) onOptionsItemSelected} method. + * If it returns true, your onOptionsItemSelected method should return true and + * skip further processing. + * + * @param item the MenuItem instance representing the selected menu item + * @return true if the event was handled and further processing should not occur + */ + public boolean onOptionsItemSelected(MenuItem item) { + if (item != null && item.getItemId() == android.R.id.home && mDrawerIndicatorEnabled) { + toggle(); + return true; + } + return false; + } + + private void toggle() { + if (mDrawerLayout.isDrawerVisible(GravityCompat.START)) { + mDrawerLayout.closeDrawer(GravityCompat.START); + } else { + mDrawerLayout.openDrawer(GravityCompat.START); + } + } + + /** + * Set the up indicator to display when the drawer indicator is not + * enabled. + *

      + * If you pass null to this method, the default drawable from + * the theme will be used. + * + * @param indicator A drawable to use for the up indicator, or null to use + * the theme's default + * @see #setDrawerIndicatorEnabled(boolean) + */ + public void setHomeAsUpIndicator(Drawable indicator) { + if (indicator == null) { + mHomeAsUpIndicator = getThemeUpIndicator(); + mHasCustomUpIndicator = false; + } else { + mHomeAsUpIndicator = indicator; + mHasCustomUpIndicator = true; + } + + if (!mDrawerIndicatorEnabled) { + setActionBarUpIndicator(mHomeAsUpIndicator, 0); + } + } + + /** + * Set the up indicator to display when the drawer indicator is not + * enabled. + *

      + * If you pass 0 to this method, the default drawable from the theme will + * be used. + * + * @param resId Resource ID of a drawable to use for the up indicator, or 0 + * to use the theme's default + * @see #setDrawerIndicatorEnabled(boolean) + */ + public void setHomeAsUpIndicator(int resId) { + Drawable indicator = null; + if (resId != 0) { + indicator = mDrawerLayout.getResources().getDrawable(resId); + } + setHomeAsUpIndicator(indicator); + } + + /** + * @return true if the enhanced drawer indicator is enabled, false otherwise + * @see #setDrawerIndicatorEnabled(boolean) + */ + public boolean isDrawerIndicatorEnabled() { + return mDrawerIndicatorEnabled; + } + + /** + * Enable or disable the drawer indicator. The indicator defaults to enabled. + * + *

      When the indicator is disabled, the ActionBar will revert to displaying + * the home-as-up indicator provided by the Activity's theme in the + * android.R.attr.homeAsUpIndicator attribute instead of the animated + * drawer glyph.

      + * + * @param enable true to enable, false to disable + */ + public void setDrawerIndicatorEnabled(boolean enable) { + if (enable != mDrawerIndicatorEnabled) { + if (enable) { + setActionBarUpIndicator((Drawable) mSlider, + mDrawerLayout.isDrawerOpen(GravityCompat.START) ? + mCloseDrawerContentDescRes : mOpenDrawerContentDescRes); + } else { + setActionBarUpIndicator(mHomeAsUpIndicator, 0); + } + mDrawerIndicatorEnabled = enable; + } + } + + + /** + * {@link DrawerLayout.DrawerListener} callback method. If you do not use your + * ActionBarDrawerToggle instance directly as your DrawerLayout's listener, you should call + * through to this method from your own listener object. + * + * @param drawerView The child view that was moved + * @param slideOffset The new offset of this drawer within its range, from 0-1 + */ + @Override + public void onDrawerSlide(View drawerView, float slideOffset) { + mSlider.setPosition(Math.min(1f, Math.max(0, slideOffset))); + } + + /** + * {@link DrawerLayout.DrawerListener} callback method. If you do not use your + * ActionBarDrawerToggle instance directly as your DrawerLayout's listener, you should call + * through to this method from your own listener object. + * + * @param drawerView Drawer view that is now open + */ + @Override + public void onDrawerOpened(View drawerView) { + mSlider.setPosition(1); + if (mDrawerIndicatorEnabled) { + setActionBarDescription(mCloseDrawerContentDescRes); + } + } + + /** + * {@link DrawerLayout.DrawerListener} callback method. If you do not use your + * ActionBarDrawerToggle instance directly as your DrawerLayout's listener, you should call + * through to this method from your own listener object. + * + * @param drawerView Drawer view that is now closed + */ + @Override + public void onDrawerClosed(View drawerView) { + mSlider.setPosition(0); + if (mDrawerIndicatorEnabled) { + setActionBarDescription(mOpenDrawerContentDescRes); + } + } + + /** + * {@link DrawerLayout.DrawerListener} callback method. If you do not use your + * ActionBarDrawerToggle instance directly as your DrawerLayout's listener, you should call + * through to this method from your own listener object. + * + * @param newState The new drawer motion state + */ + @Override + public void onDrawerStateChanged(int newState) { + } + + /** + * Returns the fallback listener for Navigation icon click events. + * + * @return The click listener which receives Navigation click events from Toolbar when + * drawer indicator is disabled. + * @see #setToolbarNavigationClickListener(android.view.View.OnClickListener) + * @see #setDrawerIndicatorEnabled(boolean) + * @see #isDrawerIndicatorEnabled() + */ + public View.OnClickListener getToolbarNavigationClickListener() { + return mToolbarNavigationClickListener; + } + + /** + * When DrawerToggle is constructed with a Toolbar, it sets the click listener on + * the Navigation icon. If you want to listen for clicks on the Navigation icon when + * DrawerToggle is disabled ({@link #setDrawerIndicatorEnabled(boolean)}, you should call this + * method with your listener and DrawerToggle will forward click events to that listener + * when drawer indicator is disabled. + * + * @see #setDrawerIndicatorEnabled(boolean) + */ + public void setToolbarNavigationClickListener( + View.OnClickListener onToolbarNavigationClickListener) { + mToolbarNavigationClickListener = onToolbarNavigationClickListener; + } + + void setActionBarUpIndicator(Drawable upDrawable, int contentDescRes) { + if (!mWarnedForDisplayHomeAsUp && !mActivityImpl.isNavigationVisible()) { + Log.w("ActionBarDrawerToggle", "DrawerToggle may not show up because NavigationIcon" + + " is not visible. You may need to call " + + "actionbar.setDisplayHomeAsUpEnabled(true);"); + mWarnedForDisplayHomeAsUp = true; + } + mActivityImpl.setActionBarUpIndicator(upDrawable, contentDescRes); + } + + void setActionBarDescription(int contentDescRes) { + mActivityImpl.setActionBarDescription(contentDescRes); + } + + Drawable getThemeUpIndicator() { + return mActivityImpl.getThemeUpIndicator(); + } + + static class DrawerArrowDrawableToggle extends DrawerArrowDrawable + implements DrawerToggle { + + private final Activity mActivity; + + public DrawerArrowDrawableToggle(Activity activity, Context themedContext) { + super(themedContext); + mActivity = activity; + } + + public void setPosition(float position) { + if (position == 1f) { + setVerticalMirror(true); + } else if (position == 0f) { + setVerticalMirror(false); + } + super.setProgress(position); + } + + @Override + boolean isLayoutRtl() { + return ViewCompat.getLayoutDirection(mActivity.getWindow().getDecorView()) + == ViewCompat.LAYOUT_DIRECTION_RTL; + } + + public float getPosition() { + return super.getProgress(); + } + } + + /** + * Interface for toggle drawables. Can be public in the future + */ + static interface DrawerToggle { + + public void setPosition(float position); + + public float getPosition(); + } + + /** + * Delegate if SDK version is between honeycomb and JBMR2 + */ + private static class HoneycombDelegate implements Delegate { + + final Activity mActivity; + ActionBarDrawerToggleHoneycomb.SetIndicatorInfo mSetIndicatorInfo; + + private HoneycombDelegate(Activity activity) { + mActivity = activity; + } + + @Override + public Drawable getThemeUpIndicator() { + return ActionBarDrawerToggleHoneycomb.getThemeUpIndicator(mActivity); + } + + @Override + public Context getActionBarThemedContext() { + final ActionBar actionBar = mActivity.getActionBar(); + final Context context; + if (actionBar != null) { + context = actionBar.getThemedContext(); + } else { + context = mActivity; + } + return context; + } + + @Override + public boolean isNavigationVisible() { + final ActionBar actionBar = mActivity.getActionBar(); + return actionBar != null + && (actionBar.getDisplayOptions() & ActionBar.DISPLAY_HOME_AS_UP) != 0; + } + + @Override + public void setActionBarUpIndicator(Drawable themeImage, int contentDescRes) { + mActivity.getActionBar().setDisplayShowHomeEnabled(true); + mSetIndicatorInfo = ActionBarDrawerToggleHoneycomb.setActionBarUpIndicator( + mSetIndicatorInfo, mActivity, themeImage, contentDescRes); + mActivity.getActionBar().setDisplayShowHomeEnabled(false); + } + + @Override + public void setActionBarDescription(int contentDescRes) { + mSetIndicatorInfo = ActionBarDrawerToggleHoneycomb.setActionBarDescription( + mSetIndicatorInfo, mActivity, contentDescRes); + } + } + + /** + * Delegate if SDK version is JB MR2 or newer + */ + private static class JellybeanMr2Delegate implements Delegate { + + final Activity mActivity; + + private JellybeanMr2Delegate(Activity activity) { + mActivity = activity; + } + + @Override + public Drawable getThemeUpIndicator() { + final TypedArray a = getActionBarThemedContext().obtainStyledAttributes(null, + new int[]{android.R.attr.homeAsUpIndicator}, android.R.attr.actionBarStyle, 0); + final Drawable result = a.getDrawable(0); + a.recycle(); + return result; + } + + @Override + public Context getActionBarThemedContext() { + final ActionBar actionBar = mActivity.getActionBar(); + final Context context; + if (actionBar != null) { + context = actionBar.getThemedContext(); + } else { + context = mActivity; + } + return context; + } + + @Override + public boolean isNavigationVisible() { + final ActionBar actionBar = mActivity.getActionBar(); + return actionBar != null && + (actionBar.getDisplayOptions() & ActionBar.DISPLAY_HOME_AS_UP) != 0; + } + + @Override + public void setActionBarUpIndicator(Drawable drawable, int contentDescRes) { + final ActionBar actionBar = mActivity.getActionBar(); + if (actionBar != null) { + actionBar.setHomeAsUpIndicator(drawable); + actionBar.setHomeActionContentDescription(contentDescRes); + } + } + + @Override + public void setActionBarDescription(int contentDescRes) { + final ActionBar actionBar = mActivity.getActionBar(); + if (actionBar != null) { + actionBar.setHomeActionContentDescription(contentDescRes); + } + } + } + + /** + * Used when DrawerToggle is initialized with a Toolbar + */ + static class ToolbarCompatDelegate implements Delegate { + + final Toolbar mToolbar; + final Drawable mDefaultUpIndicator; + final CharSequence mDefaultContentDescription; + + ToolbarCompatDelegate(Toolbar toolbar) { + mToolbar = toolbar; + mDefaultUpIndicator = toolbar.getNavigationIcon(); + mDefaultContentDescription = toolbar.getNavigationContentDescription(); + } + + @Override + public void setActionBarUpIndicator(Drawable upDrawable, @StringRes int contentDescRes) { + mToolbar.setNavigationIcon(upDrawable); + setActionBarDescription(contentDescRes); + } + + @Override + public void setActionBarDescription(@StringRes int contentDescRes) { + if (contentDescRes == 0) { + mToolbar.setNavigationContentDescription(mDefaultContentDescription); + } else { + mToolbar.setNavigationContentDescription(contentDescRes); + } + } + + @Override + public Drawable getThemeUpIndicator() { + return mDefaultUpIndicator; + } + + @Override + public Context getActionBarThemedContext() { + return mToolbar.getContext(); + } + + @Override + public boolean isNavigationVisible() { + return true; + } + } + + /** + * Fallback delegate + */ + static class DummyDelegate implements Delegate { + final Activity mActivity; + + DummyDelegate(Activity activity) { + mActivity = activity; + } + + @Override + public void setActionBarUpIndicator(Drawable upDrawable, @StringRes int contentDescRes) { + + } + + @Override + public void setActionBarDescription(@StringRes int contentDescRes) { + + } + + @Override + public Drawable getThemeUpIndicator() { + return null; + } + + @Override + public Context getActionBarThemedContext() { + return mActivity; + } + + @Override + public boolean isNavigationVisible() { + return true; + } + } +} diff --git a/android/support/v7/app/ActionBarDrawerToggleHoneycomb.java b/android/support/v7/app/ActionBarDrawerToggleHoneycomb.java new file mode 100644 index 0000000000..f25365ee1d --- /dev/null +++ b/android/support/v7/app/ActionBarDrawerToggleHoneycomb.java @@ -0,0 +1,139 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package android.support.v7.app; + +import android.R; +import android.app.ActionBar; +import android.app.Activity; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.util.Log; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; + +import java.lang.reflect.Method; + +/** + * This class encapsulates some awful hacks. + * + * Before JB-MR2 (API 18) it was not possible to change the home-as-up indicator glyph + * in an action bar without some really gross hacks. Since the MR2 SDK is not published as of + * this writing, the new API is accessed via reflection here if available. + * + * Moved from Support-v4 + */ +class ActionBarDrawerToggleHoneycomb { + private static final String TAG = "ActionBarDrawerToggleHoneycomb"; + + private static final int[] THEME_ATTRS = new int[] { + R.attr.homeAsUpIndicator + }; + + public static SetIndicatorInfo setActionBarUpIndicator(SetIndicatorInfo info, Activity activity, + Drawable drawable, int contentDescRes) { + if (true || info == null) { + info = new SetIndicatorInfo(activity); + } + if (info.setHomeAsUpIndicator != null) { + try { + final ActionBar actionBar = activity.getActionBar(); + info.setHomeAsUpIndicator.invoke(actionBar, drawable); + info.setHomeActionContentDescription.invoke(actionBar, contentDescRes); + } catch (Exception e) { + Log.w(TAG, "Couldn't set home-as-up indicator via JB-MR2 API", e); + } + } else if (info.upIndicatorView != null) { + info.upIndicatorView.setImageDrawable(drawable); + } else { + Log.w(TAG, "Couldn't set home-as-up indicator"); + } + return info; + } + + public static SetIndicatorInfo setActionBarDescription(SetIndicatorInfo info, Activity activity, + int contentDescRes) { + if (info == null) { + info = new SetIndicatorInfo(activity); + } + if (info.setHomeAsUpIndicator != null) { + try { + final ActionBar actionBar = activity.getActionBar(); + info.setHomeActionContentDescription.invoke(actionBar, contentDescRes); + if (Build.VERSION.SDK_INT <= 19) { + // For API 19 and earlier, we need to manually force the + // action bar to generate a new content description. + actionBar.setSubtitle(actionBar.getSubtitle()); + } + } catch (Exception e) { + Log.w(TAG, "Couldn't set content description via JB-MR2 API", e); + } + } + return info; + } + + public static Drawable getThemeUpIndicator(Activity activity) { + final TypedArray a = activity.obtainStyledAttributes(THEME_ATTRS); + final Drawable result = a.getDrawable(0); + a.recycle(); + return result; + } + + static class SetIndicatorInfo { + public Method setHomeAsUpIndicator; + public Method setHomeActionContentDescription; + public ImageView upIndicatorView; + + SetIndicatorInfo(Activity activity) { + try { + setHomeAsUpIndicator = ActionBar.class.getDeclaredMethod("setHomeAsUpIndicator", + Drawable.class); + setHomeActionContentDescription = ActionBar.class.getDeclaredMethod( + "setHomeActionContentDescription", Integer.TYPE); + + // If we got the method we won't need the stuff below. + return; + } catch (NoSuchMethodException e) { + // Oh well. We'll use the other mechanism below instead. + } + + final View home = activity.findViewById(android.R.id.home); + if (home == null) { + // Action bar doesn't have a known configuration, an OEM messed with things. + return; + } + + final ViewGroup parent = (ViewGroup) home.getParent(); + final int childCount = parent.getChildCount(); + if (childCount != 2) { + // No idea which one will be the right one, an OEM messed with things. + return; + } + + final View first = parent.getChildAt(0); + final View second = parent.getChildAt(1); + final View up = first.getId() == android.R.id.home ? second : first; + + if (up instanceof ImageView) { + // Jackpot! (Probably...) + upIndicatorView = (ImageView) up; + } + } + } +} diff --git a/android/support/v7/app/AppCompatActivity.java b/android/support/v7/app/AppCompatActivity.java new file mode 100644 index 0000000000..5be3d3ddf3 --- /dev/null +++ b/android/support/v7/app/AppCompatActivity.java @@ -0,0 +1,416 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.app; + +import android.content.Intent; +import android.content.res.Configuration; +import android.os.Bundle; +import android.support.annotation.LayoutRes; +import android.support.annotation.Nullable; +import android.support.v4.app.ActivityCompat; +import android.support.v4.app.FragmentActivity; +import android.support.v4.app.NavUtils; +import android.support.v4.app.TaskStackBuilder; +import android.support.v7.view.ActionMode; +import android.support.v7.widget.Toolbar; +import android.view.MenuInflater; +import android.view.View; +import android.view.ViewGroup; + +/** + * Base class for activities that use the + * support library action bar features. + * + *

      You can add an {@link android.support.v7.app.ActionBar} to your activity when running on API level 7 or higher + * by extending this class for your activity and setting the activity theme to + * {@link android.support.v7.appcompat.R.style#Theme_AppCompat Theme.AppCompat} or a similar theme. + * + *

      + *

      Developer Guides

      + * + *

      For information about how to use the action bar, including how to add action items, navigation + * modes and more, read the Action + * Bar API guide.

      + *
      + */ +public class AppCompatActivity extends FragmentActivity implements AppCompatCallback, + TaskStackBuilder.SupportParentable, ActionBarDrawerToggle.DelegateProvider { + + private AppCompatDelegate mDelegate; + + @Override + protected void onCreate(Bundle savedInstanceState) { + getDelegate().installViewFactory(); + super.onCreate(savedInstanceState); + getDelegate().onCreate(savedInstanceState); + } + + @Override + protected void onPostCreate(Bundle savedInstanceState) { + super.onPostCreate(savedInstanceState); + getDelegate().onPostCreate(savedInstanceState); + } + + /** + * Support library version of {@link android.app.Activity#getActionBar}. + * + *

      Retrieve a reference to this activity's ActionBar. + * + * @return The Activity's ActionBar, or null if it does not have one. + */ + public ActionBar getSupportActionBar() { + return getDelegate().getSupportActionBar(); + } + + /** + * Set a {@link android.widget.Toolbar Toolbar} to act as the {@link android.support.v7.app.ActionBar} for this + * Activity window. + * + *

      When set to a non-null value the {@link #getActionBar()} method will return + * an {@link android.support.v7.app.ActionBar} object that can be used to control the given toolbar as if it were + * a traditional window decor action bar. The toolbar's menu will be populated with the + * Activity's options menu and the navigation button will be wired through the standard + * {@link android.R.id#home home} menu select action.

      + * + *

      In order to use a Toolbar within the Activity's window content the application + * must not request the window feature {@link android.view.Window#FEATURE_ACTION_BAR FEATURE_ACTION_BAR}.

      + * + * @param toolbar Toolbar to set as the Activity's action bar + */ + public void setSupportActionBar(@Nullable Toolbar toolbar) { + getDelegate().setSupportActionBar(toolbar); + } + + @Override + public MenuInflater getMenuInflater() { + return getDelegate().getMenuInflater(); + } + + @Override + public void setContentView(@LayoutRes int layoutResID) { + getDelegate().setContentView(layoutResID); + } + + @Override + public void setContentView(View view) { + getDelegate().setContentView(view); + } + + @Override + public void setContentView(View view, ViewGroup.LayoutParams params) { + getDelegate().setContentView(view, params); + } + + @Override + public void addContentView(View view, ViewGroup.LayoutParams params) { + getDelegate().addContentView(view, params); + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + getDelegate().onConfigurationChanged(newConfig); + } + + @Override + protected void onStop() { + super.onStop(); + getDelegate().onStop(); + } + + @Override + protected void onPostResume() { + super.onPostResume(); + getDelegate().onPostResume(); + } + + @Override + public final boolean onMenuItemSelected(int featureId, android.view.MenuItem item) { + if (super.onMenuItemSelected(featureId, item)) { + return true; + } + + final ActionBar ab = getSupportActionBar(); + if (item.getItemId() == android.R.id.home && ab != null && + (ab.getDisplayOptions() & ActionBar.DISPLAY_HOME_AS_UP) != 0) { + return onSupportNavigateUp(); + } + return false; + } + + @Override + protected void onDestroy() { + super.onDestroy(); + getDelegate().onDestroy(); + } + + @Override + protected void onTitleChanged(CharSequence title, int color) { + super.onTitleChanged(title, color); + getDelegate().setTitle(title); + } + + /** + * Enable extended support library window features. + *

      + * This is a convenience for calling + * {@link android.view.Window#requestFeature getWindow().requestFeature()}. + *

      + * + * @param featureId The desired feature as defined in + * {@link android.view.Window} or {@link android.support.v4.view.WindowCompat}. + * @return Returns true if the requested feature is supported and now enabled. + * + * @see android.app.Activity#requestWindowFeature + * @see android.view.Window#requestFeature + */ + public boolean supportRequestWindowFeature(int featureId) { + return getDelegate().requestWindowFeature(featureId); + } + + @Override + public void supportInvalidateOptionsMenu() { + getDelegate().invalidateOptionsMenu(); + } + + /** + * @hide + */ + public void invalidateOptionsMenu() { + getDelegate().invalidateOptionsMenu(); + } + + /** + * Notifies the Activity that a support action mode has been started. + * Activity subclasses overriding this method should call the superclass implementation. + * + * @param mode The new action mode. + */ + public void onSupportActionModeStarted(ActionMode mode) { + } + + /** + * Notifies the activity that a support action mode has finished. + * Activity subclasses overriding this method should call the superclass implementation. + * + * @param mode The action mode that just finished. + */ + public void onSupportActionModeFinished(ActionMode mode) { + } + + public ActionMode startSupportActionMode(ActionMode.Callback callback) { + return getDelegate().startSupportActionMode(callback); + } + + /** + * @deprecated Progress bars are no longer provided in AppCompat. + */ + @Deprecated + public void setSupportProgressBarVisibility(boolean visible) { + } + + /** + * @deprecated Progress bars are no longer provided in AppCompat. + */ + @Deprecated + public void setSupportProgressBarIndeterminateVisibility(boolean visible) { + } + + /** + * @deprecated Progress bars are no longer provided in AppCompat. + */ + @Deprecated + public void setSupportProgressBarIndeterminate(boolean indeterminate) { + } + + /** + * @deprecated Progress bars are no longer provided in AppCompat. + */ + @Deprecated + public void setSupportProgress(int progress) { + } + + /** + * Support version of {@link #onCreateNavigateUpTaskStack(android.app.TaskStackBuilder)}. + * This method will be called on all platform versions. + * + * Define the synthetic task stack that will be generated during Up navigation from + * a different task. + * + *

      The default implementation of this method adds the parent chain of this activity + * as specified in the manifest to the supplied {@link android.support.v4.app.TaskStackBuilder}. Applications + * may choose to override this method to construct the desired task stack in a different + * way.

      + * + *

      This method will be invoked by the default implementation of {@link #onNavigateUp()} + * if {@link #shouldUpRecreateTask(android.content.Intent)} returns true when supplied with the intent + * returned by {@link #getParentActivityIntent()}.

      + * + *

      Applications that wish to supply extra Intent parameters to the parent stack defined + * by the manifest should override + * {@link #onPrepareSupportNavigateUpTaskStack(android.support.v4.app.TaskStackBuilder)}.

      + * + * @param builder An empty TaskStackBuilder - the application should add intents representing + * the desired task stack + */ + public void onCreateSupportNavigateUpTaskStack(TaskStackBuilder builder) { + builder.addParentStack(this); + } + + /** + * Support version of {@link #onPrepareNavigateUpTaskStack(android.app.TaskStackBuilder)}. + * This method will be called on all platform versions. + * + * Prepare the synthetic task stack that will be generated during Up navigation + * from a different task. + * + *

      This method receives the {@link android.support.v4.app.TaskStackBuilder} with the constructed series of + * Intents as generated by {@link #onCreateSupportNavigateUpTaskStack(android.support.v4.app.TaskStackBuilder)}. + * If any extra data should be added to these intents before launching the new task, + * the application should override this method and add that data here.

      + * + * @param builder A TaskStackBuilder that has been populated with Intents by + * onCreateNavigateUpTaskStack. + */ + public void onPrepareSupportNavigateUpTaskStack(TaskStackBuilder builder) { + } + + /** + * This method is called whenever the user chooses to navigate Up within your application's + * activity hierarchy from the action bar. + * + *

      If a parent was specified in the manifest for this activity or an activity-alias to it, + * default Up navigation will be handled automatically. See + * {@link #getSupportParentActivityIntent()} for how to specify the parent. If any activity + * along the parent chain requires extra Intent arguments, the Activity subclass + * should override the method {@link #onPrepareSupportNavigateUpTaskStack(android.support.v4.app.TaskStackBuilder)} + * to supply those arguments.

      + * + *

      See Tasks and + * Back Stack from the developer guide and + * Navigation from the design guide + * for more information about navigating within your app.

      + * + *

      See the {@link android.support.v4.app.TaskStackBuilder} class and the Activity methods + * {@link #getSupportParentActivityIntent()}, {@link #supportShouldUpRecreateTask(android.content.Intent)}, and + * {@link #supportNavigateUpTo(android.content.Intent)} for help implementing custom Up navigation.

      + * + * @return true if Up navigation completed successfully and this Activity was finished, + * false otherwise. + */ + public boolean onSupportNavigateUp() { + Intent upIntent = getSupportParentActivityIntent(); + + if (upIntent != null) { + if (supportShouldUpRecreateTask(upIntent)) { + TaskStackBuilder b = TaskStackBuilder.create(this); + onCreateSupportNavigateUpTaskStack(b); + onPrepareSupportNavigateUpTaskStack(b); + b.startActivities(); + + try { + ActivityCompat.finishAffinity(this); + } catch (IllegalStateException e) { + // This can only happen on 4.1+, when we don't have a parent or a result set. + // In that case we should just finish(). + finish(); + } + } else { + // This activity is part of the application's task, so simply + // navigate up to the hierarchical parent activity. + supportNavigateUpTo(upIntent); + } + return true; + } + return false; + } + + /** + * Obtain an {@link android.content.Intent} that will launch an explicit target activity + * specified by sourceActivity's {@link android.support.v4.app.NavUtils#PARENT_ACTIVITY} <meta-data> + * element in the application's manifest. If the device is running + * Jellybean or newer, the android:parentActivityName attribute will be preferred + * if it is present. + * + * @return a new Intent targeting the defined parent activity of sourceActivity + */ + public Intent getSupportParentActivityIntent() { + return NavUtils.getParentActivityIntent(this); + } + + /** + * Returns true if sourceActivity should recreate the task when navigating 'up' + * by using targetIntent. + * + *

      If this method returns false the app can trivially call + * {@link #supportNavigateUpTo(android.content.Intent)} using the same parameters to correctly perform + * up navigation. If this method returns false, the app should synthesize a new task stack + * by using {@link android.support.v4.app.TaskStackBuilder} or another similar mechanism to perform up navigation.

      + * + * @param targetIntent An intent representing the target destination for up navigation + * @return true if navigating up should recreate a new task stack, false if the same task + * should be used for the destination + */ + public boolean supportShouldUpRecreateTask(Intent targetIntent) { + return NavUtils.shouldUpRecreateTask(this, targetIntent); + } + + /** + * Navigate from sourceActivity to the activity specified by upIntent, finishing sourceActivity + * in the process. upIntent will have the flag {@link android.content.Intent#FLAG_ACTIVITY_CLEAR_TOP} set + * by this method, along with any others required for proper up navigation as outlined + * in the Android Design Guide. + * + *

      This method should be used when performing up navigation from within the same task + * as the destination. If up navigation should cross tasks in some cases, see + * {@link #supportShouldUpRecreateTask(android.content.Intent)}.

      + * + * @param upIntent An intent representing the target destination for up navigation + */ + public void supportNavigateUpTo(Intent upIntent) { + NavUtils.navigateUpTo(this, upIntent); + } + + @Override + public void onContentChanged() { + // Call onSupportContentChanged() for legacy reasons + onSupportContentChanged(); + } + + /** + * @deprecated Use {@link #onContentChanged()} instead. + */ + @Deprecated + public void onSupportContentChanged() { + } + + @Nullable + @Override + public ActionBarDrawerToggle.Delegate getDrawerToggleDelegate() { + return getDelegate().getDrawerToggleDelegate(); + } + + /** + * @return The {@link AppCompatDelegate} being used by this Activity. + */ + public AppCompatDelegate getDelegate() { + if (mDelegate == null) { + mDelegate = AppCompatDelegate.create(this, this); + } + return mDelegate; + } +} diff --git a/android/support/v7/app/AppCompatCallback.java b/android/support/v7/app/AppCompatCallback.java new file mode 100644 index 0000000000..dba77a2445 --- /dev/null +++ b/android/support/v7/app/AppCompatCallback.java @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.app; + +import android.support.v7.view.ActionMode; + +/** + * Implemented this in order for AppCompat to be able to callback in certain situations. + *

      + * This should be provided to + * {@link AppCompatDelegate#create(android.app.Activity, AppCompatCallback)}. + */ +public interface AppCompatCallback { + + /** + * Called when a support action mode has been started. + * + * @param mode The new action mode. + */ + void onSupportActionModeStarted(ActionMode mode); + + /** + * Called when a support action mode has finished. + * + * @param mode The action mode that just finished. + */ + void onSupportActionModeFinished(ActionMode mode); + +} diff --git a/android/support/v7/app/AppCompatDelegate.java b/android/support/v7/app/AppCompatDelegate.java new file mode 100644 index 0000000000..ecb1178484 --- /dev/null +++ b/android/support/v7/app/AppCompatDelegate.java @@ -0,0 +1,251 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.app; + +import android.app.Activity; +import android.app.Dialog; +import android.content.Context; +import android.content.res.Configuration; +import android.os.Build; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.v4.app.FragmentActivity; +import android.support.v7.view.ActionMode; +import android.support.v7.widget.Toolbar; +import android.util.AttributeSet; +import android.view.MenuInflater; +import android.view.View; +import android.view.ViewGroup; + +/** + * This class represents a delegate which you can use to extend AppCompat's support to any + * {@link android.app.Activity}. + *

      + * When using an {@link AppCompatDelegate}, you should any methods exposed in it rather than the + * {@link android.app.Activity} method of the same name. This applies to: + *

        + *
      • {@link #addContentView(android.view.View, android.view.ViewGroup.LayoutParams)}
      • + *
      • {@link #setContentView(int)}
      • + *
      • {@link #setContentView(android.view.View)}
      • + *
      • {@link #setContentView(android.view.View, android.view.ViewGroup.LayoutParams)}
      • + *
      • {@link #requestWindowFeature(int)}
      • + *
      • {@link #invalidateOptionsMenu()}
      • + *
      • {@link #startSupportActionMode(android.support.v7.view.ActionMode.Callback)}
      • + *
      • {@link #setSupportActionBar(android.support.v7.widget.Toolbar)}
      • + *
      • {@link #getSupportActionBar()}
      • + *
      • {@link #getMenuInflater()}
      • + *
      + * There also some Activity lifecycle methods which should be proxied to the delegate: + *
        + *
      • {@link #onCreate(android.os.Bundle)}
      • + *
      • {@link #onPostCreate(android.os.Bundle)}
      • + *
      • {@link #onConfigurationChanged(android.content.res.Configuration)}
      • + *
      • {@link #setTitle(CharSequence)}
      • + *
      • {@link #onStop()}
      • + *
      • {@link #onDestroy()}
      • + *
      + *

      + * An {@link Activity} can only be linked with one {@link AppCompatDelegate} instance, + * so the instance returned from {@link #create(Activity, AppCompatCallback)} should be kept + * until the Activity is destroyed. + */ +public abstract class AppCompatDelegate { + + static final String TAG = "AppCompatDelegate"; + + /** + * Create a {@link android.support.v7.app.AppCompatDelegate} to use with {@code activity}. + * + * @param callback An optional callback for AppCompat specific events + */ + public static AppCompatDelegate create(Activity activity, AppCompatCallback callback) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + return new AppCompatDelegateImplV11(activity, activity.getWindow(), callback); + } else { + return new AppCompatDelegateImplV7(activity, activity.getWindow(), callback); + } + } + + /** + * Create a {@link android.support.v7.app.AppCompatDelegate} to use with {@code dialog}. + * + * @param callback An optional callback for AppCompat specific events + */ + public static AppCompatDelegate create(Dialog dialog, AppCompatCallback callback) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + return new AppCompatDelegateImplV11(dialog.getContext(), dialog.getWindow(), callback); + } else { + return new AppCompatDelegateImplV7(dialog.getContext(), dialog.getWindow(), callback); + } + } + + /** + * Private constructor + */ + AppCompatDelegate() {} + + /** + * Support library version of {@link Activity#getActionBar}. + * + * @return AppCompat's action bar, or null if it does not have one. + */ + public abstract ActionBar getSupportActionBar(); + + /** + * Set a {@link Toolbar} to act as the {@link ActionBar} for this delegate. + * + *

      When set to a non-null value the {@link #getSupportActionBar()} ()} method will return + * an {@link ActionBar} object that can be used to control the given toolbar as if it were + * a traditional window decor action bar. The toolbar's menu will be populated with the + * Activity's options menu and the navigation button will be wired through the standard + * {@link android.R.id#home home} menu select action.

      + * + *

      In order to use a Toolbar within the Activity's window content the application + * must not request the window feature + * {@link android.view.Window#FEATURE_ACTION_BAR FEATURE_ACTION_BAR}.

      + * + * @param toolbar Toolbar to set as the Activity's action bar + */ + public abstract void setSupportActionBar(Toolbar toolbar); + + /** + * Return the value of this call from your {@link Activity#getMenuInflater()} + */ + public abstract MenuInflater getMenuInflater(); + + /** + * Should be called from {@link Activity#onCreate Activity.onCreate()} + */ + public abstract void onCreate(Bundle savedInstanceState); + + /** + * Should be called from {@link Activity#onPostCreate(android.os.Bundle)} + */ + public abstract void onPostCreate(Bundle savedInstanceState); + + /** + * Should be called from + * {@link Activity#onConfigurationChanged} + */ + public abstract void onConfigurationChanged(Configuration newConfig); + + /** + * Should be called from {@link Activity#onStop Activity.onStop()} + */ + public abstract void onStop(); + + /** + * Should be called from {@link Activity#onPostResume()} + */ + public abstract void onPostResume(); + + /** + * Should be called instead of {@link Activity#setContentView(android.view.View)}} + */ + public abstract void setContentView(View v); + + /** + * Should be called instead of {@link Activity#setContentView(int)}} + */ + public abstract void setContentView(int resId); + + /** + * Should be called instead of + * {@link Activity#setContentView(android.view.View, android.view.ViewGroup.LayoutParams)}} + */ + public abstract void setContentView(View v, ViewGroup.LayoutParams lp); + + /** + * Should be called instead of + * {@link Activity#addContentView(android.view.View, android.view.ViewGroup.LayoutParams)}} + */ + public abstract void addContentView(View v, ViewGroup.LayoutParams lp); + + /** + * Should be called from {@link Activity#onTitleChanged(CharSequence, int)}} + */ + public abstract void setTitle(CharSequence title); + + /** + * Should be called from {@link Activity#invalidateOptionsMenu()}} or + * {@link FragmentActivity#supportInvalidateOptionsMenu()}. + */ + public abstract void invalidateOptionsMenu(); + + /** + * Should be called from {@link Activity#onDestroy()} + */ + public abstract void onDestroy(); + + /** + * Returns an {@link ActionBarDrawerToggle.Delegate} which can be returned from your Activity + * if it implements {@link ActionBarDrawerToggle.DelegateProvider}. + */ + public abstract ActionBarDrawerToggle.Delegate getDrawerToggleDelegate(); + + /** + * Enable extended window features. This should be called instead of + * {@link android.app.Activity#requestWindowFeature(int)} or + * {@link android.view.Window#requestFeature getWindow().requestFeature()}. + * + * @param featureId The desired feature as defined in {@link android.view.Window}. + * @return Returns true if the requested feature is supported and now + * enabled. + */ + public abstract boolean requestWindowFeature(int featureId); + + /** + * 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 + */ + public abstract ActionMode startSupportActionMode(ActionMode.Callback callback); + + /** + * Installs AppCompat's {@link android.view.LayoutInflater} Factory so that it can replace + * the framework widgets with compatible tinted versions. This should be called before + * {@code super.onCreate()} as so: + *
      +     * protected void onCreate(Bundle savedInstanceState) {
      +     *     getDelegate().installViewFactory();
      +     *     super.onCreate(savedInstanceState);
      +     *     getDelegate().onCreate(savedInstanceState);
      +     *
      +     *     // ...
      +     * }
      +     * 
      + * If you are using your own {@link android.view.LayoutInflater.Factory Factory} or + * {@link android.view.LayoutInflater.Factory2 Factory2} then you can omit this call, and instead call + * {@link #createView(android.view.View, String, android.content.Context, android.util.AttributeSet)} + * from your factory to return any compatible widgets. + */ + public abstract void installViewFactory(); + + /** + * This should be called from a + * {@link android.support.v4.view.LayoutInflaterFactory LayoutInflaterFactory} in order + * to return tint-aware widgets. + *

      + * This is only needed if you are using your own + * {@link android.view.LayoutInflater LayoutInflater} factory, and have therefore not + * installed the default factory via {@link #installViewFactory()}. + */ + public abstract View createView(View parent, String name, @NonNull Context context, + @NonNull AttributeSet attrs); + +} diff --git a/android/support/v7/app/AppCompatDelegateImplBase.java b/android/support/v7/app/AppCompatDelegateImplBase.java new file mode 100644 index 0000000000..ac46f3cef8 --- /dev/null +++ b/android/support/v7/app/AppCompatDelegateImplBase.java @@ -0,0 +1,325 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.app; + +import android.app.Activity; +import android.app.Dialog; +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.os.Bundle; +import android.support.v7.appcompat.R; +import android.support.v7.internal.view.SupportMenuInflater; +import android.support.v7.internal.view.WindowCallbackWrapper; +import android.support.v7.internal.view.menu.MenuBuilder; +import android.support.v7.internal.widget.TintTypedArray; +import android.support.v7.view.ActionMode; +import android.view.KeyEvent; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.View; +import android.view.Window; + +abstract class AppCompatDelegateImplBase extends AppCompatDelegate { + + final Context mContext; + final Window mWindow; + final Window.Callback mOriginalWindowCallback; + final AppCompatCallback mAppCompatCallback; + + private ActionBar mActionBar; + private MenuInflater mMenuInflater; + + // true if this activity has an action bar. + boolean mHasActionBar; + // true if this activity's action bar overlays other activity content. + boolean mOverlayActionBar; + // true if this any action modes should overlay the activity content + boolean mOverlayActionMode; + // true if this activity is floating (e.g. Dialog) + boolean mIsFloating; + // true if this activity has no title + boolean mWindowNoTitle; + + private CharSequence mTitle; + + private boolean mIsDestroyed; + + AppCompatDelegateImplBase(Context context, Window window, AppCompatCallback callback) { + mContext = context; + mWindow = window; + mAppCompatCallback = callback; + + mOriginalWindowCallback = mWindow.getCallback(); + if (mOriginalWindowCallback instanceof AppCompatWindowCallback) { + throw new IllegalStateException( + "AppCompat has already installed itself into the Window"); + } + // Now install the new callback + mWindow.setCallback(new AppCompatWindowCallback(mOriginalWindowCallback)); + } + + abstract ActionBar createSupportActionBar(); + + @Override + public ActionBar getSupportActionBar() { + // The Action Bar should be lazily created as hasActionBar + // could change after onCreate + if (mHasActionBar) { + if (mActionBar == null) { + mActionBar = createSupportActionBar(); + } + } + return mActionBar; + } + + final ActionBar peekSupportActionBar() { + return mActionBar; + } + + final void setSupportActionBar(ActionBar actionBar) { + mActionBar = actionBar; + } + + @Override + public MenuInflater getMenuInflater() { + if (mMenuInflater == null) { + mMenuInflater = new SupportMenuInflater(getActionBarThemedContext()); + } + return mMenuInflater; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + TypedArray a = mContext.obtainStyledAttributes(R.styleable.Theme); + + if (!a.hasValue(R.styleable.Theme_windowActionBar)) { + a.recycle(); + throw new IllegalStateException( + "You need to use a Theme.AppCompat theme (or descendant) with this activity."); + } + + if (a.getBoolean(R.styleable.Theme_windowActionBar, false)) { + mHasActionBar = true; + } + if (a.getBoolean(R.styleable.Theme_windowActionBarOverlay, false)) { + mOverlayActionBar = true; + } + if (a.getBoolean(R.styleable.Theme_windowActionModeOverlay, false)) { + mOverlayActionMode = true; + } + mIsFloating = a.getBoolean(R.styleable.Theme_android_windowIsFloating, false); + mWindowNoTitle = a.getBoolean(R.styleable.Theme_windowNoTitle, false); + a.recycle(); + } + + // Methods used to create and respond to options menu + abstract boolean onPanelClosed(int featureId, Menu menu); + + abstract boolean onMenuOpened(int featureId, Menu menu); + + abstract boolean dispatchKeyEvent(KeyEvent event); + + abstract boolean onKeyShortcut(int keyCode, KeyEvent event); + + @Override + public final ActionBarDrawerToggle.Delegate getDrawerToggleDelegate() { + return new ActionBarDrawableToggleImpl(); + } + + final Context getActionBarThemedContext() { + Context context = null; + + // If we have an action bar, let it return a themed context + ActionBar ab = getSupportActionBar(); + if (ab != null) { + context = ab.getThemedContext(); + } + + if (context == null) { + context = mContext; + } + return context; + } + + private class ActionBarDrawableToggleImpl implements ActionBarDrawerToggle.Delegate { + @Override + public Drawable getThemeUpIndicator() { + final TintTypedArray a = TintTypedArray.obtainStyledAttributes( + getActionBarThemedContext(), null, new int[]{ R.attr.homeAsUpIndicator }); + final Drawable result = a.getDrawable(0); + a.recycle(); + return result; + } + + @Override + public Context getActionBarThemedContext() { + return AppCompatDelegateImplBase.this.getActionBarThemedContext(); + } + + @Override + public boolean isNavigationVisible() { + final ActionBar ab = getSupportActionBar(); + return ab != null && (ab.getDisplayOptions() & ActionBar.DISPLAY_HOME_AS_UP) != 0; + } + + @Override + public void setActionBarUpIndicator(Drawable upDrawable, int contentDescRes) { + ActionBar ab = getSupportActionBar(); + if (ab != null) { + ab.setHomeAsUpIndicator(upDrawable); + ab.setHomeActionContentDescription(contentDescRes); + } + } + + @Override + public void setActionBarDescription(int contentDescRes) { + ActionBar ab = getSupportActionBar(); + if (ab != null) { + ab.setHomeActionContentDescription(contentDescRes); + } + } + } + + abstract ActionMode startSupportActionModeFromWindow(ActionMode.Callback callback); + + @Override + public final void onDestroy() { + mIsDestroyed = true; + } + + final boolean isDestroyed() { + return mIsDestroyed; + } + + final Window.Callback getWindowCallback() { + return mWindow.getCallback(); + } + + @Override + public final void setTitle(CharSequence title) { + mTitle = title; + onTitleChanged(title); + } + + abstract void onTitleChanged(CharSequence title); + + final CharSequence getTitle() { + // If the original window callback is an Activity, we'll use it's title + if (mOriginalWindowCallback instanceof Activity) { + return ((Activity) mOriginalWindowCallback).getTitle(); + } + // Else, we'll return the title we have recorded ourselves + return mTitle; + } + + private class AppCompatWindowCallback extends WindowCallbackWrapper { + AppCompatWindowCallback(Window.Callback callback) { + super(callback); + } + + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + if (AppCompatDelegateImplBase.this.dispatchKeyEvent(event)) { + return true; + } + return super.dispatchKeyEvent(event); + } + + @Override + public boolean onCreatePanelMenu(int featureId, Menu menu) { + if (featureId == Window.FEATURE_OPTIONS_PANEL && !(menu instanceof MenuBuilder)) { + // If this is an options menu but it's not an AppCompat menu, we eat the event + // and return false + return false; + } + return super.onCreatePanelMenu(featureId, menu); + } + + @Override + public boolean onPreparePanel(int featureId, View view, Menu menu) { + if (featureId == Window.FEATURE_OPTIONS_PANEL && !(menu instanceof MenuBuilder)) { + // If this is an options menu but it's not an AppCompat menu, we eat the event + // and return false + return false; + } + + if (featureId == Window.FEATURE_OPTIONS_PANEL && bypassPrepareOptionsPanelIfNeeded()) { + // If this is an options menu and we need to bypass onPreparePanel, do so + if (mOriginalWindowCallback instanceof Activity) { + return ((Activity) mOriginalWindowCallback).onPrepareOptionsMenu(menu); + } else if (mOriginalWindowCallback instanceof Dialog) { + return ((Dialog) mOriginalWindowCallback).onPrepareOptionsMenu(menu); + } + return false; + } + + // Else, defer to the default handling + return super.onPreparePanel(featureId, view, menu); + } + + @Override + public boolean onMenuOpened(int featureId, Menu menu) { + if (AppCompatDelegateImplBase.this.onMenuOpened(featureId, menu)) { + return true; + } + return super.onMenuOpened(featureId, menu); + } + + @Override + public boolean dispatchKeyShortcutEvent(KeyEvent event) { + if (AppCompatDelegateImplBase.this.onKeyShortcut(event.getKeyCode(), event)) { + return true; + } + return super.dispatchKeyShortcutEvent(event); + } + + @Override + public void onContentChanged() { + // We purposely do not propagate this call as this is called when we install + // our sub-decor rather than the user's content + } + + @Override + public void onPanelClosed(int featureId, Menu menu) { + if (AppCompatDelegateImplBase.this.onPanelClosed(featureId, menu)) { + return; + } + super.onPanelClosed(featureId, menu); + } + + /** + * For the options menu, we may need to call onPrepareOptionsMenu() directly, + * bypassing onPreparePanel(). This is because onPreparePanel() in certain situations + * calls menu.hasVisibleItems(), which interferes with any initial invisible items. + * + * @return true if onPrepareOptionsMenu should be called directly. + */ + private boolean bypassPrepareOptionsPanelIfNeeded() { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN + && mOriginalWindowCallback instanceof Activity) { + // For Activities, we only need to bypass onPreparePanel if we're running pre-JB + return true; + } else if (mOriginalWindowCallback instanceof Dialog) { + // For Dialogs, we always need to bypass onPreparePanel + return true; + } + return false; + } + } +} diff --git a/android/support/v7/app/AppCompatDelegateImplV11.java b/android/support/v7/app/AppCompatDelegateImplV11.java new file mode 100644 index 0000000000..a480ee69cd --- /dev/null +++ b/android/support/v7/app/AppCompatDelegateImplV11.java @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.app; + +import android.annotation.TargetApi; +import android.content.Context; +import android.os.Build; +import android.support.v7.internal.view.SupportActionModeWrapper; +import android.support.v7.internal.widget.NativeActionModeAwareLayout; +import android.util.AttributeSet; +import android.view.ActionMode; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; + +@TargetApi(Build.VERSION_CODES.HONEYCOMB) +class AppCompatDelegateImplV11 extends AppCompatDelegateImplV7 + implements NativeActionModeAwareLayout.OnActionModeForChildListener { + + private NativeActionModeAwareLayout mNativeActionModeAwareLayout; + + AppCompatDelegateImplV11(Context context, Window window, AppCompatCallback callback) { + super(context, window, callback); + } + + @Override + void onSubDecorInstalled(ViewGroup subDecor) { + // NativeActionModeAwareLayout is used to notify us when a native Action Mode is started + mNativeActionModeAwareLayout = (NativeActionModeAwareLayout) + subDecor.findViewById(android.R.id.content); + + // Can be null when using FEATURE_ACTION_BAR_OVERLAY + if (mNativeActionModeAwareLayout != null) { + mNativeActionModeAwareLayout.setActionModeForChildListener(this); + } + } + + // From NativeActionModeAwareLayout.OnActionModeForChildListener + @Override + public ActionMode startActionModeForChild(View originalView, ActionMode.Callback callback) { + Context context = originalView.getContext(); + + // Try and start a support action mode, wrapping the callback + final android.support.v7.view.ActionMode supportActionMode = startSupportActionMode( + new SupportActionModeWrapper.CallbackWrapper(context, callback)); + + if (supportActionMode != null) { + // If we received a support action mode, wrap and return it + return new SupportActionModeWrapper(mContext, supportActionMode); + } + return null; + } + + View callActivityOnCreateView(View parent, String name, Context context, AttributeSet attrs) { + // First let super have a try, this allows FragmentActivity to inflate any support + // fragments + final View view = super.callActivityOnCreateView(parent, name, context, attrs); + if (view != null) { + return view; + } + + // Now, let the Activity's LayoutInflater.Factory2 method try... + if (mOriginalWindowCallback instanceof LayoutInflater.Factory2) { + return ((LayoutInflater.Factory2) mOriginalWindowCallback) + .onCreateView(parent, name, context, attrs); + } + + return null; + } +} diff --git a/android/support/v7/app/AppCompatDelegateImplV7.java b/android/support/v7/app/AppCompatDelegateImplV7.java new file mode 100644 index 0000000000..273beba642 --- /dev/null +++ b/android/support/v7/app/AppCompatDelegateImplV7.java @@ -0,0 +1,1808 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.app; + +import android.app.Activity; +import android.app.Dialog; +import android.content.Context; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.graphics.PixelFormat; +import android.graphics.Rect; +import android.media.AudioManager; +import android.os.Build; +import android.os.Bundle; +import android.os.Parcel; +import android.os.Parcelable; +import android.support.annotation.NonNull; +import android.support.v4.app.NavUtils; +import android.support.v4.view.LayoutInflaterCompat; +import android.support.v4.view.LayoutInflaterFactory; +import android.support.v4.view.OnApplyWindowInsetsListener; +import android.support.v4.view.ViewCompat; +import android.support.v4.view.ViewConfigurationCompat; +import android.support.v4.view.WindowInsetsCompat; +import android.support.v7.appcompat.R; +import android.support.v7.internal.app.TintViewInflater; +import android.support.v7.internal.app.ToolbarActionBar; +import android.support.v7.internal.app.WindowDecorActionBar; +import android.support.v7.internal.view.ContextThemeWrapper; +import android.support.v7.internal.view.StandaloneActionMode; +import android.support.v7.internal.view.menu.ListMenuPresenter; +import android.support.v7.internal.view.menu.MenuBuilder; +import android.support.v7.internal.view.menu.MenuPresenter; +import android.support.v7.internal.view.menu.MenuView; +import android.support.v7.internal.widget.ActionBarContextView; +import android.support.v7.internal.widget.DecorContentParent; +import android.support.v7.internal.widget.FitWindowsViewGroup; +import android.support.v7.internal.widget.TintManager; +import android.support.v7.internal.widget.ViewStubCompat; +import android.support.v7.internal.widget.ViewUtils; +import android.support.v7.view.ActionMode; +import android.support.v7.widget.Toolbar; +import android.text.TextUtils; +import android.util.AndroidRuntimeException; +import android.util.AttributeSet; +import android.util.DisplayMetrics; +import android.util.Log; +import android.util.TypedValue; +import android.view.Gravity; +import android.view.KeyCharacterMap; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewConfiguration; +import android.view.ViewGroup; +import android.view.ViewParent; +import android.view.Window; +import android.view.WindowManager; +import android.view.accessibility.AccessibilityEvent; +import android.widget.FrameLayout; +import android.widget.PopupWindow; +import android.widget.TextView; + +import static android.support.v4.view.WindowCompat.FEATURE_ACTION_BAR; +import static android.support.v4.view.WindowCompat.FEATURE_ACTION_BAR_OVERLAY; +import static android.support.v4.view.WindowCompat.FEATURE_ACTION_MODE_OVERLAY; +import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; +import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; +import static android.view.Window.FEATURE_OPTIONS_PANEL; + +class AppCompatDelegateImplV7 extends AppCompatDelegateImplBase + implements MenuBuilder.Callback, LayoutInflaterFactory { + + private DecorContentParent mDecorContentParent; + private ActionMenuPresenterCallback mActionMenuPresenterCallback; + private PanelMenuPresenterCallback mPanelMenuPresenterCallback; + + ActionMode mActionMode; + ActionBarContextView mActionModeView; + PopupWindow mActionModePopup; + Runnable mShowActionModePopup; + + // true if we have installed a window sub-decor layout. + private boolean mSubDecorInstalled; + private ViewGroup mWindowDecor; + private ViewGroup mSubDecor; + + private TextView mTitleView; + private View mStatusGuard; + + // Used to keep track of Progress Bar Window features + private boolean mFeatureProgress, mFeatureIndeterminateProgress; + + // Used for emulating PanelFeatureState + private boolean mClosingActionMenu; + private PanelFeatureState[] mPanels; + private PanelFeatureState mPreparedPanel; + + private boolean mInvalidatePanelMenuPosted; + private int mInvalidatePanelMenuFeatures; + private final Runnable mInvalidatePanelMenuRunnable = new Runnable() { + @Override + public void run() { + if ((mInvalidatePanelMenuFeatures & 1 << FEATURE_OPTIONS_PANEL) != 0) { + doInvalidatePanelMenu(FEATURE_OPTIONS_PANEL); + } + if ((mInvalidatePanelMenuFeatures & 1 << FEATURE_ACTION_BAR) != 0) { + doInvalidatePanelMenu(FEATURE_ACTION_BAR); + } + mInvalidatePanelMenuPosted = false; + mInvalidatePanelMenuFeatures = 0; + } + }; + + private boolean mEnableDefaultActionBarUp; + + private Rect mTempRect1; + private Rect mTempRect2; + + private TintViewInflater mTintViewInflater; + + AppCompatDelegateImplV7(Context context, Window window, AppCompatCallback callback) { + super(context, window, callback); + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + mWindowDecor = (ViewGroup) mWindow.getDecorView(); + + if (mOriginalWindowCallback instanceof Activity) { + if (NavUtils.getParentActivityName((Activity) mOriginalWindowCallback) != null) { + // Peek at the Action Bar and update it if it already exists + ActionBar ab = peekSupportActionBar(); + if (ab == null) { + mEnableDefaultActionBarUp = true; + } else { + ab.setDefaultDisplayHomeAsUpEnabled(true); + } + } + } + } + + @Override + public void onPostCreate(Bundle savedInstanceState) { + // Make sure that the sub decor is installed + ensureSubDecor(); + } + + @Override + public ActionBar createSupportActionBar() { + ensureSubDecor(); + ActionBar ab = null; + if (mOriginalWindowCallback instanceof Activity) { + ab = new WindowDecorActionBar((Activity) mOriginalWindowCallback, mOverlayActionBar); + } else if (mOriginalWindowCallback instanceof Dialog) { + ab = new WindowDecorActionBar((Dialog) mOriginalWindowCallback); + } + if (ab != null) { + ab.setDefaultDisplayHomeAsUpEnabled(mEnableDefaultActionBarUp); + } + return ab; + } + + @Override + public void setSupportActionBar(Toolbar toolbar) { + if (!(mOriginalWindowCallback instanceof Activity)) { + // Only Activities support custom Action Bars + return; + } + + final ActionBar ab = getSupportActionBar(); + if (ab instanceof WindowDecorActionBar) { + throw new IllegalStateException("This Activity already has an action bar supplied " + + "by the window decor. Do not request Window.FEATURE_ACTION_BAR and set " + + "windowActionBar to false in your theme to use a Toolbar instead."); + } + + ToolbarActionBar tbab = new ToolbarActionBar(toolbar, ((Activity) mContext).getTitle(), + mWindow); + setSupportActionBar(tbab); + mWindow.setCallback(tbab.getWrappedWindowCallback()); + tbab.invalidateOptionsMenu(); + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + // If this is called before sub-decor is installed, ActionBar will not + // be properly initialized. + if (mHasActionBar && mSubDecorInstalled) { + // Note: The action bar will need to access + // view changes from superclass. + ActionBar ab = getSupportActionBar(); + if (ab != null) { + ab.onConfigurationChanged(newConfig); + } + } + } + + @Override + public void onStop() { + ActionBar ab = getSupportActionBar(); + if (ab != null) { + ab.setShowHideAnimationEnabled(false); + } + } + + @Override + public void onPostResume() { + ActionBar ab = getSupportActionBar(); + if (ab != null) { + ab.setShowHideAnimationEnabled(true); + } + } + + @Override + public void setContentView(View v) { + ensureSubDecor(); + ViewGroup contentParent = (ViewGroup) mSubDecor.findViewById(android.R.id.content); + contentParent.removeAllViews(); + contentParent.addView(v); + mOriginalWindowCallback.onContentChanged(); + } + + @Override + public void setContentView(int resId) { + ensureSubDecor(); + ViewGroup contentParent = (ViewGroup) mSubDecor.findViewById(android.R.id.content); + contentParent.removeAllViews(); + LayoutInflater.from(mContext).inflate(resId, contentParent); + mOriginalWindowCallback.onContentChanged(); + } + + @Override + public void setContentView(View v, ViewGroup.LayoutParams lp) { + ensureSubDecor(); + ViewGroup contentParent = (ViewGroup) mSubDecor.findViewById(android.R.id.content); + contentParent.removeAllViews(); + contentParent.addView(v, lp); + mOriginalWindowCallback.onContentChanged(); + } + + @Override + public void addContentView(View v, ViewGroup.LayoutParams lp) { + ensureSubDecor(); + ViewGroup contentParent = (ViewGroup) mSubDecor.findViewById(android.R.id.content); + contentParent.addView(v, lp); + mOriginalWindowCallback.onContentChanged(); + } + + private void ensureSubDecor() { + if (!mSubDecorInstalled) { + final LayoutInflater inflater = LayoutInflater.from(mContext); + + if (!mWindowNoTitle) { + if (mIsFloating) { + // If we're floating, inflate the dialog title decor + mSubDecor = (ViewGroup) inflater.inflate( + R.layout.abc_dialog_title_material, null); + } else if (mHasActionBar) { + /** + * This needs some explanation. As we can not use the android:theme attribute + * pre-L, we emulate it by manually creating a LayoutInflater using a + * ContextThemeWrapper pointing to actionBarTheme. + */ + TypedValue outValue = new TypedValue(); + mContext.getTheme().resolveAttribute(R.attr.actionBarTheme, outValue, true); + + Context themedContext; + if (outValue.resourceId != 0) { + themedContext = new ContextThemeWrapper(mContext, outValue.resourceId); + } else { + themedContext = mContext; + } + + // Now inflate the view using the themed context and set it as the content view + mSubDecor = (ViewGroup) LayoutInflater.from(themedContext) + .inflate(R.layout.abc_screen_toolbar, null); + + mDecorContentParent = (DecorContentParent) mSubDecor + .findViewById(R.id.decor_content_parent); + mDecorContentParent.setWindowCallback(getWindowCallback()); + + /** + * Propagate features to DecorContentParent + */ + if (mOverlayActionBar) { + mDecorContentParent.initFeature(FEATURE_ACTION_BAR_OVERLAY); + } + if (mFeatureProgress) { + mDecorContentParent.initFeature(Window.FEATURE_PROGRESS); + } + if (mFeatureIndeterminateProgress) { + mDecorContentParent.initFeature(Window.FEATURE_INDETERMINATE_PROGRESS); + } + } + } else { + if (mOverlayActionMode) { + mSubDecor = (ViewGroup) inflater.inflate( + R.layout.abc_screen_simple_overlay_action_mode, null); + } else { + mSubDecor = (ViewGroup) inflater.inflate(R.layout.abc_screen_simple, null); + } + + if (Build.VERSION.SDK_INT >= 21) { + // If we're running on L or above, we can rely on ViewCompat's + // setOnApplyWindowInsetsListener + ViewCompat.setOnApplyWindowInsetsListener(mSubDecor, + new OnApplyWindowInsetsListener() { + @Override + public WindowInsetsCompat onApplyWindowInsets(View v, + WindowInsetsCompat insets) { + final int top = insets.getSystemWindowInsetTop(); + final int newTop = updateStatusGuard(top); + + if (top != newTop) { + insets = insets.replaceSystemWindowInsets( + insets.getSystemWindowInsetLeft(), + newTop, + insets.getSystemWindowInsetRight(), + insets.getSystemWindowInsetBottom()); + } + + // Now apply the insets on our view + return ViewCompat.onApplyWindowInsets(v, insets); + } + }); + } else { + // Else, we need to use our own FitWindowsViewGroup handling + ((FitWindowsViewGroup) mSubDecor).setOnFitSystemWindowsListener( + new FitWindowsViewGroup.OnFitSystemWindowsListener() { + @Override + public void onFitSystemWindows(Rect insets) { + insets.top = updateStatusGuard(insets.top); + } + }); + } + } + + if (mSubDecor == null) { + throw new IllegalArgumentException( + "AppCompat does not support the current theme features"); + } + + if (mDecorContentParent == null) { + mTitleView = (TextView) mSubDecor.findViewById(R.id.title); + } + + // Make the decor optionally fit system windows, like the window's decor + ViewUtils.makeOptionalFitsSystemWindows(mSubDecor); + + final ViewGroup decorContent = (ViewGroup) mWindow.findViewById(android.R.id.content); + final ViewGroup abcContent = (ViewGroup) mSubDecor.findViewById( + R.id.action_bar_activity_content); + + // There might be Views already added to the Window's content view so we need to + // migrate them to our content view + while (decorContent.getChildCount() > 0) { + final View child = decorContent.getChildAt(0); + decorContent.removeViewAt(0); + abcContent.addView(child); + } + + // Now set the Window's content view with the decor + mWindow.setContentView(mSubDecor); + + // Change our content FrameLayout to use the android.R.id.content id. + // Useful for fragments. + decorContent.setId(View.NO_ID); + abcContent.setId(android.R.id.content); + + // The decorContent may have a foreground drawable set (windowContentOverlay). + // Remove this as we handle it ourselves + if (decorContent instanceof FrameLayout) { + ((FrameLayout) decorContent).setForeground(null); + } + + // If a title was set before we installed the decor, propogate it now + CharSequence title = getTitle(); + if (!TextUtils.isEmpty(title)) { + onTitleChanged(title); + } + + applyFixedSizeWindow(); + + onSubDecorInstalled(mSubDecor); + + mSubDecorInstalled = true; + + // Invalidate if the panel menu hasn't been created before this. + // Panel menu invalidation is deferred avoiding application onCreateOptionsMenu + // being called in the middle of onCreate or similar. + // A pending invalidation will typically be resolved before the posted message + // would run normally in order to satisfy instance state restoration. + PanelFeatureState st = getPanelState(FEATURE_OPTIONS_PANEL, false); + if (!isDestroyed() && (st == null || st.menu == null)) { + invalidatePanelMenu(FEATURE_ACTION_BAR); + } + } + } + + void onSubDecorInstalled(ViewGroup subDecor) {} + + private void applyFixedSizeWindow() { + TypedArray a = mContext.obtainStyledAttributes(R.styleable.Theme); + + TypedValue mFixedWidthMajor = null; + TypedValue mFixedWidthMinor = null; + TypedValue mFixedHeightMajor = null; + TypedValue mFixedHeightMinor = null; + + if (a.hasValue(R.styleable.Theme_windowFixedWidthMajor)) { + if (mFixedWidthMajor == null) mFixedWidthMajor = new TypedValue(); + a.getValue(R.styleable.Theme_windowFixedWidthMajor, mFixedWidthMajor); + } + if (a.hasValue(R.styleable.Theme_windowFixedWidthMinor)) { + if (mFixedWidthMinor == null) mFixedWidthMinor = new TypedValue(); + a.getValue(R.styleable.Theme_windowFixedWidthMinor, mFixedWidthMinor); + } + if (a.hasValue(R.styleable.Theme_windowFixedHeightMajor)) { + if (mFixedHeightMajor == null) mFixedHeightMajor = new TypedValue(); + a.getValue(R.styleable.Theme_windowFixedHeightMajor, mFixedHeightMajor); + } + if (a.hasValue(R.styleable.Theme_windowFixedHeightMinor)) { + if (mFixedHeightMinor == null) mFixedHeightMinor = new TypedValue(); + a.getValue(R.styleable.Theme_windowFixedHeightMinor, mFixedHeightMinor); + } + + final DisplayMetrics metrics = mContext.getResources().getDisplayMetrics(); + final boolean isPortrait = metrics.widthPixels < metrics.heightPixels; + int w = ViewGroup.LayoutParams.MATCH_PARENT; + int h = ViewGroup.LayoutParams.MATCH_PARENT; + + final TypedValue tvw = isPortrait ? mFixedWidthMinor : mFixedWidthMajor; + if (tvw != null && tvw.type != TypedValue.TYPE_NULL) { + 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); + } + } + + final TypedValue tvh = isPortrait ? mFixedHeightMajor : mFixedHeightMinor; + if (tvh != null && tvh.type != TypedValue.TYPE_NULL) { + 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); + } + } + + if (w != ViewGroup.LayoutParams.MATCH_PARENT || h != ViewGroup.LayoutParams.MATCH_PARENT) { + mWindow.setLayout(w, h); + } + + a.recycle(); + } + + @Override + public boolean requestWindowFeature(int featureId) { + switch (featureId) { + case FEATURE_ACTION_BAR: + throwFeatureRequestIfSubDecorInstalled(); + mHasActionBar = true; + return true; + case FEATURE_ACTION_BAR_OVERLAY: + throwFeatureRequestIfSubDecorInstalled(); + mOverlayActionBar = true; + return true; + case FEATURE_ACTION_MODE_OVERLAY: + throwFeatureRequestIfSubDecorInstalled(); + mOverlayActionMode = true; + return true; + case Window.FEATURE_PROGRESS: + throwFeatureRequestIfSubDecorInstalled(); + mFeatureProgress = true; + return true; + case Window.FEATURE_INDETERMINATE_PROGRESS: + throwFeatureRequestIfSubDecorInstalled(); + mFeatureIndeterminateProgress = true; + return true; + } + + return mWindow.requestFeature(featureId); + } + + @Override + void onTitleChanged(CharSequence title) { + if (mDecorContentParent != null) { + mDecorContentParent.setWindowTitle(title); + } else if (getSupportActionBar() != null) { + getSupportActionBar().setWindowTitle(title); + } else if (mTitleView != null) { + mTitleView.setText(title); + } + } + + @Override + boolean onPanelClosed(final int featureId, Menu menu) { + if (featureId == FEATURE_ACTION_BAR) { + ActionBar ab = getSupportActionBar(); + if (ab != null) { + ab.dispatchMenuVisibilityChanged(false); + } + return true; + } else if (featureId == FEATURE_OPTIONS_PANEL) { + // Make sure that the options panel is closed. This is mainly used when we're using a + // ToolbarActionBar + PanelFeatureState st = getPanelState(featureId, true); + if (st.isOpen) { + closePanel(st, false); + } + } + return false; + } + + @Override + boolean onMenuOpened(final int featureId, Menu menu) { + if (featureId == FEATURE_ACTION_BAR) { + ActionBar ab = getSupportActionBar(); + if (ab != null) { + ab.dispatchMenuVisibilityChanged(true); + } + return true; + } + return false; + } + + @Override + public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) { + final Window.Callback cb = getWindowCallback(); + if (cb != null && !isDestroyed()) { + final PanelFeatureState panel = findMenuPanel(menu.getRootMenu()); + if (panel != null) { + return cb.onMenuItemSelected(panel.featureId, item); + } + } + return false; + } + + @Override + public void onMenuModeChange(MenuBuilder menu) { + reopenMenu(menu, true); + } + + @Override + public ActionMode startSupportActionMode(ActionMode.Callback callback) { + if (callback == null) { + throw new IllegalArgumentException("ActionMode callback can not be null."); + } + + if (mActionMode != null) { + mActionMode.finish(); + } + + final ActionMode.Callback wrappedCallback = new ActionModeCallbackWrapper(callback); + + ActionBar ab = getSupportActionBar(); + if (ab != null) { + mActionMode = ab.startActionMode(wrappedCallback); + if (mActionMode != null && mAppCompatCallback != null) { + mAppCompatCallback.onSupportActionModeStarted(mActionMode); + } + } + + if (mActionMode == null) { + // If the action bar didn't provide an action mode, start the emulated window one + mActionMode = startSupportActionModeFromWindow(wrappedCallback); + } + + return mActionMode; + } + + @Override + public void invalidateOptionsMenu() { + final ActionBar ab = getSupportActionBar(); + if (ab != null && ab.invalidateOptionsMenu()) return; + + invalidatePanelMenu(FEATURE_OPTIONS_PANEL); + } + + @Override + ActionMode startSupportActionModeFromWindow(ActionMode.Callback callback) { + if (mActionMode != null) { + mActionMode.finish(); + } + + final ActionMode.Callback wrappedCallback = new ActionModeCallbackWrapper(callback); + final Context context = getActionBarThemedContext(); + + if (mActionModeView == null) { + if (mIsFloating) { + mActionModeView = new ActionBarContextView(context); + mActionModePopup = new PopupWindow(context, null, + R.attr.actionModePopupWindowStyle); + mActionModePopup.setContentView(mActionModeView); + mActionModePopup.setWidth(ViewGroup.LayoutParams.MATCH_PARENT); + + TypedValue heightValue = new TypedValue(); + mContext.getTheme().resolveAttribute(R.attr.actionBarSize, heightValue, true); + final int height = TypedValue.complexToDimensionPixelSize(heightValue.data, + mContext.getResources().getDisplayMetrics()); + mActionModeView.setContentHeight(height); + mActionModePopup.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT); + mShowActionModePopup = new Runnable() { + public void run() { + mActionModePopup.showAtLocation( + mActionModeView, + Gravity.TOP | Gravity.FILL_HORIZONTAL, 0, 0); + } + }; + } else { + ViewStubCompat stub = (ViewStubCompat) mSubDecor + .findViewById(R.id.action_mode_bar_stub); + if (stub != null) { + // Set the layout inflater so that it is inflated with the action bar's context + stub.setLayoutInflater(LayoutInflater.from(context)); + mActionModeView = (ActionBarContextView) stub.inflate(); + } + } + } + + if (mActionModeView != null) { + mActionModeView.killMode(); + ActionMode mode = new StandaloneActionMode(context, mActionModeView, wrappedCallback, + mActionModePopup == null); + if (callback.onCreateActionMode(mode, mode.getMenu())) { + mode.invalidate(); + mActionModeView.initForMode(mode); + mActionModeView.setVisibility(View.VISIBLE); + mActionMode = mode; + if (mActionModePopup != null) { + mWindow.getDecorView().post(mShowActionModePopup); + } + mActionModeView.sendAccessibilityEvent( + AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); + + if (mActionModeView.getParent() != null) { + ViewCompat.requestApplyInsets((View) mActionModeView.getParent()); + } + } else { + mActionMode = null; + } + } + if (mActionMode != null && mAppCompatCallback != null) { + mAppCompatCallback.onSupportActionModeStarted(mActionMode); + } + return mActionMode; + } + + boolean onBackPressed() { + // Back cancels action modes first. + if (mActionMode != null) { + mActionMode.finish(); + return true; + } + + // Next collapse any expanded action views. + ActionBar ab = getSupportActionBar(); + if (ab != null && ab.collapseActionView()) { + return true; + } + + // Let the call through... + return false; + } + + @Override + boolean onKeyShortcut(int keyCode, KeyEvent ev) { + // Let the Action Bar have a chance at handling the shortcut + ActionBar ab = getSupportActionBar(); + if (ab != null && ab.onKeyShortcut(keyCode, ev)) { + return true; + } + + // If the panel is already prepared, then perform the shortcut using it. + boolean handled; + if (mPreparedPanel != null) { + handled = performPanelShortcut(mPreparedPanel, ev.getKeyCode(), ev, + Menu.FLAG_PERFORM_NO_CLOSE); + if (handled) { + if (mPreparedPanel != null) { + mPreparedPanel.isHandled = true; + } + return true; + } + } + + // If the panel is not prepared, then we may be trying to handle a shortcut key + // combination such as Control+C. Temporarily prepare the panel then mark it + // unprepared again when finished to ensure that the panel will again be prepared + // the next time it is shown for real. + if (mPreparedPanel == null) { + PanelFeatureState st = getPanelState(FEATURE_OPTIONS_PANEL, true); + preparePanel(st, ev); + handled = performPanelShortcut(st, ev.getKeyCode(), ev, Menu.FLAG_PERFORM_NO_CLOSE); + st.isPrepared = false; + if (handled) { + return true; + } + } + return false; + } + + @Override + boolean dispatchKeyEvent(KeyEvent event) { + final int keyCode = event.getKeyCode(); + final int action = event.getAction(); + final boolean isDown = action == KeyEvent.ACTION_DOWN; + + return isDown ? onKeyDown(keyCode, event) : onKeyUp(keyCode, event); + } + + boolean onKeyUp(int keyCode, KeyEvent event) { + switch (keyCode) { + case KeyEvent.KEYCODE_MENU: + onKeyUpPanel(Window.FEATURE_OPTIONS_PANEL, event); + return true; + case KeyEvent.KEYCODE_BACK: + PanelFeatureState st = getPanelState(Window.FEATURE_OPTIONS_PANEL, false); + if (st != null && st.isOpen) { + closePanel(st, true); + return true; + } + if (onBackPressed()) { + return true; + } + break; + } + return false; + } + + boolean onKeyDown(int keyCode, KeyEvent event) { + switch (keyCode) { + case KeyEvent.KEYCODE_MENU: + onKeyDownPanel(Window.FEATURE_OPTIONS_PANEL, event); + return true; + } + + // On API v7-10 we need to manually call onKeyShortcut() as this is not called + // from the Activity + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { + return onKeyShortcut(keyCode, event); + } + return false; + } + + @Override + public View createView(View parent, final String name, @NonNull Context context, + @NonNull AttributeSet attrs) { + final boolean isPre21 = Build.VERSION.SDK_INT < 21; + + if (mTintViewInflater == null) { + mTintViewInflater = new TintViewInflater(mContext); + } + + // We only want the View to inherit it's context from the parent if it is from the + // apps content, and not part of our sub-decor + final boolean inheritContext = isPre21 && mSubDecorInstalled && parent != null + && parent.getId() != android.R.id.content; + + return mTintViewInflater.createView(parent, name, context, attrs, + inheritContext, isPre21); + } + + @Override + public void installViewFactory() { + LayoutInflater layoutInflater = LayoutInflater.from(mContext); + if (layoutInflater.getFactory() == null) { + LayoutInflaterCompat.setFactory(layoutInflater, this); + } else { + Log.i(TAG, "The Activity's LayoutInflater already has a Factory installed" + + " so we can not install AppCompat's"); + } + } + + /** + * From {@link android.support.v4.view.LayoutInflaterFactory} + */ + @Override + public final View onCreateView(View parent, String name, + Context context, AttributeSet attrs) { + // First let the Activity's Factory try and inflate the view + final View view = callActivityOnCreateView(parent, name, context, attrs); + if (view != null) { + return view; + } + + // If the Factory didn't handle it, let our createView() method try + return createView(parent, name, context, attrs); + } + + View callActivityOnCreateView(View parent, String name, Context context, AttributeSet attrs) { + // Let the Activity's LayoutInflater.Factory try and handle it + if (mOriginalWindowCallback instanceof LayoutInflater.Factory) { + final View result = ((LayoutInflater.Factory) mOriginalWindowCallback) + .onCreateView(name, context, attrs); + if (result != null) { + return result; + } + } + return null; + } + + private void openPanel(final PanelFeatureState st, KeyEvent event) { + // Already open, return + if (st.isOpen || isDestroyed()) { + return; + } + + // Don't open an options panel for honeycomb apps on xlarge devices. + // (The app should be using an action bar for menu items.) + if (st.featureId == FEATURE_OPTIONS_PANEL) { + Context context = mContext; + Configuration config = context.getResources().getConfiguration(); + boolean isXLarge = (config.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == + Configuration.SCREENLAYOUT_SIZE_XLARGE; + boolean isHoneycombApp = context.getApplicationInfo().targetSdkVersion >= + android.os.Build.VERSION_CODES.HONEYCOMB; + + if (isXLarge && isHoneycombApp) { + return; + } + } + + Window.Callback cb = getWindowCallback(); + if ((cb != null) && (!cb.onMenuOpened(st.featureId, st.menu))) { + // Callback doesn't want the menu to open, reset any state + closePanel(st, true); + return; + } + + final WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); + if (wm == null) { + return; + } + + // Prepare panel (should have been done before, but just in case) + if (!preparePanel(st, event)) { + return; + } + + int width = WRAP_CONTENT; + if (st.decorView == null || st.refreshDecorView) { + if (st.decorView == null) { + // Initialize the panel decor, this will populate st.decorView + if (!initializePanelDecor(st) || (st.decorView == null)) + return; + } else if (st.refreshDecorView && (st.decorView.getChildCount() > 0)) { + // Decor needs refreshing, so remove its views + st.decorView.removeAllViews(); + } + + // This will populate st.shownPanelView + if (!initializePanelContent(st) || !st.hasPanelItems()) { + return; + } + + ViewGroup.LayoutParams lp = st.shownPanelView.getLayoutParams(); + if (lp == null) { + lp = new ViewGroup.LayoutParams(WRAP_CONTENT, WRAP_CONTENT); + } + + int backgroundResId = st.background; + st.decorView.setBackgroundResource(backgroundResId); + + ViewParent shownPanelParent = st.shownPanelView.getParent(); + if (shownPanelParent != null && shownPanelParent instanceof ViewGroup) { + ((ViewGroup) shownPanelParent).removeView(st.shownPanelView); + } + st.decorView.addView(st.shownPanelView, lp); + + /* + * Give focus to the view, if it or one of its children does not + * already have it. + */ + if (!st.shownPanelView.hasFocus()) { + st.shownPanelView.requestFocus(); + } + } else if (st.createdPanelView != null) { + // If we already had a panel view, carry width=MATCH_PARENT through + // as we did above when it was created. + ViewGroup.LayoutParams lp = st.createdPanelView.getLayoutParams(); + if (lp != null && lp.width == ViewGroup.LayoutParams.MATCH_PARENT) { + width = MATCH_PARENT; + } + } + + st.isHandled = false; + + WindowManager.LayoutParams lp = new WindowManager.LayoutParams( + width, WRAP_CONTENT, + st.x, st.y, WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL, + WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM + | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH, + PixelFormat.TRANSLUCENT); + + lp.gravity = st.gravity; + lp.windowAnimations = st.windowAnimations; + + wm.addView(st.decorView, lp); + st.isOpen = true; + } + + private boolean initializePanelDecor(PanelFeatureState st) { + st.setStyle(getActionBarThemedContext()); + st.decorView = new ListMenuDecorView(st.listPresenterContext); + st.gravity = Gravity.CENTER | Gravity.BOTTOM; + return true; + } + + private void reopenMenu(MenuBuilder menu, boolean toggleMenuMode) { + if (mDecorContentParent != null && mDecorContentParent.canShowOverflowMenu() && + (!ViewConfigurationCompat.hasPermanentMenuKey(ViewConfiguration.get(mContext)) || + mDecorContentParent.isOverflowMenuShowPending())) { + + final Window.Callback cb = getWindowCallback(); + + if (!mDecorContentParent.isOverflowMenuShowing() || !toggleMenuMode) { + if (cb != null && !isDestroyed()) { + // If we have a menu invalidation pending, do it now. + if (mInvalidatePanelMenuPosted && + (mInvalidatePanelMenuFeatures & (1 << FEATURE_OPTIONS_PANEL)) != 0) { + mWindowDecor.removeCallbacks(mInvalidatePanelMenuRunnable); + mInvalidatePanelMenuRunnable.run(); + } + + final PanelFeatureState st = getPanelState(FEATURE_OPTIONS_PANEL, true); + + // If we don't have a menu or we're waiting for a full content refresh, + // forget it. This is a lingering event that no longer matters. + if (st.menu != null && !st.refreshMenuContent && + cb.onPreparePanel(FEATURE_OPTIONS_PANEL, st.createdPanelView, st.menu)) { + cb.onMenuOpened(FEATURE_ACTION_BAR, st.menu); + mDecorContentParent.showOverflowMenu(); + } + } + } else { + mDecorContentParent.hideOverflowMenu(); + if (!isDestroyed()) { + final PanelFeatureState st = getPanelState(FEATURE_OPTIONS_PANEL, true); + cb.onPanelClosed(FEATURE_ACTION_BAR, st.menu); + } + } + return; + } + + PanelFeatureState st = getPanelState(FEATURE_OPTIONS_PANEL, true); + + st.refreshDecorView = true; + closePanel(st, false); + + openPanel(st, null); + } + + private boolean initializePanelMenu(final PanelFeatureState st) { + Context context = mContext; + + // If we have an action bar, initialize the menu with the right theme. + if ((st.featureId == FEATURE_OPTIONS_PANEL || st.featureId == FEATURE_ACTION_BAR) && + mDecorContentParent != null) { + final TypedValue outValue = new TypedValue(); + final Resources.Theme baseTheme = context.getTheme(); + baseTheme.resolveAttribute(R.attr.actionBarTheme, outValue, true); + + Resources.Theme widgetTheme = null; + if (outValue.resourceId != 0) { + widgetTheme = context.getResources().newTheme(); + widgetTheme.setTo(baseTheme); + widgetTheme.applyStyle(outValue.resourceId, true); + widgetTheme.resolveAttribute( + R.attr.actionBarWidgetTheme, outValue, true); + } else { + baseTheme.resolveAttribute( + R.attr.actionBarWidgetTheme, outValue, true); + } + + if (outValue.resourceId != 0) { + if (widgetTheme == null) { + widgetTheme = context.getResources().newTheme(); + widgetTheme.setTo(baseTheme); + } + widgetTheme.applyStyle(outValue.resourceId, true); + } + + if (widgetTheme != null) { + context = new ContextThemeWrapper(context, 0); + context.getTheme().setTo(widgetTheme); + } + } + + final MenuBuilder menu = new MenuBuilder(context); + menu.setCallback(this); + st.setMenu(menu); + + return true; + } + + private boolean initializePanelContent(PanelFeatureState st) { + if (st.createdPanelView != null) { + st.shownPanelView = st.createdPanelView; + return true; + } + + if (st.menu == null) { + return false; + } + + if (mPanelMenuPresenterCallback == null) { + mPanelMenuPresenterCallback = new PanelMenuPresenterCallback(); + } + + MenuView menuView = st.getListMenuView(mPanelMenuPresenterCallback); + + st.shownPanelView = (View) menuView; + + return st.shownPanelView != null; + } + + private boolean preparePanel(PanelFeatureState st, KeyEvent event) { + if (isDestroyed()) { + return false; + } + + // Already prepared (isPrepared will be reset to false later) + if (st.isPrepared) { + return true; + } + + if ((mPreparedPanel != null) && (mPreparedPanel != st)) { + // Another Panel is prepared and possibly open, so close it + closePanel(mPreparedPanel, false); + } + + final Window.Callback cb = getWindowCallback(); + + if (cb != null) { + st.createdPanelView = cb.onCreatePanelView(st.featureId); + } + + final boolean isActionBarMenu = + (st.featureId == FEATURE_OPTIONS_PANEL || st.featureId == FEATURE_ACTION_BAR); + + if (isActionBarMenu && mDecorContentParent != null) { + // Enforce ordering guarantees around events so that the action bar never + // dispatches menu-related events before the panel is prepared. + mDecorContentParent.setMenuPrepared(); + } + + if (st.createdPanelView == null) { + // Init the panel state's menu--return false if init failed + if (st.menu == null || st.refreshMenuContent) { + if (st.menu == null) { + if (!initializePanelMenu(st) || (st.menu == null)) { + return false; + } + } + + if (isActionBarMenu && mDecorContentParent != null) { + if (mActionMenuPresenterCallback == null) { + mActionMenuPresenterCallback = new ActionMenuPresenterCallback(); + } + mDecorContentParent.setMenu(st.menu, mActionMenuPresenterCallback); + } + + // Creating the panel menu will involve a lot of manipulation; + // don't dispatch change events to presenters until we're done. + st.menu.stopDispatchingItemsChanged(); + if (!cb.onCreatePanelMenu(st.featureId, st.menu)) { + // Ditch the menu created above + st.setMenu(null); + + if (isActionBarMenu && mDecorContentParent != null) { + // Don't show it in the action bar either + mDecorContentParent.setMenu(null, mActionMenuPresenterCallback); + } + + return false; + } + + st.refreshMenuContent = false; + } + + // Preparing the panel menu can involve a lot of manipulation; + // don't dispatch change events to presenters until we're done. + st.menu.stopDispatchingItemsChanged(); + + // Restore action view state before we prepare. This gives apps + // an opportunity to override frozen/restored state in onPrepare. + if (st.frozenActionViewState != null) { + st.menu.restoreActionViewStates(st.frozenActionViewState); + st.frozenActionViewState = null; + } + + // Callback and return if the callback does not want to show the menu + if (!cb.onPreparePanel(FEATURE_OPTIONS_PANEL, st.createdPanelView, st.menu)) { + if (isActionBarMenu && mDecorContentParent != null) { + // The app didn't want to show the menu for now but it still exists. + // Clear it out of the action bar. + mDecorContentParent.setMenu(null, mActionMenuPresenterCallback); + } + st.menu.startDispatchingItemsChanged(); + return false; + } + + // Set the proper keymap + KeyCharacterMap kmap = KeyCharacterMap.load( + event != null ? event.getDeviceId() : KeyCharacterMap.VIRTUAL_KEYBOARD); + st.qwertyMode = kmap.getKeyboardType() != KeyCharacterMap.NUMERIC; + st.menu.setQwertyMode(st.qwertyMode); + st.menu.startDispatchingItemsChanged(); + } + + // Set other state + st.isPrepared = true; + st.isHandled = false; + mPreparedPanel = st; + + return true; + } + + private void checkCloseActionMenu(MenuBuilder menu) { + if (mClosingActionMenu) { + return; + } + + mClosingActionMenu = true; + mDecorContentParent.dismissPopups(); + Window.Callback cb = getWindowCallback(); + if (cb != null && !isDestroyed()) { + cb.onPanelClosed(FEATURE_ACTION_BAR, menu); + } + mClosingActionMenu = false; + } + + private void closePanel(int featureId) { + closePanel(getPanelState(featureId, true), true); + } + + private void closePanel(PanelFeatureState st, boolean doCallback) { + if (doCallback && st.featureId == FEATURE_OPTIONS_PANEL && + mDecorContentParent != null && mDecorContentParent.isOverflowMenuShowing()) { + checkCloseActionMenu(st.menu); + return; + } + + final boolean wasOpen = st.isOpen; + + final WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); + if (wm != null && wasOpen && st.decorView != null) { + wm.removeView(st.decorView); + } + + st.isPrepared = false; + st.isHandled = false; + st.isOpen = false; + + if (wasOpen && doCallback) { + // If the panel was open and we should callback, do so. This should be done after + // isOpen is updated to ensure that we do not get into an infinite recursion + callOnPanelClosed(st.featureId, st, null); + } + + // This view is no longer shown, so null it out + st.shownPanelView = null; + + // Next time the menu opens, it should not be in expanded mode, so + // force a refresh of the decor + st.refreshDecorView = true; + + if (mPreparedPanel == st) { + mPreparedPanel = null; + } + } + + private boolean onKeyDownPanel(int featureId, KeyEvent event) { + if (event.getRepeatCount() == 0) { + PanelFeatureState st = getPanelState(featureId, true); + if (!st.isOpen) { + return preparePanel(st, event); + } + } + + return false; + } + + private void onKeyUpPanel(int featureId, KeyEvent event) { + if (mActionMode != null) { + return; + } + + boolean playSoundEffect = false; + final PanelFeatureState st = getPanelState(featureId, true); + if (featureId == FEATURE_OPTIONS_PANEL && mDecorContentParent != null && + mDecorContentParent.canShowOverflowMenu() && + !ViewConfigurationCompat.hasPermanentMenuKey(ViewConfiguration.get(mContext))) { + if (!mDecorContentParent.isOverflowMenuShowing()) { + if (!isDestroyed() && preparePanel(st, event)) { + playSoundEffect = mDecorContentParent.showOverflowMenu(); + } + } else { + playSoundEffect = mDecorContentParent.hideOverflowMenu(); + } + } else { + if (st.isOpen || st.isHandled) { + + // Play the sound effect if the user closed an open menu (and not if + // they just released a menu shortcut) + playSoundEffect = st.isOpen; + + // Close menu + closePanel(st, true); + + } else if (st.isPrepared) { + boolean show = true; + if (st.refreshMenuContent) { + // Something may have invalidated the menu since we prepared it. + // Re-prepare it to refresh. + st.isPrepared = false; + show = preparePanel(st, event); + } + + if (show) { + // Show menu + openPanel(st, event); + + playSoundEffect = true; + } + } + } + + if (playSoundEffect) { + AudioManager audioManager = (AudioManager) mContext.getSystemService( + Context.AUDIO_SERVICE); + if (audioManager != null) { + audioManager.playSoundEffect(AudioManager.FX_KEY_CLICK); + } else { + Log.w(TAG, "Couldn't get audio manager"); + } + } + } + + private void callOnPanelClosed(int featureId, PanelFeatureState panel, Menu menu) { + // Try to get a menu + if (menu == null) { + // Need a panel to grab the menu, so try to get that + if (panel == null) { + if ((featureId >= 0) && (featureId < mPanels.length)) { + panel = mPanels[featureId]; + } + } + + if (panel != null) { + // menu still may be null, which is okay--we tried our best + menu = panel.menu; + } + } + + // If the panel is not open, do not callback + if ((panel != null) && (!panel.isOpen)) + return; + + Window.Callback cb = getWindowCallback(); + if (cb != null) { + cb.onPanelClosed(featureId, menu); + } + } + + private PanelFeatureState findMenuPanel(Menu menu) { + final PanelFeatureState[] panels = mPanels; + final int N = panels != null ? panels.length : 0; + for (int i = 0; i < N; i++) { + final PanelFeatureState panel = panels[i]; + if (panel != null && panel.menu == menu) { + return panel; + } + } + return null; + } + + private PanelFeatureState getPanelState(int featureId, boolean required) { + PanelFeatureState[] ar; + if ((ar = mPanels) == null || ar.length <= featureId) { + PanelFeatureState[] nar = new PanelFeatureState[featureId + 1]; + if (ar != null) { + System.arraycopy(ar, 0, nar, 0, ar.length); + } + mPanels = ar = nar; + } + + PanelFeatureState st = ar[featureId]; + if (st == null) { + ar[featureId] = st = new PanelFeatureState(featureId); + } + return st; + } + + private boolean performPanelShortcut(PanelFeatureState st, int keyCode, KeyEvent event, + int flags) { + if (event.isSystem()) { + return false; + } + + boolean handled = false; + + // Only try to perform menu shortcuts if preparePanel returned true (possible false + // return value from application not wanting to show the menu). + if ((st.isPrepared || preparePanel(st, event)) && st.menu != null) { + // The menu is prepared now, perform the shortcut on it + handled = st.menu.performShortcut(keyCode, event, flags); + } + + if (handled) { + // Only close down the menu if we don't have an action bar keeping it open. + if ((flags & Menu.FLAG_PERFORM_NO_CLOSE) == 0 && mDecorContentParent == null) { + closePanel(st, true); + } + } + + return handled; + } + + private void invalidatePanelMenu(int featureId) { + mInvalidatePanelMenuFeatures |= 1 << featureId; + + if (!mInvalidatePanelMenuPosted && mWindowDecor != null) { + ViewCompat.postOnAnimation(mWindowDecor, mInvalidatePanelMenuRunnable); + mInvalidatePanelMenuPosted = true; + } + } + + private void doInvalidatePanelMenu(int featureId) { + PanelFeatureState st = getPanelState(featureId, true); + Bundle savedActionViewStates = null; + if (st.menu != null) { + savedActionViewStates = new Bundle(); + st.menu.saveActionViewStates(savedActionViewStates); + if (savedActionViewStates.size() > 0) { + st.frozenActionViewState = savedActionViewStates; + } + // This will be started again when the panel is prepared. + st.menu.stopDispatchingItemsChanged(); + st.menu.clear(); + } + st.refreshMenuContent = true; + st.refreshDecorView = true; + + // Prepare the options panel if we have an action bar + if ((featureId == FEATURE_ACTION_BAR || featureId == FEATURE_OPTIONS_PANEL) + && mDecorContentParent != null) { + st = getPanelState(Window.FEATURE_OPTIONS_PANEL, false); + if (st != null) { + st.isPrepared = false; + preparePanel(st, null); + } + } + } + + /** + * Updates the status bar guard + * + * @param insetTop the current top system window inset + * @return the new top system window inset + */ + private int updateStatusGuard(int insetTop) { + boolean showStatusGuard = false; + // Show the status guard when the non-overlay contextual action bar is showing + if (mActionModeView != null) { + if (mActionModeView.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) { + ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams) + mActionModeView.getLayoutParams(); + boolean mlpChanged = false; + + if (mActionModeView.isShown()) { + if (mTempRect1 == null) { + mTempRect1 = new Rect(); + mTempRect2 = new Rect(); + } + final Rect insets = mTempRect1; + final Rect localInsets = mTempRect2; + insets.set(0, insetTop, 0, 0); + + ViewUtils.computeFitSystemWindows(mSubDecor, insets, localInsets); + final int newMargin = localInsets.top == 0 ? insetTop : 0; + if (mlp.topMargin != newMargin) { + mlpChanged = true; + mlp.topMargin = insetTop; + + if (mStatusGuard == null) { + mStatusGuard = new View(mContext); + mStatusGuard.setBackgroundColor(mContext.getResources() + .getColor(R.color.abc_input_method_navigation_guard)); + mSubDecor.addView(mStatusGuard, -1, + new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, + insetTop)); + } else { + ViewGroup.LayoutParams lp = mStatusGuard.getLayoutParams(); + if (lp.height != insetTop) { + lp.height = insetTop; + mStatusGuard.setLayoutParams(lp); + } + } + } + + // The action mode's theme may differ from the app, so + // always show the status guard above it. + showStatusGuard = mStatusGuard != null; + + // We only need to consume the insets if the action + // mode is overlaid on the app content (e.g. it's + // sitting in a FrameLayout, see + // screen_simple_overlay_action_mode.xml). + if (!mOverlayActionMode && showStatusGuard) { + insetTop = 0; + } + } else { + // reset top margin + if (mlp.topMargin != 0) { + mlpChanged = true; + mlp.topMargin = 0; + } + } + if (mlpChanged) { + mActionModeView.setLayoutParams(mlp); + } + } + } + if (mStatusGuard != null) { + mStatusGuard.setVisibility(showStatusGuard ? View.VISIBLE : View.GONE); + } + + return insetTop; + } + + private void throwFeatureRequestIfSubDecorInstalled() { + if (mSubDecorInstalled) { + throw new AndroidRuntimeException( + "Window feature must be requested before adding content"); + } + } + + ViewGroup getSubDecor() { + return mSubDecor; + } + + /** + * Clears out internal reference when the action mode is destroyed. + */ + private class ActionModeCallbackWrapper implements ActionMode.Callback { + private 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 (mActionModePopup != null) { + mWindow.getDecorView().removeCallbacks(mShowActionModePopup); + mActionModePopup.dismiss(); + } else if (mActionModeView != null) { + mActionModeView.setVisibility(View.GONE); + if (mActionModeView.getParent() != null) { + ViewCompat.requestApplyInsets((View) mActionModeView.getParent()); + } + } + if (mActionModeView != null) { + mActionModeView.removeAllViews(); + } + if (mAppCompatCallback != null) { + mAppCompatCallback.onSupportActionModeFinished(mActionMode); + } + mActionMode = null; + } + } + + private final class PanelMenuPresenterCallback implements MenuPresenter.Callback { + @Override + public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { + final Menu parentMenu = menu.getRootMenu(); + final boolean isSubMenu = parentMenu != menu; + final PanelFeatureState panel = findMenuPanel(isSubMenu ? parentMenu : menu); + if (panel != null) { + if (isSubMenu) { + callOnPanelClosed(panel.featureId, panel, parentMenu); + closePanel(panel, true); + } else { + // Close the panel and only do the callback if the menu is being + // closed completely, not if opening a sub menu + closePanel(panel, allMenusAreClosing); + } + } + } + + @Override + public boolean onOpenSubMenu(MenuBuilder subMenu) { + if (subMenu == null && mHasActionBar) { + Window.Callback cb = getWindowCallback(); + if (cb != null && !isDestroyed()) { + cb.onMenuOpened(FEATURE_ACTION_BAR, subMenu); + } + } + return true; + } + } + + private final class ActionMenuPresenterCallback implements MenuPresenter.Callback { + @Override + public boolean onOpenSubMenu(MenuBuilder subMenu) { + Window.Callback cb = getWindowCallback(); + if (cb != null) { + cb.onMenuOpened(FEATURE_ACTION_BAR, subMenu); + } + return true; + } + + @Override + public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { + checkCloseActionMenu(menu); + } + } + + private static final class PanelFeatureState { + + /** Feature ID for this panel. */ + int featureId; + + int background; + + int gravity; + + int x; + + int y; + + int windowAnimations; + + /** Dynamic state of the panel. */ + ViewGroup decorView; + + /** The panel that we are actually showing. */ + View shownPanelView; + + /** The panel that was returned by onCreatePanelView(). */ + View createdPanelView; + + /** Use {@link #setMenu} to set this. */ + MenuBuilder menu; + + ListMenuPresenter listMenuPresenter; + + Context listPresenterContext; + + /** + * Whether the panel has been prepared (see + * {@link #preparePanel}). + */ + boolean isPrepared; + + /** + * Whether an item's action has been performed. This happens in obvious + * scenarios (user clicks on menu item), but can also happen with + * chording menu+(shortcut key). + */ + boolean isHandled; + + boolean isOpen; + + public boolean qwertyMode; + + boolean refreshDecorView; + + boolean refreshMenuContent; + + boolean wasLastOpen; + + /** + * Contains the state of the menu when told to freeze. + */ + Bundle frozenMenuState; + + /** + * Contains the state of associated action views when told to freeze. + * These are saved across invalidations. + */ + Bundle frozenActionViewState; + + PanelFeatureState(int featureId) { + this.featureId = featureId; + + refreshDecorView = false; + } + + public boolean hasPanelItems() { + if (shownPanelView == null) return false; + if (createdPanelView != null) return true; + + return listMenuPresenter.getAdapter().getCount() > 0; + } + + /** + * Unregister and free attached MenuPresenters. They will be recreated as needed. + */ + public void clearMenuPresenters() { + if (menu != null) { + menu.removeMenuPresenter(listMenuPresenter); + } + listMenuPresenter = null; + } + + void setStyle(Context context) { + final TypedValue outValue = new TypedValue(); + final Resources.Theme widgetTheme = context.getResources().newTheme(); + widgetTheme.setTo(context.getTheme()); + + // First apply the actionBarPopupTheme + widgetTheme.resolveAttribute(R.attr.actionBarPopupTheme, outValue, true); + if (outValue.resourceId != 0) { + widgetTheme.applyStyle(outValue.resourceId, true); + } + + // Now apply the panelMenuListTheme + widgetTheme.resolveAttribute(R.attr.panelMenuListTheme, outValue, true); + if (outValue.resourceId != 0) { + widgetTheme.applyStyle(outValue.resourceId, true); + } else { + widgetTheme.applyStyle(R.style.Theme_AppCompat_CompactMenu, true); + } + + context = new ContextThemeWrapper(context, 0); + context.getTheme().setTo(widgetTheme); + + listPresenterContext = context; + + TypedArray a = context.obtainStyledAttributes(R.styleable.Theme); + background = a.getResourceId( + R.styleable.Theme_panelBackground, 0); + windowAnimations = a.getResourceId( + R.styleable.Theme_android_windowAnimationStyle, 0); + a.recycle(); + } + + void setMenu(MenuBuilder menu) { + if (menu == this.menu) return; + + if (this.menu != null) { + this.menu.removeMenuPresenter(listMenuPresenter); + } + this.menu = menu; + if (menu != null) { + if (listMenuPresenter != null) menu.addMenuPresenter(listMenuPresenter); + } + } + + MenuView getListMenuView(MenuPresenter.Callback cb) { + if (menu == null) return null; + + if (listMenuPresenter == null) { + listMenuPresenter = new ListMenuPresenter(listPresenterContext, + R.layout.abc_list_menu_item_layout); + listMenuPresenter.setCallback(cb); + menu.addMenuPresenter(listMenuPresenter); + } + + MenuView result = listMenuPresenter.getMenuView(decorView); + + return result; + } + + Parcelable onSaveInstanceState() { + SavedState savedState = new SavedState(); + savedState.featureId = featureId; + savedState.isOpen = isOpen; + + if (menu != null) { + savedState.menuState = new Bundle(); + menu.savePresenterStates(savedState.menuState); + } + + return savedState; + } + + void onRestoreInstanceState(Parcelable state) { + SavedState savedState = (SavedState) state; + featureId = savedState.featureId; + wasLastOpen = savedState.isOpen; + frozenMenuState = savedState.menuState; + + shownPanelView = null; + decorView = null; + } + + void applyFrozenState() { + if (menu != null && frozenMenuState != null) { + menu.restorePresenterStates(frozenMenuState); + frozenMenuState = null; + } + } + + private static class SavedState implements Parcelable { + int featureId; + boolean isOpen; + Bundle menuState; + + public int describeContents() { + return 0; + } + + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(featureId); + dest.writeInt(isOpen ? 1 : 0); + + if (isOpen) { + dest.writeBundle(menuState); + } + } + + private static SavedState readFromParcel(Parcel source) { + SavedState savedState = new SavedState(); + savedState.featureId = source.readInt(); + savedState.isOpen = source.readInt() == 1; + + if (savedState.isOpen) { + savedState.menuState = source.readBundle(); + } + + return savedState; + } + + public static final Parcelable.Creator CREATOR + = new Parcelable.Creator() { + public SavedState createFromParcel(Parcel in) { + return readFromParcel(in); + } + + public SavedState[] newArray(int size) { + return new SavedState[size]; + } + }; + } + } + + private class ListMenuDecorView extends FrameLayout { + public ListMenuDecorView(Context context) { + super(context); + } + + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + return AppCompatDelegateImplV7.this.dispatchKeyEvent(event); + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent event) { + int action = event.getAction(); + if (action == MotionEvent.ACTION_DOWN) { + int x = (int) event.getX(); + int y = (int) event.getY(); + if (isOutOfBounds(x, y)) { + closePanel(Window.FEATURE_OPTIONS_PANEL); + return true; + } + } + return super.onInterceptTouchEvent(event); + } + + @Override + public void setBackgroundResource(int resid) { + setBackgroundDrawable(TintManager.getDrawable(getContext(), resid)); + } + + private boolean isOutOfBounds(int x, int y) { + return x < -5 || y < -5 || x > (getWidth() + 5) || y > (getHeight() + 5); + } + } + +} diff --git a/android/support/v7/app/AppCompatDialog.java b/android/support/v7/app/AppCompatDialog.java new file mode 100644 index 0000000000..90393425db --- /dev/null +++ b/android/support/v7/app/AppCompatDialog.java @@ -0,0 +1,163 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.app; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.support.annotation.LayoutRes; +import android.support.v7.appcompat.R; +import android.support.v7.view.ActionMode; +import android.util.TypedValue; +import android.view.View; +import android.view.ViewGroup; + +/** + * Base class for AppCompat themed {@link android.app.Dialog}s. + */ +public class AppCompatDialog extends Dialog implements AppCompatCallback { + + private AppCompatDelegate mDelegate; + + public AppCompatDialog(Context context) { + this(context, 0); + } + + public AppCompatDialog(Context context, int theme) { + super(context, getThemeResId(context, theme)); + + // This is a bit weird, but Dialog's are typically created and setup before being shown, + // which means that we can't rely on onCreate() being called before a content view is set. + // To workaround this, we call onCreate(null) in the ctor, and then again as usual in + // onCreate(). + getDelegate().onCreate(null); + } + + protected AppCompatDialog(Context context, boolean cancelable, + OnCancelListener cancelListener) { + super(context, cancelable, cancelListener); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + getDelegate().installViewFactory(); + super.onCreate(savedInstanceState); + getDelegate().onCreate(savedInstanceState); + } + + /** + * Support library version of {@link android.app.Dialog#getActionBar}. + * + *

      Retrieve a reference to this dialog's ActionBar. + * + * @return The Dialog's ActionBar, or null if it does not have one. + */ + public ActionBar getSupportActionBar() { + return getDelegate().getSupportActionBar(); + } + + @Override + public void setContentView(@LayoutRes int layoutResID) { + getDelegate().setContentView(layoutResID); + } + + @Override + public void setContentView(View view) { + getDelegate().setContentView(view); + } + + @Override + public void setContentView(View view, ViewGroup.LayoutParams params) { + getDelegate().setContentView(view, params); + } + + @Override + public void setTitle(CharSequence title) { + super.setTitle(title); + getDelegate().setTitle(title); + } + + @Override + public void setTitle(int titleId) { + super.setTitle(titleId); + getDelegate().setTitle(getContext().getString(titleId)); + } + + @Override + public void addContentView(View view, ViewGroup.LayoutParams params) { + getDelegate().addContentView(view, params); + } + + @Override + protected void onStop() { + super.onStop(); + getDelegate().onStop(); + } + + /** + * Enable extended support library window features. + *

      + * This is a convenience for calling + * {@link android.view.Window#requestFeature getWindow().requestFeature()}. + *

      + * + * @param featureId The desired feature as defined in {@link android.view.Window} or + * {@link android.support.v4.view.WindowCompat}. + * @return Returns true if the requested feature is supported and now enabled. + * + * @see android.app.Dialog#requestWindowFeature + * @see android.view.Window#requestFeature + */ + public boolean supportRequestWindowFeature(int featureId) { + return getDelegate().requestWindowFeature(featureId); + } + + /** + * @hide + */ + public void invalidateOptionsMenu() { + getDelegate().invalidateOptionsMenu(); + } + + /** + * @return The {@link AppCompatDelegate} being used by this Dialog. + */ + public AppCompatDelegate getDelegate() { + if (mDelegate == null) { + mDelegate = AppCompatDelegate.create(this, this); + } + return mDelegate; + } + + private static int getThemeResId(Context context, int themeId) { + if (themeId == 0) { + // If the provided theme is 0, then retrieve the dialogTheme from our theme + TypedValue outValue = new TypedValue(); + context.getTheme().resolveAttribute(R.attr.dialogTheme, outValue, true); + themeId = outValue.resourceId; + } + return themeId; + } + + @Override + public void onSupportActionModeStarted(ActionMode mode) { + } + + @Override + public void onSupportActionModeFinished(ActionMode mode) { + } +} diff --git a/android/support/v7/app/DrawerArrowDrawable.java b/android/support/v7/app/DrawerArrowDrawable.java new file mode 100644 index 0000000000..06bb360232 --- /dev/null +++ b/android/support/v7/app/DrawerArrowDrawable.java @@ -0,0 +1,207 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package android.support.v7.app; + + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.ColorFilter; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.PixelFormat; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.support.v7.appcompat.R; + +/** + * A drawable that can draw a "Drawer hamburger" menu or an Arrow and animate between them. + */ +abstract class DrawerArrowDrawable extends Drawable { + + private final Paint mPaint = new Paint(); + + // The angle in degress that the arrow head is inclined at. + private static final float ARROW_HEAD_ANGLE = (float) Math.toRadians(45); + private final float mBarThickness; + // The length of top and bottom bars when they merge into an arrow + private final float mTopBottomArrowSize; + // The length of middle bar + private final float mBarSize; + // The length of the middle bar when arrow is shaped + private final float mMiddleArrowSize; + // The space between bars when they are parallel + private final float mBarGap; + // Whether bars should spin or not during progress + private final boolean mSpin; + // Use Path instead of canvas operations so that if color has transparency, overlapping sections + // wont look different + private final Path mPath = new Path(); + // The reported intrinsic size of the drawable. + private final int mSize; + // Whether we should mirror animation when animation is reversed. + private boolean mVerticalMirror = false; + // The interpolated version of the original progress + private float mProgress; + // the amount that overlaps w/ bar size when rotation is max + private float mMaxCutForBarSize; + // The distance of arrow's center from top when horizontal + private float mCenterOffset; + + /** + * @param context used to get the configuration for the drawable from + */ + DrawerArrowDrawable(Context context) { + final TypedArray typedArray = context.getTheme() + .obtainStyledAttributes(null, R.styleable.DrawerArrowToggle, + R.attr.drawerArrowStyle, + R.style.Base_Widget_AppCompat_DrawerArrowToggle); + mPaint.setAntiAlias(true); + mPaint.setColor(typedArray.getColor(R.styleable.DrawerArrowToggle_color, 0)); + mSize = typedArray.getDimensionPixelSize(R.styleable.DrawerArrowToggle_drawableSize, 0); + // round this because having this floating may cause bad measurements + mBarSize = Math.round(typedArray.getDimension(R.styleable.DrawerArrowToggle_barSize, 0)); + // round this because having this floating may cause bad measurements + mTopBottomArrowSize = Math.round(typedArray.getDimension( + R.styleable.DrawerArrowToggle_topBottomBarArrowSize, 0)); + mBarThickness = typedArray.getDimension(R.styleable.DrawerArrowToggle_thickness, 0); + // round this because having this floating may cause bad measurements + mBarGap = Math.round(typedArray.getDimension( + R.styleable.DrawerArrowToggle_gapBetweenBars, 0)); + mSpin = typedArray.getBoolean(R.styleable.DrawerArrowToggle_spinBars, true); + mMiddleArrowSize = typedArray + .getDimension(R.styleable.DrawerArrowToggle_middleBarArrowSize, 0); + final int remainingSpace = (int) (mSize - mBarThickness * 3 - mBarGap * 2); + mCenterOffset = (remainingSpace / 4) * 2; //making sure it is a multiple of 2. + mCenterOffset += mBarThickness * 1.5 + mBarGap; + typedArray.recycle(); + + mPaint.setStyle(Paint.Style.STROKE); + mPaint.setStrokeJoin(Paint.Join.MITER); + mPaint.setStrokeCap(Paint.Cap.BUTT); + mPaint.setStrokeWidth(mBarThickness); + + mMaxCutForBarSize = (float) (mBarThickness / 2 * Math.cos(ARROW_HEAD_ANGLE)); + } + + abstract boolean isLayoutRtl(); + + /** + * If set, canvas is flipped when progress reached to end and going back to start. + */ + protected void setVerticalMirror(boolean verticalMirror) { + mVerticalMirror = verticalMirror; + } + + @Override + public void draw(Canvas canvas) { + Rect bounds = getBounds(); + final boolean isRtl = isLayoutRtl(); + // Interpolated widths of arrow bars + final float arrowSize = lerp(mBarSize, mTopBottomArrowSize, mProgress); + final float middleBarSize = lerp(mBarSize, mMiddleArrowSize, mProgress); + // Interpolated size of middle bar + final float middleBarCut = Math.round(lerp(0, mMaxCutForBarSize, mProgress)); + // The rotation of the top and bottom bars (that make the arrow head) + final float rotation = lerp(0, ARROW_HEAD_ANGLE, mProgress); + + // The whole canvas rotates as the transition happens + final float canvasRotate = lerp(isRtl ? 0 : -180, isRtl ? 180 : 0, mProgress); + final float arrowWidth = Math.round(arrowSize * Math.cos(rotation)); + final float arrowHeight = Math.round(arrowSize * Math.sin(rotation)); + + + mPath.rewind(); + final float topBottomBarOffset = lerp(mBarGap + mBarThickness, -mMaxCutForBarSize, + mProgress); + + final float arrowEdge = -middleBarSize / 2; + // draw middle bar + mPath.moveTo(arrowEdge + middleBarCut, 0); + mPath.rLineTo(middleBarSize - middleBarCut * 2, 0); + + // bottom bar + mPath.moveTo(arrowEdge, topBottomBarOffset); + mPath.rLineTo(arrowWidth, arrowHeight); + + // top bar + mPath.moveTo(arrowEdge, -topBottomBarOffset); + mPath.rLineTo(arrowWidth, -arrowHeight); + + mPath.close(); + + canvas.save(); + // Rotate the whole canvas if spinning, if not, rotate it 180 to get + // the arrow pointing the other way for RTL. + canvas.translate(bounds.centerX(), mCenterOffset); + if (mSpin) { + canvas.rotate(canvasRotate * ((mVerticalMirror ^ isRtl) ? -1 : 1)); + } else if (isRtl) { + canvas.rotate(180); + } + canvas.drawPath(mPath, mPaint); + + canvas.restore(); + } + + @Override + public void setAlpha(int i) { + mPaint.setAlpha(i); + } + + // override + public boolean isAutoMirrored() { + // Draws rotated 180 degrees in RTL mode. + return true; + } + + @Override + public void setColorFilter(ColorFilter colorFilter) { + mPaint.setColorFilter(colorFilter); + } + + @Override + public int getIntrinsicHeight() { + return mSize; + } + + @Override + public int getIntrinsicWidth() { + return mSize; + } + + @Override + public int getOpacity() { + return PixelFormat.TRANSLUCENT; + } + + public float getProgress() { + return mProgress; + } + + public void setProgress(float progress) { + mProgress = progress; + invalidateSelf(); + } + + /** + * Linear interpolate between a and b with parameter t. + */ + private static float lerp(float a, float b, float t) { + return a + (b - a) * t; + } +} \ No newline at end of file diff --git a/android/support/v7/graphics/drawable/DrawableWrapper.java b/android/support/v7/graphics/drawable/DrawableWrapper.java new file mode 100644 index 0000000000..b97d07c809 --- /dev/null +++ b/android/support/v7/graphics/drawable/DrawableWrapper.java @@ -0,0 +1,225 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.graphics.drawable; + +import android.content.res.ColorStateList; +import android.graphics.Canvas; +import android.graphics.ColorFilter; +import android.graphics.PorterDuff; +import android.graphics.Rect; +import android.graphics.Region; +import android.graphics.drawable.Drawable; +import android.support.v4.graphics.drawable.DrawableCompat; +import android.view.View; + +/** + * Drawable which delegates all calls to it's wrapped {@link Drawable}. + *

      + * The wrapped {@link Drawable} must be fully released from any {@link View} + * before wrapping, otherwise internal {@link Drawable.Callback} may be dropped. + * + * @hide + */ +public class DrawableWrapper extends Drawable implements Drawable.Callback { + + private Drawable mDrawable; + + public DrawableWrapper(Drawable drawable) { + setWrappedDrawable(drawable); + } + + @Override + public void draw(Canvas canvas) { + mDrawable.draw(canvas); + } + + @Override + protected void onBoundsChange(Rect bounds) { + mDrawable.setBounds(bounds); + } + + @Override + public void setChangingConfigurations(int configs) { + mDrawable.setChangingConfigurations(configs); + } + + @Override + public int getChangingConfigurations() { + return mDrawable.getChangingConfigurations(); + } + + @Override + public void setDither(boolean dither) { + mDrawable.setDither(dither); + } + + @Override + public void setFilterBitmap(boolean filter) { + mDrawable.setFilterBitmap(filter); + } + + @Override + public void setAlpha(int alpha) { + mDrawable.setAlpha(alpha); + } + + @Override + public void setColorFilter(ColorFilter cf) { + mDrawable.setColorFilter(cf); + } + + @Override + public boolean isStateful() { + return mDrawable.isStateful(); + } + + @Override + public boolean setState(final int[] stateSet) { + return mDrawable.setState(stateSet); + } + + @Override + public int[] getState() { + return mDrawable.getState(); + } + + public void jumpToCurrentState() { + DrawableCompat.jumpToCurrentState(mDrawable); + } + + @Override + public Drawable getCurrent() { + return mDrawable.getCurrent(); + } + + @Override + public boolean setVisible(boolean visible, boolean restart) { + return super.setVisible(visible, restart) || mDrawable.setVisible(visible, restart); + } + + @Override + public int getOpacity() { + return mDrawable.getOpacity(); + } + + @Override + public Region getTransparentRegion() { + return mDrawable.getTransparentRegion(); + } + + @Override + public int getIntrinsicWidth() { + return mDrawable.getIntrinsicWidth(); + } + + @Override + public int getIntrinsicHeight() { + return mDrawable.getIntrinsicHeight(); + } + + @Override + public int getMinimumWidth() { + return mDrawable.getMinimumWidth(); + } + + @Override + public int getMinimumHeight() { + return mDrawable.getMinimumHeight(); + } + + @Override + public boolean getPadding(Rect padding) { + return mDrawable.getPadding(padding); + } + + /** + * {@inheritDoc} + */ + public void invalidateDrawable(Drawable who) { + invalidateSelf(); + } + + /** + * {@inheritDoc} + */ + public void scheduleDrawable(Drawable who, Runnable what, long when) { + scheduleSelf(what, when); + } + + /** + * {@inheritDoc} + */ + public void unscheduleDrawable(Drawable who, Runnable what) { + unscheduleSelf(what); + } + + @Override + protected boolean onLevelChange(int level) { + return mDrawable.setLevel(level); + } + + @Override + public void setAutoMirrored(boolean mirrored) { + DrawableCompat.setAutoMirrored(mDrawable, mirrored); + } + + @Override + public boolean isAutoMirrored() { + return DrawableCompat.isAutoMirrored(mDrawable); + } + + @Override + public void setTint(int tint) { + DrawableCompat.setTint(mDrawable, tint); + } + + @Override + public void setTintList(ColorStateList tint) { + DrawableCompat.setTintList(mDrawable, tint); + } + + @Override + public void setTintMode(PorterDuff.Mode tintMode) { + DrawableCompat.setTintMode(mDrawable, tintMode); + } + + @Override + public void setHotspot(float x, float y) { + DrawableCompat.setHotspot(mDrawable, x, y); + } + + @Override + public void setHotspotBounds(int left, int top, int right, int bottom) { + DrawableCompat.setHotspotBounds(mDrawable, left, top, right, bottom); + } + + public Drawable getWrappedDrawable() { + return mDrawable; + } + + public void setWrappedDrawable(Drawable drawable) { + if (mDrawable != null) { + mDrawable.setCallback(null); + } + + mDrawable = drawable; + + if (drawable != null) { + drawable.setCallback(this); + } + } +} diff --git a/android/support/v7/internal/VersionUtils.java b/android/support/v7/internal/VersionUtils.java new file mode 100644 index 0000000000..babd65c8b5 --- /dev/null +++ b/android/support/v7/internal/VersionUtils.java @@ -0,0 +1,16 @@ +package android.support.v7.internal; + +import android.os.Build; + +/** + * @hide + */ +public class VersionUtils { + + private VersionUtils() {} + + public static boolean isAtLeastL() { + return Build.VERSION.SDK_INT >= 21; + } + +} diff --git a/android/support/v7/internal/app/NavItemSelectedListener.java b/android/support/v7/internal/app/NavItemSelectedListener.java new file mode 100644 index 0000000000..189260a5bf --- /dev/null +++ b/android/support/v7/internal/app/NavItemSelectedListener.java @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package android.support.v7.internal.app; + +import android.support.v7.app.ActionBar; +import android.support.v7.internal.widget.AdapterViewCompat; +import android.view.View; + +/** + * Wrapper to adapt the ActionBar.OnNavigationListener in an AdapterView.OnItemSelectedListener + * for use in Spinner widgets. Used by action bar implementations. + * + * @hide + */ +class NavItemSelectedListener implements AdapterViewCompat.OnItemSelectedListener { + private final ActionBar.OnNavigationListener mListener; + + public NavItemSelectedListener(ActionBar.OnNavigationListener listener) { + mListener = listener; + } + + @Override + public void onItemSelected(AdapterViewCompat parent, View view, int position, long id) { + if (mListener != null) { + mListener.onNavigationItemSelected(position, id); + } + } + + @Override + public void onNothingSelected(AdapterViewCompat parent) { + // Do nothing + } +} \ No newline at end of file diff --git a/android/support/v7/internal/app/TintViewInflater.java b/android/support/v7/internal/app/TintViewInflater.java new file mode 100644 index 0000000000..9f59256338 --- /dev/null +++ b/android/support/v7/internal/app/TintViewInflater.java @@ -0,0 +1,156 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.app; + +import android.content.Context; +import android.support.annotation.NonNull; +import android.support.v7.internal.widget.TintAutoCompleteTextView; +import android.support.v7.internal.widget.TintButton; +import android.support.v7.internal.widget.TintCheckBox; +import android.support.v7.internal.widget.TintCheckedTextView; +import android.support.v7.internal.widget.TintEditText; +import android.support.v7.internal.widget.TintMultiAutoCompleteTextView; +import android.support.v7.internal.widget.TintRadioButton; +import android.support.v7.internal.widget.TintRatingBar; +import android.support.v7.internal.widget.TintSpinner; +import android.support.v7.internal.widget.ViewUtils; +import android.util.AttributeSet; +import android.view.InflateException; +import android.view.View; + +import java.lang.reflect.Constructor; +import java.util.HashMap; +import java.util.Map; + +/** + * This class is responsible for manually inflating our tinted widgets which are used on devices + * running {@link android.os.Build.VERSION_CODES#KITKAT KITKAT} or below. As such, this class + * should only be used when running on those devices. + *

      This class two main responsibilities: the first is to 'inject' our tinted views in place of + * the framework versions in layout inflation; the second is backport the {@code android:theme} + * functionality for any inflated widgets. This include theme inheritance from it's parent. + * + * @hide + */ +public class TintViewInflater { + + static final Class[] sConstructorSignature = new Class[] { + Context.class, AttributeSet.class}; + + private static final Map> sConstructorMap = new HashMap<>(); + + private final Context mContext; + private final Object[] mConstructorArgs = new Object[2]; + + public TintViewInflater(Context context) { + mContext = context; + } + + public final View createView(View parent, final String name, @NonNull Context context, + @NonNull AttributeSet attrs, boolean inheritContext, boolean themeContext) { + final Context originalContext = context; + + // We can emulate Lollipop's android:theme attribute propagating down the view hierarchy + // by using the parent's context + if (inheritContext && parent != null) { + context = parent.getContext(); + } + if (themeContext) { + // We then apply the theme on the context, if specified + context = ViewUtils.themifyContext(context, attrs, true, true); + } + + // We need to 'inject' our tint aware Views in place of the standard framework versions + switch (name) { + case "EditText": + return new TintEditText(context, attrs); + case "Spinner": + return new TintSpinner(context, attrs); + case "CheckBox": + return new TintCheckBox(context, attrs); + case "RadioButton": + return new TintRadioButton(context, attrs); + case "CheckedTextView": + return new TintCheckedTextView(context, attrs); + case "AutoCompleteTextView": + return new TintAutoCompleteTextView(context, attrs); + case "MultiAutoCompleteTextView": + return new TintMultiAutoCompleteTextView(context, attrs); + case "RatingBar": + return new TintRatingBar(context, attrs); + case "Button": + return new TintButton(context, attrs); + } + + if (originalContext != context) { + // If the original context does not equal our themed context, then we need to manually + // inflate it using the name so that app:theme takes effect. + return createViewFromTag(context, name, attrs); + } + + return null; + } + + private View createViewFromTag(Context context, String name, AttributeSet attrs) { + if (name.equals("view")) { + name = attrs.getAttributeValue(null, "class"); + } + + try { + mConstructorArgs[0] = context; + mConstructorArgs[1] = attrs; + + if (-1 == name.indexOf('.')) { + // try the android.widget prefix first... + return createView(name, "android.widget."); + } else { + return createView(name, null); + } + } catch (Exception e) { + // We do not want to catch these, lets return null and let the actual LayoutInflater + // try + return null; + } finally { + // Don't retain static reference on context. + mConstructorArgs[0] = null; + mConstructorArgs[1] = null; + } + } + + private View createView(String name, String prefix) + throws ClassNotFoundException, InflateException { + Constructor constructor = sConstructorMap.get(name); + + try { + if (constructor == null) { + // Class not found in the cache, see if it's real, and try to add it + Class clazz = mContext.getClassLoader().loadClass( + prefix != null ? (prefix + name) : name).asSubclass(View.class); + + constructor = clazz.getConstructor(sConstructorSignature); + sConstructorMap.put(name, constructor); + } + constructor.setAccessible(true); + return constructor.newInstance(mConstructorArgs); + } catch (Exception e) { + // We do not want to catch these, lets return null and let the actual LayoutInflater + // try + return null; + } + } + +} diff --git a/android/support/v7/internal/app/ToolbarActionBar.java b/android/support/v7/internal/app/ToolbarActionBar.java new file mode 100644 index 0000000000..9653f42c5d --- /dev/null +++ b/android/support/v7/internal/app/ToolbarActionBar.java @@ -0,0 +1,635 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.app; + +import android.content.Context; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.graphics.drawable.Drawable; +import android.support.annotation.Nullable; +import android.support.v4.view.ViewCompat; +import android.support.v4.view.WindowCompat; +import android.support.v7.app.ActionBar; +import android.support.v7.internal.view.WindowCallbackWrapper; +import android.support.v7.appcompat.R; +import android.support.v7.internal.view.menu.ListMenuPresenter; +import android.support.v7.internal.view.menu.MenuBuilder; +import android.support.v7.internal.view.menu.MenuPresenter; +import android.support.v7.internal.widget.DecorToolbar; +import android.support.v7.internal.widget.ToolbarWidgetWrapper; +import android.support.v7.widget.Toolbar; +import android.util.TypedValue; +import android.view.ContextThemeWrapper; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.Window; +import android.widget.SpinnerAdapter; + +import java.util.ArrayList; + +/** + * @hide + */ +public class ToolbarActionBar extends ActionBar { + private DecorToolbar mDecorToolbar; + private boolean mToolbarMenuPrepared; + private Window.Callback mWindowCallback; + private boolean mMenuCallbackSet; + + private boolean mLastMenuVisibility; + private ArrayList mMenuVisibilityListeners = + new ArrayList(); + + private Window mWindow; + private ListMenuPresenter mListMenuPresenter; + + private final Runnable mMenuInvalidator = new Runnable() { + @Override + public void run() { + populateOptionsMenu(); + } + }; + + private final Toolbar.OnMenuItemClickListener mMenuClicker = + new Toolbar.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + return mWindowCallback.onMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, item); + } + }; + + public ToolbarActionBar(Toolbar toolbar, CharSequence title, Window window) { + mDecorToolbar = new ToolbarWidgetWrapper(toolbar, false); + mWindowCallback = new ToolbarCallbackWrapper(window.getCallback()); + mDecorToolbar.setWindowCallback(mWindowCallback); + toolbar.setOnMenuItemClickListener(mMenuClicker); + mDecorToolbar.setWindowTitle(title); + + mWindow = window; + } + + public Window.Callback getWrappedWindowCallback() { + return mWindowCallback; + } + + @Override + public void setCustomView(View view) { + setCustomView(view, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); + } + + @Override + public void setCustomView(View view, LayoutParams layoutParams) { + view.setLayoutParams(layoutParams); + mDecorToolbar.setCustomView(view); + } + + @Override + public void setCustomView(int resId) { + final LayoutInflater inflater = LayoutInflater.from(mDecorToolbar.getContext()); + setCustomView(inflater.inflate(resId, mDecorToolbar.getViewGroup(), false)); + } + + @Override + public void setIcon(int resId) { + mDecorToolbar.setIcon(resId); + } + + @Override + public void setIcon(Drawable icon) { + mDecorToolbar.setIcon(icon); + } + + @Override + public void setLogo(int resId) { + mDecorToolbar.setLogo(resId); + } + + @Override + public void setLogo(Drawable logo) { + mDecorToolbar.setLogo(logo); + } + + @Override + public void setStackedBackgroundDrawable(Drawable d) { + // This space for rent (do nothing) + } + + @Override + public void setSplitBackgroundDrawable(Drawable d) { + // This space for rent (do nothing) + } + + @Override + public void setHomeButtonEnabled(boolean enabled) { + // If the nav button on a Toolbar is present, it's enabled. No-op. + } + + @Override + public void setElevation(float elevation) { + ViewCompat.setElevation(mDecorToolbar.getViewGroup(), elevation); + } + + @Override + public float getElevation() { + return ViewCompat.getElevation(mDecorToolbar.getViewGroup()); + } + + @Override + public Context getThemedContext() { + return mDecorToolbar.getContext(); + } + + @Override + public boolean isTitleTruncated() { + return super.isTitleTruncated(); + } + + @Override + public void setHomeAsUpIndicator(Drawable indicator) { + mDecorToolbar.setNavigationIcon(indicator); + } + + @Override + public void setHomeAsUpIndicator(int resId) { + mDecorToolbar.setNavigationIcon(resId); + } + + @Override + public void setHomeActionContentDescription(CharSequence description) { + mDecorToolbar.setNavigationContentDescription(description); + } + + @Override + public void setDefaultDisplayHomeAsUpEnabled(boolean enabled) { + // Do nothing + } + + @Override + public void setHomeActionContentDescription(int resId) { + mDecorToolbar.setNavigationContentDescription(resId); + } + + @Override + public void setShowHideAnimationEnabled(boolean enabled) { + // This space for rent; no-op. + } + + @Override + public void onConfigurationChanged(Configuration config) { + super.onConfigurationChanged(config); + } + + @Override + public void setListNavigationCallbacks(SpinnerAdapter adapter, OnNavigationListener callback) { + mDecorToolbar.setDropdownParams(adapter, new NavItemSelectedListener(callback)); + } + + @Override + public void setSelectedNavigationItem(int position) { + switch (mDecorToolbar.getNavigationMode()) { + case NAVIGATION_MODE_LIST: + mDecorToolbar.setDropdownSelectedPosition(position); + break; + default: + throw new IllegalStateException( + "setSelectedNavigationIndex not valid for current navigation mode"); + } + } + + @Override + public int getSelectedNavigationIndex() { + return -1; + } + + @Override + public int getNavigationItemCount() { + return 0; + } + + @Override + public void setTitle(CharSequence title) { + mDecorToolbar.setTitle(title); + } + + @Override + public void setTitle(int resId) { + mDecorToolbar.setTitle(resId != 0 ? mDecorToolbar.getContext().getText(resId) : null); + } + + @Override + public void setWindowTitle(CharSequence title) { + mDecorToolbar.setWindowTitle(title); + } + + @Override + public void setSubtitle(CharSequence subtitle) { + mDecorToolbar.setSubtitle(subtitle); + } + + @Override + public void setSubtitle(int resId) { + mDecorToolbar.setSubtitle(resId != 0 ? mDecorToolbar.getContext().getText(resId) : null); + } + + @Override + public void setDisplayOptions(@DisplayOptions int options) { + setDisplayOptions(options, 0xffffffff); + } + + @Override + public void setDisplayOptions(@DisplayOptions int options, @DisplayOptions int mask) { + final int currentOptions = mDecorToolbar.getDisplayOptions(); + mDecorToolbar.setDisplayOptions(options & mask | currentOptions & ~mask); + } + + @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 setBackgroundDrawable(@Nullable Drawable d) { + mDecorToolbar.setBackgroundDrawable(d); + } + + @Override + public View getCustomView() { + return mDecorToolbar.getCustomView(); + } + + @Override + public CharSequence getTitle() { + return mDecorToolbar.getTitle(); + } + + @Override + public CharSequence getSubtitle() { + return mDecorToolbar.getSubtitle(); + } + + @Override + public int getNavigationMode() { + return NAVIGATION_MODE_STANDARD; + } + + @Override + public void setNavigationMode(@NavigationMode int mode) { + if (mode == ActionBar.NAVIGATION_MODE_TABS) { + throw new IllegalArgumentException("Tabs not supported in this configuration"); + } + mDecorToolbar.setNavigationMode(mode); + } + + @Override + public int getDisplayOptions() { + return mDecorToolbar.getDisplayOptions(); + } + + @Override + public Tab newTab() { + throw new UnsupportedOperationException( + "Tabs are not supported in toolbar action bars"); + } + + @Override + public void addTab(Tab tab) { + throw new UnsupportedOperationException( + "Tabs are not supported in toolbar action bars"); + } + + @Override + public void addTab(Tab tab, boolean setSelected) { + throw new UnsupportedOperationException( + "Tabs are not supported in toolbar action bars"); + } + + @Override + public void addTab(Tab tab, int position) { + throw new UnsupportedOperationException( + "Tabs are not supported in toolbar action bars"); + } + + @Override + public void addTab(Tab tab, int position, boolean setSelected) { + throw new UnsupportedOperationException( + "Tabs are not supported in toolbar action bars"); + } + + @Override + public void removeTab(Tab tab) { + throw new UnsupportedOperationException( + "Tabs are not supported in toolbar action bars"); + } + + @Override + public void removeTabAt(int position) { + throw new UnsupportedOperationException( + "Tabs are not supported in toolbar action bars"); + } + + @Override + public void removeAllTabs() { + throw new UnsupportedOperationException( + "Tabs are not supported in toolbar action bars"); + } + + @Override + public void selectTab(Tab tab) { + throw new UnsupportedOperationException( + "Tabs are not supported in toolbar action bars"); + } + + @Override + public Tab getSelectedTab() { + throw new UnsupportedOperationException( + "Tabs are not supported in toolbar action bars"); + } + + @Override + public Tab getTabAt(int index) { + throw new UnsupportedOperationException( + "Tabs are not supported in toolbar action bars"); + } + + @Override + public int getTabCount() { + return 0; + } + + @Override + public int getHeight() { + return mDecorToolbar.getHeight(); + } + + @Override + public void show() { + // TODO: Consider a better transition for this. + // Right now use no automatic transition so that the app can supply one if desired. + mDecorToolbar.setVisibility(View.VISIBLE); + } + + @Override + public void hide() { + // TODO: Consider a better transition for this. + // Right now use no automatic transition so that the app can supply one if desired. + mDecorToolbar.setVisibility(View.GONE); + } + + @Override + public boolean isShowing() { + return mDecorToolbar.getVisibility() == View.VISIBLE; + } + + @Override + public boolean openOptionsMenu() { + return mDecorToolbar.showOverflowMenu(); + } + + @Override + public boolean invalidateOptionsMenu() { + mDecorToolbar.getViewGroup().removeCallbacks(mMenuInvalidator); + ViewCompat.postOnAnimation(mDecorToolbar.getViewGroup(), mMenuInvalidator); + return true; + } + + @Override + public boolean collapseActionView() { + if (mDecorToolbar.hasExpandedActionView()) { + mDecorToolbar.collapseActionView(); + return true; + } + return false; + } + + void populateOptionsMenu() { + final Menu menu = getMenu(); + final MenuBuilder mb = menu instanceof MenuBuilder ? (MenuBuilder) menu : null; + if (mb != null) { + mb.stopDispatchingItemsChanged(); + } + try { + menu.clear(); + if (!mWindowCallback.onCreatePanelMenu(Window.FEATURE_OPTIONS_PANEL, menu) || + !mWindowCallback.onPreparePanel(Window.FEATURE_OPTIONS_PANEL, null, menu)) { + menu.clear(); + } + } finally { + if (mb != null) { + mb.startDispatchingItemsChanged(); + } + } + } + + @Override + public boolean onMenuKeyEvent(KeyEvent event) { + if (event.getAction() == KeyEvent.ACTION_UP) { + openOptionsMenu(); + } + return true; + } + + @Override + public boolean onKeyShortcut(int keyCode, KeyEvent ev) { + Menu menu = getMenu(); + return menu != null ? menu.performShortcut(keyCode, ev, 0) : false; + } + + 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); + } + } + + private View getListMenuView(Menu menu) { + ensureListMenuPresenter(menu); + + if (menu == null || mListMenuPresenter == null) { + return null; + } + + if (mListMenuPresenter.getAdapter().getCount() > 0) { + return (View) mListMenuPresenter.getMenuView(mDecorToolbar.getViewGroup()); + } + return null; + } + + private void ensureListMenuPresenter(Menu menu) { + if (mListMenuPresenter == null && (menu instanceof MenuBuilder)) { + MenuBuilder mb = (MenuBuilder) menu; + + Context context = mDecorToolbar.getContext(); + final TypedValue outValue = new TypedValue(); + final Resources.Theme widgetTheme = context.getResources().newTheme(); + widgetTheme.setTo(context.getTheme()); + + // Apply the panelMenuListTheme + widgetTheme.resolveAttribute(R.attr.panelMenuListTheme, outValue, true); + if (outValue.resourceId != 0) { + widgetTheme.applyStyle(outValue.resourceId, true); + } else { + widgetTheme.applyStyle(R.style.Theme_AppCompat_CompactMenu, true); + } + + context = new ContextThemeWrapper(context, 0); + context.getTheme().setTo(widgetTheme); + + // Finally create the list menu presenter + mListMenuPresenter = new ListMenuPresenter(context, R.layout.abc_list_menu_item_layout); + mListMenuPresenter.setCallback(new PanelMenuPresenterCallback()); + mb.addMenuPresenter(mListMenuPresenter); + } + } + + private class ToolbarCallbackWrapper extends WindowCallbackWrapper { + public ToolbarCallbackWrapper(Window.Callback wrapped) { + super(wrapped); + } + + @Override + public boolean onPreparePanel(int featureId, View view, Menu menu) { + final boolean result = super.onPreparePanel(featureId, view, menu); + if (result && !mToolbarMenuPrepared) { + mDecorToolbar.setMenuPrepared(); + mToolbarMenuPrepared = true; + } + return result; + } + + @Override + public View onCreatePanelView(int featureId) { + switch (featureId) { + case Window.FEATURE_OPTIONS_PANEL: + final Menu menu = mDecorToolbar.getMenu(); + if (onPreparePanel(featureId, null, menu) && onMenuOpened(featureId, menu)) { + return getListMenuView(menu); + } + break; + } + return super.onCreatePanelView(featureId); + } + } + + private Menu getMenu() { + if (!mMenuCallbackSet) { + mDecorToolbar.setMenuCallbacks(new ActionMenuPresenterCallback(), + new MenuBuilderCallback()); + mMenuCallbackSet = true; + } + return mDecorToolbar.getMenu(); + } + + private final class ActionMenuPresenterCallback implements MenuPresenter.Callback { + private boolean mClosingActionMenu; + + @Override + public boolean onOpenSubMenu(MenuBuilder subMenu) { + if (mWindowCallback != null) { + mWindowCallback.onMenuOpened(WindowCompat.FEATURE_ACTION_BAR, subMenu); + return true; + } + return false; + } + + @Override + public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { + if (mClosingActionMenu) { + return; + } + + mClosingActionMenu = true; + mDecorToolbar.dismissPopupMenus(); + if (mWindowCallback != null) { + mWindowCallback.onPanelClosed(WindowCompat.FEATURE_ACTION_BAR, menu); + } + mClosingActionMenu = false; + } + } + + private final class PanelMenuPresenterCallback implements MenuPresenter.Callback { + @Override + public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { + if (mWindowCallback != null) { + mWindowCallback.onPanelClosed(Window.FEATURE_OPTIONS_PANEL, menu); + } + } + + @Override + public boolean onOpenSubMenu(MenuBuilder subMenu) { + if (subMenu == null && mWindowCallback != null) { + mWindowCallback.onMenuOpened(Window.FEATURE_OPTIONS_PANEL, subMenu); + } + return true; + } + } + + private final class MenuBuilderCallback implements MenuBuilder.Callback { + + @Override + public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) { + return false; + } + + @Override + public void onMenuModeChange(MenuBuilder menu) { + if (mWindowCallback != null) { + if (mDecorToolbar.isOverflowMenuShowing()) { + mWindowCallback.onPanelClosed(WindowCompat.FEATURE_ACTION_BAR, menu); + } else if (mWindowCallback.onPreparePanel(Window.FEATURE_OPTIONS_PANEL, + null, menu)) { + mWindowCallback.onMenuOpened(WindowCompat.FEATURE_ACTION_BAR, menu); + } + } + } + } +} diff --git a/android/support/v7/internal/app/WindowDecorActionBar.java b/android/support/v7/internal/app/WindowDecorActionBar.java new file mode 100644 index 0000000000..ef196a40ef --- /dev/null +++ b/android/support/v7/internal/app/WindowDecorActionBar.java @@ -0,0 +1,1369 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.app; + +import android.app.Activity; +import android.app.Dialog; +import android.content.Context; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.support.v4.app.FragmentActivity; +import android.support.v4.app.FragmentTransaction; +import android.support.v4.view.ViewCompat; +import android.support.v4.view.ViewPropertyAnimatorCompat; +import android.support.v4.view.ViewPropertyAnimatorListener; +import android.support.v4.view.ViewPropertyAnimatorListenerAdapter; +import android.support.v4.view.ViewPropertyAnimatorUpdateListener; +import android.support.v7.app.ActionBar; +import android.support.v7.appcompat.R; +import android.support.v7.internal.view.ActionBarPolicy; +import android.support.v7.internal.view.ViewPropertyAnimatorCompatSet; +import android.support.v7.internal.view.SupportMenuInflater; +import android.support.v7.internal.view.menu.MenuBuilder; +import android.support.v7.internal.view.menu.MenuPopupHelper; +import android.support.v7.internal.view.menu.SubMenuBuilder; +import android.support.v7.internal.widget.ActionBarContainer; +import android.support.v7.internal.widget.ActionBarContextView; +import android.support.v7.internal.widget.ActionBarOverlayLayout; +import android.support.v7.internal.widget.DecorToolbar; +import android.support.v7.internal.widget.TintManager; +import android.support.v7.internal.widget.ScrollingTabContainerView; +import android.support.v7.view.ActionMode; +import android.support.v7.widget.Toolbar; +import android.util.TypedValue; +import android.view.ContextThemeWrapper; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewParent; +import android.view.Window; +import android.view.accessibility.AccessibilityEvent; +import android.view.animation.AnimationUtils; +import android.widget.SpinnerAdapter; + +import java.lang.ref.WeakReference; +import java.util.ArrayList; + +/** + * WindowDecorActionBar is the ActionBar implementation used + * by devices of all screen sizes as part of the window decor layout. + * 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. + * + * @hide + */ +public class WindowDecorActionBar extends ActionBar implements + ActionBarOverlayLayout.ActionBarVisibilityCallback { + private static final String TAG = "WindowDecorActionBar"; + + /** + * Only allow show/hide animations on ICS+, as that is what ViewPropertyAnimatorCompat supports + */ + private static final boolean ALLOW_SHOW_HIDE_ANIMATIONS = Build.VERSION.SDK_INT >= 14; + + private Context mContext; + private Context mThemedContext; + private Activity mActivity; + private Dialog mDialog; + + private ActionBarOverlayLayout mOverlayLayout; + private ActionBarContainer mContainerView; + private DecorToolbar mDecorToolbar; + private ActionBarContextView mContextView; + private ActionBarContainer mSplitView; + private View mContentView; + private ScrollingTabContainerView mTabScrollView; + + private ArrayList mTabs = new ArrayList(); + + private TabImpl mSelectedTab; + private int mSavedTabPosition = INVALID_POSITION; + + private boolean mDisplayHomeAsUpSet; + + 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; + + private int mCurWindowVisibility = View.VISIBLE; + + private boolean mContentAnimations = true; + private boolean mHiddenByApp; + private boolean mHiddenBySystem; + private boolean mShowingForMode; + + private boolean mNowShowing = true; + + private ViewPropertyAnimatorCompatSet mCurrentShowAnim; + private boolean mShowHideAnimationEnabled; + boolean mHideOnContentScroll; + + private TintManager mTintManager; + + final ViewPropertyAnimatorListener mHideListener = new ViewPropertyAnimatorListenerAdapter() { + @Override + public void onAnimationEnd(View view) { + if (mContentAnimations && mContentView != null) { + ViewCompat.setTranslationY(mContentView, 0f); + ViewCompat.setTranslationY(mContainerView, 0f); + } + if (mSplitView != null && mContextDisplayMode == CONTEXT_DISPLAY_SPLIT) { + mSplitView.setVisibility(View.GONE); + } + mContainerView.setVisibility(View.GONE); + mContainerView.setTransitioning(false); + mCurrentShowAnim = null; + completeDeferredDestroyActionMode(); + if (mOverlayLayout != null) { + ViewCompat.requestApplyInsets(mOverlayLayout); + } + } + }; + + final ViewPropertyAnimatorListener mShowListener = new ViewPropertyAnimatorListenerAdapter() { + @Override + public void onAnimationEnd(View view) { + mCurrentShowAnim = null; + mContainerView.requestLayout(); + } + }; + + final ViewPropertyAnimatorUpdateListener mUpdateListener = + new ViewPropertyAnimatorUpdateListener() { + @Override + public void onAnimationUpdate(View view) { + final ViewParent parent = mContainerView.getParent(); + ((View) parent).invalidate(); + } + }; + + public WindowDecorActionBar(Activity activity, boolean overlayMode) { + mActivity = activity; + Window window = activity.getWindow(); + View decor = window.getDecorView(); + init(decor); + if (!overlayMode) { + mContentView = decor.findViewById(android.R.id.content); + } + } + + public WindowDecorActionBar(Dialog dialog) { + mDialog = dialog; + init(dialog.getWindow().getDecorView()); + } + + /** + * Only for edit mode. + * @hide + */ + public WindowDecorActionBar(View layout) { + assert layout.isInEditMode(); + init(layout); + } + + private void init(View decor) { + mOverlayLayout = (ActionBarOverlayLayout) decor.findViewById(R.id.decor_content_parent); + if (mOverlayLayout != null) { + mOverlayLayout.setActionBarVisibilityCallback(this); + } + mDecorToolbar = getDecorToolbar(decor.findViewById(R.id.action_bar)); + mContextView = (ActionBarContextView) decor.findViewById( + R.id.action_context_bar); + mContainerView = (ActionBarContainer) decor.findViewById( + R.id.action_bar_container); + + mSplitView = (ActionBarContainer) decor.findViewById(R.id.split_action_bar); + + if (mDecorToolbar == null || mContextView == null || mContainerView == null) { + throw new IllegalStateException(getClass().getSimpleName() + " can only be used " + + "with a compatible window decor layout"); + } + + mContext = mDecorToolbar.getContext(); + mContextDisplayMode = mDecorToolbar.isSplit() ? + CONTEXT_DISPLAY_SPLIT : CONTEXT_DISPLAY_NORMAL; + + // This was initially read from the action bar style + final int current = mDecorToolbar.getDisplayOptions(); + final boolean homeAsUp = (current & DISPLAY_HOME_AS_UP) != 0; + if (homeAsUp) { + mDisplayHomeAsUpSet = true; + } + + ActionBarPolicy abp = ActionBarPolicy.get(mContext); + setHomeButtonEnabled(abp.enableHomeButtonByDefault() || homeAsUp); + setHasEmbeddedTabs(abp.hasEmbeddedTabs()); + + final TypedArray a = mContext.obtainStyledAttributes(null, + R.styleable.ActionBar, + R.attr.actionBarStyle, 0); + if (a.getBoolean(R.styleable.ActionBar_hideOnContentScroll, false)) { + setHideOnContentScrollEnabled(true); + } + final int elevation = a.getDimensionPixelSize(R.styleable.ActionBar_elevation, 0); + if (elevation != 0) { + setElevation(elevation); + } + a.recycle(); + } + + private DecorToolbar getDecorToolbar(View view) { + if (view instanceof DecorToolbar) { + return (DecorToolbar) view; + } else if (view instanceof Toolbar) { + return ((Toolbar) view).getWrapper(); + } else { + throw new IllegalStateException("Can't make a decor toolbar out of " + + view.getClass().getSimpleName()); + } + } + + @Override + public void setElevation(float elevation) { + ViewCompat.setElevation(mContainerView, elevation); + if (mSplitView != null) { + ViewCompat.setElevation(mSplitView, elevation); + } + } + + @Override + public float getElevation() { + return ViewCompat.getElevation(mContainerView); + } + + public void onConfigurationChanged(Configuration newConfig) { + setHasEmbeddedTabs(ActionBarPolicy.get(mContext).hasEmbeddedTabs()); + } + + private void setHasEmbeddedTabs(boolean hasEmbeddedTabs) { + mHasEmbeddedTabs = hasEmbeddedTabs; + // Switch tab layout configuration if needed + if (!mHasEmbeddedTabs) { + mDecorToolbar.setEmbeddedTabView(null); + mContainerView.setTabContainer(mTabScrollView); + } else { + mContainerView.setTabContainer(null); + mDecorToolbar.setEmbeddedTabView(mTabScrollView); + } + final boolean isInTabMode = getNavigationMode() == NAVIGATION_MODE_TABS; + if (mTabScrollView != null) { + if (isInTabMode) { + mTabScrollView.setVisibility(View.VISIBLE); + if (mOverlayLayout != null) { + ViewCompat.requestApplyInsets(mOverlayLayout); + } + } else { + mTabScrollView.setVisibility(View.GONE); + } + } + mDecorToolbar.setCollapsible(!mHasEmbeddedTabs && isInTabMode); + mOverlayLayout.setHasNonEmbeddedTabs(!mHasEmbeddedTabs && isInTabMode); + } + + private void ensureTabsExist() { + if (mTabScrollView != null) { + return; + } + + ScrollingTabContainerView tabScroller = new ScrollingTabContainerView(mContext); + + if (mHasEmbeddedTabs) { + tabScroller.setVisibility(View.VISIBLE); + mDecorToolbar.setEmbeddedTabView(tabScroller); + } else { + if (getNavigationMode() == NAVIGATION_MODE_TABS) { + tabScroller.setVisibility(View.VISIBLE); + if (mOverlayLayout != null) { + ViewCompat.requestApplyInsets(mOverlayLayout); + } + } else { + tabScroller.setVisibility(View.GONE); + } + mContainerView.setTabContainer(tabScroller); + } + mTabScrollView = tabScroller; + } + + void completeDeferredDestroyActionMode() { + if (mDeferredModeDestroyCallback != null) { + mDeferredModeDestroyCallback.onDestroyActionMode(mDeferredDestroyActionMode); + mDeferredDestroyActionMode = null; + mDeferredModeDestroyCallback = null; + } + } + + public void onWindowVisibilityChanged(int visibility) { + mCurWindowVisibility = visibility; + } + + /** + * 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.cancel(); + } + } + + 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, + mDecorToolbar.getViewGroup(), 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) { + mDecorToolbar.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 (mDecorToolbar.getNavigationMode()) { + case NAVIGATION_MODE_TABS: + selectTab(mTabs.get(position)); + break; + case NAVIGATION_MODE_LIST: + mDecorToolbar.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) { + mDecorToolbar.setTitle(title); + } + + @Override + public void setWindowTitle(CharSequence title) { + mDecorToolbar.setWindowTitle(title); + } + + public void setSubtitle(CharSequence subtitle) { + mDecorToolbar.setSubtitle(subtitle); + } + + public void setDisplayOptions(int options) { + if ((options & DISPLAY_HOME_AS_UP) != 0) { + mDisplayHomeAsUpSet = true; + } + mDecorToolbar.setDisplayOptions(options); + } + + public void setDisplayOptions(int options, int mask) { + final int current = mDecorToolbar.getDisplayOptions(); + if ((mask & DISPLAY_HOME_AS_UP) != 0) { + mDisplayHomeAsUpSet = true; + } + mDecorToolbar.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 mDecorToolbar.getCustomView(); + } + + public CharSequence getTitle() { + return mDecorToolbar.getTitle(); + } + + public CharSequence getSubtitle() { + return mDecorToolbar.getSubtitle(); + } + + public int getNavigationMode() { + return mDecorToolbar.getNavigationMode(); + } + + public int getDisplayOptions() { + return mDecorToolbar.getDisplayOptions(); + } + + public ActionMode startActionMode(ActionMode.Callback callback) { + if (mActionMode != null) { + mActionMode.finish(); + } + + mOverlayLayout.setHideOnContentScrollEnabled(false); + mContextView.killMode(); + ActionModeImpl mode = new ActionModeImpl(mContextView.getContext(), callback); + if (mode.dispatchOnCreate()) { + mode.invalidate(); + mContextView.initForMode(mode); + animateToMode(true); + if (mSplitView != null && mContextDisplayMode == CONTEXT_DISPLAY_SPLIT) { + // TODO animate this + if (mSplitView.getVisibility() != View.VISIBLE) { + mSplitView.setVisibility(View.VISIBLE); + if (mOverlayLayout != null) { + ViewCompat.requestApplyInsets(mOverlayLayout); + } + } + } + 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; + } + + final FragmentTransaction trans; + if (mActivity instanceof FragmentActivity && !mDecorToolbar.getViewGroup().isInEditMode()) { + // If we're not in edit mode and our Activity is a FragmentActivity, start a tx + trans = ((FragmentActivity) mActivity).getSupportFragmentManager() + .beginTransaction().disallowAddToBackStack(); + } else { + trans = null; + } + + 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(); + } + + public void enableContentAnimations(boolean enabled) { + mContentAnimations = enabled; + } + + @Override + public void show() { + if (mHiddenByApp) { + mHiddenByApp = false; + updateVisibility(false); + } + } + + private void showForActionMode() { + if (!mShowingForMode) { + mShowingForMode = true; + if (mOverlayLayout != null) { + mOverlayLayout.setShowingForActionMode(true); + } + updateVisibility(false); + } + } + + public void showForSystem() { + if (mHiddenBySystem) { + mHiddenBySystem = false; + updateVisibility(true); + } + } + + @Override + public void hide() { + if (!mHiddenByApp) { + mHiddenByApp = true; + updateVisibility(false); + } + } + + private void hideForActionMode() { + if (mShowingForMode) { + mShowingForMode = false; + if (mOverlayLayout != null) { + mOverlayLayout.setShowingForActionMode(false); + } + updateVisibility(false); + } + } + + public void hideForSystem() { + if (!mHiddenBySystem) { + mHiddenBySystem = true; + updateVisibility(true); + } + } + + @Override + public void setHideOnContentScrollEnabled(boolean hideOnContentScroll) { + if (hideOnContentScroll && !mOverlayLayout.isInOverlayMode()) { + throw new IllegalStateException("Action bar must be in overlay mode " + + "(Window.FEATURE_OVERLAY_ACTION_BAR) to enable hide on content scroll"); + } + mHideOnContentScroll = hideOnContentScroll; + mOverlayLayout.setHideOnContentScrollEnabled(hideOnContentScroll); + } + + @Override + public boolean isHideOnContentScrollEnabled() { + return mOverlayLayout.isHideOnContentScrollEnabled(); + } + + @Override + public int getHideOffset() { + return mOverlayLayout.getActionBarHideOffset(); + } + + @Override + public void setHideOffset(int offset) { + if (offset != 0 && !mOverlayLayout.isInOverlayMode()) { + throw new IllegalStateException("Action bar must be in overlay mode " + + "(Window.FEATURE_OVERLAY_ACTION_BAR) to set a non-zero hide offset"); + } + mOverlayLayout.setActionBarHideOffset(offset); + } + + private static boolean checkShowingFlags(boolean hiddenByApp, boolean hiddenBySystem, + boolean showingForMode) { + if (showingForMode) { + return true; + } else if (hiddenByApp || hiddenBySystem) { + return false; + } else { + return true; + } + } + + private void updateVisibility(boolean fromSystem) { + // Based on the current state, should we be hidden or shown? + final boolean shown = checkShowingFlags(mHiddenByApp, mHiddenBySystem, + mShowingForMode); + + if (shown) { + if (!mNowShowing) { + mNowShowing = true; + doShow(fromSystem); + } + } else { + if (mNowShowing) { + mNowShowing = false; + doHide(fromSystem); + } + } + } + + public void doShow(boolean fromSystem) { + if (mCurrentShowAnim != null) { + mCurrentShowAnim.cancel(); + } + mContainerView.setVisibility(View.VISIBLE); + + if (mCurWindowVisibility == View.VISIBLE && ALLOW_SHOW_HIDE_ANIMATIONS && + (mShowHideAnimationEnabled || fromSystem)) { + // because we're about to ask its window loc + ViewCompat.setTranslationY(mContainerView, 0f); + float startingY = -mContainerView.getHeight(); + if (fromSystem) { + int topLeft[] = {0, 0}; + mContainerView.getLocationInWindow(topLeft); + startingY -= topLeft[1]; + } + ViewCompat.setTranslationY(mContainerView, startingY); + ViewPropertyAnimatorCompatSet anim = new ViewPropertyAnimatorCompatSet(); + ViewPropertyAnimatorCompat a = ViewCompat.animate(mContainerView).translationY(0f); + a.setUpdateListener(mUpdateListener); + anim.play(a); + if (mContentAnimations && mContentView != null) { + ViewCompat.setTranslationY(mContentView, startingY); + anim.play(ViewCompat.animate(mContentView).translationY(0f)); + } + if (mSplitView != null && mContextDisplayMode == CONTEXT_DISPLAY_SPLIT) { + ViewCompat.setTranslationY(mSplitView, mSplitView.getHeight()); + mSplitView.setVisibility(View.VISIBLE); + anim.play(ViewCompat.animate(mSplitView).translationY(0f)); + } + anim.setInterpolator(AnimationUtils.loadInterpolator(mContext, + android.R.anim.decelerate_interpolator)); + anim.setDuration(250); + // If this is being shown from the system, add a small delay. + // This is because we will also be animating in the status bar, + // and these two elements can't be done in lock-step. So we give + // a little time for the status bar to start its animation before + // the action bar animates. (This corresponds to the corresponding + // case when hiding, where the status bar has a small delay before + // starting.) + anim.setListener(mShowListener); + mCurrentShowAnim = anim; + anim.start(); + } else { + ViewCompat.setAlpha(mContainerView, 1f); + ViewCompat.setTranslationY(mContainerView, 0); + if (mContentAnimations && mContentView != null) { + ViewCompat.setTranslationY(mContentView, 0); + } + if (mSplitView != null && mContextDisplayMode == CONTEXT_DISPLAY_SPLIT) { + ViewCompat.setAlpha(mSplitView, 1f); + ViewCompat.setTranslationY(mSplitView, 0); + mSplitView.setVisibility(View.VISIBLE); + } + mShowListener.onAnimationEnd(null); + } + if (mOverlayLayout != null) { + ViewCompat.requestApplyInsets(mOverlayLayout); + } + } + + public void doHide(boolean fromSystem) { + if (mCurrentShowAnim != null) { + mCurrentShowAnim.cancel(); + } + + if (mCurWindowVisibility == View.VISIBLE && ALLOW_SHOW_HIDE_ANIMATIONS && + (mShowHideAnimationEnabled || fromSystem)) { + ViewCompat.setAlpha(mContainerView, 1f); + mContainerView.setTransitioning(true); + ViewPropertyAnimatorCompatSet anim = new ViewPropertyAnimatorCompatSet(); + float endingY = -mContainerView.getHeight(); + if (fromSystem) { + int topLeft[] = {0, 0}; + mContainerView.getLocationInWindow(topLeft); + endingY -= topLeft[1]; + } + ViewPropertyAnimatorCompat a = ViewCompat.animate(mContainerView).translationY(endingY); + a.setUpdateListener(mUpdateListener); + anim.play(a); + if (mContentAnimations && mContentView != null) { + anim.play(ViewCompat.animate(mContentView).translationY(endingY)); + } + if (mSplitView != null && mSplitView.getVisibility() == View.VISIBLE) { + ViewCompat.setAlpha(mSplitView, 1f); + anim.play(ViewCompat.animate(mSplitView).translationY(mSplitView.getHeight())); + } + anim.setInterpolator(AnimationUtils.loadInterpolator(mContext, + android.R.anim.accelerate_interpolator)); + anim.setDuration(250); + anim.setListener(mHideListener); + mCurrentShowAnim = anim; + anim.start(); + } else { + mHideListener.onAnimationEnd(null); + } + } + + public boolean isShowing() { + final int height = getHeight(); + // Take into account the case where the bar has a 0 height due to not being measured yet. + return mNowShowing && (height == 0 || getHideOffset() < height); + } + + public void animateToMode(boolean toActionMode) { + if (toActionMode) { + showForActionMode(); + } else { + hideForActionMode(); + } + + mDecorToolbar.animateToVisibility(toActionMode ? View.GONE : View.VISIBLE); + mContextView.animateToVisibility(toActionMode ? View.VISIBLE : View.GONE); + // mTabScrollView's visibility is not affected by action mode. + } + + 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) { + mThemedContext = new ContextThemeWrapper(mContext, targetThemeRes); + } else { + mThemedContext = mContext; + } + } + return mThemedContext; + } + + @Override + public boolean isTitleTruncated() { + return mDecorToolbar != null && mDecorToolbar.isTitleTruncated(); + } + + @Override + public void setHomeAsUpIndicator(Drawable indicator) { + mDecorToolbar.setNavigationIcon(indicator); + } + + @Override + public void setHomeAsUpIndicator(int resId) { + mDecorToolbar.setNavigationIcon(resId); + } + + @Override + public void setHomeActionContentDescription(CharSequence description) { + mDecorToolbar.setNavigationContentDescription(description); + } + + @Override + public void setHomeActionContentDescription(int resId) { + mDecorToolbar.setNavigationContentDescription(resId); + } + + @Override + public void onContentScrollStarted() { + if (mCurrentShowAnim != null) { + mCurrentShowAnim.cancel(); + mCurrentShowAnim = null; + } + } + + @Override + public void onContentScrollStopped() { + } + + @Override + public boolean collapseActionView() { + if (mDecorToolbar != null && mDecorToolbar.hasExpandedActionView()) { + mDecorToolbar.collapseActionView(); + return true; + } + return false; + } + + /** + * @hide + */ + public class ActionModeImpl extends ActionMode implements MenuBuilder.Callback { + private final Context mActionModeContext; + private final MenuBuilder mMenu; + + private ActionMode.Callback mCallback; + private WeakReference mCustomView; + + public ActionModeImpl(Context context, ActionMode.Callback callback) { + mActionModeContext = context; + mCallback = callback; + mMenu = new MenuBuilder(context) + .setDefaultShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); + mMenu.setCallback(this); + } + + @Override + public MenuInflater getMenuInflater() { + return new SupportMenuInflater(mActionModeContext); + } + + @Override + public Menu getMenu() { + return mMenu; + } + + @Override + public void finish() { + if (mActionMode != this) { + // Not the active action mode - no-op + return; + } + + // If this change in state is going to cause the action bar + // to be hidden, 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 (!checkShowingFlags(mHiddenByApp, mHiddenBySystem, false)) { + // With the current state but the action bar hidden, our + // overall showing state is going to be false. + mDeferredDestroyActionMode = this; + mDeferredModeDestroyCallback = mCallback; + } else { + mCallback.onDestroyActionMode(this); + } + mCallback = null; + animateToMode(false); + + // Clear out the context mode views after the animation finishes + mContextView.closeMode(); + mDecorToolbar.getViewGroup().sendAccessibilityEvent( + AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); + mOverlayLayout.setHideOnContentScrollEnabled(mHideOnContentScroll); + + mActionMode = null; + } + + @Override + public void invalidate() { + if (mActionMode != this) { + // Not the active action mode - no-op. It's possible we are + // currently deferring onDestroy, so the app doesn't yet know we + // are going away and is trying to use us. That's also a no-op. + return; + } + + 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 void setTitleOptionalHint(boolean titleOptional) { + super.setTitleOptionalHint(titleOptional); + mContextView.setTitleOptional(titleOptional); + } + + @Override + public boolean isTitleOptional() { + return mContextView.isTitleOptional(); + } + + @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(getTintManager().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) { + mDecorToolbar.setCustomView(view); + } + + @Override + public void setCustomView(View view, LayoutParams layoutParams) { + view.setLayoutParams(layoutParams); + mDecorToolbar.setCustomView(view); + } + + @Override + public void setListNavigationCallbacks(SpinnerAdapter adapter, OnNavigationListener callback) { + mDecorToolbar.setDropdownParams(adapter, new NavItemSelectedListener(callback)); + } + + @Override + public int getSelectedNavigationIndex() { + switch (mDecorToolbar.getNavigationMode()) { + case NAVIGATION_MODE_TABS: + return mSelectedTab != null ? mSelectedTab.getPosition() : -1; + case NAVIGATION_MODE_LIST: + return mDecorToolbar.getDropdownSelectedPosition(); + default: + return -1; + } + } + + @Override + public int getNavigationItemCount() { + switch (mDecorToolbar.getNavigationMode()) { + case NAVIGATION_MODE_TABS: + return mTabs.size(); + case NAVIGATION_MODE_LIST: + return mDecorToolbar.getDropdownItemCount(); + default: + return 0; + } + } + + @Override + public int getTabCount() { + return mTabs.size(); + } + + @Override + public void setNavigationMode(int mode) { + final int oldMode = mDecorToolbar.getNavigationMode(); + switch (oldMode) { + case NAVIGATION_MODE_TABS: + mSavedTabPosition = getSelectedNavigationIndex(); + selectTab(null); + mTabScrollView.setVisibility(View.GONE); + break; + } + if (oldMode != mode && !mHasEmbeddedTabs) { + if (mOverlayLayout != null) { + ViewCompat.requestApplyInsets(mOverlayLayout); + } + } + mDecorToolbar.setNavigationMode(mode); + switch (mode) { + case NAVIGATION_MODE_TABS: + ensureTabsExist(); + mTabScrollView.setVisibility(View.VISIBLE); + if (mSavedTabPosition != INVALID_POSITION) { + setSelectedNavigationItem(mSavedTabPosition); + mSavedTabPosition = INVALID_POSITION; + } + break; + } + mDecorToolbar.setCollapsible(mode == NAVIGATION_MODE_TABS && !mHasEmbeddedTabs); + mOverlayLayout.setHasNonEmbeddedTabs(mode == NAVIGATION_MODE_TABS && !mHasEmbeddedTabs); + } + + @Override + public Tab getTabAt(int index) { + return mTabs.get(index); + } + + + @Override + public void setIcon(int resId) { + mDecorToolbar.setIcon(resId); + } + + @Override + public void setIcon(Drawable icon) { + mDecorToolbar.setIcon(icon); + } + + public boolean hasIcon() { + return mDecorToolbar.hasIcon(); + } + + @Override + public void setLogo(int resId) { + mDecorToolbar.setLogo(resId); + } + + @Override + public void setLogo(Drawable logo) { + mDecorToolbar.setLogo(logo); + } + + public boolean hasLogo() { + return mDecorToolbar.hasLogo(); + } + + public void setDefaultDisplayHomeAsUpEnabled(boolean enable) { + if (!mDisplayHomeAsUpSet) { + setDisplayHomeAsUpEnabled(enable); + } + } + + TintManager getTintManager() { + if (mTintManager == null) { + mTintManager = new TintManager(mContext); + } + return mTintManager; + } + +} diff --git a/android/support/v7/internal/text/AllCapsTransformationMethod.java b/android/support/v7/internal/text/AllCapsTransformationMethod.java new file mode 100644 index 0000000000..76d1aed398 --- /dev/null +++ b/android/support/v7/internal/text/AllCapsTransformationMethod.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.text; + +import android.content.Context; +import android.graphics.Rect; +import android.text.method.TransformationMethod; +import android.view.View; + +import java.util.Locale; + +/** + * @hide + */ +public class AllCapsTransformationMethod implements TransformationMethod { + private Locale mLocale; + + public AllCapsTransformationMethod(Context context) { + mLocale = context.getResources().getConfiguration().locale; + } + + @Override + public CharSequence getTransformation(CharSequence source, View view) { + return source != null ? source.toString().toUpperCase(mLocale) : null; + } + + @Override + public void onFocusChanged(View view, CharSequence sourceText, boolean focused, + int direction, Rect previouslyFocusedRect) { + } +} \ No newline at end of file diff --git a/android/support/v7/internal/transition/ActionBarTransition.java b/android/support/v7/internal/transition/ActionBarTransition.java new file mode 100644 index 0000000000..bc4ad0451e --- /dev/null +++ b/android/support/v7/internal/transition/ActionBarTransition.java @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package android.support.v7.internal.transition; + +import android.view.ViewGroup; + +/** + * @hide + */ +public class ActionBarTransition { + + private static final boolean TRANSITIONS_ENABLED = false; + + private static final int TRANSITION_DURATION = 120; // ms + +// private static final Transition sTransition; +// +// static { +// if (TRANSITIONS_ENABLED) { +//// final ChangeText tc = new ChangeText(); +//// tc.setChangeBehavior(ChangeText.CHANGE_BEHAVIOR_OUT_IN); +// final TransitionSet inner = new TransitionSet(); +// inner.addTransition(new ChangeBounds()); +// final TransitionSet tg = new TransitionSet(); +// tg.addTransition(new Fade(Fade.OUT)).addTransition(inner). +// addTransition(new Fade(Fade.IN)); +// tg.setOrdering(TransitionSet.ORDERING_SEQUENTIAL); +// tg.setDuration(TRANSITION_DURATION); +// sTransition = tg; +// } else { +// sTransition = null; +// } +// } + + public static void beginDelayedTransition(ViewGroup sceneRoot) { +// if (TRANSITIONS_ENABLED) { +// TransitionManager.beginDelayedTransition(sceneRoot, sTransition); +// } + } +} \ No newline at end of file diff --git a/android/support/v7/internal/view/ActionBarPolicy.java b/android/support/v7/internal/view/ActionBarPolicy.java new file mode 100644 index 0000000000..dc5c4f0b7f --- /dev/null +++ b/android/support/v7/internal/view/ActionBarPolicy.java @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.view; + +import android.content.Context; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.os.Build; +import android.support.v4.view.ViewConfigurationCompat; +import android.support.v7.appcompat.R; +import android.view.ViewConfiguration; + +/** + * Allows components to query for various configuration policy decisions about how the action bar + * should lay out and behave on the current device. + * + * @hide + */ +public class ActionBarPolicy { + + private Context mContext; + + public static ActionBarPolicy get(Context context) { + return new ActionBarPolicy(context); + } + + private ActionBarPolicy(Context context) { + mContext = context; + } + + public int getMaxActionButtons() { + return mContext.getResources().getInteger(R.integer.abc_max_action_buttons); + } + + public boolean showsOverflowMenuButton() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + return true; + } else { + return !ViewConfigurationCompat.hasPermanentMenuKey(ViewConfiguration.get(mContext)); + } + } + + public int getEmbeddedMenuWidthLimit() { + return mContext.getResources().getDisplayMetrics().widthPixels / 2; + } + + public boolean hasEmbeddedTabs() { + final int targetSdk = mContext.getApplicationInfo().targetSdkVersion; + if (targetSdk >= Build.VERSION_CODES.JELLY_BEAN) { + return mContext.getResources().getBoolean(R.bool.abc_action_bar_embed_tabs); + } + + // The embedded tabs policy changed in Jellybean; give older apps the old policy + // so they get what they expect. + return mContext.getResources().getBoolean(R.bool.abc_action_bar_embed_tabs_pre_jb); + } + + public int getTabContainerHeight() { + TypedArray a = mContext.obtainStyledAttributes(null, R.styleable.ActionBar, + R.attr.actionBarStyle, 0); + int height = a.getLayoutDimension(R.styleable.ActionBar_height, 0); + Resources r = mContext.getResources(); + if (!hasEmbeddedTabs()) { + // Stacked tabs; limit the height + height = Math.min(height, + r.getDimensionPixelSize(R.dimen.abc_action_bar_stacked_max_height)); + } + a.recycle(); + return height; + } + + public boolean enableHomeButtonByDefault() { + // Older apps get the home button interaction enabled by default. + // Newer apps need to enable it explicitly. + return mContext.getApplicationInfo().targetSdkVersion < + Build.VERSION_CODES.ICE_CREAM_SANDWICH; + } + + public int getStackedTabMaxWidth() { + return mContext.getResources().getDimensionPixelSize( + R.dimen.abc_action_bar_stacked_tab_max_width); + } +} diff --git a/android/support/v7/internal/view/ContextThemeWrapper.java b/android/support/v7/internal/view/ContextThemeWrapper.java new file mode 100644 index 0000000000..e4142035a3 --- /dev/null +++ b/android/support/v7/internal/view/ContextThemeWrapper.java @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.view; + +import android.content.Context; +import android.content.ContextWrapper; +import android.content.res.Resources; +import android.support.v7.appcompat.R; +import android.view.LayoutInflater; + +/** + * A ContextWrapper that allows you to modify the theme from what is in the + * wrapped context. + * + * @hide + */ +public class ContextThemeWrapper extends ContextWrapper { + private int mThemeResource; + private Resources.Theme mTheme; + private LayoutInflater mInflater; + + public ContextThemeWrapper(Context base, int themeres) { + super(base); + mThemeResource = themeres; + } + + @Override + public void setTheme(int resid) { + mThemeResource = resid; + initializeTheme(); + } + + public int getThemeResId() { + return mThemeResource; + } + + @Override + public Resources.Theme getTheme() { + if (mTheme != null) { + return mTheme; + } + + if (mThemeResource == 0) { + mThemeResource = R.style.Theme_AppCompat_Light; + } + initializeTheme(); + + return mTheme; + } + + @Override + public Object getSystemService(String name) { + if (LAYOUT_INFLATER_SERVICE.equals(name)) { + if (mInflater == null) { + mInflater = LayoutInflater.from(getBaseContext()).cloneInContext(this); + } + return mInflater; + } + return getBaseContext().getSystemService(name); + } + + /** + * Called by {@link #setTheme} and {@link #getTheme} to apply a theme + * resource to the current Theme object. Can override to change the + * default (simple) behavior. This method will not be called in multiple + * threads simultaneously. + * + * @param theme The Theme object being modified. + * @param resid The theme style resource being applied to theme. + * @param first Set to true if this is the first time a style is being + * applied to theme. + */ + protected void onApplyThemeResource(Resources.Theme theme, int resid, boolean first) { + theme.applyStyle(resid, true); + } + + private void initializeTheme() { + final boolean first = mTheme == null; + if (first) { + mTheme = getResources().newTheme(); + Resources.Theme theme = getBaseContext().getTheme(); + if (theme != null) { + mTheme.setTo(theme); + } + } + onApplyThemeResource(mTheme, mThemeResource, first); + } +} + diff --git a/android/support/v7/internal/view/StandaloneActionMode.java b/android/support/v7/internal/view/StandaloneActionMode.java new file mode 100644 index 0000000000..7e31988c4c --- /dev/null +++ b/android/support/v7/internal/view/StandaloneActionMode.java @@ -0,0 +1,163 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package android.support.v7.internal.view; + +import android.annotation.TargetApi; +import android.content.Context; +import android.os.Build; +import android.support.v7.internal.view.menu.MenuBuilder; +import android.support.v7.internal.view.menu.MenuPopupHelper; +import android.support.v7.internal.view.menu.SubMenuBuilder; +import android.support.v7.internal.widget.ActionBarContextView; +import android.support.v7.view.ActionMode; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.accessibility.AccessibilityEvent; + +import java.lang.ref.WeakReference; + +/** + * @hide + */ +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 setTitleOptionalHint(boolean titleOptional) { + super.setTitleOptionalHint(titleOptional); + mContextView.setTitleOptional(titleOptional); + } + + @Override + public boolean isTitleOptional() { + return mContextView.isTitleOptional(); + } + + @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; + } +} \ No newline at end of file diff --git a/android/support/v7/internal/view/SupportActionModeWrapper.java b/android/support/v7/internal/view/SupportActionModeWrapper.java new file mode 100644 index 0000000000..029ad977b3 --- /dev/null +++ b/android/support/v7/internal/view/SupportActionModeWrapper.java @@ -0,0 +1,199 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.view; + +import android.annotation.TargetApi; +import android.content.Context; +import android.os.Build; +import android.support.v4.internal.view.SupportMenu; +import android.support.v4.internal.view.SupportMenuItem; +import android.support.v4.util.SimpleArrayMap; +import android.support.v7.internal.view.menu.MenuWrapperFactory; +import android.view.ActionMode; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.View; + +/** + * Wraps a support {@link android.support.v7.view.ActionMode} as a framework + * {@link android.view.ActionMode}. + * + * @hide + */ +@TargetApi(Build.VERSION_CODES.HONEYCOMB) +public class SupportActionModeWrapper extends ActionMode { + + final Context mContext; + final android.support.v7.view.ActionMode mWrappedObject; + + public SupportActionModeWrapper(Context context, + android.support.v7.view.ActionMode supportActionMode) { + mContext = context; + mWrappedObject = supportActionMode; + } + + @Override + public Object getTag() { + return mWrappedObject.getTag(); + } + + @Override + public void setTag(Object tag) { + mWrappedObject.setTag(tag); + } + + @Override + public void setTitle(CharSequence title) { + mWrappedObject.setTitle(title); + } + + @Override + public void setSubtitle(CharSequence subtitle) { + mWrappedObject.setSubtitle(subtitle); + } + + @Override + public void invalidate() { + mWrappedObject.invalidate(); + } + + @Override + public void finish() { + mWrappedObject.finish(); + } + + @Override + public Menu getMenu() { + return MenuWrapperFactory.wrapSupportMenu(mContext, (SupportMenu) mWrappedObject.getMenu()); + } + + @Override + public CharSequence getTitle() { + return mWrappedObject.getTitle(); + } + + @Override + public void setTitle(int resId) { + mWrappedObject.setTitle(resId); + } + + @Override + public CharSequence getSubtitle() { + return mWrappedObject.getSubtitle(); + } + + @Override + public void setSubtitle(int resId) { + mWrappedObject.setSubtitle(resId); + } + + @Override + public View getCustomView() { + return mWrappedObject.getCustomView(); + } + + @Override + public void setCustomView(View view) { + mWrappedObject.setCustomView(view); + } + + @Override + public MenuInflater getMenuInflater() { + return mWrappedObject.getMenuInflater(); + } + + @Override + public boolean getTitleOptionalHint() { + return mWrappedObject.getTitleOptionalHint(); + } + + @Override + public void setTitleOptionalHint(boolean titleOptional) { + mWrappedObject.setTitleOptionalHint(titleOptional); + } + + @Override + public boolean isTitleOptional() { + return mWrappedObject.isTitleOptional(); + } + + /** + * @hide + */ + public static class CallbackWrapper implements android.support.v7.view.ActionMode.Callback { + final Callback mWrappedCallback; + final Context mContext; + + final SimpleArrayMap + mActionModes; + final SimpleArrayMap mMenus; + + public CallbackWrapper(Context context, Callback supportCallback) { + mContext = context; + mWrappedCallback = supportCallback; + mActionModes = new SimpleArrayMap<>(); + mMenus = new SimpleArrayMap<>(); + } + + @Override + public boolean onCreateActionMode(android.support.v7.view.ActionMode mode, Menu menu) { + return mWrappedCallback.onCreateActionMode(getActionModeWrapper(mode), + getMenuWrapper(menu)); + } + + @Override + public boolean onPrepareActionMode(android.support.v7.view.ActionMode mode, Menu menu) { + return mWrappedCallback.onPrepareActionMode(getActionModeWrapper(mode), + getMenuWrapper(menu)); + } + + @Override + public boolean onActionItemClicked(android.support.v7.view.ActionMode mode, + android.view.MenuItem item) { + return mWrappedCallback.onActionItemClicked(getActionModeWrapper(mode), + MenuWrapperFactory.wrapSupportMenuItem(mContext, (SupportMenuItem) item)); + } + + @Override + public void onDestroyActionMode(android.support.v7.view.ActionMode mode) { + mWrappedCallback.onDestroyActionMode(getActionModeWrapper(mode)); + } + + private Menu getMenuWrapper(Menu menu) { + Menu wrapper = mMenus.get(menu); + if (wrapper == null) { + wrapper = MenuWrapperFactory.wrapSupportMenu(mContext, (SupportMenu) menu); + mMenus.put(menu, wrapper); + } + return wrapper; + } + + private ActionMode getActionModeWrapper(android.support.v7.view.ActionMode mode) { + // First see if we already have a wrapper for this mode + SupportActionModeWrapper wrapper = mActionModes.get(mode); + if (wrapper != null) { + return wrapper; + } + + // If we reach here then we haven't seen this mode before. Create a new wrapper and + // add it to our collection + wrapper = new SupportActionModeWrapper(mContext, mode); + mActionModes.put(mode, wrapper); + return wrapper; + } + } +} \ No newline at end of file diff --git a/android/support/v7/internal/view/SupportMenuInflater.java b/android/support/v7/internal/view/SupportMenuInflater.java new file mode 100644 index 0000000000..84a07dac22 --- /dev/null +++ b/android/support/v7/internal/view/SupportMenuInflater.java @@ -0,0 +1,506 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.view; + +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +import android.app.Activity; +import android.content.Context; +import android.content.ContextWrapper; +import android.content.res.TypedArray; +import android.content.res.XmlResourceParser; +import android.support.v4.internal.view.SupportMenu; +import android.support.v4.view.ActionProvider; +import android.support.v4.view.MenuItemCompat; +import android.support.v7.appcompat.R; +import android.support.v7.internal.view.menu.MenuItemImpl; +import android.support.v7.internal.view.menu.MenuItemWrapperICS; +import android.util.AttributeSet; +import android.util.Log; +import android.util.Xml; +import android.view.InflateException; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.SubMenu; +import android.view.View; + +import java.io.IOException; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; + +/** + * 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 SupportMenuInflater with an XmlPullParser over a plain XML file at runtime; + * it only works with an XmlPullParser returned from a compiled resource (R. + * something file.) + * + * @hide + */ +public class SupportMenuInflater extends MenuInflater { + private static final String LOG_TAG = "SupportMenuInflater"; + + /** 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 SupportMenuInflater(Context context) { + super(context); + mContext = context; + 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. + */ + @Override + public void inflate(int menuRes, Menu menu) { + // If we're not dealing with a SupportMenu instance, let super handle + if (!(menu instanceof SupportMenu)) { + super.inflate(menuRes, menu); + return; + } + + 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 Object getRealOwner() { + if (mRealOwner == null) { + mRealOwner = findRealOwner(mContext); + } + return mRealOwner; + } + + private Object findRealOwner(Object owner) { + if (owner instanceof Activity) { + return owner; + } + if (owner instanceof ContextWrapper) { + return findRealOwner(((ContextWrapper) owner).getBaseContext()); + } + return owner; + } + + 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.MenuGroup); + + groupId = a.getResourceId(R.styleable.MenuGroup_android_id, defaultGroupId); + groupCategory = a.getInt( + R.styleable.MenuGroup_android_menuCategory, defaultItemCategory); + groupOrder = a.getInt(R.styleable.MenuGroup_android_orderInCategory, defaultItemOrder); + groupCheckable = a.getInt( + R.styleable.MenuGroup_android_checkableBehavior, defaultItemCheckable); + groupVisible = a.getBoolean(R.styleable.MenuGroup_android_visible, defaultItemVisible); + groupEnabled = a.getBoolean(R.styleable.MenuGroup_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.MenuItem); + + // Inherit attributes from the group as default value + itemId = a.getResourceId(R.styleable.MenuItem_android_id, defaultItemId); + final int category = a.getInt(R.styleable.MenuItem_android_menuCategory, groupCategory); + final int order = a.getInt(R.styleable.MenuItem_android_orderInCategory, groupOrder); + itemCategoryOrder = (category & SupportMenu.CATEGORY_MASK) | + (order & SupportMenu.USER_MASK); + itemTitle = a.getText(R.styleable.MenuItem_android_title); + itemTitleCondensed = a.getText(R.styleable.MenuItem_android_titleCondensed); + itemIconResId = a.getResourceId(R.styleable.MenuItem_android_icon, 0); + itemAlphabeticShortcut = + getShortcut(a.getString(R.styleable.MenuItem_android_alphabeticShortcut)); + itemNumericShortcut = + getShortcut(a.getString(R.styleable.MenuItem_android_numericShortcut)); + if (a.hasValue(R.styleable.MenuItem_android_checkable)) { + // Item has attribute checkable, use it + itemCheckable = a.getBoolean(R.styleable.MenuItem_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.MenuItem_android_checked, defaultItemChecked); + itemVisible = a.getBoolean(R.styleable.MenuItem_android_visible, groupVisible); + itemEnabled = a.getBoolean(R.styleable.MenuItem_android_enabled, groupEnabled); + itemShowAsAction = a.getInt(R.styleable.MenuItem_showAsAction, -1); + itemListenerMethodName = a.getString(R.styleable.MenuItem_android_onClick); + itemActionViewLayout = a.getResourceId(R.styleable.MenuItem_actionLayout, 0); + itemActionViewClassName = a.getString(R.styleable.MenuItem_actionViewClass); + itemActionProviderClassName = a.getString(R.styleable.MenuItem_actionProviderClass); + + 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) { + MenuItemCompat.setShowAsAction(item, 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(getRealOwner(), itemListenerMethodName)); + } + + final MenuItemImpl impl = item instanceof MenuItemImpl ? (MenuItemImpl) item : null; + if (itemCheckable >= 2) { + if (item instanceof MenuItemImpl) { + ((MenuItemImpl) item).setExclusiveCheckable(true); + } else if (item instanceof MenuItemWrapperICS) { + ((MenuItemWrapperICS) item).setExclusiveCheckable(true); + } + } + + boolean actionViewSpecified = false; + if (itemActionViewClassName != null) { + View actionView = (View) newInstance(itemActionViewClassName, + ACTION_VIEW_CONSTRUCTOR_SIGNATURE, mActionViewConstructorArguments); + MenuItemCompat.setActionView(item, actionView); + actionViewSpecified = true; + } + if (itemActionViewLayout > 0) { + if (!actionViewSpecified) { + MenuItemCompat.setActionView(item, itemActionViewLayout); + actionViewSpecified = true; + } else { + Log.w(LOG_TAG, "Ignoring attribute 'itemActionViewLayout'." + + " Action view already specified."); + } + } + if (itemActionProvider != null) { + MenuItemCompat.setActionProvider(item, 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/support/v7/internal/view/ViewPropertyAnimatorCompatSet.java b/android/support/v7/internal/view/ViewPropertyAnimatorCompatSet.java new file mode 100644 index 0000000000..457e1b1674 --- /dev/null +++ b/android/support/v7/internal/view/ViewPropertyAnimatorCompatSet.java @@ -0,0 +1,139 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.view; + +import android.support.v4.view.ViewPropertyAnimatorCompat; +import android.support.v4.view.ViewPropertyAnimatorListener; +import android.support.v4.view.ViewPropertyAnimatorListenerAdapter; +import android.view.View; +import android.view.animation.Interpolator; + +import java.util.ArrayList; + +/** + * A very naive implementation of a set of + * {@link android.support.v4.view.ViewPropertyAnimatorCompat}. + * + * @hide + */ +public class ViewPropertyAnimatorCompatSet { + + private final ArrayList mAnimators; + + private long mDuration = -1; + private Interpolator mInterpolator; + private ViewPropertyAnimatorListener mListener; + + private boolean mIsStarted; + + public ViewPropertyAnimatorCompatSet() { + mAnimators = new ArrayList(); + } + + public ViewPropertyAnimatorCompatSet play(ViewPropertyAnimatorCompat animator) { + if (!mIsStarted) { + mAnimators.add(animator); + } + return this; + } + + public void start() { + if (mIsStarted) return; + for (ViewPropertyAnimatorCompat animator : mAnimators) { + if (mDuration >= 0) { + animator.setDuration(mDuration); + } + if (mInterpolator != null) { + animator.setInterpolator(mInterpolator); + } + if (mListener != null) { + animator.setListener(mProxyListener); + } + animator.start(); + } + + mIsStarted = true; + } + + private void onAnimationsEnded() { + mIsStarted = false; + } + + public void cancel() { + if (!mIsStarted) { + return; + } + for (ViewPropertyAnimatorCompat animator : mAnimators) { + animator.cancel(); + } + mIsStarted = false; + } + + public ViewPropertyAnimatorCompatSet setDuration(long duration) { + if (!mIsStarted) { + mDuration = duration; + } + return this; + } + + public ViewPropertyAnimatorCompatSet setInterpolator(Interpolator interpolator) { + if (!mIsStarted) { + mInterpolator = interpolator; + } + return this; + } + + public ViewPropertyAnimatorCompatSet setListener(ViewPropertyAnimatorListener listener) { + if (!mIsStarted) { + mListener = listener; + } + return this; + } + + private final ViewPropertyAnimatorListenerAdapter mProxyListener + = new ViewPropertyAnimatorListenerAdapter() { + private boolean mProxyStarted = false; + private int mProxyEndCount = 0; + + @Override + public void onAnimationStart(View view) { + if (mProxyStarted) { + return; + } + mProxyStarted = true; + if (mListener != null) { + mListener.onAnimationStart(null); + } + } + + void onEnd() { + mProxyEndCount = 0; + mProxyStarted = false; + onAnimationsEnded(); + } + + @Override + public void onAnimationEnd(View view) { + if (++mProxyEndCount == mAnimators.size()) { + if (mListener != null) { + mListener.onAnimationEnd(null); + } + onEnd(); + } + } + }; +} diff --git a/android/support/v7/internal/view/WindowCallbackWrapper.java b/android/support/v7/internal/view/WindowCallbackWrapper.java new file mode 100644 index 0000000000..d799d00e95 --- /dev/null +++ b/android/support/v7/internal/view/WindowCallbackWrapper.java @@ -0,0 +1,151 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.view; + +import android.view.ActionMode; +import android.view.KeyEvent; +import android.view.Menu; +import android.view.MenuItem; +import android.view.MotionEvent; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.view.accessibility.AccessibilityEvent; + +/** + * A simple decorator stub for Window.Callback that passes through any calls + * to the wrapped instance as a base implementation. Call super.foo() to call into + * the wrapped callback for any subclasses. + * + * @hide + */ +public class WindowCallbackWrapper implements Window.Callback { + + final Window.Callback mWrapped; + + public WindowCallbackWrapper(Window.Callback wrapped) { + if (wrapped == null) { + throw new IllegalArgumentException("Window callback may not be null"); + } + mWrapped = wrapped; + } + + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + return mWrapped.dispatchKeyEvent(event); + } + + @Override + public boolean dispatchKeyShortcutEvent(KeyEvent event) { + return mWrapped.dispatchKeyShortcutEvent(event); + } + + @Override + public boolean dispatchTouchEvent(MotionEvent event) { + return mWrapped.dispatchTouchEvent(event); + } + + @Override + public boolean dispatchTrackballEvent(MotionEvent event) { + return mWrapped.dispatchTrackballEvent(event); + } + + @Override + public boolean dispatchGenericMotionEvent(MotionEvent event) { + return mWrapped.dispatchGenericMotionEvent(event); + } + + @Override + public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { + return mWrapped.dispatchPopulateAccessibilityEvent(event); + } + + @Override + public View onCreatePanelView(int featureId) { + return mWrapped.onCreatePanelView(featureId); + } + + @Override + public boolean onCreatePanelMenu(int featureId, Menu menu) { + return mWrapped.onCreatePanelMenu(featureId, menu); + } + + @Override + public boolean onPreparePanel(int featureId, View view, Menu menu) { + return mWrapped.onPreparePanel(featureId, view, menu); + } + + @Override + public boolean onMenuOpened(int featureId, Menu menu) { + return mWrapped.onMenuOpened(featureId, menu); + } + + @Override + public boolean onMenuItemSelected(int featureId, MenuItem item) { + return mWrapped.onMenuItemSelected(featureId, item); + } + + @Override + public void onWindowAttributesChanged(WindowManager.LayoutParams attrs) { + mWrapped.onWindowAttributesChanged(attrs); + } + + @Override + public void onContentChanged() { + mWrapped.onContentChanged(); + } + + @Override + public void onWindowFocusChanged(boolean hasFocus) { + mWrapped.onWindowFocusChanged(hasFocus); + } + + @Override + public void onAttachedToWindow() { + mWrapped.onAttachedToWindow(); + } + + @Override + public void onDetachedFromWindow() { + mWrapped.onDetachedFromWindow(); + } + + @Override + public void onPanelClosed(int featureId, Menu menu) { + mWrapped.onPanelClosed(featureId, menu); + } + + @Override + public boolean onSearchRequested() { + return mWrapped.onSearchRequested(); + } + + @Override + public ActionMode onWindowStartingActionMode(ActionMode.Callback callback) { + return mWrapped.onWindowStartingActionMode(callback); + } + + @Override + public void onActionModeStarted(ActionMode mode) { + mWrapped.onActionModeStarted(mode); + } + + @Override + public void onActionModeFinished(ActionMode mode) { + mWrapped.onActionModeFinished(mode); + } +} diff --git a/android/support/v7/internal/view/menu/ActionMenuItem.java b/android/support/v7/internal/view/menu/ActionMenuItem.java new file mode 100644 index 0000000000..b466a0ba27 --- /dev/null +++ b/android/support/v7/internal/view/menu/ActionMenuItem.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 android.support.v7.internal.view.menu; + +import android.content.Context; +import android.content.Intent; +import android.graphics.drawable.Drawable; +import android.support.v4.content.ContextCompat; +import android.support.v4.view.ActionProvider; +import android.support.v4.internal.view.SupportMenuItem; +import android.support.v4.view.MenuItemCompat; +import android.view.ContextMenu.ContextMenuInfo; +import android.view.MenuItem; +import android.view.SubMenu; +import android.view.View; + +/** + * @hide + */ +public class ActionMenuItem implements SupportMenuItem { + + 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; + + private Drawable mIconDrawable; + private int mIconResId = NO_ICON; + + private Context mContext; + + private SupportMenuItem.OnMenuItemClickListener mClickListener; + + 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; + 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 != null ? mTitleCondensed : mTitle; + } + + 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; + mIconResId = NO_ICON; + return this; + } + + public MenuItem setIcon(int iconRes) { + mIconResId = iconRes; + mIconDrawable = ContextCompat.getDrawable(mContext, 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 SupportMenuItem setActionView(View actionView) { + throw new UnsupportedOperationException(); + } + + public View getActionView() { + return null; + } + + @Override + public MenuItem setActionProvider(android.view.ActionProvider actionProvider) { + throw new UnsupportedOperationException(); + } + + @Override + public android.view.ActionProvider getActionProvider() { + throw new UnsupportedOperationException(); + } + + @Override + public SupportMenuItem setActionView(int resId) { + throw new UnsupportedOperationException(); + } + + @Override + public ActionProvider getSupportActionProvider() { + return null; + } + + @Override + public SupportMenuItem setSupportActionProvider(ActionProvider actionProvider) { + throw new UnsupportedOperationException(); + } + + @Override + public SupportMenuItem 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(MenuItem.OnActionExpandListener listener) { + throw new UnsupportedOperationException(); + } + + @Override + public SupportMenuItem setSupportOnActionExpandListener(MenuItemCompat.OnActionExpandListener listener) { + // No need to save the listener; ActionMenuItem does not support collapsing items. + return this; + } +} diff --git a/android/support/v7/internal/view/menu/ActionMenuItemView.java b/android/support/v7/internal/view/menu/ActionMenuItemView.java new file mode 100644 index 0000000000..8755ef27a3 --- /dev/null +++ b/android/support/v7/internal/view/menu/ActionMenuItemView.java @@ -0,0 +1,334 @@ +/* + * 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 android.support.v7.internal.view.menu; + +import android.content.Context; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.support.v4.view.GravityCompat; +import android.support.v4.view.ViewCompat; +import android.support.v7.appcompat.R; +import android.support.v7.internal.text.AllCapsTransformationMethod; +import android.support.v7.internal.widget.CompatTextView; +import android.support.v7.widget.ActionMenuView; +import android.support.v7.widget.ListPopupWindow; +import android.text.TextUtils; +import android.text.method.TransformationMethod; +import android.util.AttributeSet; +import android.view.Gravity; +import android.view.MotionEvent; +import android.view.View; +import android.widget.Toast; + +import java.util.Locale; + +/** + * @hide + */ +public class ActionMenuItemView extends CompatTextView + implements MenuView.ItemView, View.OnClickListener, View.OnLongClickListener, + ActionMenuView.ActionMenuChildView { + + private static final String TAG = "ActionMenuItemView"; + + private MenuItemImpl mItemData; + private CharSequence mTitle; + private Drawable mIcon; + private MenuBuilder.ItemInvoker mItemInvoker; + private ListPopupWindow.ForwardingListener mForwardingListener; + private PopupCallback mPopupCallback; + + private boolean mAllowTextWithIcon; + private boolean mExpandedFormat; + private int mMinWidth; + private int mSavedPaddingLeft; + + private static final int MAX_ICON_SIZE = 32; // dp + private int mMaxIconSize; + + 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) { + super(context, attrs, defStyle); + final Resources res = context.getResources(); + mAllowTextWithIcon = res.getBoolean( + R.bool.abc_config_allowActionMenuItemTextWithIcon); + TypedArray a = context.obtainStyledAttributes(attrs, + R.styleable.ActionMenuItemView, defStyle, 0); + mMinWidth = a.getDimensionPixelSize( + R.styleable.ActionMenuItemView_android_minWidth, 0); + a.recycle(); + + final float density = res.getDisplayMetrics().density; + mMaxIconSize = (int) (MAX_ICON_SIZE * density + 0.5f); + + setOnClickListener(this); + setOnLongClickListener(this); + + mSavedPaddingLeft = -1; + } + + public void onConfigurationChanged(Configuration newConfig) { + if (Build.VERSION.SDK_INT >= 8) { + super.onConfigurationChanged(newConfig); + } + + mAllowTextWithIcon = getContext().getResources().getBoolean( + R.bool.abc_config_allowActionMenuItemTextWithIcon); + updateTextButtonVisibility(); + } + + @Override + public void setPadding(int l, int t, int r, int b) { + mSavedPaddingLeft = l; + super.setPadding(l, t, r, b); + } + + 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()); + if (itemData.hasSubMenu()) { + if (mForwardingListener == null) { + mForwardingListener = new ActionMenuItemForwardingListener(); + } + } + } + + @Override + public boolean onTouchEvent(MotionEvent e) { + if (mItemData.hasSubMenu() && mForwardingListener != null + && mForwardingListener.onTouch(this, e)) { + return true; + } + return super.onTouchEvent(e); + } + + @Override + public void onClick(View v) { + if (mItemInvoker != null) { + mItemInvoker.invokeItem(mItemData); + } + } + + public void setItemInvoker(MenuBuilder.ItemInvoker invoker) { + mItemInvoker = invoker; + } + + public void setPopupCallback(PopupCallback popupCallback) { + mPopupCallback = popupCallback; + } + + 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(mTitle); + visible &= mIcon == null || + (mItemData.showsTextAsAction() && (mAllowTextWithIcon || mExpandedFormat)); + + setText(visible ? mTitle : null); + } + + public void setIcon(Drawable icon) { + mIcon = icon; + if (icon != null) { + int width = icon.getIntrinsicWidth(); + int height = icon.getIntrinsicHeight(); + if (width > mMaxIconSize) { + final float scale = (float) mMaxIconSize / width; + width = mMaxIconSize; + height *= scale; + } + if (height > mMaxIconSize) { + final float scale = (float) mMaxIconSize / height; + height = mMaxIconSize; + width *= scale; + } + icon.setBounds(0, 0, width, height); + } + setCompoundDrawables(icon, null, null, null); + + updateTextButtonVisibility(); + } + + public boolean hasText() { + return !TextUtils.isEmpty(getText()); + } + + public void setShortcut(boolean showShortcut, char shortcutKey) { + // Action buttons don't show text for shortcut keys. + } + + public void setTitle(CharSequence title) { + mTitle = title; + + setContentDescription(mTitle); + updateTextButtonVisibility(); + } + + 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; + int referenceX = screenPos[0] + width / 2; + if (ViewCompat.getLayoutDirection(v) == ViewCompat.LAYOUT_DIRECTION_LTR) { + final int screenWidth = context.getResources().getDisplayMetrics().widthPixels; + referenceX = screenWidth - referenceX; // mirror + } + Toast cheatSheet = Toast.makeText(context, mItemData.getTitle(), Toast.LENGTH_SHORT); + if (midy < displayFrame.height()) { + // Show along the top; follow action buttons + cheatSheet.setGravity(Gravity.TOP | GravityCompat.END, referenceX, 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) { + final boolean textVisible = hasText(); + if (textVisible && mSavedPaddingLeft >= 0) { + super.setPadding(mSavedPaddingLeft, getPaddingTop(), + getPaddingRight(), getPaddingBottom()); + } + + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + + final int widthMode = MeasureSpec.getMode(widthMeasureSpec); + final int widthSize = MeasureSpec.getSize(widthMeasureSpec); + final int oldMeasuredWidth = getMeasuredWidth(); + final int targetWidth = widthMode == MeasureSpec.AT_MOST ? Math.min(widthSize, mMinWidth) + : mMinWidth; + + if (widthMode != MeasureSpec.EXACTLY && mMinWidth > 0 && oldMeasuredWidth < targetWidth) { + // Remeasure at exactly the minimum width. + super.onMeasure(MeasureSpec.makeMeasureSpec(targetWidth, MeasureSpec.EXACTLY), + heightMeasureSpec); + } + + if (!textVisible && mIcon != null) { + // TextView won't center compound drawables in both dimensions without + // a little coercion. Pad in to center the icon after we've measured. + final int w = getMeasuredWidth(); + final int dw = mIcon.getBounds().width(); + super.setPadding((w - dw) / 2, getPaddingTop(), getPaddingRight(), getPaddingBottom()); + } + } + + private class ActionMenuItemForwardingListener extends ListPopupWindow.ForwardingListener { + public ActionMenuItemForwardingListener() { + super(ActionMenuItemView.this); + } + + @Override + public ListPopupWindow getPopup() { + if (mPopupCallback != null) { + return mPopupCallback.getPopup(); + } + return null; + } + + @Override + protected boolean onForwardingStarted() { + // Call the invoker, then check if the expected popup is showing. + if (mItemInvoker != null && mItemInvoker.invokeItem(mItemData)) { + final ListPopupWindow popup = getPopup(); + return popup != null && popup.isShowing(); + } + return false; + } + + @Override + protected boolean onForwardingStopped() { + final ListPopupWindow popup = getPopup(); + if (popup != null) { + popup.dismiss(); + return true; + } + return false; + } + } + + public static abstract class PopupCallback { + public abstract ListPopupWindow getPopup(); + } +} diff --git a/android/support/v7/internal/view/menu/BaseMenuPresenter.java b/android/support/v7/internal/view/menu/BaseMenuPresenter.java new file mode 100644 index 0000000000..34cc821f5e --- /dev/null +++ b/android/support/v7/internal/view/menu/BaseMenuPresenter.java @@ -0,0 +1,237 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.view.menu; + +import android.content.Context; +import android.support.v4.view.ViewCompat; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import java.util.ArrayList; + +/** + * 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. + * + * @hide + */ +public abstract class BaseMenuPresenter implements MenuPresenter { + + 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); + ViewCompat.jumpDrawablesToCurrentState(itemView); + } + 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; + } + + public Callback getCallback() { + return mCallback; + } + + /** + * 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/support/v7/internal/view/menu/BaseMenuWrapper.java b/android/support/v7/internal/view/menu/BaseMenuWrapper.java new file mode 100644 index 0000000000..b8f7793b35 --- /dev/null +++ b/android/support/v7/internal/view/menu/BaseMenuWrapper.java @@ -0,0 +1,126 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.view.menu; + +import android.content.Context; +import android.support.v4.internal.view.SupportMenuItem; +import android.support.v4.internal.view.SupportSubMenu; +import android.support.v4.util.ArrayMap; +import android.view.MenuItem; +import android.view.SubMenu; + +import java.util.Iterator; +import java.util.Map; + +abstract class BaseMenuWrapper extends BaseWrapper { + + final Context mContext; + + private Map mMenuItems; + private Map mSubMenus; + + BaseMenuWrapper(Context context, T object) { + super(object); + mContext = context; + } + + final MenuItem getMenuItemWrapper(final MenuItem menuItem) { + if (menuItem instanceof SupportMenuItem) { + final SupportMenuItem supportMenuItem = (SupportMenuItem) menuItem; + + // Instantiate Map if null + if (mMenuItems == null) { + mMenuItems = new ArrayMap<>(); + } + + // First check if we already have a wrapper for this item + MenuItem wrappedItem = mMenuItems.get(menuItem); + + if (null == wrappedItem) { + // ... if not, create one and add it to our map + wrappedItem = MenuWrapperFactory.wrapSupportMenuItem(mContext, supportMenuItem); + mMenuItems.put(supportMenuItem, wrappedItem); + } + + return wrappedItem; + } + return menuItem; + } + + final SubMenu getSubMenuWrapper(final SubMenu subMenu) { + if (subMenu instanceof SupportSubMenu) { + final SupportSubMenu supportSubMenu = (SupportSubMenu) subMenu; + + // Instantiate Map if null + if (mSubMenus == null) { + mSubMenus = new ArrayMap<>(); + } + + SubMenu wrappedMenu = mSubMenus.get(supportSubMenu); + + if (null == wrappedMenu) { + wrappedMenu = MenuWrapperFactory.wrapSupportSubMenu(mContext, supportSubMenu); + mSubMenus.put(supportSubMenu, wrappedMenu); + } + return wrappedMenu; + } + return subMenu; + } + + + final void internalClear() { + if (mMenuItems != null) { + mMenuItems.clear(); + } + if (mSubMenus != null) { + mSubMenus.clear(); + } + } + + final void internalRemoveGroup(final int groupId) { + if (mMenuItems == null) { + return; + } + + Iterator iterator = mMenuItems.keySet().iterator(); + android.view.MenuItem menuItem; + + while (iterator.hasNext()) { + menuItem = iterator.next(); + if (groupId == menuItem.getGroupId()) { + iterator.remove(); + } + } + } + + final void internalRemoveItem(final int id) { + if (mMenuItems == null) { + return; + } + + Iterator iterator = mMenuItems.keySet().iterator(); + android.view.MenuItem menuItem; + + while (iterator.hasNext()) { + menuItem = iterator.next(); + if (id == menuItem.getItemId()) { + iterator.remove(); + break; + } + } + } +} diff --git a/android/support/v7/internal/view/menu/BaseWrapper.java b/android/support/v7/internal/view/menu/BaseWrapper.java new file mode 100644 index 0000000000..116bc23756 --- /dev/null +++ b/android/support/v7/internal/view/menu/BaseWrapper.java @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.view.menu; + +class BaseWrapper { + + final T mWrappedObject; + + BaseWrapper(T object) { + if (null == object) { + throw new IllegalArgumentException("Wrapped Object can not be null."); + } + mWrappedObject = object; + } + + public T getWrappedObject() { + return mWrappedObject; + } + +} diff --git a/android/support/v7/internal/view/menu/ExpandedMenuView.java b/android/support/v7/internal/view/menu/ExpandedMenuView.java new file mode 100644 index 0000000000..fa12f67b82 --- /dev/null +++ b/android/support/v7/internal/view/menu/ExpandedMenuView.java @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.view.menu; + +import android.content.Context; +import android.support.v7.internal.view.menu.MenuBuilder; +import android.support.v7.internal.view.menu.MenuBuilder.ItemInvoker; +import android.support.v7.internal.view.menu.MenuView; +import android.support.v7.internal.widget.TintTypedArray; +import android.util.AttributeSet; +import android.view.View; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemClickListener; +import android.widget.ListView; + +/** + * The expanded menu view is a list-like menu with all of the available menu items. It is opened + * by the user clicking no the 'More' button on the icon menu view. + * + * @hide + */ +public final class ExpandedMenuView extends ListView + implements ItemInvoker, MenuView, OnItemClickListener { + + private static final int[] TINT_ATTRS = { + android.R.attr.background, + android.R.attr.divider + }; + + private MenuBuilder mMenu; + + /** Default animations for this menu */ + private int mAnimations; + + public ExpandedMenuView(Context context, AttributeSet attrs) { + this(context, attrs, android.R.attr.listViewStyle); + } + + public ExpandedMenuView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs); + setOnItemClickListener(this); + + TintTypedArray a = TintTypedArray.obtainStyledAttributes(context, attrs, TINT_ATTRS, + defStyleAttr, 0); + if (a.hasValue(0)) { + setBackgroundDrawable(a.getDrawable(0)); + } + if (a.hasValue(1)) { + setDivider(a.getDrawable(1)); + } + a.recycle(); + } + + @Override + public void initialize(MenuBuilder menu) { + mMenu = menu; + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + + // Clear the cached bitmaps of children + setChildrenDrawingCacheEnabled(false); + } + + @Override + public boolean invokeItem(MenuItemImpl item) { + return mMenu.performItemAction(item, 0); + } + + @Override + @SuppressWarnings("rawtypes") + public void onItemClick(AdapterView parent, View v, int position, long id) { + invokeItem((MenuItemImpl) getAdapter().getItem(position)); + } + + @Override + public int getWindowAnimations() { + return mAnimations; + } + +} diff --git a/android/support/v7/internal/view/menu/ListMenuItemView.java b/android/support/v7/internal/view/menu/ListMenuItemView.java new file mode 100644 index 0000000000..ebb9529fee --- /dev/null +++ b/android/support/v7/internal/view/menu/ListMenuItemView.java @@ -0,0 +1,282 @@ +/* + * 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 android.support.v7.internal.view.menu; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.support.v7.appcompat.R; +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. + * + * @hide + */ +public class ListMenuItemView extends LinearLayout implements MenuView.ItemView { + + private static final String TAG = "ListMenuItemView"; + 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; + + private int mMenuType; + + private Context mContext; + private LayoutInflater mInflater; + + private boolean mForceShowIcon; + + public ListMenuItemView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs); + mContext = context; + + final TypedArray a = context.obtainStyledAttributes( + attrs, R.styleable.MenuView, defStyle, 0); + + mBackground = a.getDrawable(R.styleable.MenuView_android_itemBackground); + mTextAppearance = a.getResourceId(R.styleable. + MenuView_android_itemTextAppearance, -1); + mPreserveIconSpacing = a.getBoolean( + R.styleable.MenuView_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.title); + if (mTextAppearance != -1) { + mTitleView.setTextAppearance(mTextAppearanceContext, + mTextAppearance); + } + + mShortcutView = (TextView) findViewById(R.id.shortcut); + } + + public void initialize(MenuItemImpl itemData, int menuType) { + mItemData = itemData; + 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; + } + + // 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 ? VISIBLE : GONE; + if (compoundButton.getVisibility() != newVisibility) { + compoundButton.setVisibility(newVisibility); + } + + // Make sure the other compound button isn't visible + if (otherCompoundButton != null && otherCompoundButton.getVisibility() != GONE) { + otherCompoundButton.setVisibility(GONE); + } + } else { + if (mCheckBox != null) { + mCheckBox.setVisibility(GONE); + } + if (mRadioButton != null) { + 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.abc_list_menu_item_icon, + this, false); + addView(mIconView, 0); + } + + private void insertRadioButton() { + LayoutInflater inflater = getInflater(); + mRadioButton = + (RadioButton) inflater.inflate(R.layout.abc_list_menu_item_radio, + this, false); + addView(mRadioButton); + } + + private void insertCheckBox() { + LayoutInflater inflater = getInflater(); + mCheckBox = + (CheckBox) inflater.inflate(R.layout.abc_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/support/v7/internal/view/menu/ListMenuPresenter.java b/android/support/v7/internal/view/menu/ListMenuPresenter.java new file mode 100644 index 0000000000..ac988405f2 --- /dev/null +++ b/android/support/v7/internal/view/menu/ListMenuPresenter.java @@ -0,0 +1,288 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.view.menu; + +import android.content.Context; +import android.database.DataSetObserver; +import android.os.Bundle; +import android.os.Parcelable; +import android.support.v7.appcompat.R; +import android.util.SparseArray; +import android.view.ContextThemeWrapper; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.BaseAdapter; +import android.widget.ListAdapter; + +import java.util.ArrayList; + +/** + * MenuPresenter for list-style menus. + * + * @hide + */ +public class ListMenuPresenter implements MenuPresenter, AdapterView.OnItemClickListener { + private static final String TAG = "ListMenuPresenter"; + + Context mContext; + LayoutInflater mInflater; + MenuBuilder mMenu; + + ExpandedMenuView mMenuView; + + private int mItemIndexOffset; + int mThemeRes; + int mItemLayoutRes; + + private Callback mCallback; + MenuAdapter mAdapter; + + private int mId; + + public static final String VIEWS_TAG = "android:menu:list"; + + /** + * Construct a new ListMenuPresenter. + * @param context Context to use for theming. This will supersede the context provided + * to initForMenu when this presenter is added. + * @param itemLayoutRes Layout resource for individual item views. + */ + public ListMenuPresenter(Context context, int itemLayoutRes) { + this(itemLayoutRes, 0); + mContext = context; + mInflater = LayoutInflater.from(mContext); + } + + /** + * Construct a new ListMenuPresenter. + * @param itemLayoutRes Layout resource for individual item views. + * @param themeRes Resource ID of a theme to use for views. + */ + public ListMenuPresenter(int itemLayoutRes, int themeRes) { + mItemLayoutRes = itemLayoutRes; + mThemeRes = themeRes; + } + + @Override + public void initForMenu(Context context, MenuBuilder menu) { + if (mThemeRes != 0) { + mContext = new ContextThemeWrapper(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 MenuView getMenuView(ViewGroup root) { + if (mMenuView == null) { + mMenuView = (ExpandedMenuView) mInflater.inflate( + R.layout.abc_expanded_menu_layout, root, false); + if (mAdapter == null) { + mAdapter = new MenuAdapter(); + } + mMenuView.setAdapter(mAdapter); + mMenuView.setOnItemClickListener(this); + } + return mMenuView; + } + + /** + * Call this instead of getMenuView if you want to manage your own ListView. + * For proper operation, the ListView hosting this adapter should add + * this presenter as an OnItemClickListener. + * + * @return A ListAdapter containing the items in the menu. + */ + public ListAdapter getAdapter() { + if (mAdapter == null) { + mAdapter = new MenuAdapter(); + } + return mAdapter; + } + + @Override + public void updateMenuView(boolean cleared) { + if (mAdapter != null) mAdapter.notifyDataSetChanged(); + } + + @Override + public void setCallback(Callback cb) { + mCallback = cb; + } + + @Override + public boolean onSubMenuSelected(SubMenuBuilder subMenu) { + if (!subMenu.hasVisibleItems()) return false; + + // The window manager will give us a token. + new MenuDialogHelper(subMenu).show(null); + if (mCallback != null) { + mCallback.onOpenSubMenu(subMenu); + } + return true; + } + + @Override + public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { + if (mCallback != null) { + mCallback.onCloseMenu(menu, allMenusAreClosing); + } + } + + int getItemIndexOffset() { + return mItemIndexOffset; + } + + public void setItemIndexOffset(int offset) { + mItemIndexOffset = offset; + if (mMenuView != null) { + updateMenuView(false); + } + } + + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + mMenu.performItemAction(mAdapter.getItem(position), this, 0); + } + + @Override + public boolean flagActionItems() { + return false; + } + + public boolean expandItemActionView(MenuBuilder menu, MenuItemImpl item) { + return false; + } + + public boolean collapseItemActionView(MenuBuilder menu, MenuItemImpl item) { + return false; + } + + public void saveHierarchyState(Bundle outState) { + SparseArray viewStates = new SparseArray(); + if (mMenuView != null) { + ((View) mMenuView).saveHierarchyState(viewStates); + } + outState.putSparseParcelableArray(VIEWS_TAG, viewStates); + } + + public void restoreHierarchyState(Bundle inState) { + SparseArray viewStates = inState.getSparseParcelableArray(VIEWS_TAG); + if (viewStates != null) { + ((View) mMenuView).restoreHierarchyState(viewStates); + } + } + + public void setId(int id) { + mId = id; + } + + @Override + public int getId() { + return mId; + } + + @Override + public Parcelable onSaveInstanceState() { + if (mMenuView == null) { + return null; + } + + Bundle state = new Bundle(); + saveHierarchyState(state); + return state; + } + + @Override + public void onRestoreInstanceState(Parcelable state) { + restoreHierarchyState((Bundle) state); + } + + private class MenuAdapter extends BaseAdapter { + private int mExpandedIndex = -1; + + public MenuAdapter() { + findExpandedIndex(); + } + + public int getCount() { + ArrayList items = mMenu.getNonActionItems(); + int count = items.size() - mItemIndexOffset; + if (mExpandedIndex < 0) { + return count; + } + return count - 1; + } + + public MenuItemImpl getItem(int position) { + ArrayList items = mMenu.getNonActionItems(); + position += mItemIndexOffset; + 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(mItemLayoutRes, parent, false); + } + + MenuView.ItemView itemView = (MenuView.ItemView) convertView; + 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; + } + + @Override + public void notifyDataSetChanged() { + findExpandedIndex(); + super.notifyDataSetChanged(); + } + } +} diff --git a/android/support/v7/internal/view/menu/MenuBuilder.java b/android/support/v7/internal/view/menu/MenuBuilder.java new file mode 100644 index 0000000000..675a823391 --- /dev/null +++ b/android/support/v7/internal/view/menu/MenuBuilder.java @@ -0,0 +1,1352 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.view.menu; + +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.os.Parcelable; +import android.support.v4.content.ContextCompat; +import android.support.v4.view.MenuItemCompat; +import android.support.v7.appcompat.R; +import android.support.v4.view.ActionProvider; +import android.support.v4.internal.view.SupportMenu; +import android.support.v4.internal.view.SupportMenuItem; +import android.util.SparseArray; +import android.view.ContextMenu; +import android.view.KeyCharacterMap; +import android.view.KeyEvent; +import android.view.MenuItem; +import android.view.SubMenu; +import android.view.View; + +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +/** + * Implementation of the {@link android.support.v4.internal.view.SupportMenu} interface for creating a + * standard menu UI. + * + * @hide + */ +public class MenuBuilder implements SupportMenu { + + 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 = SupportMenuItem.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 ContextMenu.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. + */ + 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. + * @hide + */ + 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 + * @hide + */ + 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) { + addMenuPresenter(presenter, mContext); + } + + /** + * Add a presenter to this menu that uses an alternate context for + * inflating menu items. 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 + * @param menuContext The context used to inflate menu items + */ + public void addMenuPresenter(MenuPresenter presenter, Context menuContext) { + mPresenters.add(new WeakReference(presenter)); + presenter.initForMenu(menuContext, 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, + MenuPresenter preferredPresenter) { + if (mPresenters.isEmpty()) return false; + + boolean result = false; + + // Try the preferred presenter first. + if (preferredPresenter != null) { + result = preferredPresenter.onSubMenuSelected(subMenu); + } + + 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 = MenuItemCompat.getActionView(item); + if (v != null && v.getId() != View.NO_ID) { + if (viewStates == null) { + viewStates = new SparseArray(); + } + v.saveHierarchyState(viewStates); + if (MenuItemCompat.isActionViewExpanded(item)) { + outStates.putInt(EXPANDED_ACTION_VIEW_ID, item.getItemId()); + } + } + if (item.hasSubMenu()) { + final SubMenuBuilder subMenu = (SubMenuBuilder) item.getSubMenu(); + subMenu.saveActionViewStates(outStates); + } + } + + if (viewStates != null) { + outStates.putSparseParcelableArray(getActionViewStatesKey(), viewStates); + } + } + + public void restoreActionViewStates(Bundle states) { + if (states == null) { + return; + } + + SparseArray viewStates = states.getSparseParcelableArray( + getActionViewStatesKey()); + + final int itemCount = size(); + for (int i = 0; i < itemCount; i++) { + final MenuItem item = getItem(i); + final View v = MenuItemCompat.getActionView(item); + 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) { + MenuItemCompat.expandActionView(itemToExpand); + } + } + } + + 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 = createNewMenuItem(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; + } + + // Layoutlib overrides this method to return its custom implementation of MenuItemImpl + private MenuItemImpl createNewMenuItem(int group, int id, int categoryOrder, int ordering, + CharSequence title, int defaultShowAsAction) { + return new MenuItemImpl(this, group, id, categoryOrder, ordering, title, + defaultShowAsAction); + } + + public MenuItem add(CharSequence title) { + return addInternal(0, 0, 0, title); + } + + @Override + public MenuItem add(int titleRes) { + return addInternal(0, 0, 0, mResources.getString(titleRes)); + } + + @Override + public MenuItem add(int group, int id, int categoryOrder, CharSequence title) { + return addInternal(group, id, categoryOrder, title); + } + + @Override + public MenuItem add(int group, int id, int categoryOrder, int title) { + return addInternal(group, id, categoryOrder, mResources.getString(title)); + } + + @Override + public SubMenu addSubMenu(CharSequence title) { + return addSubMenu(0, 0, 0, title); + } + + @Override + public SubMenu addSubMenu(int titleRes) { + return addSubMenu(0, 0, 0, mResources.getString(titleRes)); + } + + @Override + 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; + } + + @Override + public SubMenu addSubMenu(int group, int id, int categoryOrder, int title) { + return addSubMenu(group, id, categoryOrder, mResources.getString(title)); + } + + @Override + 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 < N; i++) { + final ResolveInfo ri = lri.get(i); + Intent rintent = new Intent( + ri.specificIndex < 0 ? intent : specifics[ri.specificIndex]); + rintent.setComponent(new ComponentName( + ri.activityInfo.applicationInfo.packageName, + ri.activityInfo.name)); + final MenuItem item = add(group, id, categoryOrder, ri.loadLabel(pm)) + .setIcon(ri.loadIcon(pm)) + .setIntent(rintent); + if (outSpecificItems != null && ri.specificIndex >= 0) { + outSpecificItems[ri.specificIndex] = item; + } + } + + return N; + } + + @Override + public void removeItem(int id) { + removeItemAtInt(findItemIndex(id), true); + } + + @Override + 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); + } + + @Override + 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); + } + } + } + + @Override + 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); + } + } + } + + @Override + 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); + } + + @Override + 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); + } + } + } + + @Override + 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; + } + + @Override + 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; + } + + @Override + public int size() { + return mItems.size(); + } + + @Override + public MenuItem getItem(int index) { + return mItems.get(index); + } + + @Override + public boolean isShortcutKey(int keyCode, KeyEvent event) { + return findItemWithShortcutForKey(keyCode, event) != null; + } + + @Override + 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.abc_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; + } + + @Override + 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; + } + + @Override + 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) { + return performItemAction(item, null, flags); + } + + public boolean performItemAction(MenuItem item, MenuPresenter preferredPresenter, int flags) { + MenuItemImpl itemImpl = (MenuItemImpl) item; + + if (itemImpl == null || !itemImpl.isEnabled()) { + return false; + } + + boolean invoked = itemImpl.invoke(); + + final ActionProvider provider = itemImpl.getSupportActionProvider(); + final boolean providerHasSubMenu = provider != null && provider.hasSubMenu(); + if (itemImpl.hasCollapsibleActionView()) { + invoked |= itemImpl.expandActionView(); + if (invoked) close(true); + } else if (itemImpl.hasSubMenu() || providerHasSubMenu) { + close(false); + + if (!itemImpl.hasSubMenu()) { + itemImpl.setSubMenu(new SubMenuBuilder(getContext(), this, itemImpl)); + } + + final SubMenuBuilder subMenu = (SubMenuBuilder) itemImpl.getSubMenu(); + if (providerHasSubMenu) { + provider.onPrepareSubMenu(subMenu); + } + invoked |= dispatchSubMenuSelected(subMenu, preferredPresenter); + 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. + */ + public 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; + } + + @Override + 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.) + */ + public 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); + } + + public 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() { + // Important side effect: if getVisibleItems is stale it may refresh, + // which can affect action items staleness. + final ArrayList visibleItems = getVisibleItems(); + + 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(); + 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; + } + + public ArrayList getActionItems() { + flagActionItems(); + return mActionItems; + } + + public 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 = ContextCompat.getDrawable(getContext(), 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(ContextMenu.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; + } +} + diff --git a/android/support/v7/internal/view/menu/MenuDialogHelper.java b/android/support/v7/internal/view/menu/MenuDialogHelper.java new file mode 100644 index 0000000000..2707abe64e --- /dev/null +++ b/android/support/v7/internal/view/menu/MenuDialogHelper.java @@ -0,0 +1,172 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.view.menu; + +import android.app.AlertDialog; +import android.app.Dialog; +import android.content.DialogInterface; +import android.os.IBinder; +import android.support.v7.appcompat.R; +import android.view.KeyEvent; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; + +/** + * Helper for menus that appear as Dialogs (context and submenus). + * + * @hide + */ +public class MenuDialogHelper implements DialogInterface.OnKeyListener, + DialogInterface.OnClickListener, + DialogInterface.OnDismissListener, + MenuPresenter.Callback { + private MenuBuilder mMenu; + private AlertDialog mDialog; + ListMenuPresenter mPresenter; + private MenuPresenter.Callback mPresenterCallback; + + public MenuDialogHelper(MenuBuilder menu) { + mMenu = menu; + } + + /** + * Shows menu as a dialog. + * + * @param windowToken Optional token to assign to the window. + */ + public void show(IBinder windowToken) { + // Many references to mMenu, create local reference + final MenuBuilder menu = mMenu; + + // Get the builder for the dialog + final AlertDialog.Builder builder = new AlertDialog.Builder(menu.getContext()); + + // Need to force Light Menu theme as list_menu_item_layout is usually against a dark bg and + // AlertDialog's bg is white + mPresenter = new ListMenuPresenter(R.layout.abc_list_menu_item_layout, + R.style.Theme_AppCompat_CompactMenu); + + mPresenter.setCallback(this); + mMenu.addMenuPresenter(mPresenter); + builder.setAdapter(mPresenter.getAdapter(), this); + + // Set the title + final View headerView = menu.getHeaderView(); + if (headerView != null) { + // Menu's client has given a custom header view, use it + builder.setCustomTitle(headerView); + } else { + // Otherwise use the (text) title and icon + builder.setIcon(menu.getHeaderIcon()).setTitle(menu.getHeaderTitle()); + } + + // Set the key listener + builder.setOnKeyListener(this); + + // Show the menu + mDialog = builder.create(); + mDialog.setOnDismissListener(this); + + 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(); + } + + 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; + } + } + } + } + } + + // Menu shortcut matching + return mMenu.performShortcut(keyCode, event, 0); + + } + + public void setPresenterCallback(MenuPresenter.Callback cb) { + mPresenterCallback = cb; + } + + /** + * Dismisses the menu's dialog. + * + * @see Dialog#dismiss() + */ + public void dismiss() { + if (mDialog != null) { + mDialog.dismiss(); + } + } + + @Override + public void onDismiss(DialogInterface dialog) { + mPresenter.onCloseMenu(mMenu, true); + } + + @Override + public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { + if (allMenusAreClosing || menu == mMenu) { + dismiss(); + } + if (mPresenterCallback != null) { + mPresenterCallback.onCloseMenu(menu, allMenusAreClosing); + } + } + + @Override + public boolean onOpenSubMenu(MenuBuilder subMenu) { + if (mPresenterCallback != null) { + return mPresenterCallback.onOpenSubMenu(subMenu); + } + return false; + } + + public void onClick(DialogInterface dialog, int which) { + mMenu.performItemAction((MenuItemImpl) mPresenter.getAdapter().getItem(which), 0); + } +} diff --git a/android/support/v7/internal/view/menu/MenuItemImpl.java b/android/support/v7/internal/view/menu/MenuItemImpl.java new file mode 100644 index 0000000000..a2e9783c53 --- /dev/null +++ b/android/support/v7/internal/view/menu/MenuItemImpl.java @@ -0,0 +1,743 @@ +/* + * 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 android.support.v7.internal.view.menu; + +import android.content.ActivityNotFoundException; +import android.content.Context; +import android.content.Intent; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.support.v4.content.ContextCompat; +import android.support.v4.view.ActionProvider; +import android.support.v4.internal.view.SupportMenuItem; +import android.support.v4.view.MenuItemCompat; +import android.support.v7.internal.widget.TintManager; +import android.util.Log; +import android.view.ContextMenu.ContextMenuInfo; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.SubMenu; +import android.view.View; +import android.view.ViewDebug; +import android.widget.LinearLayout; + +/** + * @hide + */ +public final class MenuItemImpl implements SupportMenuItem { + + 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 SupportMenuItem.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 MenuItemCompat.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) { + + /*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; + } + + @Override + public boolean isEnabled() { + return (mFlags & ENABLED) != 0; + } + + @Override + public MenuItem setEnabled(boolean enabled) { + if (enabled) { + mFlags |= ENABLED; + } else { + mFlags &= ~ENABLED; + } + + mMenu.onItemsChanged(false); + + return this; + } + + @Override + public int getGroupId() { + return mGroup; + } + + @Override + @ViewDebug.CapturedViewProperty + public int getItemId() { + return mId; + } + + @Override + public int getOrder() { + return mCategoryOrder; + } + + public int getOrdering() { + return mOrdering; + } + + @Override + public Intent getIntent() { + return mIntent; + } + + @Override + public MenuItem setIntent(Intent intent) { + mIntent = intent; + return this; + } + + Runnable getCallback() { + return mItemCallback; + } + + public MenuItem setCallback(Runnable callback) { + mItemCallback = callback; + return this; + } + + @Override + public char getAlphabeticShortcut() { + return mShortcutAlphabeticChar; + } + + @Override + public MenuItem setAlphabeticShortcut(char alphaChar) { + if (mShortcutAlphabeticChar == alphaChar) { + return this; + } + + mShortcutAlphabeticChar = Character.toLowerCase(alphaChar); + + mMenu.onItemsChanged(false); + + return this; + } + + @Override + public char getNumericShortcut() { + return mShortcutNumericChar; + } + + @Override + public MenuItem setNumericShortcut(char numericChar) { + if (mShortcutNumericChar == numericChar) { + return this; + } + + mShortcutNumericChar = numericChar; + + mMenu.onItemsChanged(false); + + return this; + } + + @Override + 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); + } + + @Override + public SubMenu getSubMenu() { + return mSubMenu; + } + + @Override + public boolean hasSubMenu() { + return mSubMenu != null; + } + + void setSubMenu(SubMenuBuilder subMenu) { + mSubMenu = subMenu; + + subMenu.setHeaderTitle(getTitle()); + } + + @Override + @ViewDebug.CapturedViewProperty + public CharSequence getTitle() { + return mTitle; + } + + /** + * Gets the title for a particular {@link MenuView.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(); + } + + @Override + public MenuItem setTitle(CharSequence title) { + mTitle = title; + + mMenu.onItemsChanged(false); + + if (mSubMenu != null) { + mSubMenu.setHeaderTitle(title); + } + + return this; + } + + @Override + public MenuItem setTitle(int title) { + return setTitle(mMenu.getContext().getString(title)); + } + + @Override + public CharSequence getTitleCondensed() { + final CharSequence ctitle = mTitleCondensed != null ? mTitleCondensed : mTitle; + + if (Build.VERSION.SDK_INT < 18 && ctitle != null && !(ctitle instanceof String)) { + // For devices pre-JB-MR2, where we have a non-String CharSequence, we need to + // convert this to a String so that EventLog.writeEvent() does not throw an exception + // in Activity.onMenuItemSelected() + return ctitle.toString(); + } else { + // Else, we just return the condensed title + return ctitle; + } + } + + @Override + 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; + } + + @Override + public Drawable getIcon() { + if (mIconDrawable != null) { + return mIconDrawable; + } + + if (mIconResId != NO_ICON) { + Drawable icon = TintManager.getDrawable(mMenu.getContext(), mIconResId); + mIconResId = NO_ICON; + mIconDrawable = icon; + return icon; + } + + return null; + } + + @Override + public MenuItem setIcon(Drawable icon) { + mIconResId = NO_ICON; + mIconDrawable = icon; + mMenu.onItemsChanged(false); + + return this; + } + + @Override + 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; + } + + @Override + public boolean isCheckable() { + return (mFlags & CHECKABLE) == CHECKABLE; + } + + @Override + 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; + } + + @Override + public boolean isChecked() { + return (mFlags & CHECKED) == CHECKED; + } + + @Override + 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); + } + } + + @Override + public boolean isVisible() { + if (mActionProvider != null && mActionProvider.overridesItemVisibility()) { + return (mFlags & HIDDEN) == 0 && mActionProvider.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; + } + + @Override + 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; + } + + @Override + public MenuItem setOnMenuItemClickListener(MenuItem.OnMenuItemClickListener clickListener) { + mClickListener = clickListener; + return this; + } + + @Override + public String toString() { + return mTitle.toString(); + } + + void setMenuInfo(ContextMenuInfo menuInfo) { + mMenuInfo = menuInfo; + } + + @Override + 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; + } + + @Override + 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); + } + + @Override + public SupportMenuItem 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; + } + + @Override + public SupportMenuItem setActionView(int resId) { + final Context context = mMenu.getContext(); + final LayoutInflater inflater = LayoutInflater.from(context); + setActionView(inflater.inflate(resId, new LinearLayout(context), false)); + return this; + } + + @Override + public View getActionView() { + if (mActionView != null) { + return mActionView; + } else if (mActionProvider != null) { + mActionView = mActionProvider.onCreateActionView(this); + return mActionView; + } else { + return null; + } + } + + @Override + public MenuItem setActionProvider(android.view.ActionProvider actionProvider) { + throw new UnsupportedOperationException( + "This is not supported, use MenuItemCompat.setActionProvider()"); + } + + @Override + public android.view.ActionProvider getActionProvider() { + throw new UnsupportedOperationException( + "This is not supported, use MenuItemCompat.getActionProvider()"); + } + + @Override + public ActionProvider getSupportActionProvider() { + return mActionProvider; + } + + @Override + public SupportMenuItem setSupportActionProvider(ActionProvider actionProvider) { + if (mActionProvider != null) { + mActionProvider.setVisibilityListener(null); + } + mActionView = null; + mActionProvider = actionProvider; + mMenu.onItemsChanged(true); // Measurement can be changed + if (mActionProvider != null) { + mActionProvider.setVisibilityListener(new ActionProvider.VisibilityListener() { + @Override + public void onActionProviderVisibilityChanged(boolean isVisible) { + mMenu.onItemVisibleChanged(MenuItemImpl.this); + } + }); + } + return this; + } + + @Override + public SupportMenuItem setShowAsActionFlags(int actionEnum) { + setShowAsAction(actionEnum); + return this; + } + + @Override + public boolean expandActionView() { + if (!hasCollapsibleActionView()) { + 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 SupportMenuItem setSupportOnActionExpandListener( + MenuItemCompat.OnActionExpandListener listener) { + mOnActionExpandListener = listener; + return this; + } + + public boolean hasCollapsibleActionView() { + if ((mShowAsAction & SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW) != 0) { + if (mActionView == null && mActionProvider != null) { + mActionView = mActionProvider.onCreateActionView(this); + } + return mActionView != null; + } + return false; + } + + public void setActionViewExpanded(boolean isExpanded) { + mIsActionViewExpanded = isExpanded; + mMenu.onItemsChanged(false); + } + + @Override + public boolean isActionViewExpanded() { + return mIsActionViewExpanded; + } + + @Override + public MenuItem setOnActionExpandListener(MenuItem.OnActionExpandListener listener) { + throw new UnsupportedOperationException( + "This is not supported, use MenuItemCompat.setOnActionExpandListener()"); + } +} diff --git a/android/support/v7/internal/view/menu/MenuItemWrapperICS.java b/android/support/v7/internal/view/menu/MenuItemWrapperICS.java new file mode 100644 index 0000000000..3e6a99aa29 --- /dev/null +++ b/android/support/v7/internal/view/menu/MenuItemWrapperICS.java @@ -0,0 +1,401 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.view.menu; + +import android.annotation.TargetApi; +import android.content.Context; +import android.content.Intent; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.support.v4.internal.view.SupportMenuItem; +import android.support.v4.view.ActionProvider; +import android.support.v4.view.MenuItemCompat; +import android.support.v7.view.CollapsibleActionView; +import android.util.Log; +import android.view.ContextMenu; +import android.view.MenuItem; +import android.view.SubMenu; +import android.view.View; +import android.widget.FrameLayout; + +import java.lang.reflect.Method; + +/** + * Wraps a support {@link SupportMenuItem} as a framework {@link android.view.MenuItem} + * @hide + */ +@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) +public class MenuItemWrapperICS extends BaseMenuWrapper implements MenuItem { + static final String LOG_TAG = "MenuItemWrapper"; + + // Reflection Method to call setExclusiveCheckable + private Method mSetExclusiveCheckableMethod; + + MenuItemWrapperICS(Context context, SupportMenuItem object) { + super(context, object); + } + + @Override + public int getItemId() { + return mWrappedObject.getItemId(); + } + + @Override + public int getGroupId() { + return mWrappedObject.getGroupId(); + } + + @Override + public int getOrder() { + return mWrappedObject.getOrder(); + } + + @Override + public MenuItem setTitle(CharSequence title) { + mWrappedObject.setTitle(title); + return this; + } + + @Override + public MenuItem setTitle(int title) { + mWrappedObject.setTitle(title); + return this; + } + + @Override + public CharSequence getTitle() { + return mWrappedObject.getTitle(); + } + + @Override + public MenuItem setTitleCondensed(CharSequence title) { + mWrappedObject.setTitleCondensed(title); + return this; + } + + @Override + public CharSequence getTitleCondensed() { + return mWrappedObject.getTitleCondensed(); + } + + @Override + public MenuItem setIcon(Drawable icon) { + mWrappedObject.setIcon(icon); + return this; + } + + @Override + public MenuItem setIcon(int iconRes) { + mWrappedObject.setIcon(iconRes); + return this; + } + + @Override + public Drawable getIcon() { + return mWrappedObject.getIcon(); + } + + @Override + public MenuItem setIntent(Intent intent) { + mWrappedObject.setIntent(intent); + return this; + } + + @Override + public Intent getIntent() { + return mWrappedObject.getIntent(); + } + + @Override + public MenuItem setShortcut(char numericChar, char alphaChar) { + mWrappedObject.setShortcut(numericChar, alphaChar); + return this; + } + + @Override + public MenuItem setNumericShortcut(char numericChar) { + mWrappedObject.setNumericShortcut(numericChar); + return this; + } + + @Override + public char getNumericShortcut() { + return mWrappedObject.getNumericShortcut(); + } + + @Override + public MenuItem setAlphabeticShortcut(char alphaChar) { + mWrappedObject.setAlphabeticShortcut(alphaChar); + return this; + } + + @Override + public char getAlphabeticShortcut() { + return mWrappedObject.getAlphabeticShortcut(); + } + + @Override + public MenuItem setCheckable(boolean checkable) { + mWrappedObject.setCheckable(checkable); + return this; + } + + @Override + public boolean isCheckable() { + return mWrappedObject.isCheckable(); + } + + @Override + public MenuItem setChecked(boolean checked) { + mWrappedObject.setChecked(checked); + return this; + } + + @Override + public boolean isChecked() { + return mWrappedObject.isChecked(); + } + + @Override + public MenuItem setVisible(boolean visible) { + return mWrappedObject.setVisible(visible); + } + + @Override + public boolean isVisible() { + return mWrappedObject.isVisible(); + } + + @Override + public MenuItem setEnabled(boolean enabled) { + mWrappedObject.setEnabled(enabled); + return this; + } + + @Override + public boolean isEnabled() { + return mWrappedObject.isEnabled(); + } + + @Override + public boolean hasSubMenu() { + return mWrappedObject.hasSubMenu(); + } + + @Override + public SubMenu getSubMenu() { + return getSubMenuWrapper(mWrappedObject.getSubMenu()); + } + + @Override + public MenuItem setOnMenuItemClickListener(OnMenuItemClickListener menuItemClickListener) { + mWrappedObject.setOnMenuItemClickListener(menuItemClickListener != null ? + new OnMenuItemClickListenerWrapper(menuItemClickListener) : null); + return this; + } + + @Override + public ContextMenu.ContextMenuInfo getMenuInfo() { + return mWrappedObject.getMenuInfo(); + } + + @Override + public void setShowAsAction(int actionEnum) { + mWrappedObject.setShowAsAction(actionEnum); + } + + @Override + public MenuItem setShowAsActionFlags(int actionEnum) { + mWrappedObject.setShowAsActionFlags(actionEnum); + return this; + } + + @Override + public MenuItem setActionView(View view) { + if (view instanceof android.view.CollapsibleActionView) { + view = new CollapsibleActionViewWrapper(view); + } + mWrappedObject.setActionView(view); + return this; + } + + @Override + public MenuItem setActionView(int resId) { + // Make framework menu item inflate the view + mWrappedObject.setActionView(resId); + + View actionView = mWrappedObject.getActionView(); + if (actionView instanceof android.view.CollapsibleActionView) { + // If the inflated Action View is support-collapsible, wrap it + mWrappedObject.setActionView(new CollapsibleActionViewWrapper(actionView)); + } + return this; + } + + @Override + public View getActionView() { + View actionView = mWrappedObject.getActionView(); + if (actionView instanceof CollapsibleActionViewWrapper) { + return ((CollapsibleActionViewWrapper) actionView).getWrappedView(); + } + return actionView; + } + + @Override + public MenuItem setActionProvider(android.view.ActionProvider provider) { + mWrappedObject.setSupportActionProvider( + provider != null ? createActionProviderWrapper(provider) : null); + return this; + } + + @Override + public android.view.ActionProvider getActionProvider() { + ActionProvider provider = mWrappedObject.getSupportActionProvider(); + if (provider instanceof ActionProviderWrapper) { + return ((ActionProviderWrapper) provider).mInner; + } + return null; + } + + @Override + public boolean expandActionView() { + return mWrappedObject.expandActionView(); + } + + @Override + public boolean collapseActionView() { + return mWrappedObject.collapseActionView(); + } + + @Override + public boolean isActionViewExpanded() { + return mWrappedObject.isActionViewExpanded(); + } + + @Override + public MenuItem setOnActionExpandListener(MenuItem.OnActionExpandListener listener) { + mWrappedObject.setSupportOnActionExpandListener(listener != null ? + new OnActionExpandListenerWrapper(listener) : null); + return this; + } + + public void setExclusiveCheckable(boolean checkable) { + try { + if (mSetExclusiveCheckableMethod == null) { + mSetExclusiveCheckableMethod = mWrappedObject.getClass() + .getDeclaredMethod("setExclusiveCheckable", Boolean.TYPE); + } + mSetExclusiveCheckableMethod.invoke(mWrappedObject, checkable); + } catch (Exception e) { + Log.w(LOG_TAG, "Error while calling setExclusiveCheckable", e); + } + } + + ActionProviderWrapper createActionProviderWrapper(android.view.ActionProvider provider) { + return new ActionProviderWrapper(mContext, provider); + } + + private class OnMenuItemClickListenerWrapper extends BaseWrapper + implements android.view.MenuItem.OnMenuItemClickListener { + + OnMenuItemClickListenerWrapper(OnMenuItemClickListener object) { + super(object); + } + + @Override + public boolean onMenuItemClick(android.view.MenuItem item) { + return mWrappedObject.onMenuItemClick(getMenuItemWrapper(item)); + } + } + + private class OnActionExpandListenerWrapper extends BaseWrapper + implements MenuItemCompat.OnActionExpandListener { + + OnActionExpandListenerWrapper(MenuItem.OnActionExpandListener object) { + super(object); + } + + @Override + public boolean onMenuItemActionExpand(android.view.MenuItem item) { + return mWrappedObject.onMenuItemActionExpand(getMenuItemWrapper(item)); + } + + @Override + public boolean onMenuItemActionCollapse(android.view.MenuItem item) { + return mWrappedObject.onMenuItemActionCollapse(getMenuItemWrapper(item)); + } + } + + class ActionProviderWrapper extends android.support.v4.view.ActionProvider { + final android.view.ActionProvider mInner; + + public ActionProviderWrapper(Context context, android.view.ActionProvider inner) { + super(context); + mInner = inner; + } + + @Override + public View onCreateActionView() { + return mInner.onCreateActionView(); + } + + @Override + public boolean onPerformDefaultAction() { + return mInner.onPerformDefaultAction(); + } + + @Override + public boolean hasSubMenu() { + return mInner.hasSubMenu(); + } + + @Override + public void onPrepareSubMenu(android.view.SubMenu subMenu) { + mInner.onPrepareSubMenu(getSubMenuWrapper(subMenu)); + } + } + + /** + * Wrap a support {@link android.support.v7.view.CollapsibleActionView} into a framework + * {@link android.view.CollapsibleActionView}. + */ + static class CollapsibleActionViewWrapper extends FrameLayout + implements CollapsibleActionView { + + final android.view.CollapsibleActionView mWrappedView; + + CollapsibleActionViewWrapper(View actionView) { + super(actionView.getContext()); + mWrappedView = (android.view.CollapsibleActionView) actionView; + addView(actionView); + } + + @Override + public void onActionViewExpanded() { + mWrappedView.onActionViewExpanded(); + } + + @Override + public void onActionViewCollapsed() { + mWrappedView.onActionViewCollapsed(); + } + + View getWrappedView() { + return (View) mWrappedView; + } + } +} diff --git a/android/support/v7/internal/view/menu/MenuItemWrapperJB.java b/android/support/v7/internal/view/menu/MenuItemWrapperJB.java new file mode 100644 index 0000000000..4dbb0e0fbf --- /dev/null +++ b/android/support/v7/internal/view/menu/MenuItemWrapperJB.java @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.view.menu; + +import android.annotation.TargetApi; +import android.content.Context; +import android.os.Build; +import android.support.v4.internal.view.SupportMenuItem; +import android.support.v4.view.ActionProvider; +import android.view.MenuItem; +import android.view.View; + +/** + * Wraps a support {@link SupportMenuItem} as a framework {@link android.view.MenuItem} + * @hide + */ +@TargetApi(Build.VERSION_CODES.JELLY_BEAN) +class MenuItemWrapperJB extends MenuItemWrapperICS { + + MenuItemWrapperJB(Context context, SupportMenuItem object) { + super(context, object); + } + + @Override + ActionProviderWrapper createActionProviderWrapper(android.view.ActionProvider provider) { + return new ActionProviderWrapperJB(mContext, provider); + } + + class ActionProviderWrapperJB extends ActionProviderWrapper + implements android.view.ActionProvider.VisibilityListener { + ActionProvider.VisibilityListener mListener; + + public ActionProviderWrapperJB(Context context, android.view.ActionProvider inner) { + super(context, inner); + } + + @Override + public View onCreateActionView(MenuItem forItem) { + return mInner.onCreateActionView(forItem); + } + + @Override + public boolean overridesItemVisibility() { + return mInner.overridesItemVisibility(); + } + + @Override + public boolean isVisible() { + return mInner.isVisible(); + } + + @Override + public void refreshVisibility() { + mInner.refreshVisibility(); + } + + @Override + public void setVisibilityListener(ActionProvider.VisibilityListener listener) { + mListener = listener; + mInner.setVisibilityListener(listener != null ? this : null); + } + + @Override + public void onActionProviderVisibilityChanged(boolean isVisible) { + if (mListener != null) { + mListener.onActionProviderVisibilityChanged(isVisible); + } + } + } +} diff --git a/android/support/v7/internal/view/menu/MenuPopupHelper.java b/android/support/v7/internal/view/menu/MenuPopupHelper.java new file mode 100644 index 0000000000..af7deefe4a --- /dev/null +++ b/android/support/v7/internal/view/menu/MenuPopupHelper.java @@ -0,0 +1,404 @@ +/* + * 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 android.support.v7.internal.view.menu; + +import android.content.Context; +import android.content.res.Resources; +import android.os.Parcelable; +import android.support.v7.appcompat.R; +import android.support.v7.widget.ListPopupWindow; +import android.view.Gravity; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.MenuItem; +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 java.util.ArrayList; + +/** + * 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, + MenuPresenter { + + private static final String TAG = "MenuPopupHelper"; + + static final int ITEM_LAYOUT = R.layout.abc_popup_menu_item_layout; + + private final Context mContext; + private final LayoutInflater mInflater; + private final MenuBuilder mMenu; + private final MenuAdapter mAdapter; + private final boolean mOverflowOnly; + private final int mPopupMaxWidth; + private final int mPopupStyleAttr; + private final int mPopupStyleRes; + + private View mAnchorView; + private ListPopupWindow mPopup; + private ViewTreeObserver mTreeObserver; + private Callback mPresenterCallback; + + boolean mForceShowIcon; + + private ViewGroup mMeasureParent; + + /** Whether the cached content width value is valid. */ + private boolean mHasContentWidth; + + /** Cached content width from {@link #measureContentWidth}. */ + private int mContentWidth; + + private int mDropDownGravity = Gravity.NO_GRAVITY; + + public MenuPopupHelper(Context context, MenuBuilder menu) { + this(context, menu, null, false, R.attr.popupMenuStyle); + } + + public MenuPopupHelper(Context context, MenuBuilder menu, View anchorView) { + this(context, menu, anchorView, false, R.attr.popupMenuStyle); + } + + public MenuPopupHelper(Context context, MenuBuilder menu, View anchorView, + boolean overflowOnly, int popupStyleAttr) { + this(context, menu, anchorView, overflowOnly, popupStyleAttr, 0); + } + + public MenuPopupHelper(Context context, MenuBuilder menu, View anchorView, + boolean overflowOnly, int popupStyleAttr, int popupStyleRes) { + mContext = context; + mInflater = LayoutInflater.from(context); + mMenu = menu; + mAdapter = new MenuAdapter(mMenu); + mOverflowOnly = overflowOnly; + mPopupStyleAttr = popupStyleAttr; + mPopupStyleRes = popupStyleRes; + + final Resources res = context.getResources(); + mPopupMaxWidth = Math.max(res.getDisplayMetrics().widthPixels / 2, + res.getDimensionPixelSize(R.dimen.abc_config_prefDialogWidth)); + + mAnchorView = anchorView; + + // Present the menu using our context, not the menu builder's context. + menu.addMenuPresenter(this, context); + } + + public void setAnchorView(View anchor) { + mAnchorView = anchor; + } + + public void setForceShowIcon(boolean forceShow) { + mForceShowIcon = forceShow; + } + + public void setGravity(int gravity) { + mDropDownGravity = gravity; + } + + public void show() { + if (!tryShow()) { + throw new IllegalStateException("MenuPopupHelper cannot be used without an anchor"); + } + } + + public ListPopupWindow getPopup() { + return mPopup; + } + + public boolean tryShow() { + mPopup = new ListPopupWindow(mContext, null, mPopupStyleAttr, mPopupStyleRes); + mPopup.setOnDismissListener(this); + mPopup.setOnItemClickListener(this); + 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); + mPopup.setAnchorView(anchor); + mPopup.setDropDownGravity(mDropDownGravity); + } else { + return false; + } + + if (!mHasContentWidth) { + mContentWidth = measureContentWidth(); + mHasContentWidth = true; + } + + mPopup.setContentWidth(mContentWidth); + 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; + } + } + + 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() { + // Menus don't tend to be long, so this is more sane than it looks. + int maxWidth = 0; + View itemView = null; + int itemType = 0; + + final ListAdapter adapter = mAdapter; + 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); + + final int itemWidth = itemView.getMeasuredWidth(); + if (itemWidth >= mPopupMaxWidth) { + return mPopupMaxWidth; + } else if (itemWidth > maxWidth) { + maxWidth = itemWidth; + } + } + + return maxWidth; + } + + @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 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) { + mHasContentWidth = false; + + 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); + 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; + 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; + } + + @Override + public void notifyDataSetChanged() { + findExpandedIndex(); + super.notifyDataSetChanged(); + } + } +} + diff --git a/android/support/v7/internal/view/menu/MenuPresenter.java b/android/support/v7/internal/view/menu/MenuPresenter.java new file mode 100644 index 0000000000..4e92426153 --- /dev/null +++ b/android/support/v7/internal/view/menu/MenuPresenter.java @@ -0,0 +1,153 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.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. + * + * @hide + */ +public interface MenuPresenter { + + /** + * Called by menu implementation to notify another component of open/close events. + * + * @hide + */ + 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, MenuBuilder)}. + * + * @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/support/v7/internal/view/menu/MenuView.java b/android/support/v7/internal/view/menu/MenuView.java new file mode 100644 index 0000000000..7a3aabccbd --- /dev/null +++ b/android/support/v7/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 android.support.v7.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/support/v7/internal/view/menu/MenuWrapperFactory.java b/android/support/v7/internal/view/menu/MenuWrapperFactory.java new file mode 100644 index 0000000000..7435874758 --- /dev/null +++ b/android/support/v7/internal/view/menu/MenuWrapperFactory.java @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.view.menu; + +import android.content.Context; +import android.os.Build; +import android.support.v4.internal.view.SupportMenu; +import android.support.v4.internal.view.SupportMenuItem; +import android.support.v4.internal.view.SupportSubMenu; +import android.view.Menu; +import android.view.MenuItem; +import android.view.SubMenu; + +/** + * @hide + */ +public final class MenuWrapperFactory { + private MenuWrapperFactory() { + } + + public static Menu wrapSupportMenu(Context context, SupportMenu supportMenu) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { + return new MenuWrapperICS(context, supportMenu); + } + throw new UnsupportedOperationException(); + } + + public static MenuItem wrapSupportMenuItem(Context context, SupportMenuItem supportMenuItem) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + return new MenuItemWrapperJB(context, supportMenuItem); + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { + return new MenuItemWrapperICS(context, supportMenuItem); + } + throw new UnsupportedOperationException(); + } + + public static SubMenu wrapSupportSubMenu(Context context, SupportSubMenu supportSubMenu) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { + return new SubMenuWrapperICS(context, supportSubMenu); + } + throw new UnsupportedOperationException(); + } +} diff --git a/android/support/v7/internal/view/menu/MenuWrapperICS.java b/android/support/v7/internal/view/menu/MenuWrapperICS.java new file mode 100644 index 0000000000..79833f5c3a --- /dev/null +++ b/android/support/v7/internal/view/menu/MenuWrapperICS.java @@ -0,0 +1,177 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.view.menu; + +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.support.v4.internal.view.SupportMenu; +import android.support.v4.internal.view.SupportMenuItem; +import android.view.KeyEvent; +import android.view.Menu; +import android.view.MenuItem; +import android.view.SubMenu; + +/** + * Wraps a support {@link SupportMenu} as a framework {@link android.view.Menu} + * @hide + */ +class MenuWrapperICS extends BaseMenuWrapper implements Menu { + + MenuWrapperICS(Context context, SupportMenu object) { + super(context, object); + } + + @Override + public MenuItem add(CharSequence title) { + return getMenuItemWrapper(mWrappedObject.add(title)); + } + + @Override + public MenuItem add(int titleRes) { + return getMenuItemWrapper(mWrappedObject.add(titleRes)); + } + + @Override + public MenuItem add(int groupId, int itemId, int order, CharSequence title) { + return getMenuItemWrapper(mWrappedObject.add(groupId, itemId, order, title)); + } + + @Override + public MenuItem add(int groupId, int itemId, int order, int titleRes) { + return getMenuItemWrapper(mWrappedObject.add(groupId, itemId, order, titleRes)); + } + + @Override + public SubMenu addSubMenu(CharSequence title) { + return getSubMenuWrapper(mWrappedObject.addSubMenu(title)); + } + + @Override + public SubMenu addSubMenu(int titleRes) { + return getSubMenuWrapper(mWrappedObject.addSubMenu(titleRes)); + } + + @Override + public SubMenu addSubMenu(int groupId, int itemId, int order, CharSequence title) { + return getSubMenuWrapper(mWrappedObject.addSubMenu(groupId, itemId, order, title)); + } + + @Override + public SubMenu addSubMenu(int groupId, int itemId, int order, int titleRes) { + return getSubMenuWrapper( + mWrappedObject.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) { + android.view.MenuItem[] items = null; + if (outSpecificItems != null) { + items = new android.view.MenuItem[outSpecificItems.length]; + } + + int result = mWrappedObject + .addIntentOptions(groupId, itemId, order, caller, specifics, intent, flags, items); + + if (items != null) { + for (int i = 0, z = items.length; i < z; i++) { + outSpecificItems[i] = getMenuItemWrapper(items[i]); + } + } + + return result; + } + + @Override + public void removeItem(int id) { + internalRemoveItem(id); + mWrappedObject.removeItem(id); + } + + @Override + public void removeGroup(int groupId) { + internalRemoveGroup(groupId); + mWrappedObject.removeGroup(groupId); + } + + @Override + public void clear() { + internalClear(); + mWrappedObject.clear(); + } + + @Override + public void setGroupCheckable(int group, boolean checkable, boolean exclusive) { + mWrappedObject.setGroupCheckable(group, checkable, exclusive); + } + + @Override + public void setGroupVisible(int group, boolean visible) { + mWrappedObject.setGroupVisible(group, visible); + } + + @Override + public void setGroupEnabled(int group, boolean enabled) { + mWrappedObject.setGroupEnabled(group, enabled); + } + + @Override + public boolean hasVisibleItems() { + return mWrappedObject.hasVisibleItems(); + } + + @Override + public MenuItem findItem(int id) { + return getMenuItemWrapper(mWrappedObject.findItem(id)); + } + + @Override + public int size() { + return mWrappedObject.size(); + } + + @Override + public MenuItem getItem(int index) { + return getMenuItemWrapper(mWrappedObject.getItem(index)); + } + + @Override + public void close() { + mWrappedObject.close(); + } + + @Override + public boolean performShortcut(int keyCode, KeyEvent event, int flags) { + return mWrappedObject.performShortcut(keyCode, event, flags); + } + + @Override + public boolean isShortcutKey(int keyCode, KeyEvent event) { + return mWrappedObject.isShortcutKey(keyCode, event); + } + + @Override + public boolean performIdentifierAction(int id, int flags) { + return mWrappedObject.performIdentifierAction(id, flags); + } + + @Override + public void setQwertyMode(boolean isQwerty) { + mWrappedObject.setQwertyMode(isQwerty); + } +} diff --git a/android/support/v7/internal/view/menu/SubMenuBuilder.java b/android/support/v7/internal/view/menu/SubMenuBuilder.java new file mode 100644 index 0000000000..90bf77f2c7 --- /dev/null +++ b/android/support/v7/internal/view/menu/SubMenuBuilder.java @@ -0,0 +1,141 @@ +/* + * 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 android.support.v7.internal.view.menu; + +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.support.v4.content.ContextCompat; +import android.view.Menu; +import android.view.MenuItem; +import android.view.SubMenu; +import android.view.View; + +/** + * The model for a sub menu, which is an extension of the menu. Most methods are proxied to the + * parent menu. + * + * @hide + */ +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) { + super.setHeaderIconInt(icon); + return this; + } + + public SubMenu setHeaderIcon(int iconRes) { + super.setHeaderIconInt(ContextCompat.getDrawable(getContext(), iconRes)); + return this; + } + + public SubMenu setHeaderTitle(CharSequence title) { + super.setHeaderTitleInt(title); + return this; + } + + public SubMenu setHeaderTitle(int titleRes) { + super.setHeaderTitleInt(getContext().getResources().getString(titleRes)); + return this; + } + + public SubMenu setHeaderView(View view) { + super.setHeaderViewInt(view); + return this; + } + + @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/support/v7/internal/view/menu/SubMenuWrapperICS.java b/android/support/v7/internal/view/menu/SubMenuWrapperICS.java new file mode 100644 index 0000000000..a4306e996b --- /dev/null +++ b/android/support/v7/internal/view/menu/SubMenuWrapperICS.java @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.view.menu; + +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.support.v4.internal.view.SupportSubMenu; +import android.view.MenuItem; +import android.view.SubMenu; +import android.view.View; + +/** + * Wraps a support {@link SupportSubMenu} as a framework {@link android.view.SubMenu} + * @hide + */ +class SubMenuWrapperICS extends MenuWrapperICS implements SubMenu { + + SubMenuWrapperICS(Context context, SupportSubMenu subMenu) { + super(context, subMenu); + } + + @Override + public SupportSubMenu getWrappedObject() { + return (SupportSubMenu) mWrappedObject; + } + + @Override + public SubMenu setHeaderTitle(int titleRes) { + getWrappedObject().setHeaderTitle(titleRes); + return this; + } + + @Override + public SubMenu setHeaderTitle(CharSequence title) { + getWrappedObject().setHeaderTitle(title); + return this; + } + + @Override + public SubMenu setHeaderIcon(int iconRes) { + getWrappedObject().setHeaderIcon(iconRes); + return this; + } + + @Override + public SubMenu setHeaderIcon(Drawable icon) { + getWrappedObject().setHeaderIcon(icon); + return this; + } + + @Override + public SubMenu setHeaderView(View view) { + getWrappedObject().setHeaderView(view); + return this; + } + + @Override + public void clearHeader() { + getWrappedObject().clearHeader(); + } + + @Override + public SubMenu setIcon(int iconRes) { + getWrappedObject().setIcon(iconRes); + return this; + } + + @Override + public SubMenu setIcon(Drawable icon) { + getWrappedObject().setIcon(icon); + return this; + } + + @Override + public MenuItem getItem() { + return getMenuItemWrapper(getWrappedObject().getItem()); + } +} diff --git a/android/support/v7/internal/widget/AbsActionBarView.java b/android/support/v7/internal/widget/AbsActionBarView.java new file mode 100644 index 0000000000..0d06065ec7 --- /dev/null +++ b/android/support/v7/internal/widget/AbsActionBarView.java @@ -0,0 +1,288 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package android.support.v7.internal.widget; + +import android.content.Context; +import android.content.res.Configuration; +import android.content.res.TypedArray; +import android.os.Build; +import android.support.v4.view.ViewCompat; +import android.support.v4.view.ViewPropertyAnimatorCompat; +import android.support.v4.view.ViewPropertyAnimatorListener; +import android.support.v7.appcompat.R; +import android.support.v7.internal.view.ViewPropertyAnimatorCompatSet; +import android.support.v7.widget.ActionMenuPresenter; +import android.support.v7.widget.ActionMenuView; +import android.util.AttributeSet; +import android.util.TypedValue; +import android.view.ContextThemeWrapper; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.DecelerateInterpolator; +import android.view.animation.Interpolator; + +abstract class AbsActionBarView extends ViewGroup { + private static final Interpolator sAlphaInterpolator = new DecelerateInterpolator(); + + private static final int FADE_DURATION = 200; + + protected final VisibilityAnimListener mVisAnimListener = new VisibilityAnimListener(); + + /** Context against which to inflate popup menus. */ + protected final Context mPopupContext; + + protected ActionMenuView mMenuView; + protected ActionMenuPresenter mActionMenuPresenter; + protected ViewGroup mSplitView; + protected boolean mSplitActionBar; + protected boolean mSplitWhenNarrow; + protected int mContentHeight; + + protected ViewPropertyAnimatorCompat mVisibilityAnim; + + AbsActionBarView(Context context) { + this(context, null); + } + + AbsActionBarView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + AbsActionBarView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + + final TypedValue tv = new TypedValue(); + if (context.getTheme().resolveAttribute(R.attr.actionBarPopupTheme, tv, true) + && tv.resourceId != 0) { + mPopupContext = new ContextThemeWrapper(context, tv.resourceId); + } else { + mPopupContext = context; + } + } + + @Override + protected void onConfigurationChanged(Configuration newConfig) { + if (Build.VERSION.SDK_INT >= 8) { + 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.ActionBar, + R.attr.actionBarStyle, 0); + setContentHeight(a.getLayoutDimension(R.styleable.ActionBar_height, 0)); + a.recycle(); + + 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 setSplitToolbar(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(ViewGroup 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) { + ViewCompat.setAlpha(this, 0f); + if (mSplitView != null && mMenuView != null) { + ViewCompat.setAlpha(mMenuView, 0f); + } + } + ViewPropertyAnimatorCompat anim = ViewCompat.animate(this).alpha(1f); + anim.setDuration(FADE_DURATION); + anim.setInterpolator(sAlphaInterpolator); + if (mSplitView != null && mMenuView != null) { + ViewPropertyAnimatorCompatSet set = new ViewPropertyAnimatorCompatSet(); + ViewPropertyAnimatorCompat splitAnim = ViewCompat.animate(mMenuView).alpha(1f); + splitAnim.setDuration(FADE_DURATION); + set.setListener(mVisAnimListener.withFinalVisibility(anim, visibility)); + set.play(anim).play(splitAnim); + set.start(); + } else { + anim.setListener(mVisAnimListener.withFinalVisibility(anim, visibility)); + anim.start(); + } + } else { + ViewPropertyAnimatorCompat anim = ViewCompat.animate(this).alpha(0f); + anim.setDuration(FADE_DURATION); + anim.setInterpolator(sAlphaInterpolator); + if (mSplitView != null && mMenuView != null) { + ViewPropertyAnimatorCompatSet set = new ViewPropertyAnimatorCompatSet(); + ViewPropertyAnimatorCompat splitAnim = ViewCompat.animate(mMenuView).alpha(0f); + splitAnim.setDuration(FADE_DURATION); + set.setListener(mVisAnimListener.withFinalVisibility(anim, visibility)); + set.play(anim).play(splitAnim); + set.start(); + } else { + anim.setListener(mVisAnimListener.withFinalVisibility(anim, visibility)); + anim.start(); + } + } + } + + 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 isOverflowMenuShowPending() { + if (mActionMenuPresenter != null) { + return mActionMenuPresenter.isOverflowMenuShowPending(); + } + return false; + } + + public boolean isOverflowReserved() { + return mActionMenuPresenter != null && mActionMenuPresenter.isOverflowReserved(); + } + + public boolean canShowOverflowMenu() { + return isOverflowReserved() && getVisibility() == VISIBLE; + } + + 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); + } + + static protected int next(int x, int val, boolean isRtl) { + return isRtl ? x - val : x + val; + } + + protected int positionChild(View child, int x, int y, int contentHeight, boolean reverse) { + int childWidth = child.getMeasuredWidth(); + int childHeight = child.getMeasuredHeight(); + int childTop = y + (contentHeight - childHeight) / 2; + + if (reverse) { + child.layout(x - childWidth, childTop, x, childTop + childHeight); + } else { + child.layout(x, childTop, x + childWidth, childTop + childHeight); + } + + return (reverse ? -childWidth : childWidth); + } + + protected class VisibilityAnimListener implements ViewPropertyAnimatorListener { + private boolean mCanceled = false; + int mFinalVisibility; + + public VisibilityAnimListener withFinalVisibility(ViewPropertyAnimatorCompat animation, + int visibility) { + mVisibilityAnim = animation; + mFinalVisibility = visibility; + return this; + } + + @Override + public void onAnimationStart(View view) { + setVisibility(VISIBLE); + mCanceled = false; + } + + @Override + public void onAnimationEnd(View view) { + if (mCanceled) return; + + mVisibilityAnim = null; + setVisibility(mFinalVisibility); + if (mSplitView != null && mMenuView != null) { + mMenuView.setVisibility(mFinalVisibility); + } + } + + @Override + public void onAnimationCancel(View view) { + mCanceled = true; + } + } +} diff --git a/android/support/v7/internal/widget/AbsSpinnerCompat.java b/android/support/v7/internal/widget/AbsSpinnerCompat.java new file mode 100644 index 0000000000..0ec8e7a7b8 --- /dev/null +++ b/android/support/v7/internal/widget/AbsSpinnerCompat.java @@ -0,0 +1,451 @@ +/* + * 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 android.support.v7.internal.widget; + +import android.content.Context; +import android.database.DataSetObserver; +import android.graphics.Rect; +import android.os.Parcel; +import android.os.Parcelable; +import android.support.v4.view.ViewCompat; +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. + */ +abstract class AbsSpinnerCompat extends AdapterViewCompat { + SpinnerAdapter mAdapter; + + int mHeightMeasureSpec; + int mWidthMeasureSpec; + + 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; + + AbsSpinnerCompat(Context context) { + super(context); + initAbsSpinner(); + } + + AbsSpinnerCompat(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + AbsSpinnerCompat(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + initAbsSpinner(); + } + + /** + * 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 paddingLeft = getPaddingLeft(); + final int paddingTop = getPaddingTop(); + final int paddingRight = getPaddingRight(); + final int paddingBottom = getPaddingBottom(); + + mSpinnerPadding.left = paddingLeft > mSelectionLeftPadding ? paddingLeft + : mSelectionLeftPadding; + mSpinnerPadding.top = paddingTop > mSelectionTopPadding ? paddingTop + : mSelectionTopPadding; + mSpinnerPadding.right = paddingRight > mSelectionRightPadding ? paddingRight + : mSelectionRightPadding; + mSpinnerPadding.bottom = paddingBottom > mSelectionBottomPadding ? paddingBottom + : 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.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()); + + heightSize = ViewCompat.resolveSizeAndState(preferredHeight, heightMeasureSpec, 0); + widthSize = ViewCompat.resolveSizeAndState(preferredWidth, widthMeasureSpec, 0); + + 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 AbsSpinnerCompat.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 AbsSpinnerCompat#onSaveInstanceState()} + */ + SavedState(Parcelable superState) { + super(superState); + } + + /** + * Constructor called from {@link #CREATOR} + */ + 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(); + } + } +} \ No newline at end of file diff --git a/android/support/v7/internal/widget/ActionBarBackgroundDrawable.java b/android/support/v7/internal/widget/ActionBarBackgroundDrawable.java new file mode 100644 index 0000000000..6248f798be --- /dev/null +++ b/android/support/v7/internal/widget/ActionBarBackgroundDrawable.java @@ -0,0 +1,44 @@ +package android.support.v7.internal.widget; + +import android.graphics.Canvas; +import android.graphics.ColorFilter; +import android.graphics.drawable.Drawable; + +class ActionBarBackgroundDrawable extends Drawable { + + final ActionBarContainer mContainer; + + public ActionBarBackgroundDrawable(ActionBarContainer container) { + mContainer = container; + } + + @Override + public void draw(Canvas canvas) { + if (mContainer.mIsSplit) { + if (mContainer.mSplitBackground != null) { + mContainer.mSplitBackground.draw(canvas); + } + } else { + if (mContainer.mBackground != null) { + mContainer.mBackground.draw(canvas); + } + if (mContainer.mStackedBackground != null && mContainer.mIsStacked) { + mContainer.mStackedBackground.draw(canvas); + } + } + } + + @Override + public void setAlpha(int alpha) { + } + + @Override + public void setColorFilter(ColorFilter cf) { + } + + @Override + public int getOpacity() { + return 0; + } + +} diff --git a/android/support/v7/internal/widget/ActionBarBackgroundDrawableV21.java b/android/support/v7/internal/widget/ActionBarBackgroundDrawableV21.java new file mode 100644 index 0000000000..19cd5a1998 --- /dev/null +++ b/android/support/v7/internal/widget/ActionBarBackgroundDrawableV21.java @@ -0,0 +1,26 @@ +package android.support.v7.internal.widget; + +import android.graphics.Outline; +import android.graphics.drawable.Drawable; +import android.support.annotation.NonNull; + +class ActionBarBackgroundDrawableV21 extends ActionBarBackgroundDrawable { + + public ActionBarBackgroundDrawableV21(ActionBarContainer container) { + super(container); + } + + @Override + public void getOutline(@NonNull Outline outline) { + if (mContainer.mIsSplit) { + if (mContainer.mSplitBackground != null) { + mContainer.mSplitBackground.getOutline(outline); + } + } else { + // ignore the stacked background for shadow casting + if (mContainer.mBackground != null) { + mContainer.mBackground.getOutline(outline); + } + } + } +} diff --git a/android/support/v7/internal/widget/ActionBarContainer.java b/android/support/v7/internal/widget/ActionBarContainer.java new file mode 100644 index 0000000000..239fe4ce93 --- /dev/null +++ b/android/support/v7/internal/widget/ActionBarContainer.java @@ -0,0 +1,326 @@ +/* + * 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 android.support.v7.internal.widget; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.support.v7.appcompat.R; +import android.support.v7.internal.VersionUtils; +import android.support.v7.view.ActionMode; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; + +/** + * 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 FrameLayout { + private boolean mIsTransitioning; + private View mTabContainer; + private View mActionBarView; + private View mContextView; + + Drawable mBackground; + Drawable mStackedBackground; + Drawable mSplitBackground; + boolean mIsSplit; + boolean mIsStacked; + private int mHeight; + + public ActionBarContainer(Context context) { + this(context, null); + } + + public ActionBarContainer(Context context, AttributeSet attrs) { + super(context, attrs); + + // Set a transparent background so that we project appropriately. + final Drawable bg = VersionUtils.isAtLeastL() + ? new ActionBarBackgroundDrawableV21(this) + : new ActionBarBackgroundDrawable(this); + setBackgroundDrawable(bg); + + TypedArray a = context.obtainStyledAttributes(attrs, + R.styleable.ActionBar); + mBackground = a.getDrawable(R.styleable.ActionBar_background); + mStackedBackground = a.getDrawable( + R.styleable.ActionBar_backgroundStacked); + mHeight = a.getDimensionPixelSize(R.styleable.ActionBar_height, -1); + + if (getId() == R.id.split_action_bar) { + mIsSplit = true; + mSplitBackground = a.getDrawable(R.styleable.ActionBar_backgroundSplit); + } + a.recycle(); + + setWillNotDraw(mIsSplit ? mSplitBackground == null : + mBackground == null && mStackedBackground == null); + } + + @Override + public void onFinishInflate() { + super.onFinishInflate(); + mActionBarView = findViewById(R.id.action_bar); + mContextView = findViewById(R.id.action_context_bar); + } + + public void setPrimaryBackground(Drawable bg) { + if (mBackground != null) { + mBackground.setCallback(null); + unscheduleDrawable(mBackground); + } + mBackground = bg; + if (bg != null) { + bg.setCallback(this); + if (mActionBarView != null) { + mBackground.setBounds(mActionBarView.getLeft(), mActionBarView.getTop(), + mActionBarView.getRight(), mActionBarView.getBottom()); + } + } + setWillNotDraw(mIsSplit ? mSplitBackground == null : + mBackground == null && mStackedBackground == null); + invalidate(); + } + + public void setStackedBackground(Drawable bg) { + if (mStackedBackground != null) { + mStackedBackground.setCallback(null); + unscheduleDrawable(mStackedBackground); + } + mStackedBackground = bg; + if (bg != null) { + bg.setCallback(this); + if ((mIsStacked && mStackedBackground != null)) { + mStackedBackground.setBounds(mTabContainer.getLeft(), mTabContainer.getTop(), + mTabContainer.getRight(), mTabContainer.getBottom()); + } + } + setWillNotDraw(mIsSplit ? mSplitBackground == null : + mBackground == null && mStackedBackground == null); + invalidate(); + } + + public void setSplitBackground(Drawable bg) { + if (mSplitBackground != null) { + mSplitBackground.setCallback(null); + unscheduleDrawable(mSplitBackground); + } + mSplitBackground = bg; + if (bg != null) { + bg.setCallback(this); + if (mIsSplit && mSplitBackground != null) { + mSplitBackground.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight()); + } + } + setWillNotDraw(mIsSplit ? mSplitBackground == null : + mBackground == null && mStackedBackground == null); + invalidate(); + } + + @Override + public void setVisibility(int visibility) { + super.setVisibility(visibility); + final boolean isVisible = visibility == VISIBLE; + if (mBackground != null) mBackground.setVisible(isVisible, false); + if (mStackedBackground != null) mStackedBackground.setVisible(isVisible, false); + if (mSplitBackground != null) mSplitBackground.setVisible(isVisible, false); + } + + @Override + protected boolean verifyDrawable(Drawable who) { + return (who == mBackground && !mIsSplit) || (who == mStackedBackground && mIsStacked) || + (who == mSplitBackground && mIsSplit) || super.verifyDrawable(who); + } + + @Override + protected void drawableStateChanged() { + super.drawableStateChanged(); + if (mBackground != null && mBackground.isStateful()) { + mBackground.setState(getDrawableState()); + } + if (mStackedBackground != null && mStackedBackground.isStateful()) { + mStackedBackground.setState(getDrawableState()); + } + if (mSplitBackground != null && mSplitBackground.isStateful()) { + mSplitBackground.setState(getDrawableState()); + } + } + + public void jumpDrawablesToCurrentState() { + if (Build.VERSION.SDK_INT >= 11) { + super.jumpDrawablesToCurrentState(); + if (mBackground != null) { + mBackground.jumpToCurrentState(); + } + if (mStackedBackground != null) { + mStackedBackground.jumpToCurrentState(); + } + if (mSplitBackground != null) { + mSplitBackground.jumpToCurrentState(); + } + } + } + + /** + * 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; + } + + 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 ActionMode startActionModeForChild(View child, ActionMode.Callback callback) { + // No starting an action mode for an action bar child! (Where would it go?) + return null; + } + + @Override + public android.view.ActionMode startActionModeForChild(View originalView, + android.view.ActionMode.Callback callback) { + return null; + } + + private boolean isCollapsed(View view) { + return view == null || view.getVisibility() == GONE || view.getMeasuredHeight() == 0; + } + + private int getMeasuredHeightWithMargins(View view) { + final LayoutParams lp = (LayoutParams) view.getLayoutParams(); + return view.getMeasuredHeight() + lp.topMargin + lp.bottomMargin; + } + + @Override + public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + if (mActionBarView == null && + MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST && mHeight >= 0) { + heightMeasureSpec = MeasureSpec.makeMeasureSpec( + Math.min(mHeight, MeasureSpec.getSize(heightMeasureSpec)), MeasureSpec.AT_MOST); + } + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + + if (mActionBarView == null) return; + + final int mode = MeasureSpec.getMode(heightMeasureSpec); + if (mTabContainer != null && mTabContainer.getVisibility() != GONE + && mode != MeasureSpec.EXACTLY) { + final int topMarginForTabs; + if (!isCollapsed(mActionBarView)) { + topMarginForTabs = getMeasuredHeightWithMargins(mActionBarView); + } else if (!isCollapsed(mContextView)) { + topMarginForTabs = getMeasuredHeightWithMargins(mContextView); + } else { + topMarginForTabs = 0; + } + final int maxHeight = mode == MeasureSpec.AT_MOST ? + MeasureSpec.getSize(heightMeasureSpec) : Integer.MAX_VALUE; + setMeasuredDimension(getMeasuredWidth(), + Math.min(topMarginForTabs + getMeasuredHeightWithMargins(mTabContainer), + maxHeight)); + } + } + + @Override + public void onLayout(boolean changed, int l, int t, int r, int b) { + super.onLayout(changed, l, t, r, b); + + final View tabContainer = mTabContainer; + final boolean hasTabs = tabContainer != null && tabContainer.getVisibility() != GONE; + + if (tabContainer != null && tabContainer.getVisibility() != GONE) { + final int containerHeight = getMeasuredHeight(); + final LayoutParams lp = (LayoutParams) tabContainer.getLayoutParams(); + final int tabHeight = tabContainer.getMeasuredHeight(); + tabContainer.layout(l, containerHeight - tabHeight - lp.bottomMargin, r, + containerHeight - lp.bottomMargin); + } + + boolean needsInvalidate = false; + if (mIsSplit) { + if (mSplitBackground != null) { + mSplitBackground.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight()); + needsInvalidate = true; + } + } else { + if (mBackground != null) { + if (mActionBarView.getVisibility() == View.VISIBLE) { + mBackground.setBounds(mActionBarView.getLeft(), mActionBarView.getTop(), + mActionBarView.getRight(), mActionBarView.getBottom()); + } else if (mContextView != null && + mContextView.getVisibility() == View.VISIBLE) { + mBackground.setBounds(mContextView.getLeft(), mContextView.getTop(), + mContextView.getRight(), mContextView.getBottom()); + } else { + mBackground.setBounds(0, 0, 0, 0); + } + needsInvalidate = true; + } + mIsStacked = hasTabs; + if (hasTabs && mStackedBackground != null) { + mStackedBackground.setBounds(tabContainer.getLeft(), tabContainer.getTop(), + tabContainer.getRight(), tabContainer.getBottom()); + needsInvalidate = true; + } + } + + if (needsInvalidate) { + invalidate(); + } + } +} diff --git a/android/support/v7/internal/widget/ActionBarContextView.java b/android/support/v7/internal/widget/ActionBarContextView.java new file mode 100644 index 0000000000..97a44ad68e --- /dev/null +++ b/android/support/v7/internal/widget/ActionBarContextView.java @@ -0,0 +1,546 @@ +/* + * 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 android.support.v7.internal.widget; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.support.v4.view.ViewCompat; +import android.support.v4.view.ViewPropertyAnimatorCompat; +import android.support.v4.view.ViewPropertyAnimatorListener; +import android.support.v7.appcompat.R; +import android.support.v7.internal.view.ViewPropertyAnimatorCompatSet; +import android.support.v7.view.ActionMode; +import android.support.v7.widget.ActionMenuPresenter; +import android.support.v7.widget.ActionMenuView; +import android.support.v7.internal.view.menu.MenuBuilder; +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; + +/** + * @hide + */ +public class ActionBarContextView extends AbsActionBarView implements ViewPropertyAnimatorListener { + private static final String TAG = "ActionBarContextView"; + + private CharSequence mTitle; + private CharSequence mSubtitle; + + private View mClose; + private View mCustomView; + private LinearLayout mTitleLayout; + private TextView mTitleView; + private TextView mSubtitleView; + private int mTitleStyleRes; + private int mSubtitleStyleRes; + private Drawable mSplitBackground; + private boolean mTitleOptional; + private int mCloseItemLayout; + + private ViewPropertyAnimatorCompatSet 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); + + final TintTypedArray a = TintTypedArray.obtainStyledAttributes(context, attrs, + R.styleable.ActionMode, defStyle, 0); + setBackgroundDrawable(a.getDrawable( + R.styleable.ActionMode_background)); + mTitleStyleRes = a.getResourceId( + R.styleable.ActionMode_titleTextStyle, 0); + mSubtitleStyleRes = a.getResourceId( + R.styleable.ActionMode_subtitleTextStyle, 0); + + mContentHeight = a.getLayoutDimension( + R.styleable.ActionMode_height, 0); + + mSplitBackground = a.getDrawable( + R.styleable.ActionMode_backgroundSplit); + + mCloseItemLayout = a.getResourceId( + R.styleable.ActionMode_closeItemLayout, + R.layout.abc_action_mode_close_item_material); + + a.recycle(); + } + + @Override + public void onDetachedFromWindow() { + super.onDetachedFromWindow(); + if (mActionMenuPresenter != null) { + mActionMenuPresenter.hideOverflowMenu(); + mActionMenuPresenter.hideSubMenus(); + } + } + + @Override + public void setSplitToolbar(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.setSplitToolbar(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.abc_action_bar_title_item, this); + mTitleLayout = (LinearLayout) getChildAt(getChildCount() - 1); + mTitleView = (TextView) mTitleLayout.findViewById(R.id.action_bar_title); + mSubtitleView = (TextView) mTitleLayout.findViewById(R.id.action_bar_subtitle); + if (mTitleStyleRes != 0) { + mTitleView.setTextAppearance(getContext(), mTitleStyleRes); + } + if (mSubtitleStyleRes != 0) { + mSubtitleView.setTextAppearance(getContext(), 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(getContext()); + mClose = inflater.inflate(mCloseItemLayout, this, false); + addView(mClose); + } else if (mClose.getParent() == null) { + addView(mClose); + } + + View closeButton = mClose.findViewById(R.id.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(getContext()); + mActionMenuPresenter.setReserveOverflow(true); + + final LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT, + LayoutParams.MATCH_PARENT); + if (!mSplitActionBar) { + menu.addMenuPresenter(mActionMenuPresenter, mPopupContext); + 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, mPopupContext); + 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 ViewPropertyAnimatorCompatSet a = mCurrentAnimation; + if (a != null) { + mCurrentAnimation = null; + a.cancel(); + } + } + + 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) { + if (mTitleOptional) { + final int titleWidthSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); + mTitleLayout.measure(titleWidthSpec, childSpecHeight); + final int titleWidth = mTitleLayout.getMeasuredWidth(); + final boolean titleFits = titleWidth <= availableWidth; + if (titleFits) { + availableWidth -= titleWidth; + } + mTitleLayout.setVisibility(titleFits ? VISIBLE : GONE); + } else { + 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 ViewPropertyAnimatorCompatSet makeInAnimation() { + ViewCompat.setTranslationX(mClose, -mClose.getWidth() - + ((MarginLayoutParams) mClose.getLayoutParams()).leftMargin); + ViewPropertyAnimatorCompat buttonAnimator = ViewCompat.animate(mClose).translationX(0); + buttonAnimator.setDuration(200); + buttonAnimator.setListener(this); + buttonAnimator.setInterpolator(new DecelerateInterpolator()); + + ViewPropertyAnimatorCompatSet set = new ViewPropertyAnimatorCompatSet(); + 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++) { + View child = mMenuView.getChildAt(i); + ViewCompat.setScaleY(child, 0); + ViewPropertyAnimatorCompat a = ViewCompat.animate(child).scaleY(1); + a.setDuration(300); + set.play(a); + } + } + } + + return set; + } + + private ViewPropertyAnimatorCompatSet makeOutAnimation() { + ViewPropertyAnimatorCompat buttonAnimator = ViewCompat.animate(mClose) + .translationX(-mClose.getWidth() - + ((MarginLayoutParams) mClose.getLayoutParams()).leftMargin); + buttonAnimator.setDuration(200); + buttonAnimator.setListener(this); + buttonAnimator.setInterpolator(new DecelerateInterpolator()); + + ViewPropertyAnimatorCompatSet set = new ViewPropertyAnimatorCompatSet(); + set.play(buttonAnimator); + + if (mMenuView != null) { + final int count = mMenuView.getChildCount(); + if (count > 0) { + for (int i = 0; i < 0; i++) { + View child = mMenuView.getChildAt(i); + ViewCompat.setScaleY(child, 1); + ViewPropertyAnimatorCompat a = ViewCompat.animate(child).scaleY(0); + a.setDuration(300); + set.play(a); + } + } + } + + return set; + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + final boolean isLayoutRtl = ViewUtils.isLayoutRtl(this); + int x = isLayoutRtl ? r - l - getPaddingRight() : getPaddingLeft(); + final int y = getPaddingTop(); + final int contentHeight = b - t - getPaddingTop() - getPaddingBottom(); + + if (mClose != null && mClose.getVisibility() != GONE) { + MarginLayoutParams lp = (MarginLayoutParams) mClose.getLayoutParams(); + final int startMargin = (isLayoutRtl ? lp.rightMargin : lp.leftMargin); + final int endMargin = (isLayoutRtl ? lp.leftMargin : lp.rightMargin); + x = next(x, startMargin, isLayoutRtl); + x += positionChild(mClose, x, y, contentHeight, isLayoutRtl); + x = next(x, endMargin, isLayoutRtl); + + if (mAnimateInOnLayout) { + mAnimationMode = ANIMATE_IN; + mCurrentAnimation = makeInAnimation(); + mCurrentAnimation.start(); + mAnimateInOnLayout = false; + } + } + + if (mTitleLayout != null && mCustomView == null && mTitleLayout.getVisibility() != GONE) { + x += positionChild(mTitleLayout, x, y, contentHeight, isLayoutRtl); + } + + if (mCustomView != null) { + x += positionChild(mCustomView, x, y, contentHeight, isLayoutRtl); + } + + x = isLayoutRtl ? getPaddingLeft() : r - l - getPaddingRight(); + + if (mMenuView != null) { + x += positionChild(mMenuView, x, y, contentHeight, !isLayoutRtl); + } + } + + @Override + public void onAnimationStart(View view) { + } + + @Override + public void onAnimationEnd(View view) { + if (mAnimationMode == ANIMATE_OUT) { + killMode(); + } + mAnimationMode = ANIMATE_IDLE; + } + + @Override + public void onAnimationCancel(View view) { + } + + @Override + public boolean shouldDelayChildPressedState() { + return false; + } + + @Override + public void onInitializeAccessibilityEvent(AccessibilityEvent event) { + if (Build.VERSION.SDK_INT >= 14) { + if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) { + // Action mode started + event.setSource(this); + event.setClassName(getClass().getName()); + event.setPackageName(getContext().getPackageName()); + event.setContentDescription(mTitle); + } else { + super.onInitializeAccessibilityEvent(event); + } + } + } + + public void setTitleOptional(boolean titleOptional) { + if (titleOptional != mTitleOptional) { + requestLayout(); + } + mTitleOptional = titleOptional; + } + + public boolean isTitleOptional() { + return mTitleOptional; + } +} diff --git a/android/support/v7/internal/widget/ActionBarOverlayLayout.java b/android/support/v7/internal/widget/ActionBarOverlayLayout.java new file mode 100644 index 0000000000..1332b8b8ed --- /dev/null +++ b/android/support/v7/internal/widget/ActionBarOverlayLayout.java @@ -0,0 +1,822 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.content.res.Configuration; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.os.Parcelable; +import android.support.v4.view.ViewCompat; +import android.support.v4.view.ViewPropertyAnimatorCompat; +import android.support.v4.view.ViewPropertyAnimatorListener; +import android.support.v4.view.ViewPropertyAnimatorListenerAdapter; +import android.support.v4.widget.ScrollerCompat; +import android.support.v7.appcompat.R; +import android.support.v7.internal.VersionUtils; +import android.support.v7.internal.view.menu.MenuPresenter; +import android.support.v7.widget.Toolbar; +import android.util.AttributeSet; +import android.util.SparseArray; +import android.view.Menu; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; + +/** + * Special layout for the containing of an overlay action bar (and its content) to correctly handle + * fitting system windows when the content has request that its layout ignore them. + * + * @hide + */ +public class ActionBarOverlayLayout extends ViewGroup implements DecorContentParent { + private static final String TAG = "ActionBarOverlayLayout"; + + private int mActionBarHeight; + //private WindowDecorActionBar mActionBar; + private int mWindowVisibility = View.VISIBLE; + + // The main UI elements that we handle the layout of. + private ContentFrameLayout mContent; + private ActionBarContainer mActionBarBottom; + private ActionBarContainer mActionBarTop; + + // Some interior UI elements. + private DecorToolbar mDecorToolbar; + + // Content overlay drawable - generally the action bar's shadow + private Drawable mWindowContentOverlay; + private boolean mIgnoreWindowContentOverlay; + + private boolean mOverlayMode; + private boolean mHasNonEmbeddedTabs; + private boolean mHideOnContentScroll; + private boolean mAnimatingForFling; + private int mHideOnContentScrollReference; + private int mLastSystemUiVisibility; + private final Rect mBaseContentInsets = new Rect(); + private final Rect mLastBaseContentInsets = new Rect(); + private final Rect mContentInsets = new Rect(); + private final Rect mBaseInnerInsets = new Rect(); + private final Rect mInnerInsets = new Rect(); + private final Rect mLastInnerInsets = new Rect(); + + private ActionBarVisibilityCallback mActionBarVisibilityCallback; + + private final int ACTION_BAR_ANIMATE_DELAY = 600; // ms + + private ScrollerCompat mFlingEstimator; + + private ViewPropertyAnimatorCompat mCurrentActionBarTopAnimator; + private ViewPropertyAnimatorCompat mCurrentActionBarBottomAnimator; + + private final ViewPropertyAnimatorListener mTopAnimatorListener + = new ViewPropertyAnimatorListenerAdapter() { + @Override + public void onAnimationEnd(View view) { + mCurrentActionBarTopAnimator = null; + mAnimatingForFling = false; + } + + @Override + public void onAnimationCancel(View view) { + mCurrentActionBarTopAnimator = null; + mAnimatingForFling = false; + } + }; + + private final ViewPropertyAnimatorListener mBottomAnimatorListener = + new ViewPropertyAnimatorListenerAdapter() { + @Override + public void onAnimationEnd(View view) { + mCurrentActionBarBottomAnimator = null; + mAnimatingForFling = false; + } + + @Override + public void onAnimationCancel(View view) { + mCurrentActionBarBottomAnimator = null; + mAnimatingForFling = false; + } + }; + + private final Runnable mRemoveActionBarHideOffset = new Runnable() { + public void run() { + haltActionBarHideOffsetAnimations(); + mCurrentActionBarTopAnimator = ViewCompat.animate(mActionBarTop).translationY(0) + .setListener(mTopAnimatorListener); + if (mActionBarBottom != null && mActionBarBottom.getVisibility() != GONE) { + mCurrentActionBarBottomAnimator = ViewCompat.animate(mActionBarBottom).translationY(0) + .setListener(mBottomAnimatorListener); + } + } + }; + + private final Runnable mAddActionBarHideOffset = new Runnable() { + public void run() { + haltActionBarHideOffsetAnimations(); + mCurrentActionBarTopAnimator = ViewCompat.animate(mActionBarTop) + .translationY(-mActionBarTop.getHeight()) + .setListener(mTopAnimatorListener); + if (mActionBarBottom != null && mActionBarBottom.getVisibility() != GONE) { + mCurrentActionBarBottomAnimator = ViewCompat.animate(mActionBarBottom) + .translationY(mActionBarBottom.getHeight()) + .setListener(mBottomAnimatorListener); + } + } + }; + +// public static final Property ACTION_BAR_HIDE_OFFSET = +// new IntProperty("actionBarHideOffset") { +// +// @Override +// public void setValue(ActionBarOverlayLayout object, int value) { +// object.setActionBarHideOffset(value); +// } +// +// @Override +// public Integer get(ActionBarOverlayLayout object) { +// return object.getActionBarHideOffset(); +// } +// }; + + static final int[] ATTRS = new int [] { + R.attr.actionBarSize, + android.R.attr.windowContentOverlay + }; + + public ActionBarOverlayLayout(Context context) { + super(context); + init(context); + } + + public ActionBarOverlayLayout(Context context, AttributeSet attrs) { + super(context, attrs); + init(context); + } + + private void init(Context context) { + TypedArray ta = getContext().getTheme().obtainStyledAttributes(ATTRS); + mActionBarHeight = ta.getDimensionPixelSize(0, 0); + mWindowContentOverlay = ta.getDrawable(1); + setWillNotDraw(mWindowContentOverlay == null); + ta.recycle(); + + mIgnoreWindowContentOverlay = context.getApplicationInfo().targetSdkVersion < + Build.VERSION_CODES.KITKAT; + + mFlingEstimator = ScrollerCompat.create(context); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + haltActionBarHideOffsetAnimations(); + } + + public void setActionBarVisibilityCallback(ActionBarVisibilityCallback cb) { + mActionBarVisibilityCallback = cb; + if (getWindowToken() != null) { + // This is being initialized after being added to a window; + // make sure to update all state now. + mActionBarVisibilityCallback.onWindowVisibilityChanged(mWindowVisibility); + if (mLastSystemUiVisibility != 0) { + int newVis = mLastSystemUiVisibility; + onWindowSystemUiVisibilityChanged(newVis); + ViewCompat.requestApplyInsets(this); + } + } + } + + public void setOverlayMode(boolean overlayMode) { + mOverlayMode = overlayMode; + + /* + * Drawing the window content overlay was broken before K so starting to draw it + * again unexpectedly will cause artifacts in some apps. They should fix it. + */ + mIgnoreWindowContentOverlay = overlayMode && + getContext().getApplicationInfo().targetSdkVersion < + Build.VERSION_CODES.KITKAT; + } + + public boolean isInOverlayMode() { + return mOverlayMode; + } + + public void setHasNonEmbeddedTabs(boolean hasNonEmbeddedTabs) { + mHasNonEmbeddedTabs = hasNonEmbeddedTabs; + } + + public void setShowingForActionMode(boolean showing) { + // TODO: Add workaround for this +// if (showing) { +// // Here's a fun hack: if the status bar is currently being hidden, +// // and the application has asked for stable content insets, then +// // we will end up with the action mode action bar being shown +// // without the status bar, but moved below where the status bar +// // would be. Not nice. Trying to have this be positioned +// // correctly is not easy (basically we need yet *another* content +// // inset from the window manager to know where to put it), so +// // instead we will just temporarily force the status bar to be shown. +// if ((getWindowSystemUiVisibility() & (SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN +// | SYSTEM_UI_FLAG_LAYOUT_STABLE)) +// == (SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | SYSTEM_UI_FLAG_LAYOUT_STABLE)) { +// setDisabledSystemUiVisibility(SYSTEM_UI_FLAG_FULLSCREEN); +// } +// } else { +// setDisabledSystemUiVisibility(0); +// } + } + + protected void onConfigurationChanged(Configuration newConfig) { + if (Build.VERSION.SDK_INT >= 8) { + super.onConfigurationChanged(newConfig); + } + init(getContext()); + ViewCompat.requestApplyInsets(this); + } + + public void onWindowSystemUiVisibilityChanged(int visible) { + if (Build.VERSION.SDK_INT >= 16) { + super.onWindowSystemUiVisibilityChanged(visible); + } + pullChildren(); + final int diff = mLastSystemUiVisibility ^ visible; + mLastSystemUiVisibility = visible; + final boolean barVisible = (visible & SYSTEM_UI_FLAG_FULLSCREEN) == 0; + final boolean stable = (visible & SYSTEM_UI_FLAG_LAYOUT_STABLE) != 0; + if (mActionBarVisibilityCallback != null) { + // We want the bar to be visible if it is not being hidden, + // or the app has not turned on a stable UI mode (meaning they + // are performing explicit layout around the action bar). + mActionBarVisibilityCallback.enableContentAnimations(!stable); + if (barVisible || !stable) mActionBarVisibilityCallback.showForSystem(); + else mActionBarVisibilityCallback.hideForSystem(); + } + if ((diff & SYSTEM_UI_FLAG_LAYOUT_STABLE) != 0) { + if (mActionBarVisibilityCallback != null) { + ViewCompat.requestApplyInsets(this); + } + } + } + + @Override + protected void onWindowVisibilityChanged(int visibility) { + super.onWindowVisibilityChanged(visibility); + mWindowVisibility = visibility; + if (mActionBarVisibilityCallback != null) { + mActionBarVisibilityCallback.onWindowVisibilityChanged(visibility); + } + } + + private boolean applyInsets(View view, Rect insets, boolean left, boolean top, + boolean bottom, boolean right) { + boolean changed = false; + LayoutParams lp = (LayoutParams)view.getLayoutParams(); + if (left && lp.leftMargin != insets.left) { + changed = true; + lp.leftMargin = insets.left; + } + if (top && lp.topMargin != insets.top) { + changed = true; + lp.topMargin = insets.top; + } + if (right && lp.rightMargin != insets.right) { + changed = true; + lp.rightMargin = insets.right; + } + if (bottom && lp.bottomMargin != insets.bottom) { + changed = true; + lp.bottomMargin = insets.bottom; + } + return changed; + } + + @Override + protected boolean fitSystemWindows(Rect insets) { + pullChildren(); + + final int vis = ViewCompat.getWindowSystemUiVisibility(this); + final boolean stable = (vis & SYSTEM_UI_FLAG_LAYOUT_STABLE) != 0; + final Rect systemInsets = insets; + + // Since we're not the top level view in the window decor, we do not need to + // inset the Action Bars + + boolean changed = false; + mBaseInnerInsets.set(systemInsets); + ViewUtils.computeFitSystemWindows(this, mBaseInnerInsets, mBaseContentInsets); + if (!mLastBaseContentInsets.equals(mBaseContentInsets)) { + changed = true; + mLastBaseContentInsets.set(mBaseContentInsets); + } + + if (changed) { + requestLayout(); + } + + // We don't do any more at this point. To correctly compute the content/inner + // insets in all cases, we need to know the measured size of the various action + // bar elements. fitSystemWindows() happens before the measure pass, so we can't + // do that here. Instead we will take this up in onMeasure(). + return true; + } + + @Override + protected LayoutParams generateDefaultLayoutParams() { + return new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); + } + + @Override + public LayoutParams generateLayoutParams(AttributeSet attrs) { + return new LayoutParams(getContext(), attrs); + } + + @Override + protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) { + return new LayoutParams(p); + } + + @Override + protected boolean checkLayoutParams(ViewGroup.LayoutParams p) { + return p instanceof LayoutParams; + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + pullChildren(); + + int maxHeight = 0; + int maxWidth = 0; + int childState = 0; + + int topInset = 0; + int bottomInset = 0; + + measureChildWithMargins(mActionBarTop, widthMeasureSpec, 0, heightMeasureSpec, 0); + LayoutParams lp = (LayoutParams) mActionBarTop.getLayoutParams(); + maxWidth = Math.max(maxWidth, + mActionBarTop.getMeasuredWidth() + lp.leftMargin + lp.rightMargin); + maxHeight = Math.max(maxHeight, + mActionBarTop.getMeasuredHeight() + lp.topMargin + lp.bottomMargin); + childState = ViewUtils.combineMeasuredStates(childState, + ViewCompat.getMeasuredState(mActionBarTop)); + + // xlarge screen layout doesn't have bottom action bar. + if (mActionBarBottom != null) { + measureChildWithMargins(mActionBarBottom, widthMeasureSpec, 0, heightMeasureSpec, 0); + lp = (LayoutParams) mActionBarBottom.getLayoutParams(); + maxWidth = Math.max(maxWidth, + mActionBarBottom.getMeasuredWidth() + lp.leftMargin + lp.rightMargin); + maxHeight = Math.max(maxHeight, + mActionBarBottom.getMeasuredHeight() + lp.topMargin + lp.bottomMargin); + childState = ViewUtils.combineMeasuredStates(childState, + ViewCompat.getMeasuredState(mActionBarBottom)); + } + + final int vis = ViewCompat.getWindowSystemUiVisibility(this); + final boolean stable = (vis & SYSTEM_UI_FLAG_LAYOUT_STABLE) != 0; + + if (stable) { + // This is the standard space needed for the action bar. For stable measurement, + // we can't depend on the size currently reported by it -- this must remain constant. + topInset = mActionBarHeight; + if (mHasNonEmbeddedTabs) { + final View tabs = mActionBarTop.getTabContainer(); + if (tabs != null) { + // If tabs are not embedded, increase space on top to account for them. + topInset += mActionBarHeight; + } + } + } else if (mActionBarTop.getVisibility() != GONE) { + // This is the space needed on top of the window for all of the action bar + // and tabs. + topInset = mActionBarTop.getMeasuredHeight(); + } + + if (mDecorToolbar.isSplit()) { + // If action bar is split, adjust bottom insets for it. + if (mActionBarBottom != null) { + if (stable) { + bottomInset = mActionBarHeight; + } else { + bottomInset = mActionBarBottom.getMeasuredHeight(); + } + } + } + + // If the window has not requested system UI layout flags, we need to + // make sure its content is not being covered by system UI... though it + // will still be covered by the action bar if they have requested it to + // overlay. + mContentInsets.set(mBaseContentInsets); + mInnerInsets.set(mBaseInnerInsets); + if (!mOverlayMode && !stable) { + mContentInsets.top += topInset; + mContentInsets.bottom += bottomInset; + } else { + mInnerInsets.top += topInset; + mInnerInsets.bottom += bottomInset; + } + applyInsets(mContent, mContentInsets, true, true, true, true); + + if (!mLastInnerInsets.equals(mInnerInsets)) { + // If the inner insets have changed, we need to dispatch this down to + // the app's fitSystemWindows(). We do this before measuring the content + // view to keep the same semantics as the normal fitSystemWindows() call. + mLastInnerInsets.set(mInnerInsets); + + mContent.dispatchFitSystemWindows(mInnerInsets); + } + + measureChildWithMargins(mContent, widthMeasureSpec, 0, heightMeasureSpec, 0); + lp = (LayoutParams) mContent.getLayoutParams(); + maxWidth = Math.max(maxWidth, + mContent.getMeasuredWidth() + lp.leftMargin + lp.rightMargin); + maxHeight = Math.max(maxHeight, + mContent.getMeasuredHeight() + lp.topMargin + lp.bottomMargin); + childState = ViewUtils.combineMeasuredStates(childState, + ViewCompat.getMeasuredState(mContent)); + + // Account for padding too + maxWidth += getPaddingLeft() + getPaddingRight(); + maxHeight += getPaddingTop() + getPaddingBottom(); + + // Check against our minimum height and width + maxHeight = Math.max(maxHeight, getSuggestedMinimumHeight()); + maxWidth = Math.max(maxWidth, getSuggestedMinimumWidth()); + + setMeasuredDimension( + ViewCompat.resolveSizeAndState(maxWidth, widthMeasureSpec, childState), + ViewCompat.resolveSizeAndState(maxHeight, heightMeasureSpec, + childState << MEASURED_HEIGHT_STATE_SHIFT)); + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + final int count = getChildCount(); + + final int parentLeft = getPaddingLeft(); + final int parentRight = right - left - getPaddingRight(); + + final int parentTop = getPaddingTop(); + final int parentBottom = bottom - top - getPaddingBottom(); + + for (int i = 0; i < count; i++) { + final View child = getChildAt(i); + if (child.getVisibility() != GONE) { + final LayoutParams lp = (LayoutParams) child.getLayoutParams(); + + final int width = child.getMeasuredWidth(); + final int height = child.getMeasuredHeight(); + + int childLeft = parentLeft + lp.leftMargin; + int childTop; + if (child == mActionBarBottom) { + childTop = parentBottom - height - lp.bottomMargin; + } else { + childTop = parentTop + lp.topMargin; + } + + child.layout(childLeft, childTop, childLeft + width, childTop + height); + } + } + } + + @Override + public void draw(Canvas c) { + super.draw(c); + if (mWindowContentOverlay != null && !mIgnoreWindowContentOverlay) { + final int top = mActionBarTop.getVisibility() == VISIBLE ? + (int) (mActionBarTop.getBottom() + ViewCompat.getTranslationY(mActionBarTop) + 0.5f) + : 0; + mWindowContentOverlay.setBounds(0, top, getWidth(), + top + mWindowContentOverlay.getIntrinsicHeight()); + mWindowContentOverlay.draw(c); + } + } + + @Override + public boolean shouldDelayChildPressedState() { + return false; + } + + @Override + public boolean onStartNestedScroll(View child, View target, int axes) { + if ((axes & SCROLL_AXIS_VERTICAL) == 0 || mActionBarTop.getVisibility() != VISIBLE) { + return false; + } + return mHideOnContentScroll; + } + + @Override + public void onNestedScrollAccepted(View child, View target, int axes) { + super.onNestedScrollAccepted(child, target, axes); + mHideOnContentScrollReference = getActionBarHideOffset(); + haltActionBarHideOffsetAnimations(); + if (mActionBarVisibilityCallback != null) { + mActionBarVisibilityCallback.onContentScrollStarted(); + } + } + + @Override + public void onNestedScroll(View target, int dxConsumed, int dyConsumed, + int dxUnconsumed, int dyUnconsumed) { + mHideOnContentScrollReference += dyConsumed; + setActionBarHideOffset(mHideOnContentScrollReference); + } + + @Override + public void onStopNestedScroll(View target) { + super.onStopNestedScroll(target); + if (mHideOnContentScroll && !mAnimatingForFling) { + if (mHideOnContentScrollReference <= mActionBarTop.getHeight()) { + postRemoveActionBarHideOffset(); + } else { + postAddActionBarHideOffset(); + } + } + if (mActionBarVisibilityCallback != null) { + mActionBarVisibilityCallback.onContentScrollStopped(); + } + } + + @Override + public boolean onNestedFling(View target, float velocityX, float velocityY, boolean consumed) { + if (!mHideOnContentScroll || !consumed) { + return false; + } + if (shouldHideActionBarOnFling(velocityX, velocityY)) { + addActionBarHideOffset(); + } else { + removeActionBarHideOffset(); + } + mAnimatingForFling = true; + return true; + } + + void pullChildren() { + if (mContent == null) { + mContent = (ContentFrameLayout) findViewById(R.id.action_bar_activity_content); + mActionBarTop = (ActionBarContainer) findViewById(R.id.action_bar_container); + mDecorToolbar = getDecorToolbar(findViewById(R.id.action_bar)); + mActionBarBottom = (ActionBarContainer) findViewById(R.id.split_action_bar); + } + } + + private DecorToolbar getDecorToolbar(View view) { + if (view instanceof DecorToolbar) { + return (DecorToolbar) view; + } else if (view instanceof Toolbar) { + return ((Toolbar) view).getWrapper(); + } else { + throw new IllegalStateException("Can't make a decor toolbar out of " + + view.getClass().getSimpleName()); + } + } + + public void setHideOnContentScrollEnabled(boolean hideOnContentScroll) { + if (hideOnContentScroll != mHideOnContentScroll) { + mHideOnContentScroll = hideOnContentScroll; + if (!hideOnContentScroll) { + if (VersionUtils.isAtLeastL()) { + stopNestedScroll(); + } + haltActionBarHideOffsetAnimations(); + setActionBarHideOffset(0); + } + } + } + + public boolean isHideOnContentScrollEnabled() { + return mHideOnContentScroll; + } + + public int getActionBarHideOffset() { + return mActionBarTop != null ? -((int) ViewCompat.getTranslationY(mActionBarTop)) : 0; + } + + public void setActionBarHideOffset(int offset) { + haltActionBarHideOffsetAnimations(); + final int topHeight = mActionBarTop.getHeight(); + offset = Math.max(0, Math.min(offset, topHeight)); + ViewCompat.setTranslationY(mActionBarTop, -offset); + if (mActionBarBottom != null && mActionBarBottom.getVisibility() != GONE) { + // Match the hide offset proportionally for a split bar + final float fOffset = (float) offset / topHeight; + final int bOffset = (int) (mActionBarBottom.getHeight() * fOffset); + ViewCompat.setTranslationY(mActionBarBottom, bOffset); + } + } + + private void haltActionBarHideOffsetAnimations() { + removeCallbacks(mRemoveActionBarHideOffset); + removeCallbacks(mAddActionBarHideOffset); + if (mCurrentActionBarTopAnimator != null) { + mCurrentActionBarTopAnimator.cancel(); + } + if (mCurrentActionBarBottomAnimator != null) { + mCurrentActionBarBottomAnimator.cancel(); + } + } + + private void postRemoveActionBarHideOffset() { + haltActionBarHideOffsetAnimations(); + postDelayed(mRemoveActionBarHideOffset, ACTION_BAR_ANIMATE_DELAY); + } + + private void postAddActionBarHideOffset() { + haltActionBarHideOffsetAnimations(); + postDelayed(mAddActionBarHideOffset, ACTION_BAR_ANIMATE_DELAY); + } + + private void removeActionBarHideOffset() { + haltActionBarHideOffsetAnimations(); + mRemoveActionBarHideOffset.run(); + } + + private void addActionBarHideOffset() { + haltActionBarHideOffsetAnimations(); + mAddActionBarHideOffset.run(); + } + + private boolean shouldHideActionBarOnFling(float velocityX, float velocityY) { + mFlingEstimator.fling(0, 0, 0, (int) velocityY, 0, 0, Integer.MIN_VALUE, Integer.MAX_VALUE); + final int finalY = mFlingEstimator.getFinalY(); + return finalY > mActionBarTop.getHeight(); + } + + @Override + public void setWindowCallback(Window.Callback cb) { + pullChildren(); + mDecorToolbar.setWindowCallback(cb); + } + + @Override + public void setWindowTitle(CharSequence title) { + pullChildren(); + mDecorToolbar.setWindowTitle(title); + } + + @Override + public CharSequence getTitle() { + pullChildren(); + return mDecorToolbar.getTitle(); + } + + @Override + public void initFeature(int windowFeature) { + pullChildren(); + switch (windowFeature) { + case Window.FEATURE_PROGRESS: + mDecorToolbar.initProgress(); + break; + case Window.FEATURE_INDETERMINATE_PROGRESS: + mDecorToolbar.initIndeterminateProgress(); + break; + case Window.FEATURE_ACTION_BAR_OVERLAY: + setOverlayMode(true); + break; + } + } + + @Override + public void setUiOptions(int uiOptions) { + // Split Action Bar not included. + } + + @Override + public boolean hasIcon() { + pullChildren(); + return mDecorToolbar.hasIcon(); + } + + @Override + public boolean hasLogo() { + pullChildren(); + return mDecorToolbar.hasLogo(); + } + + @Override + public void setIcon(int resId) { + pullChildren(); + mDecorToolbar.setIcon(resId); + } + + @Override + public void setIcon(Drawable d) { + pullChildren(); + mDecorToolbar.setIcon(d); + } + + @Override + public void setLogo(int resId) { + pullChildren(); + mDecorToolbar.setLogo(resId); + } + + @Override + public boolean canShowOverflowMenu() { + pullChildren(); + return mDecorToolbar.canShowOverflowMenu(); + } + + @Override + public boolean isOverflowMenuShowing() { + pullChildren(); + return mDecorToolbar.isOverflowMenuShowing(); + } + + @Override + public boolean isOverflowMenuShowPending() { + pullChildren(); + return mDecorToolbar.isOverflowMenuShowPending(); + } + + @Override + public boolean showOverflowMenu() { + pullChildren(); + return mDecorToolbar.showOverflowMenu(); + } + + @Override + public boolean hideOverflowMenu() { + pullChildren(); + return mDecorToolbar.hideOverflowMenu(); + } + + @Override + public void setMenuPrepared() { + pullChildren(); + mDecorToolbar.setMenuPrepared(); + } + + @Override + public void setMenu(Menu menu, MenuPresenter.Callback cb) { + pullChildren(); + mDecorToolbar.setMenu(menu, cb); + } + + @Override + public void saveToolbarHierarchyState(SparseArray toolbarStates) { + pullChildren(); + mDecorToolbar.saveHierarchyState(toolbarStates); + } + + @Override + public void restoreToolbarHierarchyState(SparseArray toolbarStates) { + pullChildren(); + mDecorToolbar.restoreHierarchyState(toolbarStates); + } + + @Override + public void dismissPopups() { + pullChildren(); + mDecorToolbar.dismissPopupMenus(); + } + + public static class LayoutParams extends MarginLayoutParams { + public LayoutParams(Context c, AttributeSet attrs) { + super(c, attrs); + } + + public LayoutParams(int width, int height) { + super(width, height); + } + + public LayoutParams(ViewGroup.LayoutParams source) { + super(source); + } + + public LayoutParams(ViewGroup.MarginLayoutParams source) { + super(source); + } + } + + public interface ActionBarVisibilityCallback { + void onWindowVisibilityChanged(int visibility); + void showForSystem(); + void hideForSystem(); + void enableContentAnimations(boolean enable); + void onContentScrollStarted(); + void onContentScrollStopped(); + } +} diff --git a/android/support/v7/internal/widget/ActivityChooserModel.java b/android/support/v7/internal/widget/ActivityChooserModel.java new file mode 100644 index 0000000000..d97f8e7b9a --- /dev/null +++ b/android/support/v7/internal/widget/ActivityChooserModel.java @@ -0,0 +1,1100 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.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.AsyncTask; +import android.os.Build; +import android.support.v4.os.AsyncTaskCompat; +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.List; +import java.util.Map; + +/** + *

      + * 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 + */ +public 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 mActivities = 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 #readHistoricalDataIfNeeded()} 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 #persistHistoricalDataIfNeeded()} 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 #persistHistoricalDataIfNeeded()} a call to + * {@link #persistHistoricalDataIfNeeded()} 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 #persistHistoricalDataIfNeeded()} 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; + + /** + * Flag whether to reload the activities for the current intent. + */ + private boolean mReloadActivities = false; + + /** + * 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); + } + 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; + mReloadActivities = true; + ensureConsistentState(); + } + } + + /** + * 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) { + ensureConsistentState(); + return mActivities.size(); + } + } + + /** + * Gets an activity at a given index. + * + * @return The activity. + * + * @see ActivityResolveInfo + * @see #setIntent(Intent) + */ + public ResolveInfo getActivity(int index) { + synchronized (mInstanceLock) { + ensureConsistentState(); + return mActivities.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) { + synchronized (mInstanceLock) { + ensureConsistentState(); + List activities = mActivities; + 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 or there is not current intent + * set via {@link #setIntent(Intent)}. + * + * @see HistoricalRecord + * @see OnChooseActivityListener + */ + public Intent chooseActivity(int index) { + synchronized (mInstanceLock) { + if (mIntent == null) { + return null; + } + + ensureConsistentState(); + + ActivityResolveInfo chosenActivity = mActivities.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) { + synchronized (mInstanceLock) { + 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) { + ensureConsistentState(); + if (!mActivities.isEmpty()) { + return mActivities.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) { + synchronized (mInstanceLock) { + ensureConsistentState(); + + ActivityResolveInfo newDefaultActivity = mActivities.get(index); + ActivityResolveInfo oldDefaultActivity = mActivities.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); + } + } + + /** + * Persists the history data to the backing file if the latter + * was provided. Calling this method before a call to {@link #readHistoricalDataIfNeeded()} + * 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 #readHistoricalDataIfNeeded()}. + */ + private void persistHistoricalDataIfNeeded() { + if (!mReadShareHistoryCalled) { + throw new IllegalStateException("No preceding call to #readHistoricalData"); + } + if (!mHistoricalRecordsChanged) { + return; + } + mHistoricalRecordsChanged = false; + if (!TextUtils.isEmpty(mHistoryFileName)) { + AsyncTaskCompat.executeParallel(new PersistHistoryAsyncTask(), + mHistoricalRecords, mHistoryFileName); + } + } + + /** + * 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; + if (sortActivitiesIfNeeded()) { + 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; + pruneExcessiveHistoricalRecordsIfNeeded(); + if (sortActivitiesIfNeeded()) { + notifyChanged(); + } + } + } + + /** + * 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) { + ensureConsistentState(); + return mHistoricalRecords.size(); + } + } + + /** + * Ensures the model is in a consistent state which is the + * activities for the current intent have been loaded, the + * most recent history has been read, and the activities + * are sorted. + */ + private void ensureConsistentState() { + boolean stateChanged = loadActivitiesIfNeeded(); + stateChanged |= readHistoricalDataIfNeeded(); + pruneExcessiveHistoricalRecordsIfNeeded(); + if (stateChanged) { + sortActivitiesIfNeeded(); + notifyChanged(); + } + } + + /** + * Sorts the activities if necessary which is if there is a + * sorter, there are some activities to sort, and there is some + * historical data. + * + * @return Whether sorting was performed. + */ + private boolean sortActivitiesIfNeeded() { + if (mActivitySorter != null && mIntent != null + && !mActivities.isEmpty() && !mHistoricalRecords.isEmpty()) { + mActivitySorter.sort(mIntent, mActivities, + Collections.unmodifiableList(mHistoricalRecords)); + return true; + } + return false; + } + + /** + * Loads the activities for the current intent if needed which is + * if they are not already loaded for the current intent. + * + * @return Whether loading was performed. + */ + private boolean loadActivitiesIfNeeded() { + if (mReloadActivities && mIntent != null) { + mReloadActivities = false; + mActivities.clear(); + List resolveInfos = mContext.getPackageManager() + .queryIntentActivities(mIntent, 0); + final int resolveInfoCount = resolveInfos.size(); + for (int i = 0; i < resolveInfoCount; i++) { + ResolveInfo resolveInfo = resolveInfos.get(i); + mActivities.add(new ActivityResolveInfo(resolveInfo)); + } + return true; + } + return false; + } + + /** + * Reads the historical data if necessary which is it has + * changed, there is a history file, and there is not persist + * in progress. + * + * @return Whether reading was performed. + */ + private boolean readHistoricalDataIfNeeded() { + if (mCanReadHistoricalData && mHistoricalRecordsChanged && + !TextUtils.isEmpty(mHistoryFileName)) { + mCanReadHistoricalData = false; + mReadShareHistoryCalled = true; + readHistoricalDataImpl(); + return true; + } + return false; + } + + /** + * Adds a historical record. + * + * @param historicalRecord The record to add. + * @return True if the record was added. + */ + private boolean addHisoricalRecord(HistoricalRecord historicalRecord) { + final boolean added = mHistoricalRecords.add(historicalRecord); + if (added) { + mHistoricalRecordsChanged = true; + pruneExcessiveHistoricalRecordsIfNeeded(); + persistHistoricalDataIfNeeded(); + sortActivitiesIfNeeded(); + notifyChanged(); + } + return added; + } + + /** + * Prunes older excessive records to guarantee maxHistorySize. + */ + private void pruneExcessiveHistoricalRecordsIfNeeded() { + final int pruneCount = mHistoricalRecords.size() - mHistoryMaxSize; + if (pruneCount <= 0) { + return; + } + mHistoricalRecordsChanged = true; + for (int i = 0; i < pruneCount; i++) { + HistoricalRecord prunedRecord = mHistoricalRecords.remove(0); + if (DEBUG) { + Log.i(LOG_TAG, "Pruned: " + prunedRecord); + } + } + } + + /** + * 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 void readHistoricalDataImpl() { + 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 historicalRecords = mHistoricalRecords; + historicalRecords.clear(); + + 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); + historicalRecords.add(readRecord); + + if (DEBUG) { + Log.i(LOG_TAG, "Read " + readRecord.toString()); + } + } + + if (DEBUG) { + Log.i(LOG_TAG, "Read " + historicalRecords.size() + " historical records."); + } + } 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 PersistHistoryAsyncTask extends AsyncTask { + + @Override + @SuppressWarnings("unchecked") + public Void doInBackground(Object... args) { + List historicalRecords = (List) args[0]; + String hostoryFileName = (String) args[1]; + + FileOutputStream fos = null; + + try { + fos = mContext.openFileOutput(hostoryFileName, Context.MODE_PRIVATE); + } catch (FileNotFoundException fnfe) { + Log.e(LOG_TAG, "Error writing historical recrod file: " + hostoryFileName, fnfe); + return null; + } + + XmlSerializer serializer = Xml.newSerializer(); + + try { + serializer.setOutput(fos, null); + serializer.startDocument("UTF-8", true); + serializer.startTag(null, TAG_HISTORICAL_RECORDS); + + final int recordCount = historicalRecords.size(); + for (int i = 0; i < recordCount; i++) { + HistoricalRecord record = historicalRecords.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 { + mCanReadHistoricalData = true; + if (fos != null) { + try { + fos.close(); + } catch (IOException e) { + /* ignore */ + } + } + } + return null; + } + } +} \ No newline at end of file diff --git a/android/support/v7/internal/widget/ActivityChooserView.java b/android/support/v7/internal/widget/ActivityChooserView.java new file mode 100644 index 0000000000..9931afb758 --- /dev/null +++ b/android/support/v7/internal/widget/ActivityChooserView.java @@ -0,0 +1,843 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +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.support.v4.view.ActionProvider; +import android.support.v4.view.ViewCompat; +import android.support.v7.appcompat.R; +import android.support.v7.widget.LinearLayoutCompat; +import android.support.v7.widget.ListPopupWindow; +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 + */ +public class ActivityChooserView extends ViewGroup implements + ActivityChooserModel.ActivityChooserModelClient { + + private static final String LOG_TAG = "ActivityChooserView"; + + /** + * An adapter for displaying the activities in an {@link android.widget.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 LinearLayoutCompat 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 ListPopupWindow 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; + + /** + * 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); + + TypedArray attributesArray = context.obtainStyledAttributes(attrs, + R.styleable.ActivityChooserView, defStyle, 0); + + mInitialActivityCount = attributesArray.getInt( + R.styleable.ActivityChooserView_initialActivityCount, + ActivityChooserViewAdapter.MAX_ACTIVITY_COUNT_DEFAULT); + + Drawable expandActivityOverflowButtonDrawable = attributesArray.getDrawable( + R.styleable.ActivityChooserView_expandActivityOverflowButtonDrawable); + + attributesArray.recycle(); + + LayoutInflater inflater = LayoutInflater.from(getContext()); + inflater.inflate(R.layout.abc_activity_chooser_view, this, true); + + mCallbacks = new Callbacks(); + + mActivityChooserContent = (LinearLayoutCompat) findViewById(R.id.activity_chooser_view_content); + mActivityChooserContentBackground = mActivityChooserContent.getBackground(); + + mDefaultActivityButton = (FrameLayout) findViewById(R.id.default_activity_button); + mDefaultActivityButton.setOnClickListener(mCallbacks); + mDefaultActivityButton.setOnLongClickListener(mCallbacks); + mDefaultActivityButtonImage = (ImageView) mDefaultActivityButton.findViewById(R.id.image); + + final FrameLayout expandButton = (FrameLayout) findViewById(R.id.expand_activities_button); + expandButton.setOnClickListener(mCallbacks); + expandButton.setOnTouchListener(new ListPopupWindow.ForwardingListener(expandButton) { + @Override + public ListPopupWindow getPopup() { + return getListPopupWindow(); + } + + @Override + protected boolean onForwardingStarted() { + showPopup(); + return true; + } + + @Override + protected boolean onForwardingStopped() { + dismissPopup(); + return true; + } + }); + mExpandActivityOverflowButton = expandButton; + mExpandActivityOverflowButtonImage = + (ImageView) expandButton.findViewById(R.id.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.abc_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 = getContext().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); + } + + ListPopupWindow 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(getContext().getString( + R.string.abc_activitychooserview_choose_application)); + } + } + + /** + * Dismisses the popup window with activities. + * + * @return True if dismissed, false if already dismissed. + */ + public boolean dismissPopup() { + if (isShowingPopup()) { + getListPopupWindow().dismiss(); + ViewTreeObserver viewTreeObserver = getViewTreeObserver(); + if (viewTreeObserver.isAlive()) { + viewTreeObserver.removeGlobalOnLayoutListener(mOnGlobalLayoutListener); + } + } + return true; + } + + /** + * Gets whether the popup window with activities is shown. + * + * @return True if the popup is shown. + */ + public boolean isShowingPopup() { + return getListPopupWindow().isShowing(); + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + ActivityChooserModel dataModel = mAdapter.getDataModel(); + if (dataModel != null) { + dataModel.registerObserver(mModelDataSetOberver); + } + mIsAttachedToWindow = true; + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + ActivityChooserModel dataModel = mAdapter.getDataModel(); + if (dataModel != null) { + dataModel.unregisterObserver(mModelDataSetOberver); + } + ViewTreeObserver viewTreeObserver = getViewTreeObserver(); + if (viewTreeObserver.isAlive()) { + viewTreeObserver.removeGlobalOnLayoutListener(mOnGlobalLayoutListener); + } + if (isShowingPopup()) { + dismissPopup(); + } + 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 (!isShowingPopup()) { + 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 ListPopupWindow getListPopupWindow() { + if (mListPopupWindow == null) { + mListPopupWindow = new ListPopupWindow(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==1 || activityCount > 1 && historySize > 0) { + mDefaultActivityButton.setVisibility(VISIBLE); + ResolveInfo activity = mAdapter.getDefaultActivity(); + PackageManager packageManager = getContext().getPackageManager(); + mDefaultActivityButtonImage.setImageDrawable(activity.loadIcon(packageManager)); + if (mDefaultActionButtonContentDescription != 0) { + CharSequence label = activity.loadLabel(packageManager); + String contentDescription = getContext().getString( + mDefaultActionButtonContentDescription, label); + mDefaultActivityButton.setContentDescription(contentDescription); + } + } else { + mDefaultActivityButton.setVisibility(View.GONE); + } + // Activity chooser content. + if (mDefaultActivityButton.getVisibility() == VISIBLE) { + mActivityChooserContent.setBackgroundDrawable(mActivityChooserContentBackground); + } else { + mActivityChooserContent.setBackgroundDrawable(null); + } + } + + /** + * 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) { + launchIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); + getContext().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) { + launchIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); + getContext().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(); + } + } + } + + /** + * Adapter for backing the list of activities shown in the popup. + */ + private class ActivityChooserViewAdapter extends BaseAdapter { + + public static final int MAX_ACTIVITY_COUNT_UNLIMITED = Integer.MAX_VALUE; + + public static final int MAX_ACTIVITY_COUNT_DEFAULT = 4; + + private static final int ITEM_VIEW_TYPE_ACTIVITY = 0; + + private static final int ITEM_VIEW_TYPE_FOOTER = 1; + + private static final int ITEM_VIEW_TYPE_COUNT = 3; + + private ActivityChooserModel mDataModel; + + private int mMaxActivityCount = MAX_ACTIVITY_COUNT_DEFAULT; + + private boolean mShowDefaultActivity; + + private boolean mHighlightDefaultActivity; + + private boolean mShowFooterView; + + public void setDataModel(ActivityChooserModel dataModel) { + ActivityChooserModel oldDataModel = mAdapter.getDataModel(); + if (oldDataModel != null && isShown()) { + oldDataModel.unregisterObserver(mModelDataSetOberver); + } + mDataModel = dataModel; + if (dataModel != null && isShown()) { + dataModel.registerObserver(mModelDataSetOberver); + } + notifyDataSetChanged(); + } + + @Override + public int getItemViewType(int position) { + if (mShowFooterView && position == getCount() - 1) { + return ITEM_VIEW_TYPE_FOOTER; + } else { + return ITEM_VIEW_TYPE_ACTIVITY; + } + } + + @Override + public int getViewTypeCount() { + return ITEM_VIEW_TYPE_COUNT; + } + + public int getCount() { + int count = 0; + int activityCount = mDataModel.getActivityCount(); + if (!mShowDefaultActivity && mDataModel.getDefaultActivity() != null) { + activityCount--; + } + count = Math.min(activityCount, mMaxActivityCount); + if (mShowFooterView) { + count++; + } + return count; + } + + public Object getItem(int position) { + final int itemViewType = getItemViewType(position); + switch (itemViewType) { + case ITEM_VIEW_TYPE_FOOTER: + return null; + case ITEM_VIEW_TYPE_ACTIVITY: + if (!mShowDefaultActivity && mDataModel.getDefaultActivity() != null) { + position++; + } + return mDataModel.getActivity(position); + default: + throw new IllegalArgumentException(); + } + } + + public long getItemId(int position) { + return position; + } + + public View getView(int position, View convertView, ViewGroup parent) { + final int itemViewType = getItemViewType(position); + switch (itemViewType) { + case ITEM_VIEW_TYPE_FOOTER: + if (convertView == null || convertView.getId() != ITEM_VIEW_TYPE_FOOTER) { + convertView = LayoutInflater.from(getContext()).inflate( + R.layout.abc_activity_chooser_view_list_item, parent, false); + convertView.setId(ITEM_VIEW_TYPE_FOOTER); + TextView titleView = (TextView) convertView.findViewById(R.id.title); + titleView.setText(getContext().getString( + R.string.abc_activity_chooser_view_see_all)); + } + return convertView; + case ITEM_VIEW_TYPE_ACTIVITY: + if (convertView == null || convertView.getId() != R.id.list_item) { + convertView = LayoutInflater.from(getContext()).inflate( + R.layout.abc_activity_chooser_view_list_item, parent, false); + } + PackageManager packageManager = getContext().getPackageManager(); + // Set the icon + ImageView iconView = (ImageView) convertView.findViewById(R.id.icon); + ResolveInfo activity = (ResolveInfo) getItem(position); + iconView.setImageDrawable(activity.loadIcon(packageManager)); + // Set the title. + TextView titleView = (TextView) convertView.findViewById(R.id.title); + titleView.setText(activity.loadLabel(packageManager)); + // Highlight the default. + if (mShowDefaultActivity && position == 0 && mHighlightDefaultActivity) { + ViewCompat.setActivated(convertView, true); + } else { + ViewCompat.setActivated(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 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; + } + } + + /** + * Allows us to set the background using TintTypedArray + * @hide + */ + public static class InnerLayout extends LinearLayoutCompat { + + private static final int[] TINT_ATTRS = { + android.R.attr.background + }; + + public InnerLayout(Context context, AttributeSet attrs) { + super(context, attrs); + TintTypedArray a = TintTypedArray.obtainStyledAttributes(context, attrs, TINT_ATTRS); + setBackgroundDrawable(a.getDrawable(0)); + a.recycle(); + } + } +} \ No newline at end of file diff --git a/android/support/v7/internal/widget/AdapterViewCompat.java b/android/support/v7/internal/widget/AdapterViewCompat.java new file mode 100644 index 0000000000..bdce3c86a4 --- /dev/null +++ b/android/support/v7/internal/widget/AdapterViewCompat.java @@ -0,0 +1,1150 @@ +package android.support.v7.internal.widget; + +/* + * 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. + */ + +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.ContextMenu.ContextMenuInfo; +import android.view.SoundEffectConstants; +import android.view.View; +import android.view.ViewDebug; +import android.view.ViewGroup; +import android.view.accessibility.AccessibilityEvent; +import android.widget.Adapter; +import android.widget.AdapterView; +import android.widget.ListView; + + +/** + * An AdapterView is a view whose children are determined by an {@link android.widget.Adapter}. + * + *

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

      + *

      Developer Guides

      + *

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

      + * + * @hide + */ +public abstract class AdapterViewCompat extends ViewGroup { + + /** + * The item view type returned by {@link Adapter#getItemViewType(int)} when + * the adapter does not want the item's view recycled. + */ + 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. + */ + 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; + + AdapterViewCompat(Context context) { + super(context); + } + + AdapterViewCompat(Context context, AttributeSet attrs) { + super(context, attrs); + } + + AdapterViewCompat(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + /** + * Interface definition for a callback to be invoked when an item in this + * AdapterView has been clicked. + */ + public interface OnItemClickListener { + + /** + * Callback method to be invoked when an item in this AdapterView has + * been clicked. + *

      + * Implementers can call getItemAtPosition(position) if they need + * to access the data associated with the selected item. + * + * @param parent The AdapterView where the click happened. + * @param view The view within the AdapterView that was clicked (this + * will be a view provided by the adapter) + * @param position The position of the view in the adapter. + * @param id The row id of the item that was clicked. + */ + void onItemClick(AdapterViewCompat parent, View view, int position, long id); + } + + class OnItemClickListenerWrapper implements AdapterView.OnItemClickListener { + + private final OnItemClickListener mWrappedListener; + + public OnItemClickListenerWrapper(OnItemClickListener listener) { + mWrappedListener = listener; + } + + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + mWrappedListener.onItemClick(AdapterViewCompat.this, view, position, id); + } + } + + /** + * 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, 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(AdapterViewCompat 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(AdapterViewCompat 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(AdapterViewCompat 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 (AdapterViewCompat.this.getAdapter().hasStableIds() && mInstanceState != null + && mOldItemCount == 0 && mItemCount > 0) { + AdapterViewCompat.this.onRestoreInstanceState(mInstanceState); + mInstanceState = null; + } else { + rememberSyncState(); + } + checkFocus(); + requestLayout(); + } + + @Override + public void onInvalidated() { + mDataChanged = true; + + if (AdapterViewCompat.this.getAdapter().hasStableIds()) { + // Remember the current state for the case where our hosting activity is being + // stopped and later restarted + mInstanceState = AdapterViewCompat.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 + 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; + } + } + } +} \ No newline at end of file diff --git a/android/support/v7/internal/widget/AppCompatPopupWindow.java b/android/support/v7/internal/widget/AppCompatPopupWindow.java new file mode 100644 index 0000000000..511a332639 --- /dev/null +++ b/android/support/v7/internal/widget/AppCompatPopupWindow.java @@ -0,0 +1,120 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.annotation.TargetApi; +import android.content.Context; +import android.os.Build; +import android.support.v7.appcompat.R; +import android.util.AttributeSet; +import android.util.Log; +import android.view.View; +import android.view.ViewTreeObserver.OnScrollChangedListener; +import android.widget.PopupWindow; + +import java.lang.ref.WeakReference; +import java.lang.reflect.Field; + +/** + * @hide + */ +public class AppCompatPopupWindow extends PopupWindow { + + private static final String TAG = "AppCompatPopupWindow"; + + private final boolean mOverlapAnchor; + + public AppCompatPopupWindow(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + TintTypedArray a = TintTypedArray.obtainStyledAttributes(context, attrs, + R.styleable.PopupWindow, defStyleAttr, 0); + mOverlapAnchor = a.getBoolean(R.styleable.PopupWindow_overlapAnchor, false); + // We re-set this for tinting purposes + setBackgroundDrawable(a.getDrawable(R.styleable.PopupWindow_android_popupBackground)); + a.recycle(); + + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { + // For devices pre-ICS, we need to wrap the internal OnScrollChangedListener + // due to NPEs. + wrapOnScrollChangedListener(this); + } + } + + @Override + public void showAsDropDown(View anchor, int xoff, int yoff) { + if (Build.VERSION.SDK_INT < 21 && mOverlapAnchor) { + // If we're pre-L, emulate overlapAnchor by modifying the yOff + yoff -= anchor.getHeight(); + } + super.showAsDropDown(anchor, xoff, yoff); + } + + @TargetApi(Build.VERSION_CODES.KITKAT) + @Override + public void showAsDropDown(View anchor, int xoff, int yoff, int gravity) { + if (Build.VERSION.SDK_INT < 21 && mOverlapAnchor) { + // If we're pre-L, emulate overlapAnchor by modifying the yOff + yoff -= anchor.getHeight(); + } + super.showAsDropDown(anchor, xoff, yoff, gravity); + } + + @Override + public void update(View anchor, int xoff, int yoff, int width, int height) { + if (Build.VERSION.SDK_INT < 21 && mOverlapAnchor) { + // If we're pre-L, emulate overlapAnchor by modifying the yOff + yoff -= anchor.getHeight(); + } + super.update(anchor, xoff, yoff, width, height); + } + + private static void wrapOnScrollChangedListener(final PopupWindow popup) { + try { + final Field fieldAnchor = PopupWindow.class.getDeclaredField("mAnchor"); + fieldAnchor.setAccessible(true); + + final Field fieldListener = PopupWindow.class + .getDeclaredField("mOnScrollChangedListener"); + fieldListener.setAccessible(true); + + final OnScrollChangedListener originalListener = + (OnScrollChangedListener) fieldListener.get(popup); + + // Now set a new listener, wrapping the original and only proxying the call when + // we have an anchor view. + fieldListener.set(popup, new OnScrollChangedListener() { + @Override + public void onScrollChanged() { + try { + WeakReference mAnchor = (WeakReference) fieldAnchor.get(popup); + if (mAnchor == null || mAnchor.get() == null) { + return; + } else { + originalListener.onScrollChanged(); + } + } catch (IllegalAccessException e) { + // Oh well... + } + } + }); + } catch (Exception e) { + Log.d(TAG, "Exception while installing workaround OnScrollChangedListener", e); + } + } + +} diff --git a/android/support/v7/internal/widget/CompatTextView.java b/android/support/v7/internal/widget/CompatTextView.java new file mode 100644 index 0000000000..f90ab75338 --- /dev/null +++ b/android/support/v7/internal/widget/CompatTextView.java @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Rect; +import android.support.v7.appcompat.R; +import android.support.v7.internal.text.AllCapsTransformationMethod; +import android.text.method.TransformationMethod; +import android.util.AttributeSet; +import android.view.View; +import android.widget.TextView; + +import java.util.Locale; + +/** + * @hide + */ +public class CompatTextView extends TextView { + + public CompatTextView(Context context) { + this(context, null); + } + + public CompatTextView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public CompatTextView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + + // First read the TextAppearance style id + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CompatTextView, + defStyle, 0); + final int ap = a.getResourceId(R.styleable.CompatTextView_android_textAppearance, -1); + a.recycle(); + + // Now check TextAppearance's textAllCaps value + if (ap != -1) { + TypedArray appearance = context.obtainStyledAttributes(ap, R.styleable.TextAppearance); + if (appearance.hasValue(R.styleable.TextAppearance_textAllCaps)) { + setAllCaps(appearance.getBoolean(R.styleable.TextAppearance_textAllCaps, false)); + } + appearance.recycle(); + } + + // Now read the style's value + a = context.obtainStyledAttributes(attrs, R.styleable.CompatTextView, defStyle, 0); + if (a.hasValue(R.styleable.CompatTextView_textAllCaps)) { + setAllCaps(a.getBoolean(R.styleable.CompatTextView_textAllCaps, false)); + } + a.recycle(); + } + + public void setAllCaps(boolean allCaps) { + setTransformationMethod(allCaps ? new AllCapsTransformationMethod(getContext()) : null); + } + + @Override + public void setTextAppearance(Context context, int resid) { + super.setTextAppearance(context, resid); + + TypedArray appearance = context.obtainStyledAttributes(resid, R.styleable.TextAppearance); + if (appearance.hasValue(R.styleable.TextAppearance_textAllCaps)) { + setAllCaps(appearance.getBoolean(R.styleable.TextAppearance_textAllCaps, false)); + } + appearance.recycle(); + } +} diff --git a/android/support/v7/internal/widget/ContentFrameLayout.java b/android/support/v7/internal/widget/ContentFrameLayout.java new file mode 100644 index 0000000000..1f140d164b --- /dev/null +++ b/android/support/v7/internal/widget/ContentFrameLayout.java @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.graphics.Rect; +import android.util.AttributeSet; +import android.widget.FrameLayout; + +/** + * @hide + */ +public class ContentFrameLayout extends FrameLayout { + + public ContentFrameLayout(Context context) { + this(context, null); + } + + public ContentFrameLayout(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public ContentFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + /** + * @hide + */ + public void dispatchFitSystemWindows(Rect insets) { + fitSystemWindows(insets); + } + +} diff --git a/android/support/v7/internal/widget/DecorContentParent.java b/android/support/v7/internal/widget/DecorContentParent.java new file mode 100644 index 0000000000..e4400acc16 --- /dev/null +++ b/android/support/v7/internal/widget/DecorContentParent.java @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package android.support.v7.internal.widget; + +import android.graphics.drawable.Drawable; +import android.os.Parcelable; +import android.support.v7.internal.view.menu.MenuPresenter; +import android.util.SparseArray; +import android.view.Menu; +import android.view.Window; + +/** + * Implemented by the top-level decor layout for a window. DecorContentParent offers + * entry points for a number of title/window decor features. + * + * @hide + */ +public interface DecorContentParent { + void setWindowCallback(Window.Callback cb); + void setWindowTitle(CharSequence title); + CharSequence getTitle(); + void initFeature(int windowFeature); + void setUiOptions(int uiOptions); + boolean hasIcon(); + boolean hasLogo(); + void setIcon(int resId); + void setIcon(Drawable d); + void setLogo(int resId); + boolean canShowOverflowMenu(); + boolean isOverflowMenuShowing(); + boolean isOverflowMenuShowPending(); + boolean showOverflowMenu(); + boolean hideOverflowMenu(); + void setMenuPrepared(); + void setMenu(Menu menu, MenuPresenter.Callback cb); + void saveToolbarHierarchyState(SparseArray toolbarStates); + void restoreToolbarHierarchyState(SparseArray toolbarStates); + void dismissPopups(); + +} \ No newline at end of file diff --git a/android/support/v7/internal/widget/DecorToolbar.java b/android/support/v7/internal/widget/DecorToolbar.java new file mode 100644 index 0000000000..c601e642a7 --- /dev/null +++ b/android/support/v7/internal/widget/DecorToolbar.java @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.os.Parcelable; +import android.support.v7.internal.view.menu.MenuBuilder; +import android.support.v7.internal.view.menu.MenuPresenter; +import android.util.SparseArray; +import android.view.Menu; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.widget.SpinnerAdapter; + +/** + * Common interface for a toolbar that sits as part of the window decor. + * Layouts that control window decor use this as a point of interaction with different + * bar implementations. + * + * @hide + */ +public interface DecorToolbar { + ViewGroup getViewGroup(); + Context getContext(); + boolean isSplit(); + boolean hasExpandedActionView(); + void collapseActionView(); + void setWindowCallback(Window.Callback cb); + void setWindowTitle(CharSequence title); + CharSequence getTitle(); + void setTitle(CharSequence title); + CharSequence getSubtitle(); + void setSubtitle(CharSequence subtitle); + void initProgress(); + void initIndeterminateProgress(); + boolean canSplit(); + void setSplitView(ViewGroup splitView); + void setSplitToolbar(boolean split); + void setSplitWhenNarrow(boolean splitWhenNarrow); + boolean hasIcon(); + boolean hasLogo(); + void setIcon(int resId); + void setIcon(Drawable d); + void setLogo(int resId); + void setLogo(Drawable d); + boolean canShowOverflowMenu(); + boolean isOverflowMenuShowing(); + boolean isOverflowMenuShowPending(); + boolean showOverflowMenu(); + boolean hideOverflowMenu(); + void setMenuPrepared(); + void setMenu(Menu menu, MenuPresenter.Callback cb); + void dismissPopupMenus(); + + int getDisplayOptions(); + void setDisplayOptions(int opts); + void setEmbeddedTabView(ScrollingTabContainerView tabView); + boolean hasEmbeddedTabs(); + boolean isTitleTruncated(); + void setCollapsible(boolean collapsible); + void setHomeButtonEnabled(boolean enable); + int getNavigationMode(); + void setNavigationMode(int mode); + void setDropdownParams(SpinnerAdapter adapter, AdapterViewCompat.OnItemSelectedListener listener); + void setDropdownSelectedPosition(int position); + int getDropdownSelectedPosition(); + int getDropdownItemCount(); + void setCustomView(View view); + View getCustomView(); + void animateToVisibility(int visibility); + void setNavigationIcon(Drawable icon); + void setNavigationIcon(int resId); + void setNavigationContentDescription(CharSequence description); + void setNavigationContentDescription(int resId); + void setDefaultNavigationContentDescription(int defaultNavigationContentDescription); + void setDefaultNavigationIcon(Drawable icon); + void saveHierarchyState(SparseArray toolbarStates); + void restoreHierarchyState(SparseArray toolbarStates); + void setBackgroundDrawable(Drawable d); + int getHeight(); + void setVisibility(int visible); + int getVisibility(); + void setMenuCallbacks(MenuPresenter.Callback presenterCallback, + MenuBuilder.Callback menuBuilderCallback); + Menu getMenu(); + int getPopupTheme(); +} \ No newline at end of file diff --git a/android/support/v7/internal/widget/DrawableUtils.java b/android/support/v7/internal/widget/DrawableUtils.java new file mode 100644 index 0000000000..1ff5e4ddf6 --- /dev/null +++ b/android/support/v7/internal/widget/DrawableUtils.java @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.support.v4.graphics.drawable.DrawableCompat; +import android.util.Log; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +/** + * @hide + */ +public class DrawableUtils { + + private static final String TAG = "DrawableUtils"; + + public static final Rect INSETS_NONE = new Rect(); + + private static Class sInsetsClazz; + + static { + if (Build.VERSION.SDK_INT >= 18) { + try { + sInsetsClazz = Class.forName("android.graphics.Insets"); + } catch (ClassNotFoundException e) { + // Oh well... + } + } + } + + private DrawableUtils() {} + + /** + * Allows us to get the optical insets for a {@link Drawable}. Since this is hidden we need to + * use reflection. Since the {@code Insets} class is hidden also, we return a Rect instead. + */ + public static Rect getOpticalBounds(Drawable drawable) { + if (sInsetsClazz != null) { + try { + // If the Drawable is wrapped, we need to manually unwrap it and process + // the wrapped drawable. + drawable = DrawableCompat.unwrap(drawable); + + final Method getOpticalInsetsMethod = drawable.getClass() + .getMethod("getOpticalInsets"); + final Object insets = getOpticalInsetsMethod.invoke(drawable); + + if (insets != null) { + // If the drawable has some optical insets, let's copy them into a Rect + final Rect result = new Rect(); + + for (Field field : sInsetsClazz.getFields()) { + switch (field.getName()) { + case "left": + result.left = field.getInt(insets); + break; + case "top": + result.top = field.getInt(insets); + break; + case "right": + result.right = field.getInt(insets); + break; + case "bottom": + result.bottom = field.getInt(insets); + break; + } + } + return result; + } + } catch (Exception e) { + // Eugh, we hit some kind of reflection issue... + Log.e(TAG, "Couldn't obtain the optical insets. Ignoring."); + } + } + + // If we reach here, either we're running on a device pre-v18, the Drawable didn't have + // any optical insets, or a reflection issue, so we'll just return an empty rect + return INSETS_NONE; + } + +} diff --git a/android/support/v7/internal/widget/FitWindowsFrameLayout.java b/android/support/v7/internal/widget/FitWindowsFrameLayout.java new file mode 100644 index 0000000000..49f95fa3b3 --- /dev/null +++ b/android/support/v7/internal/widget/FitWindowsFrameLayout.java @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.graphics.Rect; +import android.util.AttributeSet; +import android.widget.FrameLayout; + +/** + * @hide + */ +public class FitWindowsFrameLayout extends FrameLayout implements FitWindowsViewGroup { + + private OnFitSystemWindowsListener mListener; + + public FitWindowsFrameLayout(Context context) { + super(context); + } + + public FitWindowsFrameLayout(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + public void setOnFitSystemWindowsListener(OnFitSystemWindowsListener listener) { + mListener = listener; + } + + @Override + protected boolean fitSystemWindows(Rect insets) { + if (mListener != null) { + mListener.onFitSystemWindows(insets); + } + return super.fitSystemWindows(insets); + } +} diff --git a/android/support/v7/internal/widget/FitWindowsLinearLayout.java b/android/support/v7/internal/widget/FitWindowsLinearLayout.java new file mode 100644 index 0000000000..6adf74dae2 --- /dev/null +++ b/android/support/v7/internal/widget/FitWindowsLinearLayout.java @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.graphics.Rect; +import android.util.AttributeSet; +import android.widget.LinearLayout; + +/** + * @hide + */ +public class FitWindowsLinearLayout extends LinearLayout implements FitWindowsViewGroup { + + private OnFitSystemWindowsListener mListener; + + public FitWindowsLinearLayout(Context context) { + super(context); + } + + public FitWindowsLinearLayout(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public void setOnFitSystemWindowsListener(OnFitSystemWindowsListener listener) { + mListener = listener; + } + + @Override + protected boolean fitSystemWindows(Rect insets) { + if (mListener != null) { + mListener.onFitSystemWindows(insets); + } + return super.fitSystemWindows(insets); + } +} diff --git a/android/support/v7/internal/widget/FitWindowsViewGroup.java b/android/support/v7/internal/widget/FitWindowsViewGroup.java new file mode 100644 index 0000000000..c84fda0e4a --- /dev/null +++ b/android/support/v7/internal/widget/FitWindowsViewGroup.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.graphics.Rect; + +/** + * @hide + */ +public interface FitWindowsViewGroup { + + public interface OnFitSystemWindowsListener { + void onFitSystemWindows(Rect insets); + } + + public void setOnFitSystemWindowsListener(OnFitSystemWindowsListener listener); + +} diff --git a/android/support/v7/internal/widget/ListViewCompat.java b/android/support/v7/internal/widget/ListViewCompat.java new file mode 100644 index 0000000000..e2e6c4c569 --- /dev/null +++ b/android/support/v7/internal/widget/ListViewCompat.java @@ -0,0 +1,388 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.support.v4.graphics.drawable.DrawableCompat; +import android.support.v7.graphics.drawable.DrawableWrapper; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AbsListView; +import android.widget.ListAdapter; +import android.widget.ListView; + +import java.lang.reflect.Field; + +/** + * This class contains a number of useful things for ListView. Mainly used by + * {@link android.support.v7.widget.ListPopupWindow}. + * + * @hide + */ +public class ListViewCompat extends ListView { + + public static final int INVALID_POSITION = -1; + public static final int NO_POSITION = -1; + + private static final int[] STATE_SET_NOTHING = new int[] { 0 }; + + final Rect mSelectorRect = new Rect(); + int mSelectionLeftPadding = 0; + int mSelectionTopPadding = 0; + int mSelectionRightPadding = 0; + int mSelectionBottomPadding = 0; + + private Field mIsChildViewEnabled; + + private GateKeeperDrawable mSelector; + + public ListViewCompat(Context context) { + this(context, null); + } + + public ListViewCompat(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public ListViewCompat(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + try { + mIsChildViewEnabled = AbsListView.class.getDeclaredField("mIsChildViewEnabled"); + mIsChildViewEnabled.setAccessible(true); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } + } + + @Override + public void setSelector(Drawable sel) { + mSelector = sel != null ? new GateKeeperDrawable(sel) : null; + super.setSelector(mSelector); + + final Rect padding = new Rect(); + if (sel != null) { + sel.getPadding(padding); + } + + mSelectionLeftPadding = padding.left; + mSelectionTopPadding = padding.top; + mSelectionRightPadding = padding.right; + mSelectionBottomPadding = padding.bottom; + } + + @Override + protected void drawableStateChanged() { + super.drawableStateChanged(); + + setSelectorEnabled(true); + updateSelectorStateCompat(); + } + + @Override + protected void dispatchDraw(Canvas canvas) { + final boolean drawSelectorOnTop = false; + if (!drawSelectorOnTop) { + drawSelectorCompat(canvas); + } + + super.dispatchDraw(canvas); + } + + protected void updateSelectorStateCompat() { + Drawable selector = getSelector(); + if (selector != null && shouldShowSelectorCompat()) { + selector.setState(getDrawableState()); + } + } + + protected boolean shouldShowSelectorCompat() { + return touchModeDrawsInPressedStateCompat() && isPressed(); + } + + protected boolean touchModeDrawsInPressedStateCompat() { + return false; + } + + protected void drawSelectorCompat(Canvas canvas) { + if (!mSelectorRect.isEmpty()) { + final Drawable selector = getSelector(); + if (selector != null) { + selector.setBounds(mSelectorRect); + selector.draw(canvas); + } + } + } + + /** + * 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. + */ + public int lookForSelectablePosition(int position, boolean lookDown) { + final ListAdapter adapter = getAdapter(); + if (adapter == null || isInTouchMode()) { + return INVALID_POSITION; + } + + final int count = adapter.getCount(); + if (!getAdapter().areAllItemsEnabled()) { + if (lookDown) { + position = Math.max(0, position); + while (position < count && !adapter.isEnabled(position)) { + position++; + } + } else { + position = Math.min(position, count - 1); + while (position >= 0 && !adapter.isEnabled(position)) { + position--; + } + } + + if (position < 0 || position >= count) { + return INVALID_POSITION; + } + return position; + } else { + if (position < 0 || position >= count) { + return INVALID_POSITION; + } + return position; + } + } + + protected void positionSelectorLikeTouchCompat(int position, View sel, float x, float y) { + positionSelectorLikeFocusCompat(position, sel); + + Drawable selector = getSelector(); + if (selector != null && position != INVALID_POSITION) { + DrawableCompat.setHotspot(selector, x, y); + } + } + + protected void positionSelectorLikeFocusCompat(int position, View sel) { + // If we're changing position, update the visibility since the selector + // is technically being detached from the previous selection. + final Drawable selector = getSelector(); + final boolean manageState = selector != null && position != INVALID_POSITION; + if (manageState) { + selector.setVisible(false, false); + } + + positionSelectorCompat(position, sel); + + if (manageState) { + final Rect bounds = mSelectorRect; + final float x = bounds.exactCenterX(); + final float y = bounds.exactCenterY(); + selector.setVisible(getVisibility() == VISIBLE, false); + DrawableCompat.setHotspot(selector, x, y); + } + } + + protected void positionSelectorCompat(int position, View sel) { + final Rect selectorRect = mSelectorRect; + selectorRect.set(sel.getLeft(), sel.getTop(), sel.getRight(), sel.getBottom()); + + // Adjust for selection padding. + selectorRect.left -= mSelectionLeftPadding; + selectorRect.top -= mSelectionTopPadding; + selectorRect.right += mSelectionRightPadding; + selectorRect.bottom += mSelectionBottomPadding; + + try { + // AbsListView.mIsChildViewEnabled controls the selector's state so we need to + // modify it's value + final boolean isChildViewEnabled = mIsChildViewEnabled.getBoolean(this); + if (sel.isEnabled() != isChildViewEnabled) { + mIsChildViewEnabled.set(this, !isChildViewEnabled); + if (position != INVALID_POSITION) { + refreshDrawableState(); + } + } + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + + /** + * Measures the height of the given range of children (inclusive) and returns the height + * with this ListView's padding and divider heights included. If maxHeight is provided, the + * measuring will stop when the current height reaches maxHeight. + * + * @param widthMeasureSpec The width measure spec to be given to a child's + * {@link View#measure(int, int)}. + * @param startPosition The position of the first child to be shown. + * @param endPosition The (inclusive) position of the last child to be + * shown. Specify {@link #NO_POSITION} if the last child + * should be the last available child from the adapter. + * @param maxHeight The maximum height that will be returned (if all the + * children don't fit in this value, this value will be + * returned). + * @param disallowPartialChildPosition In general, whether the returned height should only + * contain entire children. This is more powerful--it is + * the first inclusive position at which partial + * children will not be allowed. Example: it looks nice + * to have at least 3 completely visible children, and + * in portrait this will most likely fit; but in + * landscape there could be times when even 2 children + * can not be completely shown, so a value of 2 + * (remember, inclusive) would be good (assuming + * startPosition is 0). + * @return The height of this ListView with the given children. + */ + public int measureHeightOfChildrenCompat(int widthMeasureSpec, int startPosition, + int endPosition, final int maxHeight, + int disallowPartialChildPosition) { + + final int paddingTop = getListPaddingTop(); + final int paddingBottom = getListPaddingBottom(); + final int paddingLeft = getListPaddingLeft(); + final int paddingRight = getListPaddingRight(); + final int reportedDividerHeight = getDividerHeight(); + final Drawable divider = getDivider(); + + final ListAdapter adapter = getAdapter(); + + if (adapter == null) { + return paddingTop + paddingBottom; + } + + // Include the padding of the list + int returnedHeight = paddingTop + paddingBottom; + final int dividerHeight = ((reportedDividerHeight > 0) && divider != null) + ? reportedDividerHeight : 0; + + // The previous height value that was less than maxHeight and contained + // no partial children + int prevHeightWithoutPartialChild = 0; + + View child = null; + int viewType = 0; + int count = adapter.getCount(); + for (int i = 0; i < count; i++) { + int newType = adapter.getItemViewType(i); + if (newType != viewType) { + child = null; + viewType = newType; + } + child = adapter.getView(i, child, this); + + // Compute child height spec + int heightMeasureSpec; + final ViewGroup.LayoutParams childLp = child.getLayoutParams(); + if (childLp != null && childLp.height > 0) { + heightMeasureSpec = MeasureSpec.makeMeasureSpec(childLp.height, + MeasureSpec.EXACTLY); + } else { + heightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); + } + child.measure(widthMeasureSpec, heightMeasureSpec); + + 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; + } + + protected void setSelectorEnabled(boolean enabled) { + if (mSelector != null) { + mSelector.setEnabled(enabled); + } + } + + private static class GateKeeperDrawable extends DrawableWrapper { + private boolean mEnabled; + + public GateKeeperDrawable(Drawable drawable) { + super(drawable); + mEnabled = true; + } + + void setEnabled(boolean enabled) { + mEnabled = enabled; + } + + @Override + public boolean setState(int[] stateSet) { + if (mEnabled) { + return super.setState(stateSet); + } + return false; + } + + @Override + public void draw(Canvas canvas) { + if (mEnabled) { + super.draw(canvas); + } + } + + @Override + public void setHotspot(float x, float y) { + if (mEnabled) { + super.setHotspot(x, y); + } + } + + @Override + public void setHotspotBounds(int left, int top, int right, int bottom) { + if (mEnabled) { + super.setHotspotBounds(left, top, right, bottom); + } + } + + @Override + public boolean setVisible(boolean visible, boolean restart) { + if (mEnabled) { + return super.setVisible(visible, restart); + } + return false; + } + } + + +} diff --git a/android/support/v7/internal/widget/NativeActionModeAwareLayout.java b/android/support/v7/internal/widget/NativeActionModeAwareLayout.java new file mode 100644 index 0000000000..d19fff9263 --- /dev/null +++ b/android/support/v7/internal/widget/NativeActionModeAwareLayout.java @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.annotation.TargetApi; +import android.content.Context; +import android.os.Build; +import android.util.AttributeSet; +import android.view.ActionMode; +import android.view.View; + +/** + * @hide + */ +@TargetApi(Build.VERSION_CODES.HONEYCOMB) +public class NativeActionModeAwareLayout extends ContentFrameLayout { + + private OnActionModeForChildListener mActionModeForChildListener; + + public NativeActionModeAwareLayout(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public void setActionModeForChildListener(OnActionModeForChildListener listener) { + mActionModeForChildListener = listener; + } + + public ActionMode startActionModeForChild(View originalView, ActionMode.Callback callback) { + if (mActionModeForChildListener != null) { + return mActionModeForChildListener.startActionModeForChild(originalView, callback); + } + return super.startActionModeForChild(originalView, callback); + } + + /** + * @hide + */ + public interface OnActionModeForChildListener { + ActionMode startActionModeForChild(View originalView, ActionMode.Callback callback); + } +} diff --git a/android/support/v7/internal/widget/ResourcesWrapper.java b/android/support/v7/internal/widget/ResourcesWrapper.java new file mode 100644 index 0000000000..48ebab82c9 --- /dev/null +++ b/android/support/v7/internal/widget/ResourcesWrapper.java @@ -0,0 +1,282 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import org.xmlpull.v1.XmlPullParserException; + +import android.content.res.AssetFileDescriptor; +import android.content.res.AssetManager; +import android.content.res.ColorStateList; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.content.res.XmlResourceParser; +import android.graphics.Movie; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.Drawable.ConstantState; +import android.os.Bundle; +import android.util.AttributeSet; +import android.util.DisplayMetrics; +import android.util.LongSparseArray; +import android.util.TypedValue; + +import java.io.IOException; +import java.io.InputStream; + +/** + * This extends Resources but delegates the calls to another Resources object. This enables + * any customization done by some subclass of Resources to be also picked up. + */ +class ResourcesWrapper extends Resources { + + private final Resources mResources; + + public ResourcesWrapper(Resources resources) { + super(resources.getAssets(), resources.getDisplayMetrics(), resources.getConfiguration()); + mResources = resources; + } + + @Override + public CharSequence getText(int id) throws NotFoundException { + return mResources.getText(id); + } + + @Override + public CharSequence getQuantityText(int id, int quantity) throws NotFoundException { + return mResources.getQuantityText(id, quantity); + } + + @Override + public String getString(int id) throws NotFoundException { + return mResources.getString(id); + } + + @Override + public String getString(int id, Object... formatArgs) throws NotFoundException { + return mResources.getString(id, formatArgs); + } + + @Override + public String getQuantityString(int id, int quantity, Object... formatArgs) + throws NotFoundException { + return mResources.getQuantityString(id, quantity, formatArgs); + } + + @Override + public String getQuantityString(int id, int quantity) throws NotFoundException { + return mResources.getQuantityString(id, quantity); + } + + @Override + public CharSequence getText(int id, CharSequence def) { + return mResources.getText(id, def); + } + + @Override + public CharSequence[] getTextArray(int id) throws NotFoundException { + return mResources.getTextArray(id); + } + + @Override + public String[] getStringArray(int id) throws NotFoundException { + return mResources.getStringArray(id); + } + + @Override + public int[] getIntArray(int id) throws NotFoundException { + return mResources.getIntArray(id); + } + + @Override + public TypedArray obtainTypedArray(int id) throws NotFoundException { + return mResources.obtainTypedArray(id); + } + + @Override + public float getDimension(int id) throws NotFoundException { + return mResources.getDimension(id); + } + + @Override + public int getDimensionPixelOffset(int id) throws NotFoundException { + return mResources.getDimensionPixelOffset(id); + } + + @Override + public int getDimensionPixelSize(int id) throws NotFoundException { + return mResources.getDimensionPixelSize(id); + } + + @Override + public float getFraction(int id, int base, int pbase) { + return mResources.getFraction(id, base, pbase); + } + + @Override + public Drawable getDrawable(int id) throws NotFoundException { + return mResources.getDrawable(id); + } + + @Override + public Drawable getDrawable(int id, Theme theme) throws NotFoundException { + return mResources.getDrawable(id, theme); + } + + @Override + public Drawable getDrawableForDensity(int id, int density) throws NotFoundException { + return mResources.getDrawableForDensity(id, density); + } + + @Override + public Drawable getDrawableForDensity(int id, int density, Theme theme) { + return mResources.getDrawableForDensity(id, density, theme); + } + + @Override + public Movie getMovie(int id) throws NotFoundException { + return mResources.getMovie(id); + } + + @Override + public int getColor(int id) throws NotFoundException { + return mResources.getColor(id); + } + + @Override + public ColorStateList getColorStateList(int id) throws NotFoundException { + return mResources.getColorStateList(id); + } + + @Override + public boolean getBoolean(int id) throws NotFoundException { + return mResources.getBoolean(id); + } + + @Override + public int getInteger(int id) throws NotFoundException { + return mResources.getInteger(id); + } + + @Override + public XmlResourceParser getLayout(int id) throws NotFoundException { + return mResources.getLayout(id); + } + + @Override + public XmlResourceParser getAnimation(int id) throws NotFoundException { + return mResources.getAnimation(id); + } + + @Override + public XmlResourceParser getXml(int id) throws NotFoundException { + return mResources.getXml(id); + } + + @Override + public InputStream openRawResource(int id) throws NotFoundException { + return mResources.openRawResource(id); + } + + @Override + public InputStream openRawResource(int id, TypedValue value) throws NotFoundException { + return mResources.openRawResource(id, value); + } + + @Override + public AssetFileDescriptor openRawResourceFd(int id) throws NotFoundException { + return mResources.openRawResourceFd(id); + } + + @Override + public void getValue(int id, TypedValue outValue, boolean resolveRefs) + throws NotFoundException { + mResources.getValue(id, outValue, resolveRefs); + } + + @Override + public void getValueForDensity(int id, int density, TypedValue outValue, boolean resolveRefs) + throws NotFoundException { + mResources.getValueForDensity(id, density, outValue, resolveRefs); + } + + @Override + public void getValue(String name, TypedValue outValue, boolean resolveRefs) + throws NotFoundException { + mResources.getValue(name, outValue, resolveRefs); + } + + @Override + public TypedArray obtainAttributes(AttributeSet set, int[] attrs) { + return mResources.obtainAttributes(set, attrs); + } + + @Override + public void updateConfiguration(Configuration config, DisplayMetrics metrics) { + super.updateConfiguration(config, metrics); + if (mResources != null) { // called from super's constructor. So, need to check. + mResources.updateConfiguration(config, metrics); + } + } + + @Override + public DisplayMetrics getDisplayMetrics() { + return mResources.getDisplayMetrics(); + } + + @Override + public Configuration getConfiguration() { + return mResources.getConfiguration(); + } + + @Override + public int getIdentifier(String name, String defType, String defPackage) { + return mResources.getIdentifier(name, defType, defPackage); + } + + @Override + public String getResourceName(int resid) throws NotFoundException { + return mResources.getResourceName(resid); + } + + @Override + public String getResourcePackageName(int resid) throws NotFoundException { + return mResources.getResourcePackageName(resid); + } + + @Override + public String getResourceTypeName(int resid) throws NotFoundException { + return mResources.getResourceTypeName(resid); + } + + @Override + public String getResourceEntryName(int resid) throws NotFoundException { + return mResources.getResourceEntryName(resid); + } + + @Override + public void parseBundleExtras(XmlResourceParser parser, Bundle outBundle) + throws XmlPullParserException, IOException { + mResources.parseBundleExtras(parser, outBundle); + } + + @Override + public void parseBundleExtra(String tagName, AttributeSet attrs, Bundle outBundle) + throws XmlPullParserException { + mResources.parseBundleExtra(tagName, attrs, outBundle); + } +} + diff --git a/android/support/v7/internal/widget/RtlSpacingHelper.java b/android/support/v7/internal/widget/RtlSpacingHelper.java new file mode 100644 index 0000000000..e6c80d1572 --- /dev/null +++ b/android/support/v7/internal/widget/RtlSpacingHelper.java @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package android.support.v7.internal.widget; + +/** + * RtlSpacingHelper manages the relationship between left/right and start/end for views + * that need to maintain both absolute and relative settings for a form of spacing similar + * to view padding. + * + * @hide + */ +public class RtlSpacingHelper { + public static final int UNDEFINED = Integer.MIN_VALUE; + + private int mLeft = 0; + private int mRight = 0; + private int mStart = UNDEFINED; + private int mEnd = UNDEFINED; + private int mExplicitLeft = 0; + private int mExplicitRight = 0; + + private boolean mIsRtl = false; + private boolean mIsRelative = false; + + public int getLeft() { + return mLeft; + } + + public int getRight() { + return mRight; + } + + public int getStart() { + return mIsRtl ? mRight : mLeft; + } + + public int getEnd() { + return mIsRtl ? mLeft : mRight; + } + + public void setRelative(int start, int end) { + mStart = start; + mEnd = end; + mIsRelative = true; + if (mIsRtl) { + if (end != UNDEFINED) mLeft = end; + if (start != UNDEFINED) mRight = start; + } else { + if (start != UNDEFINED) mLeft = start; + if (end != UNDEFINED) mRight = end; + } + } + + public void setAbsolute(int left, int right) { + mIsRelative = false; + if (left != UNDEFINED) mLeft = mExplicitLeft = left; + if (right != UNDEFINED) mRight = mExplicitRight = right; + } + + public void setDirection(boolean isRtl) { + if (isRtl == mIsRtl) { + return; + } + mIsRtl = isRtl; + if (mIsRelative) { + if (isRtl) { + mLeft = mEnd != UNDEFINED ? mEnd : mExplicitLeft; + mRight = mStart != UNDEFINED ? mStart : mExplicitRight; + } else { + mLeft = mStart != UNDEFINED ? mStart : mExplicitLeft; + mRight = mEnd != UNDEFINED ? mEnd : mExplicitRight; + } + } else { + mLeft = mExplicitLeft; + mRight = mExplicitRight; + } + } +} \ No newline at end of file diff --git a/android/support/v7/internal/widget/ScrollingTabContainerView.java b/android/support/v7/internal/widget/ScrollingTabContainerView.java new file mode 100644 index 0000000000..1426208572 --- /dev/null +++ b/android/support/v7/internal/widget/ScrollingTabContainerView.java @@ -0,0 +1,609 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package android.support.v7.internal.widget; + +import android.content.Context; +import android.content.res.Configuration; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.support.v4.view.GravityCompat; +import android.support.v4.view.ViewCompat; +import android.support.v4.view.ViewPropertyAnimatorCompat; +import android.support.v4.view.ViewPropertyAnimatorListener; +import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat; +import android.support.v7.app.ActionBar; +import android.support.v7.appcompat.R; +import android.support.v7.internal.view.ActionBarPolicy; +import android.support.v7.widget.LinearLayoutCompat; +import android.text.TextUtils; +import android.text.TextUtils.TruncateAt; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewParent; +import android.view.accessibility.AccessibilityEvent; +import android.view.accessibility.AccessibilityNodeInfo; +import android.view.animation.DecelerateInterpolator; +import android.view.animation.Interpolator; +import android.widget.BaseAdapter; +import android.widget.HorizontalScrollView; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ListView; +import android.widget.TextView; +import android.widget.Toast; + +/** + * This widget implements the dynamic action bar tab behavior that can change across different + * configurations or circumstances. + * + * @hide + */ +public class ScrollingTabContainerView extends HorizontalScrollView + implements AdapterViewCompat.OnItemClickListener { + + private static final String TAG = "ScrollingTabContainerView"; + Runnable mTabSelector; + private TabClickListener mTabClickListener; + + private LinearLayoutCompat mTabLayout; + private SpinnerCompat mTabSpinner; + private boolean mAllowCollapse; + + int mMaxTabWidth; + int mStackedTabMaxWidth; + private int mContentHeight; + private int mSelectedTabIndex; + + protected ViewPropertyAnimatorCompat mVisibilityAnim; + protected final VisibilityAnimListener mVisAnimListener = new VisibilityAnimListener(); + + private static final Interpolator sAlphaInterpolator = new DecelerateInterpolator(); + + private static final int FADE_DURATION = 200; + + public ScrollingTabContainerView(Context context) { + super(context); + + setHorizontalScrollBarEnabled(false); + + ActionBarPolicy abp = ActionBarPolicy.get(context); + setContentHeight(abp.getTabContainerHeight()); + mStackedTabMaxWidth = abp.getStackedTabMaxWidth(); + + 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; + } + mMaxTabWidth = Math.min(mMaxTabWidth, mStackedTabMaxWidth); + } 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); + } + } + if (mTabSpinner != null && position >= 0) { + mTabSpinner.setSelection(position); + } + } + + public void setContentHeight(int contentHeight) { + mContentHeight = contentHeight; + requestLayout(); + } + + private LinearLayoutCompat createTabLayout() { + final LinearLayoutCompat tabLayout = new LinearLayoutCompat(getContext(), null, + R.attr.actionBarTabBarStyle); + tabLayout.setMeasureWithLargestChildEnabled(true); + tabLayout.setGravity(Gravity.CENTER); + tabLayout.setLayoutParams(new LinearLayoutCompat.LayoutParams( + LinearLayoutCompat.LayoutParams.WRAP_CONTENT, LinearLayoutCompat.LayoutParams.MATCH_PARENT)); + return tabLayout; + } + + private SpinnerCompat createSpinner() { + final SpinnerCompat spinner = new SpinnerCompat(getContext(), null, + R.attr.actionDropDownStyle); + spinner.setLayoutParams(new LinearLayoutCompat.LayoutParams( + LinearLayoutCompat.LayoutParams.WRAP_CONTENT, LinearLayoutCompat.LayoutParams.MATCH_PARENT)); + spinner.setOnItemClickListenerInt(this); + return spinner; + } + + protected void onConfigurationChanged(Configuration newConfig) { + if (Build.VERSION.SDK_INT >= 8) { + super.onConfigurationChanged(newConfig); + } + + ActionBarPolicy abp = ActionBarPolicy.get(getContext()); + // Action bar can change size on configuration changes. + // Reread the desired height from the theme-specified style. + setContentHeight(abp.getTabContainerHeight()); + mStackedTabMaxWidth = abp.getStackedTabMaxWidth(); + } + + public void animateToVisibility(int visibility) { + if (mVisibilityAnim != null) { + mVisibilityAnim.cancel(); + } + if (visibility == VISIBLE) { + if (getVisibility() != VISIBLE) { + ViewCompat.setAlpha(this, 0f); + } + + ViewPropertyAnimatorCompat anim = ViewCompat.animate(this).alpha(1f); + anim.setDuration(FADE_DURATION); + + anim.setInterpolator(sAlphaInterpolator); + anim.setListener(mVisAnimListener.withFinalVisibility(anim, visibility)); + anim.start(); + } else { + ViewPropertyAnimatorCompat anim = ViewCompat.animate(this).alpha(0f); + anim.setDuration(FADE_DURATION); + + anim.setInterpolator(sAlphaInterpolator); + anim.setListener(mVisAnimListener.withFinalVisibility(anim, 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) { + final TabView tabView = new TabView(getContext(), 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 LinearLayoutCompat.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 LinearLayoutCompat.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 onItemClick(AdapterViewCompat parent, View view, int position, long id) { + TabView tabView = (TabView) view; + tabView.getTab().select(); + } + + private class TabView extends LinearLayoutCompat implements OnLongClickListener { + private final int[] BG_ATTRS = { + android.R.attr.background + }; + + private ActionBar.Tab mTab; + private TextView mTextView; + private ImageView mIconView; + private View mCustomView; + + public TabView(Context context, ActionBar.Tab tab, boolean forList) { + super(context, null, R.attr.actionBarTabStyle); + mTab = tab; + + TintTypedArray a = TintTypedArray.obtainStyledAttributes(context, null, BG_ATTRS, + R.attr.actionBarTabStyle, 0); + if (a.hasValue(0)) { + setBackgroundDrawable(a.getDrawable(0)); + } + a.recycle(); + + if (forList) { + setGravity(GravityCompat.START | Gravity.CENTER_VERTICAL); + } + + update(); + } + + public void bindTab(ActionBar.Tab tab) { + mTab = tab; + update(); + } + + @Override + public void setSelected(boolean selected) { + final boolean changed = (isSelected() != selected); + super.setSelected(selected); + if (changed && selected) { + sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED); + } + } + + @Override + public void onInitializeAccessibilityEvent(AccessibilityEvent event) { + super.onInitializeAccessibilityEvent(event); + // This view masquerades as an action bar tab. + event.setClassName(ActionBar.Tab.class.getName()); + } + + @Override + public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { + super.onInitializeAccessibilityNodeInfo(info); + + if (Build.VERSION.SDK_INT >= 14) { + // This view masquerades as an action bar tab. + info.setClassName(ActionBar.Tab.class.getName()); + } + } + + @Override + public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + + // Re-measure if we went beyond our maximum size. + if (mMaxTabWidth > 0 && getMeasuredWidth() > mMaxTabWidth) { + super.onMeasure(MeasureSpec.makeMeasureSpec(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); + } + + final boolean hasText = !TextUtils.isEmpty(text); + if (hasText) { + if (mTextView == null) { + TextView textView = new CompatTextView(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.setText(text); + mTextView.setVisibility(VISIBLE); + } else if (mTextView != null) { + mTextView.setVisibility(GONE); + mTextView.setText(null); + } + + if (mIconView != null) { + mIconView.setContentDescription(tab.getContentDescription()); + } + + if (!hasText && !TextUtils.isEmpty(tab.getContentDescription())) { + setOnLongClickListener(this); + } else { + setOnLongClickListener(null); + setLongClickable(false); + } + } + } + + public boolean onLongClick(View v) { + final int[] screenPos = new int[2]; + getLocationOnScreen(screenPos); + + final Context context = getContext(); + final int width = getWidth(); + final int height = getHeight(); + final int screenWidth = context.getResources().getDisplayMetrics().widthPixels; + + Toast cheatSheet = Toast.makeText(context, mTab.getContentDescription(), + Toast.LENGTH_SHORT); + // Show under the tab + cheatSheet.setGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL, + (screenPos[0] + width / 2) - screenWidth / 2, height); + + cheatSheet.show(); + return true; + } + + 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 ViewPropertyAnimatorListener { + private boolean mCanceled = false; + private int mFinalVisibility; + + public VisibilityAnimListener withFinalVisibility(ViewPropertyAnimatorCompat animation, + int visibility) { + mFinalVisibility = visibility; + mVisibilityAnim = animation; + return this; + } + + @Override + public void onAnimationStart(View view) { + setVisibility(VISIBLE); + mCanceled = false; + } + + @Override + public void onAnimationEnd(View view) { + if (mCanceled) return; + + mVisibilityAnim = null; + setVisibility(mFinalVisibility); + } + + @Override + public void onAnimationCancel(View view) { + mCanceled = true; + } + } +} + diff --git a/android/support/v7/internal/widget/SpinnerCompat.java b/android/support/v7/internal/widget/SpinnerCompat.java new file mode 100644 index 0000000000..b2b8af24ad --- /dev/null +++ b/android/support/v7/internal/widget/SpinnerCompat.java @@ -0,0 +1,1102 @@ +/* + * 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 android.support.v7.internal.widget; + +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.database.DataSetObserver; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.os.Parcel; +import android.os.Parcelable; +import android.support.v4.view.GravityCompat; +import android.support.v4.view.ViewCompat; +import android.support.v7.appcompat.R; +import android.support.v7.widget.ListPopupWindow; +import android.util.AttributeSet; +import android.util.Log; +import android.view.Gravity; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewTreeObserver; +import android.widget.AdapterView; +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 android.widget.Adapter} associated with this view. + * + *

      See the Spinner + * tutorial.

      + */ +class SpinnerCompat extends AbsSpinnerCompat implements DialogInterface.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; + + /** + * Forwarding listener used to implement drag-to-open. + */ + private ListPopupWindow.ForwardingListener mForwardingListener; + + private SpinnerPopup mPopup; + + private DropDownAdapter mTempAdapter; + + int mDropDownWidth; + + private int mGravity; + + private boolean mDisableChildrenWhenDisabled; + + private Rect mTempRect = new Rect(); + + private final TintManager mTintManager; + + /** + * Construct a new spinner with the given context's theme. + * + * @param context The Context the view is running in, through which it can access the current + * theme, resources, etc. + */ + SpinnerCompat(Context context) { + this(context, null); + } + + /** + * Construct a new spinner with the given context's theme and the supplied mode of displaying + * choices. mode may be one of {@link #MODE_DIALOG} or {@link #MODE_DROPDOWN}. + * + * @param context The Context the view is running in, through which it can access the current + * theme, resources, etc. + * @param mode Constant describing how the user will select choices from the spinner. + * @see #MODE_DIALOG + * @see #MODE_DROPDOWN + */ + SpinnerCompat(Context context, int mode) { + this(context, null, R.attr.spinnerStyle, mode); + } + + /** + * Construct a new spinner with the given context's theme and the supplied attribute set. + * + * @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. + */ + SpinnerCompat(Context context, AttributeSet attrs) { + this(context, attrs, R.attr.spinnerStyle); + } + + /** + * 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. + */ + SpinnerCompat(Context context, AttributeSet attrs, int defStyle) { + this(context, attrs, defStyle, MODE_THEME); + } + + /** + * Construct a new spinner with the given context's theme, the supplied attribute set, and + * default style. mode may be one of {@link #MODE_DIALOG} or {@link #MODE_DROPDOWN} + * and determines how the user will select choices from the spinner. + * + * @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. + * @param mode Constant describing how the user will select choices from the spinner. + * @see #MODE_DIALOG + * @see #MODE_DROPDOWN + */ + SpinnerCompat(Context context, AttributeSet attrs, int defStyle, int mode) { + super(context, attrs, defStyle); + + TintTypedArray a = TintTypedArray.obtainStyledAttributes(context, attrs, + R.styleable.Spinner, defStyle, 0); + + // Need to reset this for tinting purposes + if (a.hasValue(R.styleable.Spinner_android_background)) { + setBackgroundDrawable(a.getDrawable(R.styleable.Spinner_android_background)); + } + + if (mode == MODE_THEME) { + mode = a.getInt(R.styleable.Spinner_spinnerMode, MODE_DIALOG); + } + + switch (mode) { + case MODE_DIALOG: { + mPopup = new DialogPopup(); + break; + } + + case MODE_DROPDOWN: { + final 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)); + + mPopup = popup; + mForwardingListener = new ListPopupWindow.ForwardingListener(this) { + @Override + public ListPopupWindow getPopup() { + return popup; + } + + @Override + public boolean onForwardingStarted() { + if (!mPopup.isShowing()) { + mPopup.show(); + } + return true; + } + }; + break; + } + } + + mGravity = a.getInt(R.styleable.Spinner_android_gravity, Gravity.CENTER); + + mPopup.setPromptText(a.getString(R.styleable.Spinner_prompt)); + + mDisableChildrenWhenDisabled = a.getBoolean( + R.styleable.Spinner_disableChildrenWhenDisabled, false); + + 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; + } + + // Keep the TintManager in case we need it later + mTintManager = a.getTintManager(); + } + + /** + * Set the background drawable for the spinner's popup window of choices. Only valid in {@link + * #MODE_DROPDOWN}; this method is a no-op in other modes. + * + * @param background Background drawable + */ + public void setPopupBackgroundDrawable(Drawable background) { + if (!(mPopup instanceof DropdownPopup)) { + Log.e(TAG, "setPopupBackgroundDrawable: incompatible spinner mode; ignoring..."); + return; + } + ((DropdownPopup) mPopup).setBackgroundDrawable(background); + } + + /** + * Set the background drawable for the spinner's popup window of choices. Only valid in {@link + * #MODE_DROPDOWN}; this method is a no-op in other modes. + * + * @param resId Resource ID of a background drawable + */ + public void setPopupBackgroundResource(int resId) { + setPopupBackgroundDrawable(mTintManager.getDrawable(resId)); + } + + /** + * Get the background drawable for the spinner's popup window of choices. Only valid in {@link + * #MODE_DROPDOWN}; other modes will return null. + * + * @return background Background drawable + */ + public Drawable getPopupBackground() { + return mPopup.getBackground(); + } + + /** + * Set a vertical offset in pixels for the spinner's popup window of choices. Only valid in + * {@link #MODE_DROPDOWN}; this method is a no-op in other modes. + * + * @param pixels Vertical offset in pixels + */ + public void setDropDownVerticalOffset(int pixels) { + mPopup.setVerticalOffset(pixels); + } + + /** + * Get the configured vertical offset in pixels for the spinner's popup window of choices. Only + * valid in {@link #MODE_DROPDOWN}; other modes will return 0. + * + * @return Vertical offset in pixels + */ + public int getDropDownVerticalOffset() { + return mPopup.getVerticalOffset(); + } + + /** + * Set a horizontal offset in pixels for the spinner's popup window of choices. Only valid in + * {@link #MODE_DROPDOWN}; this method is a no-op in other modes. + * + * @param pixels Horizontal offset in pixels + */ + public void setDropDownHorizontalOffset(int pixels) { + mPopup.setHorizontalOffset(pixels); + } + + /** + * Get the configured horizontal offset in pixels for the spinner's popup window of choices. + * Only valid in {@link #MODE_DROPDOWN}; other modes will return 0. + * + * @return Horizontal offset in pixels + */ + public int getDropDownHorizontalOffset() { + return mPopup.getHorizontalOffset(); + } + + /** + * Set the width of the spinner's popup window of choices in pixels. This value may also be set + * to {@link android.view.ViewGroup.LayoutParams#MATCH_PARENT} to match the width of the Spinner + * itself, or {@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT} to wrap to the measured + * size of contained dropdown list items. + * + *

      Only valid in {@link #MODE_DROPDOWN}; this method is a no-op in other modes.

      + * + * @param pixels Width in pixels, WRAP_CONTENT, or MATCH_PARENT + */ + public void setDropDownWidth(int pixels) { + if (!(mPopup instanceof DropdownPopup)) { + Log.e(TAG, "Cannot set dropdown width for MODE_DIALOG, ignoring"); + return; + } + mDropDownWidth = pixels; + } + + /** + * Get the configured width of the spinner's popup window of choices in pixels. The returned + * value may also be {@link android.view.ViewGroup.LayoutParams#MATCH_PARENT} meaning the popup + * window will match the width of the Spinner itself, or {@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT} + * to wrap to the measured size of contained dropdown list items. + * + * @return Width in pixels, WRAP_CONTENT, or MATCH_PARENT + */ + public int getDropDownWidth() { + return mDropDownWidth; + } + + @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} + */ + public void setGravity(int gravity) { + if (mGravity != gravity) { + if ((gravity & Gravity.HORIZONTAL_GRAVITY_MASK) == 0) { + gravity |= GravityCompat.START; + } + mGravity = gravity; + requestLayout(); + } + } + + @Override + public void setAdapter(SpinnerAdapter adapter) { + super.setAdapter(adapter); + + mRecycler.clear(); + + final int targetSdkVersion = getContext().getApplicationInfo().targetSdkVersion; + if (targetSdkVersion >= Build.VERSION_CODES.LOLLIPOP + && adapter != null && adapter.getViewTypeCount() != 1) { + throw new IllegalArgumentException("Spinner adapter view type count must be 1"); + } + 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 = makeView(0, false); + mRecycler.put(0, child); + } + + 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."); + } + + void setOnItemClickListenerInt(OnItemClickListener l) { + super.setOnItemClickListener(l); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + if (mForwardingListener != null && mForwardingListener.onTouch(this, event)) { + return true; + } + + return super.onTouchEvent(event); + } + + @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 means 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; + if (mAdapter != null) { + View sel = makeView(mSelectedPosition, true); + int width = sel.getMeasuredWidth(); + int selectedOffset = childrenLeft; + final int layoutDirection = ViewCompat.getLayoutDirection(this); + final int absoluteGravity = GravityCompat.getAbsoluteGravity(mGravity, layoutDirection); + switch (absoluteGravity & 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 + * @param addChild true to add the child to the spinner, false to obtain and configure only. + * @return A view for the given position + */ + private View makeView(int position, boolean addChild) { + + View child; + + if (!mDataChanged) { + child = mRecycler.get(position); + if (child != null) { + // Position the view + setUpChild(child, addChild); + + return child; + } + } + + // Nothing found in the recycler -- ask the adapter for a view + child = mAdapter.getView(position, null, this); + + // Position the view + setUpChild(child, addChild); + + return child; + } + + /** + * Helper for makeAndAddView to set the position of a view and fill out its layout paramters. + * + * @param child The view to position + * @param addChild true if the child should be added to the Spinner during setup + */ + private void setUpChild(View child, boolean addChild) { + + // Respect layout params that are already in the view. Otherwise + // make some up... + ViewGroup.LayoutParams lp = child.getLayoutParams(); + if (lp == null) { + lp = generateDefaultLayoutParams(); + } + + if (addChild) { + 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; + } + + @Override + public Parcelable onSaveInstanceState() { + final SavedState ss = new SavedState(super.onSaveInstanceState()); + ss.showDropdown = mPopup != null && mPopup.isShowing(); + return ss; + } + + @Override + public void onRestoreInstanceState(Parcelable state) { + SavedState ss = (SavedState) state; + + super.onRestoreInstanceState(ss.getSuperState()); + + if (ss.showDropdown) { + ViewTreeObserver vto = getViewTreeObserver(); + if (vto != null) { + final ViewTreeObserver.OnGlobalLayoutListener listener + = new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + if (!mPopup.isShowing()) { + mPopup.show(); + } + final ViewTreeObserver vto = getViewTreeObserver(); + if (vto != null) { + vto.removeGlobalOnLayoutListener(this); + } + } + }; + vto.addOnGlobalLayoutListener(listener); + } + } + } + + static class SavedState extends AbsSpinnerCompat.SavedState { + + boolean showDropdown; + + SavedState(Parcelable superState) { + super(superState); + } + + private SavedState(Parcel in) { + super(in); + showDropdown = in.readByte() != 0; + } + + @Override + public void writeToParcel(Parcel out, int flags) { + super.writeToParcel(out, flags); + out.writeByte((byte) (showDropdown ? 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]; + } + }; + } + + /** + *

      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(); + + public void setBackgroundDrawable(Drawable bg); + + public void setVerticalOffset(int px); + + public void setHorizontalOffset(int px); + + public Drawable getBackground(); + + public int getVerticalOffset(); + + public int getHorizontalOffset(); + } + + private class DialogPopup implements SpinnerPopup, DialogInterface.OnClickListener { + + private AlertDialog mPopup; + + private ListAdapter mListAdapter; + + private CharSequence mPrompt; + + public void dismiss() { + if (mPopup != null) { + 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() { + if (mListAdapter == null) { + return; + } + AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); + if (mPrompt != null) { + builder.setTitle(mPrompt); + } + mPopup = builder.setSingleChoiceItems(mListAdapter, + getSelectedItemPosition(), this).create(); + mPopup.show(); + } + + public void onClick(DialogInterface dialog, int which) { + setSelection(which); + if (mOnItemClickListener != null) { + performItemClick(null, which, mListAdapter.getItemId(which)); + } + dismiss(); + } + + @Override + public void setBackgroundDrawable(Drawable bg) { + Log.e(TAG, "Cannot set popup background for MODE_DIALOG, ignoring"); + } + + @Override + public void setVerticalOffset(int px) { + Log.e(TAG, "Cannot set vertical offset for MODE_DIALOG, ignoring"); + } + + @Override + public void setHorizontalOffset(int px) { + Log.e(TAG, "Cannot set horizontal offset for MODE_DIALOG, ignoring"); + } + + @Override + public Drawable getBackground() { + return null; + } + + @Override + public int getVerticalOffset() { + return 0; + } + + @Override + public int getHorizontalOffset() { + return 0; + } + } + + private class DropdownPopup extends ListPopupWindow implements SpinnerPopup { + + private CharSequence mHintText; + + private ListAdapter mAdapter; + + public DropdownPopup( + Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + setAnchorView(SpinnerCompat.this); + setModal(true); + setPromptPosition(POSITION_PROMPT_ABOVE); + + setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View v, int position, long id) { + SpinnerCompat.this.setSelection(position); + if (mOnItemClickListener != null) { + SpinnerCompat.this + .performItemClick(v, position, mAdapter.getItemId(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; + } + + void computeContentWidth() { + final Drawable background = getBackground(); + int hOffset = 0; + if (background != null) { + background.getPadding(mTempRect); + hOffset = ViewUtils.isLayoutRtl(SpinnerCompat.this) ? mTempRect.right + : -mTempRect.left; + } else { + mTempRect.left = mTempRect.right = 0; + } + + final int spinnerPaddingLeft = SpinnerCompat.this.getPaddingLeft(); + final int spinnerPaddingRight = SpinnerCompat.this.getPaddingRight(); + final int spinnerWidth = SpinnerCompat.this.getWidth(); + if (mDropDownWidth == WRAP_CONTENT) { + 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 == MATCH_PARENT) { + setContentWidth(spinnerWidth - spinnerPaddingLeft - spinnerPaddingRight); + } else { + setContentWidth(mDropDownWidth); + } + if (ViewUtils.isLayoutRtl(SpinnerCompat.this)) { + hOffset += spinnerWidth - spinnerPaddingRight - getWidth(); + } else { + hOffset += spinnerPaddingLeft; + } + setHorizontalOffset(hOffset); + } + + public void show(int textDirection, int textAlignment) { + final boolean wasShowing = isShowing(); + + computeContentWidth(); + setInputMethodMode(ListPopupWindow.INPUT_METHOD_NOT_NEEDED); + super.show(); + final ListView listView = getListView(); + listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); + //listView.setTextDirection(textDirection); + //listView.setTextAlignment(textAlignment); + setSelection(SpinnerCompat.this.getSelectedItemPosition()); + + if (wasShowing) { + // Skip setting up the layout/dismiss listener below. If we were previously + // showing it will still stick around. + return; + } + + // Make sure we hide if our anchor goes away. + // TODO: This might be appropriate to push all the way down to PopupWindow, + // but it may have other side effects to investigate first. (Text editing handles, etc.) + final ViewTreeObserver vto = getViewTreeObserver(); + if (vto != null) { + final ViewTreeObserver.OnGlobalLayoutListener layoutListener + = new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + computeContentWidth(); + + // Use super.show here to update; we don't want to move the selected + // position or adjust other things that would be reset otherwise. + DropdownPopup.super.show(); + } + }; + vto.addOnGlobalLayoutListener(layoutListener); + setOnDismissListener(new PopupWindow.OnDismissListener() { + @Override + public void onDismiss() { + final ViewTreeObserver vto = getViewTreeObserver(); + if (vto != null) { + vto.removeGlobalOnLayoutListener(layoutListener); + } + } + }); + } + } + } +} diff --git a/android/support/v7/internal/widget/ThemeUtils.java b/android/support/v7/internal/widget/ThemeUtils.java new file mode 100644 index 0000000000..aacecfa36b --- /dev/null +++ b/android/support/v7/internal/widget/ThemeUtils.java @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.content.res.ColorStateList; +import android.content.res.TypedArray; +import android.graphics.Color; +import android.support.v4.graphics.ColorUtils; +import android.util.TypedValue; + +class ThemeUtils { + + private static final ThreadLocal TL_TYPED_VALUE = new ThreadLocal<>(); + + private static final int[] DISABLED_STATE_SET = new int[]{-android.R.attr.state_enabled}; + private static final int[] EMPTY_STATE_SET = new int[0]; + + private static final int[] TEMP_ARRAY = new int[1]; + + static ColorStateList createDisabledStateList(int textColor, int disabledTextColor) { + // Now create a new ColorStateList with the default color, and the new disabled + // color + final int[][] states = new int[2][]; + final int[] colors = new int[2]; + int i = 0; + + // Disabled state + states[i] = DISABLED_STATE_SET; + colors[i] = disabledTextColor; + i++; + + // Default state + states[i] = EMPTY_STATE_SET; + colors[i] = textColor; + i++; + + return new ColorStateList(states, colors); + } + + static int getThemeAttrColor(Context context, int attr) { + TEMP_ARRAY[0] = attr; + TypedArray a = context.obtainStyledAttributes(null, TEMP_ARRAY); + try { + return a.getColor(0, 0); + } finally { + a.recycle(); + } + } + + static ColorStateList getThemeAttrColorStateList(Context context, int attr) { + TEMP_ARRAY[0] = attr; + TypedArray a = context.obtainStyledAttributes(null, TEMP_ARRAY); + try { + return a.getColorStateList(0); + } finally { + a.recycle(); + } + } + + static int getDisabledThemeAttrColor(Context context, int attr) { + final ColorStateList csl = getThemeAttrColorStateList(context, attr); + if (csl != null && csl.isStateful()) { + // If the CSL is stateful, we'll assume it has a disabled state and use it + return csl.getColorForState(DISABLED_STATE_SET, csl.getDefaultColor()); + } else { + // Else, we'll generate the color using disabledAlpha from the theme + + final TypedValue tv = getTypedValue(); + // Now retrieve the disabledAlpha value from the theme + context.getTheme().resolveAttribute(android.R.attr.disabledAlpha, tv, true); + final float disabledAlpha = tv.getFloat(); + + return getThemeAttrColor(context, attr, disabledAlpha); + } + } + + private static TypedValue getTypedValue() { + TypedValue typedValue = TL_TYPED_VALUE.get(); + if (typedValue == null) { + typedValue = new TypedValue(); + TL_TYPED_VALUE.set(typedValue); + } + return typedValue; + } + + static int getThemeAttrColor(Context context, int attr, float alpha) { + final int color = getThemeAttrColor(context, attr); + final int originalAlpha = Color.alpha(color); + return ColorUtils.setAlphaComponent(color, Math.round(originalAlpha * alpha)); + } + +} diff --git a/android/support/v7/internal/widget/TintAutoCompleteTextView.java b/android/support/v7/internal/widget/TintAutoCompleteTextView.java new file mode 100644 index 0000000000..29ec605f46 --- /dev/null +++ b/android/support/v7/internal/widget/TintAutoCompleteTextView.java @@ -0,0 +1,142 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.content.res.ColorStateList; +import android.graphics.PorterDuff; +import android.support.annotation.Nullable; +import android.support.v4.view.TintableBackgroundView; +import android.util.AttributeSet; +import android.widget.AutoCompleteTextView; + +/** + * An tint aware {@link android.widget.AutoCompleteTextView}. + *

      + * This will automatically be used when you use {@link AutoCompleteTextView} in your layouts. You + * should only need to manually use this class writing custom views. + */ +public class TintAutoCompleteTextView extends AutoCompleteTextView implements + TintableBackgroundView { + + private static final int[] TINT_ATTRS = { + android.R.attr.background, + android.R.attr.popupBackground + }; + + private TintManager mTintManager; + private TintInfo mBackgroundTint; + + public TintAutoCompleteTextView(Context context) { + this(context, null); + } + + public TintAutoCompleteTextView(Context context, AttributeSet attrs) { + this(context, attrs, android.R.attr.autoCompleteTextViewStyle); + } + + public TintAutoCompleteTextView(Context context, AttributeSet attrs, int defStyleAttr) { + super(TintContextWrapper.wrap(context), attrs, defStyleAttr); + + if (TintManager.SHOULD_BE_USED) { + TintTypedArray a = TintTypedArray.obtainStyledAttributes(getContext(), attrs, + TINT_ATTRS, defStyleAttr, 0); + mTintManager = a.getTintManager(); + + if (a.hasValue(0)) { + setSupportBackgroundTintList( + mTintManager.getColorStateList(a.getResourceId(0, -1))); + } + if (a.hasValue(1)) { + setDropDownBackgroundDrawable(a.getDrawable(1)); + } + a.recycle(); + } + } + + @Override + public void setDropDownBackgroundResource(int id) { + setDropDownBackgroundDrawable(mTintManager.getDrawable(id)); + } + + /** + * This should be accessed via + * {@link android.support.v4.view.ViewCompat#setBackgroundTintList(android.view.View, + * android.content.res.ColorStateList)} + * + * @hide + */ + @Override + public void setSupportBackgroundTintList(@Nullable ColorStateList tint) { + if (mBackgroundTint == null) { + mBackgroundTint = new TintInfo(); + } + mBackgroundTint.mTintList = tint; + applySupportBackgroundTint(); + } + + /** + * This should be accessed via + * {@link android.support.v4.view.ViewCompat#getBackgroundTintList(android.view.View)} + * + * @hide + */ + @Override + @Nullable + public ColorStateList getSupportBackgroundTintList() { + return mBackgroundTint != null ? mBackgroundTint.mTintList : null; + } + + /** + * This should be accessed via + * {@link android.support.v4.view.ViewCompat#setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode)} + * + * @hide + */ + @Override + public void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) { + if (mBackgroundTint == null) { + mBackgroundTint = new TintInfo(); + } + mBackgroundTint.mTintMode = tintMode; + applySupportBackgroundTint(); + } + + /** + * This should be accessed via + * {@link android.support.v4.view.ViewCompat#getBackgroundTintMode(android.view.View)} + * + * @hide + */ + @Override + @Nullable + public PorterDuff.Mode getSupportBackgroundTintMode() { + return mBackgroundTint != null ? mBackgroundTint.mTintMode : null; + } + + @Override + protected void drawableStateChanged() { + super.drawableStateChanged(); + applySupportBackgroundTint(); + } + + private void applySupportBackgroundTint() { + if (getBackground() != null && mBackgroundTint != null) { + TintManager.tintViewBackground(this, mBackgroundTint); + } + } +} diff --git a/android/support/v7/internal/widget/TintButton.java b/android/support/v7/internal/widget/TintButton.java new file mode 100644 index 0000000000..41b3c3b354 --- /dev/null +++ b/android/support/v7/internal/widget/TintButton.java @@ -0,0 +1,154 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.content.res.ColorStateList; +import android.graphics.PorterDuff; +import android.os.Build; +import android.support.annotation.Nullable; +import android.support.v4.view.TintableBackgroundView; +import android.util.AttributeSet; +import android.widget.Button; + +/** + * An tint aware {@link android.widget.Button}. + *

      + * This will automatically be used when you use {@link android.widget.Button} in your layouts. You + * should only need to manually use this class when writing custom views. + */ +public class TintButton extends Button implements TintableBackgroundView { + + private static final int[] TINT_ATTRS = { + android.R.attr.background + }; + + private TintInfo mBackgroundTint; + + public TintButton(Context context) { + this(context, null); + } + + public TintButton(Context context, AttributeSet attrs) { + this(context, attrs, android.R.attr.buttonStyle); + } + + public TintButton(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + if (TintManager.SHOULD_BE_USED) { + TintTypedArray a = TintTypedArray.obtainStyledAttributes(getContext(), attrs, + TINT_ATTRS, defStyleAttr, 0); + if (a.hasValue(0)) { + setSupportBackgroundTintList( + a.getTintManager().getColorStateList(a.getResourceId(0, -1))); + } + a.recycle(); + } + + final ColorStateList textColors = getTextColors(); + if (textColors != null && !textColors.isStateful()) { + // If we have a ColorStateList which isn't stateful, create one which includes + // a disabled state + + final int disabledTextColor; + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { + // Pre-Lollipop, we will use textColorSecondary with android:disabledAlpha + // applied + disabledTextColor = ThemeUtils.getDisabledThemeAttrColor(context, + android.R.attr.textColorSecondary); + } else { + // With certain styles on Lollipop, there is a StateListAnimator which sets + // an alpha on the whole view, so we don't need to apply disabledAlpha to + // textColorSecondary + disabledTextColor = ThemeUtils.getThemeAttrColor(context, + android.R.attr.textColorSecondary); + } + + setTextColor(ThemeUtils.createDisabledStateList( + textColors.getDefaultColor(), disabledTextColor)); + } + } + + /** + * This should be accessed via + * {@link android.support.v4.view.ViewCompat#setBackgroundTintList(android.view.View, + * android.content.res.ColorStateList)} + * + * @hide + */ + @Override + public void setSupportBackgroundTintList(@Nullable ColorStateList tint) { + if (mBackgroundTint == null) { + mBackgroundTint = new TintInfo(); + } + mBackgroundTint.mTintList = tint; + applySupportBackgroundTint(); + } + + /** + * This should be accessed via + * {@link android.support.v4.view.ViewCompat#getBackgroundTintList(android.view.View)} + * + * @hide + */ + @Override + @Nullable + public ColorStateList getSupportBackgroundTintList() { + return mBackgroundTint != null ? mBackgroundTint.mTintList : null; + } + + /** + * This should be accessed via + * {@link android.support.v4.view.ViewCompat#setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode)} + * + * @hide + */ + @Override + public void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) { + if (mBackgroundTint == null) { + mBackgroundTint = new TintInfo(); + } + mBackgroundTint.mTintMode = tintMode; + applySupportBackgroundTint(); + } + + /** + * This should be accessed via + * {@link android.support.v4.view.ViewCompat#getBackgroundTintMode(android.view.View)} + * + * @hide + */ + @Override + @Nullable + public PorterDuff.Mode getSupportBackgroundTintMode() { + return mBackgroundTint != null ? mBackgroundTint.mTintMode : null; + } + + @Override + protected void drawableStateChanged() { + super.drawableStateChanged(); + applySupportBackgroundTint(); + } + + private void applySupportBackgroundTint() { + if (getBackground() != null && mBackgroundTint != null) { + TintManager.tintViewBackground(this, mBackgroundTint); + } + } + +} diff --git a/android/support/v7/internal/widget/TintCheckBox.java b/android/support/v7/internal/widget/TintCheckBox.java new file mode 100644 index 0000000000..ea1fa684f5 --- /dev/null +++ b/android/support/v7/internal/widget/TintCheckBox.java @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.CheckBox; + +/** + * An tint aware {@link android.widget.CheckBox}. + *

      + * This will automatically be used when you use {@link android.widget.CheckBox} in your layouts. + * You should only need to manually use this class when writing custom views. + */ +public class TintCheckBox extends CheckBox { + + private static final int[] TINT_ATTRS = { + android.R.attr.button + }; + + private TintManager mTintManager; + + public TintCheckBox(Context context) { + this(context, null); + } + + public TintCheckBox(Context context, AttributeSet attrs) { + this(context, attrs, android.R.attr.checkboxStyle); + } + + public TintCheckBox(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + if (TintManager.SHOULD_BE_USED) { + TintTypedArray a = TintTypedArray.obtainStyledAttributes(getContext(), attrs, + TINT_ATTRS, defStyleAttr, 0); + setButtonDrawable(a.getDrawable(0)); + a.recycle(); + + mTintManager = a.getTintManager(); + } + } + + @Override + public void setButtonDrawable(int resid) { + if (mTintManager != null) { + setButtonDrawable(mTintManager.getDrawable(resid)); + } else { + super.setButtonDrawable(resid); + } + } +} diff --git a/android/support/v7/internal/widget/TintCheckedTextView.java b/android/support/v7/internal/widget/TintCheckedTextView.java new file mode 100644 index 0000000000..c969ad21ad --- /dev/null +++ b/android/support/v7/internal/widget/TintCheckedTextView.java @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.CheckedTextView; + +/** + * An tint aware {@link android.widget.CheckedTextView}. + *

      + * This will automatically be used when you use {@link android.widget.CheckedTextView} in your + * layouts. You should only need to manually use this class when writing custom views. + */ +public class TintCheckedTextView extends CheckedTextView { + + private static final int[] TINT_ATTRS = { + android.R.attr.checkMark + }; + + private TintManager mTintManager; + + public TintCheckedTextView(Context context) { + this(context, null); + } + + public TintCheckedTextView(Context context, AttributeSet attrs) { + this(context, attrs, android.R.attr.checkedTextViewStyle); + } + + public TintCheckedTextView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + if (TintManager.SHOULD_BE_USED) { + TintTypedArray a = TintTypedArray.obtainStyledAttributes(getContext(), attrs, + TINT_ATTRS, defStyleAttr, 0); + setCheckMarkDrawable(a.getDrawable(0)); + a.recycle(); + + mTintManager = a.getTintManager(); + } + } + + @Override + public void setCheckMarkDrawable(int resid) { + if (mTintManager != null) { + setCheckMarkDrawable(mTintManager.getDrawable(resid)); + } else { + super.setCheckMarkDrawable(resid); + } + } + +} diff --git a/android/support/v7/internal/widget/TintContextWrapper.java b/android/support/v7/internal/widget/TintContextWrapper.java new file mode 100644 index 0000000000..794728862a --- /dev/null +++ b/android/support/v7/internal/widget/TintContextWrapper.java @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.content.ContextWrapper; +import android.content.res.Resources; + +/** + * A {@link android.content.ContextWrapper} which returns a tint-aware + * {@link android.content.res.Resources} instance from {@link #getResources()}. + * + * @hide + */ +class TintContextWrapper extends ContextWrapper { + + private final TintManager mTintManager; + + public static Context wrap(Context context) { + if (!(context instanceof TintContextWrapper)) { + context = new TintContextWrapper(context); + } + return context; + } + + TintContextWrapper(Context base) { + super(base); + mTintManager = new TintManager(base); + } + + @Override + public Resources getResources() { + return mTintManager.getResources(); + } + + final TintManager getTintManager() { + return mTintManager; + } +} \ No newline at end of file diff --git a/android/support/v7/internal/widget/TintEditText.java b/android/support/v7/internal/widget/TintEditText.java new file mode 100644 index 0000000000..95ba859701 --- /dev/null +++ b/android/support/v7/internal/widget/TintEditText.java @@ -0,0 +1,129 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.content.res.ColorStateList; +import android.graphics.PorterDuff; +import android.support.annotation.Nullable; +import android.support.v4.view.TintableBackgroundView; +import android.util.AttributeSet; +import android.widget.EditText; + +/** + * An tint aware {@link android.widget.EditText}. + *

      + * This will automatically be used when you use {@link android.widget.EditText} in your + * layouts. You should only need to manually use this class when writing custom views. + */ +public class TintEditText extends EditText implements TintableBackgroundView { + + private static final int[] TINT_ATTRS = { + android.R.attr.background + }; + + private TintInfo mBackgroundTint; + + public TintEditText(Context context) { + this(context, null); + } + + public TintEditText(Context context, AttributeSet attrs) { + this(TintContextWrapper.wrap(context), attrs, android.R.attr.editTextStyle); + } + + public TintEditText(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + if (TintManager.SHOULD_BE_USED) { + TintTypedArray a = TintTypedArray.obtainStyledAttributes(getContext(), attrs, + TINT_ATTRS, defStyleAttr, 0); + if (a.hasValue(0)) { + setSupportBackgroundTintList( + a.getTintManager().getColorStateList(a.getResourceId(0, -1))); + } + a.recycle(); + } + } + + /** + * This should be accessed via + * {@link android.support.v4.view.ViewCompat#setBackgroundTintList(android.view.View, + * android.content.res.ColorStateList)} + * + * @hide + */ + @Override + public void setSupportBackgroundTintList(@Nullable ColorStateList tint) { + if (mBackgroundTint == null) { + mBackgroundTint = new TintInfo(); + } + mBackgroundTint.mTintList = tint; + applySupportBackgroundTint(); + } + + /** + * This should be accessed via + * {@link android.support.v4.view.ViewCompat#getBackgroundTintList(android.view.View)} + * + * @hide + */ + @Override + @Nullable + public ColorStateList getSupportBackgroundTintList() { + return mBackgroundTint != null ? mBackgroundTint.mTintList : null; + } + + /** + * This should be accessed via + * {@link android.support.v4.view.ViewCompat#setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode)} + * + * @hide + */ + @Override + public void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) { + if (mBackgroundTint == null) { + mBackgroundTint = new TintInfo(); + } + mBackgroundTint.mTintMode = tintMode; + applySupportBackgroundTint(); + } + + /** + * This should be accessed via + * {@link android.support.v4.view.ViewCompat#getBackgroundTintMode(android.view.View)} + * + * @hide + */ + @Override + @Nullable + public PorterDuff.Mode getSupportBackgroundTintMode() { + return mBackgroundTint != null ? mBackgroundTint.mTintMode : null; + } + + @Override + protected void drawableStateChanged() { + super.drawableStateChanged(); + applySupportBackgroundTint(); + } + + private void applySupportBackgroundTint() { + if (getBackground() != null && mBackgroundTint != null) { + TintManager.tintViewBackground(this, mBackgroundTint); + } + } +} diff --git a/android/support/v7/internal/widget/TintImageView.java b/android/support/v7/internal/widget/TintImageView.java new file mode 100644 index 0000000000..17dd557385 --- /dev/null +++ b/android/support/v7/internal/widget/TintImageView.java @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.support.annotation.DrawableRes; +import android.util.AttributeSet; +import android.widget.ImageView; + +/** + * An tint aware {@link android.widget.ImageView} + * + * @hide + */ +public class TintImageView extends ImageView { + + private static final int[] TINT_ATTRS = { + android.R.attr.background, + android.R.attr.src + }; + + private final TintManager mTintManager; + + public TintImageView(Context context) { + this(context, null); + } + + public TintImageView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public TintImageView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + TintTypedArray a = TintTypedArray.obtainStyledAttributes(getContext(), attrs, TINT_ATTRS, + defStyleAttr, 0); + if (a.length() > 0) { + if (a.hasValue(0)) { + setBackgroundDrawable(a.getDrawable(0)); + } + if (a.hasValue(1)) { + setImageDrawable(a.getDrawable(1)); + } + } + a.recycle(); + + // Keep the TintManager in case we need it later + mTintManager = a.getTintManager(); + } + + @Override + public void setImageResource(@DrawableRes int resId) { + // Intercept this call and instead retrieve the Drawable via the tint manager + setImageDrawable(mTintManager.getDrawable(resId)); + } +} diff --git a/android/support/v7/internal/widget/TintInfo.java b/android/support/v7/internal/widget/TintInfo.java new file mode 100644 index 0000000000..ba2a56a385 --- /dev/null +++ b/android/support/v7/internal/widget/TintInfo.java @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.res.ColorStateList; +import android.graphics.PorterDuff; + +class TintInfo { + ColorStateList mTintList; + PorterDuff.Mode mTintMode; +} diff --git a/android/support/v7/internal/widget/TintManager.java b/android/support/v7/internal/widget/TintManager.java new file mode 100644 index 0000000000..9fdfaa8339 --- /dev/null +++ b/android/support/v7/internal/widget/TintManager.java @@ -0,0 +1,511 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.content.res.ColorStateList; +import android.content.res.Resources; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.support.v4.content.ContextCompat; +import android.support.v4.graphics.drawable.DrawableCompat; +import android.support.v4.util.LruCache; +import android.support.v7.appcompat.R; +import android.util.Log; +import android.util.SparseArray; +import android.util.TypedValue; +import android.view.View; + +import static android.support.v7.internal.widget.ThemeUtils.getDisabledThemeAttrColor; +import static android.support.v7.internal.widget.ThemeUtils.getThemeAttrColor; +import static android.support.v7.internal.widget.ThemeUtils.getThemeAttrColorStateList; + +/** + * @hide + */ +public final class TintManager { + + static final boolean SHOULD_BE_USED = Build.VERSION.SDK_INT < 21; + + private static final String TAG = TintManager.class.getSimpleName(); + private static final boolean DEBUG = false; + + static final PorterDuff.Mode DEFAULT_MODE = PorterDuff.Mode.SRC_IN; + + private static final ColorFilterLruCache COLOR_FILTER_CACHE = new ColorFilterLruCache(6); + + /** + * Drawables which should be tinted with the value of {@code R.attr.colorControlNormal}, + * using the default mode. + */ + private static final int[] TINT_COLOR_CONTROL_NORMAL = { + R.drawable.abc_ic_ab_back_mtrl_am_alpha, + R.drawable.abc_ic_go_search_api_mtrl_alpha, + R.drawable.abc_ic_search_api_mtrl_alpha, + R.drawable.abc_ic_commit_search_api_mtrl_alpha, + R.drawable.abc_ic_clear_mtrl_alpha, + R.drawable.abc_ic_menu_share_mtrl_alpha, + R.drawable.abc_ic_menu_copy_mtrl_am_alpha, + R.drawable.abc_ic_menu_cut_mtrl_alpha, + R.drawable.abc_ic_menu_selectall_mtrl_alpha, + R.drawable.abc_ic_menu_paste_mtrl_am_alpha, + R.drawable.abc_ic_menu_moreoverflow_mtrl_alpha, + R.drawable.abc_ic_voice_search_api_mtrl_alpha, + R.drawable.abc_textfield_search_default_mtrl_alpha, + R.drawable.abc_textfield_default_mtrl_alpha, + R.drawable.abc_ab_share_pack_mtrl_alpha + }; + + /** + * Drawables which should be tinted with the value of {@code R.attr.colorControlActivated}, + * using the default mode. + */ + private static final int[] TINT_COLOR_CONTROL_ACTIVATED = { + R.drawable.abc_textfield_activated_mtrl_alpha, + R.drawable.abc_textfield_search_activated_mtrl_alpha, + R.drawable.abc_cab_background_top_mtrl_alpha, + R.drawable.abc_text_cursor_mtrl_alpha + }; + + /** + * Drawables which should be tinted with the value of {@code android.R.attr.colorBackground}, + * using the {@link android.graphics.PorterDuff.Mode#MULTIPLY} mode. + */ + private static final int[] TINT_COLOR_BACKGROUND_MULTIPLY = { + R.drawable.abc_popup_background_mtrl_mult, + R.drawable.abc_cab_background_internal_bg, + R.drawable.abc_menu_hardkey_panel_mtrl_mult + }; + + /** + * Drawables which should be tinted using a state list containing values of + * {@code R.attr.colorControlNormal} and {@code R.attr.colorControlActivated} + */ + private static final int[] TINT_COLOR_CONTROL_STATE_LIST = { + R.drawable.abc_edit_text_material, + R.drawable.abc_tab_indicator_material, + R.drawable.abc_textfield_search_material, + R.drawable.abc_spinner_mtrl_am_alpha, + R.drawable.abc_btn_check_material, + R.drawable.abc_btn_radio_material, + R.drawable.abc_spinner_textfield_background_material, + R.drawable.abc_ratingbar_full_material, + R.drawable.abc_switch_track_mtrl_alpha, + R.drawable.abc_switch_thumb_material, + R.drawable.abc_btn_default_mtrl_shape, + R.drawable.abc_btn_borderless_material + }; + + /** + * Drawables which contain other drawables which should be tinted. The child drawable IDs + * should be defined in one of the arrays above. + */ + private static final int[] CONTAINERS_WITH_TINT_CHILDREN = { + R.drawable.abc_cab_background_top_material + }; + + private final Context mContext; + private final Resources mResources; + private final TypedValue mTypedValue; + + private final SparseArray mColorStateLists; + private ColorStateList mDefaultColorStateList; + + /** + * A helper method to instantiate a {@link TintManager} and then call {@link #getDrawable(int)}. + * This method should not be used routinely. + */ + public static Drawable getDrawable(Context context, int resId) { + if (isInTintList(resId)) { + final TintManager tm = (context instanceof TintContextWrapper) + ? ((TintContextWrapper) context).getTintManager() + : new TintManager(context); + return tm.getDrawable(resId); + } else { + return ContextCompat.getDrawable(context, resId); + } + } + + public TintManager(Context context) { + mColorStateLists = new SparseArray<>(); + mContext = context; + mTypedValue = new TypedValue(); + mResources = new TintResources(context.getResources(), this); + } + + Resources getResources() { + return mResources; + } + + public Drawable getDrawable(int resId) { + Drawable drawable = ContextCompat.getDrawable(mContext, resId); + + if (drawable != null) { + drawable = drawable.mutate(); + + if (arrayContains(TINT_COLOR_CONTROL_STATE_LIST, resId)) { + ColorStateList colorStateList = getColorStateListForKnownDrawableId(resId); + PorterDuff.Mode tintMode = DEFAULT_MODE; + if (resId == R.drawable.abc_switch_thumb_material) { + tintMode = PorterDuff.Mode.MULTIPLY; + } + + if (colorStateList != null) { + drawable = DrawableCompat.wrap(drawable); + DrawableCompat.setTintList(drawable, colorStateList); + DrawableCompat.setTintMode(drawable, tintMode); + } + } else if (arrayContains(CONTAINERS_WITH_TINT_CHILDREN, resId)) { + drawable = mResources.getDrawable(resId); + } else { + tintDrawable(resId, drawable); + } + } + return drawable; + } + + void tintDrawable(final int resId, final Drawable drawable) { + PorterDuff.Mode tintMode = null; + boolean colorAttrSet = false; + int colorAttr = 0; + int alpha = -1; + + if (arrayContains(TINT_COLOR_CONTROL_NORMAL, resId)) { + colorAttr = R.attr.colorControlNormal; + colorAttrSet = true; + } else if (arrayContains(TINT_COLOR_CONTROL_ACTIVATED, resId)) { + colorAttr = R.attr.colorControlActivated; + colorAttrSet = true; + } else if (arrayContains(TINT_COLOR_BACKGROUND_MULTIPLY, resId)) { + colorAttr = android.R.attr.colorBackground; + colorAttrSet = true; + tintMode = PorterDuff.Mode.MULTIPLY; + } else if (resId == R.drawable.abc_list_divider_mtrl_alpha) { + colorAttr = android.R.attr.colorForeground; + colorAttrSet = true; + alpha = Math.round(0.16f * 255); + } + + if (colorAttrSet) { + if (tintMode == null) { + tintMode = DEFAULT_MODE; + } + final int color = getThemeAttrColor(mContext, colorAttr); + + tintDrawableUsingColorFilter(drawable, color, tintMode); + + if (alpha != -1) { + drawable.setAlpha(alpha); + } + + if (DEBUG) { + Log.d(TAG, "Tinted Drawable ID: " + mResources.getResourceName(resId) + + " with color: #" + Integer.toHexString(color)); + } + } + } + + private static boolean arrayContains(int[] array, int value) { + for (int id : array) { + if (id == value) { + return true; + } + } + return false; + } + + private static boolean isInTintList(int drawableId) { + return arrayContains(TINT_COLOR_BACKGROUND_MULTIPLY, drawableId) || + arrayContains(TINT_COLOR_CONTROL_NORMAL, drawableId) || + arrayContains(TINT_COLOR_CONTROL_ACTIVATED, drawableId) || + arrayContains(TINT_COLOR_CONTROL_STATE_LIST, drawableId) || + arrayContains(CONTAINERS_WITH_TINT_CHILDREN, drawableId); + } + + ColorStateList getColorStateList(int resId) { + return arrayContains(TINT_COLOR_CONTROL_STATE_LIST, resId) + ? getColorStateListForKnownDrawableId(resId) + : null; + } + + private ColorStateList getColorStateListForKnownDrawableId(int resId) { + // Try the cache first + ColorStateList colorStateList = mColorStateLists.get(resId); + + if (colorStateList == null) { + // ...if the cache did not contain a color state list, try and create + if (resId == R.drawable.abc_edit_text_material) { + colorStateList = createEditTextColorStateList(); + } else if (resId == R.drawable.abc_switch_track_mtrl_alpha) { + colorStateList = createSwitchTrackColorStateList(); + } else if (resId == R.drawable.abc_switch_thumb_material) { + colorStateList = createSwitchThumbColorStateList(); + } else if (resId == R.drawable.abc_btn_default_mtrl_shape + || resId == R.drawable.abc_btn_borderless_material) { + colorStateList = createButtonColorStateList(); + } else if (resId == R.drawable.abc_spinner_mtrl_am_alpha + || resId == R.drawable.abc_spinner_textfield_background_material) { + colorStateList = createSpinnerColorStateList(); + } else { + // If we don't have an explicit color state list for this Drawable, use the default + colorStateList = getDefaultColorStateList(); + } + + // ..and add it to the cache + mColorStateLists.append(resId, colorStateList); + } + return colorStateList; + } + + private ColorStateList getDefaultColorStateList() { + if (mDefaultColorStateList == null) { + /** + * Generate the default color state list which uses the colorControl attributes. + * Order is important here. The default enabled state needs to go at the bottom. + */ + + final int colorControlNormal = getThemeAttrColor(mContext, R.attr.colorControlNormal); + final int colorControlActivated = getThemeAttrColor(mContext, + R.attr.colorControlActivated); + + final int[][] states = new int[7][]; + final int[] colors = new int[7]; + int i = 0; + + // Disabled state + states[i] = new int[] { -android.R.attr.state_enabled }; + colors[i] = getDisabledThemeAttrColor(mContext, R.attr.colorControlNormal); + i++; + + states[i] = new int[] { android.R.attr.state_focused }; + colors[i] = colorControlActivated; + i++; + + states[i] = new int[] { android.R.attr.state_activated }; + colors[i] = colorControlActivated; + i++; + + states[i] = new int[] { android.R.attr.state_pressed }; + colors[i] = colorControlActivated; + i++; + + states[i] = new int[] { android.R.attr.state_checked }; + colors[i] = colorControlActivated; + i++; + + states[i] = new int[] { android.R.attr.state_selected }; + colors[i] = colorControlActivated; + i++; + + // Default enabled state + states[i] = new int[0]; + colors[i] = colorControlNormal; + i++; + + mDefaultColorStateList = new ColorStateList(states, colors); + } + return mDefaultColorStateList; + } + + private ColorStateList createSwitchTrackColorStateList() { + final int[][] states = new int[3][]; + final int[] colors = new int[3]; + int i = 0; + + // Disabled state + states[i] = new int[]{-android.R.attr.state_enabled}; + colors[i] = getThemeAttrColor(mContext, android.R.attr.colorForeground, 0.1f); + i++; + + states[i] = new int[]{android.R.attr.state_checked}; + colors[i] = getThemeAttrColor(mContext, R.attr.colorControlActivated, 0.3f); + i++; + + // Default enabled state + states[i] = new int[0]; + colors[i] = getThemeAttrColor(mContext, android.R.attr.colorForeground, 0.3f); + i++; + + return new ColorStateList(states, colors); + } + + private ColorStateList createSwitchThumbColorStateList() { + final int[][] states = new int[3][]; + final int[] colors = new int[3]; + int i = 0; + + final ColorStateList thumbColor = getThemeAttrColorStateList(mContext, + R.attr.colorSwitchThumbNormal); + + if (thumbColor != null && thumbColor.isStateful()) { + // If colorSwitchThumbNormal is a valid ColorStateList, extract the default and + // disabled colors from it + + // Disabled state + states[i] = new int[]{-android.R.attr.state_enabled}; + colors[i] = thumbColor.getColorForState(states[i], 0); + i++; + + states[i] = new int[]{android.R.attr.state_checked}; + colors[i] = getThemeAttrColor(mContext, R.attr.colorControlActivated); + i++; + + // Default enabled state + states[i] = new int[0]; + colors[i] = thumbColor.getDefaultColor(); + i++; + } else { + // Else we'll use an approximation using the default disabled alpha + + // Disabled state + states[i] = new int[]{-android.R.attr.state_enabled}; + colors[i] = getDisabledThemeAttrColor(mContext, R.attr.colorSwitchThumbNormal); + i++; + + states[i] = new int[]{android.R.attr.state_checked}; + colors[i] = getThemeAttrColor(mContext, R.attr.colorControlActivated); + i++; + + // Default enabled state + states[i] = new int[0]; + colors[i] = getThemeAttrColor(mContext, R.attr.colorSwitchThumbNormal); + i++; + } + + return new ColorStateList(states, colors); + } + + private ColorStateList createEditTextColorStateList() { + final int[][] states = new int[3][]; + final int[] colors = new int[3]; + int i = 0; + + // Disabled state + states[i] = new int[]{-android.R.attr.state_enabled}; + colors[i] = getDisabledThemeAttrColor(mContext, R.attr.colorControlNormal); + i++; + + states[i] = new int[]{-android.R.attr.state_pressed, -android.R.attr.state_focused}; + colors[i] = getThemeAttrColor(mContext, R.attr.colorControlNormal); + i++; + + // Default enabled state + states[i] = new int[0]; + colors[i] = getThemeAttrColor(mContext, R.attr.colorControlActivated); + i++; + + return new ColorStateList(states, colors); + } + + private ColorStateList createButtonColorStateList() { + final int[][] states = new int[4][]; + final int[] colors = new int[4]; + int i = 0; + + // Disabled state + states[i] = new int[]{-android.R.attr.state_enabled}; + colors[i] = getDisabledThemeAttrColor(mContext, R.attr.colorButtonNormal); + i++; + + states[i] = new int[]{android.R.attr.state_pressed}; + colors[i] = getThemeAttrColor(mContext, R.attr.colorControlHighlight); + i++; + + states[i] = new int[]{android.R.attr.state_focused}; + colors[i] = getThemeAttrColor(mContext, R.attr.colorControlHighlight); + i++; + + // Default enabled state + states[i] = new int[0]; + colors[i] = getThemeAttrColor(mContext, R.attr.colorButtonNormal); + i++; + + return new ColorStateList(states, colors); + } + + private ColorStateList createSpinnerColorStateList() { + final int[][] states = new int[3][]; + final int[] colors = new int[3]; + int i = 0; + + // Disabled state + states[i] = new int[]{-android.R.attr.state_enabled}; + colors[i] = getDisabledThemeAttrColor(mContext, R.attr.colorControlNormal); + i++; + + states[i] = new int[]{-android.R.attr.state_pressed, -android.R.attr.state_focused}; + colors[i] = getThemeAttrColor(mContext, R.attr.colorControlNormal); + i++; + + states[i] = new int[0]; + colors[i] = getThemeAttrColor(mContext, R.attr.colorControlActivated); + i++; + + return new ColorStateList(states, colors); + } + + private static class ColorFilterLruCache extends LruCache { + + public ColorFilterLruCache(int maxSize) { + super(maxSize); + } + + PorterDuffColorFilter get(int color, PorterDuff.Mode mode) { + return get(generateCacheKey(color, mode)); + } + + PorterDuffColorFilter put(int color, PorterDuff.Mode mode, PorterDuffColorFilter filter) { + return put(generateCacheKey(color, mode), filter); + } + + private static int generateCacheKey(int color, PorterDuff.Mode mode) { + int hashCode = 1; + hashCode = 31 * hashCode + color; + hashCode = 31 * hashCode + mode.hashCode(); + return hashCode; + } + } + + public static void tintViewBackground(View view, TintInfo tint) { + final Drawable background = view.getBackground(); + if (tint.mTintList != null) { + tintDrawableUsingColorFilter( + background, + tint.mTintList.getColorForState(view.getDrawableState(), + tint.mTintList.getDefaultColor()), + tint.mTintMode != null ? tint.mTintMode : DEFAULT_MODE); + } else { + background.clearColorFilter(); + } + } + + private static void tintDrawableUsingColorFilter(Drawable drawable, int color, + PorterDuff.Mode mode) { + // First, lets see if the cache already contains the color filter + PorterDuffColorFilter filter = COLOR_FILTER_CACHE.get(color, mode); + + if (filter == null) { + // Cache miss, so create a color filter and add it to the cache + filter = new PorterDuffColorFilter(color, mode); + COLOR_FILTER_CACHE.put(color, mode, filter); + } + + drawable.setColorFilter(filter); + } +} diff --git a/android/support/v7/internal/widget/TintMultiAutoCompleteTextView.java b/android/support/v7/internal/widget/TintMultiAutoCompleteTextView.java new file mode 100644 index 0000000000..336243c170 --- /dev/null +++ b/android/support/v7/internal/widget/TintMultiAutoCompleteTextView.java @@ -0,0 +1,147 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.content.res.ColorStateList; +import android.graphics.PorterDuff; +import android.support.annotation.Nullable; +import android.support.v4.view.TintableBackgroundView; +import android.util.AttributeSet; +import android.widget.MultiAutoCompleteTextView; + +/** + * An tint aware {@link android.widget.MultiAutoCompleteTextView}. + *

      + * This will automatically be used when you use {@link android.widget.MultiAutoCompleteTextView} + * in your layouts. You should only need to manually use this class when writing custom views. + */ +public class TintMultiAutoCompleteTextView extends MultiAutoCompleteTextView + implements TintableBackgroundView { + + private static final int[] TINT_ATTRS = { + android.R.attr.background, + android.R.attr.popupBackground + }; + + private TintManager mTintManager; + private TintInfo mBackgroundTint; + + public TintMultiAutoCompleteTextView(Context context) { + this(context, null); + } + + public TintMultiAutoCompleteTextView(Context context, AttributeSet attrs) { + this(context, attrs, android.R.attr.autoCompleteTextViewStyle); + } + + public TintMultiAutoCompleteTextView(Context context, AttributeSet attrs, int defStyleAttr) { + super(TintContextWrapper.wrap(context), attrs, defStyleAttr); + + if (TintManager.SHOULD_BE_USED) { + TintTypedArray a = TintTypedArray.obtainStyledAttributes(getContext(), attrs, + TINT_ATTRS, defStyleAttr, 0); + mTintManager = a.getTintManager(); + + if (a.hasValue(0)) { + setSupportBackgroundTintList( + mTintManager.getColorStateList(a.getResourceId(0, -1))); + } + if (a.hasValue(1)) { + setDropDownBackgroundDrawable(a.getDrawable(1)); + } + a.recycle(); + } + } + + @Override + public void setDropDownBackgroundResource(int id) { + if (mTintManager != null) { + setDropDownBackgroundDrawable(mTintManager.getDrawable(id)); + } else { + super.setDropDownBackgroundResource(id); + } + } + + /** + * This should be accessed via + * {@link android.support.v4.view.ViewCompat#setBackgroundTintList(android.view.View, + * android.content.res.ColorStateList)} + * + * @hide + */ + @Override + public void setSupportBackgroundTintList(@Nullable ColorStateList tint) { + if (mBackgroundTint == null) { + mBackgroundTint = new TintInfo(); + } + mBackgroundTint.mTintList = tint; + applySupportBackgroundTint(); + } + + /** + * This should be accessed via + * {@link android.support.v4.view.ViewCompat#getBackgroundTintList(android.view.View)} + * + * @hide + */ + @Override + @Nullable + public ColorStateList getSupportBackgroundTintList() { + return mBackgroundTint != null ? mBackgroundTint.mTintList : null; + } + + /** + * This should be accessed via + * {@link android.support.v4.view.ViewCompat#setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode)} + * + * @hide + */ + @Override + public void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) { + if (mBackgroundTint == null) { + mBackgroundTint = new TintInfo(); + } + mBackgroundTint.mTintMode = tintMode; + applySupportBackgroundTint(); + } + + /** + * This should be accessed via + * {@link android.support.v4.view.ViewCompat#getBackgroundTintMode(android.view.View)} + * + * @hide + */ + @Override + @Nullable + public PorterDuff.Mode getSupportBackgroundTintMode() { + return mBackgroundTint != null ? mBackgroundTint.mTintMode : null; + } + + @Override + protected void drawableStateChanged() { + super.drawableStateChanged(); + applySupportBackgroundTint(); + } + + private void applySupportBackgroundTint() { + if (getBackground() != null && mBackgroundTint != null) { + TintManager.tintViewBackground(this, mBackgroundTint); + } + } + +} diff --git a/android/support/v7/internal/widget/TintRadioButton.java b/android/support/v7/internal/widget/TintRadioButton.java new file mode 100644 index 0000000000..f5e537cf99 --- /dev/null +++ b/android/support/v7/internal/widget/TintRadioButton.java @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.RadioButton; + +/** + * An tint aware {@link android.widget.RadioButton}. + *

      + * This will automatically be used when you use {@link android.widget.RadioButton} in your + * layouts. You should only need to manually use this class when writing custom views. + */ +public class TintRadioButton extends RadioButton { + + private static final int[] TINT_ATTRS = { + android.R.attr.button + }; + + private TintManager mTintManager; + + public TintRadioButton(Context context) { + this(context, null); + } + + public TintRadioButton(Context context, AttributeSet attrs) { + this(context, attrs, android.R.attr.radioButtonStyle); + } + + public TintRadioButton(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + if (TintManager.SHOULD_BE_USED) { + TintTypedArray a = TintTypedArray.obtainStyledAttributes(getContext(), attrs, + TINT_ATTRS, defStyleAttr, 0); + setButtonDrawable(a.getDrawable(0)); + a.recycle(); + + mTintManager = a.getTintManager(); + } + } + + @Override + public void setButtonDrawable(int resid) { + if (mTintManager != null) { + setButtonDrawable(mTintManager.getDrawable(resid)); + } else { + super.setButtonDrawable(resid); + } + } +} diff --git a/android/support/v7/internal/widget/TintRatingBar.java b/android/support/v7/internal/widget/TintRatingBar.java new file mode 100644 index 0000000000..da0b965943 --- /dev/null +++ b/android/support/v7/internal/widget/TintRatingBar.java @@ -0,0 +1,166 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapShader; +import android.graphics.Shader; +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.support.v4.graphics.drawable.DrawableWrapper; +import android.support.v4.view.ViewCompat; +import android.util.AttributeSet; +import android.view.Gravity; +import android.widget.RatingBar; + +/** + * An tint aware {@link android.widget.RatingBar}. + *

      + * This will automatically be used when you use {@link android.widget.RatingBar} in your + * layouts. You should only need to manually use this class when writing custom views. + */ +public class TintRatingBar extends RatingBar { + + private static final int[] TINT_ATTRS = { + android.R.attr.indeterminateDrawable, + android.R.attr.progressDrawable + }; + + private Bitmap mSampleTile; + + public TintRatingBar(Context context) { + this(context, null); + } + + public TintRatingBar(Context context, AttributeSet attrs) { + this(context, attrs, android.R.attr.ratingBarStyle); + } + + public TintRatingBar(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + if (TintManager.SHOULD_BE_USED) { + TintTypedArray a = TintTypedArray.obtainStyledAttributes(getContext(), attrs, + TINT_ATTRS, defStyleAttr, 0); + + Drawable drawable = a.getDrawable(0); + if (drawable != null) { + setIndeterminateDrawable(tileifyIndeterminate(drawable)); + } + + drawable = a.getDrawable(1); + if (drawable != null) { + setProgressDrawable(tileify(drawable, false)); + } + + a.recycle(); + } + } + + /** + * 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 DrawableWrapper) { + Drawable inner = ((DrawableWrapper) drawable).getWrappedDrawable(); + if (inner != null) { + inner = tileify(inner, clip); + ((DrawableWrapper) drawable).setWrappedDrawable(inner); + } + } else 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 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; + } + + /** + * 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; + } + + private Shape getDrawableShape() { + final float[] roundedCorners = new float[] { 5, 5, 5, 5, 5, 5, 5, 5 }; + return new RoundRectShape(roundedCorners, null, null); + } + + @Override + protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + + if (mSampleTile != null) { + final int width = mSampleTile.getWidth() * getNumStars(); + setMeasuredDimension(ViewCompat.resolveSizeAndState(width, widthMeasureSpec, 0), + getMeasuredHeight()); + } + } + +} diff --git a/android/support/v7/internal/widget/TintResources.java b/android/support/v7/internal/widget/TintResources.java new file mode 100644 index 0000000000..3dfbbc1d5d --- /dev/null +++ b/android/support/v7/internal/widget/TintResources.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.res.Resources; +import android.graphics.drawable.Drawable; +import android.support.v7.appcompat.R; + +/** + * This class allows us to intercept calls so that we can tint resources (if applicable). + * + * @hide + */ +class TintResources extends ResourcesWrapper { + + private final TintManager mTintManager; + + public TintResources(Resources resources, TintManager tintManager) { + super(resources); + mTintManager = tintManager; + } + + /** + * We intercept this call so that we tint the result (if applicable). This is needed for things + * like {@link DrawableContainer}s which retrieve their children via this method. + */ + @Override + public Drawable getDrawable(int id) throws NotFoundException { + Drawable d = super.getDrawable(id); + if (d != null) { + mTintManager.tintDrawable(id, d); + } + return d; + } +} diff --git a/android/support/v7/internal/widget/TintSpinner.java b/android/support/v7/internal/widget/TintSpinner.java new file mode 100644 index 0000000000..a1b99bc26d --- /dev/null +++ b/android/support/v7/internal/widget/TintSpinner.java @@ -0,0 +1,163 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.annotation.TargetApi; +import android.content.Context; +import android.content.res.ColorStateList; +import android.graphics.PorterDuff; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.support.annotation.Nullable; +import android.support.v4.view.TintableBackgroundView; +import android.util.AttributeSet; +import android.widget.ListPopupWindow; +import android.widget.Spinner; + +import java.lang.reflect.Field; + +/** + * An tint aware {@link android.widget.Spinner}. + *

      + * This will automatically be used when you use {@link android.widget.Spinner} in your + * layouts. You should only need to manually use this class when writing custom views. + */ +public class TintSpinner extends Spinner implements TintableBackgroundView { + + private static final int[] TINT_ATTRS = { + android.R.attr.background, + android.R.attr.popupBackground + }; + + private TintInfo mBackgroundTint; + + public TintSpinner(Context context) { + this(context, null); + } + + public TintSpinner(Context context, AttributeSet attrs) { + this(context, attrs, android.R.attr.spinnerStyle); + } + + public TintSpinner(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + if (TintManager.SHOULD_BE_USED) { + TintTypedArray a = TintTypedArray.obtainStyledAttributes(getContext(), attrs, + TINT_ATTRS, defStyleAttr, 0); + if (a.hasValue(0)) { + setSupportBackgroundTintList( + a.getTintManager().getColorStateList(a.getResourceId(0, -1))); + } + if (a.hasValue(1)) { + final Drawable popupBackground = a.getDrawable(1); + if (Build.VERSION.SDK_INT >= 16) { + setPopupBackgroundDrawable(popupBackground); + } else if (Build.VERSION.SDK_INT >= 11) { + setPopupBackgroundDrawableV11(this, popupBackground); + } + } + a.recycle(); + } + } + + @TargetApi(Build.VERSION_CODES.HONEYCOMB) + private static void setPopupBackgroundDrawableV11(Spinner view, Drawable background) { + try { + Field popupField = Spinner.class.getDeclaredField("mPopup"); + popupField.setAccessible(true); + + Object popup = popupField.get(view); + + if (popup instanceof ListPopupWindow) { + ((ListPopupWindow) popup).setBackgroundDrawable(background); + } + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + + /** + * This should be accessed via + * {@link android.support.v4.view.ViewCompat#setBackgroundTintList(android.view.View, + * android.content.res.ColorStateList)} + * + * @hide + */ + @Override + public void setSupportBackgroundTintList(@Nullable ColorStateList tint) { + if (mBackgroundTint == null && tint != null) { + mBackgroundTint = new TintInfo(); + } + mBackgroundTint.mTintList = tint; + applySupportBackgroundTint(); + } + + /** + * This should be accessed via + * {@link android.support.v4.view.ViewCompat#getBackgroundTintList(android.view.View)} + * + * @hide + */ + @Override + @Nullable + public ColorStateList getSupportBackgroundTintList() { + return mBackgroundTint != null ? mBackgroundTint.mTintList : null; + } + + /** + * This should be accessed via + * {@link android.support.v4.view.ViewCompat#setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode)} + * + * @hide + */ + @Override + public void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) { + if (mBackgroundTint == null) { + mBackgroundTint = new TintInfo(); + } + mBackgroundTint.mTintMode = tintMode; + applySupportBackgroundTint(); + } + + /** + * This should be accessed via + * {@link android.support.v4.view.ViewCompat#getBackgroundTintMode(android.view.View)} + * + * @hide + */ + @Override + @Nullable + public PorterDuff.Mode getSupportBackgroundTintMode() { + return mBackgroundTint != null ? mBackgroundTint.mTintMode : null; + } + + @Override + protected void drawableStateChanged() { + super.drawableStateChanged(); + applySupportBackgroundTint(); + } + + private void applySupportBackgroundTint() { + if (getBackground() != null && mBackgroundTint != null) { + TintManager.tintViewBackground(this, mBackgroundTint); + } + } + +} diff --git a/android/support/v7/internal/widget/TintTypedArray.java b/android/support/v7/internal/widget/TintTypedArray.java new file mode 100644 index 0000000000..221e2a12fa --- /dev/null +++ b/android/support/v7/internal/widget/TintTypedArray.java @@ -0,0 +1,189 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.content.res.ColorStateList; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.util.TypedValue; + +/** + * A class that wraps a {@link android.content.res.TypedArray} and provides the same public API + * surface. The purpose of this class is so that we can intercept the {@link #getDrawable(int)} + * call and tint the result. + * + * @hide + */ +public class TintTypedArray { + + private final Context mContext; + private final TypedArray mWrapped; + + private TintManager mTintManager; + + public static TintTypedArray obtainStyledAttributes(Context context, AttributeSet set, + int[] attrs) { + TypedArray array = context.obtainStyledAttributes(set, attrs); + return new TintTypedArray(context, array); + } + + public static TintTypedArray obtainStyledAttributes(Context context, AttributeSet set, + int[] attrs, int defStyleAttr, int defStyleRes) { + TypedArray array = context.obtainStyledAttributes(set, attrs, defStyleAttr, defStyleRes); + return new TintTypedArray(context, array); + } + + private TintTypedArray(Context context, TypedArray array) { + mContext = context; + mWrapped = array; + } + + public Drawable getDrawable(int index) { + if (mWrapped.hasValue(index)) { + final int resourceId = mWrapped.getResourceId(index, 0); + if (resourceId != 0) { + return getTintManager().getDrawable(resourceId); + } + } + return mWrapped.getDrawable(index); + } + + public int length() { + return mWrapped.length(); + } + + public int getIndexCount() { + return mWrapped.getIndexCount(); + } + + public int getIndex(int at) { + return mWrapped.getIndex(at); + } + + public Resources getResources() { + return mWrapped.getResources(); + } + + public CharSequence getText(int index) { + return mWrapped.getText(index); + } + + public String getString(int index) { + return mWrapped.getString(index); + } + + public String getNonResourceString(int index) { + return mWrapped.getNonResourceString(index); + } + + public boolean getBoolean(int index, boolean defValue) { + return mWrapped.getBoolean(index, defValue); + } + + public int getInt(int index, int defValue) { + return mWrapped.getInt(index, defValue); + } + + public float getFloat(int index, float defValue) { + return mWrapped.getFloat(index, defValue); + } + + public int getColor(int index, int defValue) { + return mWrapped.getColor(index, defValue); + } + + public ColorStateList getColorStateList(int index) { + return mWrapped.getColorStateList(index); + } + + public int getInteger(int index, int defValue) { + return mWrapped.getInteger(index, defValue); + } + + public float getDimension(int index, float defValue) { + return mWrapped.getDimension(index, defValue); + } + + public int getDimensionPixelOffset(int index, int defValue) { + return mWrapped.getDimensionPixelOffset(index, defValue); + } + + public int getDimensionPixelSize(int index, int defValue) { + return mWrapped.getDimensionPixelSize(index, defValue); + } + + public int getLayoutDimension(int index, String name) { + return mWrapped.getLayoutDimension(index, name); + } + + public int getLayoutDimension(int index, int defValue) { + return mWrapped.getLayoutDimension(index, defValue); + } + + public float getFraction(int index, int base, int pbase, float defValue) { + return mWrapped.getFraction(index, base, pbase, defValue); + } + + public int getResourceId(int index, int defValue) { + return mWrapped.getResourceId(index, defValue); + } + + public CharSequence[] getTextArray(int index) { + return mWrapped.getTextArray(index); + } + + public boolean getValue(int index, TypedValue outValue) { + return mWrapped.getValue(index, outValue); + } + + public int getType(int index) { + return mWrapped.getType(index); + } + + public boolean hasValue(int index) { + return mWrapped.hasValue(index); + } + + public TypedValue peekValue(int index) { + return mWrapped.peekValue(index); + } + + public String getPositionDescription() { + return mWrapped.getPositionDescription(); + } + + public void recycle() { + mWrapped.recycle(); + } + + public int getChangingConfigurations() { + return mWrapped.getChangingConfigurations(); + } + + public TintManager getTintManager() { + if (mTintManager == null) { + mTintManager = (mContext instanceof TintContextWrapper) + ? ((TintContextWrapper) mContext).getTintManager() + : new TintManager(mContext); + } + return mTintManager; + } + +} diff --git a/android/support/v7/internal/widget/ToolbarWidgetWrapper.java b/android/support/v7/internal/widget/ToolbarWidgetWrapper.java new file mode 100644 index 0000000000..b466010c84 --- /dev/null +++ b/android/support/v7/internal/widget/ToolbarWidgetWrapper.java @@ -0,0 +1,716 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package android.support.v7.internal.widget; + +import android.app.ActionBar; +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.os.Parcelable; +import android.support.v4.view.ViewCompat; +import android.support.v4.view.ViewPropertyAnimatorListenerAdapter; +import android.support.v7.appcompat.R; +import android.support.v7.internal.view.menu.ActionMenuItem; +import android.support.v7.internal.view.menu.MenuBuilder; +import android.support.v7.internal.view.menu.MenuPresenter; +import android.support.v7.widget.ActionMenuPresenter; +import android.support.v7.widget.Toolbar; +import android.text.TextUtils; +import android.util.Log; +import android.util.SparseArray; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.widget.SpinnerAdapter; + +/** + * Internal class used to interact with the Toolbar widget without + * exposing interface methods to the public API. + * + *

      ToolbarWidgetWrapper manages the differences between Toolbar and ActionBarView + * so that either variant acting as a + * {@link android.support.v7.internal.app.WindowDecorActionBar WindowDecorActionBar} can behave + * in the same way.

      + * + * @hide + */ +public class ToolbarWidgetWrapper implements DecorToolbar { + private static final String TAG = "ToolbarWidgetWrapper"; + + private static final int AFFECTS_LOGO_MASK = + ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_USE_LOGO; + + private Toolbar mToolbar; + + private int mDisplayOpts; + private View mTabView; + private SpinnerCompat mSpinner; + private View mCustomView; + + private Drawable mIcon; + private Drawable mLogo; + private Drawable mNavIcon; + + private boolean mTitleSet; + private CharSequence mTitle; + private CharSequence mSubtitle; + private CharSequence mHomeDescription; + + private Window.Callback mWindowCallback; + private boolean mMenuPrepared; + private ActionMenuPresenter mActionMenuPresenter; + + private int mNavigationMode = ActionBar.NAVIGATION_MODE_STANDARD; + + private final TintManager mTintManager; + private int mDefaultNavigationContentDescription = 0; + private Drawable mDefaultNavigationIcon; + + public ToolbarWidgetWrapper(Toolbar toolbar, boolean style) { + this(toolbar, style, R.string.abc_action_bar_up_description, + R.drawable.abc_ic_ab_back_mtrl_am_alpha); + } + + public ToolbarWidgetWrapper(Toolbar toolbar, boolean style, + int defaultNavigationContentDescription, int defaultNavigationIcon) { + mToolbar = toolbar; + mTitle = toolbar.getTitle(); + mSubtitle = toolbar.getSubtitle(); + mTitleSet = mTitle != null; + mNavIcon = toolbar.getNavigationIcon(); + + if (style) { + final TintTypedArray a = TintTypedArray.obtainStyledAttributes(toolbar.getContext(), + null, R.styleable.ActionBar, R.attr.actionBarStyle, 0); + + final CharSequence title = a.getText(R.styleable.ActionBar_title); + if (!TextUtils.isEmpty(title)) { + setTitle(title); + } + + final CharSequence subtitle = a.getText(R.styleable.ActionBar_subtitle); + if (!TextUtils.isEmpty(subtitle)) { + setSubtitle(subtitle); + } + + final Drawable logo = a.getDrawable(R.styleable.ActionBar_logo); + if (logo != null) { + setLogo(logo); + } + + final Drawable icon = a.getDrawable(R.styleable.ActionBar_icon); + if (mNavIcon == null && icon != null) { + setIcon(icon); + } + + final Drawable navIcon = a.getDrawable(R.styleable.ActionBar_homeAsUpIndicator); + if (navIcon != null) { + setNavigationIcon(navIcon); + } + + setDisplayOptions(a.getInt(R.styleable.ActionBar_displayOptions, 0)); + + final int customNavId = a.getResourceId( + R.styleable.ActionBar_customNavigationLayout, 0); + if (customNavId != 0) { + setCustomView(LayoutInflater.from(mToolbar.getContext()).inflate(customNavId, + mToolbar, false)); + setDisplayOptions(mDisplayOpts | ActionBar.DISPLAY_SHOW_CUSTOM); + } + + final int height = a.getLayoutDimension(R.styleable.ActionBar_height, 0); + if (height > 0) { + final ViewGroup.LayoutParams lp = mToolbar.getLayoutParams(); + lp.height = height; + mToolbar.setLayoutParams(lp); + } + + final int contentInsetStart = a.getDimensionPixelOffset( + R.styleable.ActionBar_contentInsetStart, -1); + final int contentInsetEnd = a.getDimensionPixelOffset( + R.styleable.ActionBar_contentInsetEnd, -1); + if (contentInsetStart >= 0 || contentInsetEnd >= 0) { + mToolbar.setContentInsetsRelative(Math.max(contentInsetStart, 0), + Math.max(contentInsetEnd, 0)); + } + + final int titleTextStyle = a.getResourceId(R.styleable.ActionBar_titleTextStyle, 0); + if (titleTextStyle != 0) { + mToolbar.setTitleTextAppearance(mToolbar.getContext(), titleTextStyle); + } + + final int subtitleTextStyle = a.getResourceId( + R.styleable.ActionBar_subtitleTextStyle, 0); + if (subtitleTextStyle != 0) { + mToolbar.setSubtitleTextAppearance(mToolbar.getContext(), subtitleTextStyle); + } + + final int popupTheme = a.getResourceId(R.styleable.ActionBar_popupTheme, 0); + if (popupTheme != 0) { + mToolbar.setPopupTheme(popupTheme); + } + + a.recycle(); + // Keep the TintManager in case we need it later + mTintManager = a.getTintManager(); + } else { + mDisplayOpts = detectDisplayOptions(); + // Create a TintManager in case we need it later + mTintManager = new TintManager(toolbar.getContext()); + } + + setDefaultNavigationContentDescription(defaultNavigationContentDescription); + mHomeDescription = mToolbar.getNavigationContentDescription(); + + setDefaultNavigationIcon(mTintManager.getDrawable(defaultNavigationIcon)); + + mToolbar.setNavigationOnClickListener(new View.OnClickListener() { + final ActionMenuItem mNavItem = new ActionMenuItem(mToolbar.getContext(), + 0, android.R.id.home, 0, 0, mTitle); + @Override + public void onClick(View v) { + if (mWindowCallback != null && mMenuPrepared) { + mWindowCallback.onMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, mNavItem); + } + } + }); + } + + /** + * Sets the default content description for the navigation button. + *

      + * It changes the current content description if and only if the provided resource id is + * different than the current default resource id and the current content description is empty. + * + * @param defaultNavigationContentDescription The resource id for the default content + * description + */ + @Override + public void setDefaultNavigationContentDescription(int defaultNavigationContentDescription) { + if (defaultNavigationContentDescription == mDefaultNavigationContentDescription) { + return; + } + mDefaultNavigationContentDescription = defaultNavigationContentDescription; + if (TextUtils.isEmpty(mToolbar.getNavigationContentDescription())) { + setNavigationContentDescription(mDefaultNavigationContentDescription); + } + } + + @Override + public void setDefaultNavigationIcon(Drawable defaultNavigationIcon) { + if (mDefaultNavigationIcon != defaultNavigationIcon) { + mDefaultNavigationIcon = defaultNavigationIcon; + updateNavigationIcon(); + } + } + + private int detectDisplayOptions() { + int opts = ActionBar.DISPLAY_SHOW_TITLE | ActionBar.DISPLAY_SHOW_HOME | + ActionBar.DISPLAY_USE_LOGO; + if (mToolbar.getNavigationIcon() != null) { + opts |= ActionBar.DISPLAY_HOME_AS_UP; + } + return opts; + } + + @Override + public ViewGroup getViewGroup() { + return mToolbar; + } + + @Override + public Context getContext() { + return mToolbar.getContext(); + } + + @Override + public boolean isSplit() { + return false; + } + + @Override + public boolean hasExpandedActionView() { + return mToolbar.hasExpandedActionView(); + } + + @Override + public void collapseActionView() { + mToolbar.collapseActionView(); + } + + @Override + public void setWindowCallback(Window.Callback cb) { + mWindowCallback = cb; + } + + @Override + public void setWindowTitle(CharSequence title) { + // "Real" title always trumps window title. + if (!mTitleSet) { + setTitleInt(title); + } + } + + @Override + public CharSequence getTitle() { + return mToolbar.getTitle(); + } + + @Override + public void setTitle(CharSequence title) { + mTitleSet = true; + setTitleInt(title); + } + + private void setTitleInt(CharSequence title) { + mTitle = title; + if ((mDisplayOpts & ActionBar.DISPLAY_SHOW_TITLE) != 0) { + mToolbar.setTitle(title); + } + } + + @Override + public CharSequence getSubtitle() { + return mToolbar.getSubtitle(); + } + + @Override + public void setSubtitle(CharSequence subtitle) { + mSubtitle = subtitle; + if ((mDisplayOpts & ActionBar.DISPLAY_SHOW_TITLE) != 0) { + mToolbar.setSubtitle(subtitle); + } + } + + @Override + public void initProgress() { + Log.i(TAG, "Progress display unsupported"); + } + + @Override + public void initIndeterminateProgress() { + Log.i(TAG, "Progress display unsupported"); + } + + @Override + public boolean canSplit() { + return false; + } + + @Override + public void setSplitView(ViewGroup splitView) { + } + + @Override + public void setSplitToolbar(boolean split) { + if (split) { + throw new UnsupportedOperationException("Cannot split an android.widget.Toolbar"); + } + } + + @Override + public void setSplitWhenNarrow(boolean splitWhenNarrow) { + // Ignore. + } + + @Override + public boolean hasIcon() { + return mIcon != null; + } + + @Override + public boolean hasLogo() { + return mLogo != null; + } + + @Override + public void setIcon(int resId) { + setIcon(resId != 0 ? mTintManager.getDrawable(resId) : null); + } + + @Override + public void setIcon(Drawable d) { + mIcon = d; + updateToolbarLogo(); + } + + @Override + public void setLogo(int resId) { + setLogo(resId != 0 ? mTintManager.getDrawable(resId) : null); + } + + @Override + public void setLogo(Drawable d) { + mLogo = d; + updateToolbarLogo(); + } + + private void updateToolbarLogo() { + Drawable logo = null; + if ((mDisplayOpts & ActionBar.DISPLAY_SHOW_HOME) != 0) { + if ((mDisplayOpts & ActionBar.DISPLAY_USE_LOGO) != 0) { + logo = mLogo != null ? mLogo : mIcon; + } else { + logo = mIcon; + } + } + mToolbar.setLogo(logo); + } + + @Override + public boolean canShowOverflowMenu() { + return mToolbar.canShowOverflowMenu(); + } + + @Override + public boolean isOverflowMenuShowing() { + return mToolbar.isOverflowMenuShowing(); + } + + @Override + public boolean isOverflowMenuShowPending() { + return mToolbar.isOverflowMenuShowPending(); + } + + @Override + public boolean showOverflowMenu() { + return mToolbar.showOverflowMenu(); + } + + @Override + public boolean hideOverflowMenu() { + return mToolbar.hideOverflowMenu(); + } + + @Override + public void setMenuPrepared() { + mMenuPrepared = true; + } + + @Override + public void setMenu(Menu menu, MenuPresenter.Callback cb) { + if (mActionMenuPresenter == null) { + mActionMenuPresenter = new ActionMenuPresenter(mToolbar.getContext()); + mActionMenuPresenter.setId(R.id.action_menu_presenter); + } + mActionMenuPresenter.setCallback(cb); + mToolbar.setMenu((MenuBuilder) menu, mActionMenuPresenter); + } + + @Override + public void dismissPopupMenus() { + mToolbar.dismissPopupMenus(); + } + + @Override + public int getDisplayOptions() { + return mDisplayOpts; + } + + @Override + public void setDisplayOptions(int newOpts) { + final int oldOpts = mDisplayOpts; + final int changed = oldOpts ^ newOpts; + mDisplayOpts = newOpts; + if (changed != 0) { + if ((changed & ActionBar.DISPLAY_HOME_AS_UP) != 0) { + if ((newOpts & ActionBar.DISPLAY_HOME_AS_UP) != 0) { + updateNavigationIcon(); + updateHomeAccessibility(); + } else { + mToolbar.setNavigationIcon(null); + } + } + + if ((changed & AFFECTS_LOGO_MASK) != 0) { + updateToolbarLogo(); + } + + if ((changed & ActionBar.DISPLAY_SHOW_TITLE) != 0) { + if ((newOpts & ActionBar.DISPLAY_SHOW_TITLE) != 0) { + mToolbar.setTitle(mTitle); + mToolbar.setSubtitle(mSubtitle); + } else { + mToolbar.setTitle(null); + mToolbar.setSubtitle(null); + } + } + + if ((changed & ActionBar.DISPLAY_SHOW_CUSTOM) != 0 && mCustomView != null) { + if ((newOpts & ActionBar.DISPLAY_SHOW_CUSTOM) != 0) { + mToolbar.addView(mCustomView); + } else { + mToolbar.removeView(mCustomView); + } + } + } + } + + @Override + public void setEmbeddedTabView(ScrollingTabContainerView tabView) { + if (mTabView != null && mTabView.getParent() == mToolbar) { + mToolbar.removeView(mTabView); + } + mTabView = tabView; + if (tabView != null && mNavigationMode == ActionBar.NAVIGATION_MODE_TABS) { + mToolbar.addView(mTabView, 0); + Toolbar.LayoutParams lp = (Toolbar.LayoutParams) mTabView.getLayoutParams(); + lp.width = ViewGroup.LayoutParams.WRAP_CONTENT; + lp.height = ViewGroup.LayoutParams.WRAP_CONTENT; + lp.gravity = Gravity.START | Gravity.BOTTOM; + tabView.setAllowCollapse(true); + } + } + + @Override + public boolean hasEmbeddedTabs() { + return mTabView != null; + } + + @Override + public boolean isTitleTruncated() { + return mToolbar.isTitleTruncated(); + } + + @Override + public void setCollapsible(boolean collapsible) { + mToolbar.setCollapsible(collapsible); + } + + @Override + public void setHomeButtonEnabled(boolean enable) { + // Ignore + } + + @Override + public int getNavigationMode() { + return mNavigationMode; + } + + @Override + public void setNavigationMode(int mode) { + final int oldMode = mNavigationMode; + if (mode != oldMode) { + switch (oldMode) { + case ActionBar.NAVIGATION_MODE_LIST: + if (mSpinner != null && mSpinner.getParent() == mToolbar) { + mToolbar.removeView(mSpinner); + } + break; + case ActionBar.NAVIGATION_MODE_TABS: + if (mTabView != null && mTabView.getParent() == mToolbar) { + mToolbar.removeView(mTabView); + } + break; + } + + mNavigationMode = mode; + + switch (mode) { + case ActionBar.NAVIGATION_MODE_STANDARD: + break; + case ActionBar.NAVIGATION_MODE_LIST: + ensureSpinner(); + mToolbar.addView(mSpinner, 0); + break; + case ActionBar.NAVIGATION_MODE_TABS: + if (mTabView != null) { + mToolbar.addView(mTabView, 0); + Toolbar.LayoutParams lp = (Toolbar.LayoutParams) mTabView.getLayoutParams(); + lp.width = ViewGroup.LayoutParams.WRAP_CONTENT; + lp.height = ViewGroup.LayoutParams.WRAP_CONTENT; + lp.gravity = Gravity.START | Gravity.BOTTOM; + } + break; + default: + throw new IllegalArgumentException("Invalid navigation mode " + mode); + } + } + } + + private void ensureSpinner() { + if (mSpinner == null) { + mSpinner = new SpinnerCompat(getContext(), null, R.attr.actionDropDownStyle); + Toolbar.LayoutParams lp = new Toolbar.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.START | Gravity.CENTER_VERTICAL); + mSpinner.setLayoutParams(lp); + } + } + + @Override + public void setDropdownParams(SpinnerAdapter adapter, + AdapterViewCompat.OnItemSelectedListener listener) { + ensureSpinner(); + mSpinner.setAdapter(adapter); + mSpinner.setOnItemSelectedListener(listener); + } + + @Override + public void setDropdownSelectedPosition(int position) { + if (mSpinner == null) { + throw new IllegalStateException( + "Can't set dropdown selected position without an adapter"); + } + mSpinner.setSelection(position); + } + + @Override + public int getDropdownSelectedPosition() { + return mSpinner != null ? mSpinner.getSelectedItemPosition() : 0; + } + + @Override + public int getDropdownItemCount() { + return mSpinner != null ? mSpinner.getCount() : 0; + } + + @Override + public void setCustomView(View view) { + if (mCustomView != null && (mDisplayOpts & ActionBar.DISPLAY_SHOW_CUSTOM) != 0) { + mToolbar.removeView(mCustomView); + } + mCustomView = view; + if (view != null && (mDisplayOpts & ActionBar.DISPLAY_SHOW_CUSTOM) != 0) { + mToolbar.addView(mCustomView); + } + } + + @Override + public View getCustomView() { + return mCustomView; + } + + @Override + public void animateToVisibility(int visibility) { + if (visibility == View.GONE) { + ViewCompat.animate(mToolbar).alpha(0) + .setListener(new ViewPropertyAnimatorListenerAdapter() { + private boolean mCanceled = false; + @Override + public void onAnimationEnd(View view) { + if (!mCanceled) { + mToolbar.setVisibility(View.GONE); + } + } + + @Override + public void onAnimationCancel(View view) { + mCanceled = true; + } + }); + } else if (visibility == View.VISIBLE) { + ViewCompat.animate(mToolbar).alpha(1) + .setListener(new ViewPropertyAnimatorListenerAdapter() { + @Override + public void onAnimationStart(View view) { + mToolbar.setVisibility(View.VISIBLE); + } + }); + } + } + + @Override + public void setNavigationIcon(Drawable icon) { + mNavIcon = icon; + updateNavigationIcon(); + } + + @Override + public void setNavigationIcon(int resId) { + setNavigationIcon(resId != 0 + ? mTintManager.getDrawable(resId) + : null); + } + + @Override + public void setNavigationContentDescription(CharSequence description) { + mHomeDescription = description; + updateHomeAccessibility(); + } + + @Override + public void setNavigationContentDescription(int resId) { + setNavigationContentDescription(resId == 0 ? null : getContext().getString(resId)); + } + + private void updateHomeAccessibility() { + if ((mDisplayOpts & ActionBar.DISPLAY_HOME_AS_UP) != 0) { + if (TextUtils.isEmpty(mHomeDescription)) { + mToolbar.setNavigationContentDescription(mDefaultNavigationContentDescription); + } else { + mToolbar.setNavigationContentDescription(mHomeDescription); + } + } + } + + private void updateNavigationIcon() { + if ((mDisplayOpts & ActionBar.DISPLAY_HOME_AS_UP) != 0) { + mToolbar.setNavigationIcon(mNavIcon != null ? mNavIcon : mDefaultNavigationIcon); + } + } + + @Override + public void saveHierarchyState(SparseArray toolbarStates) { + mToolbar.saveHierarchyState(toolbarStates); + } + + @Override + public void restoreHierarchyState(SparseArray toolbarStates) { + mToolbar.restoreHierarchyState(toolbarStates); + } + + @Override + public void setBackgroundDrawable(Drawable d) { + //noinspection deprecation + mToolbar.setBackgroundDrawable(d); + } + + @Override + public int getHeight() { + return mToolbar.getHeight(); + } + + @Override + public void setVisibility(int visible) { + mToolbar.setVisibility(visible); + } + + @Override + public int getVisibility() { + return mToolbar.getVisibility(); + } + + @Override + public void setMenuCallbacks(MenuPresenter.Callback actionMenuPresenterCallback, + MenuBuilder.Callback menuBuilderCallback) { + mToolbar.setMenuCallbacks(actionMenuPresenterCallback, menuBuilderCallback); + } + + @Override + public Menu getMenu() { + return mToolbar.getMenu(); + } + + @Override + public int getPopupTheme() { + return mToolbar.getPopupTheme(); + } + +} \ No newline at end of file diff --git a/android/support/v7/internal/widget/ViewStubCompat.java b/android/support/v7/internal/widget/ViewStubCompat.java new file mode 100644 index 0000000000..10873a7294 --- /dev/null +++ b/android/support/v7/internal/widget/ViewStubCompat.java @@ -0,0 +1,262 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.support.v7.appcompat.R; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewParent; + + +import java.lang.ref.WeakReference; + +/** + * Backport of {@link android.view.ViewStub} so that we can set the + * {@link android.view.LayoutInflater} on devices before Jelly Bean. + * + * @hide + */ +public final class ViewStubCompat extends View { + private int mLayoutResource = 0; + private int mInflatedId; + + private WeakReference mInflatedViewRef; + + private LayoutInflater mInflater; + private OnInflateListener mInflateListener; + + public ViewStubCompat(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public ViewStubCompat(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ViewStubCompat, + defStyle, 0); + + mInflatedId = a.getResourceId(R.styleable.ViewStubCompat_android_inflatedId, NO_ID); + mLayoutResource = a.getResourceId(R.styleable.ViewStubCompat_android_layout, 0); + + setId(a.getResourceId(R.styleable.ViewStubCompat_android_id, NO_ID)); + a.recycle(); + + setVisibility(GONE); + setWillNotDraw(true); + } + + /** + * Returns the id taken by the inflated view. If the inflated id is + * {@link View#NO_ID}, the inflated view keeps its original id. + * + * @return A positive integer used to identify the inflated view or + * {@link #NO_ID} if the inflated view should keep its id. + * + * @see #setInflatedId(int) + * @attr ref android.R.styleable#ViewStub_inflatedId + */ + public int getInflatedId() { + return mInflatedId; + } + + /** + * Defines the id taken by the inflated view. If the inflated id is + * {@link View#NO_ID}, the inflated view keeps its original id. + * + * @param inflatedId A positive integer used to identify the inflated view or + * {@link #NO_ID} if the inflated view should keep its id. + * + * @see #getInflatedId() + * @attr ref android.R.styleable#ViewStub_inflatedId + */ + public void setInflatedId(int inflatedId) { + mInflatedId = inflatedId; + } + + /** + * Returns the layout resource that will be used by {@link #setVisibility(int)} or + * {@link #inflate()} to replace this StubbedView + * in its parent by another view. + * + * @return The layout resource identifier used to inflate the new View. + * + * @see #setLayoutResource(int) + * @see #setVisibility(int) + * @see #inflate() + * @attr ref android.R.styleable#ViewStub_layout + */ + public int getLayoutResource() { + return mLayoutResource; + } + + /** + * Specifies the layout resource to inflate when this StubbedView becomes visible or invisible + * or when {@link #inflate()} is invoked. The View created by inflating the layout resource is + * used to replace this StubbedView in its parent. + * + * @param layoutResource A valid layout resource identifier (different from 0.) + * + * @see #getLayoutResource() + * @see #setVisibility(int) + * @see #inflate() + * @attr ref android.R.styleable#ViewStub_layout + */ + public void setLayoutResource(int layoutResource) { + mLayoutResource = layoutResource; + } + + /** + * Set {@link LayoutInflater} to use in {@link #inflate()}, or {@code null} + * to use the default. + */ + public void setLayoutInflater(LayoutInflater inflater) { + mInflater = inflater; + } + + /** + * Get current {@link LayoutInflater} used in {@link #inflate()}. + */ + public LayoutInflater getLayoutInflater() { + return mInflater; + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + setMeasuredDimension(0, 0); + } + + @Override + public void draw(Canvas canvas) { + } + + @Override + protected void dispatchDraw(Canvas canvas) { + } + + /** + * When visibility is set to {@link #VISIBLE} or {@link #INVISIBLE}, + * {@link #inflate()} is invoked and this StubbedView is replaced in its parent + * by the inflated layout resource. After that calls to this function are passed + * through to the inflated view. + * + * @param visibility One of {@link #VISIBLE}, {@link #INVISIBLE}, or {@link #GONE}. + * + * @see #inflate() + */ + @Override + public void setVisibility(int visibility) { + if (mInflatedViewRef != null) { + View view = mInflatedViewRef.get(); + if (view != null) { + view.setVisibility(visibility); + } else { + throw new IllegalStateException("setVisibility called on un-referenced view"); + } + } else { + super.setVisibility(visibility); + if (visibility == VISIBLE || visibility == INVISIBLE) { + inflate(); + } + } + } + + /** + * Inflates the layout resource identified by {@link #getLayoutResource()} + * and replaces this StubbedView in its parent by the inflated layout resource. + * + * @return The inflated layout resource. + * + */ + public View inflate() { + final ViewParent viewParent = getParent(); + + if (viewParent != null && viewParent instanceof ViewGroup) { + if (mLayoutResource != 0) { + final ViewGroup parent = (ViewGroup) viewParent; + final LayoutInflater factory; + if (mInflater != null) { + factory = mInflater; + } else { + factory = LayoutInflater.from(getContext()); + } + final View view = factory.inflate(mLayoutResource, parent, + false); + + if (mInflatedId != NO_ID) { + view.setId(mInflatedId); + } + + final int index = parent.indexOfChild(this); + parent.removeViewInLayout(this); + + final ViewGroup.LayoutParams layoutParams = getLayoutParams(); + if (layoutParams != null) { + parent.addView(view, index, layoutParams); + } else { + parent.addView(view, index); + } + + mInflatedViewRef = new WeakReference(view); + + if (mInflateListener != null) { + mInflateListener.onInflate(this, view); + } + + return view; + } else { + throw new IllegalArgumentException("ViewStub must have a valid layoutResource"); + } + } else { + throw new IllegalStateException("ViewStub must have a non-null ViewGroup viewParent"); + } + } + + /** + * Specifies the inflate listener to be notified after this ViewStub successfully + * inflated its layout resource. + * + * @param inflateListener The OnInflateListener to notify of successful inflation. + * + * @see android.view.ViewStub.OnInflateListener + */ + public void setOnInflateListener(OnInflateListener inflateListener) { + mInflateListener = inflateListener; + } + + /** + * Listener used to receive a notification after a ViewStub has successfully + * inflated its layout resource. + * + * @see android.view.ViewStub#setOnInflateListener(android.view.ViewStub.OnInflateListener) + */ + public static interface OnInflateListener { + /** + * Invoked after a ViewStub successfully inflated its layout resource. + * This method is invoked after the inflated view was added to the + * hierarchy but before the layout pass. + * + * @param stub The ViewStub that initiated the inflation. + * @param inflated The inflated View. + */ + void onInflate(ViewStubCompat stub, View inflated); + } +} \ No newline at end of file diff --git a/android/support/v7/internal/widget/ViewUtils.java b/android/support/v7/internal/widget/ViewUtils.java new file mode 100644 index 0000000000..98e55d55f3 --- /dev/null +++ b/android/support/v7/internal/widget/ViewUtils.java @@ -0,0 +1,140 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Rect; +import android.os.Build; +import android.support.v4.view.ViewCompat; +import android.support.v7.appcompat.R; +import android.support.v7.internal.view.ContextThemeWrapper; +import android.util.AttributeSet; +import android.util.Log; +import android.view.View; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +/** + * @hide + */ +public class ViewUtils { + private static final String TAG = "ViewUtils"; + + private static Method sComputeFitSystemWindowsMethod; + + static { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { + try { + sComputeFitSystemWindowsMethod = View.class.getDeclaredMethod( + "computeFitSystemWindows", Rect.class, Rect.class); + if (!sComputeFitSystemWindowsMethod.isAccessible()) { + sComputeFitSystemWindowsMethod.setAccessible(true); + } + } catch (NoSuchMethodException e) { + Log.d(TAG, "Could not find method computeFitSystemWindows. Oh well."); + } + } + } + + private ViewUtils() {} + + public static boolean isLayoutRtl(View view) { + return ViewCompat.getLayoutDirection(view) == ViewCompat.LAYOUT_DIRECTION_RTL; + } + + /** + * Merge two states as returned by {@link ViewCompat#getMeasuredState(android.view.View)} ()}. + * @param curState The current state as returned from a view or the result + * of combining multiple views. + * @param newState The new view state to combine. + * @return Returns a new integer reflecting the combination of the two + * states. + */ + public static int combineMeasuredStates(int curState, int newState) { + return curState | newState; + } + + /** + * Allow calling the hidden method {@code computeFitSystemWindows(Rect, Rect)} through + * reflection on {@code view}. + */ + public static void computeFitSystemWindows(View view, Rect inoutInsets, Rect outLocalInsets) { + if (sComputeFitSystemWindowsMethod != null) { + try { + sComputeFitSystemWindowsMethod.invoke(view, inoutInsets, outLocalInsets); + } catch (Exception e) { + Log.d(TAG, "Could not invoke computeFitSystemWindows", e); + } + } + } + + /** + * Allow calling the hidden method {@code makeOptionalFitsSystem()} through reflection on + * {@code view}. + */ + public static void makeOptionalFitsSystemWindows(View view) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + try { + // We need to use getMethod() for makeOptionalFitsSystemWindows since both View + // and ViewGroup implement the method + Method method = view.getClass().getMethod("makeOptionalFitsSystemWindows"); + if (!method.isAccessible()) { + method.setAccessible(true); + } + method.invoke(view); + } catch (NoSuchMethodException e) { + Log.d(TAG, "Could not find method makeOptionalFitsSystemWindows. Oh well..."); + } catch (InvocationTargetException e) { + Log.d(TAG, "Could not invoke makeOptionalFitsSystemWindows", e); + } catch (IllegalAccessException e) { + Log.d(TAG, "Could not invoke makeOptionalFitsSystemWindows", e); + } + } + } + + /** + * Allows us to emulate the {@code android:theme} attribute for devices before L. + */ + public static Context themifyContext(Context context, AttributeSet attrs, + boolean useAndroidTheme, boolean useAppTheme) { + final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.View, 0, 0); + int themeId = 0; + if (useAndroidTheme) { + // First try reading android:theme if enabled + themeId = a.getResourceId(R.styleable.View_android_theme, 0); + } + if (useAppTheme && themeId == 0) { + // ...if that didn't work, try reading app:theme (for legacy reasons) if enabled + themeId = a.getResourceId(R.styleable.View_theme, 0); + + if (themeId != 0) { + Log.i(TAG, "app:theme is now deprecated. Please move to using android:theme instead."); + } + } + a.recycle(); + + if (themeId != 0 && (!(context instanceof ContextThemeWrapper) + || ((ContextThemeWrapper) context).getThemeResId() != themeId)) { + // If the context isn't a ContextThemeWrapperCompat, or it is but does not have + // the same theme as we need, wrap it in a new wrapper + context = new ContextThemeWrapper(context, themeId); + } + return context; + } +} diff --git a/android/support/v7/view/ActionMode.java b/android/support/v7/view/ActionMode.java new file mode 100644 index 0000000000..ff9cd495f4 --- /dev/null +++ b/android/support/v7/view/ActionMode.java @@ -0,0 +1,279 @@ +/* + * 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 android.support.v7.view; + +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; + +/** + * Represents a contextual mode of the user interface. Action modes can be used to provide + * alternative interaction modes and replace parts of the normal UI until finished. + * Examples of good action modes include text selection and contextual actions. + *

      + * + *

      Developer Guides

      + *

      For information about how to provide contextual actions with {@code ActionMode}, + * read the Menus + * developer guide.

      + * + *
      + */ +public abstract class ActionMode { + + private Object mTag; + private boolean mTitleOptionalHint; + + /** + * 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 whether or not the title/subtitle display for this action mode + * is optional. + * + *

      In many cases the supplied title for an action mode is merely + * meant to add context and is not strictly required for the action + * mode to be useful. If the title is optional, the system may choose + * to hide the title entirely rather than truncate it due to a lack + * of available space.

      + * + *

      Note that this is merely a hint; the underlying implementation + * may choose to ignore this setting under some circumstances.

      + * + * @param titleOptional true if the title only presents optional information. + */ + public void setTitleOptionalHint(boolean titleOptional) { + mTitleOptionalHint = titleOptional; + } + + /** + * @return true if this action mode has been given a hint to consider the + * title/subtitle display to be optional. + * + * @see #setTitleOptionalHint(boolean) + * @see #isTitleOptional() + */ + public boolean getTitleOptionalHint() { + return mTitleOptionalHint; + } + + /** + * @return true if this action mode considers the title and subtitle fields + * as optional. Optional titles may not be displayed to the user. + */ + public boolean isTitleOptional() { + return false; + } + + /** + * 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 android.support.v7.app.AppCompatDelegate#startSupportActionMode(Callback)} (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); + } +} diff --git a/android/support/v7/view/CollapsibleActionView.java b/android/support/v7/view/CollapsibleActionView.java new file mode 100644 index 0000000000..3f01c5cb84 --- /dev/null +++ b/android/support/v7/view/CollapsibleActionView.java @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.view; + +import android.support.v4.view.MenuItemCompat.OnActionExpandListener; + +/** + * When a {@link android.view.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 android.support.v4.view.MenuItemCompat} 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 + * android.support.v4.view.MenuItemCompat#expandActionView(android.view.MenuItem)}. + */ + public void onActionViewExpanded(); + + /** + * Called when this view is collapsed as an action view. See {@link + * android.support.v4.view.MenuItemCompat#collapseActionView(android.view.MenuItem)}. + */ + public void onActionViewCollapsed(); +} diff --git a/android/support/v7/widget/ActionMenuPresenter.java b/android/support/v7/widget/ActionMenuPresenter.java new file mode 100644 index 0000000000..bf167d6471 --- /dev/null +++ b/android/support/v7/widget/ActionMenuPresenter.java @@ -0,0 +1,769 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.widget; + +import android.content.Context; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.graphics.drawable.Drawable; +import android.os.Parcel; +import android.os.Parcelable; +import android.support.v4.graphics.drawable.DrawableCompat; +import android.support.v4.view.ActionProvider; +import android.support.v4.view.GravityCompat; +import android.support.v7.appcompat.R; +import android.support.v7.internal.transition.ActionBarTransition; +import android.support.v7.internal.view.ActionBarPolicy; +import android.support.v7.internal.view.menu.ActionMenuItemView; +import android.support.v7.internal.view.menu.BaseMenuPresenter; +import android.support.v7.internal.view.menu.MenuBuilder; +import android.support.v7.internal.view.menu.MenuItemImpl; +import android.support.v7.internal.view.menu.MenuPopupHelper; +import android.support.v7.internal.view.menu.MenuView; +import android.support.v7.internal.view.menu.SubMenuBuilder; +import android.support.v7.internal.widget.TintImageView; +import android.util.SparseBooleanArray; +import android.view.MenuItem; +import android.view.SoundEffectConstants; +import android.view.View; +import android.view.View.MeasureSpec; +import android.view.ViewGroup; + +import java.util.ArrayList; + +/** + * MenuPresenter for building action menus as seen in the action bar and action modes. + * + * @hide + */ +public class ActionMenuPresenter extends BaseMenuPresenter + implements ActionProvider.SubUiVisibilityListener { + + 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; + private ActionMenuPopupCallback mPopupCallback; + + final PopupPresenterCallback mPopupPresenterCallback = new PopupPresenterCallback(); + int mOpenSubMenuId; + + public ActionMenuPresenter(Context context) { + super(context, R.layout.abc_action_menu_layout, R.layout.abc_action_menu_item_layout); + } + + @Override + public void initForMenu(Context context, MenuBuilder menu) { + super.initForMenu(context, menu); + + final Resources res = context.getResources(); + + final ActionBarPolicy abp = ActionBarPolicy.get(context); + if (!mReserveOverflowSet) { + mReserveOverflow = abp.showsOverflowMenuButton(); + } + + if (!mWidthLimitSet) { + mWidthLimit = abp.getEmbeddedMenuWidthLimit(); + } + + // Measure for initial configuration + if (!mMaxItemsSet) { + mMaxItems = abp.getMaxActionButtons(); + } + + 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 void onConfigurationChanged(Configuration newConfig) { + if (!mMaxItemsSet) { + mMaxItems = mContext.getResources().getInteger( + R.integer.abc_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(final MenuItemImpl item, View convertView, ViewGroup parent) { + View actionView = item.getActionView(); + if (actionView == null || item.hasCollapsibleActionView()) { + 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; + final ActionMenuItemView actionItemView = (ActionMenuItemView) itemView; + actionItemView.setItemInvoker(menuView); + + if (mPopupCallback == null) { + mPopupCallback = new ActionMenuPopupCallback(); + } + actionItemView.setPopupCallback(mPopupCallback); + } + + @Override + public boolean shouldIncludeItem(int childIndex, MenuItemImpl item) { + return item.isActionButton(); + } + + @Override + public void updateMenuView(boolean cleared) { + final ViewGroup menuViewParent = (ViewGroup) ((View) mMenuView).getParent(); + if (menuViewParent != null) { + ActionBarTransition.beginDelayedTransition(menuViewParent); + } + super.updateMenuView(cleared); + + ((View) mMenuView).requestLayout(); + + 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).getSupportActionProvider(); + 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(); + } + + public boolean isOverflowMenuShowPending() { + return mPostedOpenRunnable != null || isOverflowMenuShowing(); + } + + /** + * @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); + } else { + // Neither requires nor requests an action button. + item.setIsActionButton(false); + } + } + 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); + } + } + + public void setMenuView(ActionMenuView menuView) { + mMenuView = menuView; + menuView.initialize(mMenu); + } + + 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); + } + + 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 TintImageView implements ActionMenuView.ActionMenuChildView { + private final float[] mTempPts = new float[2]; + + public OverflowMenuButton(Context context) { + super(context, null, R.attr.actionOverflowButtonStyle); + + setClickable(true); + setFocusable(true); + setVisibility(VISIBLE); + setEnabled(true); + + setOnTouchListener(new ListPopupWindow.ForwardingListener(this) { + @Override + public ListPopupWindow getPopup() { + if (mOverflowPopup == null) { + return null; + } + + return mOverflowPopup.getPopup(); + } + + @Override + public boolean onForwardingStarted() { + showOverflowMenu(); + return true; + } + + @Override + public boolean onForwardingStopped() { + // Displaying the popup occurs asynchronously, so wait for + // the runnable to finish before deciding whether to stop + // forwarding. + if (mPostedOpenRunnable != null) { + return false; + } + + hideOverflowMenu(); + return true; + } + }); + } + + @Override + public boolean performClick() { + if (super.performClick()) { + return true; + } + + playSoundEffect(SoundEffectConstants.CLICK); + showOverflowMenu(); + return true; + } + + @Override + public boolean needsDividerBefore() { + return false; + } + + @Override + public boolean needsDividerAfter() { + return false; + } + + @Override + protected boolean setFrame(int l, int t, int r, int b) { + final boolean changed = super.setFrame(l, t, r, b); + + // Set up the hotspot bounds to be centered on the image. + final Drawable d = getDrawable(); + final Drawable bg = getBackground(); + if (d != null && bg != null) { + final int width = getWidth(); + final int height = getHeight(); + final int halfEdge = Math.max(width, height) / 2; + final int offsetX = getPaddingLeft() - getPaddingRight(); + final int offsetY = getPaddingTop() - getPaddingBottom(); + final int centerX = (width + offsetX) / 2; + final int centerY = (height + offsetY) / 2; + DrawableCompat.setHotspotBounds(bg, centerX - halfEdge, centerY - halfEdge, + centerX + halfEdge, centerY + halfEdge); + } + + return changed; + } + } + + private class OverflowPopup extends MenuPopupHelper { + + public OverflowPopup(Context context, MenuBuilder menu, View anchorView, + boolean overflowOnly) { + super(context, menu, anchorView, overflowOnly, R.attr.actionOverflowMenuStyle); + setGravity(GravityCompat.END); + setCallback(mPopupPresenterCallback); + } + + @Override + public void onDismiss() { + super.onDismiss(); + mMenu.close(); + mOverflowPopup = null; + } + } + + private class ActionButtonSubmenu extends MenuPopupHelper { + private SubMenuBuilder mSubMenu; + + public ActionButtonSubmenu(Context context, SubMenuBuilder subMenu) { + super(context, subMenu, null, false, + R.attr.actionOverflowMenuStyle); + 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 Callback { + + @Override + public boolean onOpenSubMenu(MenuBuilder subMenu) { + if (subMenu == null) return false; + + mOpenSubMenuId = ((SubMenuBuilder) subMenu).getItem().getItemId(); + final Callback cb = getCallback(); + return cb != null ? cb.onOpenSubMenu(subMenu) : false; + } + + @Override + public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { + if (menu instanceof SubMenuBuilder) { + ((SubMenuBuilder) menu).getRootMenu().close(false); + } + final Callback cb = getCallback(); + if (cb != null) { + cb.onCloseMenu(menu, allMenusAreClosing); + } + } + } + + 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; + } + } + + private class ActionMenuPopupCallback extends ActionMenuItemView.PopupCallback { + @Override + public ListPopupWindow getPopup() { + return mActionButtonPopup != null ? mActionButtonPopup.getPopup() : null; + } + } +} diff --git a/android/support/v7/widget/ActionMenuView.java b/android/support/v7/widget/ActionMenuView.java new file mode 100644 index 0000000000..b7c982181b --- /dev/null +++ b/android/support/v7/widget/ActionMenuView.java @@ -0,0 +1,811 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package android.support.v7.widget; + +import android.content.Context; +import android.content.res.Configuration; +import android.os.Build; +import android.support.v7.internal.view.menu.ActionMenuItemView; +import android.support.v7.internal.view.menu.MenuBuilder; +import android.support.v7.internal.view.menu.MenuItemImpl; +import android.support.v7.internal.view.menu.MenuPresenter; +import android.support.v7.internal.view.menu.MenuView; +import android.support.v7.internal.widget.ViewUtils; +import android.util.AttributeSet; +import android.view.ContextThemeWrapper; +import android.view.Gravity; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewDebug; +import android.view.ViewGroup; +import android.view.accessibility.AccessibilityEvent; + +/** + * ActionMenuView is a presentation of a series of menu options as a View. It provides + * several top level options as action buttons while spilling remaining options over as + * items in an overflow menu. This allows applications to present packs of actions inline with + * specific or repeating content. + */ +public class ActionMenuView extends LinearLayoutCompat implements MenuBuilder.ItemInvoker, + MenuView { + + private static final String TAG = "ActionMenuView"; + + static final int MIN_CELL_SIZE = 56; // dips + static final int GENERATED_ITEM_PADDING = 4; // dips + + private MenuBuilder mMenu; + + private Context mContext; + + /** Context against which to inflate popup menus. */ + private Context mPopupContext; + + /** Theme resource against which to inflate popup menus. */ + private int mPopupTheme; + + private boolean mReserveOverflow; + private ActionMenuPresenter mPresenter; + private MenuPresenter.Callback mActionMenuPresenterCallback; + private MenuBuilder.Callback mMenuBuilderCallback; + private boolean mFormatItems; + private int mFormatItemsWidth; + private int mMinCellSize; + private int mGeneratedItemPadding; + + private OnMenuItemClickListener mOnMenuItemClickListener; + + public ActionMenuView(Context context) { + this(context, null); + } + + public ActionMenuView(Context context, AttributeSet attrs) { + super(context, attrs); + mContext = context; + setBaselineAligned(false); + final float density = context.getResources().getDisplayMetrics().density; + mMinCellSize = (int) (MIN_CELL_SIZE * density); + mGeneratedItemPadding = (int) (GENERATED_ITEM_PADDING * density); + mPopupContext = context; + mPopupTheme = 0; + } + + /** + * Specifies the theme to use when inflating popup menus. By default, uses + * the same theme as the action menu view itself. + * + * @param resId theme used to inflate popup menus + * @see #getPopupTheme() + */ + public void setPopupTheme(int resId) { + if (mPopupTheme != resId) { + mPopupTheme = resId; + if (resId == 0) { + mPopupContext = mContext; + } else { + mPopupContext = new ContextThemeWrapper(mContext, resId); + } + } + } + + /** + * @return resource identifier of the theme used to inflate popup menus, or + * 0 if menus are inflated against the action menu view theme + * @see #setPopupTheme(int) + */ + public int getPopupTheme() { + return mPopupTheme; + } + + /** + * @param presenter Menu presenter used to display popup menu + * @hide + */ + public void setPresenter(ActionMenuPresenter presenter) { + mPresenter = presenter; + mPresenter.setMenuView(this); + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + if (Build.VERSION.SDK_INT >= 8) { + super.onConfigurationChanged(newConfig); + } + + if (mPresenter != null) { + mPresenter.updateMenuView(false); + + if (mPresenter.isOverflowMenuShowing()) { + mPresenter.hideOverflowMenu(); + mPresenter.showOverflowMenu(); + } + } + } + + public void setOnMenuItemClickListener(OnMenuItemClickListener listener) { + mOnMenuItemClickListener = listener; + } + + @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.getSize(widthMeasureSpec); + if (mFormatItems && mMenu != null && widthSize != mFormatItemsWidth) { + mFormatItemsWidth = widthSize; + mMenu.onItemsChanged(true); + } + + final int childCount = getChildCount(); + if (mFormatItems && childCount > 0) { + onMeasureExactFormat(widthMeasureSpec, heightMeasureSpec); + } else { + // Previous measurement at exact format may have set margins - reset them. + for (int i = 0; i < childCount; i++) { + final View child = getChildAt(i); + final LayoutParams lp = (LayoutParams) child.getLayoutParams(); + lp.leftMargin = lp.rightMargin = 0; + } + 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(); + + final int itemHeightSpec = getChildMeasureSpec(heightMeasureSpec, heightPadding, + ViewGroup.LayoutParams.WRAP_CONTENT); + + 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, + itemHeightSpec, 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) { + 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), + itemHeightSpec); + } + } + + if (heightMode != MeasureSpec.EXACTLY) { + heightSize = maxChildHeight; + } + + setMeasuredDimension(widthSize, heightSize); + } + + /** + * 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); + + final ActionMenuItemView itemView = child instanceof ActionMenuItemView ? + (ActionMenuItemView) child : null; + final boolean hasText = itemView != null && itemView.hasText(); + + int cellsUsed = 0; + if (cellsRemaining > 0 && (!hasText || cellsRemaining >= 2)) { + 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++; + if (hasText && cellsUsed < 2) cellsUsed = 2; + } + + final boolean expandable = !lp.isOverflowButton && 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 = (bottom - top) / 2; + final int dividerWidth = getDividerWidth(); + int overflowWidth = 0; + int nonOverflowWidth = 0; + int nonOverflowCount = 0; + int widthRemaining = right - left - getPaddingRight() - getPaddingLeft(); + boolean hasOverflow = false; + final boolean isLayoutRtl = ViewUtils.isLayoutRtl(this); + 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 (hasSupportDividerBeforeChildAt(i)) { + overflowWidth += dividerWidth; + } + int height = v.getMeasuredHeight(); + int r; + int l; + if (isLayoutRtl) { + l = getPaddingLeft() + p.leftMargin; + r = l + overflowWidth; + } else { + r = getWidth() - getPaddingRight() - p.rightMargin; + 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; + nonOverflowWidth += size; + widthRemaining -= size; + if (hasSupportDividerBeforeChildAt(i)) { + 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); + + if (isLayoutRtl) { + int startRight = getWidth() - getPaddingRight(); + 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; + } + + startRight -= lp.rightMargin; + int width = v.getMeasuredWidth(); + int height = v.getMeasuredHeight(); + int t = midVertical - height / 2; + v.layout(startRight - width, t, startRight, t + height); + startRight -= width + lp.leftMargin + spacerSize; + } + } else { + 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(); + dismissPopupMenus(); + } + + /** @hide */ + public boolean isOverflowReserved() { + return mReserveOverflow; + } + + /** @hide */ + 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 != null) { + final LayoutParams result = p instanceof LayoutParams + ? new LayoutParams((LayoutParams) p) + : new 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; + } + + /** @hide */ + public LayoutParams generateOverflowButtonLayoutParams() { + LayoutParams result = generateDefaultLayoutParams(); + result.isOverflowButton = true; + return result; + } + + /** @hide */ + public boolean invokeItem(MenuItemImpl item) { + return mMenu.performItemAction(item, 0); + } + + /** @hide */ + public int getWindowAnimations() { + return 0; + } + + /** @hide */ + public void initialize(MenuBuilder menu) { + mMenu = menu; + } + + /** + * Returns the Menu object that this ActionMenuView is currently presenting. + * + *

      Applications should use this method to obtain the ActionMenuView's Menu object + * and inflate or add content to it as necessary.

      + * + * @return the Menu presented by this view + */ + public Menu getMenu() { + if (mMenu == null) { + final Context context = getContext(); + mMenu = new MenuBuilder(context); + mMenu.setCallback(new MenuBuilderCallback()); + mPresenter = new ActionMenuPresenter(context); + mPresenter.setReserveOverflow(true); + mPresenter.setCallback(mActionMenuPresenterCallback != null + ? mActionMenuPresenterCallback : new ActionMenuPresenterCallback()); + mMenu.addMenuPresenter(mPresenter, mPopupContext); + mPresenter.setMenuView(this); + } + + return mMenu; + } + + /** + * Must be called before the first call to getMenu() + * @hide + */ + public void setMenuCallbacks(MenuPresenter.Callback pcb, MenuBuilder.Callback mcb) { + mActionMenuPresenterCallback = pcb; + mMenuBuilderCallback = mcb; + } + + /** + * Returns the current menu or null if one has not yet been configured. + * @hide Internal use only for action bar integration + */ + public MenuBuilder peekMenu() { + return mMenu; + } + + /** + * Show the overflow items from the associated menu. + * + * @return true if the menu was able to be shown, false otherwise + */ + public boolean showOverflowMenu() { + return mPresenter != null && mPresenter.showOverflowMenu(); + } + + /** + * Hide the overflow items from the associated menu. + * + * @return true if the menu was able to be hidden, false otherwise + */ + public boolean hideOverflowMenu() { + return mPresenter != null && mPresenter.hideOverflowMenu(); + } + + /** + * Check whether the overflow menu is currently showing. This may not reflect + * a pending show operation in progress. + * + * @return true if the overflow menu is currently showing + */ + public boolean isOverflowMenuShowing() { + return mPresenter != null && mPresenter.isOverflowMenuShowing(); + } + + /** @hide */ + public boolean isOverflowMenuShowPending() { + return mPresenter != null && mPresenter.isOverflowMenuShowPending(); + } + + /** + * Dismiss any popups associated with this menu view. + */ + public void dismissPopupMenus() { + if (mPresenter != null) { + mPresenter.dismissPopupMenus(); + } + } + + /** + * @hide Private LinearLayout (superclass) API. Un-hide if LinearLayout API is made public. + */ + protected boolean hasSupportDividerBeforeChildAt(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; + } + + /** @hide */ + public void setExpandedActionViewsExclusive(boolean exclusive) { + mPresenter.setExpandedActionViewsExclusive(exclusive); + } + + /** + * Interface responsible for receiving menu item click events if the items themselves + * do not have individual item click listeners. + */ + public interface OnMenuItemClickListener { + /** + * This method will be invoked when a menu item is clicked if the item itself did + * not already handle the event. + * + * @param item {@link MenuItem} that was clicked + * @return true if the event was handled, false otherwise. + */ + public boolean onMenuItemClick(MenuItem item); + } + + private class MenuBuilderCallback implements MenuBuilder.Callback { + @Override + public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) { + return mOnMenuItemClickListener != null && + mOnMenuItemClickListener.onMenuItemClick(item); + } + + @Override + public void onMenuModeChange(MenuBuilder menu) { + if (mMenuBuilderCallback != null) { + mMenuBuilderCallback.onMenuModeChange(menu); + } + } + } + + private class ActionMenuPresenterCallback implements ActionMenuPresenter.Callback { + @Override + public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { + } + + @Override + public boolean onOpenSubMenu(MenuBuilder subMenu) { + return false; + } + } + + /** @hide */ + public interface ActionMenuChildView { + public boolean needsDividerBefore(); + public boolean needsDividerAfter(); + } + + public static class LayoutParams extends LinearLayoutCompat.LayoutParams { + + @ViewDebug.ExportedProperty() + public boolean isOverflowButton; + + @ViewDebug.ExportedProperty() + public int cellsUsed; + + @ViewDebug.ExportedProperty() + public int extraPixels; + + @ViewDebug.ExportedProperty() + public boolean expandable; + + @ViewDebug.ExportedProperty() + public boolean preventEdgeOffset; + + boolean expanded; + + public LayoutParams(Context c, AttributeSet attrs) { + super(c, attrs); + } + + public LayoutParams(ViewGroup.LayoutParams other) { + super(other); + } + + public LayoutParams(LayoutParams other) { + super((ViewGroup.LayoutParams) other); + isOverflowButton = other.isOverflowButton; + } + + public LayoutParams(int width, int height) { + super(width, height); + isOverflowButton = false; + } + + LayoutParams(int width, int height, boolean isOverflowButton) { + super(width, height); + this.isOverflowButton = isOverflowButton; + } + } +} diff --git a/android/support/v7/widget/LinearLayoutCompat.java b/android/support/v7/widget/LinearLayoutCompat.java new file mode 100644 index 0000000000..b89115c0aa --- /dev/null +++ b/android/support/v7/widget/LinearLayoutCompat.java @@ -0,0 +1,1837 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.widget; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.support.annotation.IntDef; +import android.support.v4.view.GravityCompat; +import android.support.v4.view.ViewCompat; +import android.support.v7.appcompat.R; +import android.support.v7.internal.widget.TintTypedArray; +import android.support.v7.internal.widget.ViewUtils; +import android.util.AttributeSet; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.view.accessibility.AccessibilityEvent; +import android.view.accessibility.AccessibilityNodeInfo; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + + +/** + * A Layout that arranges its children in a single column or a single row. The direction of + * the row can be set by calling {@link #setOrientation(int) setOrientation()}. + * You can also specify gravity, which specifies the alignment of all the child elements by + * calling {@link #setGravity(int) setGravity()} or specify that specific children + * grow to fill up any remaining space in the layout by setting the weight member of + * {@link LinearLayoutCompat.LayoutParams LinearLayoutCompat.LayoutParams}. + * The default orientation is horizontal. + * + *

      See the Linear Layout + * guide.

      + * + *

      + * Also see {@link LinearLayoutCompat.LayoutParams} for layout attributes

      + */ +public class LinearLayoutCompat extends ViewGroup { + /** @hide */ + @IntDef({HORIZONTAL, VERTICAL}) + @Retention(RetentionPolicy.SOURCE) + public @interface OrientationMode {} + + public static final int HORIZONTAL = 0; + public static final int VERTICAL = 1; + + /** @hide */ + @IntDef(flag = true, + value = { + SHOW_DIVIDER_NONE, + SHOW_DIVIDER_BEGINNING, + SHOW_DIVIDER_MIDDLE, + SHOW_DIVIDER_END + }) + @Retention(RetentionPolicy.SOURCE) + public @interface DividerMode {} + + /** + * 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; + + /** + * Whether the children of this layout are baseline aligned. Only applicable + * if {@link #mOrientation} is horizontal. + */ + private boolean mBaselineAligned = true; + + /** + * If this layout is part of another layout that is baseline aligned, + * use the child at this index as the baseline. + * + * Note: this is orthogonal to {@link #mBaselineAligned}, which is concerned + * with whether the children of this layout are baseline aligned. + */ + private int mBaselineAlignedChildIndex = -1; + + /** + * The additional offset to the child's baseline. + * We'll calculate the baseline of this layout as we measure vertically; for + * horizontal linear layouts, the offset of 0 is appropriate. + */ + private int mBaselineChildTop = 0; + + private int mOrientation; + + private int mGravity = GravityCompat.START | Gravity.TOP; + + private int mTotalLength; + + private float mWeightSum; + + private boolean mUseLargestChild; + + private int[] mMaxAscent; + private int[] mMaxDescent; + + private static final int VERTICAL_GRAVITY_COUNT = 4; + + private static final int INDEX_CENTER_VERTICAL = 0; + private static final int INDEX_TOP = 1; + private static final int INDEX_BOTTOM = 2; + private static final int INDEX_FILL = 3; + + private Drawable mDivider; + private int mDividerWidth; + private int mDividerHeight; + private int mShowDividers; + private int mDividerPadding; + + public LinearLayoutCompat(Context context) { + this(context, null); + } + + public LinearLayoutCompat(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public LinearLayoutCompat(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + final TintTypedArray a = TintTypedArray.obtainStyledAttributes(context, attrs, + R.styleable.LinearLayoutCompat, defStyleAttr, 0); + + int index = a.getInt(R.styleable.LinearLayoutCompat_android_orientation, -1); + if (index >= 0) { + setOrientation(index); + } + + index = a.getInt(R.styleable.LinearLayoutCompat_android_gravity, -1); + if (index >= 0) { + setGravity(index); + } + + boolean baselineAligned = a.getBoolean(R.styleable.LinearLayoutCompat_android_baselineAligned, true); + if (!baselineAligned) { + setBaselineAligned(baselineAligned); + } + + mWeightSum = a.getFloat(R.styleable.LinearLayoutCompat_android_weightSum, -1.0f); + + mBaselineAlignedChildIndex = + a.getInt(R.styleable.LinearLayoutCompat_android_baselineAlignedChildIndex, -1); + + mUseLargestChild = a.getBoolean(R.styleable.LinearLayoutCompat_measureWithLargestChild, false); + + setDividerDrawable(a.getDrawable(R.styleable.LinearLayoutCompat_divider)); + mShowDividers = a.getInt(R.styleable.LinearLayoutCompat_showDividers, SHOW_DIVIDER_NONE); + mDividerPadding = a.getDimensionPixelSize(R.styleable.LinearLayoutCompat_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(@DividerMode int showDividers) { + if (showDividers != mShowDividers) { + requestLayout(); + } + mShowDividers = showDividers; + } + + @Override + public boolean shouldDelayChildPressedState() { + return false; + } + + /** + * @return A flag set indicating how dividers should be shown around items. + * @see #setShowDividers(int) + */ + @DividerMode + public int getShowDividers() { + return mShowDividers; + } + + /** + * @return the divider Drawable that will divide each item. + * + * @see #setDividerDrawable(Drawable) + */ + public Drawable getDividerDrawable() { + return mDivider; + } + + /** + * Set a drawable to be used as a divider between items. + * + * @param divider Drawable that will divide each item. + * + * @see #setShowDividers(int) + */ + public void setDividerDrawable(Drawable divider) { + if (divider == mDivider) { + return; + } + mDivider = divider; + if (divider != null) { + mDividerWidth = divider.getIntrinsicWidth(); + mDividerHeight = divider.getIntrinsicHeight(); + } else { + mDividerWidth = 0; + mDividerHeight = 0; + } + setWillNotDraw(divider == null); + requestLayout(); + } + + /** + * Set padding displayed on both ends of dividers. + * + * @param padding Padding value in pixels that will be applied to each end + * + * @see #setShowDividers(int) + * @see #setDividerDrawable(Drawable) + * @see #getDividerPadding() + */ + public void setDividerPadding(int padding) { + mDividerPadding = padding; + } + + /** + * Get the padding size used to inset dividers in pixels + * + * @see #setShowDividers(int) + * @see #setDividerDrawable(Drawable) + * @see #setDividerPadding(int) + */ + public int getDividerPadding() { + return mDividerPadding; + } + + /** + * Get the width of the current divider drawable. + * + * @hide Used internally by framework. + */ + public int getDividerWidth() { + return mDividerWidth; + } + + @Override + protected void onDraw(Canvas canvas) { + if (mDivider == null) { + return; + } + + if (mOrientation == VERTICAL) { + drawDividersVertical(canvas); + } else { + drawDividersHorizontal(canvas); + } + } + + 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 drawDividersHorizontal(Canvas canvas) { + final int count = getVirtualChildCount(); + final boolean isLayoutRtl = ViewUtils.isLayoutRtl(this); + 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 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); + } + + /** + *

      Indicates whether widgets contained within this layout are aligned + * on their baseline or not.

      + * + * @return true when widgets are baseline-aligned, false otherwise + */ + public boolean isBaselineAligned() { + return mBaselineAligned; + } + + /** + *

      Defines whether widgets contained in this layout are + * baseline-aligned or not.

      + * + * @param baselineAligned true to align widgets on their baseline, + * false otherwise + */ + public void setBaselineAligned(boolean baselineAligned) { + mBaselineAligned = baselineAligned; + } + + /** + * 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. + */ + 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. + */ + public void setMeasureWithLargestChildEnabled(boolean enabled) { + mUseLargestChild = enabled; + } + + @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) { + // this is just the default case, safe to return -1 + return -1; + } + // the user picked an index that points to something that doesn't + // know how to calculate its baseline. + throw new RuntimeException("mBaselineAlignedChildIndex of LinearLayout " + + "points to a View that doesn't know how to get its baseline."); + } + + // TODO: This should try to take into account the virtual offsets + // (See getNextLocationOffset and getLocationOffset) + // We should add to childTop: + // sum([getNextLocationOffset(getChildAt(i)) / i < mBaselineAlignedChildIndex]) + // and also add: + // getLocationOffset(child) + 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; + } + } + } + + LinearLayoutCompat.LayoutParams lp = (LinearLayoutCompat.LayoutParams) child.getLayoutParams(); + return childTop + lp.topMargin + childBaseline; + } + + /** + * @return The index of the child that will be used if this layout is + * part of a larger layout that is baseline aligned, or -1 if none has + * been set. + */ + public int getBaselineAlignedChildIndex() { + return mBaselineAlignedChildIndex; + } + + /** + * @param i The index of the child that will be used if this layout is + * part of a larger layout that is baseline aligned. + */ + public void setBaselineAlignedChildIndex(int i) { + if ((i < 0) || (i >= getChildCount())) { + throw new IllegalArgumentException("base aligned child index out " + + "of range (0, " + getChildCount() + ")"); + } + mBaselineAlignedChildIndex = i; + } + + /** + *

      Returns the view at the specified index. This method can be overriden + * to take into account virtual children. Refer to + * {@link android.widget.TableLayout} and {@link android.widget.TableRow} + * for an example.

      + * + * @param index the child's index + * @return the child at the specified index + */ + View getVirtualChildAt(int index) { + return getChildAt(index); + } + + /** + *

      Returns the virtual number of children. This number might be different + * than the actual number of children if the layout can hold virtual + * children. Refer to + * {@link android.widget.TableLayout} and {@link android.widget.TableRow} + * for an example.

      + * + * @return the virtual number of children + */ + int getVirtualChildCount() { + return getChildCount(); + } + + /** + * Returns the desired weights sum. + * + * @return A number greater than 0.0f if the weight sum is defined, or + * a number lower than or equals to 0.0f if not weight sum is + * to be used. + */ + public float getWeightSum() { + return mWeightSum; + } + + /** + * Defines the desired weights sum. If unspecified the weights sum is computed + * at layout time by adding the layout_weight of each child. + * + * This can be used for instance to give a single child 50% of the total + * available space by giving it a layout_weight of 0.5 and setting the + * weightSum to 1.0. + * + * @param weightSum a number greater than 0.0f, or a number lower than or equals + * to 0.0f if the weight sum should be computed from the children's + * layout_weight + */ + public void setWeightSum(float weightSum) { + mWeightSum = Math.max(0.0f, weightSum); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + if (mOrientation == VERTICAL) { + measureVertical(widthMeasureSpec, heightMeasureSpec); + } else { + measureHorizontal(widthMeasureSpec, heightMeasureSpec); + } + } + + /** + * 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; + } + + /** + * Measures the children when the orientation of this LinearLayout is set + * to {@link #VERTICAL}. + * + * @param widthMeasureSpec Horizontal space requirements as imposed by the parent. + * @param heightMeasureSpec Vertical space requirements as imposed by the parent. + * + * @see #getOrientation() + * @see #setOrientation(int) + * @see #onMeasure(int, int) + */ + 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; + boolean skippedMeasure = false; + + final int baselineChildIndex = mBaselineAlignedChildIndex; + final boolean useLargestChild = mUseLargestChild; + + int largestChildHeight = Integer.MIN_VALUE; + + // See how tall everyone is. Also remember max width. + 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; + } + + LinearLayoutCompat.LayoutParams lp = (LinearLayoutCompat.LayoutParams) child.getLayoutParams(); + + totalWeight += lp.weight; + + if (heightMode == MeasureSpec.EXACTLY && lp.height == 0 && lp.weight > 0) { + // Optimization: don't bother measuring children who are going to use + // leftover space. These views will get measured again down below if + // there is any leftover space. + final int totalLength = mTotalLength; + mTotalLength = Math.max(totalLength, totalLength + lp.topMargin + lp.bottomMargin); + skippedMeasure = true; + } else { + int oldHeight = Integer.MIN_VALUE; + + if (lp.height == 0 && lp.weight > 0) { + // heightMode is either UNSPECIFIED or AT_MOST, and this + // child wanted to stretch to fill available space. + // Translate that to WRAP_CONTENT so that it does not end up + // with a height of 0 + oldHeight = 0; + lp.height = LayoutParams.WRAP_CONTENT; + } + + // Determine how big this child would like to be. If this or + // previous children have given a weight, then we allow it to + // use all available space (and we will shrink things later + // if needed). + 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 applicable, compute the additional offset to the child's baseline + * we'll need later when asked {@link #getBaseline}. + */ + if ((baselineChildIndex >= 0) && (baselineChildIndex == i + 1)) { + mBaselineChildTop = mTotalLength; + } + + // if we are trying to use a child index for our baseline, the above + // book keeping only works if there are no children above it with + // weight. fail fast to aid the developer. + 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 == LayoutParams.MATCH_PARENT) { + // The width of the linear layout will scale, and at least one + // child said it wanted to match our width. Set a flag + // indicating that we need to remeasure at least that view when + // we know our width. + matchWidth = true; + matchWidthLocally = true; + } + + final int margin = lp.leftMargin + lp.rightMargin; + final int measuredWidth = child.getMeasuredWidth() + margin; + maxWidth = Math.max(maxWidth, measuredWidth); + childState = ViewUtils.combineMeasuredStates(childState, + ViewCompat.getMeasuredState(child)); + + allFillParent = allFillParent && lp.width == LayoutParams.MATCH_PARENT; + if (lp.weight > 0) { + /* + * Widths of weighted Views are bogus if we end up + * remeasuring, so keep them separate. + */ + 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 LinearLayoutCompat.LayoutParams lp = (LinearLayoutCompat.LayoutParams) + child.getLayoutParams(); + // Account for negative margins + final int totalLength = mTotalLength; + mTotalLength = Math.max(totalLength, totalLength + largestChildHeight + + lp.topMargin + lp.bottomMargin + getNextLocationOffset(child)); + } + } + + // Add in our padding + mTotalLength += getPaddingTop() + getPaddingBottom(); + + int heightSize = mTotalLength; + + // Check against our minimum height + heightSize = Math.max(heightSize, getSuggestedMinimumHeight()); + + // Reconcile our calculated size with the heightMeasureSpec + int heightSizeAndState = ViewCompat.resolveSizeAndState(heightSize, heightMeasureSpec, 0); + heightSize = heightSizeAndState & ViewCompat.MEASURED_SIZE_MASK; + + // Either expand children with weight to take up available space or + // shrink them if they extend beyond our current bounds. If we skipped + // measurement on any children, we need to measure them now. + int delta = heightSize - mTotalLength; + if (skippedMeasure || 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; + } + + LinearLayoutCompat.LayoutParams lp = (LinearLayoutCompat.LayoutParams) child.getLayoutParams(); + + float childExtra = lp.weight; + if (childExtra > 0) { + // Child said it could absorb extra space -- give him his share + int share = (int) (childExtra * delta / weightSum); + weightSum -= childExtra; + delta -= share; + + final int childWidthMeasureSpec = getChildMeasureSpec(widthMeasureSpec, + getPaddingLeft() + getPaddingRight() + + lp.leftMargin + lp.rightMargin, lp.width); + + // TODO: Use a field like lp.isMeasured to figure out if this + // child has been previously measured + if ((lp.height != 0) || (heightMode != MeasureSpec.EXACTLY)) { + // child was measured once already above... + // base new measurement on stored values + int childHeight = child.getMeasuredHeight() + share; + if (childHeight < 0) { + childHeight = 0; + } + + child.measure(childWidthMeasureSpec, + MeasureSpec.makeMeasureSpec(childHeight, MeasureSpec.EXACTLY)); + } else { + // child was skipped in the loop above. + // Measure for this first time here + child.measure(childWidthMeasureSpec, + MeasureSpec.makeMeasureSpec(share > 0 ? share : 0, + MeasureSpec.EXACTLY)); + } + + // Child may now not fit in vertical dimension. + childState = ViewUtils.combineMeasuredStates(childState, + ViewCompat.getMeasuredState(child) & (ViewCompat.MEASURED_STATE_MASK + >> ViewCompat.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 == LayoutParams.MATCH_PARENT; + + alternativeMaxWidth = Math.max(alternativeMaxWidth, + matchWidthLocally ? margin : measuredWidth); + + allFillParent = allFillParent && lp.width == LayoutParams.MATCH_PARENT; + + final int totalLength = mTotalLength; + mTotalLength = Math.max(totalLength, totalLength + child.getMeasuredHeight() + + lp.topMargin + lp.bottomMargin + getNextLocationOffset(child)); + } + + // Add in our padding + mTotalLength += getPaddingTop() + getPaddingBottom(); + // TODO: Should we recompute the heightSpec based on the new total length? + } else { + alternativeMaxWidth = Math.max(alternativeMaxWidth, + weightedMaxWidth); + + + // We have no limit, so make all weighted views as tall as the largest child. + // Children will have already been measured once. + 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 LinearLayoutCompat.LayoutParams lp = + (LinearLayoutCompat.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(); + + // Check against our minimum width + maxWidth = Math.max(maxWidth, getSuggestedMinimumWidth()); + + setMeasuredDimension(ViewCompat.resolveSizeAndState(maxWidth, widthMeasureSpec, childState), + heightSizeAndState); + + if (matchWidth) { + forceUniformWidth(count, heightMeasureSpec); + } + } + + private void forceUniformWidth(int count, int heightMeasureSpec) { + // Pretend that the linear layout has an exact size. + int uniformMeasureSpec = MeasureSpec.makeMeasureSpec(getMeasuredWidth(), + MeasureSpec.EXACTLY); + for (int i = 0; i< count; ++i) { + final View child = getVirtualChildAt(i); + if (child.getVisibility() != GONE) { + LinearLayoutCompat.LayoutParams lp = ((LinearLayoutCompat.LayoutParams)child.getLayoutParams()); + + if (lp.width == LayoutParams.MATCH_PARENT) { + // Temporarily force children to reuse their old measured height + // FIXME: this may not be right for something like wrapping text? + int oldHeight = lp.height; + lp.height = child.getMeasuredHeight(); + + // Remeasue with new dimensions + measureChildWithMargins(child, uniformMeasureSpec, 0, heightMeasureSpec, 0); + lp.height = oldHeight; + } + } + } + } + + /** + * Measures the children when the orientation of this LinearLayout is set + * to {@link #HORIZONTAL}. + * + * @param widthMeasureSpec Horizontal space requirements as imposed by the parent. + * @param heightMeasureSpec Vertical space requirements as imposed by the parent. + * + * @see #getOrientation() + * @see #setOrientation(int) + * @see #onMeasure(int, int) + */ + 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; + boolean skippedMeasure = 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; + + // See how wide everyone is. Also remember max height. + 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 LinearLayoutCompat.LayoutParams lp = (LinearLayoutCompat.LayoutParams) + child.getLayoutParams(); + + totalWeight += lp.weight; + + if (widthMode == MeasureSpec.EXACTLY && lp.width == 0 && lp.weight > 0) { + // Optimization: don't bother measuring children who are going to use + // leftover space. These views will get measured again down below if + // there is any leftover space. + if (isExactly) { + mTotalLength += lp.leftMargin + lp.rightMargin; + } else { + final int totalLength = mTotalLength; + mTotalLength = Math.max(totalLength, totalLength + + lp.leftMargin + lp.rightMargin); + } + + // Baseline alignment requires to measure widgets to obtain the + // baseline offset (in particular for TextViews). The following + // defeats the optimization mentioned above. Allow the child to + // use as much space as it wants because we can shrink things + // later (and re-measure). + if (baselineAligned) { + final int freeSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); + child.measure(freeSpec, freeSpec); + } else { + skippedMeasure = true; + } + } else { + int oldWidth = Integer.MIN_VALUE; + + if (lp.width == 0 && lp.weight > 0) { + // widthMode is either UNSPECIFIED or AT_MOST, and this + // child + // wanted to stretch to fill available space. Translate that to + // WRAP_CONTENT so that it does not end up with a width of 0 + oldWidth = 0; + lp.width = LayoutParams.WRAP_CONTENT; + } + + // Determine how big this child would like to be. If this or + // previous children have given a weight, then we allow it to + // use all available space (and we will shrink things later + // if needed). + 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 == LayoutParams.MATCH_PARENT) { + // The height of the linear layout will scale, and at least one + // child said it wanted to match our height. Set a flag indicating that + // we need to remeasure at least that view when we know our height. + matchHeight = true; + matchHeightLocally = true; + } + + final int margin = lp.topMargin + lp.bottomMargin; + final int childHeight = child.getMeasuredHeight() + margin; + childState = ViewUtils.combineMeasuredStates(childState, + ViewCompat.getMeasuredState(child)); + + if (baselineAligned) { + final int childBaseline = child.getBaseline(); + if (childBaseline != -1) { + // Translates the child's vertical gravity into an index + // in the range 0..VERTICAL_GRAVITY_COUNT + 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 == LayoutParams.MATCH_PARENT; + if (lp.weight > 0) { + /* + * Heights of weighted Views are bogus if we end up + * remeasuring, so keep them separate. + */ + 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; + } + + // Check mMaxAscent[INDEX_TOP] first because it maps to Gravity.TOP, + // the most common case + 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 LinearLayoutCompat.LayoutParams lp = (LinearLayoutCompat.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)); + } + } + } + + // Add in our padding + mTotalLength += getPaddingLeft() + getPaddingRight(); + + int widthSize = mTotalLength; + + // Check against our minimum width + widthSize = Math.max(widthSize, getSuggestedMinimumWidth()); + + // Reconcile our calculated size with the widthMeasureSpec + int widthSizeAndState = ViewCompat.resolveSizeAndState(widthSize, widthMeasureSpec, 0); + widthSize = widthSizeAndState & ViewCompat.MEASURED_SIZE_MASK; + + // Either expand children with weight to take up available space or + // shrink them if they extend beyond our current bounds. If we skipped + // measurement on any children, we need to measure them now. + int delta = widthSize - mTotalLength; + if (skippedMeasure || 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 LinearLayoutCompat.LayoutParams lp = + (LinearLayoutCompat.LayoutParams) child.getLayoutParams(); + + float childExtra = lp.weight; + if (childExtra > 0) { + // Child said it could absorb extra space -- give him his share + int share = (int) (childExtra * delta / weightSum); + weightSum -= childExtra; + delta -= share; + + final int childHeightMeasureSpec = getChildMeasureSpec( + heightMeasureSpec, + getPaddingTop() + getPaddingBottom() + lp.topMargin + lp.bottomMargin, + lp.height); + + // TODO: Use a field like lp.isMeasured to figure out if this + // child has been previously measured + if ((lp.width != 0) || (widthMode != MeasureSpec.EXACTLY)) { + // child was measured once already above ... base new measurement + // on stored values + int childWidth = child.getMeasuredWidth() + share; + if (childWidth < 0) { + childWidth = 0; + } + + child.measure( + MeasureSpec.makeMeasureSpec(childWidth, MeasureSpec.EXACTLY), + childHeightMeasureSpec); + } else { + // child was skipped in the loop above. Measure for this first time here + child.measure(MeasureSpec.makeMeasureSpec( + share > 0 ? share : 0, MeasureSpec.EXACTLY), + childHeightMeasureSpec); + } + + // Child may now not fit in horizontal dimension. + childState = ViewUtils.combineMeasuredStates(childState, + ViewCompat.getMeasuredState(child) & ViewCompat.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 == 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 == LayoutParams.MATCH_PARENT; + + if (baselineAligned) { + final int childBaseline = child.getBaseline(); + if (childBaseline != -1) { + // Translates the child's vertical gravity into an index in the range 0..2 + 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); + } + } + } + + // Add in our padding + mTotalLength += getPaddingLeft() + getPaddingRight(); + // TODO: Should we update widthSize with the new total length? + + // Check mMaxAscent[INDEX_TOP] first because it maps to Gravity.TOP, + // the most common case + 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); + + // We have no limit, so make all weighted views as wide as the largest child. + // Children will have already been measured once. + 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 LinearLayoutCompat.LayoutParams lp = + (LinearLayoutCompat.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(); + + // Check against our minimum height + maxHeight = Math.max(maxHeight, getSuggestedMinimumHeight()); + + setMeasuredDimension(widthSizeAndState | (childState&ViewCompat.MEASURED_STATE_MASK), + ViewCompat.resolveSizeAndState(maxHeight, heightMeasureSpec, + (childState<Returns the number of children to skip after measuring/laying out + * the specified child.

      + * + * @param child the child after which we want to skip children + * @param index the index of the child after which we want to skip children + * @return the number of children to skip, 0 by default + */ + int getChildrenSkipCount(View child, int index) { + return 0; + } + + /** + *

      Returns the size (width or height) that should be occupied by a null + * child.

      + * + * @param childIndex the index of the null child + * @return the width or height of the child depending on the orientation + */ + int measureNullChild(int childIndex) { + return 0; + } + + /** + *

      Measure the child according to the parent's measure specs. This + * method should be overriden by subclasses to force the sizing of + * children. This method is called by {@link #measureVertical(int, int)} and + * {@link #measureHorizontal(int, int)}.

      + * + * @param child the child to measure + * @param childIndex the index of the child in this view + * @param widthMeasureSpec horizontal space requirements as imposed by the parent + * @param totalWidth extra space that has been used up by the parent horizontally + * @param heightMeasureSpec vertical space requirements as imposed by the parent + * @param totalHeight extra space that has been used up by the parent vertically + */ + void measureChildBeforeLayout(View child, int childIndex, + int widthMeasureSpec, int totalWidth, int heightMeasureSpec, + int totalHeight) { + measureChildWithMargins(child, widthMeasureSpec, totalWidth, + heightMeasureSpec, totalHeight); + } + + /** + *

      Return the location offset of the specified child. This can be used + * by subclasses to change the location of a given widget.

      + * + * @param child the child for which to obtain the location offset + * @return the location offset in pixels + */ + int getLocationOffset(View child) { + return 0; + } + + /** + *

      Return the size offset of the next sibling of the specified child. + * This can be used by subclasses to change the location of the widget + * following child.

      + * + * @param child the child whose next sibling will be moved + * @return the location offset of the next child in pixels + */ + int getNextLocationOffset(View child) { + return 0; + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + if (mOrientation == VERTICAL) { + layoutVertical(l, t, r, b); + } else { + layoutHorizontal(l, t, r, b); + } + } + + /** + * Position the children during a layout pass if the orientation of this + * LinearLayout is set to {@link #VERTICAL}. + * + * @see #getOrientation() + * @see #setOrientation(int) + * @see #onLayout(boolean, int, int, int, int) + * @param left + * @param top + * @param right + * @param bottom + */ + void layoutVertical(int left, int top, int right, int bottom) { + final int paddingLeft = getPaddingLeft(); + + int childTop; + int childLeft; + + // Where right end of child should go + final int width = right - left; + int childRight = width - getPaddingRight(); + + // Space available for child + int childSpace = width - paddingLeft - getPaddingRight(); + + final int count = getVirtualChildCount(); + + final int majorGravity = mGravity & Gravity.VERTICAL_GRAVITY_MASK; + final int minorGravity = mGravity & GravityCompat.RELATIVE_HORIZONTAL_GRAVITY_MASK; + + switch (majorGravity) { + case Gravity.BOTTOM: + // mTotalLength contains the padding already + childTop = getPaddingTop() + bottom - top - mTotalLength; + break; + + // mTotalLength contains the padding already + case Gravity.CENTER_VERTICAL: + childTop = getPaddingTop() + (bottom - top - 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 LinearLayoutCompat.LayoutParams lp = + (LinearLayoutCompat.LayoutParams) child.getLayoutParams(); + + int gravity = lp.gravity; + if (gravity < 0) { + gravity = minorGravity; + } + final int layoutDirection = ViewCompat.getLayoutDirection(this); + final int absoluteGravity = GravityCompat.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); + } + } + } + + /** + * Position the children during a layout pass if the orientation of this + * LinearLayout is set to {@link #HORIZONTAL}. + * + * @see #getOrientation() + * @see #setOrientation(int) + * @see #onLayout(boolean, int, int, int, int) + * @param left + * @param top + * @param right + * @param bottom + */ + void layoutHorizontal(int left, int top, int right, int bottom) { + final boolean isLayoutRtl = ViewUtils.isLayoutRtl(this); + final int paddingTop = getPaddingTop(); + + int childTop; + int childLeft; + + // Where bottom of child should go + final int height = bottom - top; + int childBottom = height - getPaddingBottom(); + + // Space available for child + int childSpace = height - paddingTop - getPaddingBottom(); + + final int count = getVirtualChildCount(); + + final int majorGravity = mGravity & GravityCompat.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 = ViewCompat.getLayoutDirection(this); + switch (GravityCompat.getAbsoluteGravity(majorGravity, layoutDirection)) { + case Gravity.RIGHT: + // mTotalLength contains the padding already + childLeft = getPaddingLeft() + right - left - mTotalLength; + break; + + case Gravity.CENTER_HORIZONTAL: + // mTotalLength contains the padding already + childLeft = getPaddingLeft() + (right - left - mTotalLength) / 2; + break; + + case Gravity.LEFT: + default: + childLeft = getPaddingLeft(); + break; + } + + int start = 0; + int dir = 1; + //In case of RTL, start drawing from the last child. + 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 LinearLayoutCompat.LayoutParams lp = + (LinearLayoutCompat.LayoutParams) child.getLayoutParams(); + + if (baselineAligned && lp.height != 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: + // Removed support for baseline alignment when layout_gravity or + // gravity == center_vertical. See bug #1038483. + // Keep the code around if we need to re-enable this feature + // if (childBaseline != -1) { + // // Align baselines vertically only if the child is smaller than us + // if (childSpace - childHeight > 0) { + // childTop = paddingTop + (childSpace / 2) - childBaseline; + // } else { + // childTop = paddingTop + (childSpace - childHeight) / 2; + // } + // } else { + 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); + } + } + } + + private void setChildFrame(View child, int left, int top, int width, int height) { + child.layout(left, top, left + width, top + height); + } + + /** + * Should the layout be a column or a row. + * @param orientation Pass {@link #HORIZONTAL} or {@link #VERTICAL}. Default + * value is {@link #HORIZONTAL}. + */ + public void setOrientation(@OrientationMode int orientation) { + if (mOrientation != orientation) { + mOrientation = orientation; + requestLayout(); + } + } + + /** + * Returns the current orientation. + * + * @return either {@link #HORIZONTAL} or {@link #VERTICAL} + */ + @OrientationMode + public int getOrientation() { + return mOrientation; + } + + /** + * Describes how the child views are positioned. Defaults to GRAVITY_TOP. If + * this layout has a VERTICAL orientation, this controls where all the child + * views are placed if there is extra vertical space. If this layout has a + * HORIZONTAL orientation, this controls the alignment of the children. + * + * @param gravity See {@link android.view.Gravity} + */ + public void setGravity(int gravity) { + if (mGravity != gravity) { + if ((gravity & GravityCompat.RELATIVE_HORIZONTAL_GRAVITY_MASK) == 0) { + gravity |= GravityCompat.START; + } + + if ((gravity & Gravity.VERTICAL_GRAVITY_MASK) == 0) { + gravity |= Gravity.TOP; + } + + mGravity = gravity; + requestLayout(); + } + } + + public void setHorizontalGravity(int horizontalGravity) { + final int gravity = horizontalGravity & GravityCompat.RELATIVE_HORIZONTAL_GRAVITY_MASK; + if ((mGravity & GravityCompat.RELATIVE_HORIZONTAL_GRAVITY_MASK) != gravity) { + mGravity = (mGravity & ~GravityCompat.RELATIVE_HORIZONTAL_GRAVITY_MASK) | gravity; + requestLayout(); + } + } + + 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 LayoutParams generateLayoutParams(AttributeSet attrs) { + return new LinearLayoutCompat.LayoutParams(getContext(), attrs); + } + + /** + * Returns a set of layout parameters with a width of + * {@link android.view.ViewGroup.LayoutParams#MATCH_PARENT} + * and a height of {@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT} + * when the layout's orientation is {@link #VERTICAL}. When the orientation is + * {@link #HORIZONTAL}, the width is set to {@link LayoutParams#WRAP_CONTENT} + * and the height to {@link LayoutParams#WRAP_CONTENT}. + */ + @Override + protected LayoutParams generateDefaultLayoutParams() { + if (mOrientation == HORIZONTAL) { + return new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); + } else if (mOrientation == VERTICAL) { + return new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); + } + return null; + } + + @Override + protected LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) { + return new LayoutParams(p); + } + + + // Override to allow type-checking of LayoutParams. + @Override + protected boolean checkLayoutParams(ViewGroup.LayoutParams p) { + return p instanceof LinearLayoutCompat.LayoutParams; + } + + public void onInitializeAccessibilityEvent(AccessibilityEvent event) { + if (Build.VERSION.SDK_INT >= 14) { + super.onInitializeAccessibilityEvent(event); + event.setClassName(LinearLayoutCompat.class.getName()); + } + } + + public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { + if (Build.VERSION.SDK_INT >= 14) { + super.onInitializeAccessibilityNodeInfo(info); + info.setClassName(LinearLayoutCompat.class.getName()); + } + } + + /** + * Per-child layout information associated with ViewLinearLayout. + */ + public static class LayoutParams extends ViewGroup.MarginLayoutParams { + /** + * Indicates how much of the extra space in the LinearLayout will be + * allocated to the view associated with these LayoutParams. Specify + * 0 if the view should not be stretched. Otherwise the extra pixels + * will be pro-rated among all views whose weight is greater than 0. + */ + public float weight; + + /** + * Gravity for the view associated with these LayoutParams. + * + * @see android.view.Gravity + */ + public int gravity = -1; + + /** + * {@inheritDoc} + */ + public LayoutParams(Context c, AttributeSet attrs) { + super(c, attrs); + TypedArray a = + c.obtainStyledAttributes(attrs, R.styleable.LinearLayoutCompat_Layout); + + weight = a.getFloat(R.styleable.LinearLayoutCompat_Layout_android_layout_weight, 0); + gravity = a.getInt(R.styleable.LinearLayoutCompat_Layout_android_layout_gravity, -1); + + a.recycle(); + } + + /** + * {@inheritDoc} + */ + public LayoutParams(int width, int height) { + super(width, height); + weight = 0; + } + + /** + * Creates a new set of layout parameters with the specified width, height + * and weight. + * + * @param width the width, either {@link #MATCH_PARENT}, + * {@link #WRAP_CONTENT} or a fixed size in pixels + * @param height the height, either {@link #MATCH_PARENT}, + * {@link #WRAP_CONTENT} or a fixed size in pixels + * @param weight the weight + */ + public LayoutParams(int width, int height, float weight) { + super(width, height); + this.weight = weight; + } + + /** + * {@inheritDoc} + */ + public LayoutParams(ViewGroup.LayoutParams p) { + super(p); + } + + /** + * {@inheritDoc} + */ + public LayoutParams(ViewGroup.MarginLayoutParams source) { + super(source); + } + + /** + * Copy constructor. Clones the width, height, margin values, weight, + * and gravity of the source. + * + * @param source The layout params to copy from. + */ + public LayoutParams(LayoutParams source) { + super(source); + + this.weight = source.weight; + this.gravity = source.gravity; + } + } +} diff --git a/android/support/v7/widget/ListPopupWindow.java b/android/support/v7/widget/ListPopupWindow.java new file mode 100644 index 0000000000..0d2bcb8720 --- /dev/null +++ b/android/support/v7/widget/ListPopupWindow.java @@ -0,0 +1,1780 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.widget; + +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; +import android.os.Handler; +import android.os.SystemClock; +import android.support.v4.text.TextUtilsCompat; +import android.support.v4.view.MotionEventCompat; +import android.support.v4.view.ViewPropertyAnimatorCompat; +import android.support.v4.widget.ListViewAutoScrollHelper; +import android.support.v4.widget.PopupWindowCompat; +import android.support.v7.appcompat.R; +import android.support.v7.internal.widget.AppCompatPopupWindow; +import android.support.v7.internal.widget.ListViewCompat; +import android.util.AttributeSet; +import android.util.Log; +import android.view.Gravity; +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.ViewConfiguration; +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; + +import java.lang.reflect.Method; +import java.util.Locale; + +/** + * Static library support version of the framework's {@link android.widget.ListPopupWindow}. + * Used to write apps that run on platforms prior to Android L. When running + * on Android L or above, this implementation is still used; it does not try + * to switch to the framework's implementation. See the framework SDK + * documentation for a class overview. + * + * @see android.widget.ListPopupWindow + */ +public class ListPopupWindow { + private static final String TAG = "ListPopupWindow"; + private static final boolean DEBUG = false; + + /** + * 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 static Method sClipToWindowEnabledMethod; + + static { + try { + sClipToWindowEnabledMethod = PopupWindow.class.getDeclaredMethod( + "setClipToScreenEnabled", boolean.class); + } catch (NoSuchMethodException e) { + Log.i(TAG, "Could not find method setClipToScreenEnabled() on PopupWindow. Oh well."); + } + } + + 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 mDropDownGravity = Gravity.NO_GRAVITY; + + private boolean mDropDownAlwaysVisible = false; + private boolean mForceIgnoreOutsideTouch = false; + 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 Runnable mShowDropDownRunnable; + + private Handler mHandler = new Handler(); + + private Rect mTempRect = new Rect(); + + private boolean mModal; + + private int mLayoutDirection; + + /** + * The provided prompt view should appear above list content. + * + * @see #setPromptPosition(int) + * @see #getPromptPosition() + * @see #setPromptView(View) + */ + public static final int POSITION_PROMPT_ABOVE = 0; + + /** + * The provided prompt view should appear below list content. + * + * @see #setPromptPosition(int) + * @see #getPromptPosition() + * @see #setPromptView(View) + */ + public static final int POSITION_PROMPT_BELOW = 1; + + /** + * Alias for {@link ViewGroup.LayoutParams#MATCH_PARENT}. + * If used to specify a popup width, the popup will match the width of the anchor view. + * If used to specify a popup height, the popup will fill available space. + */ + public static final int MATCH_PARENT = ViewGroup.LayoutParams.MATCH_PARENT; + + /** + * Alias for {@link ViewGroup.LayoutParams#WRAP_CONTENT}. + * If used to specify a popup width, the popup will use the width of its content. + */ + public static final int WRAP_CONTENT = ViewGroup.LayoutParams.WRAP_CONTENT; + + /** + * Mode for {@link #setInputMethodMode(int)}: the requirements for the + * input method should be based on the focusability of the popup. That is + * if it is focusable than it needs to work with the input method, else + * it doesn't. + */ + public static final int INPUT_METHOD_FROM_FOCUSABLE = PopupWindow.INPUT_METHOD_FROM_FOCUSABLE; + + /** + * Mode for {@link #setInputMethodMode(int)}: this popup always needs to + * work with an input method, regardless of whether it is focusable. This + * means that it will always be displayed so that the user can also operate + * the input method while it is shown. + */ + public static final int INPUT_METHOD_NEEDED = PopupWindow.INPUT_METHOD_NEEDED; + + /** + * Mode for {@link #setInputMethodMode(int)}: this popup never needs to + * work with an input method, regardless of whether it is focusable. This + * means that it will always be displayed to use as much space on the + * screen as needed, regardless of whether this covers the input method. + */ + public static final int INPUT_METHOD_NOT_NEEDED = PopupWindow.INPUT_METHOD_NOT_NEEDED; + + /** + * Create a new, empty popup window capable of displaying items from a ListAdapter. + * Backgrounds should be set using {@link #setBackgroundDrawable(Drawable)}. + * + * @param context Context used for contained views. + */ + public ListPopupWindow(Context context) { + this(context, null, R.attr.listPopupWindowStyle); + } + + /** + * Create a new, empty popup window capable of displaying items from a ListAdapter. + * Backgrounds should be set using {@link #setBackgroundDrawable(Drawable)}. + * + * @param context Context used for contained views. + * @param attrs Attributes from inflating parent views used to style the popup. + */ + public ListPopupWindow(Context context, AttributeSet attrs) { + this(context, attrs, R.attr.listPopupWindowStyle); + } + + /** + * Create a new, empty popup window capable of displaying items from a ListAdapter. + * Backgrounds should be set using {@link #setBackgroundDrawable(Drawable)}. + * + * @param context Context used for contained views. + * @param attrs Attributes from inflating parent views used to style the popup. + * @param defStyleAttr Default style attribute to use for popup content. + */ + public ListPopupWindow(Context context, AttributeSet attrs, int defStyleAttr) { + this(context, attrs, defStyleAttr, 0); + } + + /** + * Create a new, empty popup window capable of displaying items from a ListAdapter. + * Backgrounds should be set using {@link #setBackgroundDrawable(Drawable)}. + * + * @param context Context used for contained views. + * @param attrs Attributes from inflating parent views used to style the popup. + * @param defStyleAttr Style attribute to read for default styling of popup content. + * @param defStyleRes Style resource ID to use for default styling of popup content. + */ + public ListPopupWindow(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + mContext = context; + + final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ListPopupWindow, + defStyleAttr, defStyleRes); + mDropDownHorizontalOffset = a.getDimensionPixelOffset( + R.styleable.ListPopupWindow_android_dropDownHorizontalOffset, 0); + mDropDownVerticalOffset = a.getDimensionPixelOffset( + R.styleable.ListPopupWindow_android_dropDownVerticalOffset, 0); + if (mDropDownVerticalOffset != 0) { + mDropDownVerticalOffsetSet = true; + } + a.recycle(); + + mPopup = new AppCompatPopupWindow(context, attrs, defStyleAttr); + mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED); + + // Set the default layout direction to match the default locale one + final Locale locale = mContext.getResources().getConfiguration().locale; + mLayoutDirection = TextUtilsCompat.getLayoutDirectionFromLocale(locale); + } + + /** + * Sets the adapter that provides the data and the views to represent the data + * in this popup window. + * + * @param adapter The adapter to use to create this window's content. + */ + 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); + } + } + + /** + * Set where the optional prompt view should appear. The default is + * {@link #POSITION_PROMPT_ABOVE}. + * + * @param position A position constant declaring where the prompt should be displayed. + * + * @see #POSITION_PROMPT_ABOVE + * @see #POSITION_PROMPT_BELOW + */ + public void setPromptPosition(int position) { + mPromptPosition = position; + } + + /** + * @return Where the optional prompt view should appear. + * + * @see #POSITION_PROMPT_ABOVE + * @see #POSITION_PROMPT_BELOW + */ + public int getPromptPosition() { + return mPromptPosition; + } + + /** + * Set whether this window should be modal when shown. + * + *

      If a popup window is modal, it will receive all touch and key input. + * If the user touches outside the popup window's content area the popup window + * will be dismissed. + * + * @param modal {@code true} if the popup window should be modal, {@code false} otherwise. + */ + public void setModal(boolean modal) { + mModal = modal; + mPopup.setFocusable(modal); + } + + /** + * Returns whether the popup window will be modal when shown. + * + * @return {@code true} if the popup window will be modal, {@code false} otherwise. + */ + public boolean isModal() { + return mModal; + } + + /** + * Forces outside touches to be ignored. Normally if {@link #isDropDownAlwaysVisible()} is + * false, we allow outside touch to dismiss the dropdown. If this is set to true, then we + * ignore outside touch even when the drop down is not set to always visible. + * + * @hide Used only by AutoCompleteTextView to handle some internal special cases. + */ + public void setForceIgnoreOutsideTouch(boolean forceIgnoreOutsideTouch) { + mForceIgnoreOutsideTouch = forceIgnoreOutsideTouch; + } + + /** + * Sets whether the drop-down should remain visible under certain conditions. + * + * The drop-down will occupy the entire screen below {@link #getAnchorView} regardless + * of the size or content of the list. {@link #getBackground()} will fill any space + * that is not used by the list. + * + * @param dropDownAlwaysVisible Whether to keep the drop-down visible. + * + * @hide Only used by AutoCompleteTextView under special conditions. + */ + public void setDropDownAlwaysVisible(boolean dropDownAlwaysVisible) { + mDropDownAlwaysVisible = dropDownAlwaysVisible; + } + + /** + * @return Whether the drop-down is visible under special conditions. + * + * @hide Only used by AutoCompleteTextView under special conditions. + */ + public boolean isDropDownAlwaysVisible() { + return mDropDownAlwaysVisible; + } + + /** + * Sets the operating mode for the soft input area. + * + * @param mode The desired mode, see + * {@link android.view.WindowManager.LayoutParams#softInputMode} + * for the full list + * + * @see android.view.WindowManager.LayoutParams#softInputMode + * @see #getSoftInputMode() + */ + public void setSoftInputMode(int mode) { + mPopup.setSoftInputMode(mode); + } + + /** + * Returns the current value in {@link #setSoftInputMode(int)}. + * + * @see #setSoftInputMode(int) + * @see android.view.WindowManager.LayoutParams#softInputMode + */ + public int getSoftInputMode() { + return mPopup.getSoftInputMode(); + } + + /** + * Sets a drawable to use as the list item selector. + * + * @param selector List selector drawable to use in the popup. + */ + public void setListSelector(Drawable selector) { + mDropDownListHighlight = selector; + } + + /** + * @return The background drawable for the popup window. + */ + public Drawable getBackground() { + return mPopup.getBackground(); + } + + /** + * Sets a drawable to be the background for the popup window. + * + * @param d A drawable to set as the background. + */ + public void setBackgroundDrawable(Drawable d) { + mPopup.setBackgroundDrawable(d); + } + + /** + * Set an animation style to use when the popup window is shown or dismissed. + * + * @param animationStyle Animation style to use. + */ + public void setAnimationStyle(int animationStyle) { + mPopup.setAnimationStyle(animationStyle); + } + + /** + * Returns the animation style that will be used when the popup window is shown or dismissed. + * + * @return Animation style that will be used. + */ + public int getAnimationStyle() { + return mPopup.getAnimationStyle(); + } + + /** + * Returns the view that will be used to anchor this popup. + * + * @return The popup's anchor view + */ + public View getAnchorView() { + return mDropDownAnchorView; + } + + /** + * Sets the popup's anchor view. This popup will always be positioned relative to the anchor + * view when shown. + * + * @param anchor The view to use as an anchor. + */ + public void setAnchorView(View anchor) { + mDropDownAnchorView = anchor; + } + + /** + * @return The horizontal offset of the popup from its anchor in pixels. + */ + public int getHorizontalOffset() { + return mDropDownHorizontalOffset; + } + + /** + * Set the horizontal offset of this popup from its anchor view in pixels. + * + * @param offset The horizontal offset of the popup from its anchor. + */ + public void setHorizontalOffset(int offset) { + mDropDownHorizontalOffset = offset; + } + + /** + * @return The vertical offset of the popup from its anchor in pixels. + */ + public int getVerticalOffset() { + if (!mDropDownVerticalOffsetSet) { + return 0; + } + return mDropDownVerticalOffset; + } + + /** + * Set the vertical offset of this popup from its anchor view in pixels. + * + * @param offset The vertical offset of the popup from its anchor. + */ + public void setVerticalOffset(int offset) { + mDropDownVerticalOffset = offset; + mDropDownVerticalOffsetSet = true; + } + + /** + * Set the gravity of the dropdown list. This is commonly used to + * set gravity to START or END for alignment with the anchor. + * + * @param gravity Gravity value to use + */ + public void setDropDownGravity(int gravity) { + mDropDownGravity = gravity; + } + + /** + * @return The width of the popup window in pixels. + */ + public int getWidth() { + return mDropDownWidth; + } + + /** + * Sets the width of the popup window in pixels. Can also be {@link #MATCH_PARENT} + * or {@link #WRAP_CONTENT}. + * + * @param width Width of the popup window. + */ + public void setWidth(int width) { + mDropDownWidth = width; + } + + /** + * Sets the width of the popup window by the size of its content. The final width may be + * larger to accommodate styled window dressing. + * + * @param width Desired width of content in pixels. + */ + public void setContentWidth(int width) { + Drawable popupBackground = mPopup.getBackground(); + if (popupBackground != null) { + popupBackground.getPadding(mTempRect); + mDropDownWidth = mTempRect.left + mTempRect.right + width; + } else { + setWidth(width); + } + } + + /** + * @return The height of the popup window in pixels. + */ + public int getHeight() { + return mDropDownHeight; + } + + /** + * Sets the height of the popup window in pixels. Can also be {@link #MATCH_PARENT}. + * + * @param height Height of the popup window. + */ + public void setHeight(int height) { + mDropDownHeight = height; + } + + /** + * Sets a listener to receive events when a list item is clicked. + * + * @param clickListener Listener to register + * + * @see ListView#setOnItemClickListener(android.widget.AdapterView.OnItemClickListener) + */ + public void setOnItemClickListener(AdapterView.OnItemClickListener clickListener) { + mItemClickListener = clickListener; + } + + /** + * Sets a listener to receive events when a list item is selected. + * + * @param selectedListener Listener to register. + * + * @see ListView#setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener) + */ + public void setOnItemSelectedListener(AdapterView.OnItemSelectedListener selectedListener) { + mItemSelectedListener = selectedListener; + } + + /** + * Set a view to act as a user prompt for this popup window. Where the prompt view will appear + * is controlled by {@link #setPromptPosition(int)}. + * + * @param prompt View to use as an informational prompt. + */ + public void setPromptView(View prompt) { + boolean showing = isShowing(); + if (showing) { + removePromptView(); + } + mPromptView = prompt; + if (showing) { + show(); + } + } + + /** + * Post a {@link #show()} call to the UI thread. + */ + public void postShow() { + mHandler.post(mShowDropDownRunnable); + } + + /** + * Show the popup list. If the list is already showing, this method + * will recalculate the popup's size and position. + */ + public void show() { + int height = buildDropDown(); + + int widthSpec = 0; + int heightSpec = 0; + + boolean noInputMethod = isInputMethodNotNeeded(); + + 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 = getAnchorView().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(!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); + setPopupClipToScreenEnabled(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(!mForceIgnoreOutsideTouch && !mDropDownAlwaysVisible); + mPopup.setTouchInterceptor(mTouchInterceptor); + PopupWindowCompat.showAsDropDown(mPopup, getAnchorView(), mDropDownHorizontalOffset, + mDropDownVerticalOffset, mDropDownGravity); + mDropDownList.setSelection(ListView.INVALID_POSITION); + + if (!mModal || mDropDownList.isInTouchMode()) { + clearListSelection(); + } + if (!mModal) { + mHandler.post(mHideSelector); + } + } + } + + /** + * Dismiss the popup window. + */ + public void dismiss() { + mPopup.dismiss(); + removePromptView(); + mPopup.setContentView(null); + mDropDownList = null; + mHandler.removeCallbacks(mResizePopupRunnable); + } + + /** + * Set a listener to receive a callback when the popup is dismissed. + * + * @param listener Listener that will be notified when the popup is dismissed. + */ + public void setOnDismissListener(PopupWindow.OnDismissListener listener) { + mPopup.setOnDismissListener(listener); + } + + private void removePromptView() { + if (mPromptView != null) { + final ViewParent parent = mPromptView.getParent(); + if (parent instanceof ViewGroup) { + final ViewGroup group = (ViewGroup) parent; + group.removeView(mPromptView); + } + } + } + + /** + * Control how the popup operates with an input method: one of + * {@link #INPUT_METHOD_FROM_FOCUSABLE}, {@link #INPUT_METHOD_NEEDED}, + * or {@link #INPUT_METHOD_NOT_NEEDED}. + * + *

      If the popup is showing, calling this method will take effect only + * the next time the popup is shown or through a manual call to the {@link #show()} + * method.

      + * + * @see #getInputMethodMode() + * @see #show() + */ + public void setInputMethodMode(int mode) { + mPopup.setInputMethodMode(mode); + } + + /** + * Return the current value in {@link #setInputMethodMode(int)}. + * + * @see #setInputMethodMode(int) + */ + public int getInputMethodMode() { + return mPopup.getInputMethodMode(); + } + + /** + * 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 (Build.VERSION.SDK_INT >= 11) { + if (list.getChoiceMode() != ListView.CHOICE_MODE_NONE) { + list.setItemChecked(position, true); + } + } + } + } + + /** + * Clear any current list selection. + * Only valid when {@link #isShowing()} == {@code true}. + */ + public void clearListSelection() { + final DropDownListView list = mDropDownList; + if (list != null) { + // WARNING: Please read the comment where mListSelectionHidden is declared + list.mListSelectionHidden = true; + //list.hideSelector(); + list.requestLayout(); + } + } + + /** + * @return {@code true} if the popup is currently showing, {@code false} otherwise. + */ + public boolean isShowing() { + return mPopup.isShowing(); + } + + /** + * @return {@code true} if this popup is configured to assume the user does not need + * to interact with the IME while it is showing, {@code false} otherwise. + */ + public boolean isInputMethodNotNeeded() { + return mPopup.getInputMethodMode() == INPUT_METHOD_NOT_NEEDED; + } + + /** + * Perform an item click operation on the specified list adapter position. + * + * @param position Adapter position for performing the click + * @return true if the click action could be performed, false if not. + * (e.g. if the popup was not showing, this method would 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; + } + + /** + * @return The currently selected item or null if the popup is not showing. + */ + public Object getSelectedItem() { + if (!isShowing()) { + return null; + } + return mDropDownList.getSelectedItem(); + } + + /** + * @return The position of the currently selected item or {@link ListView#INVALID_POSITION} + * if {@link #isShowing()} == {@code false}. + * + * @see ListView#getSelectedItemPosition() + */ + public int getSelectedItemPosition() { + if (!isShowing()) { + return ListView.INVALID_POSITION; + } + return mDropDownList.getSelectedItemPosition(); + } + + /** + * @return The ID of the currently selected item or {@link ListView#INVALID_ROW_ID} + * if {@link #isShowing()} == {@code false}. + * + * @see ListView#getSelectedItemId() + */ + public long getSelectedItemId() { + if (!isShowing()) { + return ListView.INVALID_ROW_ID; + } + return mDropDownList.getSelectedItemId(); + } + + /** + * @return The View for the currently selected item or null if + * {@link #isShowing()} == {@code false}. + * + * @see ListView#getSelectedView() + */ + public View getSelectedView() { + if (!isShowing()) { + return null; + } + return mDropDownList.getSelectedView(); + } + + /** + * @return The {@link ListView} displayed within the popup window. + * Only valid when {@link #isShowing()} == {@code true}. + */ + public ListView getListView() { + return mDropDownList; + } + + /** + * The maximum number of list items that can be visible and still have + * the list expand when touched. + * + * @param max Max number of items that can be visible and still allow the list to expand. + */ + void setListItemExpandMax(int max) { + mListItemExpandMaximum = max; + } + + /** + * Filter key down events. By forwarding key down events to this function, + * views using non-modal ListPopupWindow can have it handle key selection of items. + * + * @param keyCode keyCode param passed to the host view's onKeyDown + * @param event event param passed to the host view's onKeyDown + * @return true if the event was handled, false if it was ignored. + * + * @see #setModal(boolean) + */ + public boolean onKeyDown(int keyCode, KeyEvent event) { + // when the drop down is shown, we drive it directly + if (isShowing()) { + // the key events are forwarded to the list in the drop down view + // note that ListView handles space but we don't want that to happen + // also if selection is not currently in the drop down, then don't + // let center or enter presses go there since that would cause it + // to select one of its items + if (keyCode != KeyEvent.KEYCODE_SPACE + && (mDropDownList.getSelectedItemPosition() >= 0 + || !isConfirmKey(keyCode))) { + int curIndex = mDropDownList.getSelectedItemPosition(); + boolean consumed; + + final boolean below = !mPopup.isAboveAnchor(); + + final ListAdapter adapter = mAdapter; + + boolean allEnabled; + int firstItem = Integer.MAX_VALUE; + int lastItem = Integer.MIN_VALUE; + + if (adapter != null) { + allEnabled = adapter.areAllItemsEnabled(); + 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)) { + // When the selection is at the top, we block the key + // event to prevent focus from moving. + clearListSelection(); + mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED); + show(); + return true; + } else { + // WARNING: Please read the comment where mListSelectionHidden + // is declared + mDropDownList.mListSelectionHidden = false; + } + + consumed = mDropDownList.onKeyDown(keyCode, event); + if (DEBUG) Log.v(TAG, "Key down: code=" + keyCode + " list consumed=" + consumed); + + if (consumed) { + // If it handled the key event, then the user is + // navigating in the list, so we should put it in front. + mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NOT_NEEDED); + // Here's a little trick we need to do to make sure that + // the list view is actually showing its focus indicator, + // by ensuring it has focus and getting its window out + // of touch mode. + mDropDownList.requestFocusFromTouch(); + show(); + + switch (keyCode) { + // avoid passing the focus from the text view to the + // next component + 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) { + // when the selection is at the bottom, we block the + // event to avoid going to the next focusable widget + if (curIndex == lastItem) { + return true; + } + } else if (!below && keyCode == KeyEvent.KEYCODE_DPAD_UP && + curIndex == firstItem) { + return true; + } + } + } + } + + return false; + } + + /** + * Filter key down events. By forwarding key up events to this function, + * views using non-modal ListPopupWindow can have it handle key selection of items. + * + * @param keyCode keyCode param passed to the host view's onKeyUp + * @param event event param passed to the host view's onKeyUp + * @return true if the event was handled, false if it was ignored. + * + * @see #setModal(boolean) + */ + public boolean onKeyUp(int keyCode, KeyEvent event) { + if (isShowing() && mDropDownList.getSelectedItemPosition() >= 0) { + boolean consumed = mDropDownList.onKeyUp(keyCode, event); + if (consumed && isConfirmKey(keyCode)) { + // if the list accepts the key events and the key event was a click, the text view + // gets the selected item from the drop down as its content + dismiss(); + } + return consumed; + } + return false; + } + + /** + * Filter pre-IME key events. By forwarding {@link View#onKeyPreIme(int, KeyEvent)} + * events to this function, views using ListPopupWindow can have it dismiss the popup + * when the back key is pressed. + * + * @param keyCode keyCode param passed to the host view's onKeyPreIme + * @param event event param passed to the host view's onKeyPreIme + * @return true if the event was handled, false if it was ignored. + * + * @see #setModal(boolean) + */ + public boolean onKeyPreIme(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK && isShowing()) { + // special case for the back key, we do not even try to send it + // to the drop down list but instead, consume it immediately + 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; + } + + /** + * Returns an {@link OnTouchListener} that can be added to the source view + * to implement drag-to-open behavior. Generally, the source view should be + * the same view that was passed to {@link #setAnchorView}. + *

      + * When the listener is set on a view, touching that view and dragging + * outside of its bounds will open the popup window. Lifting will select the + * currently touched list item. + *

      + * Example usage: + *

      +     * ListPopupWindow myPopup = new ListPopupWindow(context);
      +     * myPopup.setAnchor(myAnchor);
      +     * OnTouchListener dragListener = myPopup.createDragToOpenListener(myAnchor);
      +     * myAnchor.setOnTouchListener(dragListener);
      +     * 
      + * + * @param src the view on which the resulting listener will be set + * @return a touch listener that controls drag-to-open behavior + */ + public OnTouchListener createDragToOpenListener(View src) { + return new ForwardingListener(src) { + @Override + public ListPopupWindow getPopup() { + return ListPopupWindow.this; + } + }; + } + + /** + *

      Builds the popup window's content and returns the height the popup + * should have. Returns -1 when the content already exists.

      + * + * @return the content's height or -1 if content already exists + */ + private int buildDropDown() { + ViewGroup dropDownView; + int otherHeights = 0; + + if (mDropDownList == null) { + Context context = mContext; + + /** + * This Runnable exists for the sole purpose of checking if the view layout has got + * completed and if so call showDropDown to display the drop down. This is used to show + * the drop down as soon as possible after user opens up the search dialog, without + * waiting for the normal UI pipeline to do it's job which is slower than this method. + */ + mShowDropDownRunnable = new Runnable() { + public void run() { + // View layout should be all done before displaying the drop down. + 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() { + 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 a 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: + Log.e(TAG, "Invalid hint position " + mPromptPosition); + 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; + } + } else { + mTempRect.setEmpty(); + } + + // Max height available on the screen for a popup. + boolean ignoreBottomDecorations = + mPopup.getInputMethodMode() == PopupWindow.INPUT_METHOD_NOT_NEEDED; + final int maxHeight = mPopup.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 = mDropDownList.measureHeightOfChildrenCompat(childWidthSpec, + 0, DropDownListView.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; + } + + /** + * Abstract class that forwards touch events to a {@link ListPopupWindow}. + * + * @hide + */ + public static abstract class ForwardingListener implements View.OnTouchListener { + /** Scaled touch slop, used for detecting movement outside bounds. */ + private final float mScaledTouchSlop; + + /** Timeout before disallowing intercept on the source's parent. */ + private final int mTapTimeout; + /** Timeout before accepting a long-press to start forwarding. */ + private final int mLongPressTimeout; + + /** Source view from which events are forwarded. */ + private final View mSrc; + + /** Runnable used to prevent conflicts with scrolling parents. */ + private Runnable mDisallowIntercept; + /** Runnable used to trigger forwarding on long-press. */ + private Runnable mTriggerLongPress; + + /** Whether this listener is currently forwarding touch events. */ + private boolean mForwarding; + /** + * Whether forwarding was initiated by a long-press. If so, we won't + * force the window to dismiss when the touch stream ends. + */ + private boolean mWasLongPress; + + /** The id of the first pointer down in the current event stream. */ + private int mActivePointerId; + + /** + * Temporary Matrix instance + */ + private final int[] mTmpLocation = new int[2]; + + public ForwardingListener(View src) { + mSrc = src; + mScaledTouchSlop = ViewConfiguration.get(src.getContext()).getScaledTouchSlop(); + mTapTimeout = ViewConfiguration.getTapTimeout(); + // Use a medium-press timeout. Halfway between tap and long-press. + mLongPressTimeout = (mTapTimeout + ViewConfiguration.getLongPressTimeout()) / 2; + } + + /** + * Returns the popup to which this listener is forwarding events. + *

      + * Override this to return the correct popup. If the popup is displayed + * asynchronously, you may also need to override + * {@link #onForwardingStopped} to prevent premature cancelation of + * forwarding. + * + * @return the popup to which this listener is forwarding events + */ + public abstract ListPopupWindow getPopup(); + + @Override + public boolean onTouch(View v, MotionEvent event) { + final boolean wasForwarding = mForwarding; + final boolean forwarding; + if (wasForwarding) { + if (mWasLongPress) { + // If we started forwarding as a result of a long-press, + // just silently stop forwarding events so that the window + // stays open. + forwarding = onTouchForwarded(event); + } else { + forwarding = onTouchForwarded(event) || !onForwardingStopped(); + } + } else { + forwarding = onTouchObserved(event) && onForwardingStarted(); + + if (forwarding) { + // Make sure we cancel any ongoing source event stream. + final long now = SystemClock.uptimeMillis(); + final MotionEvent e = MotionEvent.obtain(now, now, MotionEvent.ACTION_CANCEL, + 0.0f, 0.0f, 0); + mSrc.onTouchEvent(e); + e.recycle(); + } + } + + mForwarding = forwarding; + return forwarding || wasForwarding; + } + + /** + * Called when forwarding would like to start.

      By default, this will show the popup + * returned by {@link #getPopup()}. It may be overridden to perform another action, like + * clicking the source view or preparing the popup before showing it. + * + * @return true to start forwarding, false otherwise + */ + protected boolean onForwardingStarted() { + final ListPopupWindow popup = getPopup(); + if (popup != null && !popup.isShowing()) { + popup.show(); + } + return true; + } + + /** + * Called when forwarding would like to stop.

      By default, this will dismiss the popup + * returned by {@link #getPopup()}. It may be overridden to perform some other action. + * + * @return true to stop forwarding, false otherwise + */ + protected boolean onForwardingStopped() { + final ListPopupWindow popup = getPopup(); + if (popup != null && popup.isShowing()) { + popup.dismiss(); + } + return true; + } + + /** + * Observes motion events and determines when to start forwarding. + * + * @param srcEvent motion event in source view coordinates + * @return true to start forwarding motion events, false otherwise + */ + private boolean onTouchObserved(MotionEvent srcEvent) { + final View src = mSrc; + if (!src.isEnabled()) { + return false; + } + + final int actionMasked = MotionEventCompat.getActionMasked(srcEvent); + switch (actionMasked) { + case MotionEvent.ACTION_DOWN: + mActivePointerId = srcEvent.getPointerId(0); + mWasLongPress = false; + + if (mDisallowIntercept == null) { + mDisallowIntercept = new DisallowIntercept(); + } + src.postDelayed(mDisallowIntercept, mTapTimeout); + if (mTriggerLongPress == null) { + mTriggerLongPress = new TriggerLongPress(); + } + src.postDelayed(mTriggerLongPress, mLongPressTimeout); + break; + case MotionEvent.ACTION_MOVE: + final int activePointerIndex = srcEvent.findPointerIndex(mActivePointerId); + if (activePointerIndex >= 0) { + final float x = srcEvent.getX(activePointerIndex); + final float y = srcEvent.getY(activePointerIndex); + if (!pointInView(src, x, y, mScaledTouchSlop)) { + clearCallbacks(); + + // Don't let the parent intercept our events. + src.getParent().requestDisallowInterceptTouchEvent(true); + return true; + } + } + break; + case MotionEvent.ACTION_CANCEL: + case MotionEvent.ACTION_UP: + clearCallbacks(); + break; + } + + return false; + } + + private void clearCallbacks() { + if (mTriggerLongPress != null) { + mSrc.removeCallbacks(mTriggerLongPress); + } + + if (mDisallowIntercept != null) { + mSrc.removeCallbacks(mDisallowIntercept); + } + } + + private void onLongPress() { + clearCallbacks(); + + final View src = mSrc; + if (!src.isEnabled() || src.isLongClickable()) { + // Ignore long-press if the view is disabled or has its own + // handler. + return; + } + + if (!onForwardingStarted()) { + return; + } + + // Don't let the parent intercept our events. + src.getParent().requestDisallowInterceptTouchEvent(true); + + // Make sure we cancel any ongoing source event stream. + final long now = SystemClock.uptimeMillis(); + final MotionEvent e = MotionEvent.obtain(now, now, MotionEvent.ACTION_CANCEL, 0, 0, 0); + src.onTouchEvent(e); + e.recycle(); + + mForwarding = true; + mWasLongPress = true; + } + + /** + * Handled forwarded motion events and determines when to stop forwarding. + * + * @param srcEvent motion event in source view coordinates + * @return true to continue forwarding motion events, false to cancel + */ + private boolean onTouchForwarded(MotionEvent srcEvent) { + final View src = mSrc; + final ListPopupWindow popup = getPopup(); + if (popup == null || !popup.isShowing()) { + return false; + } + + final DropDownListView dst = popup.mDropDownList; + if (dst == null || !dst.isShown()) { + return false; + } + + // Convert event to destination-local coordinates. + final MotionEvent dstEvent = MotionEvent.obtainNoHistory(srcEvent); + toGlobalMotionEvent(src, dstEvent); + toLocalMotionEvent(dst, dstEvent); + + // Forward converted event to destination view, then recycle it. + final boolean handled = dst.onForwardedEvent(dstEvent, mActivePointerId); + dstEvent.recycle(); + + // Always cancel forwarding when the touch stream ends. + final int action = MotionEventCompat.getActionMasked(srcEvent); + final boolean keepForwarding = action != MotionEvent.ACTION_UP + && action != MotionEvent.ACTION_CANCEL; + + return handled && keepForwarding; + } + + private static boolean pointInView(View view, float localX, float localY, float slop) { + return localX >= -slop && localY >= -slop && + localX < ((view.getRight() - view.getLeft()) + slop) && + localY < ((view.getBottom() - view.getTop()) + slop); + } + + /** + * Emulates View.toLocalMotionEvent(). This implementation does not handle transformations + * (scaleX, scaleY, etc). + */ + private boolean toLocalMotionEvent(View view, MotionEvent event) { + final int[] loc = mTmpLocation; + view.getLocationOnScreen(loc); + event.offsetLocation(-loc[0], -loc[1]); + return true; + } + + /** + * Emulates View.toGlobalMotionEvent(). This implementation does not handle transformations + * (scaleX, scaleY, etc). + */ + private boolean toGlobalMotionEvent(View view, MotionEvent event) { + final int[] loc = mTmpLocation; + view.getLocationOnScreen(loc); + event.offsetLocation(loc[0], loc[1]); + return true; + } + + private class DisallowIntercept implements Runnable { + @Override + public void run() { + final ViewParent parent = mSrc.getParent(); + parent.requestDisallowInterceptTouchEvent(true); + } + } + + private class TriggerLongPress implements Runnable { + @Override + public void run() { + onLongPress(); + } + } + } + + /** + *

      Wrapper class for a ListView. This wrapper can hijack the focus to + * make sure the list uses the appropriate drawables and states when + * displayed on screen within a drop down. The focus is never actually + * passed to the drop down in this mode; the list only looks focused.

      + */ + private static class DropDownListView extends ListViewCompat { + + /* + * 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; + + /** + * True if this wrapper should fake focus. + */ + private boolean mHijackFocus; + + /** Whether to force drawing of the pressed state selector. */ + private boolean mDrawsInPressedState; + + /** Current drag-to-open click animation, if any. */ + private ViewPropertyAnimatorCompat mClickAnimation; + + /** Helper for drag-to-open auto scrolling. */ + private ListViewAutoScrollHelper mScrollHelper; + + /** + *

      Creates a new list view wrapper.

      + * + * @param context this view's context + */ + public DropDownListView(Context context, boolean hijackFocus) { + super(context, null, R.attr.dropDownListViewStyle); + mHijackFocus = hijackFocus; + setCacheColorHint(0); // Transparent, since the background drawable could be anything. + } + + /** + * Handles forwarded events. + * + * @param activePointerId id of the pointer that activated forwarding + * @return whether the event was handled + */ + public boolean onForwardedEvent(MotionEvent event, int activePointerId) { + boolean handledEvent = true; + boolean clearPressedItem = false; + + final int actionMasked = MotionEventCompat.getActionMasked(event); + switch (actionMasked) { + case MotionEvent.ACTION_CANCEL: + handledEvent = false; + break; + case MotionEvent.ACTION_UP: + handledEvent = false; + // $FALL-THROUGH$ + case MotionEvent.ACTION_MOVE: + final int activeIndex = event.findPointerIndex(activePointerId); + if (activeIndex < 0) { + handledEvent = false; + break; + } + + final int x = (int) event.getX(activeIndex); + final int y = (int) event.getY(activeIndex); + final int position = pointToPosition(x, y); + if (position == INVALID_POSITION) { + clearPressedItem = true; + break; + } + + final View child = getChildAt(position - getFirstVisiblePosition()); + setPressedItem(child, position, x, y); + handledEvent = true; + + if (actionMasked == MotionEvent.ACTION_UP) { + clickPressedItem(child, position); + } + break; + } + + // Failure to handle the event cancels forwarding. + if (!handledEvent || clearPressedItem) { + clearPressedItem(); + } + + // Manage automatic scrolling. + if (handledEvent) { + if (mScrollHelper == null) { + mScrollHelper = new ListViewAutoScrollHelper(this); + } + mScrollHelper.setEnabled(true); + mScrollHelper.onTouch(this, event); + } else if (mScrollHelper != null) { + mScrollHelper.setEnabled(false); + } + + return handledEvent; + } + + /** + * Starts an alpha animation on the selector. When the animation ends, + * the list performs a click on the item. + */ + private void clickPressedItem(final View child, final int position) { + final long id = getItemIdAtPosition(position); + performItemClick(child, position, id); + } + + private void clearPressedItem() { + mDrawsInPressedState = false; + setPressed(false); + // This will call through to updateSelectorState() + drawableStateChanged(); + + if (mClickAnimation != null) { + mClickAnimation.cancel(); + mClickAnimation = null; + } + } + + private void setPressedItem(View child, int position, float x, float y) { + mDrawsInPressedState = true; + + // Ordering is essential. First update the pressed state and layout + // the children. This will ensure the selector actually gets drawn. + setPressed(true); + layoutChildren(); + + // Ensure that keyboard focus starts from the last touched position. + setSelection(position); + positionSelectorLikeTouchCompat(position, child, x, y); + + // This needs some explanation. We need to disable the selector for this next call + // due to the way that ListViewCompat works. Otherwise both ListView and ListViewCompat + // will draw the selector and bad things happen. + setSelectorEnabled(false); + + // Refresh the drawable state to reflect the new pressed state, + // which will also update the selector state. + refreshDrawableState(); + } + + @Override + protected boolean touchModeDrawsInPressedStateCompat() { + return mDrawsInPressedState || super.touchModeDrawsInPressedStateCompat(); + } + + @Override + public boolean isInTouchMode() { + // WARNING: Please read the comment where mListSelectionHidden is declared + return (mHijackFocus && mListSelectionHidden) || super.isInTouchMode(); + } + + /** + *

      Returns the focus state in the drop down.

      + * + * @return true always if hijacking focus + */ + @Override + public boolean hasWindowFocus() { + return mHijackFocus || super.hasWindowFocus(); + } + + /** + *

      Returns the focus state in the drop down.

      + * + * @return true always if hijacking focus + */ + @Override + public boolean isFocused() { + return mHijackFocus || super.isFocused(); + } + + /** + *

      Returns the focus state in the drop down.

      + * + * @return true always if hijacking focus + */ + @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(); + } + } + } + + private static boolean isConfirmKey(int keyCode) { + return keyCode == KeyEvent.KEYCODE_ENTER || keyCode == KeyEvent.KEYCODE_DPAD_CENTER; + } + + private void setPopupClipToScreenEnabled(boolean clip) { + if (sClipToWindowEnabledMethod != null) { + try { + sClipToWindowEnabledMethod.invoke(mPopup, clip); + } catch (Exception e) { + Log.i(TAG, "Could not call setClipToScreenEnabled() on PopupWindow. Oh well."); + } + } + } + +} \ No newline at end of file diff --git a/android/support/v7/widget/PopupMenu.java b/android/support/v7/widget/PopupMenu.java new file mode 100644 index 0000000000..5b7d333bdc --- /dev/null +++ b/android/support/v7/widget/PopupMenu.java @@ -0,0 +1,282 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.widget; + + +import android.content.Context; +import android.support.annotation.MenuRes; +import android.support.v7.appcompat.R; +import android.support.v7.internal.view.SupportMenuInflater; +import android.support.v7.internal.view.menu.MenuBuilder; +import android.support.v7.internal.view.menu.MenuPopupHelper; +import android.support.v7.internal.view.menu.MenuPresenter; +import android.support.v7.internal.view.menu.SubMenuBuilder; +import android.view.Gravity; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; + +/** + * Static library support version of the framework's {@link android.widget.PopupMenu}. + * Used to write apps that run on platforms prior to Android 3.0. When running + * on Android 3.0 or above, this implementation is still used; it does not try + * to switch to the framework's implementation. See the framework SDK + * documentation for a class overview. + */ +public class PopupMenu implements MenuBuilder.Callback, MenuPresenter.Callback { + private Context mContext; + private MenuBuilder mMenu; + private View mAnchor; + private MenuPopupHelper mPopup; + private OnMenuItemClickListener mMenuItemClickListener; + private OnDismissListener mDismissListener; + private View.OnTouchListener mDragListener; + + /** + * Callback interface used to notify the application that the menu has closed. + */ + public interface OnDismissListener { + /** + * Called when the associated menu has been dismissed. + * + * @param menu The PopupMenu that was dismissed. + */ + public void onDismiss(PopupMenu menu); + } + + /** + * Construct a new PopupMenu. + * + * @param context Context for the PopupMenu. + * @param anchor Anchor view for this popup. The popup will appear below the anchor if there + * is room, or above it if there is not. + */ + public PopupMenu(Context context, View anchor) { + this(context, anchor, Gravity.NO_GRAVITY); + } + + /** + * Constructor to create a new popup menu with an anchor view and alignment + * gravity. + * + * @param context Context the popup menu is running in, through which it + * can access the current theme, resources, etc. + * @param anchor Anchor view for this popup. The popup will appear below + * the anchor if there is room, or above it if there is not. + * @param gravity The {@link Gravity} value for aligning the popup with its + * anchor. + */ + public PopupMenu(Context context, View anchor, int gravity) { + this(context, anchor, gravity, R.attr.popupMenuStyle, 0); + } + + /** + * Constructor a create a new popup menu with a specific style. + * + * @param context Context the popup menu is running in, through which it + * can access the current theme, resources, etc. + * @param anchor Anchor view for this popup. The popup will appear below + * the anchor if there is room, or above it if there is not. + * @param gravity The {@link Gravity} value for aligning the popup with its + * anchor. + * @param popupStyleAttr An attribute in the current theme that contains a + * reference to a style resource that supplies default values for + * the popup window. Can be 0 to not look for defaults. + * @param popupStyleRes A resource identifier of a style resource that + * supplies default values for the popup window, used only if + * popupStyleAttr is 0 or can not be found in the theme. Can be 0 + * to not look for defaults. + */ + public PopupMenu(Context context, View anchor, int gravity, int popupStyleAttr, + int popupStyleRes) { + mContext = context; + mMenu = new MenuBuilder(context); + mMenu.setCallback(this); + mAnchor = anchor; + mPopup = new MenuPopupHelper(context, mMenu, anchor, false, popupStyleAttr, popupStyleRes); + mPopup.setGravity(gravity); + mPopup.setCallback(this); + } + + /** + * Returns an {@link android.view.View.OnTouchListener} that can be added to the anchor view + * to implement drag-to-open behavior. + *

      + * When the listener is set on a view, touching that view and dragging + * outside of its bounds will open the popup window. Lifting will select the + * currently touched list item. + *

      + * Example usage: + *

      +     * PopupMenu myPopup = new PopupMenu(context, myAnchor);
      +     * myAnchor.setOnTouchListener(myPopup.getDragToOpenListener());
      +     * 
      + * + * @return a touch listener that controls drag-to-open behavior + */ + public View.OnTouchListener getDragToOpenListener() { + if (mDragListener == null) { + mDragListener = new ListPopupWindow.ForwardingListener(mAnchor) { + @Override + protected boolean onForwardingStarted() { + show(); + return true; + } + + @Override + protected boolean onForwardingStopped() { + dismiss(); + return true; + } + + @Override + public ListPopupWindow getPopup() { + // This will be null until show() is called. + return mPopup.getPopup(); + } + }; + } + + return mDragListener; + } + + /** + * @return the {@link Menu} associated with this popup. Populate the returned Menu with + * items before calling {@link #show()}. + * + * @see #show() + * @see #getMenuInflater() + */ + public Menu getMenu() { + return mMenu; + } + + /** + * @return a {@link MenuInflater} that can be used to inflate menu items from XML into the + * menu returned by {@link #getMenu()}. + * + * @see #getMenu() + */ + public MenuInflater getMenuInflater() { + return new SupportMenuInflater(mContext); + } + + /** + * Inflate a menu resource into this PopupMenu. This is equivalent to calling + * popupMenu.getMenuInflater().inflate(menuRes, popupMenu.getMenu()). + * @param menuRes Menu resource to inflate + */ + public void inflate(@MenuRes int menuRes) { + getMenuInflater().inflate(menuRes, mMenu); + } + + /** + * Show the menu popup anchored to the view specified during construction. + * @see #dismiss() + */ + public void show() { + mPopup.show(); + } + + /** + * Dismiss the menu popup. + * @see #show() + */ + public void dismiss() { + mPopup.dismiss(); + } + + /** + * Set a listener that will be notified when the user selects an item from the menu. + * + * @param listener Listener to notify + */ + public void setOnMenuItemClickListener(OnMenuItemClickListener listener) { + mMenuItemClickListener = listener; + } + + /** + * Set a listener that will be notified when this menu is dismissed. + * + * @param listener Listener to notify + */ + public void setOnDismissListener(OnDismissListener listener) { + mDismissListener = listener; + } + + /** + * @hide + */ + public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) { + if (mMenuItemClickListener != null) { + return mMenuItemClickListener.onMenuItemClick(item); + } + return false; + } + + /** + * @hide + */ + public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { + if (mDismissListener != null) { + mDismissListener.onDismiss(this); + } + } + + /** + * @hide + */ + public boolean onOpenSubMenu(MenuBuilder subMenu) { + if (subMenu == null) return false; + + if (!subMenu.hasVisibleItems()) { + return true; + } + + // Current menu will be dismissed by the normal helper, submenu will be shown in its place. + new MenuPopupHelper(mContext, subMenu, mAnchor).show(); + return true; + } + + /** + * @hide + */ + public void onCloseSubMenu(SubMenuBuilder menu) { + } + + /** + * @hide + */ + public void onMenuModeChange(MenuBuilder menu) { + } + + /** + * Interface responsible for receiving menu item click events if the items themselves + * do not have individual item click listeners. + */ + public interface OnMenuItemClickListener { + /** + * This method will be invoked when a menu item is clicked if the item itself did + * not already handle the event. + * + * @param item {@link MenuItem} that was clicked + * @return true if the event was handled, false otherwise. + */ + public boolean onMenuItemClick(MenuItem item); + } +} \ No newline at end of file diff --git a/android/support/v7/widget/SearchView.java b/android/support/v7/widget/SearchView.java new file mode 100644 index 0000000000..2eb8778cbc --- /dev/null +++ b/android/support/v7/widget/SearchView.java @@ -0,0 +1,1820 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.widget; + +import android.annotation.TargetApi; +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.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.support.v7.appcompat.R; +import android.support.v7.internal.widget.TintAutoCompleteTextView; +import android.support.v7.internal.widget.TintManager; +import android.support.v7.internal.widget.TintTypedArray; +import android.support.v7.internal.widget.ViewUtils; +import android.support.v7.view.CollapsibleActionView; +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.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewTreeObserver; +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.ListView; +import android.widget.TextView; +import android.widget.TextView.OnEditorActionListener; + +import java.lang.reflect.Method; +import java.util.WeakHashMap; + +import static android.support.v7.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. + * + *

      Note: This class is included in the support library for compatibility + * with API level 7 and higher. If you're developing your app for API level 11 and higher + * only, you should instead use the framework {@link android.widget.SearchView} class.

      + * + *

      + * When the SearchView is used in an {@link android.support.v7.app.ActionBar} + * as an action view, it's collapsed by default, so you must provide an icon for the action. + *

      + *

      + * If you want the search field to always be visible, then call + * {@link #setIconifiedByDefault(boolean) setIconifiedByDefault(false)}. + *

      + * + *
      + *

      Developer Guides

      + *

      For information about using {@code SearchView}, read the + * Search API guide. + * Additional information about action views is also available in the <Action Bar API guide

      + *
      + * + * @see android.support.v4.view.MenuItemCompat#SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW + */ +public class SearchView extends LinearLayoutCompat implements CollapsibleActionView { + + private static final boolean DBG = false; + private static final String LOG_TAG = "SearchView"; + + private static final boolean IS_AT_LEAST_FROYO = Build.VERSION.SDK_INT >= 8; + + /** + * Private constant for removing the microphone in the keyboard. + */ + private static final String IME_OPTION_NO_MICROPHONE = "nm"; + + private final SearchAutoComplete mSearchSrcTextView; + private final View mSearchEditFrame; + private final View mSearchPlate; + private final View mSubmitArea; + private final ImageView mSearchButton; + private final ImageView mGoButton; + private final ImageView mCloseButton; + private final ImageView mVoiceButton; + private final View mDropDownAnchor; + + /** Icon optionally displayed when the SearchView is collapsed. */ + private final ImageView mCollapsedIcon; + + /** Drawable used as an EditText hint. */ + private final Drawable mSearchHintIcon; + + // Resources used by SuggestionsAdapter to display suggestions. + private final int mSuggestionRowLayout; + private final int mSuggestionCommitIconResId; + + // Intents used for voice searching. + private final Intent mVoiceWebSearchIntent; + private final Intent mVoiceAppSearchIntent; + + 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 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; + + private final TintManager mTintManager; + + static final AutoCompleteTextViewReflector HIDDEN_METHOD_INVOKER = new AutoCompleteTextViewReflector(); + + /* + * 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) { + HIDDEN_METHOD_INVOKER.showSoftInputUnchecked(imm, SearchView.this, 0); + } + } + }; + + private final 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); + } + } + }; + + // 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) { + this(context, attrs, R.attr.searchViewStyle); + } + + public SearchView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + final TintTypedArray a = TintTypedArray.obtainStyledAttributes(context, + attrs, R.styleable.SearchView, defStyleAttr, 0); + // Keep the TintManager in case we need it later + mTintManager = a.getTintManager(); + + final LayoutInflater inflater = LayoutInflater.from(context); + final int layoutResId = a.getResourceId( + R.styleable.SearchView_layout, R.layout.abc_search_view); + inflater.inflate(layoutResId, this, true); + + mSearchSrcTextView = (SearchAutoComplete) findViewById(R.id.search_src_text); + mSearchSrcTextView.setSearchView(this); + + mSearchEditFrame = findViewById(R.id.search_edit_frame); + mSearchPlate = findViewById(R.id.search_plate); + mSubmitArea = findViewById(R.id.submit_area); + mSearchButton = (ImageView) findViewById(R.id.search_button); + mGoButton = (ImageView) findViewById(R.id.search_go_btn); + mCloseButton = (ImageView) findViewById(R.id.search_close_btn); + mVoiceButton = (ImageView) findViewById(R.id.search_voice_btn); + mCollapsedIcon = (ImageView) findViewById(R.id.search_mag_icon); + + // Set up icons and backgrounds. + mSearchPlate.setBackgroundDrawable(a.getDrawable(R.styleable.SearchView_queryBackground)); + mSubmitArea.setBackgroundDrawable(a.getDrawable(R.styleable.SearchView_submitBackground)); + mSearchButton.setImageDrawable(a.getDrawable(R.styleable.SearchView_searchIcon)); + mGoButton.setImageDrawable(a.getDrawable(R.styleable.SearchView_goIcon)); + mCloseButton.setImageDrawable(a.getDrawable(R.styleable.SearchView_closeIcon)); + mVoiceButton.setImageDrawable(a.getDrawable(R.styleable.SearchView_voiceIcon)); + mCollapsedIcon.setImageDrawable(a.getDrawable(R.styleable.SearchView_searchIcon)); + + mSearchHintIcon = a.getDrawable(R.styleable.SearchView_searchHintIcon); + + // Extract dropdown layout resource IDs for later use. + mSuggestionRowLayout = a.getResourceId(R.styleable.SearchView_suggestionRowLayout, + R.layout.abc_search_dropdown_item_icons_2line); + mSuggestionCommitIconResId = a.getResourceId(R.styleable.SearchView_commitIcon, 0); + + mSearchButton.setOnClickListener(mOnClickListener); + mCloseButton.setOnClickListener(mOnClickListener); + mGoButton.setOnClickListener(mOnClickListener); + mVoiceButton.setOnClickListener(mOnClickListener); + mSearchSrcTextView.setOnClickListener(mOnClickListener); + + mSearchSrcTextView.addTextChangedListener(mTextWatcher); + mSearchSrcTextView.setOnEditorActionListener(mOnEditorActionListener); + mSearchSrcTextView.setOnItemClickListener(mOnItemClickListener); + mSearchSrcTextView.setOnItemSelectedListener(mOnItemSelectedListener); + mSearchSrcTextView.setOnKeyListener(mTextKeyListener); + + // Inform any listener of focus changes + mSearchSrcTextView.setOnFocusChangeListener(new OnFocusChangeListener() { + + public void onFocusChange(View v, boolean hasFocus) { + if (mOnQueryTextFocusChangeListener != null) { + mOnQueryTextFocusChangeListener.onFocusChange(SearchView.this, hasFocus); + } + } + }); + setIconifiedByDefault(a.getBoolean(R.styleable.SearchView_iconifiedByDefault, true)); + + final int maxWidth = a.getDimensionPixelSize(R.styleable.SearchView_android_maxWidth, -1); + if (maxWidth != -1) { + setMaxWidth(maxWidth); + } + + final CharSequence queryHint = a.getText(R.styleable.SearchView_queryHint); + if (!TextUtils.isEmpty(queryHint)) { + setQueryHint(queryHint); + } + + final int imeOptions = a.getInt(R.styleable.SearchView_android_imeOptions, -1); + if (imeOptions != -1) { + setImeOptions(imeOptions); + } + + final int inputType = a.getInt(R.styleable.SearchView_android_inputType, -1); + if (inputType != -1) { + setInputType(inputType); + } + + boolean focusable = true; + focusable = a.getBoolean(R.styleable.SearchView_android_focusable, focusable); + setFocusable(focusable); + + a.recycle(); + + // 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(mSearchSrcTextView.getDropDownAnchor()); + if (mDropDownAnchor != null) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + addOnLayoutChangeListenerToDropDownAnchorSDK11(); + } else { + addOnLayoutChangeListenerToDropDownAnchorBase(); + } + } + + updateViewsVisibility(mIconifiedByDefault); + updateQueryHint(); + } + + @TargetApi(Build.VERSION_CODES.HONEYCOMB) + private void addOnLayoutChangeListenerToDropDownAnchorSDK11() { + mDropDownAnchor.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { + @Override + public void onLayoutChange(View v, int left, int top, int right, int bottom, + int oldLeft, int oldTop, int oldRight, int oldBottom) { + adjustDropDownSizeAndPosition(); + } + }); + } + + private void addOnLayoutChangeListenerToDropDownAnchorBase() { + mDropDownAnchor.getViewTreeObserver() + .addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + adjustDropDownSizeAndPosition(); + } + }); + } + + int getSuggestionRowLayout() { + return mSuggestionRowLayout; + } + + int getSuggestionCommitIconResId() { + return mSuggestionCommitIconResId; + } + + /** + * 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) { + if (IS_AT_LEAST_FROYO) { + updateSearchAutoComplete(); + } + updateQueryHint(); + } + // Cache the voice search capability + mVoiceButtonEnabled = IS_AT_LEAST_FROYO && 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 + mSearchSrcTextView.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 + */ + public void setImeOptions(int imeOptions) { + mSearchSrcTextView.setImeOptions(imeOptions); + } + + /** + * Returns the IME options set on the query text field. + * @return the ime options + * @see TextView#setImeOptions(int) + */ + public int getImeOptions() { + return mSearchSrcTextView.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 + */ + public void setInputType(int inputType) { + mSearchSrcTextView.setInputType(inputType); + } + + /** + * Returns the input type set on the query text field. + * @return the input type + */ + public int getInputType() { + return mSearchSrcTextView.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 = mSearchSrcTextView.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(); + mSearchSrcTextView.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 mSearchSrcTextView.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) { + mSearchSrcTextView.setText(query); + if (query != null) { + mSearchSrcTextView.setSelection(mSearchSrcTextView.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 + */ + 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. + */ + public CharSequence getQueryHint() { + if (mQueryHint != null) { + return mQueryHint; + } else if (IS_AT_LEAST_FROYO && 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 + */ + public void setIconifiedByDefault(boolean iconified) { + if (mIconifiedByDefault == iconified) return; + mIconifiedByDefault = iconified; + updateViewsVisibility(iconified); + updateQueryHint(); + } + + /** + * Returns the default iconified state of the search field. + * @return + */ + 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; + + mSearchSrcTextView.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 + */ + 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 + */ + 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.abc_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(mSearchSrcTextView.getText()); + + mSearchButton.setVisibility(visCollapsed); + updateSubmitButton(hasText); + mSearchEditFrame.setVisibility(collapsed ? GONE : VISIBLE); + mCollapsedIcon.setVisibility(mIconifiedByDefault ? GONE : VISIBLE); + updateCloseButton(); + updateVoiceButton(!hasText); + updateSubmitArea(); + } + + @TargetApi(Build.VERSION_CODES.FROYO) + 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; + } + mGoButton.setVisibility(visibility); + } + + private void updateSubmitArea() { + int visibility = GONE; + if (isSubmitAreaEnabled() + && (mGoButton.getVisibility() == VISIBLE + || mVoiceButton.getVisibility() == VISIBLE)) { + visibility = VISIBLE; + } + mSubmitArea.setVisibility(visibility); + } + + private void updateCloseButton() { + final boolean hasText = !TextUtils.isEmpty(mSearchSrcTextView.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); + final Drawable closeButtonImg = mCloseButton.getDrawable(); + if (closeButtonImg != null){ + closeButtonImg.setState(hasText ? ENABLED_STATE_SET : EMPTY_STATE_SET); + } + } + + private void postUpdateFocusedState() { + post(mUpdateDrawableStateRunnable); + } + + private void updateFocusedState() { + final boolean focused = mSearchSrcTextView.hasFocus(); + final int[] stateSet = focused ? FOCUSED_STATE_SET : EMPTY_STATE_SET; + final Drawable searchPlateBg = mSearchPlate.getBackground(); + if (searchPlateBg != null) { + searchPlateBg.setState(stateSet); + } + final Drawable submitAreaBg = mSubmitArea.getBackground(); + if (submitAreaBg != null) { + submitAreaBg.setState(stateSet); + } + 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 == mGoButton) { + onSubmitQuery(); + } else if (v == mVoiceButton) { + onVoiceClicked(); + } else if (v == mSearchSrcTextView) { + forceSuggestionQuery(); + } + } + }; + + /** + * 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: " + + mSearchSrcTextView.getListSelection()); + } + + // If a suggestion is selected, handle enter, search key, and action keys + // as presses on the selected suggestion + if (mSearchSrcTextView.isPopupShowing() + && mSearchSrcTextView.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 (!mSearchSrcTextView.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, mSearchSrcTextView.getText() + .toString()); + return true; + } + } + } + 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 = mSearchSrcTextView.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 : mSearchSrcTextView + .length(); + mSearchSrcTextView.setSelection(selPoint); + mSearchSrcTextView.setListSelection(0); + mSearchSrcTextView.clearListSelection(); + HIDDEN_METHOD_INVOKER.ensureImeVisible(mSearchSrcTextView, true); + + return true; + } + + // Next, check for an "up and out" move + if (keyCode == KeyEvent.KEYCODE_DPAD_UP && 0 == mSearchSrcTextView.getListSelection()) { + // TODO: restoreUserQuery(); + // let ACTV complete the move + return false; + } + } + return false; + } + + private CharSequence getDecoratedHint(CharSequence hintText) { + // If the field is always expanded or we don't have a search hint icon, + // then don't add the search icon to the hint. + if (!mIconifiedByDefault || mSearchHintIcon == null) { + return hintText; + } + + final int textSize = (int) (mSearchSrcTextView.getTextSize() * 1.25); + mSearchHintIcon.setBounds(0, 0, textSize, textSize); + + final SpannableStringBuilder ssb = new SpannableStringBuilder(" "); + ssb.setSpan(new ImageSpan(mSearchHintIcon), 1, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + ssb.append(hintText); + return ssb; + } + + private void updateQueryHint() { + if (mQueryHint != null) { + mSearchSrcTextView.setHint(getDecoratedHint(mQueryHint)); + } else if (IS_AT_LEAST_FROYO && mSearchable != null) { + CharSequence hint = null; + int hintId = mSearchable.getHintId(); + if (hintId != 0) { + hint = getContext().getString(hintId); + } + if (hint != null) { + mSearchSrcTextView.setHint(getDecoratedHint(hint)); + } + } else { + mSearchSrcTextView.setHint(getDecoratedHint("")); + } + } + + /** + * Updates the auto-complete text view. + */ + @TargetApi(Build.VERSION_CODES.FROYO) + private void updateSearchAutoComplete() { + mSearchSrcTextView.setThreshold(mSearchable.getSuggestThreshold()); + mSearchSrcTextView.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; + } + } + mSearchSrcTextView.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); + mSearchSrcTextView.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; + mGoButton.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 = mSearchSrcTextView.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 = mSearchSrcTextView.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() { + mSearchSrcTextView.dismissDropDown(); + } + + private void onCloseClicked() { + CharSequence text = mSearchSrcTextView.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 { + mSearchSrcTextView.setText(""); + mSearchSrcTextView.requestFocus(); + setImeVisibility(true); + } + + } + + private void onSearchClicked() { + updateViewsVisibility(false); + mSearchSrcTextView.requestFocus(); + setImeVisibility(true); + if (mOnSearchClickListener != null) { + mOnSearchClickListener.onClick(this); + } + } + + @TargetApi(Build.VERSION_CODES.FROYO) + 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 (mSearchSrcTextView.hasFocus()) { + forceSuggestionQuery(); + } + } + + @Override + public void onWindowFocusChanged(boolean hasWindowFocus) { + super.onWindowFocusChanged(hasWindowFocus); + + postUpdateFocusedState(); + } + + /** + * {@inheritDoc} + */ + @Override + public void onActionViewCollapsed() { + setQuery("", false); + clearFocus(); + updateViewsVisibility(true); + mSearchSrcTextView.setImeOptions(mCollapsedImeOptions); + mExpandedInActionView = false; + } + + /** + * {@inheritDoc} + */ + @Override + public void onActionViewExpanded() { + if (mExpandedInActionView) return; + + mExpandedInActionView = true; + mCollapsedImeOptions = mSearchSrcTextView.getImeOptions(); + mSearchSrcTextView.setImeOptions(mCollapsedImeOptions | EditorInfo.IME_FLAG_NO_FULLSCREEN); + mSearchSrcTextView.setText(""); + setIconified(false); + } + + + private void adjustDropDownSizeAndPosition() { + if (mDropDownAnchor.getWidth() > 1) { + Resources res = getContext().getResources(); + int anchorPadding = mSearchPlate.getPaddingLeft(); + Rect dropDownPadding = new Rect(); + final boolean isLayoutRtl = ViewUtils.isLayoutRtl(this); + int iconOffset = mIconifiedByDefault + ? res.getDimensionPixelSize(R.dimen.abc_dropdownitem_icon_width) + + res.getDimensionPixelSize(R.dimen.abc_dropdownitem_text_padding_left) + : 0; + mSearchSrcTextView.getDropDownBackground().getPadding(dropDownPadding); + int offset; + if (isLayoutRtl) { + offset = - dropDownPadding.left; + } else { + offset = anchorPadding - (dropDownPadding.left + iconOffset); + } + mSearchSrcTextView.setDropDownHorizontalOffset(offset); + final int width = mDropDownAnchor.getWidth() + dropDownPadding.left + + dropDownPadding.right + iconOffset - anchorPadding; + mSearchSrcTextView.setDropDownWidth(width); + } + } + + 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 = mSearchSrcTextView.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) { + mSearchSrcTextView.setText(query); + // Move the cursor to the end + mSearchSrcTextView.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); + } + if (IS_AT_LEAST_FROYO) { + intent.setComponent(mSearchable.getSearchActivity()); + } + return intent; + } + + /** + * Create and return an Intent that can launch the voice search activity for web search. + */ + @TargetApi(Build.VERSION_CODES.FROYO) + 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 + */ + @TargetApi(Build.VERSION_CODES.FROYO) + 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(); + if (mAppSearchData != null) { + queryExtras.putParcelable(SearchManager.APP_DATA, mAppSearchData); + } + + // 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; + + if (Build.VERSION.SDK_INT >= 8) { + 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 && Build.VERSION.SDK_INT >= 8) { + 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 (IS_AT_LEAST_FROYO && 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() { + HIDDEN_METHOD_INVOKER.doBeforeTextChanged(mSearchSrcTextView); + HIDDEN_METHOD_INVOKER.doAfterTextChanged(mSearchSrcTextView); + } + + 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 TintAutoCompleteTextView { + + private int mThreshold; + private SearchView mSearchView; + + public SearchAutoComplete(Context context) { + this(context, null); + } + + public SearchAutoComplete(Context context, AttributeSet attrs) { + this(context, attrs, android.R.attr.autoCompleteTextViewStyle); + } + + 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())) { + HIDDEN_METHOD_INVOKER.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 class AutoCompleteTextViewReflector { + private Method doBeforeTextChanged, doAfterTextChanged; + private Method ensureImeVisible; + private Method showSoftInputUnchecked; + + AutoCompleteTextViewReflector() { + try { + doBeforeTextChanged = AutoCompleteTextView.class + .getDeclaredMethod("doBeforeTextChanged"); + doBeforeTextChanged.setAccessible(true); + } catch (NoSuchMethodException e) { + // Ah well. + } + try { + doAfterTextChanged = AutoCompleteTextView.class + .getDeclaredMethod("doAfterTextChanged"); + doAfterTextChanged.setAccessible(true); + } catch (NoSuchMethodException e) { + // Ah well. + } + try { + ensureImeVisible = AutoCompleteTextView.class + .getMethod("ensureImeVisible", boolean.class); + ensureImeVisible.setAccessible(true); + } catch (NoSuchMethodException e) { + // Ah well. + } + try { + showSoftInputUnchecked = InputMethodManager.class.getMethod( + "showSoftInputUnchecked", int.class, ResultReceiver.class); + showSoftInputUnchecked.setAccessible(true); + } catch (NoSuchMethodException e) { + // Ah well. + } + } + + void doBeforeTextChanged(AutoCompleteTextView view) { + if (doBeforeTextChanged != null) { + try { + doBeforeTextChanged.invoke(view); + } catch (Exception e) { + } + } + } + + void doAfterTextChanged(AutoCompleteTextView view) { + if (doAfterTextChanged != null) { + try { + doAfterTextChanged.invoke(view); + } catch (Exception e) { + } + } + } + + void ensureImeVisible(AutoCompleteTextView view, boolean visible) { + if (ensureImeVisible != null) { + try { + ensureImeVisible.invoke(view, visible); + } catch (Exception e) { + } + } + } + + void showSoftInputUnchecked(InputMethodManager imm, View view, int flags) { + if (showSoftInputUnchecked != null) { + try { + showSoftInputUnchecked.invoke(imm, flags, null); + return; + } catch (Exception e) { + } + } + + // Hidden method failed, call public version instead + imm.showSoftInput(view, flags); + } + } +} \ No newline at end of file diff --git a/android/support/v7/widget/ShareActionProvider.java b/android/support/v7/widget/ShareActionProvider.java new file mode 100644 index 0000000000..173e5fc6b5 --- /dev/null +++ b/android/support/v7/widget/ShareActionProvider.java @@ -0,0 +1,376 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.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.os.Build; +import android.support.v4.view.ActionProvider; +import android.support.v7.appcompat.R; +import android.support.v7.internal.widget.ActivityChooserModel; +import android.support.v7.internal.widget.ActivityChooserView; +import android.support.v7.internal.widget.TintManager; +import android.util.TypedValue; +import android.view.Menu; +import android.view.MenuItem; +import android.view.MenuItem.OnMenuItemClickListener; +import android.view.SubMenu; +import android.view.View; +import android.support.v7.internal.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. + * + *

      Note: This class is included in the support library for compatibility + * with API level 7 and higher. If you're developing your app for API level 14 and higher + * only, you should instead use the framework {@link android.widget.ShareActionProvider} + * class.

      + * + *

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

      + *
      
      + *  // In {@link android.app.Activity#onCreateOptionsMenu 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) MenuItemCompat.getActionProvider(menuItem);
      + *      // Set history different from the default before getting the action
      + *      // view since a call to {@link android.support.v4.view.MenuItemCompat#getActionView(android.view.MenuItem) MenuItemCompat.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. + *

      + * + *
      + *

      Developer Guides

      + * + *

      For information about how to use {@link ShareActionProvider}, see the + * Action Bar API guide.

      + *
      + * + * @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 perform some action before the sharing is + * actually performed. + *

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

      + *

      + * Note: You should not handle the + * intent here. This callback aims to notify the client that a + * sharing is being performed, so the client can update the UI + * if necessary. + *

      + * + * @param source The source of the notification. + * @param intent The intent for launching the chosen share target. + * @return The return result is ignored. Always return false for consistency. + */ + 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. + ActivityChooserView activityChooserView = new ActivityChooserView(mContext); + if (!activityChooserView.isInEditMode()) { + ActivityChooserModel dataModel = ActivityChooserModel.get(mContext, mShareHistoryFileName); + activityChooserView.setActivityChooserModel(dataModel); + } + + // Lookup and set the expand action icon. + TypedValue outTypedValue = new TypedValue(); + mContext.getTheme().resolveAttribute(R.attr.actionModeShareDrawable, outTypedValue, true); + Drawable drawable = TintManager.getDrawable(mContext, outTypedValue.resourceId); + activityChooserView.setExpandActivityOverflowButtonDrawable(drawable); + activityChooserView.setProvider(this); + + // Set content description. + activityChooserView.setDefaultActionButtonContentDescription( + R.string.abc_shareactionprovider_share_with_application); + activityChooserView.setExpandActivityOverflowButtonContentDescription( + R.string.abc_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.abc_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. Therefore, if you want to + * use different history files for sharing specific types of content, every time + * you change the history file {@link #setShareHistoryFileName(String)} you must + * call {@link android.app.Activity#invalidateOptionsMenu()} to recreate the + * action view. You should not call + * {@link android.app.Activity#invalidateOptionsMenu()} from + * {@link android.app.Activity#onCreateOptionsMenu(Menu)}." + *

      + * + * private void doShare(Intent intent) { + * if (IMAGE.equals(intent.getMimeType())) { + * mShareActionProvider.setHistoryFileName(SHARE_IMAGE_HISTORY_FILE_NAME); + * } else if (TEXT.equals(intent.getMimeType())) { + * mShareActionProvider.setHistoryFileName(SHARE_TEXT_HISTORY_FILE_NAME); + * } + * mShareActionProvider.setIntent(intent); + * invalidateOptionsMenu(); + * } + * + * + * @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) { + if (shareIntent != null) { + final String action = shareIntent.getAction(); + if (Intent.ACTION_SEND.equals(action) || Intent.ACTION_SEND_MULTIPLE.equals(action)) { + updateIntent(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) { + final String action = launchIntent.getAction(); + if (Intent.ACTION_SEND.equals(action) || + Intent.ACTION_SEND_MULTIPLE.equals(action)) { + updateIntent(launchIntent); + } + 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 ShareActivityChooserModelPolicy(); + } + ActivityChooserModel dataModel = ActivityChooserModel.get(mContext, mShareHistoryFileName); + dataModel.setOnChooseActivityListener(mOnChooseActivityListener); + } + + /** + * Policy that delegates to the {@link OnShareTargetSelectedListener}, if such. + */ + private class ShareActivityChooserModelPolicy implements OnChooseActivityListener { + @Override + public boolean onChooseActivity(ActivityChooserModel host, Intent intent) { + if (mOnShareTargetSelectedListener != null) { + mOnShareTargetSelectedListener.onShareTargetSelected( + ShareActionProvider.this, intent); + } + return false; + } + } + + private void updateIntent(Intent intent) { + if (Build.VERSION.SDK_INT >= 21) { + // If we're on Lollipop, we can open the intent as a document + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT | + Intent.FLAG_ACTIVITY_MULTIPLE_TASK); + } else { + // Else, we will use the old CLEAR_WHEN_TASK_RESET flag + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); + } + } +} \ No newline at end of file diff --git a/android/support/v7/widget/SuggestionsAdapter.java b/android/support/v7/widget/SuggestionsAdapter.java new file mode 100644 index 0000000000..6251e0e31a --- /dev/null +++ b/android/support/v7/widget/SuggestionsAdapter.java @@ -0,0 +1,756 @@ +package android.support.v7.widget; + +/* + * Copyright (C) 2013 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. + */ + +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.content.ContextCompat; +import android.support.v4.widget.ResourceCursorAdapter; +import android.support.v7.appcompat.R; +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 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.in {@link SearchView}. + * @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 final SearchManager mSearchManager; + private final SearchView mSearchView; + private final SearchableInfo mSearchable; + private final Context mProviderContext; + private final WeakHashMap mOutsideDrawablesCache; + private final int mCommitIconResId; + 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; + + public SuggestionsAdapter(Context context, SearchView searchView, SearchableInfo searchable, + WeakHashMap outsideDrawablesCache) { + super(context, searchView.getSuggestionRowLayout(), null /* no initial cursor */, + true /* auto-requery */); + mSearchManager = (SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE); + mSearchView = searchView; + mSearchable = searchable; + mCommitIconResId = searchView.getSuggestionCommitIconResId(); + + // set up provider resources (gives us icons, etc.) + mProviderContext = context; + + mOutsideDrawablesCache = outsideDrawablesCache; + } + + /** + * 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 refine 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; + } + try { + cursor = getSearchManagerSuggestions(mSearchable, 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 + return 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(); + + 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)) { + return; + } + // If cursor is null or is done, stop the spinner + } + + /** + * 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) { + final View v = super.newView(context, cursor, parent); + v.setTag(new ChildViewCache(v)); + + // Set up icon. + final ImageView iconRefine = (ImageView) v.findViewById(R.id.edit_query); + iconRefine.setImageResource(mCommitIconResId); + 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; + } + + if (mSearchable.shouldRewriteQueryFromData()) { + String data = getColumnString(cursor, SearchManager.SUGGEST_COLUMN_INTENT_DATA); + if (data != null) { + return data; + } + } + + if (mSearchable.shouldRewriteQueryFromText()) { + String text1 = getColumnString(cursor, SearchManager.SUGGEST_COLUMN_TEXT_1); + if (text1 != null) { + return text1; + } + } + + 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 = ContextCompat.getDrawable(mProviderContext, 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 getDrawableFromResourceUri(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; + } + } + + + + 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) { + // Check the component that gave us the suggestion + Drawable drawable = getActivityIconWithCache(mSearchable.getSearchActivity()); + if (drawable != null) { + return drawable; + } + + // 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; + } + } + + /** + * Import of hidden method: ContentResolver.getResourceId(Uri). + * Modified to return a drawable, rather than a hidden type. + */ + Drawable getDrawableFromResourceUri(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); + } + + /** + * Import of hidden method: SearchManager.getSuggestions(SearchableInfo, String, int). + */ + Cursor getSearchManagerSuggestions(SearchableInfo searchable, String query, int limit) { + if (searchable == null) { + return null; + } + + String authority = searchable.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 = searchable.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 = searchable.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); + } +} \ No newline at end of file diff --git a/android/support/v7/widget/SwitchCompat.java b/android/support/v7/widget/SwitchCompat.java new file mode 100644 index 0000000000..9c53920e2c --- /dev/null +++ b/android/support/v7/widget/SwitchCompat.java @@ -0,0 +1,1151 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.widget; + +import android.annotation.TargetApi; +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.Region; +import android.graphics.Typeface; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.support.v4.graphics.drawable.DrawableCompat; +import android.support.v4.view.MotionEventCompat; +import android.support.v4.view.ViewCompat; +import android.support.v7.appcompat.R; +import android.support.v7.internal.text.AllCapsTransformationMethod; +import android.support.v7.internal.widget.DrawableUtils; +import android.support.v7.internal.widget.TintManager; +import android.support.v7.internal.widget.TintTypedArray; +import android.support.v7.internal.widget.ViewUtils; +import android.text.Layout; +import android.text.StaticLayout; +import android.text.TextPaint; +import android.text.TextUtils; +import android.text.method.TransformationMethod; +import android.util.AttributeSet; +import android.view.Gravity; +import android.view.MotionEvent; +import android.view.SoundEffectConstants; +import android.view.VelocityTracker; +import android.view.ViewConfiguration; +import android.view.accessibility.AccessibilityEvent; +import android.view.accessibility.AccessibilityNodeInfo; +import android.view.animation.Animation; +import android.view.animation.Transformation; +import android.widget.CompoundButton; + +/** + * SwitchCompat is a version of the Switch widget which on devices back to API v7. It does not + * make any attempt to use the platform provided widget on those devices which it is available + * normally. + *

      + * A Switch is a two-state toggle switch widget that can select between two + * options. The user may drag the "thumb" back and forth to choose the selected option, + * or simply tap to toggle as if it were a checkbox. The {@link #setText(CharSequence) text} + * property controls the text displayed in the label for the switch, whereas the + * {@link #setTextOff(CharSequence) off} and {@link #setTextOn(CharSequence) on} text + * controls the text on the thumb. Similarly, the + * {@link #setTextAppearance(android.content.Context, int) textAppearance} and the related + * setTypeface() methods control the typeface and style of label text, whereas the + * {@link #setSwitchTextAppearance(android.content.Context, int) switchTextAppearance} and + * the related seSwitchTypeface() methods control that of the thumb. + */ +public class SwitchCompat extends CompoundButton { + private static final int THUMB_ANIMATION_DURATION = 250; + + private static final int TOUCH_MODE_IDLE = 0; + private static final int TOUCH_MODE_DOWN = 1; + private static final int TOUCH_MODE_DRAGGING = 2; + + // We force the accessibility events to have a class name of Switch, since screen readers + // already know how to handle their events + private static final String ACCESSIBILITY_EVENT_CLASS_NAME = "android.widget.Switch"; + + // Enum for the "typeface" XML parameter. + private static final int SANS = 1; + private static final int SERIF = 2; + private static final int MONOSPACE = 3; + + private Drawable mThumbDrawable; + private Drawable mTrackDrawable; + private int mThumbTextPadding; + private int mSwitchMinWidth; + private int mSwitchPadding; + private boolean mSplitTrack; + private CharSequence mTextOn; + private CharSequence mTextOff; + private boolean mShowText; + + private int mTouchMode; + private int mTouchSlop; + private float mTouchX; + private float mTouchY; + private VelocityTracker mVelocityTracker = VelocityTracker.obtain(); + private int mMinFlingVelocity; + + private float mThumbPosition; + + /** + * Width required to draw the switch track and thumb. Includes padding and + * optical bounds for both the track and thumb. + */ + private int mSwitchWidth; + + /** + * Height required to draw the switch track and thumb. Includes padding and + * optical bounds for both the track and thumb. + */ + private int mSwitchHeight; + + /** + * Width of the thumb's content region. Does not include padding or + * optical bounds. + */ + private int mThumbWidth; + + /** Left bound for drawing the switch track and thumb. */ + private int mSwitchLeft; + + /** Top bound for drawing the switch track and thumb. */ + private int mSwitchTop; + + /** Right bound for drawing the switch track and thumb. */ + private int mSwitchRight; + + /** Bottom bound for drawing the switch track and thumb. */ + private int mSwitchBottom; + + private TextPaint mTextPaint; + private ColorStateList mTextColors; + private Layout mOnLayout; + private Layout mOffLayout; + private TransformationMethod mSwitchTransformationMethod; + private Animation mPositionAnimator; + + @SuppressWarnings("hiding") + private final Rect mTempRect = new Rect(); + + private final TintManager mTintManager; + + private static final int[] CHECKED_STATE_SET = { + android.R.attr.state_checked + }; + + /** + * Construct a new Switch with default styling. + * + * @param context The Context that will determine this widget's theming. + */ + public SwitchCompat(Context context) { + this(context, null); + } + + /** + * Construct a new Switch with default styling, overriding specific style + * attributes as requested. + * + * @param context The Context that will determine this widget's theming. + * @param attrs Specification of attributes that should deviate from default styling. + */ + public SwitchCompat(Context context, AttributeSet attrs) { + this(context, attrs, R.attr.switchStyle); + } + + /** + * Construct a new Switch with a default style determined by the given theme attribute, + * overriding specific style attributes as requested. + * + * @param context The Context that will determine this widget's theming. + * @param attrs Specification of attributes that should deviate from the default styling. + * @param defStyleAttr An attribute in the current theme that contains a + * reference to a style resource that supplies default values for + * the view. Can be 0 to not look for defaults. + */ + public SwitchCompat(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + mTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); + + final Resources res = getResources(); + mTextPaint.density = res.getDisplayMetrics().density; + + final TintTypedArray a = TintTypedArray.obtainStyledAttributes(context, + attrs, R.styleable.SwitchCompat, defStyleAttr, 0); + mThumbDrawable = a.getDrawable(R.styleable.SwitchCompat_android_thumb); + if (mThumbDrawable != null) { + mThumbDrawable.setCallback(this); + } + mTrackDrawable = a.getDrawable(R.styleable.SwitchCompat_track); + if (mTrackDrawable != null) { + mTrackDrawable.setCallback(this); + } + mTextOn = a.getText(R.styleable.SwitchCompat_android_textOn); + mTextOff = a.getText(R.styleable.SwitchCompat_android_textOff); + mShowText = a.getBoolean(R.styleable.SwitchCompat_showText, true); + mThumbTextPadding = a.getDimensionPixelSize( + R.styleable.SwitchCompat_thumbTextPadding, 0); + mSwitchMinWidth = a.getDimensionPixelSize( + R.styleable.SwitchCompat_switchMinWidth, 0); + mSwitchPadding = a.getDimensionPixelSize( + R.styleable.SwitchCompat_switchPadding, 0); + mSplitTrack = a.getBoolean(R.styleable.SwitchCompat_splitTrack, false); + + final int appearance = a.getResourceId( + R.styleable.SwitchCompat_switchTextAppearance, 0); + if (appearance != 0) { + setSwitchTextAppearance(context, appearance); + } + + mTintManager = a.getTintManager(); + + a.recycle(); + + final ViewConfiguration config = ViewConfiguration.get(context); + mTouchSlop = config.getScaledTouchSlop(); + mMinFlingVelocity = config.getScaledMinimumFlingVelocity(); + + // Refresh display with current params + refreshDrawableState(); + setChecked(isChecked()); + } + + /** + * Sets the switch text color, size, style, hint color, and highlight color + * from the specified TextAppearance resource. + */ + 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 { + // If no color set in TextAppearance, default to the view's textColor + 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_textAllCaps, false); + if (allCaps) { + mSwitchTransformationMethod = new AllCapsTransformationMethod(getContext()); + } else { + mSwitchTransformationMethod = null; + } + + appearance.recycle(); + } + + 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); + } + + /** + * Sets the typeface and style in which the text should be displayed on the + * switch, and turns on the fake bold and italic bits in the Paint if the + * Typeface that you provided does not have all the bits in the + * style that you specified. + */ + 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); + // now compute what (if any) algorithmic styling is needed + 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); + } + } + + /** + * Sets the typeface in which the text should be displayed on the switch. + * Note that not all Typeface families actually have bold and italic + * variants, so you may need to use + * {@link #setSwitchTypeface(Typeface, int)} to get the appearance + * that you actually want. + */ + public void setSwitchTypeface(Typeface tf) { + if (mTextPaint.getTypeface() != tf) { + mTextPaint.setTypeface(tf); + + requestLayout(); + invalidate(); + } + } + + /** + * Set the amount of horizontal padding between the switch and the associated text. + * + * @param pixels Amount of padding in pixels + */ + public void setSwitchPadding(int pixels) { + mSwitchPadding = pixels; + requestLayout(); + } + + /** + * Get the amount of horizontal padding between the switch and the associated text. + * + * @return Amount of padding in pixels + */ + public int getSwitchPadding() { + return mSwitchPadding; + } + + /** + * Set the minimum width of the switch in pixels. The switch's width will be the maximum + * of this value and its measured width as determined by the switch drawables and text used. + * + * @param pixels Minimum width of the switch in pixels + */ + public void setSwitchMinWidth(int pixels) { + mSwitchMinWidth = pixels; + requestLayout(); + } + + /** + * Get the minimum width of the switch in pixels. The switch's width will be the maximum + * of this value and its measured width as determined by the switch drawables and text used. + * + * @return Minimum width of the switch in pixels + */ + public int getSwitchMinWidth() { + return mSwitchMinWidth; + } + + /** + * Set the horizontal padding around the text drawn on the switch itself. + * + * @param pixels Horizontal padding for switch thumb text in pixels + */ + public void setThumbTextPadding(int pixels) { + mThumbTextPadding = pixels; + requestLayout(); + } + + /** + * Get the horizontal padding around the text drawn on the switch itself. + * + * @return Horizontal padding for switch thumb text in pixels + */ + public int getThumbTextPadding() { + return mThumbTextPadding; + } + + /** + * Set the drawable used for the track that the switch slides within. + * + * @param track Track drawable + */ + public void setTrackDrawable(Drawable track) { + mTrackDrawable = track; + requestLayout(); + } + + /** + * Set the drawable used for the track that the switch slides within. + * + * @param resId Resource ID of a track drawable + */ + public void setTrackResource(int resId) { + setTrackDrawable(mTintManager.getDrawable(resId)); + } + + /** + * Get the drawable used for the track that the switch slides within. + * + * @return Track drawable + */ + public Drawable getTrackDrawable() { + return mTrackDrawable; + } + + /** + * Set the drawable used for the switch "thumb" - the piece that the user + * can physically touch and drag along the track. + * + * @param thumb Thumb drawable + */ + public void setThumbDrawable(Drawable thumb) { + mThumbDrawable = thumb; + requestLayout(); + } + + /** + * Set the drawable used for the switch "thumb" - the piece that the user + * can physically touch and drag along the track. + * + * @param resId Resource ID of a thumb drawable + */ + public void setThumbResource(int resId) { + setThumbDrawable(mTintManager.getDrawable(resId)); + } + + /** + * Get the drawable used for the switch "thumb" - the piece that the user + * can physically touch and drag along the track. + * + * @return Thumb drawable + */ + public Drawable getThumbDrawable() { + return mThumbDrawable; + } + + /** + * Specifies whether the track should be split by the thumb. When true, + * the thumb's optical bounds will be clipped out of the track drawable, + * then the thumb will be drawn into the resulting gap. + * + * @param splitTrack Whether the track should be split by the thumb + */ + public void setSplitTrack(boolean splitTrack) { + mSplitTrack = splitTrack; + invalidate(); + } + + /** + * Returns whether the track should be split by the thumb. + */ + public boolean getSplitTrack() { + return mSplitTrack; + } + + /** + * Returns the text displayed when the button is in the checked state. + */ + public CharSequence getTextOn() { + return mTextOn; + } + + /** + * Sets the text displayed when the button is in the checked state. + */ + public void setTextOn(CharSequence textOn) { + mTextOn = textOn; + requestLayout(); + } + + /** + * Returns the text displayed when the button is not in the checked state. + */ + public CharSequence getTextOff() { + return mTextOff; + } + + /** + * Sets the text displayed when the button is not in the checked state. + */ + public void setTextOff(CharSequence textOff) { + mTextOff = textOff; + requestLayout(); + } + + /** + * Sets whether the on/off text should be displayed. + * + * @param showText {@code true} to display on/off text + */ + public void setShowText(boolean showText) { + if (mShowText != showText) { + mShowText = showText; + requestLayout(); + } + } + + /** + * @return whether the on/off text should be displayed + */ + public boolean getShowText() { + return mShowText; + } + + @Override + public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + if (mShowText) { + if (mOnLayout == null) { + mOnLayout = makeLayout(mTextOn); + } + + if (mOffLayout == null) { + mOffLayout = makeLayout(mTextOff); + } + } + + final Rect padding = mTempRect; + final int thumbWidth; + final int thumbHeight; + if (mThumbDrawable != null) { + // Cached thumb width does not include padding. + mThumbDrawable.getPadding(padding); + thumbWidth = mThumbDrawable.getIntrinsicWidth() - padding.left - padding.right; + thumbHeight = mThumbDrawable.getIntrinsicHeight(); + } else { + thumbWidth = 0; + thumbHeight = 0; + } + + final int maxTextWidth; + if (mShowText) { + maxTextWidth = Math.max(mOnLayout.getWidth(), mOffLayout.getWidth()) + + mThumbTextPadding * 2; + } else { + maxTextWidth = 0; + } + + mThumbWidth = Math.max(maxTextWidth, thumbWidth); + + final int trackHeight; + if (mTrackDrawable != null) { + mTrackDrawable.getPadding(padding); + trackHeight = mTrackDrawable.getIntrinsicHeight(); + } else { + padding.setEmpty(); + trackHeight = 0; + } + + // Adjust left and right padding to ensure there's enough room for the + // thumb's padding (when present). + int paddingLeft = padding.left; + int paddingRight = padding.right; + if (mThumbDrawable != null) { + final Rect inset = DrawableUtils.getOpticalBounds(mThumbDrawable); + paddingLeft = Math.max(paddingLeft, inset.left); + paddingRight = Math.max(paddingRight, inset.right); + } + + final int switchWidth = Math.max(mSwitchMinWidth, + 2 * mThumbWidth + paddingLeft + paddingRight); + final int switchHeight = Math.max(trackHeight, thumbHeight); + mSwitchWidth = switchWidth; + mSwitchHeight = switchHeight; + + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + + final int measuredHeight = getMeasuredHeight(); + if (measuredHeight < switchHeight) { + setMeasuredDimension(ViewCompat.getMeasuredWidthAndState(this), switchHeight); + } + } + + @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) + @Override + public void onPopulateAccessibilityEvent(AccessibilityEvent event) { + super.onPopulateAccessibilityEvent(event); + + final CharSequence text = isChecked() ? mTextOn : mTextOff; + if (text != null) { + event.getText().add(text); + } + } + + private Layout makeLayout(CharSequence text) { + final CharSequence transformed = (mSwitchTransformationMethod != null) + ? mSwitchTransformationMethod.getTransformation(text, this) + : text; + + return new StaticLayout(transformed, mTextPaint, + transformed != null ? + (int) Math.ceil(Layout.getDesiredWidth(transformed, mTextPaint)) : 0, + Layout.Alignment.ALIGN_NORMAL, 1.f, 0, true); + } + + /** + * @return true if (x, y) is within the target area of the switch thumb + */ + private boolean hitThumb(float x, float y) { + if (mThumbDrawable == null) { + return false; + } + + // Relies on mTempRect, MUST be called first! + final int thumbOffset = getThumbOffset(); + + mThumbDrawable.getPadding(mTempRect); + final int thumbTop = mSwitchTop - mTouchSlop; + final int thumbLeft = mSwitchLeft + thumbOffset - 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; + } + + @Override + public boolean onTouchEvent(MotionEvent ev) { + mVelocityTracker.addMovement(ev); + final int action = MotionEventCompat.getActionMasked(ev); + switch (action) { + 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; + } + break; + } + + case MotionEvent.ACTION_MOVE: { + switch (mTouchMode) { + case TOUCH_MODE_IDLE: + // Didn't target the thumb, treat normally. + 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 int thumbScrollRange = getThumbScrollRange(); + final float thumbScrollOffset = x - mTouchX; + float dPos; + if (thumbScrollRange != 0) { + dPos = thumbScrollOffset / thumbScrollRange; + } else { + // If the thumb scroll range is empty, just use the + // movement direction to snap on or off. + dPos = thumbScrollOffset > 0 ? 1 : -1; + } + if (ViewUtils.isLayoutRtl(this)) { + dPos = -dPos; + } + final float newPos = constrain(mThumbPosition + dPos, 0, 1); + if (newPos != mThumbPosition) { + mTouchX = x; + setThumbPosition(newPos); + } + return true; + } + } + break; + } + + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: { + if (mTouchMode == TOUCH_MODE_DRAGGING) { + stopDrag(ev); + // Allow super class to handle pressed state, etc. + super.onTouchEvent(ev); + return true; + } + mTouchMode = TOUCH_MODE_IDLE; + mVelocityTracker.clear(); + break; + } + } + + return super.onTouchEvent(ev); + } + + private void cancelSuperTouch(MotionEvent ev) { + MotionEvent cancel = MotionEvent.obtain(ev); + cancel.setAction(MotionEvent.ACTION_CANCEL); + super.onTouchEvent(cancel); + cancel.recycle(); + } + + /** + * Called from onTouchEvent to end a drag operation. + * + * @param ev Event that triggered the end of drag mode - ACTION_UP or ACTION_CANCEL + */ + private void stopDrag(MotionEvent ev) { + mTouchMode = TOUCH_MODE_IDLE; + + // Commit the change if the event is up and not canceled and the switch + // has not been disabled during the drag. + final boolean commitChange = ev.getAction() == MotionEvent.ACTION_UP && isEnabled(); + final boolean oldState = isChecked(); + final boolean newState; + if (commitChange) { + mVelocityTracker.computeCurrentVelocity(1000); + final float xvel = mVelocityTracker.getXVelocity(); + if (Math.abs(xvel) > mMinFlingVelocity) { + newState = ViewUtils.isLayoutRtl(this) ? (xvel < 0) : (xvel > 0); + } else { + newState = getTargetCheckedState(); + } + } else { + newState = oldState; + } + + if (newState != oldState) { + playSoundEffect(SoundEffectConstants.CLICK); + setChecked(newState); + } + cancelSuperTouch(ev); + } + + private void animateThumbToCheckedState(boolean newCheckedState) { + final float startPosition = mThumbPosition; + final float targetPosition = newCheckedState ? 1 : 0; + final float diff = targetPosition - startPosition; + + mPositionAnimator = new Animation() { + @Override + protected void applyTransformation(float interpolatedTime, Transformation t) { + setThumbPosition(startPosition + (diff * interpolatedTime)); + } + }; + mPositionAnimator.setDuration(THUMB_ANIMATION_DURATION); + startAnimation(mPositionAnimator); + } + + private void cancelPositionAnimator() { + if (mPositionAnimator != null) { + clearAnimation(); + mPositionAnimator = null; + } + } + + private boolean getTargetCheckedState() { + return mThumbPosition > 0.5f; + } + + /** + * Sets the thumb position as a decimal value between 0 (off) and 1 (on). + * + * @param position new position between [0,1] + */ + private void setThumbPosition(float position) { + mThumbPosition = position; + invalidate(); + } + + @Override + public void toggle() { + setChecked(!isChecked()); + } + + @Override + public void setChecked(boolean checked) { + super.setChecked(checked); + + // Calling the super method may result in setChecked() getting called + // recursively with a different value, so load the REAL value... + checked = isChecked(); + + if (getWindowToken() != null && ViewCompat.isLaidOut(this)) { + animateThumbToCheckedState(checked); + } else { + // Immediately move the thumb to the new position. + cancelPositionAnimator(); + setThumbPosition(checked ? 1 : 0); + } + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); + + int opticalInsetLeft = 0; + int opticalInsetRight = 0; + if (mThumbDrawable != null) { + final Rect trackPadding = mTempRect; + if (mTrackDrawable != null) { + mTrackDrawable.getPadding(trackPadding); + } else { + trackPadding.setEmpty(); + } + + final Rect insets = DrawableUtils.getOpticalBounds(mThumbDrawable); + opticalInsetLeft = Math.max(0, insets.left - trackPadding.left); + opticalInsetRight = Math.max(0, insets.right - trackPadding.right); + } + + final int switchRight; + final int switchLeft; + if (ViewUtils.isLayoutRtl(this)) { + switchLeft = getPaddingLeft() + opticalInsetLeft; + switchRight = switchLeft + mSwitchWidth - opticalInsetLeft - opticalInsetRight; + } else { + switchRight = getWidth() - getPaddingRight() - opticalInsetRight; + switchLeft = switchRight - mSwitchWidth + opticalInsetLeft + opticalInsetRight; + } + + final int switchTop; + final int switchBottom; + 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 draw(Canvas c) { + final Rect padding = mTempRect; + final int switchLeft = mSwitchLeft; + final int switchTop = mSwitchTop; + final int switchRight = mSwitchRight; + final int switchBottom = mSwitchBottom; + + int thumbInitialLeft = switchLeft + getThumbOffset(); + + final Rect thumbInsets; + if (mThumbDrawable != null) { + thumbInsets = DrawableUtils.getOpticalBounds(mThumbDrawable); + } else { + thumbInsets = DrawableUtils.INSETS_NONE; + } + + // Layout the track. + if (mTrackDrawable != null) { + mTrackDrawable.getPadding(padding); + + // Adjust thumb position for track padding. + thumbInitialLeft += padding.left; + + // If necessary, offset by the optical insets of the thumb asset. + int trackLeft = switchLeft; + int trackTop = switchTop; + int trackRight = switchRight; + int trackBottom = switchBottom; + if (thumbInsets != null && !thumbInsets.isEmpty()) { + if (thumbInsets.left > padding.left) { + trackLeft += thumbInsets.left - padding.left; + } + if (thumbInsets.top > padding.top) { + trackTop += thumbInsets.top - padding.top; + } + if (thumbInsets.right > padding.right) { + trackRight -= thumbInsets.right - padding.right; + } + if (thumbInsets.bottom > padding.bottom) { + trackBottom -= thumbInsets.bottom - padding.bottom; + } + } + mTrackDrawable.setBounds(trackLeft, trackTop, trackRight, trackBottom); + } + + // Layout the thumb. + if (mThumbDrawable != null) { + mThumbDrawable.getPadding(padding); + + final int thumbLeft = thumbInitialLeft - padding.left; + final int thumbRight = thumbInitialLeft + mThumbWidth + padding.right; + mThumbDrawable.setBounds(thumbLeft, switchTop, thumbRight, switchBottom); + + final Drawable background = getBackground(); + if (background != null) { + DrawableCompat.setHotspotBounds(background, thumbLeft, switchTop, + thumbRight, switchBottom); + } + } + + // Draw the background. + super.draw(c); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + + final Rect padding = mTempRect; + final Drawable trackDrawable = mTrackDrawable; + if (trackDrawable != null) { + trackDrawable.getPadding(padding); + } else { + padding.setEmpty(); + } + + final int switchTop = mSwitchTop; + final int switchBottom = mSwitchBottom; + final int switchInnerTop = switchTop + padding.top; + final int switchInnerBottom = switchBottom - padding.bottom; + + final Drawable thumbDrawable = mThumbDrawable; + if (trackDrawable != null) { + if (mSplitTrack && thumbDrawable != null) { + final Rect insets = DrawableUtils.getOpticalBounds(thumbDrawable); + thumbDrawable.copyBounds(padding); + padding.left += insets.left; + padding.right -= insets.right; + + final int saveCount = canvas.save(); + canvas.clipRect(padding, Region.Op.DIFFERENCE); + trackDrawable.draw(canvas); + canvas.restoreToCount(saveCount); + } else { + trackDrawable.draw(canvas); + } + } + + final int saveCount = canvas.save(); + + if (thumbDrawable != null) { + thumbDrawable.draw(canvas); + } + + final Layout switchText = getTargetCheckedState() ? mOnLayout : mOffLayout; + if (switchText != null) { + final int drawableState[] = getDrawableState(); + if (mTextColors != null) { + mTextPaint.setColor(mTextColors.getColorForState(drawableState, 0)); + } + mTextPaint.drawableState = drawableState; + + final int cX; + if (thumbDrawable != null) { + final Rect bounds = thumbDrawable.getBounds(); + cX = bounds.left + bounds.right; + } else { + cX = getWidth(); + } + + final int left = cX / 2 - switchText.getWidth() / 2; + final int top = (switchInnerTop + switchInnerBottom) / 2 - switchText.getHeight() / 2; + canvas.translate(left, top); + switchText.draw(canvas); + } + + canvas.restoreToCount(saveCount); + } + + @Override + public int getCompoundPaddingLeft() { + if (!ViewUtils.isLayoutRtl(this)) { + return super.getCompoundPaddingLeft(); + } + int padding = super.getCompoundPaddingLeft() + mSwitchWidth; + if (!TextUtils.isEmpty(getText())) { + padding += mSwitchPadding; + } + return padding; + } + + @Override + public int getCompoundPaddingRight() { + if (ViewUtils.isLayoutRtl(this)) { + return super.getCompoundPaddingRight(); + } + int padding = super.getCompoundPaddingRight() + mSwitchWidth; + if (!TextUtils.isEmpty(getText())) { + padding += mSwitchPadding; + } + return padding; + } + + /** + * Translates thumb position to offset according to current RTL setting and + * thumb scroll range. Accounts for both track and thumb padding. + * + * @return thumb offset + */ + private int getThumbOffset() { + final float thumbPosition; + if (ViewUtils.isLayoutRtl(this)) { + thumbPosition = 1 - mThumbPosition; + } else { + thumbPosition = mThumbPosition; + } + return (int) (thumbPosition * getThumbScrollRange() + 0.5f); + } + + private int getThumbScrollRange() { + if (mTrackDrawable != null) { + final Rect padding = mTempRect; + mTrackDrawable.getPadding(padding); + + final Rect insets; + if (mThumbDrawable != null) { + insets = DrawableUtils.getOpticalBounds(mThumbDrawable); + } else { + insets = DrawableUtils.INSETS_NONE; + } + + return mSwitchWidth - mThumbWidth - padding.left - padding.right + - insets.left - insets.right; + } else { + return 0; + } + } + + @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 drawableStateChanged() { + super.drawableStateChanged(); + + final int[] myDrawableState = getDrawableState(); + + if (mThumbDrawable != null) { + mThumbDrawable.setState(myDrawableState); + } + + if (mTrackDrawable != null) { + mTrackDrawable.setState(myDrawableState); + } + + invalidate(); + } + + @Override + public void drawableHotspotChanged(float x, float y) { + if (Build.VERSION.SDK_INT >= 21) { + super.drawableHotspotChanged(x, y); + } + + if (mThumbDrawable != null) { + DrawableCompat.setHotspot(mThumbDrawable, x, y); + } + + if (mTrackDrawable != null) { + DrawableCompat.setHotspot(mTrackDrawable, x, y); + } + } + + @Override + protected boolean verifyDrawable(Drawable who) { + return super.verifyDrawable(who) || who == mThumbDrawable || who == mTrackDrawable; + } + + @Override + public void jumpDrawablesToCurrentState() { + if (Build.VERSION.SDK_INT >= 11) { + super.jumpDrawablesToCurrentState(); + + if (mThumbDrawable != null) { + mThumbDrawable.jumpToCurrentState(); + } + + if (mTrackDrawable != null) { + mTrackDrawable.jumpToCurrentState(); + } + + if (mPositionAnimator != null && !mPositionAnimator.hasEnded()) { + clearAnimation(); + mPositionAnimator = null; + } + } + } + + @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) + @Override + public void onInitializeAccessibilityEvent(AccessibilityEvent event) { + super.onInitializeAccessibilityEvent(event); + event.setClassName(ACCESSIBILITY_EVENT_CLASS_NAME); + } + + @Override + public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { + if (Build.VERSION.SDK_INT >= 14) { + super.onInitializeAccessibilityNodeInfo(info); + info.setClassName(ACCESSIBILITY_EVENT_CLASS_NAME); + 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); + } + } + } + } + + /** + * Taken from android.util.MathUtils + */ + private static float constrain(float amount, float low, float high) { + return amount < low ? low : (amount > high ? high : amount); + } +} \ No newline at end of file diff --git a/android/support/v7/widget/Toolbar.java b/android/support/v7/widget/Toolbar.java new file mode 100644 index 0000000000..fd7b328e61 --- /dev/null +++ b/android/support/v7/widget/Toolbar.java @@ -0,0 +1,2028 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.widget; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.os.Parcel; +import android.os.Parcelable; +import android.support.annotation.Nullable; +import android.support.v4.view.GravityCompat; +import android.support.v4.view.MarginLayoutParamsCompat; +import android.support.v4.view.MenuItemCompat; +import android.support.v4.view.MotionEventCompat; +import android.support.v4.view.ViewCompat; +import android.support.v7.app.ActionBar; +import android.support.v7.appcompat.R; +import android.support.v7.internal.view.SupportMenuInflater; +import android.support.v7.internal.view.menu.MenuBuilder; +import android.support.v7.internal.view.menu.MenuItemImpl; +import android.support.v7.internal.view.menu.MenuPresenter; +import android.support.v7.internal.view.menu.MenuView; +import android.support.v7.internal.view.menu.SubMenuBuilder; +import android.support.v7.internal.widget.DecorToolbar; +import android.support.v7.internal.widget.RtlSpacingHelper; +import android.support.v7.internal.widget.TintManager; +import android.support.v7.internal.widget.TintTypedArray; +import android.support.v7.internal.widget.ToolbarWidgetWrapper; +import android.support.v7.internal.widget.ViewUtils; +import android.support.v7.view.CollapsibleActionView; +import android.text.Layout; +import android.text.TextUtils; +import android.util.AttributeSet; +import android.view.ContextThemeWrapper; +import android.view.Gravity; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageButton; +import android.widget.ImageView; +import android.widget.TextView; + +import java.util.ArrayList; +import java.util.List; + +/** + * A standard toolbar for use within application content. + * + *

      A Toolbar is a generalization of {@link ActionBar action bars} for use + * within application layouts. While an action bar is traditionally part of an + * {@link android.app.Activity Activity's} opaque window decor controlled by the framework, + * a Toolbar may be placed at any arbitrary level of nesting within a view hierarchy. + * An application may choose to designate a Toolbar as the action bar for an Activity + * using the {@link android.support.v7.app.AppCompatActivity#setSupportActionBar(Toolbar) + * setSupportActionBar()} method.

      + * + *

      Toolbar supports a more focused feature set than ActionBar. From start to end, a toolbar + * may contain a combination of the following optional elements: + * + *

        + *
      • A navigation button. This may be an Up arrow, navigation menu toggle, close, + * collapse, done or another glyph of the app's choosing. This button should always be used + * to access other navigational destinations within the container of the Toolbar and + * its signified content or otherwise leave the current context signified by the Toolbar.
      • + *
      • A branded logo image. This may extend to the height of the bar and can be + * arbitrarily wide.
      • + *
      • A title and subtitle. The title should be a signpost for the Toolbar's current + * position in the navigation hierarchy and the content contained there. The subtitle, + * if present should indicate any extended information about the current content. + * If an app uses a logo image it should strongly consider omitting a title and subtitle.
      • + *
      • One or more custom views. The application may add arbitrary child views + * to the Toolbar. They will appear at this position within the layout. If a child view's + * {@link LayoutParams} indicates a {@link Gravity} value of + * {@link Gravity#CENTER_HORIZONTAL CENTER_HORIZONTAL} the view will attempt to center + * within the available space remaining in the Toolbar after all other elements have been + * measured.
      • + *
      • An {@link ActionMenuView action menu}. The menu of actions will pin to the + * end of the Toolbar offering a few + * + * frequent, important or typical actions along with an optional overflow menu for + * additional actions.
      • + *
      + *

      + * + *

      In modern Android UIs developers should lean more on a visually distinct color scheme for + * toolbars than on their application icon. The use of application icon plus title as a standard + * layout is discouraged on API 21 devices and newer.

      + */ +public class Toolbar extends ViewGroup { + private static final String TAG = "Toolbar"; + + private ActionMenuView mMenuView; + private TextView mTitleTextView; + private TextView mSubtitleTextView; + private ImageButton mNavButtonView; + private ImageView mLogoView; + + private Drawable mCollapseIcon; + private CharSequence mCollapseDescription; + private ImageButton mCollapseButtonView; + View mExpandedActionView; + + /** Context against which to inflate popup menus. */ + private Context mPopupContext; + + /** Theme resource against which to inflate popup menus. */ + private int mPopupTheme; + + private int mTitleTextAppearance; + private int mSubtitleTextAppearance; + + private int mButtonGravity; + + private int mMaxButtonHeight; + + private int mTitleMarginStart; + private int mTitleMarginEnd; + private int mTitleMarginTop; + private int mTitleMarginBottom; + + private final RtlSpacingHelper mContentInsets = new RtlSpacingHelper(); + + private int mGravity = GravityCompat.START | Gravity.CENTER_VERTICAL; + + private CharSequence mTitleText; + private CharSequence mSubtitleText; + + private int mTitleTextColor; + private int mSubtitleTextColor; + + private boolean mEatingTouch; + private boolean mEatingHover; + + // Clear me after use. + private final ArrayList mTempViews = new ArrayList(); + + private final int[] mTempMargins = new int[2]; + + private OnMenuItemClickListener mOnMenuItemClickListener; + + private final ActionMenuView.OnMenuItemClickListener mMenuViewItemClickListener = + new ActionMenuView.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + if (mOnMenuItemClickListener != null) { + return mOnMenuItemClickListener.onMenuItemClick(item); + } + return false; + } + }; + + private ToolbarWidgetWrapper mWrapper; + private ActionMenuPresenter mOuterActionMenuPresenter; + private ExpandedActionViewMenuPresenter mExpandedMenuPresenter; + private MenuPresenter.Callback mActionMenuPresenterCallback; + private MenuBuilder.Callback mMenuBuilderCallback; + + private boolean mCollapsible; + private int mMinHeight; + + private final Runnable mShowOverflowMenuRunnable = new Runnable() { + @Override public void run() { + showOverflowMenu(); + } + }; + + private final TintManager mTintManager; + + public Toolbar(Context context) { + this(context, null); + } + + public Toolbar(Context context, AttributeSet attrs) { + this(context, attrs, R.attr.toolbarStyle); + } + + public Toolbar(Context context, AttributeSet attrs, int defStyleAttr) { + // We manually themify the context here so that we don't break apps which only + // use app:theme when running on >= Lollipop + super(ViewUtils.themifyContext(context, attrs, false, true), attrs, defStyleAttr); + + // Need to use getContext() here so that we use the themed context + final TintTypedArray a = TintTypedArray.obtainStyledAttributes(getContext(), attrs, + R.styleable.Toolbar, defStyleAttr, 0); + + mTitleTextAppearance = a.getResourceId(R.styleable.Toolbar_titleTextAppearance, 0); + mSubtitleTextAppearance = a.getResourceId(R.styleable.Toolbar_subtitleTextAppearance, 0); + mGravity = a.getInteger(R.styleable.Toolbar_android_gravity, mGravity); + mButtonGravity = Gravity.TOP; + mTitleMarginStart = mTitleMarginEnd = mTitleMarginTop = mTitleMarginBottom = + a.getDimensionPixelOffset(R.styleable.Toolbar_titleMargins, 0); + + final int marginStart = a.getDimensionPixelOffset(R.styleable.Toolbar_titleMarginStart, -1); + if (marginStart >= 0) { + mTitleMarginStart = marginStart; + } + + final int marginEnd = a.getDimensionPixelOffset(R.styleable.Toolbar_titleMarginEnd, -1); + if (marginEnd >= 0) { + mTitleMarginEnd = marginEnd; + } + + final int marginTop = a.getDimensionPixelOffset(R.styleable.Toolbar_titleMarginTop, -1); + if (marginTop >= 0) { + mTitleMarginTop = marginTop; + } + + final int marginBottom = a.getDimensionPixelOffset(R.styleable.Toolbar_titleMarginBottom, + -1); + if (marginBottom >= 0) { + mTitleMarginBottom = marginBottom; + } + + mMaxButtonHeight = a.getDimensionPixelSize(R.styleable.Toolbar_maxButtonHeight, -1); + + final int contentInsetStart = + a.getDimensionPixelOffset(R.styleable.Toolbar_contentInsetStart, + RtlSpacingHelper.UNDEFINED); + final int contentInsetEnd = + a.getDimensionPixelOffset(R.styleable.Toolbar_contentInsetEnd, + RtlSpacingHelper.UNDEFINED); + final int contentInsetLeft = + a.getDimensionPixelSize(R.styleable.Toolbar_contentInsetLeft, 0); + final int contentInsetRight = + a.getDimensionPixelSize(R.styleable.Toolbar_contentInsetRight, 0); + + mContentInsets.setAbsolute(contentInsetLeft, contentInsetRight); + + if (contentInsetStart != RtlSpacingHelper.UNDEFINED || + contentInsetEnd != RtlSpacingHelper.UNDEFINED) { + mContentInsets.setRelative(contentInsetStart, contentInsetEnd); + } + + mCollapseIcon = a.getDrawable(R.styleable.Toolbar_collapseIcon); + mCollapseDescription = a.getText(R.styleable.Toolbar_collapseContentDescription); + + final CharSequence title = a.getText(R.styleable.Toolbar_title); + if (!TextUtils.isEmpty(title)) { + setTitle(title); + } + + final CharSequence subtitle = a.getText(R.styleable.Toolbar_subtitle); + if (!TextUtils.isEmpty(subtitle)) { + setSubtitle(subtitle); + } + // Set the default context, since setPopupTheme() may be a no-op. + mPopupContext = getContext(); + setPopupTheme(a.getResourceId(R.styleable.Toolbar_popupTheme, 0)); + + final Drawable navIcon = a.getDrawable(R.styleable.Toolbar_navigationIcon); + if (navIcon != null) { + setNavigationIcon(navIcon); + } + final CharSequence navDesc = a.getText(R.styleable.Toolbar_navigationContentDescription); + if (!TextUtils.isEmpty(navDesc)) { + setNavigationContentDescription(navDesc); + } + + // This is read for devices running pre-v16 + mMinHeight = a.getDimensionPixelSize(R.styleable.Toolbar_android_minHeight, 0); + + a.recycle(); + + // Keep the TintManager in case we need it later + mTintManager = a.getTintManager(); + } + + /** + * Specifies the theme to use when inflating popup menus. By default, uses + * the same theme as the toolbar itself. + * + * @param resId theme used to inflate popup menus + * @see #getPopupTheme() + */ + public void setPopupTheme(int resId) { + if (mPopupTheme != resId) { + mPopupTheme = resId; + if (resId == 0) { + mPopupContext = getContext(); + } else { + mPopupContext = new ContextThemeWrapper(getContext(), resId); + } + } + } + + /** + * @return resource identifier of the theme used to inflate popup menus, or + * 0 if menus are inflated against the toolbar theme + * @see #setPopupTheme(int) + */ + public int getPopupTheme() { + return mPopupTheme; + } + + public void onRtlPropertiesChanged(int layoutDirection) { + if (Build.VERSION.SDK_INT >= 17) { + super.onRtlPropertiesChanged(layoutDirection); + } + mContentInsets.setDirection(layoutDirection == ViewCompat.LAYOUT_DIRECTION_RTL); + } + + /** + * Set a logo drawable from a resource id. + * + *

      This drawable should generally take the place of title text. The logo cannot be + * clicked. Apps using a logo should also supply a description using + * {@link #setLogoDescription(int)}.

      + * + * @param resId ID of a drawable resource + */ + public void setLogo(int resId) { + setLogo(mTintManager.getDrawable(resId)); + } + + /** @hide */ + public boolean canShowOverflowMenu() { + return getVisibility() == VISIBLE && mMenuView != null && mMenuView.isOverflowReserved(); + } + + /** + * Check whether the overflow menu is currently showing. This may not reflect + * a pending show operation in progress. + * + * @return true if the overflow menu is currently showing + */ + public boolean isOverflowMenuShowing() { + return mMenuView != null && mMenuView.isOverflowMenuShowing(); + } + + /** @hide */ + public boolean isOverflowMenuShowPending() { + return mMenuView != null && mMenuView.isOverflowMenuShowPending(); + } + + /** + * Show the overflow items from the associated menu. + * + * @return true if the menu was able to be shown, false otherwise + */ + public boolean showOverflowMenu() { + return mMenuView != null && mMenuView.showOverflowMenu(); + } + + /** + * Hide the overflow items from the associated menu. + * + * @return true if the menu was able to be hidden, false otherwise + */ + public boolean hideOverflowMenu() { + return mMenuView != null && mMenuView.hideOverflowMenu(); + } + + /** @hide */ + public void setMenu(MenuBuilder menu, ActionMenuPresenter outerPresenter) { + if (menu == null && mMenuView == null) { + return; + } + + ensureMenuView(); + final MenuBuilder oldMenu = mMenuView.peekMenu(); + if (oldMenu == menu) { + return; + } + + if (oldMenu != null) { + oldMenu.removeMenuPresenter(mOuterActionMenuPresenter); + oldMenu.removeMenuPresenter(mExpandedMenuPresenter); + } + + if (mExpandedMenuPresenter == null) { + mExpandedMenuPresenter = new ExpandedActionViewMenuPresenter(); + } + + outerPresenter.setExpandedActionViewsExclusive(true); + if (menu != null) { + menu.addMenuPresenter(outerPresenter, mPopupContext); + menu.addMenuPresenter(mExpandedMenuPresenter, mPopupContext); + } else { + outerPresenter.initForMenu(mPopupContext, null); + mExpandedMenuPresenter.initForMenu(mPopupContext, null); + outerPresenter.updateMenuView(true); + mExpandedMenuPresenter.updateMenuView(true); + } + mMenuView.setPopupTheme(mPopupTheme); + mMenuView.setPresenter(outerPresenter); + mOuterActionMenuPresenter = outerPresenter; + } + + /** + * Dismiss all currently showing popup menus, including overflow or submenus. + */ + public void dismissPopupMenus() { + if (mMenuView != null) { + mMenuView.dismissPopupMenus(); + } + } + + /** @hide */ + public boolean isTitleTruncated() { + if (mTitleTextView == null) { + return false; + } + + final Layout titleLayout = mTitleTextView.getLayout(); + if (titleLayout == null) { + return false; + } + + final int lineCount = titleLayout.getLineCount(); + for (int i = 0; i < lineCount; i++) { + if (titleLayout.getEllipsisCount(i) > 0) { + return true; + } + } + return false; + } + + /** + * Set a logo drawable. + * + *

      This drawable should generally take the place of title text. The logo cannot be + * clicked. Apps using a logo should also supply a description using + * {@link #setLogoDescription(int)}.

      + * + * @param drawable Drawable to use as a logo + */ + public void setLogo(Drawable drawable) { + if (drawable != null) { + ensureLogoView(); + if (mLogoView.getParent() == null) { + addSystemView(mLogoView); + updateChildVisibilityForExpandedActionView(mLogoView); + } + } else if (mLogoView != null && mLogoView.getParent() != null) { + removeView(mLogoView); + } + if (mLogoView != null) { + mLogoView.setImageDrawable(drawable); + } + } + + /** + * Return the current logo drawable. + * + * @return The current logo drawable + * @see #setLogo(int) + * @see #setLogo(android.graphics.drawable.Drawable) + */ + public Drawable getLogo() { + return mLogoView != null ? mLogoView.getDrawable() : null; + } + + /** + * Set a description of the toolbar's logo. + * + *

      This description will be used for accessibility or other similar descriptions + * of the UI.

      + * + * @param resId String resource id + */ + public void setLogoDescription(int resId) { + setLogoDescription(getContext().getText(resId)); + } + + /** + * Set a description of the toolbar's logo. + * + *

      This description will be used for accessibility or other similar descriptions + * of the UI.

      + * + * @param description Description to set + */ + public void setLogoDescription(CharSequence description) { + if (!TextUtils.isEmpty(description)) { + ensureLogoView(); + } + if (mLogoView != null) { + mLogoView.setContentDescription(description); + } + } + + /** + * Return the description of the toolbar's logo. + * + * @return A description of the logo + */ + public CharSequence getLogoDescription() { + return mLogoView != null ? mLogoView.getContentDescription() : null; + } + + private void ensureLogoView() { + if (mLogoView == null) { + mLogoView = new ImageView(getContext()); + } + } + + /** + * Check whether this Toolbar is currently hosting an expanded action view. + * + *

      An action view may be expanded either directly from the + * {@link android.view.MenuItem MenuItem} it belongs to or by user action. If the Toolbar + * has an expanded action view it can be collapsed using the {@link #collapseActionView()} + * method.

      + * + * @return true if the Toolbar has an expanded action view + */ + public boolean hasExpandedActionView() { + return mExpandedMenuPresenter != null && + mExpandedMenuPresenter.mCurrentExpandedItem != null; + } + + /** + * Collapse a currently expanded action view. If this Toolbar does not have an + * expanded action view this method has no effect. + * + *

      An action view may be expanded either directly from the + * {@link android.view.MenuItem MenuItem} it belongs to or by user action.

      + * + * @see #hasExpandedActionView() + */ + public void collapseActionView() { + final MenuItemImpl item = mExpandedMenuPresenter == null ? null : + mExpandedMenuPresenter.mCurrentExpandedItem; + if (item != null) { + item.collapseActionView(); + } + } + + /** + * Returns the title of this toolbar. + * + * @return The current title. + */ + public CharSequence getTitle() { + return mTitleText; + } + + /** + * Set the title of this toolbar. + * + *

      A title should be used as the anchor for a section of content. It should + * describe or name the content being viewed.

      + * + * @param resId Resource ID of a string to set as the title + */ + public void setTitle(int resId) { + setTitle(getContext().getText(resId)); + } + + /** + * Set the title of this toolbar. + * + *

      A title should be used as the anchor for a section of content. It should + * describe or name the content being viewed.

      + * + * @param title Title to set + */ + public void setTitle(CharSequence title) { + if (!TextUtils.isEmpty(title)) { + if (mTitleTextView == null) { + final Context context = getContext(); + mTitleTextView = new TextView(context); + mTitleTextView.setSingleLine(); + mTitleTextView.setEllipsize(TextUtils.TruncateAt.END); + if (mTitleTextAppearance != 0) { + mTitleTextView.setTextAppearance(context, mTitleTextAppearance); + } + if (mTitleTextColor != 0) { + mTitleTextView.setTextColor(mTitleTextColor); + } + } + if (mTitleTextView.getParent() == null) { + addSystemView(mTitleTextView); + updateChildVisibilityForExpandedActionView(mTitleTextView); + } + } else if (mTitleTextView != null && mTitleTextView.getParent() != null) { + removeView(mTitleTextView); + } + if (mTitleTextView != null) { + mTitleTextView.setText(title); + } + mTitleText = title; + } + + /** + * Return the subtitle of this toolbar. + * + * @return The current subtitle + */ + public CharSequence getSubtitle() { + return mSubtitleText; + } + + /** + * Set the subtitle of this toolbar. + * + *

      Subtitles should express extended information about the current content.

      + * + * @param resId String resource ID + */ + public void setSubtitle(int resId) { + setSubtitle(getContext().getText(resId)); + } + + /** + * Set the subtitle of this toolbar. + * + *

      Subtitles should express extended information about the current content.

      + * + * @param subtitle Subtitle to set + */ + public void setSubtitle(CharSequence subtitle) { + if (!TextUtils.isEmpty(subtitle)) { + if (mSubtitleTextView == null) { + final Context context = getContext(); + mSubtitleTextView = new TextView(context); + mSubtitleTextView.setSingleLine(); + mSubtitleTextView.setEllipsize(TextUtils.TruncateAt.END); + if (mSubtitleTextAppearance != 0) { + mSubtitleTextView.setTextAppearance(context, mSubtitleTextAppearance); + } + if (mSubtitleTextColor != 0) { + mSubtitleTextView.setTextColor(mSubtitleTextColor); + } + } + if (mSubtitleTextView.getParent() == null) { + addSystemView(mSubtitleTextView); + updateChildVisibilityForExpandedActionView(mSubtitleTextView); + } + } else if (mSubtitleTextView != null && mSubtitleTextView.getParent() != null) { + removeView(mSubtitleTextView); + } + if (mSubtitleTextView != null) { + mSubtitleTextView.setText(subtitle); + } + mSubtitleText = subtitle; + } + + /** + * Sets the text color, size, style, hint color, and highlight color + * from the specified TextAppearance resource. + */ + public void setTitleTextAppearance(Context context, int resId) { + mTitleTextAppearance = resId; + if (mTitleTextView != null) { + mTitleTextView.setTextAppearance(context, resId); + } + } + + /** + * Sets the text color, size, style, hint color, and highlight color + * from the specified TextAppearance resource. + */ + public void setSubtitleTextAppearance(Context context, int resId) { + mSubtitleTextAppearance = resId; + if (mSubtitleTextView != null) { + mSubtitleTextView.setTextAppearance(context, resId); + } + } + + /** + * Sets the text color of the title, if present. + * + * @param color The new text color in 0xAARRGGBB format + */ + public void setTitleTextColor(int color) { + mTitleTextColor = color; + if (mTitleTextView != null) { + mTitleTextView.setTextColor(color); + } + } + + /** + * Sets the text color of the subtitle, if present. + * + * @param color The new text color in 0xAARRGGBB format + */ + public void setSubtitleTextColor(int color) { + mSubtitleTextColor = color; + if (mSubtitleTextView != null) { + mSubtitleTextView.setTextColor(color); + } + } + + /** + * Retrieve the currently configured content description for the navigation button view. + * This will be used to describe the navigation action to users through mechanisms such + * as screen readers or tooltips. + * + * @return The navigation button's content description + */ + @Nullable + public CharSequence getNavigationContentDescription() { + return mNavButtonView != null ? mNavButtonView.getContentDescription() : null; + } + + /** + * Set a content description for the navigation button if one is present. The content + * description will be read via screen readers or other accessibility systems to explain + * the action of the navigation button. + * + * @param resId Resource ID of a content description string to set, or 0 to + * clear the description + */ + public void setNavigationContentDescription(int resId) { + setNavigationContentDescription(resId != 0 ? getContext().getText(resId) : null); + } + + /** + * Set a content description for the navigation button if one is present. The content + * description will be read via screen readers or other accessibility systems to explain + * the action of the navigation button. + * + * @param description Content description to set, or null to + * clear the content description + */ + public void setNavigationContentDescription(@Nullable CharSequence description) { + if (!TextUtils.isEmpty(description)) { + ensureNavButtonView(); + } + if (mNavButtonView != null) { + mNavButtonView.setContentDescription(description); + } + } + + /** + * Set the icon to use for the toolbar's navigation button. + * + *

      The navigation button appears at the start of the toolbar if present. Setting an icon + * will make the navigation button visible.

      + * + *

      If you use a navigation icon you should also set a description for its action using + * {@link #setNavigationContentDescription(int)}. This is used for accessibility and + * tooltips.

      + * + * @param resId Resource ID of a drawable to set + */ + public void setNavigationIcon(int resId) { + setNavigationIcon(mTintManager.getDrawable(resId)); + } + + /** + * Set the icon to use for the toolbar's navigation button. + * + *

      The navigation button appears at the start of the toolbar if present. Setting an icon + * will make the navigation button visible.

      + * + *

      If you use a navigation icon you should also set a description for its action using + * {@link #setNavigationContentDescription(int)}. This is used for accessibility and + * tooltips.

      + * + * @param icon Drawable to set, may be null to clear the icon + */ + public void setNavigationIcon(@Nullable Drawable icon) { + if (icon != null) { + ensureNavButtonView(); + if (mNavButtonView.getParent() == null) { + addSystemView(mNavButtonView); + updateChildVisibilityForExpandedActionView(mNavButtonView); + } + } else if (mNavButtonView != null && mNavButtonView.getParent() != null) { + removeView(mNavButtonView); + } + if (mNavButtonView != null) { + mNavButtonView.setImageDrawable(icon); + } + } + + /** + * Return the current drawable used as the navigation icon. + * + * @return The navigation icon drawable + */ + @Nullable + public Drawable getNavigationIcon() { + return mNavButtonView != null ? mNavButtonView.getDrawable() : null; + } + + /** + * Set a listener to respond to navigation events. + * + *

      This listener will be called whenever the user clicks the navigation button + * at the start of the toolbar. An icon must be set for the navigation button to appear.

      + * + * @param listener Listener to set + * @see #setNavigationIcon(android.graphics.drawable.Drawable) + */ + public void setNavigationOnClickListener(OnClickListener listener) { + ensureNavButtonView(); + mNavButtonView.setOnClickListener(listener); + } + + /** + * Return the Menu shown in the toolbar. + * + *

      Applications that wish to populate the toolbar's menu can do so from here. To use + * an XML menu resource, use {@link #inflateMenu(int)}.

      + * + * @return The toolbar's Menu + */ + public Menu getMenu() { + ensureMenu(); + return mMenuView.getMenu(); + } + + private void ensureMenu() { + ensureMenuView(); + if (mMenuView.peekMenu() == null) { + // Initialize a new menu for the first time. + final MenuBuilder menu = (MenuBuilder) mMenuView.getMenu(); + if (mExpandedMenuPresenter == null) { + mExpandedMenuPresenter = new ExpandedActionViewMenuPresenter(); + } + mMenuView.setExpandedActionViewsExclusive(true); + menu.addMenuPresenter(mExpandedMenuPresenter, mPopupContext); + } + } + + private void ensureMenuView() { + if (mMenuView == null) { + mMenuView = new ActionMenuView(getContext()); + mMenuView.setPopupTheme(mPopupTheme); + mMenuView.setOnMenuItemClickListener(mMenuViewItemClickListener); + mMenuView.setMenuCallbacks(mActionMenuPresenterCallback, mMenuBuilderCallback); + final LayoutParams lp = generateDefaultLayoutParams(); + lp.gravity = GravityCompat.END | (mButtonGravity & Gravity.VERTICAL_GRAVITY_MASK); + mMenuView.setLayoutParams(lp); + addSystemView(mMenuView); + } + } + + private MenuInflater getMenuInflater() { + return new SupportMenuInflater(getContext()); + } + + /** + * Inflate a menu resource into this toolbar. + * + *

      Inflate an XML menu resource into this toolbar. Existing items in the menu will not + * be modified or removed.

      + * + * @param resId ID of a menu resource to inflate + */ + public void inflateMenu(int resId) { + getMenuInflater().inflate(resId, getMenu()); + } + + /** + * Set a listener to respond to menu item click events. + * + *

      This listener will be invoked whenever a user selects a menu item from + * the action buttons presented at the end of the toolbar or the associated overflow.

      + * + * @param listener Listener to set + */ + public void setOnMenuItemClickListener(OnMenuItemClickListener listener) { + mOnMenuItemClickListener = listener; + } + + /** + * Set the content insets for this toolbar relative to layout direction. + * + *

      The content inset affects the valid area for Toolbar content other than + * the navigation button and menu. Insets define the minimum margin for these components + * and can be used to effectively align Toolbar content along well-known gridlines.

      + * + * @param contentInsetStart Content inset for the toolbar starting edge + * @param contentInsetEnd Content inset for the toolbar ending edge + * + * @see #setContentInsetsAbsolute(int, int) + * @see #getContentInsetStart() + * @see #getContentInsetEnd() + * @see #getContentInsetLeft() + * @see #getContentInsetRight() + */ + public void setContentInsetsRelative(int contentInsetStart, int contentInsetEnd) { + mContentInsets.setRelative(contentInsetStart, contentInsetEnd); + } + + /** + * Get the starting content inset for this toolbar. + * + *

      The content inset affects the valid area for Toolbar content other than + * the navigation button and menu. Insets define the minimum margin for these components + * and can be used to effectively align Toolbar content along well-known gridlines.

      + * + * @return The starting content inset for this toolbar + * + * @see #setContentInsetsRelative(int, int) + * @see #setContentInsetsAbsolute(int, int) + * @see #getContentInsetEnd() + * @see #getContentInsetLeft() + * @see #getContentInsetRight() + */ + public int getContentInsetStart() { + return mContentInsets.getStart(); + } + + /** + * Get the ending content inset for this toolbar. + * + *

      The content inset affects the valid area for Toolbar content other than + * the navigation button and menu. Insets define the minimum margin for these components + * and can be used to effectively align Toolbar content along well-known gridlines.

      + * + * @return The ending content inset for this toolbar + * + * @see #setContentInsetsRelative(int, int) + * @see #setContentInsetsAbsolute(int, int) + * @see #getContentInsetStart() + * @see #getContentInsetLeft() + * @see #getContentInsetRight() + */ + public int getContentInsetEnd() { + return mContentInsets.getEnd(); + } + + /** + * Set the content insets for this toolbar. + * + *

      The content inset affects the valid area for Toolbar content other than + * the navigation button and menu. Insets define the minimum margin for these components + * and can be used to effectively align Toolbar content along well-known gridlines.

      + * + * @param contentInsetLeft Content inset for the toolbar's left edge + * @param contentInsetRight Content inset for the toolbar's right edge + * + * @see #setContentInsetsAbsolute(int, int) + * @see #getContentInsetStart() + * @see #getContentInsetEnd() + * @see #getContentInsetLeft() + * @see #getContentInsetRight() + */ + public void setContentInsetsAbsolute(int contentInsetLeft, int contentInsetRight) { + mContentInsets.setAbsolute(contentInsetLeft, contentInsetRight); + } + + /** + * Get the left content inset for this toolbar. + * + *

      The content inset affects the valid area for Toolbar content other than + * the navigation button and menu. Insets define the minimum margin for these components + * and can be used to effectively align Toolbar content along well-known gridlines.

      + * + * @return The left content inset for this toolbar + * + * @see #setContentInsetsRelative(int, int) + * @see #setContentInsetsAbsolute(int, int) + * @see #getContentInsetStart() + * @see #getContentInsetEnd() + * @see #getContentInsetRight() + */ + public int getContentInsetLeft() { + return mContentInsets.getLeft(); + } + + /** + * Get the right content inset for this toolbar. + * + *

      The content inset affects the valid area for Toolbar content other than + * the navigation button and menu. Insets define the minimum margin for these components + * and can be used to effectively align Toolbar content along well-known gridlines.

      + * + * @return The right content inset for this toolbar + * + * @see #setContentInsetsRelative(int, int) + * @see #setContentInsetsAbsolute(int, int) + * @see #getContentInsetStart() + * @see #getContentInsetEnd() + * @see #getContentInsetLeft() + */ + public int getContentInsetRight() { + return mContentInsets.getRight(); + } + + private void ensureNavButtonView() { + if (mNavButtonView == null) { + mNavButtonView = new ImageButton(getContext(), null, + R.attr.toolbarNavigationButtonStyle); + final LayoutParams lp = generateDefaultLayoutParams(); + lp.gravity = GravityCompat.START | (mButtonGravity & Gravity.VERTICAL_GRAVITY_MASK); + mNavButtonView.setLayoutParams(lp); + } + } + + private void ensureCollapseButtonView() { + if (mCollapseButtonView == null) { + mCollapseButtonView = new ImageButton(getContext(), null, + R.attr.toolbarNavigationButtonStyle); + mCollapseButtonView.setImageDrawable(mCollapseIcon); + mCollapseButtonView.setContentDescription(mCollapseDescription); + final LayoutParams lp = generateDefaultLayoutParams(); + lp.gravity = GravityCompat.START | (mButtonGravity & Gravity.VERTICAL_GRAVITY_MASK); + lp.mViewType = LayoutParams.EXPANDED; + mCollapseButtonView.setLayoutParams(lp); + mCollapseButtonView.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + collapseActionView(); + } + }); + } + } + + private void addSystemView(View v) { + final ViewGroup.LayoutParams vlp = v.getLayoutParams(); + final LayoutParams lp; + if (vlp == null) { + lp = generateDefaultLayoutParams(); + } else if (!checkLayoutParams(vlp)) { + lp = generateLayoutParams(vlp); + } else { + lp = (LayoutParams) vlp; + } + lp.mViewType = LayoutParams.SYSTEM; + addView(v, lp); + } + + @Override + protected Parcelable onSaveInstanceState() { + SavedState state = new SavedState(super.onSaveInstanceState()); + + if (mExpandedMenuPresenter != null && mExpandedMenuPresenter.mCurrentExpandedItem != null) { + state.expandedMenuItemId = mExpandedMenuPresenter.mCurrentExpandedItem.getItemId(); + } + + state.isOverflowOpen = isOverflowMenuShowing(); + return state; + } + + @Override + protected void onRestoreInstanceState(Parcelable state) { + final SavedState ss = (SavedState) state; + super.onRestoreInstanceState(ss.getSuperState()); + + final Menu menu = mMenuView != null ? mMenuView.peekMenu() : null; + if (ss.expandedMenuItemId != 0 && mExpandedMenuPresenter != null && menu != null) { + final MenuItem item = menu.findItem(ss.expandedMenuItemId); + if (item != null) { + MenuItemCompat.expandActionView(item); + } + } + + if (ss.isOverflowOpen) { + postShowOverflowMenu(); + } + } + + private void postShowOverflowMenu() { + removeCallbacks(mShowOverflowMenuRunnable); + post(mShowOverflowMenuRunnable); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + removeCallbacks(mShowOverflowMenuRunnable); + } + + @Override + public boolean onTouchEvent(MotionEvent ev) { + // Toolbars always eat touch events, but should still respect the touch event dispatch + // contract. If the normal View implementation doesn't want the events, we'll just silently + // eat the rest of the gesture without reporting the events to the default implementation + // since that's what it expects. + + final int action = MotionEventCompat.getActionMasked(ev); + if (action == MotionEvent.ACTION_DOWN) { + mEatingTouch = false; + } + + if (!mEatingTouch) { + final boolean handled = super.onTouchEvent(ev); + if (action == MotionEvent.ACTION_DOWN && !handled) { + mEatingTouch = true; + } + } + + if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) { + mEatingTouch = false; + } + + return true; + } + + @Override + public boolean onHoverEvent(MotionEvent ev) { + // Same deal as onTouchEvent() above. Eat all hover events, but still + // respect the touch event dispatch contract. + + final int action = MotionEventCompat.getActionMasked(ev); + if (action == MotionEvent.ACTION_HOVER_ENTER) { + mEatingHover = false; + } + + if (!mEatingHover) { + final boolean handled = super.onHoverEvent(ev); + if (action == MotionEvent.ACTION_HOVER_ENTER && !handled) { + mEatingHover = true; + } + } + + if (action == MotionEvent.ACTION_HOVER_EXIT || action == MotionEvent.ACTION_CANCEL) { + mEatingHover = false; + } + + return true; + } + + private void measureChildConstrained(View child, int parentWidthSpec, int widthUsed, + int parentHeightSpec, int heightUsed, int heightConstraint) { + final MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams(); + + int childWidthSpec = getChildMeasureSpec(parentWidthSpec, + getPaddingLeft() + getPaddingRight() + lp.leftMargin + lp.rightMargin + + widthUsed, lp.width); + int childHeightSpec = getChildMeasureSpec(parentHeightSpec, + getPaddingTop() + getPaddingBottom() + lp.topMargin + lp.bottomMargin + + heightUsed, lp.height); + + final int childHeightMode = MeasureSpec.getMode(childHeightSpec); + if (childHeightMode != MeasureSpec.EXACTLY && heightConstraint >= 0) { + final int size = childHeightMode != MeasureSpec.UNSPECIFIED ? + Math.min(MeasureSpec.getSize(childHeightSpec), heightConstraint) : + heightConstraint; + childHeightSpec = MeasureSpec.makeMeasureSpec(size, MeasureSpec.EXACTLY); + } + child.measure(childWidthSpec, childHeightSpec); + } + + /** + * Returns the width + uncollapsed margins + */ + private int measureChildCollapseMargins(View child, + int parentWidthMeasureSpec, int widthUsed, + int parentHeightMeasureSpec, int heightUsed, int[] collapsingMargins) { + final MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams(); + + final int leftDiff = lp.leftMargin - collapsingMargins[0]; + final int rightDiff = lp.rightMargin - collapsingMargins[1]; + final int leftMargin = Math.max(0, leftDiff); + final int rightMargin = Math.max(0, rightDiff); + final int hMargins = leftMargin + rightMargin; + collapsingMargins[0] = Math.max(0, -leftDiff); + collapsingMargins[1] = Math.max(0, -rightDiff); + + final int childWidthMeasureSpec = getChildMeasureSpec(parentWidthMeasureSpec, + getPaddingLeft() + getPaddingRight() + hMargins + widthUsed, lp.width); + final int childHeightMeasureSpec = getChildMeasureSpec(parentHeightMeasureSpec, + getPaddingTop() + getPaddingBottom() + lp.topMargin + lp.bottomMargin + + heightUsed, lp.height); + + child.measure(childWidthMeasureSpec, childHeightMeasureSpec); + return child.getMeasuredWidth() + hMargins; + } + + /** + * Returns true if the Toolbar is collapsible and has no child views with a measured size > 0. + */ + private boolean shouldCollapse() { + if (!mCollapsible) return false; + + final int childCount = getChildCount(); + for (int i = 0; i < childCount; i++) { + final View child = getChildAt(i); + if (shouldLayout(child) && child.getMeasuredWidth() > 0 && + child.getMeasuredHeight() > 0) { + return false; + } + } + return true; + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int width = 0; + int height = 0; + int childState = 0; + + final int[] collapsingMargins = mTempMargins; + final int marginStartIndex; + final int marginEndIndex; + if (ViewUtils.isLayoutRtl(this)) { + marginStartIndex = 1; + marginEndIndex = 0; + } else { + marginStartIndex = 0; + marginEndIndex = 1; + } + + // System views measure first. + + int navWidth = 0; + if (shouldLayout(mNavButtonView)) { + measureChildConstrained(mNavButtonView, widthMeasureSpec, width, heightMeasureSpec, 0, + mMaxButtonHeight); + navWidth = mNavButtonView.getMeasuredWidth() + getHorizontalMargins(mNavButtonView); + height = Math.max(height, mNavButtonView.getMeasuredHeight() + + getVerticalMargins(mNavButtonView)); + childState = ViewUtils.combineMeasuredStates(childState, + ViewCompat.getMeasuredState(mNavButtonView)); + } + + if (shouldLayout(mCollapseButtonView)) { + measureChildConstrained(mCollapseButtonView, widthMeasureSpec, width, + heightMeasureSpec, 0, mMaxButtonHeight); + navWidth = mCollapseButtonView.getMeasuredWidth() + + getHorizontalMargins(mCollapseButtonView); + height = Math.max(height, mCollapseButtonView.getMeasuredHeight() + + getVerticalMargins(mCollapseButtonView)); + childState = ViewUtils.combineMeasuredStates(childState, + ViewCompat.getMeasuredState(mCollapseButtonView)); + } + + final int contentInsetStart = getContentInsetStart(); + width += Math.max(contentInsetStart, navWidth); + collapsingMargins[marginStartIndex] = Math.max(0, contentInsetStart - navWidth); + + int menuWidth = 0; + if (shouldLayout(mMenuView)) { + measureChildConstrained(mMenuView, widthMeasureSpec, width, heightMeasureSpec, 0, + mMaxButtonHeight); + menuWidth = mMenuView.getMeasuredWidth() + getHorizontalMargins(mMenuView); + height = Math.max(height, mMenuView.getMeasuredHeight() + + getVerticalMargins(mMenuView)); + childState = ViewUtils.combineMeasuredStates(childState, + ViewCompat.getMeasuredState(mMenuView)); + } + + final int contentInsetEnd = getContentInsetEnd(); + width += Math.max(contentInsetEnd, menuWidth); + collapsingMargins[marginEndIndex] = Math.max(0, contentInsetEnd - menuWidth); + + if (shouldLayout(mExpandedActionView)) { + width += measureChildCollapseMargins(mExpandedActionView, widthMeasureSpec, width, + heightMeasureSpec, 0, collapsingMargins); + height = Math.max(height, mExpandedActionView.getMeasuredHeight() + + getVerticalMargins(mExpandedActionView)); + childState = ViewUtils.combineMeasuredStates(childState, + ViewCompat.getMeasuredState(mExpandedActionView)); + } + + if (shouldLayout(mLogoView)) { + width += measureChildCollapseMargins(mLogoView, widthMeasureSpec, width, + heightMeasureSpec, 0, collapsingMargins); + height = Math.max(height, mLogoView.getMeasuredHeight() + + getVerticalMargins(mLogoView)); + childState = ViewUtils.combineMeasuredStates(childState, + ViewCompat.getMeasuredState(mLogoView)); + } + + final int childCount = getChildCount(); + for (int i = 0; i < childCount; i++) { + final View child = getChildAt(i); + final LayoutParams lp = (LayoutParams) child.getLayoutParams(); + if (lp.mViewType != LayoutParams.CUSTOM || !shouldLayout(child)) { + // We already got all system views above. Skip them and GONE views. + continue; + } + + width += measureChildCollapseMargins(child, widthMeasureSpec, width, + heightMeasureSpec, 0, collapsingMargins); + height = Math.max(height, child.getMeasuredHeight() + getVerticalMargins(child)); + childState = ViewUtils.combineMeasuredStates(childState, + ViewCompat.getMeasuredState(child)); + } + + int titleWidth = 0; + int titleHeight = 0; + final int titleVertMargins = mTitleMarginTop + mTitleMarginBottom; + final int titleHorizMargins = mTitleMarginStart + mTitleMarginEnd; + if (shouldLayout(mTitleTextView)) { + titleWidth = measureChildCollapseMargins(mTitleTextView, widthMeasureSpec, + width + titleHorizMargins, heightMeasureSpec, titleVertMargins, + collapsingMargins); + titleWidth = mTitleTextView.getMeasuredWidth() + getHorizontalMargins(mTitleTextView); + titleHeight = mTitleTextView.getMeasuredHeight() + getVerticalMargins(mTitleTextView); + childState = ViewUtils.combineMeasuredStates(childState, + ViewCompat.getMeasuredState(mTitleTextView)); + } + if (shouldLayout(mSubtitleTextView)) { + titleWidth = Math.max(titleWidth, measureChildCollapseMargins(mSubtitleTextView, + widthMeasureSpec, width + titleHorizMargins, + heightMeasureSpec, titleHeight + titleVertMargins, + collapsingMargins)); + titleHeight += mSubtitleTextView.getMeasuredHeight() + + getVerticalMargins(mSubtitleTextView); + childState = ViewUtils.combineMeasuredStates(childState, + ViewCompat.getMeasuredState(mSubtitleTextView)); + } + + width += titleWidth; + height = Math.max(height, titleHeight); + + // Measurement already took padding into account for available space for the children, + // add it in for the final size. + width += getPaddingLeft() + getPaddingRight(); + height += getPaddingTop() + getPaddingBottom(); + + final int measuredWidth = ViewCompat.resolveSizeAndState( + Math.max(width, getSuggestedMinimumWidth()), + widthMeasureSpec, childState & ViewCompat.MEASURED_STATE_MASK); + final int measuredHeight = ViewCompat.resolveSizeAndState( + Math.max(height, getSuggestedMinimumHeight()), + heightMeasureSpec, childState << ViewCompat.MEASURED_HEIGHT_STATE_SHIFT); + + setMeasuredDimension(measuredWidth, shouldCollapse() ? 0 : measuredHeight); + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + final boolean isRtl = ViewCompat.getLayoutDirection(this) == ViewCompat.LAYOUT_DIRECTION_RTL; + final int width = getWidth(); + final int height = getHeight(); + final int paddingLeft = getPaddingLeft(); + final int paddingRight = getPaddingRight(); + final int paddingTop = getPaddingTop(); + final int paddingBottom = getPaddingBottom(); + int left = paddingLeft; + int right = width - paddingRight; + + final int[] collapsingMargins = mTempMargins; + collapsingMargins[0] = collapsingMargins[1] = 0; + + // Align views within the minimum toolbar height, if set. + final int alignmentHeight = getMinimumHeightCompat(); + + if (shouldLayout(mNavButtonView)) { + if (isRtl) { + right = layoutChildRight(mNavButtonView, right, collapsingMargins, + alignmentHeight); + } else { + left = layoutChildLeft(mNavButtonView, left, collapsingMargins, + alignmentHeight); + } + } + + if (shouldLayout(mCollapseButtonView)) { + if (isRtl) { + right = layoutChildRight(mCollapseButtonView, right, collapsingMargins, + alignmentHeight); + } else { + left = layoutChildLeft(mCollapseButtonView, left, collapsingMargins, + alignmentHeight); + } + } + + if (shouldLayout(mMenuView)) { + if (isRtl) { + left = layoutChildLeft(mMenuView, left, collapsingMargins, + alignmentHeight); + } else { + right = layoutChildRight(mMenuView, right, collapsingMargins, + alignmentHeight); + } + } + + collapsingMargins[0] = Math.max(0, getContentInsetLeft() - left); + collapsingMargins[1] = Math.max(0, getContentInsetRight() - (width - paddingRight - right)); + left = Math.max(left, getContentInsetLeft()); + right = Math.min(right, width - paddingRight - getContentInsetRight()); + + if (shouldLayout(mExpandedActionView)) { + if (isRtl) { + right = layoutChildRight(mExpandedActionView, right, collapsingMargins, + alignmentHeight); + } else { + left = layoutChildLeft(mExpandedActionView, left, collapsingMargins, + alignmentHeight); + } + } + + if (shouldLayout(mLogoView)) { + if (isRtl) { + right = layoutChildRight(mLogoView, right, collapsingMargins, + alignmentHeight); + } else { + left = layoutChildLeft(mLogoView, left, collapsingMargins, + alignmentHeight); + } + } + + final boolean layoutTitle = shouldLayout(mTitleTextView); + final boolean layoutSubtitle = shouldLayout(mSubtitleTextView); + int titleHeight = 0; + if (layoutTitle) { + final LayoutParams lp = (LayoutParams) mTitleTextView.getLayoutParams(); + titleHeight += lp.topMargin + mTitleTextView.getMeasuredHeight() + lp.bottomMargin; + } + if (layoutSubtitle) { + final LayoutParams lp = (LayoutParams) mSubtitleTextView.getLayoutParams(); + titleHeight += lp.topMargin + mSubtitleTextView.getMeasuredHeight() + lp.bottomMargin; + } + + if (layoutTitle || layoutSubtitle) { + int titleTop; + final View topChild = layoutTitle ? mTitleTextView : mSubtitleTextView; + final View bottomChild = layoutSubtitle ? mSubtitleTextView : mTitleTextView; + final LayoutParams toplp = (LayoutParams) topChild.getLayoutParams(); + final LayoutParams bottomlp = (LayoutParams) bottomChild.getLayoutParams(); + final boolean titleHasWidth = layoutTitle && mTitleTextView.getMeasuredWidth() > 0 + || layoutSubtitle && mSubtitleTextView.getMeasuredWidth() > 0; + + switch (mGravity & Gravity.VERTICAL_GRAVITY_MASK) { + case Gravity.TOP: + titleTop = getPaddingTop() + toplp.topMargin + mTitleMarginTop; + break; + default: + case Gravity.CENTER_VERTICAL: + final int space = height - paddingTop - paddingBottom; + int spaceAbove = (space - titleHeight) / 2; + if (spaceAbove < toplp.topMargin + mTitleMarginTop) { + spaceAbove = toplp.topMargin + mTitleMarginTop; + } else { + final int spaceBelow = height - paddingBottom - titleHeight - + spaceAbove - paddingTop; + if (spaceBelow < toplp.bottomMargin + mTitleMarginBottom) { + spaceAbove = Math.max(0, spaceAbove - + (bottomlp.bottomMargin + mTitleMarginBottom - spaceBelow)); + } + } + titleTop = paddingTop + spaceAbove; + break; + case Gravity.BOTTOM: + titleTop = height - paddingBottom - bottomlp.bottomMargin - mTitleMarginBottom - + titleHeight; + break; + } + if (isRtl) { + final int rd = (titleHasWidth ? mTitleMarginStart : 0) - collapsingMargins[1]; + right -= Math.max(0, rd); + collapsingMargins[1] = Math.max(0, -rd); + int titleRight = right; + int subtitleRight = right; + + if (layoutTitle) { + final LayoutParams lp = (LayoutParams) mTitleTextView.getLayoutParams(); + final int titleLeft = titleRight - mTitleTextView.getMeasuredWidth(); + final int titleBottom = titleTop + mTitleTextView.getMeasuredHeight(); + mTitleTextView.layout(titleLeft, titleTop, titleRight, titleBottom); + titleRight = titleLeft - mTitleMarginEnd; + titleTop = titleBottom + lp.bottomMargin; + } + if (layoutSubtitle) { + final LayoutParams lp = (LayoutParams) mSubtitleTextView.getLayoutParams(); + titleTop += lp.topMargin; + final int subtitleLeft = subtitleRight - mSubtitleTextView.getMeasuredWidth(); + final int subtitleBottom = titleTop + mSubtitleTextView.getMeasuredHeight(); + mSubtitleTextView.layout(subtitleLeft, titleTop, subtitleRight, subtitleBottom); + subtitleRight = subtitleRight - mTitleMarginEnd; + titleTop = subtitleBottom + lp.bottomMargin; + } + if (titleHasWidth) { + right = Math.min(titleRight, subtitleRight); + } + } else { + final int ld = (titleHasWidth ? mTitleMarginStart : 0) - collapsingMargins[0]; + left += Math.max(0, ld); + collapsingMargins[0] = Math.max(0, -ld); + int titleLeft = left; + int subtitleLeft = left; + + if (layoutTitle) { + final LayoutParams lp = (LayoutParams) mTitleTextView.getLayoutParams(); + final int titleRight = titleLeft + mTitleTextView.getMeasuredWidth(); + final int titleBottom = titleTop + mTitleTextView.getMeasuredHeight(); + mTitleTextView.layout(titleLeft, titleTop, titleRight, titleBottom); + titleLeft = titleRight + mTitleMarginEnd; + titleTop = titleBottom + lp.bottomMargin; + } + if (layoutSubtitle) { + final LayoutParams lp = (LayoutParams) mSubtitleTextView.getLayoutParams(); + titleTop += lp.topMargin; + final int subtitleRight = subtitleLeft + mSubtitleTextView.getMeasuredWidth(); + final int subtitleBottom = titleTop + mSubtitleTextView.getMeasuredHeight(); + mSubtitleTextView.layout(subtitleLeft, titleTop, subtitleRight, subtitleBottom); + subtitleLeft = subtitleRight + mTitleMarginEnd; + titleTop = subtitleBottom + lp.bottomMargin; + } + if (titleHasWidth) { + left = Math.max(titleLeft, subtitleLeft); + } + } + } + + // Get all remaining children sorted for layout. This is all prepared + // such that absolute layout direction can be used below. + + addCustomViewsWithGravity(mTempViews, Gravity.LEFT); + final int leftViewsCount = mTempViews.size(); + for (int i = 0; i < leftViewsCount; i++) { + left = layoutChildLeft(mTempViews.get(i), left, collapsingMargins, + alignmentHeight); + } + + addCustomViewsWithGravity(mTempViews, Gravity.RIGHT); + final int rightViewsCount = mTempViews.size(); + for (int i = 0; i < rightViewsCount; i++) { + right = layoutChildRight(mTempViews.get(i), right, collapsingMargins, + alignmentHeight); + } + + // Centered views try to center with respect to the whole bar, but views pinned + // to the left or right can push the mass of centered views to one side or the other. + addCustomViewsWithGravity(mTempViews, Gravity.CENTER_HORIZONTAL); + final int centerViewsWidth = getViewListMeasuredWidth(mTempViews, collapsingMargins); + final int parentCenter = paddingLeft + (width - paddingLeft - paddingRight) / 2; + final int halfCenterViewsWidth = centerViewsWidth / 2; + int centerLeft = parentCenter - halfCenterViewsWidth; + final int centerRight = centerLeft + centerViewsWidth; + if (centerLeft < left) { + centerLeft = left; + } else if (centerRight > right) { + centerLeft -= centerRight - right; + } + + final int centerViewsCount = mTempViews.size(); + for (int i = 0; i < centerViewsCount; i++) { + centerLeft = layoutChildLeft(mTempViews.get(i), centerLeft, collapsingMargins, + alignmentHeight); + } + + mTempViews.clear(); + } + + private int getViewListMeasuredWidth(List views, int[] collapsingMargins) { + int collapseLeft = collapsingMargins[0]; + int collapseRight = collapsingMargins[1]; + int width = 0; + final int count = views.size(); + for (int i = 0; i < count; i++) { + final View v = views.get(i); + final LayoutParams lp = (LayoutParams) v.getLayoutParams(); + final int l = lp.leftMargin - collapseLeft; + final int r = lp.rightMargin - collapseRight; + final int leftMargin = Math.max(0, l); + final int rightMargin = Math.max(0, r); + collapseLeft = Math.max(0, -l); + collapseRight = Math.max(0, -r); + width += leftMargin + v.getMeasuredWidth() + rightMargin; + } + return width; + } + + private int layoutChildLeft(View child, int left, int[] collapsingMargins, + int alignmentHeight) { + final LayoutParams lp = (LayoutParams) child.getLayoutParams(); + final int l = lp.leftMargin - collapsingMargins[0]; + left += Math.max(0, l); + collapsingMargins[0] = Math.max(0, -l); + final int top = getChildTop(child, alignmentHeight); + final int childWidth = child.getMeasuredWidth(); + child.layout(left, top, left + childWidth, top + child.getMeasuredHeight()); + left += childWidth + lp.rightMargin; + return left; + } + + private int layoutChildRight(View child, int right, int[] collapsingMargins, + int alignmentHeight) { + final LayoutParams lp = (LayoutParams) child.getLayoutParams(); + final int r = lp.rightMargin - collapsingMargins[1]; + right -= Math.max(0, r); + collapsingMargins[1] = Math.max(0, -r); + final int top = getChildTop(child, alignmentHeight); + final int childWidth = child.getMeasuredWidth(); + child.layout(right - childWidth, top, right, top + child.getMeasuredHeight()); + right -= childWidth + lp.leftMargin; + return right; + } + + private int getChildTop(View child, int alignmentHeight) { + final LayoutParams lp = (LayoutParams) child.getLayoutParams(); + final int childHeight = child.getMeasuredHeight(); + final int alignmentOffset = alignmentHeight > 0 ? (childHeight - alignmentHeight) / 2 : 0; + switch (getChildVerticalGravity(lp.gravity)) { + case Gravity.TOP: + return getPaddingTop() - alignmentOffset; + + case Gravity.BOTTOM: + return getHeight() - getPaddingBottom() - childHeight + - lp.bottomMargin - alignmentOffset; + + default: + case Gravity.CENTER_VERTICAL: + final int paddingTop = getPaddingTop(); + final int paddingBottom = getPaddingBottom(); + final int height = getHeight(); + final int space = height - paddingTop - paddingBottom; + int spaceAbove = (space - childHeight) / 2; + if (spaceAbove < lp.topMargin) { + spaceAbove = lp.topMargin; + } else { + final int spaceBelow = height - paddingBottom - childHeight - + spaceAbove - paddingTop; + if (spaceBelow < lp.bottomMargin) { + spaceAbove = Math.max(0, spaceAbove - (lp.bottomMargin - spaceBelow)); + } + } + return paddingTop + spaceAbove; + } + } + + private int getChildVerticalGravity(int gravity) { + final int vgrav = gravity & Gravity.VERTICAL_GRAVITY_MASK; + switch (vgrav) { + case Gravity.TOP: + case Gravity.BOTTOM: + case Gravity.CENTER_VERTICAL: + return vgrav; + default: + return mGravity & Gravity.VERTICAL_GRAVITY_MASK; + } + } + + /** + * Prepare a list of non-SYSTEM child views. If the layout direction is RTL + * this will be in reverse child order. + * + * @param views List to populate. It will be cleared before use. + * @param gravity Horizontal gravity to match against + */ + private void addCustomViewsWithGravity(List views, int gravity) { + final boolean isRtl = ViewCompat.getLayoutDirection(this) == ViewCompat.LAYOUT_DIRECTION_RTL; + final int childCount = getChildCount(); + final int absGrav = GravityCompat.getAbsoluteGravity(gravity, + ViewCompat.getLayoutDirection(this)); + + views.clear(); + + if (isRtl) { + for (int i = childCount - 1; i >= 0; i--) { + final View child = getChildAt(i); + final LayoutParams lp = (LayoutParams) child.getLayoutParams(); + if (lp.mViewType == LayoutParams.CUSTOM && shouldLayout(child) && + getChildHorizontalGravity(lp.gravity) == absGrav) { + views.add(child); + } + } + } else { + for (int i = 0; i < childCount; i++) { + final View child = getChildAt(i); + final LayoutParams lp = (LayoutParams) child.getLayoutParams(); + if (lp.mViewType == LayoutParams.CUSTOM && shouldLayout(child) && + getChildHorizontalGravity(lp.gravity) == absGrav) { + views.add(child); + } + } + } + } + + private int getChildHorizontalGravity(int gravity) { + final int ld = ViewCompat.getLayoutDirection(this); + final int absGrav = GravityCompat.getAbsoluteGravity(gravity, ld); + final int hGrav = absGrav & Gravity.HORIZONTAL_GRAVITY_MASK; + switch (hGrav) { + case Gravity.LEFT: + case Gravity.RIGHT: + case Gravity.CENTER_HORIZONTAL: + return hGrav; + default: + return ld == ViewCompat.LAYOUT_DIRECTION_RTL ? Gravity.RIGHT : Gravity.LEFT; + } + } + + private boolean shouldLayout(View view) { + return view != null && view.getParent() == this && view.getVisibility() != GONE; + } + + private int getHorizontalMargins(View v) { + final MarginLayoutParams mlp = (MarginLayoutParams) v.getLayoutParams(); + return MarginLayoutParamsCompat.getMarginStart(mlp) + + MarginLayoutParamsCompat.getMarginEnd(mlp); + } + + private int getVerticalMargins(View v) { + final MarginLayoutParams mlp = (MarginLayoutParams) v.getLayoutParams(); + return mlp.topMargin + mlp.bottomMargin; + } + + @Override + public LayoutParams generateLayoutParams(AttributeSet attrs) { + return new LayoutParams(getContext(), attrs); + } + + @Override + protected LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) { + if (p instanceof LayoutParams) { + return new LayoutParams((LayoutParams) p); + } else if (p instanceof ActionBar.LayoutParams) { + return new LayoutParams((ActionBar.LayoutParams) p); + } else if (p instanceof MarginLayoutParams) { + return new LayoutParams((MarginLayoutParams) p); + } else { + return new LayoutParams(p); + } + } + + @Override + protected LayoutParams generateDefaultLayoutParams() { + return new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); + } + + @Override + protected boolean checkLayoutParams(ViewGroup.LayoutParams p) { + return super.checkLayoutParams(p) && p instanceof LayoutParams; + } + + private static boolean isCustomView(View child) { + return ((LayoutParams) child.getLayoutParams()).mViewType == LayoutParams.CUSTOM; + } + + /** @hide */ + public DecorToolbar getWrapper() { + if (mWrapper == null) { + mWrapper = new ToolbarWidgetWrapper(this, true); + } + return mWrapper; + } + + private void setChildVisibilityForExpandedActionView(boolean expand) { + final int childCount = getChildCount(); + for (int i = 0; i < childCount; i++) { + final View child = getChildAt(i); + final LayoutParams lp = (LayoutParams) child.getLayoutParams(); + if (lp.mViewType != LayoutParams.EXPANDED && child != mMenuView) { + child.setVisibility(expand ? GONE : VISIBLE); + } + } + } + + private void updateChildVisibilityForExpandedActionView(View child) { + final LayoutParams lp = (LayoutParams) child.getLayoutParams(); + if (lp.mViewType != LayoutParams.EXPANDED && child != mMenuView) { + child.setVisibility(mExpandedActionView != null ? GONE : VISIBLE); + } + } + + /** + * Force the toolbar to collapse to zero-height during measurement if + * it could be considered "empty" (no visible elements with nonzero measured size) + * @hide + */ + public void setCollapsible(boolean collapsible) { + mCollapsible = collapsible; + requestLayout(); + } + + /** + * Must be called before the menu is accessed + * @hide + */ + public void setMenuCallbacks(MenuPresenter.Callback pcb, MenuBuilder.Callback mcb) { + mActionMenuPresenterCallback = pcb; + mMenuBuilderCallback = mcb; + } + + @Override + public void setMinimumHeight(int minHeight) { + // Update our locally kept value + mMinHeight = minHeight; + + super.setMinimumHeight(minHeight); + } + + private int getMinimumHeightCompat() { + if (Build.VERSION.SDK_INT >= 16) { + // If we're running on API 16 or newer, use the platform method + return ViewCompat.getMinimumHeight(this); + } else { + // Else we'll use our locally kept value + return mMinHeight; + } + } + + /** + * Interface responsible for receiving menu item click events if the items themselves + * do not have individual item click listeners. + */ + public interface OnMenuItemClickListener { + /** + * This method will be invoked when a menu item is clicked if the item itself did + * not already handle the event. + * + * @param item {@link MenuItem} that was clicked + * @return true if the event was handled, false otherwise. + */ + public boolean onMenuItemClick(MenuItem item); + } + + /** + * Layout information for child views of Toolbars. + * + *

      Toolbar.LayoutParams extends ActionBar.LayoutParams for compatibility with existing + * ActionBar API. See + * {@link android.support.v7.app.AppCompatActivity#setSupportActionBar(Toolbar) + * ActionBarActivity.setActionBar} + * for more info on how to use a Toolbar as your Activity's ActionBar.

      + */ + public static class LayoutParams extends ActionBar.LayoutParams { + static final int CUSTOM = 0; + static final int SYSTEM = 1; + static final int EXPANDED = 2; + + int mViewType = CUSTOM; + + public LayoutParams(Context c, AttributeSet attrs) { + super(c, attrs); + } + + public LayoutParams(int width, int height) { + super(width, height); + this.gravity = Gravity.CENTER_VERTICAL | GravityCompat.START; + } + + public LayoutParams(int width, int height, int gravity) { + super(width, height); + this.gravity = gravity; + } + + public LayoutParams(int gravity) { + this(WRAP_CONTENT, MATCH_PARENT, gravity); + } + + public LayoutParams(LayoutParams source) { + super(source); + + mViewType = source.mViewType; + } + + public LayoutParams(ActionBar.LayoutParams source) { + super(source); + } + + public LayoutParams(MarginLayoutParams source) { + super(source); + // ActionBar.LayoutParams doesn't have a MarginLayoutParams constructor. + // Fake it here and copy over the relevant data. + copyMarginsFromCompat(source); + } + + public LayoutParams(ViewGroup.LayoutParams source) { + super(source); + } + + void copyMarginsFromCompat(MarginLayoutParams source) { + this.leftMargin = source.leftMargin; + this.topMargin = source.topMargin; + this.rightMargin = source.rightMargin; + this.bottomMargin = source.bottomMargin; + } + } + + static class SavedState extends BaseSavedState { + public int expandedMenuItemId; + public boolean isOverflowOpen; + + public SavedState(Parcel source) { + super(source); + expandedMenuItemId = source.readInt(); + isOverflowOpen = source.readInt() != 0; + } + + public SavedState(Parcelable superState) { + super(superState); + } + + @Override + public void writeToParcel(Parcel out, int flags) { + super.writeToParcel(out, flags); + out.writeInt(expandedMenuItemId); + out.writeInt(isOverflowOpen ? 1 : 0); + } + + public static final Creator CREATOR = new Creator() { + + @Override + public SavedState createFromParcel(Parcel source) { + return new SavedState(source); + } + + @Override + public SavedState[] newArray(int size) { + return new SavedState[size]; + } + }; + } + + 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) { + ensureCollapseButtonView(); + if (mCollapseButtonView.getParent() != Toolbar.this) { + addView(mCollapseButtonView); + } + mExpandedActionView = item.getActionView(); + mCurrentExpandedItem = item; + if (mExpandedActionView.getParent() != Toolbar.this) { + final LayoutParams lp = generateDefaultLayoutParams(); + lp.gravity = GravityCompat.START | (mButtonGravity & Gravity.VERTICAL_GRAVITY_MASK); + lp.mViewType = LayoutParams.EXPANDED; + mExpandedActionView.setLayoutParams(lp); + addView(mExpandedActionView); + } + + setChildVisibilityForExpandedActionView(true); + 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(mCollapseButtonView); + mExpandedActionView = null; + + setChildVisibilityForExpandedActionView(false); + 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/eclipse-compile/appcompat/libs/android-support-v4.jar b/eclipse-compile/appcompat/libs/android-support-v4.jar index 4ebdaa9ed9f32a9db0d7fcd3487662d8dcc86eb6..bd450c734045095f7adaa96308c9fd472edc9f99 100644 GIT binary patch delta 502679 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�U{0kS_Effm($)B^)+8(kI6+E~hst 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 S8_hSG``{+L8$Qs4$^Qd^CDB#@ delta 350119 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

      %mY*QmAlQf7P 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�~7XHZfKc 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 apHah|VRvx{(s7vMKa=h4iob;WwEI7n3xfUt diff --git a/eclipse-compile/appcompat/libs/android-support-v7-appcompat.jar b/eclipse-compile/appcompat/libs/android-support-v7-appcompat.jar deleted file mode 100644 index fdd6c5bf8801533c71a959bb23669c9046112f8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 507947 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�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 diff --git a/eclipse-compile/appcompat/res/anim/abc_grow_fade_in_from_bottom.xml b/eclipse-compile/appcompat/res/anim/abc_grow_fade_in_from_bottom.xml new file mode 100644 index 0000000000..79d02d44ca --- /dev/null +++ b/eclipse-compile/appcompat/res/anim/abc_grow_fade_in_from_bottom.xml @@ -0,0 +1,30 @@ + + + + + + + \ No newline at end of file diff --git a/eclipse-compile/appcompat/res/anim/abc_popup_enter.xml b/eclipse-compile/appcompat/res/anim/abc_popup_enter.xml new file mode 100644 index 0000000000..91664da17e --- /dev/null +++ b/eclipse-compile/appcompat/res/anim/abc_popup_enter.xml @@ -0,0 +1,21 @@ + + + + + \ No newline at end of file diff --git a/eclipse-compile/appcompat/res/anim/abc_popup_exit.xml b/eclipse-compile/appcompat/res/anim/abc_popup_exit.xml new file mode 100644 index 0000000000..db7e8073a8 --- /dev/null +++ b/eclipse-compile/appcompat/res/anim/abc_popup_exit.xml @@ -0,0 +1,21 @@ + + + + + \ No newline at end of file diff --git a/eclipse-compile/appcompat/res/anim/abc_shrink_fade_out_from_bottom.xml b/eclipse-compile/appcompat/res/anim/abc_shrink_fade_out_from_bottom.xml new file mode 100644 index 0000000000..9a23cd2025 --- /dev/null +++ b/eclipse-compile/appcompat/res/anim/abc_shrink_fade_out_from_bottom.xml @@ -0,0 +1,27 @@ + + + + + + + \ No newline at end of file diff --git a/eclipse-compile/appcompat/res/color/switch_thumb_material_dark.xml b/eclipse-compile/appcompat/res/color/switch_thumb_material_dark.xml new file mode 100644 index 0000000000..6153382c7c --- /dev/null +++ b/eclipse-compile/appcompat/res/color/switch_thumb_material_dark.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/eclipse-compile/appcompat/res/color/switch_thumb_material_light.xml b/eclipse-compile/appcompat/res/color/switch_thumb_material_light.xml new file mode 100644 index 0000000000..94d7114821 --- /dev/null +++ b/eclipse-compile/appcompat/res/color/switch_thumb_material_light.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/eclipse-compile/appcompat/res/drawable-hdpi/abc_ab_share_pack_mtrl_alpha.9.png b/eclipse-compile/appcompat/res/drawable-hdpi/abc_ab_share_pack_mtrl_alpha.9.png new file mode 100644 index 0000000000000000000000000000000000000000..4d9f861f88895c73c89ed02f8aba3241f5d646fa GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI10wkH8TU>#Zxu=U`NCjiE1M`1Hk;Fh|Hddhp zj5jzGnne~EtT5@#5?Z!v+5eQACLd90^8E`hl(K2jUO$``|;vO-l*9q5UpUv4~huGmwD{ zWFQ0oIM8sl1YXhp=*iqYG&Qh!1V{hO*>e8yI)6HzKYq`j?@5w;0mmvDT5|JzasU7T M07*qoM6N<$f>J?Y+W-In literal 602 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIA^$sR$z3=CCj3=9n|3=F@3LJcn%7)pVryh>nTu$sZZAYL$MSD+10f-TA0 z-G$*l2rk&Wd@@jkv%n*=7)UdMFr$Ui7Y87%;pyTSl5y|t4DYPN1_BQ8Q&WPgrcBVD zvWEHQlL$*svAZI>`1U%TzvSBSSdF{iL4y5_=cg{rnH**cs)fu9mlkc2N**fRAP12dU z3lGfod9r6BXP+c%U(w#ov$az*`5P4uJ}oVa39NfgZ?^m}@l3AJ zizNOW*JHo-9g|q!>5#vLDfsb^vNc}P-m@KQa41@CNzVpiJvK+v`lP+{&U B*J%I% diff --git a/eclipse-compile/appcompat/res/drawable-hdpi/abc_btn_check_to_on_mtrl_015.png b/eclipse-compile/appcompat/res/drawable-hdpi/abc_btn_check_to_on_mtrl_015.png index 874edbff6221aaaf1369bbb007d0531968bbe54d..69ff9dde3a8ac9de1581162da65d33468dfeb500 100644 GIT binary patch delta 388 zcmV-~0ek+02b2Sl8Gi%-008|9F$@3z0b5B#K~#7F?Up@m!axv(KfJMlDkp#fQgR#L z2gGq`Xdo$bj7Z@p90SFJJy|!_3P)&JEmVH5f8Wg0N;}+8r%s&=DgHLxr5*|QDxrtJ zNXc0;XW`*FOL9{G=>b+KCFfUBw3hlyAnskWGUSly?SBIf8}*c8mZ+ zpDl_YC?5=3(|v1rMMtI%;=k_00SI-#feB#9__WU2<%9zYluNTk!mD-SP9Fo{B2rQ} zJ{CZcrYN_ZSb%1W6JzU>JAD*@gZQ#`<0Apwuce}V&zAUy*V9kO i_{Z<_&-YH9I{g9D{C)rLDf?Xj0000NS%G}U;vjb? zhIQv;UIIA^$sR$z3=CCj3=9n|3=F@3LJcn%7)pVryh>nTu$sZZAYL$MSD+10f-TA0 z-G$*l2rk&Wd@@jkv%n*=7)UdMFr$Ui7Y7CgrXWuj$B>MBZ)cp%yJ8^Hy5H}X<{lST zE6l)Pc^%6huN2J#vIXA`@)fPpXUw3`3CnL9!FCQTKJ~lTz?>Y zfuE$H_os+sQC~G@&;MNE(9pc%iu|bq=g+L2tegG2|Hi!ojh%~%6ONSyxu`M3Td^PL z+*qr-bDu}(_Xi=%gXLQ#*mt!&+1}v&HP)x#*o313Qa9~b<(R!EzMtE<|Di+k?{DWC zrXR5U!19C7=eOUslkRhx|1eoxvgOe@ZD^dJ{GVyLp6&;RA53o^r<9nm|I#>7^(4CY zY(x2h+TO3vgtZsP8SZI{dG3;XLcXhl`%Gj1tLQt6uI`?aB=h0Z_9L1nRzAyQI&Zea zHNR0?+WQ}~9`n2!vmc?~MOW9JHc#+>T;6Cdwf?N}zbeK%hAQa?Tpv{K_kEdi`j+1; z#)zqcMpY_{Zg*{3|8x6}O)EL4pViRXF|X14tGA%z#k)r}d-|WvJXZ7MdDZgC%?o8S z-}4-?2#{tH-!bWfpHJiYtY9sjyJ}LFTe)Fo@)g$}nynDEf z?S<8ErKv_nqU+wtzxtb$4+IuT99K^K83k%d1c@ql}AI)sOkhAF|1>7Z(A7KlMLYs|@}pn;0_x1ST`-64!_l=c3falKdhD z$CUh}R0YShlGGvv*R-_MVr2%;e|Xq^C11B0ilpUXO@geCxY CTy@?6 diff --git a/eclipse-compile/appcompat/res/drawable-hdpi/abc_btn_radio_to_on_mtrl_000.png b/eclipse-compile/appcompat/res/drawable-hdpi/abc_btn_radio_to_on_mtrl_000.png index 0d3e1e7a16bef376973076e1c0c9f6f18263b6f4..9218981b4f2ebfa185eea884cb7fb29620aed83f 100644 GIT binary patch delta 449 zcmV;y0Y3h>2hanM8Gi%-008|9F$@3z0hdWcK~#7F?9#tVV^I{v;cuUFL2V2H|2#t8 zMXb`Q;L8LQ>|-xj_!#0#sGx!nutdvrl!G>*mKt_EJ+Ry?^RP2|47AQ|7|Dz^6)p&o1FB@LsZ%X zw#}q;*0}Ye;(ts^GusGFDkf68HEaei7`m0xgm#9&(4&<0(P`0PUrLXL?Fr-&hZjyq8oxN-^#kHxD8KgtMbZCxDw00000NkvXXu0mjfaHZME delta 940 zcmcb>yq$f5WIY=L14B5|&vqcilJ4m1$iT3%pZiZDE0E7v9OUlAua@a2CEqi4B`cIb_Lo1CD@X@-CY>|gW!U_%O?Xx zI14-?i-9yF2s2tJeQ{u5U~2VrajXx?xc7GEUO#C^kyiWazyqu)g!7E2Sf}w))xGWbV|7&F4y zJLZe)#WEFw87x0YRIt8b&~NZf@IC*RrH)~KBmV*S2VTG43Vq&sxQ+V&+XZ$u5y`Xa zF=hD+%%t@MOV1v^^x(GEenvet7Q3Kn>qGR6ixl}Z+LGQLjQ-XydPMiJ;soaV4a^Tr zH}KkA+`4ubv+d;7XV;!OzD_*L_+hjC#1Fl7`|FvjMJ8`EU1(dC=AUbG-1Dwl&J7vQ zf))46MJ8`OTe0$tMq3N-PM_~R>AtzP*8>-b@|q=9J6_{!K9GKL&R%|<6Nei%i)Vzj zv3{MBwDe@-cE5~yJ(24b^d8H4oX!q!>ijbIgyx0P#xva6w?&tK{LcJ#XQJc_rssYM z@n5|Kg;HedfA{^rqq-tUKZ31H_GkD4;bxl$FFJ0Qlr>9u6^4J8{@J&>`h3OJ4SRh; zpFEQ4x}7j9cyh^f#@mZ+%1h@fvDk9XyKS=k-Q;DG8JgCz4`#k{>rtPbswdX-Iz-B2 z^WtjZ>cnZHPXsr-;)%JI@!*nV#MEygF7=P^nx`3l;NB5dDOn#8ZuzY4=#Fce--54S zns>XQcduf>GoGBQ840H)EhcX}d$it+;i%M~qgVI#NK|l~&z&{(-ZB1vu4dYmo1!`A zH>#Ky+cBTaTVAVHrSik^u`yd`T~O4sN&i;x`>K?$dE~27z2T{^O~>M+Px#CK|9<>+ z!s*$Xznc%U%RX(^__=?ERJ}>Yg@lbixDSeQY!_H}ivyTGrAu5RN}P*Q6HD@o7#vgb zlTsBN(@Ii{6kOBNQj<%HpDl2o3RI>FQkIffl4_LRB zk>o|1AfJr%Eb-B06-sQmo+y8Cn|YWRa%~Hx;v-*7WnVJ(EE(uo)$v!RV^z;U@@y>G zS4IBa^(T_wk_-Q6`cuv9UWkN~_l_vhmtq;m=EJEqGR;gQQ!6p=Sfun(dZQ|Ai@VuF zsR||)juLw!X@5Ih(^X*ENRk{8HD$PMn|3mr+9<-Wa1_~*<#4B}LQj$mw1^^pIgC}j zWReGm*&zmN8AQJKmNyhwa4AXF5xe%ct0*6P%8X;kRdy-WSdaXr1r*co-;MaW8I)M@ zujDam11}z>?5?21jPvlj)89~|AK_ipDjY~rI7v7TP=Beh8(tsv^c9^(cnuA--M#uz zB;mNzCQ@tRouZglKW8Yp*FggtlCkufa5sol$Gv1|4#ocuXt|NxT0|2&k|*gk;qDNr zMYob0t#29dU;Fh<0001lFwnniB(U8SBz%DYMg*1&&J;WvunJ&yz^*~yfXKw553mJ* n7eGe-03Dy5?Vh*7T)lPl0@00000NkvXXu0mjfj}ihV delta 1076 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 P00000NkvXXu0mjfoe#zw literal 17243 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 delta 99 zcmc~UpCB2>#=yX^!uI7lAZ6$2;uunK>+K~)E(QYu=7YcgFAuKX6*9$u`=hea=WT03 p#SGBE2JeUiv+SnvvxhOxW)}Fp!()Li>oTB844$rjF6*2UngFw(AzuIh diff --git a/eclipse-compile/appcompat/res/drawable-hdpi/abc_ic_ab_back_mtrl_am_alpha.png b/eclipse-compile/appcompat/res/drawable-hdpi/abc_ic_ab_back_mtrl_am_alpha.png index 6c36eae2f4aee9ca8665b7436f3317042e6dcc97..f61e8e3e3cf82a87cd8bc76d9b55d82e49e9732b 100644 GIT binary patch delta 262 zcmV+h0r~!$1(yPl8Gi%-002t~P!j+E0NzPNK~#7F?Ug}F#xM{@C#`MWd0fGTt%9^3 z!aMXAdM{TB3VjwCkS>xBl0_Ce54wEJm+2%{UjId)IS5!9L(%xRNEB!><^xkbY0U`0 zqEso(m1{nL4NI%in#naQU0z2X$~CX_`iyj_l|FB3=TH}^aes6u*C=A4K7oyamVqux zRMcWju6e;E5mE4NzJPb0xZ{yA!aWb%a{W8a^G?k_njKv`@WxF{w3LfH8dGUBeb^Po z?<(&q|A*8oQe$c30ew2vF1GxuRs@7+-H}!;{v1_*Af5atTl2?6-;`njQ}CZv{Qv*} M07*qoM6N<$f(5>D=>Px# literal 667 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbBSkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?skwBzpw;GB8xBF)%c=FfjZA3N^f7U???UV0e|lz+eS5K)hhiu0R{01Y44~ zy9>jA5L~c#`DCC7XMsm#F_88EW4Dvpc0l8^JzX3_A`ZWuaWLqRfr#sQZH;$-Vq>>j z7d-vJ_>bA@asAG~kSVVhCH6F4GFzHC^WoW)7gJQ`+?oAE^?;?H&KmDz&)?Qtf8;HW zt}=M`RXKdo!cEE=$p?;!u3m9@zEh)-Ef&BFrnYw4D zZ=aRMSN2S;__otqg+E^Nj9eK$-&nEv#Er;#@7#Ng)So&q)-VSru-;+LKOp*4@9rsv z1g1UA{0G<*(zey79ITmP?RssJnU!D8@5-qqd-Km*O^Fd!S$ucKKV<{wOJ>>kEj&NZ z)A_w-y={|cEl1Xm)Obcwt*K?nYXY-oT)B8*-t|3w<}Au$8PZ+mA3PN+pk}YUF!Zl{jjBlzt{7+P2vnp&9}0=ZTO23Ho$jzZCp zo1c=IR*74~(!a{jfEpx0HU#IVm6RtIr7}3ClE4bAP-^L_t(Y$L-Zg7J@JgfZ>*V*~2(ostiZ%??QN1+9XwZEEL$1 zuR{hLZkyK~(2qa?uLgC57U)JIDpbcr;$lI81Rzo!698$wtM!MTp2yQysD-I4RIVvg z3RAyq&oBoJS%At&=`SgRk?Y7a&VeJ|X0(FLDU;DF`?(L3u~J$jr=ni(yFeQqEzeZ^ z{IXvYt~ZVXm33oMZH(MF3M5ytO1&{CipKeBuq{;LWF76=G-}T~4*%m%`$y0n%Gsfk T%lJ3-00000NkvXXu0mjf-Faic delta 219 zcmV<103`p!0>%Q6bAP@`L_t(Y$L-Zy4uc>Ng<;s3T}|6`Lta=czb`aWfipBQKD5SH z=JPUVMu$7*au@U?(14dko}mYN5g7&L2}B+ibRz;VH7HL2Anu>4JUBs_yII1_tJfHKi><%f)0)GhWG6;!|kT z=J3+n-?;o*RJQ)f&F3$DZR)P&-|$1a#&AQB5^LQQ55_^Ip`=gj3<>^hTp}6)3l8wP2rn#$+S`njxgN@xNAGFnM5 diff --git a/eclipse-compile/appcompat/res/drawable-hdpi/abc_ic_go_search_api_mtrl_alpha.png b/eclipse-compile/appcompat/res/drawable-hdpi/abc_ic_go_search_api_mtrl_alpha.png index aa23c591e496ec8698a868280fb30a27572ca817..b9ff1db5742947974f27a398b35abf42fbb877a7 100644 GIT binary patch delta 98 zcmb;@n;;p>!oa}bRrj?RNZES2IEGX(CM)pwH2p9AFInK6)Aawp`GggWOIlTU1$38W zIb?O?#=yYvpxpKckh1r5aSW-r_4e{XP6h=Y=Ziji3%lKIxa4|+PDDR&_H67> zSK%#BSZMvAJHx&FL7hu_3Hz$Ioj1ysU31rVsWE1>{je}S;`bjjpivB-u6{1-oD!M< DW2+|W diff --git a/eclipse-compile/appcompat/res/drawable-hdpi/abc_ic_menu_copy_mtrl_am_alpha.png b/eclipse-compile/appcompat/res/drawable-hdpi/abc_ic_menu_copy_mtrl_am_alpha.png index 03b1aac4e05e3166e2c517f29658867d52526ba0..70eb0737882e53ec326b7a37cf335fea48f7b605 100644 GIT binary patch delta 175 zcmV;g08sy*0?PrAB!7}gL_t(|0b`&#_%HiE|9=A!kO4b{F>L>T`A-xeWY9T?D#{J| z3sywA*I>30h67>{aWPo;-|s&o4ueRJ!S!IHFb#soAo0K#t3f2i-~q6zTC4_<6z~lY z>xQ^NqXvx{G-^--2vTSe0@B~0QG@=GS@ikr~v=~002ovPDHLkV1i`3M}YtU delta 259 zcmV+e0sQ{U0iObpB!3`dNK#Dz0D2|>0Dy!50Qvv`0D$NK0Cg|`0P0`>06Lfe02gqa zx=}m;0007FOGiWi|A&vvzW@LL32;bRa{vGf6951U69E94oEQKA0GCNbK~zY`WBAWN z9f)Ac{?Gs4Km;UUknR63|A_+x3_AD!KXnZH3syu0ui>?glzhOZkwL`7VBLSe|BUzz zB0dJ!BaFgk5b-hi|GzIjgNTd417KCP_zWU0;2WUUjT$s+(5OK}+aTnEog#yf;iy4$ zH0U2Cg+DSRr8@G#XOIoi736Bn3KA8{5K(2<0$sz1t;I$m1OU$RgGXheg75$U002ov JPDHLkV1g~-W$^$2 diff --git a/eclipse-compile/appcompat/res/drawable-hdpi/abc_ic_menu_cut_mtrl_alpha.png b/eclipse-compile/appcompat/res/drawable-hdpi/abc_ic_menu_cut_mtrl_alpha.png index 4c17541301767e7d85d3929a4c93e329bc461b1b..e78bcaf57a7ebf7fe1cb821a4115f7aabd80a161 100644 GIT binary patch delta 378 zcmV-=0fqkb1C#@hBYy!~Nkla?7*y)31|%#!++8atV)@HHefm|J_Prr z%s6xe`cfvKE6@!SORy?s0y+abokK^K9>8TO6Hx2UV@YL9K#k)ksnc;Lpg7gc%Dvvo zrF>%=VFD_?bSY;tsDe7x)I&jiaxqYQLhr$a&mip!eUK;Z1AT--DuWIz-ReEK@m1uV z1f`$Hq)$ delta 475 zcmV<10VMvE1M~xsBYyxOV@Og>004R>004l5008;`004mK004C`008P>0026e000+o zoVrmw00002VoOIv0RM-N%)bBt010qNS#tmY3ljhU3ljkVnw%H_00C@CL_t(Y$KBRX zPJ=)ghha8iSA=%i#>As|6!#RQtTm3hGmR&(8!tm?ZT%BZQhyRcyLnwe04WSJ#Dx)- z%siQaZ+;&J#_!z5pN33aB4T2eOfmaH6W*y_TgK9+E}_O$3vw)_F62!8h&Y7oNC{aSO%yUlc4$Q-CHkCx(Xhdu zF_KY_%w=m)f$jj9^CWva-O#z8cqXqf*x; zG-zS2b&p7p$A*K2g_kGfv;Lvo)S}e`AkvSK6acGuU{v=Fwq_{NkJ{H-_|E`X>4(3c zCuG)+X8Fr@_1n=YpGTkmP13eo8>GR6j~dgfWoN6pVogHA3b+4H#J~H|`UXqOa%o{4 RdQSiV002ovPDHLkV1h^*$b0|* diff --git a/eclipse-compile/appcompat/res/drawable-hdpi/abc_ic_menu_moreoverflow_mtrl_alpha.png b/eclipse-compile/appcompat/res/drawable-hdpi/abc_ic_menu_moreoverflow_mtrl_alpha.png index 675f3ee9283dd549650dcdb3a666a9997df86ee5..9a87820577778243812433e931ef898b4767b3c2 100644 GIT binary patch delta 105 zcmV-v0G9vT0fqsPBw|fTL_t(Y$L-R&4FDk&15rZgUkF5%90klq`x|fub^$N2CMEB> zQ5YOHouWa5e@%luEJhi~4JU4oo00000 LNkvXXu0mjfE|(}6 delta 191 zcmZo;yv;a4rCuS~BgmJ5p-PQ`p`nF=;THpte!;*{YQVtoDuIE)Y6b&?c)^@qfi^%1 zrX+877l!}s{b%+Ad7K3vk;M!Q+`=Ht$S`Y;1W+*8)5S5wI;`TS}$DbXuEJ#-`xlw ot?A7r6ZkGUT6wVllz+kYY+Zt{z>oi8K=T3f8blVHC8CGg7cTH}uu4R;aTyo~&b`DObL`FbRW7S{&m} z%*f~%_oAiHpanfzyU%rxR!=UW8oiE;oHKg0ge(Adc_6W^71pyV5DHinl%ND9 zC_xF@5>p-i%l36+E+Ip~5l3i_151p6;`YnX8w$X515bgqivR!s07*qoM6N<$g7P(0 Ad;kCd delta 285 zcmaFFxPxheO1(m|N02WALzNl>LqiJ#!!HIP{epp^)PRBERRRNp)eHs(@q#(K0&Rd2 zOiAAEE)4(M`_JqL@;D1TB8wRqxP?KOkzv*x383HxPZ!4!kK=ErIdUB`5OCdmo!Mip z_{6X(j)Tc8`4f8Qt#ZGhrz7XgvU1&;^P!3pJnKDn3!V8rdxE6g&8ONS2GUvc_N>r6 zJUj7h-@Hci+bb7YmgnT1dE}zn`?aZ&o7*Vr`9Ei8#m=x2519aszDH}6%Uz{rPV1So zI(=2_M8*RV>GH>J{&x>-0Dy!50Qvv`0D$NK0Cg|`0P0`>06Lfe02gqa zx=}m;0007FOGiWi|A&vvzW@LL32;bRa{vGf6951U69E94oEQKA0I^9#K~zY`<(9z> zfFKM-VK9sXs57yT2UlRTFX#cZfPk1tu$LcGp8Zs*46IJDK7T+Q3&f#DNF8HT4?3Is zKpY#O(~OotlHM%Jf|kU^S3OgZNU%e-XrXJg>`+jf7ZBaZ&_y@?8<1P-nWTs*6^QCB0FFKC{{iEvrgv#-e-brYz}rpx<#XG&Q|+I=bh) zuR7ivjBcqp<%&szu};Gq9Y0LyiEiojR_Td*))ZFUv?HqU%w~@rh-w^``eZ1oGb%M1 zISflpMh?6D_O}H?k;8SHJu(ngshPH{(01RLZwf8b>QR-Q&KWTf>uhtwiozEou{92Q zs^hssu{DN$R#hyakHLn&qT$VZ(Ib4t$jT}x& z9gQ4%EZFFyTIA8NsPxm3$fwU8bLQN(H~tNO0PNy1z<0S;<^TWy07*qoM6N<$f_2xr ACjbBd literal 549 zcmV+=0^0qFP)!PJ=lBj@ARL!JH%Pz8J@_q23g4Hzd+$pv%akcorc9-^JkQGz4dR0s5f0HK zcGDm}OFR?f5N^;7+(wA^X`qUq`qJiTC;(b;S4V-Ei*hVyPq+wtlNqCO9 zCftPL-%*6y#3eBdh;w4Zi$lJOFsM$5Z%J62m?ADhR^x}*nY8#CPuQTadtyO)ZjQJj z?wB*N)&6oTEHieS00000NkvXXu0mjf+H>&D diff --git a/eclipse-compile/appcompat/res/drawable-hdpi/abc_ic_search_api_mtrl_alpha.png b/eclipse-compile/appcompat/res/drawable-hdpi/abc_ic_search_api_mtrl_alpha.png index f7382d373da3aaf03aa40a378bcd5f1ff6d9e095..b9baa0cca92328df271dff8eb5067df8ba171f71 100644 GIT binary patch delta 596 zcmV-a0;~Q02;u~g8Gi%-002t~P!j+E0x3yEK~#7F)zm>td{r0+;P>8{JBFE%wJeZO z7m-DaBB6*jL94JL3W7hh2>Jl^5sIjYRzWKvim(W^>>ISHMFb(kfRqpxwbN`$$NL2G zE@HSGQfbkg)!cK=bARu94mbWkKb87oRN~)^?#Dg7sejewp?^A&fjg{NG$)^43d&L* z^u9euT4O)>%(_ODsc9zM=0gBLi?7{Zrly%CBTUfx#mIqEoMY@sNtK~WxZMz^_}C+E z6=tn^-LclWQ;!OD5y}N0;LO-F3FiykZ3Kqqg{lPggf&d?tkC3^JbL&{u}M z2R`ap+6XU$?|<}!suRkI#`oZ{>6YgFf{0!YAOl5>yFu_Azl^!qYt(7^3x1vV~Lo6uc%h9fdssespuf z1!x_uBlil8T&&U;Zt@LyN9NHD<+iWD&|P^I`+8Z{CVx1#EYt-kryp>l#jjp+OY(h> z`xbxV#mriSvOH&);LztbY-Wqk(c1Nfd7&;sNj+>IEdW}ac)=FfG1EnL-IsZ<*fRm} zlXoo%Z{v6D7)YucN-8_E>S;GTZ!HhJHe(xqAXAm0P$l+HyjF>%#@NnOMJVLqUyMX^ z+l-w|wM}IpRAs1hBsH)_QcY52s6b_bc7>$E)hXV(dZMKCed*0B^{C^s(pOyzN~+2$ iaZM;Ba(yWNBj|6C!*@YnR!v<1000045bDP46hOx7_5K>h!@P+6=(yLU`z6LcVYMsf(!O8p9~b? zEbxdd2GSm2>~=ESj)8&M&(p=RJ|yDs+Zo>3B8~#b|Ie;fu{+4FR3UJLy^BjugvHh6 z!wQy~7@JCgKMcQkk2H5w2<_=ovh)xNv~Lu5bv9YSkt7m$am56Q>n`Q>a?5UoSQ+2E zd3VNSR_E{6Lc;&=+V#s&`|tFdOD9|x_>fy;{l+s+tY~+R+zCgIpo^!Xx-u)m`RfbT zHl=PWGLTIZchH&?<{71t8FZ;*$$QCdx$bZDdu(ML4!+vmu=;>;g2)Qy&<9WRo4pz%`S)x&SGW6|{j7hy2ARKRO$~iez;l%^V8)`U z2e@CWlvD}d;MOso-Fm?6fsH}h2Gh;=pR-@D=L_gKXWINDb+O%}#$dJ$M_q-b&s<8l ztmVV;@mFEv~p!slF;zPIu`=l|P|bIWqs=bnGI z=!sh_Ticw=e|v>YX6<@NzJ%5Q=ooOok^&tPq-ndIgT$VEVdd=EUwVcr_sPR~*B#)To zU6;jfkq!rMb}acG7O$M?%y4Rnhr?mXu!&pF{*>waW6l~9QWU^9W1Ys!9jnhV|N= z<(E`m9B&kMSYLgezr^igem&<2XI<8F6YhxBFK5`xtT*}2e3lrKzvb+qCz(S}G!+G1 zx$<{R589{h<ME>03yMePrr>`h|ogC!p^xgZ_rteb}=|JHwSU;T=Y2EX~^{?1CqQyo*1X8fPz{*S>-d(y%mhmIZt<}}q3*NBpo#FA92 zIy0p zK~_YoAgF`1X<4XUAjsN=i%uc=wCE2tCG8hlgzs_&o|$jvn~9iZ>ex_LRhkaTsryP( zEk$#w zz}C-Dv41tq0p>m#JpwD^ihDxaT=E|^dQ4Jq)*BwjpVBtC==)46DxXC~M7Rc<M=ryg`c%hGR}ao&~A(Dip*%KpBy x3(h?!`{-&pvm_kp;}{&rv`JoEZ3g|vd;mca2z8P3002ovPDHLkV1m004R>004l5008;`004mK004C`008P>0026e000+o zoVrmw00002VoOIv0RM-N%)bBt010qNS#tmY3ljhU3ljkVnw%H_009w6L_t(Y$L-e5 zN|X~Vhmar1Z!Y(IF#?3t=Y%iMx%#dB`HP^Xq$`f zqec(&zTvbN+;}GkdkdWPTqb4ZXj4IO2{w|URJ4l9m)SW0H&Uade^DD;4a6bu8a&I6 zT1Pog;8op`9lMU*>4KJ}aSC$Yg-$H}9p}>HS9Z>+$7mg0Ehm}@U}=E-OB&~002ovPDHLkV1fz^nqB|^ diff --git a/eclipse-compile/appcompat/res/drawable-hdpi/abc_list_divider_mtrl_alpha.9.png b/eclipse-compile/appcompat/res/drawable-hdpi/abc_list_divider_mtrl_alpha.9.png index 2fa6d7e7691d81cbe7bdc3c38e69df1ff800ff63..1e571f5c6f7ae4b205aa3a050c5aec76c753b343 100644 GIT binary patch delta 48 zcmeBR^qZifCF<$o7{U>qoRE<4<2-}XzyIw<5)uqHH&}nif6PD300f?{elF{r5}E*+ C;1MbS delta 106 zcmeb4V4R?m!j$Cg?!v&Zs#n>Ffq{Xuz$3Dlfq`2Xgc%uT&5-~KvX^-Jy0YKnjt+^rIrfF0u g(8_k>u1f+NL-hLV?Rv|KH!=W$r>mdKI;Vst0Mvya3IG5A delta 162 zcmd1W&p1J)o~78yGlT;OYB*9l7#J8h3p^r=85p=bL736}-9*802ZbBuLw zUom!VJG-xhtw7|h+UYOXeJ-Dhne|cnrSgKAcT!IH$apIJv^qBNh_q6$6xY5|%Q-;X O7(8A5T-G@yGywp1|35$g diff --git a/eclipse-compile/appcompat/res/drawable-hdpi/abc_list_longpressed_holo.9.png b/eclipse-compile/appcompat/res/drawable-hdpi/abc_list_longpressed_holo.9.png index 4ea7afa00e2bfe057472ed5a196080fc80ad7383..62fbd2cb505e4c3fc04166b55e19d61efe5dd7d1 100644 GIT binary patch delta 63 zcmbQm7&}45QpMB7F{FYq`2f?u!-io7pU+4-Ni3PUt?NJko=1)%QUc||$9NbTzMjmw Tx8|iB0}yz+`njxgN@xNA6Ve!? delta 124 zcma!@#W+EwjHTGgGlT;OYB*9l7#J8h3p^r=85p=bL736}FVdQ&MBb@0Me=_eEsaM@6S anc?Q&oULw7ms^2~89ZJ6T-G@yGywoUpBR_` delta 141 zcma!=&p1J{o{fQlVda`~H6X=O?Bp530R%N1DIGvQXMsm#F#`j4CkQi|pFF)5DCp?v z;us<^HQA#084t76kN%d256;Xq=IIG&W8TGAl8}_NX@2Jfr4)xvkN&fSPRus)?2=@^ nC&_a`;*USae9PiCMuyhSQd2WnPbUElWAJ2m^>bP0l+XkKf}Jf` diff --git a/eclipse-compile/appcompat/res/drawable-hdpi/abc_list_pressed_holo_light.9.png b/eclipse-compile/appcompat/res/drawable-hdpi/abc_list_pressed_holo_light.9.png index 2054530ed2870bfa7dbc60a2d142ba3776e63d33..863ce95f61c5025bc85294fd44a6cade4ab4ed42 100644 GIT binary patch delta 71 zcmbQw7&SrCk%fVQfqCivwLnVI)5S5Qf-$+F`F}zOgK_Ug#ei8Z5C2c$4nC>saM@6S Znc?D*h*CQ~)4M>$44$rjF6*2UngBJS7ry`i delta 141 zcma!=&p1J{o{fQlVda`~H6X=O?Bp530R%N1DIGvQXMsm#F#`j4CkQi|pFF)5DCp?v z;us<^HF<_*u^O|~kN%d23D3^V vn1`J4Iz7&^FU9d6IgaDC%nQeH9PheZ$xrG{#>mD+00000NkvXXu0mjf7APdi delta 171 zcmd1V%Q!)@o{fQl!RoKQ7m#8pcJd720D>Bhlnx-Dv%n*=n1O-26NDMfPo7>26pZ(D zaSVxQeS6)Iufc)C<>JA~vnz5Z=O-sW_KK1IynIoEJ2&H{Gm9A&O0Q*?A6BTIlsmI0 zPDu|2>e{#Gzu=2IyiWW_x}dnYxGE3>!GHNUhgDg>m>I4xe!DMNl6aG=7ibrQr>mdK II;Vst0P7by6951J diff --git a/eclipse-compile/appcompat/res/drawable-hdpi/abc_list_selector_disabled_holo_light.9.png b/eclipse-compile/appcompat/res/drawable-hdpi/abc_list_selector_disabled_holo_light.9.png index ca8e9a2778f58deb3be0cba0d7af89400525896a..e01c7392a908b798548aefa31757386ad983d4c0 100644 GIT binary patch delta 90 zcmdnXm^(o-goS~DVZxX12Z5A{r;B4q1>@Tb8+jQFd6*4-Ki#bNVwF75(5?Sc`>dDb u`pb`Xeh10?pZM4!?)07lnd2YVon{S~{B@y+{Ki>8{S2P2elF{r5}E)tWF*P} delta 171 zcmd1Z%Q!)@o{fQl!RoKQ7m#8pcJd720D>Bhlnx-Dv%n*=n1O-26NDMfPo7>26pZ(D zaSVxQeS3YQV1oelA{9T615!SR?znTUnd-E&AuDYaMX}RiWbl`S}Apr`0nw%(*TuSfaU^@gLAG22WQ%mvv4F FO#o|FLBaq4 diff --git a/eclipse-compile/appcompat/res/drawable-hdpi/abc_menu_hardkey_panel_mtrl_mult.9.png b/eclipse-compile/appcompat/res/drawable-hdpi/abc_menu_hardkey_panel_mtrl_mult.9.png index 76a5c53d71ff06462fe01e6bc6e707898bf6ae8e..a6b3696e48486619e2fa659e9be4ae954f7ef8e0 100644 GIT binary patch delta 652 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 X3V}6-U+B$#00000NkvXXu0mjfZ`^;p diff --git a/eclipse-compile/appcompat/res/drawable-hdpi/abc_spinner_mtrl_am_alpha.9.png b/eclipse-compile/appcompat/res/drawable-hdpi/abc_spinner_mtrl_am_alpha.9.png index de7ac29d6aa70606199f73df82472a71d492a7c4..9de02639199c2fcfc631241f9acc7e89f672c9c4 100644 GIT binary patch delta 218 zcmV<0044wB7wZ9#8Gi%-005FFSn2=(0J2F$K~#7F?bg8w!axv(;mN9J&*{JhQie_H zAuXhZlwbkrKypyw_uO+Sw9ucTBwFCcb9~d1 zFe)rMrLjH$BbP}>;7EX18d%-X0arXeb=vCeJ@qRaTYA4_JX3pZ{A7*>t~nv5qN#Q` zOFgVGb_@UvntYQ%71kIHXSKoKa%teb8Ze*wZ?4pYeM%iW%%|m}E0lkui~ok)0pyM_ UdN*%JP5=M^07*qoM6N<$f)IFKf&c&j literal 3045 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 n&;orVDCP0qNixJ?sqMTt zI0McOvEQkEpXW+FuPau4ed#n_cg*T@|NG1@KjGdtsn2|MS${q9&94PN)N##-j%x%v zwcnov_ZQP9XC|F(Z`OS{c(om#b^kr6OKn#W7G!hXk*}@^(Lm;6_u;b?}lpC=rCy9Cl zq_SlR1e!h;*uil#A&{hbQk2N!d7m@Vj3?lKVofacWwZ}*GJg`dUL@_4$U7x@OL9r_ ziDb^Ia)~b`FLm=l?kq6dfX_&-1hQqbbbKZAnhJ=*C-PnxqF`@6aPYE6PIud;A9~9 zsrZ*Mzw8G9j(UQ69g2S`5B~u0HW2(({CD8G`Cb65U979r=UM#An1v?*asb&t@J##@ z54U>g3EIwgtP{=`pb2v`xsS7b&e+**;I;s5r(L_6wm{W*S91mQ)z9ypUj-L~@Bb## xP(VuZhVeVxyTl(Quk{^nw5zio`ePIjz5s!qkr@4IZx;Xn002ovPDHLkV1noq%R~SG diff --git a/eclipse-compile/appcompat/res/drawable-hdpi/abc_tab_indicator_mtrl_alpha.9.png b/eclipse-compile/appcompat/res/drawable-hdpi/abc_tab_indicator_mtrl_alpha.9.png index 21b213579a6a6ebf90961e2fe85959d0a587a367..4b0b10a7a3ecdc06906390be124911d3339dc4d1 100644 GIT binary patch delta 73 zcmYd`ognGL!oa|w-f*=INU3T=_;nhq)0wld=oSO}#bUj@hLn;`P8=C$ncnJOAS1bF! zpY@2sx%w3X0T2HFzrDg~cOz5v0;eO4KIM!I{%4eIzV7fi1=Psk>FVdQ&MBb@0C^Q4 Ay#N3J literal 0 HcmV?d00001 diff --git a/eclipse-compile/appcompat/res/drawable-hdpi/abc_textfield_activated_mtrl_alpha.9.png b/eclipse-compile/appcompat/res/drawable-hdpi/abc_textfield_activated_mtrl_alpha.9.png index b9a81bec80475c352c11d4fb183384070f1603ec..5b13bc17add7ed96d45156417cdaedc2e75b41b1 100644 GIT binary patch delta 68 zcma!xm>_A-!oa{FCmp*KNXdJ;IEGX(CNnhsKjP5g^yt9<#&D}uB?}loYGyx}%EZ92 Ww5X5my}%NnQU*^~KbLh*2~7aw2NwVU delta 74 zcma!un;_}R#=yX^MQExXkW%$@aSW-rm7LJf@IT~80rN`EfBd@6?gup_Sb0oNM1|-s db=$Czq4G=0oZHjx`U5pEc)I$ztaD0e0sw$p8Ld|TM7`DrJ21JyHly85}Sb4q9e0C|xbqyPW_ delta 79 zcmaz|o*?PP#=yX^MQExXkkayWaSW-rm7LJf@IT~80rN`EfBd@6?gup_Sb0oNM1|-s ibx5!h{V4Fsj^Xq+&+lK9Ll*;eF?hQAxvX zH|P3?3P2%EPZ!4!iOap`4)QWEa2z_2bfZ31_TaZ#PL_y&k0jnGT;A|4sdIAcikHl* Xa#@Ae6|D^eYGUwo^>bP0l+XkKuV*My diff --git a/eclipse-compile/appcompat/res/drawable-hdpi/abc_textfield_search_default_mtrl_alpha.9.png b/eclipse-compile/appcompat/res/drawable-hdpi/abc_textfield_search_default_mtrl_alpha.9.png index 7c305ab71d6b7338dc4cb9d653d124ab9c2dd5e8..6282df4e69ecd67d5079977f97357219817deb2d 100644 GIT binary patch delta 57 zcmbQi7(PM8SkBYMF{FYqnW5=_i=vC9;e-DSS}YH%4hf_vOx(xD@Mgcq`tLtCUSR+N MPgg&ebxsLQ09No7!~g&Q delta 122 zcmWHa!8k#sgel3}-G$+Qd;gjJ3=9mM1s;*b3=G`DAk4@xYmNj^kiEpy*OmPqhbWV% z=&RjtnSer?o-U3d5|@)x5)yu#caSg;THe$6&|a8%V#6=4NC}Dm*M%R7ySXLR@-ozJ WV(saWn-&e!#Ng@b=d#Wzp$PziB_(SB diff --git a/eclipse-compile/appcompat/res/drawable-ldrtl-hdpi/abc_ic_ab_back_mtrl_am_alpha.png b/eclipse-compile/appcompat/res/drawable-ldrtl-hdpi/abc_ic_ab_back_mtrl_am_alpha.png index dcdd03b7fa39b22e61046ae8fbbca513b6e8db90..2e1062fa99c33d7294bd368354a0d73e1f96935d 100644 GIT binary patch delta 243 zcmVP1Q(0jR3u+ZnC zL8UZEGr?6SkX>H>&tzsq=1>O)i^b?c_Oq+>h)_|9kSJ7PM5qBM6sZ0f4e)TNg#ty& z*`Z1;D&zX4D%hYEA$zM*8SGJ)7zXV`gQVV-laSK@Po+V3)ojV3N)ZxYc9yK!v8C{= zJsS?(f!3)q|k0wldT1B8JTOS+@4BLl<6e(pbstUx|vage(c z!@6@aFM%9|WRD45bDP46hOx7_4S6Fo+k-*%fF5lweBo zc6VX;-`;;_Kaj^+;1O92q&>jc?PRtc&}bP?7sn8f<9Da|`W-e9Xth`WyKuvU6&4PbuKSEF~8MZs%2B$bbh&YO-cFkW!~|}hA}!$zqaoUcAlmtz+gBx zCgmzi)~geVO&ZHJ6tW*ooMg3p)#PIeb}M&@csF~7#=1Bj>D`sPLhX5gZ*A_1RgEEX zXU^8x2bvyP(9vpPy-F(UL(8jNo@Uql=3_I;j@`MmQ~K-cJ6y*qGFNDA?76R`*6ySn zey8xP|MO?MH$NVn##%k?L{~%oB;H4B=V#^0ZN2}>YF(VmqRh=4y83(9-Yq!aWGfsN zqI>OJ{G0#U^{3m`u$A2L&@~FWyiG>g+2>#d`|Sw#+~hZrzh}HM?_=WMStv5egn{+z z$C)1Txhef+ojVf#F!gaC^tLJUcL4^NYKdz^NlIc#s#S7PDv)9@GB7mJHL%n*G!8Ma zv@$lZGPTe)Ftjo-=r&B%LD7(#pOTqYiCe?3oVyc%8YDqB1m~xflqVLYGB~E>C#5QQ c<|d}62BjvZR2H601;r?Xr>mdKI;Vst0M(e(lmGw# diff --git a/eclipse-compile/appcompat/res/drawable-ldrtl-hdpi/abc_ic_menu_copy_mtrl_am_alpha.png b/eclipse-compile/appcompat/res/drawable-ldrtl-hdpi/abc_ic_menu_copy_mtrl_am_alpha.png index 5338f02a42dfd96e03d82ee91c87b76862d56537..a262b0c872cf6973381c8fcd17381a180e149397 100644 GIT binary patch delta 171 zcmV;c0960b1IGc7B!7-cL_t(|0qxbX4MH&tgkfh7*aS8Rtil9A-iP9?zyz6w77kgd zIZg_x@PGYRJWDUOJh-q6_OLO-r)fQK)FEE~2Dz~4$sui{bx^?>SLIS1D%kW(G3W%n z&Y*_qE?$a2j>xqS{O3?Y2_@vQA3$RQl+eV_|HYsRz0RP5n|k0wldT1B8JTOS+@4BLidG0>c;6;(>gHWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^+ z;1OBOz`zYOm0OsRVb&Z8px`x67sn8f<8P<=3LSJ1Xx*>){p03kr{vOwo(Jw=5`Q4@ zCO4;2%ri8~b&^`*!cSGkGiUzGimSRP>tfu+<)7sKt(A9q$=XF9Ual%EvKNW^TxDm( z;^iQh&Hcb{yUdfoNiqypr50h^vKlS_dTm*I<@4)H9JlsGulypd$UMv1a8k*MW~1y{ zhHr0VroNgQ*{$liaRtX`uHAWSvUFFlZe4J{VNul0)5{z_im&-=sPX%zIfL4|u(i{x zGtby%xU1zf$Ly4TqQSq(*(KqW!c1MSlEkx?`(yK^467K*_GCGEmrmXV^r32rYeY#( zVo9o1a#1RfVlXl=G|@G%)HO5);rDHGnqRYX&#C@r8?{rH?#8Yy)GFJKKQFbZ zuT;}@Y$F9fJWr6ZS}EE|=9vv-RGpwFQ*$tA%*HPDV3D9FQ-2+3(!2!g9Ez!1aG2&9 zxXYoK>cLS2#Z(7YX>Pz}4#m_3c(8KhP-6h685B~j$Ffl;D4` zq+WruZ25mHKSv8NINP410W{?Yvi4n`U-ou7*%|dSJJ|)TEnK-Dd+oKo;E5FUABO$_ X_L?6X^AfL%+oP#Ngdnftxzb^ zc)sx86n55Sn*K#H7vC4D#s4#Ida%Ka{iI~IkLNAvS?1C;A#7Kf5;|M^`Z~EA1lgxL zer4R?l*?pL@6*&3c%R{l^IB#D|K_fMIE`K-1=Ca9XZg0W9#D{8;`EgvBJuKqzN117 zWpWz)qP4rXWg7kcxk6ZVndF+2)-`@-7HceXm!F>hYYS6;h(i9x#T=%FpByI%hSdGk zaAbVecUy^P)9M_lz7plN%NG6Fc3}37*#Bx<-n87$;p)mSG_PMIC%O4hYLo9)jw$D^ zgf6R>ms#O(lXL$W$53?`%FbW!c00vg7;v_V8u8IzH8kd2BlMpXBd*Z&+Y8qc{HlzW6KiZSMa9l7?%(0Ao_M#5JNMC9x#cD!C{X zNHG{07@FuBSn3*@g%}!G8JJrcm}naqS{WF~_jsK_(U6;;l9^VCTSMN(PX#~?44$rj KF6*2U7@Gh?xBUtL diff --git a/eclipse-compile/appcompat/res/drawable-ldrtl-hdpi/abc_spinner_mtrl_am_alpha.9.png b/eclipse-compile/appcompat/res/drawable-ldrtl-hdpi/abc_spinner_mtrl_am_alpha.9.png index d6e0b998415e81b2073b59038514fc71dde40cc8..4cd8a27c8bbbc69c30040156e046c17d3215b59f 100644 GIT binary patch delta 215 zcmV;|04V>E0_Xvd8Gi%-005FFSn2=(0Ix|zK~#7F?bX2v!axv(;n~%kb4~{~kTPsi z4{0GSqy!5{2aU{ZxVD}HHBj1#>5LmrVh(+3W*Ae2 z4aSZUfYB$dyr&9VjFz*vMQIc?IHTbcg zoKpv0i!y*^mxG>P+u5<&jilg+yBAPE0mb_ikK*KyjvJ1Uc`@~(t0Vvb002ovPDHLk FV1gS(a%=zq diff --git a/eclipse-compile/appcompat/res/drawable-ldrtl-mdpi/abc_ic_ab_back_mtrl_am_alpha.png b/eclipse-compile/appcompat/res/drawable-ldrtl-mdpi/abc_ic_ab_back_mtrl_am_alpha.png index 482e142d17fd2cb0e76ccb5533de41421658ead4..e300b7cfc79ae94a7084163fc1d9da7419923dd3 100644 GIT binary patch delta 190 zcmV;v073ut1KI(QB!8hvL_t(I%f*vB4#F@HM8_7QgcO{E>mURt;1Iaub52?+5K57t zM*)%I5G891iJf+zy`Nd>Pl3m$0S;$Ia1v(@5)+)E7>Ok%uunnO)TzjZ=OBWMG?mzn zAU(gVs2b$^{TcI)77{!7AU+;r!G)3=_ec+}RMfz!g(L%pk~cypeWdBo)AYbtgJGNS%G}U;vjb? zhIQv;UIIA^$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE z?e42WbOpbO)$4B)j`lM7ZI@({Be-*NNIT0$9<`HB9o#2; zgBEViN;TSlq~W1Jw%3D}69&fwrBY5?i{1=$6_7GNpWaa`(wTPi!z;nB9@YQn96b=; z!Mvs8wQ)j+YPi=s8=Lx~$48|#td3~jt<%u_?lmjNir-YW{#wnaNOk*n=P%BX+IN9z z<^|WSeWyZ7Kg+T1VNKGQzG=apK-IMwHgmG%y-WDoY`)re0X?N!;u=wsl30>zm0Xkx zq!^403{7+mEOiZyLkujfj18gTe~DWM4fErzBL diff --git a/eclipse-compile/appcompat/res/drawable-ldrtl-mdpi/abc_ic_menu_copy_mtrl_am_alpha.png b/eclipse-compile/appcompat/res/drawable-ldrtl-mdpi/abc_ic_menu_copy_mtrl_am_alpha.png index 5aaad7eb539181055c852f11bb91d56954bb06b9..05b1e119c44d939b552bfea59b78f6d190743170 100644 GIT binary patch delta 100 zcmV-q0Gt2n0)YXLBwa{JL_t(I%VS`m6#T~pUj7dxO#@I1$u?7>;lKa?SNPqIuHhvi zx1(#o=|Y&ysD_cEfjHp-)$jsO@_vO)gD*}kFaP^9PyzrqB~os0UR$&P0000HVp(<9N{V&jN)e_f;l9a@fRIB8o zR3OD*WMF8bYhbBsXcl51B?QYB!AOML_t(I%f*vR4uUWgMc*P2*nlA}(pcS(2)F|#CI+`6B%ssd zfN!A%Oia8Zp!byKaS-`)2#Be8k+AC@D(WahJ*Q2v0^tHgc({Z>GF&nulz=ZHf(yL# z-3-V8@PKN3;t4_uT=DUVfOt9+4e9Rc`x97qP+NJaWmRMg_PcA~++LX5{lkMA&F9S@jNq q1P@npY32vo@?3DqfP@P!{X8Ft&UNwE7+N*}0000GzaGAM zy71-I2U2A@KR?BGnHMn>wcPlnxAdvDK+^MFQ=}$O-K9_->s9YiU3V>pYvSV9LEqlj z_u3!v@tLLY#gHH9Z`Bglh?11Vl2ohYqEsNoU}RuuqHAEOYiJf?XkcYvZe?JiZD43+ kU?AV)bp}O4ZhlH;S|x4`c^5ww05vdpy85}Sb4q9e0O5+K;s5{u diff --git a/eclipse-compile/appcompat/res/drawable-ldrtl-mdpi/abc_spinner_mtrl_am_alpha.9.png b/eclipse-compile/appcompat/res/drawable-ldrtl-mdpi/abc_spinner_mtrl_am_alpha.9.png index 74160c38cced404b374dd085a6a55adf168068e2..d02a5da113e71869a79b829b60492e55a01c4bf6 100644 GIT binary patch delta 185 zcmV;q07n1e0m=c88Gi%-0013|wDtf10Fg;VK~#7F-IKuy!axv3f4q5%xo89SC|Hd) zU=1n57CcyhAkPnb89osfFQW5cnOz=#*d05AW_0pS6V8Gi-<006gxe0=}_0H{esK~#9!V_={T_z%T!4g(bproMp;qXyE( z!2kdMGZKRb#)VMZC4g7}hy`(AkeoQ0EB|9Nj0s9t|A&BAK>Q93zk8^MtnLXkeJC!*dSNoaoK2TGuRCr8MPj~q6YvHJtUmPIunxs0000< KMNUMnLSTa4_*RSn diff --git a/eclipse-compile/appcompat/res/drawable-ldrtl-xhdpi/abc_ic_ab_back_mtrl_am_alpha.png b/eclipse-compile/appcompat/res/drawable-ldrtl-xhdpi/abc_ic_ab_back_mtrl_am_alpha.png index 753496a8655324f1e233f9d64df7dfed2c9c747d..a188f2fbec82cc634eb28759565eae3e0b1d6aa3 100644 GIT binary patch delta 268 zcmV+n0rURj1g8R!B!BKnL_t(o!|j*74goy~L2Agg1cTB>DghBuY6W@Dg2M%iaWm zmuNEwc9w_+GfPA{ApQ!`{9gnvQ&l8d%z(XRU(}fbhYt`qs((Zot0vK5b%%I$4dNuK zj99Z^nWo{e-~Q}>~Ditobv;Nm*}O@F}6sj*YIm$pT_ru#3;U-e?SWPLInjq)d{M3^fb46 S-;n?S002ovP6b4+LSTXruX*DD literal 611 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}a}tmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIA^$sR$z3=CCj3=9n|3=F@3LJcn%7)pVryh>nTu$sZZAYL$MSD+10f+@+{ z-G$+Qd;gjJKptm-M`SUO_5fqIli7Aaqs={C977@wzny;8?~sFt+xaPv+!lQ-^tm!u z`aXwPl-Vb}eG~W>HcAMKGui5`VExlL^MabrFW*a7@4PR0R+jhPVYy$s))BuF+xt@v zoT%Ko_p7myNmkfXag9nAx0DXf)BTPTN2){RkIXyxzSJ~ney8)-%dXrVTm`Rv=5FuY zQFM#z(A5*xM*Aw z-@GlZ&*v}%g++4gki3&J>9|Pm-`B6se_8s^r+csZ!v)RT?%Vx3`(LYKZf&}J`-xlI z@8|59wPiiy;$5XV*Y-KBnSEd7_myw8OgzC}w+dq%wh45Gukf48cU`=?Z|2RH>KYn{7+6{v8(5iIXd4(>85ndMrs|+*$jwj5 zOsmAL;aASx2|x{!ARB`7(@M${i&7aJQ}UBi6+Ckj(^G>|6H_V+Po{z*o59o7&t;uc GLK6TpD(Y?k diff --git a/eclipse-compile/appcompat/res/drawable-ldrtl-xhdpi/abc_ic_menu_copy_mtrl_am_alpha.png b/eclipse-compile/appcompat/res/drawable-ldrtl-xhdpi/abc_ic_menu_copy_mtrl_am_alpha.png index 8a4e22efc2be15dd314d023619b1290e82d74671..e95ba942d637caf213207105c0ef4f23cbc37574 100644 GIT binary patch delta 158 zcmV;P0Ac^o1G)i_B!7WPL_t(o!|m8H4uBvKL{Tq8xV^-SNrLp>-h#m58Z|RLc?nFh z%d-4FjHZx?o&Z1|Ah0EQ1I7K#1Xuwg8+E4lO@K(A?R^_aFx&e!aF~J82N)V~JtIJX z009C72zUo@``9Nyz|(+z_^o}wY6iAGAh0_x-UQaci#i6s4i`R`6S3$-nWUML;s5{u M07*qoM6N<$f=@I;*8l(j literal 464 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}a}tmUKs7M+U~W1%@xC#RK^Y$sR$z z3=CCj3=9n|3=F@3LJcn%7)pT}UnMXwSj}Ky5HFasE6@fg!Ib3f?!xfDz5mR9Adj=a zBeIx*fm;}a85w5HkpK!_^K@|xi8%arx+7ncfq*Of<4Y3yj#aGvFEVptr1>7H9*Kyl z7iUV#TJ`pUiqP|N$BdWtC04vXte37j-Lz+JI8>(U|ITvnF9{`29{nv#C#Q9oZMhuF z7`UKRZ$U_N;@2I29K_D@K6v49cgmi6!RlKJTU~VTyf9p`|2c#HCU%DTOdm{mw+OXW zo%wCyYpEc0CdlUaxkg5w1O{e_0}MjC``<~_o_{W{#QcY`VSe+v|37v0@8nf#TXe;5 z@$B31Yr(O~B1WODI~E_4TX@3e!1A{X1Jw85WoEt0IC)Cr($}9%zXE-zTH+c}l9E`G zYL#4+3Zxi}3=BsH%|Z+ftPISp3{12Q46O_dpDKO`}m2f_|TLTn_y zC$p{~b{bFxaZk{VnobEiX+RaknV^oEwh4OD02|>4L?ey_-Ky!_IHCx|lAs^Fl39;O zg0>n^1+f4@+|nt1Bk={P1+Wkq*OVK($Us=}2WlE%A_QQ^7v$(=hk-ET7c4n)E`862 zLFBrYz%1$tYkz=^Fyh?+&q_~X<42?_-gI0%yk_J8nDJU4+yL|5fAj+Ef9TuTd0oE&FnW>m!TBt|Jusn3gE4oi7dfBIwZwO2 z_EHc#|D*q%psAXUtw%q;wzSl=Vbm5o-T*WO;H{2w+Db;Ntq~V$ZZKOC-Op6ginZ`#Fyt(;D{% z#!0WU!}R5jd|2~lvV@b^`_~;Gd}UhrLwOc4l)E&Fr}tTHI(9 zdKQcHnRh6v)#vy+2dws)dy-MFgEe}h@D-il=~@l8N@fSd43ln3JFcDWmC~QF@s9es z9c7)C!PQj_yo*j2&)?z5XKAvdwqX%xf>Tb~(GRKYXIU3+mw$AIZ$svj$Q$e*QqP`a zTevBIQLCU>L_(7u*K9sDhl~}QzWdBKXXc2jskUyo&Dg^makD;t@rxvWtBrdqZL1WN z79~Howhk){`?zDZ(8}+BFY7V<3jV!ES7BGNoY@q;xR0&*I)={w-|KB-K4JcB@3v5$ zH_@$C_wQ$(R-4-$(|>iXn4tmlndRSFpD$aX&?|CE;&12v+q71sF3ZxZy}nUZxqgM_GOgoc-w%4TEcwbXy-g-;x7rHP*v>n@YJaGnZjV11 z^Q3C-laGf5O;aWa9{YYGM&$XnEN%X%6uqwR!mmW~gR0wip6JQ=?9_U+a8CCbe>vHn ztHptjKExm0&s@jIBtFG_wrcSTVB%0Mag8WRNi0dVN-jzTQVd20h9P;}(xr(~v8LUmx#kazJ@0Z;>jr>mdKI;Vst02?wX$p8QV diff --git a/eclipse-compile/appcompat/res/drawable-ldrtl-xhdpi/abc_spinner_mtrl_am_alpha.9.png b/eclipse-compile/appcompat/res/drawable-ldrtl-xhdpi/abc_spinner_mtrl_am_alpha.9.png index 2d63334637f6af2c7080f7fb0524beaf2003355a..b097e48a2636fa226ce814b5c4c75a88d213833f 100644 GIT binary patch delta 287 zcmV+)0pR}f0`<2>bDNd(tTH)-6#DC5zkT${MK+hYFKEJ6C zyy|JvHcP90>)DaKUh#Ox-l{83`O87q&{70RPL l+ZC%=#Z>Gcei#5YOc;O#7=am> zfjMLr7SI_S!37+^7ZT%}U-cUA%tZ~B76{^9@=r-=uRpkQ*96ZShN%}lJBMaUz(xh; z37CKhn1BhGfc+SlQp#^r<9=iKlnYP@nmZ~)U%nFU%}^(tv(i3lpsc=13TXh^Ft~3C-_8&e7y4LrS22kz^78aUen}UuE zh@f;|%E$IrD_a>{hM^-cz2P$psP;+{gUeYcb4#dpYbD!rg{}|{_f)qa z%-~2PCs+X!FaZ-V0TZyXgUO!}0sDu||MnyG4ys7>ehJ-e8vpp0*}aIAPu&U!R=(W9nk2lo-U3d8Ta1K4D>tXAmaL-XNJe4_0|Vg z6n3+*-09mLxR|?uQ>tgn@&0LDZA@QzU)Jog_6)X@ICn<#?dzT=A1iF;U2zopdU4(a zCU?g*{nz+<@83U=c`hgR7>kADC8zGMm0X4Yk2ta@B{3af5#;>RdSsVxgXn50%`a^( z3I)e(1FrF=*`5<>JYd;>K%9Y<)!;2Jr=URcyarJQRoDJU0!m8jDj2(@R{9rm7&^p! zx^yOJ|D#!vQlIBc-m$RTn&IS8*`_Ct_#BH0+ZC3Iw{PVYyuL?GIGt@(R4C_^*dwiG z3Uj4amx^q?(koY@DDo=M&DV6jeeU1JMDKFty)Un@sCY8#nr5}dCY~|55E6Lz9-G9+ zlZKzXW6T%yFJ^E&$u(nptn0GxM#)y^E)-6g`g;m*^vrvqGoCNlwZgydn5Jgdx|xfj z=A?e#p8r<&XYa;IrR^O@&V7HS(%-kbrJt{R<(gHC);?|bohGS1pXqGs+oOe%y9;8j z>B&srnqT&5!qmr$p5IS>_%9`wA$4oPyt~($q%4Coyvi5r1mC@r<3DxR^pf3rcXj8c zZEu`@S1i40$z7Ij6*h9`=hrY#2-~Lcwp!f~7@Mjkt`Q|Ei6yC4$wjF^iowXh&_vh3 zQrFNp#K6+Z*ucuvLfgR5%D|x8FjWUdLvDUbW?Cg~4Zm{kP5^3<1lbUrpH@H8std$^QkQm7_vm@=W+mf)Yo~+-_|A*c&QS25EV^a#^21zKPpeb!=`(SvOmILa=Bfk5 zZi0xrzoIrYRedsva_qD*4GVa}{a=hrTjRq+zga6e$^sN7y|}sa-Z=+f#|_QzW;?X~ YWw1<^wa$;X@nrx4Pgg&ebxsLQ0KeN|kN^Mx literal 598 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY0wn)GsXhawSkfJR9T^zg78t&m77yerBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpafHrx4R3&|Mvbf`++>p z0*}aI1_o|n5N2eUHAjMhficF@#W5t~-rHG$UWXk7+WvQJ`SpPFh%m>i<|_7=f^T+f zh#b{^nVKb)$k(`Paz!%^^Q6$H-f!ct7wr9(noe zh=lT&u)E>=*D2m#G&`xGe^Nt(=DCeI?LV_$NQ6H$uop1kVgDJ-R+IQ%-yx1meci3w zLP6IA8#$(Mt?0M5SzLHyv(%mka@J`|S5NOdb0oajGGeB3$cLEd_No~VPS}dSw{X4O z>9X4N^@UOMIL0a=0ik z33fQ7b~vyo2{aaU1F3+l-1OO&MeBlMTEMaz+c~!Q-HQ7ryG6`q_BHPAiDC;Y7xkO} zyxJfq#AqAU^M&o6g!(&+e2dL0zTFpunD+bnD=&I7>rJ9fapS1oakC`m~yNwrEYN(E93Mh1o^x(1fIhGrp# w237{jIq~sQ)rBYDL zq94l9!)J zCSi_UT6E~qqeF`t^F-c6jCV?$k}{eBXO#a1sKO0iZmHsfh=0jWoP+a$A%D+DAEYN$ zFpi(91Co1f+8;^~@9d0Ux!1w239*&4c#~bg}F@AR%d*Yb>1+(jsjvDRT}; zK=S?~q0Slw3aoNK7qFZXIUpG+=IObiW6U{1_5o1Ak=pM(pV>`+#&L2)1_@_$FQ2E_u72xI^~N46-6*C!1p zrNJS6#e%8eK;!=DP_geSIB<0T+)#iN97s8$L5k&@1SI&BbCdKO%XbwhfTJgAIDURe zK>?hYuP*5oTm0lV13||a^k4al*8%A|#sH2-3hWr=SJ=-u3FsJwoN!W=X#8u?CoI7o zqmJW~tbb#iVwpYeLOMpxeW%E^-!bx{;8oj#0Dr&5~+5M%@;Atmqh(OYsa>IXXrm z$7X|Jj*d~tv3bu>+A#`dgDYvrD3}?JNu?d5U?pbRrpX0~zGIZle*~I9Jk+7i;@6}#o@w%Be(ZO*$L z9p5;QIMjBP#s6_wFje%Nl1^r$0M)d}pSZWs}Ox|0n;J0tBl)O_(;bhgAu?>9NZt^qK-0Jr@B;)O)jX%SWHEz**vej^E#{6k+nP+*9G?pl&T%FRj zYeB{`##ZII9G1miN1GN{c(Zf43aP8C4-sKG+RGataVb|T;GAr|2FuHsfb-g-o7V-4 zwUuaOy!JY}?Dir)*C?SWxi-FA{2xUH>?vjZQKH*qcOL z^J9;{Fd=JW|KE9=zW5#z*3_0^_;E#F;kWJ;W=(G(dyeUZe?~jjx$f#utvOuJx@*Tl z$ypJT-?j=Ud=CBDyzHyiN6yK|XYBKQG2zOLs|E_YZC~%b%oY8SebarXyAxK`IpkUY zvR>Y)y_0#Tyul+6+kV4#$(#rMSGGOpdQyB((}Vr@j^h!>HeQ(Z%CPORKpdCX)Z-D; z+%&Hy^Bh$)Va@ejc|$|Yx$c<Z%+vhV26GmpfUA51>;NbSRF zktGTJ7t^PF5kCIN@YkB9xksB>*!l~X@bjDWUgnNkqW)z z?&S={3)KP|CjXe;fA3w8F}-vGFcYbkxJHzuB$lLFB^RXvDF!10Lla#COI<^=5JLki t19K|_6Kw-SD+2@h9f!PC{xWt~$(69A+R!+Zb$ diff --git a/eclipse-compile/appcompat/res/drawable-ldrtl-xxhdpi/abc_spinner_mtrl_am_alpha.9.png b/eclipse-compile/appcompat/res/drawable-ldrtl-xxhdpi/abc_spinner_mtrl_am_alpha.9.png index bd1029d80ab43e800803aa492b88769585973348..0b895042f8d9fdf5f1f8674c6820465657f01167 100644 GIT binary patch delta 407 zcmV;I0cif01f~O!8Gi%-002Z~Uta(K0c}Y{K~#7F?b$s_9Z?hq@H>;ho1j>~(#{Ro zyNP5Et{~}>1-JzpdkbreWD8>D4y>$%2yfopUtl`S-AIiV&7Z%sc5Ex zt(i0LsWY8+5*TEobAiR1sRb@{n&75@rDzp<{$O|$H{iED2V5e34t?#(t!GKNu+w-J(9rRops^bgO|u9=THu&&;m6a}?a_V36NDsOo>x zRS&)fw>lW)XMe@9!Jt0j2201rH`WNo@%e!u36Ae^RMreOV}=v-YH&SH#&pe^!5~}3 zDVD@~s%V2-4SeCcJ4dg_xwytQ1jZzHT!KqGF}=-!LC#&fHVI(~b@%(UdE-M2g$AJ$Gfsd0D(qW#;_)P;i`SS5=O=&BbOG)%JGE~CAU@p&$< z+MW0b^DHKwQJ!<=>x-lpGxok+B=Vu<_mnMDD>7Xn#WZCVPdWncKgKRrMXbwkYfIPTktSs~*Jc&fK|> zg|TPqWbdtCpQ~C}@=bdbbGF&$Pp*@fRbAZQqM8$*z2?~6@PbVwL+}t_cLC-4-VY{x@qZT#h4x8VpVf14N diff --git a/eclipse-compile/appcompat/res/drawable-ldrtl-xxxhdpi/abc_ic_ab_back_mtrl_am_alpha.png b/eclipse-compile/appcompat/res/drawable-ldrtl-xxxhdpi/abc_ic_ab_back_mtrl_am_alpha.png index 33f6587983e9e5625e22934f131bd1567c750058..7dc69341d2870ddc7946844302e39fb4b658ff76 100644 GIT binary patch delta 204 zcmdnQ`hszSO8t6I7srr_TW_x)av#wCCG+3$J-N9wz~1BfAqF7uboFyt=akR{0L{5#?EnA( literal 690 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD0wg^q?%xcgSkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?skwBzpw;GB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpafHr zx4R3&|Mvbf`++>p0*}aIAngIhZYQ(tfJV1@x;TbZ+*h(^~At) z*P2(}){8Ru`dztMv# zLHz?`N)wZVY6gQ#6PJVX3kH=YAqT|_#=!R(O;QZ%FBlV=m>EF z@%t}+>aqSYL5s~HZ|urthB&))EPw~p>V>;1qK;fBJQ8 z&40GzY5S_XGp+CMKFNNfJa4npr&{T|3u>+hGDqxtzJcA~e&HRqS?ldTu$&8*w`_jC znPL8_ntRb2ra#Z{7ixXl8Nc}C`SklICe7Wy>F5^YpO0snT>mq_f`Qqhn(e_n#vSPl z?<5;Q%*TxPXM5$XK3_WL1~6(=OI#yLQW8s2t&)pUffR$0fuV`6fu*jYS%{&5m4UgH zfr++(p_PGwe2>=|6b-rgDVb@NxHaTm{8RwcAPKS|I6tkVJh3R1!7(L2DOJHUH!(dm YC^a#qvhZXoDD5zKy85}Sb4q9e04}Wm+5i9m diff --git a/eclipse-compile/appcompat/res/drawable-ldrtl-xxxhdpi/abc_ic_menu_copy_mtrl_am_alpha.png b/eclipse-compile/appcompat/res/drawable-ldrtl-xxxhdpi/abc_ic_menu_copy_mtrl_am_alpha.png index a5015c6823d0a2e97c0a534d2cdaa136fa8b4f68..884cd1279bb7d5955784655dead6f4259636c18a 100644 GIT binary patch delta 303 zcmdnTdXi~^ay_Gfr;B4q1>@UmXLFex1y~%NOV z*-uu9A1r^Rm-a2LW>;&cvGu9@+Ix1Jh3fIxGBeak{9-$>wA>-}x;ewSz0Aw*F?usB z_!uX2p@NBpLtw+xBS$8Ec+bud)^nw$-k!stpcP2*7+l)rU9XbhytH&`tjq%sx91iI z=JqVJIN;;vE%RXO5@%J11_nluegzzif8q~Hk>xWOW}M9EWWIAEql;PQ#0wGjh|dd3 zr{>Bm*s#1*Sykx6QFGnho4QzSIIHEhtS~YPSj2cz|+;wWt~$(69D~qa{&MV literal 702 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD0wg^q?%xcgSkfJR9T^zg78t&m77yerBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpafHrx4R3&|Mvbf`++>p z0*}aI1_o|n5N2eUHAjMhf$@l^i(^Q|t+%uN{g@18TJK9J&pB-RZ+D}h`6H}QHF+1AMf4g_2u#S}{?qf&kE+&Q#eY;mVc~w7*v0j!)GCNfBKZurPOC%H?MD{Sxkr5|rsrzM%G zu}K@7|GmXycI~-u_#->9tG5#7SS%)(l?;fT!q-KF+_J|B^rv|q@(;jH|kC+<&_Q=WDJBU!b?HKHUXu_V>KdAb7#dg^m|Gc`Xd4(>85qd-c%4Dfkei>9nO2EgL*B(t1wai9p00i_ I>zopr0A2D80RR91 diff --git a/eclipse-compile/appcompat/res/drawable-ldrtl-xxxhdpi/abc_ic_menu_cut_mtrl_alpha.png b/eclipse-compile/appcompat/res/drawable-ldrtl-xxxhdpi/abc_ic_menu_cut_mtrl_alpha.png index 2f12fc0d57e18260c9385109ce5094b10a427ae8..90fe333ac3531c602ee15ceca3a3f22551e97e6c 100644 GIT binary patch delta 883 zcmV-(1C0EG3W*1hBYy)>Nkl<~ zIfACsk)+Y2H7iA4$@COh^5 zDuqeBEC=r9@iJpCpi;SfkOEB=VYz#LIQ>G@yCPDDjEf+ zjqwl3YA$n*K0Yq1q;;o7r!DdKsL_ln1%}keUFV+h&HW6MY_Ly-Yg{TEP+*$QhdHl1 zVdGnj_sN?I;>y9|SK)|n{k1rL_9|QCP(Y$HU#^0rv9=<5w^(f;*-_0jI%2!p& z_|SjzS+7z+86UpVPanIWQxL?r;G;%BA77v#if_S+KtLW}prDU0R*=TG;8SP;`9s48 z3x($_@{J$-;a`Zpkm{M|R)u~3hU*LIAKBhxfq$?s6e50j1{k|eIZqRLqXdYQvcTduI~#e<9BkY>CaTZ^?jkIU$=Ssg(qEneP2jl`qTD>^cUtWZC^-#AfM9qh4lCR3{`DkNdJ0b zQ*7H8(!X69q^|1=$>JNcqUs9?;~SHrr05HY;~O);S-bl}`uOI&;7r>W($4@TZC^+~ zDORX!`$GB|WRt44FQlIgQ*3cS1y|P>ieO>^`NRUTKr9do{0Bunn}(h%45bDP z46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^+;1OBOz`!jG!i)^F=14FwuyA_1 zIEGZ*dOOG8U)WKi{l3uUNlk%Ay2XDAJ0D0m~jX!U=VSfCthmLR4C;*$&3} zbcnyNYF1WJ5#VCauQJpq3S8LO^znHkb81>yd0P6txn?g-6g4Z;E9RAzS>OGss~M2H zo$WqDDI)@Jd)t-Iprn+w%-zJH_KM^6ju+;&OO@7MaJRbhg8P2IpUy*$Rbfty<@Jkx z{cb&qW09(q;& zL0H5THycO3mENYBJr5#QX}{q7pk?wfK;mt^#NSh=eou1Z4FAevA=|zd4*W(Z7Dzw75g0Nh^!_Oy)*R7ARqb0NuXa3RGUGD)5&f!vj|Eeq zXwHZ47uKb9stdRuAYSCff<_rvJM=* z>#Va#x$B^x18aKMe0Ifd$1};izb%|4e@7fwYP+z+IYC>2>Da;TRX4apoYeZ>zxq^l zPki6*zm0q3YxeQ>9nrgb-NLT_0P8=ayalZ9e|)fH(Te{YCcvRv^P^zj#ktE@cBQZE znjh0!`fmSm-z`Zy!|In!_&4coswvluwH9+Ve;j0Qc$p>CvHf28q6hrI${GM}~vg?`MJ-1KDv+lqdx zmsWy*7wLyA5&h+|^u@ZXiU}99{`I}v)$l${{KMT>O#5!vpS9gO-SPCFSHKcOwItIu zq9i4;B-JXpC>2OC7#SFv=o(n+8k&U|8dw>aTN#*W8yH#{7|8c{odN5BX~@k_$xN%n Vts(E?rvjh`22WQ%mvv4FO#m$dC@la0 diff --git a/eclipse-compile/appcompat/res/drawable-ldrtl-xxxhdpi/abc_spinner_mtrl_am_alpha.9.png b/eclipse-compile/appcompat/res/drawable-ldrtl-xxxhdpi/abc_spinner_mtrl_am_alpha.9.png index b1641732e9f059e2db0d2e7d7441087689f9c26f..930630de58663275cd8877bde2dcee5a0a273c34 100644 GIT binary patch delta 351 zcmcc3{GMroWIYQ514FD@??MI!Ml(+r$B+ufx3@R?9!?NwdszIq>7K0ijx=ul39dFy zHx6?PO!M%)p&+}^*Kxw9qD4$13u9{3cmBAy|KHl>pVY;-u^yTKIMJJXVT;hKaHpv% zQv#egRZ)qf$}`t)JgwfAHRD9qqLU7lTWsnlUu+XQ?O1tdV`^S>eb>{4Hdb*nFZc1C zcCEa#`T4bPb+RN=YmYJ=vFPoNtuJpgxonqP!tjp95G^c9x_sLGLT6owipz$TAkC*MK z#m^6%kGS_@V^By!71QLP{!bDX4?iAkxVl*Bvha*4RaeS;dWt<>?Dp3H`p64Gtk?wN if`z_(>iJjlgSGGa!)oJsAAljrz~JfX=d#Wzp$P!2z@6d% literal 475 zcmeAS@N?(olHy`uVBq!ia0vp^UO=40!3HG1>$_?(FfcCiba4!+xb^m~p&yf@2wOsi z&WpD@noPHUV2VlUZ}|R!>5=N1qtZ7z*S5~svB%S_Ex@6m{N~KF-__R}zq_r^_pCV_g`Hy=XUe5S8Jjb zY`3mZOO4&UWrbDlYR}5=fxcI7#x#7n9b`l1X1y>~BNQgUfZ5cv2pU42#Ud-r f1l0cvK9sBdcz$L6*1dheNMrDH^>bP0l+XkKKdQ$i diff --git a/eclipse-compile/appcompat/res/drawable-mdpi/abc_ab_share_pack_mtrl_alpha.9.png b/eclipse-compile/appcompat/res/drawable-mdpi/abc_ab_share_pack_mtrl_alpha.9.png new file mode 100644 index 0000000000000000000000000000000000000000..fa0ed8fe9527428ef714497d01abdf43291440da GIT binary patch literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mj6Gc(Ln;`P9hm-07JQbtBB}Dh zp>#u$0<-)C39YUl8#I6U_b9Qg(vUjT=vfl<)1SeJfkCBN<5S6v#V3K<89ZJ6T-G@y GGywqJ$RJ<< literal 0 HcmV?d00001 diff --git a/eclipse-compile/appcompat/res/drawable-mdpi/abc_btn_check_to_on_mtrl_000.png b/eclipse-compile/appcompat/res/drawable-mdpi/abc_btn_check_to_on_mtrl_000.png index 70793c4748168bcde63519825e6b9fed76aec496..7a9fcbcbfe5edb62e193dc338a2555129872aabd 100644 GIT binary patch delta 197 zcmV;$06PEE1l9qN8Gi%-007x@vVQ;o0G&xhK~#7F?bI=@0x=K-(Pt+hfwcAo;82{O zlo)vqz|YaJ4jlfi4lR`?aJPhmGRcIhO!U=+vu2a0IoqM);Ux@_WC$-0@+%5Xo<4@i zWB7PFq2z+*ZMeB;$@v#I!(00;*bHGq$=`)x+Y^M)QI)S$bUq>Gg7))*b_o8FVE&Po zzw)F^cUN8eN_Tb7%d}qS^+8#mwDnP4nDv7{hg*I3fMmM?00000NkvXXu0mjfg=}5G literal 595 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UV>C6dj$D1FjT2AFf_CjA5L~c#`DCC7XMsm#F_2~iVMYt3FAhLj(bL5-B;xSfYmR=09e7wTOb=j*RS12= z7OS-GfaVU)aMq0}?&YxzPOOZ)-Bu+mxkkATt^(f5+84J!zdcWKcHF<+BKKP|C#~u( zygAW9(9X)WTq66j2bay!TUtdH$65Gy@Xy_x^+u&;iCwgDfXf#49mg!@p080x;YY3 z!~bkmj-1swmw&0X?CI*Czd!NC33)mHoUEe^3^nNz*N775qSVBa{2~U&l>DSr1;@0K z)FK7fw6xUZlHz9z+@}JSse+WHB$lLFC4cn&=vs>KYk^7#dj_n^+l{>Kd3^ u85q>EPX)y*LPKtTN@iLmiUtEKQ$s5gBZ!8?pmhR34Gf;HelF{r5}E)5yV9xv diff --git a/eclipse-compile/appcompat/res/drawable-mdpi/abc_btn_check_to_on_mtrl_015.png b/eclipse-compile/appcompat/res/drawable-mdpi/abc_btn_check_to_on_mtrl_015.png index 8aa1be2b6d84235d9a5c83aaf71565d275a07ed9..3b052e5774d4a68b14cf31cff8ffce5dcec94220 100644 GIT binary patch delta 306 zcmV-20nPr@1;PT58Gi%-007x@vVQ;o0SQS&K~#7F?UXT&!Y~j;UqS)WHVIebF0d_} z1ySx{=xM1)+@ekF+1R3pM&8(x+sv=5_&RS6}krb^&z618Jb8y9~On&@3g0 z1AY;1z%dVCCu#eY4RA^W48rIk%3cGPuNS%G}U;vjb? zhIQv;UV>C6dj$D1FjT2AFf_CjA5L~c#`DCC7XMsm#F_2~iVMYt3FAhL@k*AAeNW|f{(`@|?I|#Je-&Rl%nbBRq z?B{q^FhgTOx5&B!qCZwXFbG(_L?v*Rijw`Z57DVlD(3d)YH~fbkBq`!BvwW#MBiJDB2l(gcbd zm>1}8Xq|U^$L!1EVVQ?QUtebQ$LV)HA&ge0_Pi8D$HGEu3cl7_!wNTVmOE-CMc=QK>wIU;?`;T9SjaHVCGd#i%!`>6!yl@AlK6l0 zNsh{zAa9$uhCgrBF+4wYDAZihPVs+n+X2&`ZzZO$-1>P^&g8!xi%OQK{@nk!?l+rj z`>DtYFYkd;gLH{&M2T}zYGO%#5rbn&ep0G}V_HdSk%DVlT557h@v{Z)Q-R7cpt3=UYU}b7( YWnu);kQlU10H}e%)78&qol`;+06OFm2mk;8 diff --git a/eclipse-compile/appcompat/res/drawable-mdpi/abc_btn_radio_to_on_mtrl_000.png b/eclipse-compile/appcompat/res/drawable-mdpi/abc_btn_radio_to_on_mtrl_000.png index 54ef48082e73f4fff60602ef9e3589c79406353d..96a86931cbf3105ea51a33f1d127d72f9a666a77 100644 GIT binary patch delta 310 zcmV-60m=T#1;zr98Gi%-007x@vVQ;o0S!q+K~#7F-IPH}13?f)-%J;-%&hbl!CQC- z7rm9tdGru2yvIN;AjDOU5D>wWqej9@o&7B) zx!o89^T@=Ka^oeLXLcNfow_W>gO?n?V^86O!n^R*?ZqyLkblf0Mc8uBnrmULZi_f6 z{2tH)4>GNS%G}U;vjb? zhIQv;UV>C6dj$D1FjT2AFf_CjA5L~c#`DCC7XMsm#F_2~iVMYt3FAhL@hNp{TNW|f{)Asr?If}II|J&K=w#Gos zhI!$4#x*)ywk$AxSowsrg1MGc*h@!a%?gh<9#^&sUT-Q+-K2N=--62plTJ=Jy*K@x zt?}mKME>&}WfHTmDRyS*NM-*!^{{J|T99j_NB1oz!-6IEIX}ECXgg38&bg!I_yN-b z)-MglKld>BA7C!v-}6)@hMVzq?k>hOC6h<|yw}YpuU~oX$(+9|{I2tuk{^h@U|KE} zd-GV|{S8g0c5;~B@BAPtF{MNLgn8(i)1gvo)$uNz1&YyY1Xo#EE2p{d>rDDBdG6At z?G5P@Bc8HHtMEQa_FD2NBXtLNVrazIe!r=qdAKBj5s*L)14BTPtD`V9PnEj(=xC{S1T3KUT*6Yi; zhq?HHzzdUr1s!d)lHB)ykC41+9O&Kkl&7&povr2R<*q@!+dr zkt(bI`HigqGo2spRsDQ#N?7aGr2|yOUhdup-Ys&i_Lslx10@#e z64!_l=c3falKdhD$CUh}R0YShlGGvv*R-_MgTe~DWM4f#{m(( diff --git a/eclipse-compile/appcompat/res/drawable-mdpi/abc_btn_radio_to_on_mtrl_015.png b/eclipse-compile/appcompat/res/drawable-mdpi/abc_btn_radio_to_on_mtrl_015.png index 4f8a162a0b45c5052128fe740874420ace7ef005..827d63425d7ed0e4e6a93f3f2125a5e8c143fedc 100644 GIT binary patch delta 342 zcmV-c0jd7>1?B>f8Gi%-007x@vVQ;o0WC>HK~#7F-IYI1I&l!iKkKfEg+Rk8NIV5M zFcuVBnc!V$^$-?b!EPIF@Jpy{u_7kesEnVG>40C*uZ_-2;PKwuf!RL;f4!>2w+?Nn z$&xi+Yg1>up)ZG1ysC%`Si3)3BMsv5ec4xc(`3D%5(Q=noXs{Az82@@s{{rDaWf*arrxTND* zbh53Y6DE552Wj&AyW}(Z2a&I{R6BW_e9r*)L{5JtdlMVsJE3CfhAGqg2B`U`eSyWJ z?43x+R4m;vRZj!eZi7B6)(n9G%e?v`*-{nVwWNS%G}U;vjb? zhIQv;UV>C6dj$D1FjT2AFf_CjA5L~c#`DCC7XMsm#F_2~iVMYt3FAhNZh^LEVNW|f{)Asr?If}H}*ZJ@SW^{C} zcW}yiTgkw?al;0q#`1+zkC`vHI|J7uAJT$J}|F1+OgVGTH{*P(KhYhb9+RD0g5Q^J3n~8IXu@Y&xOT_s2}Xw+n@*?g(ap=7XU9>PyI8+ldd5j}y=Lh% z%=v4~f&yb0B|iV2yZvloa%SM0khq^KScLY={XQ1Y>C+es-G2ZhR=UJBqQto< zHL)bWh`})>KPgqgF|8!ENWnENEj78M_}K#YsX%3_AZ00uC8<`)AhoFsMh1o^x(24Y zMn)lqMpniqR>sD<2If`<2A66V0FxY&hTQy=%(O}r4Te^RKn-RP4I=vP)qU|R9aoew6VC%)bj|Tgdjaz&LQ!}zVFrHd&vXm{oe08 zX$FA5NX6Fs+}qk)2W(SObVKWaV_>*dz};J^}D-D}WxqU_u$+ zSlfKyQGtp(y@LfeH5*7ef`V>+7BJjwASb{fY3m)s85cDZNZJD)sy>Z?fo1|-rcsco zK3yxom{eRKZH*1Ca8)hub=IOMYZd$Pvs_(8)@4>(bv_{JHqZFjxG#L|xbOW`%Oa*_ zYqh;j``c_?#Ys~pd}iE-cDQai;1Zt-k6+zW-xGu81j6EViRE6=m5u<;*k`ZNYQAs8 zW3HF@SKE6$=w%0t8FSEn2b}}F;o`6!TrMxbIZx}*79ls-2mUl7bG|08@w_rBK5%Kn zKflRg@Vo6&7urSbb~*))+T6h9l6IF<2>f7cW7{<0X47ESwhNBni%KA`JIbJ~GpdY5 z16B#ETJ1eh@`7a4N$&87GKw~b*6i>X3i_qu9TmOiFc`Z2ExwbDe->q(z)f%;=5}?83Y)q3Z)!bbDMN=_F3b*4o}@rw44R?U*g*u{$o%3qD#JwjOyU z1ZKUubm@1R!fEaCfL-9>>Qp>s0TlcOCT*3Luov{l0XiH;MW;Srsers5x0(Vadvv)E zycGxNR=}hoe}FkpEUjd`X&w~41SVvn1349x1z^-Qb%#Mp&LjY4Tpb-40t9|ExXee& zTCXSqDsG7m900s#W9T-%(ILR&(SaFdU+Qn*lk&L0?&!dC?r7-mQbL#Q?vD;c&lTYR a3j6~C-u92n)Ew0S0000fi!_8!-~5jmlUW`ZW$sCX1uzRkRyd zs%M&$-$l({DpjAFoY1pOix)-QmD#yUY5!l+mQq{%|0CEdc*3 Z@CRm5>7Dmyt$6?d002ovPDHLkV1g`5@nir1 literal 0 HcmV?d00001 diff --git a/eclipse-compile/appcompat/res/drawable-mdpi/abc_btn_switch_to_on_mtrl_00001.9.png b/eclipse-compile/appcompat/res/drawable-mdpi/abc_btn_switch_to_on_mtrl_00001.9.png index 03d3dfb5cdebf707ffabc83126b196d8f14d49ac..b2191dad9f4aa38b549f8e092848ab4f42e27818 100644 GIT binary patch delta 699 zcmV;s0!00lfdSD4kRyKrm`OxIRCwCOmOYCaQ51$9XNhK0EP;d+fh^<~#3qnJ1gn5W zniRq|`4b^kijW0KYl<|95NxzqQlv?jLhSrRI~x^6K`X`2(V3hlc*79JSwAM53x{*h zz2|-3d+ywsxxP)ad^gjqn-)}J)_wrX(!_MJ6Ppoho{K^}pU;1Fw;bll^F(ww9R4Ay zR;%X{zZ{K5Z^q;Cdpt4Y_WXlI+wHcd2s)k4)9G~jZLwHPmdmB}w=vEUD@p>a*imk*9n-QDLlSe){@bK&`S}vD=3r;4JuZCe*N=T7An5h;( zJ~;63>?GRn_jP}~JhRIU;nGRWMVw}VSA4FbtJTVn9}EW1U6wp&y{UktpiML^OfRt6jd*HsZ@F_s~o9SA0n!7@W7||okVqfv)POTIHF3+j)zb2 zZx!wJdT%#dYaA(RzysfPqMWu5UW&qZt!S&&dgrAmd~ScDetfZ5eC6dcg-`KsJ-x|f z^2uyAo3P4bPA_e zczAaHwdH?uIV}_lol5t-P$+zsLt(Od@l?J>Kp8RP%#%kxIPmc7EJ{nK(^@ndy(8TR ziA3T;K4(8?(l{UpC?jT^dGg2y2j1o8;ND`f*zI62cqZLP@p$}sHk*B&&*wi%MPKm5 zj5ALj`Ci-xxxVP(aG0vkG)=oJ{+`%I!UEc0eR^Ic;bEUz5nlq hPseUP56yww_X`pPABrSes>=WX002ovPDHLkV1iGZUY!5{ literal 16533 zcmeI3e_T`L9>*UL4alFRNTs>f)g;-@&dvtxIA+LHpoW5EK>q0L>}*WO&e{eH%3Ppi zru`7Qq=k6pl9HFo6nqJR7^0Gt1)}*YEDch~T`wtDysx@v8$ad)oVvH}>%Mxu&Uw9H z`##_2^LfsBKhN_$XMdcR7sW0Z%id`Hzm zK2NU+=RYM?iBzUYDn%caWu_Kq#U_wht4NuKKS$v&x8aOIDrF^jwp4@Bg4@FRE?=Da z?rcW*JXaU%s&IaUb3k6AY7sAzHd8#QP%0orVw4vu6QWXy3`K)^ViAfVs0b0u1SpD2 zLUA;N*L(04{>(SIS);|{mGgUtW1?_=iq&eu5hNocLzsaHX|oPNWilBe5+h=^AB1QBoGttT$Qpw2|lZCDe49HJs0P4%C12URSEAe;}i!mmNb9u@NQ& z6^f9dL>jVRV@fj{T&JcX5z0WNQbwzV(V;`?OewULwxrO*4B4L^c3@^sRI2{5hdkfZ z)FFqqSm&iP2zrqYsk9_ynkXcmve0Q}lA4#!T*|{kUA~`cy(kAts|vjtn$<^z2_!cqDD0&CF?03QUd+)$E~iEi*jY zXt5GTl8RO;mZn*gNBOITbRX}>9J^;rRyqWi>YVtZ0$=J^sa(rBFq-bx!uC~efzDy zg7p_Dr^dByae{P~G6m_}4U|TX+|fF4TK&pinSSsD{yNHTe-HWaV`QXIMz#&*wsQ3v z-o!#{tr>)wiqJ7@;ukl%+wx8g>@7!}b>E=>AIyS(hHnG!&_${i|42DJ?=7Fxm8-6HvqA$R|6-86ebNP^hopy-Bac9*zBsC?pEfZocTR~^#33jR8sqI zJHO|bfh+nwT_G=S5C{l+$l+q=17$f}5D@l|!^O@A%5u0MAnYNBi=7XY<#0hj*h3B% zJ0B>^;evp$ha4_;K2Vm!1p#3XIb7^~pe%U10xY+qXSq>KjggxYNvGakl94-h5 zd&uEp=L2OqTo4fUki*5!2g-7|ARz1^hl`yLl;v?@ye4s3c3j)F(a=6&}Kv@nK1cW{0aIy1&vK%f52z$ukV&?;8Ib0AB_K?HH z&IihJxF8_xA%}~d50vF_K|t6;R$TrAuh>#X=Dpes<^|e<@y9-5UcTj#QSmAOvZe!I z&jH}p&&=l)0MbMNTzv)r{4D?`)0>l_&3}3+Z=GMD+FSVTd1>y%pJsXcee>SkzUSYK%FD4IN~~XY@AyM1|Khe- z-h`dlg6Dk>&DBi)^WScCe%@L2$*k6^N9)@U-xs)V>omvP-Cuu9D?W)Pfe&ch==gHI zx(k$SwzpPY_ZwT}7jjYN6*XqcW-sM+x@mXZc2HZ2yf_`K%a1>NdtZCzhV}XFnf~@s zwbwrm+!N|&Gw=FZ^A9T#$S;f?0d978*PlF@Kg! zwxW9Vb;qF_F+oc!t)-48QElY*BE{-#BJlP2_>i|%%yC7#H*@ zca-Ji?E}e1zxz5{)fXR~=p0I6Qd^(NTIzy|| z9cpwcr%tV|2<}K4y(8<^$k$`76JDDI3`wW<78e(ve)Wh8Jtr@qzEyW)=JFFiq~DfdbzO3=izi%KX6Hz*D$>Ns z(ZxaF*mvgrFQ>?bJs*@T*ib$71QXu1Cs&TDy0pmX)|hgoPqTy`yN)=#>X{XP?@$-{ zJz65KiTWb$W_->&=U0|1jud?VbkS_Jc3*PYYdP=C@kuUQ@<4KjaKg*MhyG+8^bPviJ=p`B&G7<5m>JKUy;JxozD6_J+pNO`A5YDeQRh z^TtN|t;=3toj?CPuViC3?~C^BwSStlGKkuD;J__j#X=0j>bB?Q6PU@JC+LPEN7a>T}+;lw;NNAKU1 zyDQ;QrdMvh`LFk1j<_&;=JQ!;%sLM~?hW2M-Ld1#l=ZPYN1Us8w&RrGhsyUy)mEp4 yzj5^Ec~inm=lG@{`m|E>)`33O?k3^+&@2eo_55`=DbQYUp%3y$Co(7BbCI|br>t83&I(5{81AnV-BO4zdchAhsaGcuN+1YHRQZXTyh*!mp z8_v8gP962&z{7uYC(+T-QPtb2?ETiu8?R zwc2nKJUoiGq3GV;o}0M3x*EB@zAma=w@W7||9io5o-f6`B{rykuQazO&coiP_ z6u(1Mj>1DM6bj#MQKLgq10MJkze7~suX^(M_&8~rW>-YvfzRf5idvRcPf8R2VT+m_ zikk4iXY)4{)rjls>tDKgPvKMijYR1jS}YbDE|p63*p8lF@bE}G9EKNuhbT5ZJx%xU z%Qx~@wOW6rk+*fk;K0KJpYZnG+8mabmpOud`8G~)Pde#H;NgJ}-ln~GWMt%tgy8n} z_F}D8W7o!gdN1|hz{3My%Z5KNFrYmXli}-wgM+Lk#;!TCW?vcBsiPhoczEDzDT?|1 z{zrp@gF`ZWyScf!#FNPG?GJVp0p-levrZlL;J|;wbJveJ=JNS`{h?4OEaO-4c>MF> z;ocN4Br-i6f*z5H^4hDlSJRT2C`_0(c*vFNXm9O&drM9-V zmWa&BvrZlL;J~-_W2Wmmz}|2;{4@{<@beWFk8m~0nUiOoI_kl7 AWB>pF literal 16607 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 diff --git a/eclipse-compile/appcompat/res/drawable-mdpi/abc_cab_background_top_mtrl_alpha.9.png b/eclipse-compile/appcompat/res/drawable-mdpi/abc_cab_background_top_mtrl_alpha.9.png index ae8cccdd6f5fba6b2e8954c2c331f1f5d53c3524..038e000864ac899e314d228c280b2bc546c194bf 100644 GIT binary patch delta 75 zcmd0fpCIYR!oa}5?A+oCq|`iJ978G?lMgWeV^+L+;QzvvnIV@~EDQAgfAW%xyZv8v e-b;bP%nXlCCePLB7s~?bVDNPHb6Mw<&;$U)KN{8m delta 87 zcma#go*)^-#=yX^(#z)@kTUXgaSW-rm7Ji!|EK+tBm2MpD3h#t6FfeSXNuK-mZfqw|H-o3EpUXO@geCyq;3PBv diff --git a/eclipse-compile/appcompat/res/drawable-mdpi/abc_ic_ab_back_mtrl_am_alpha.png b/eclipse-compile/appcompat/res/drawable-mdpi/abc_ic_ab_back_mtrl_am_alpha.png index 667435189e056e6f30e7a7462a6f0aa4c223bef2..8043d4cac88374d72eb47a7f6a4c062c5e56aa98 100644 GIT binary patch delta 206 zcmV;<05Si^1m6LW8Gi%-002sU^>Y9K0H#SqK~#7F#gjV@!axiK?G>T~3eLfG5P}nM zh@|6lPFgAuN|B(U!NrPKSlf_kXQDXkwSPSn3Z^g=1;?|2Gs8G>#Z;vA4j9;A6d4G8 zVyARW>u>g2$FzRHnBx^cLFgk}{q{O2UmcDZYnC-E@CZV`07nxecV0Xz9t_-AVR&N@ zNuU3u7`o37ZFnTv-!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YPV z+ueoXKL{?^yL>WGgtNdSvKUBvfU(=jY&)Rw;+`&!As)xKPWAOWV!+dC-`->*eWQSP z2cOd!&K(Ta6DCY}Rx_uWbxp*9Gs%MNUQ_%o*?WgYU#~o0_(md3EW2=0NLr=k5k zHa|XJ@G3GA`ZIrFDtqD!cm6vK=N8v7mYuYlvTK!xSJot}`udP5{+`$KxV@X}y?6OO zSX>^!c;9nC}Q!>*kacfxmSNR!GgCxj?;QX|b^2DN42FH~Aq*MjZ+{Ee}~cjb4qM*q_}F)$_URP3n2#?Axoi&WF_{Hn--o_5v0?&M?L-H a7u^6N6<{4^(?0V600005%M$O5hKw8F#$=*G*7617fv1@I9V2qlz)luHCJOgnZ~yp3 YU&WSRhVBew@Bjb+07*qoM6N<$g0hQAmjD0& diff --git a/eclipse-compile/appcompat/res/drawable-mdpi/abc_ic_commit_search_api_mtrl_alpha.png b/eclipse-compile/appcompat/res/drawable-mdpi/abc_ic_commit_search_api_mtrl_alpha.png index 42ac8ca683d987b320ff403ca476f135dc3833c3..9603e76e27eb2d95c61e92562d7ad3e3deb69217 100644 GIT binary patch delta 167 zcmV;Y09gOX0k{E>8Gi%-007x@vVQ;o0DnnDK~#7F?arYM!Z8>`@uM1zV~$ob0E)$! zfi-FfL$Cni4@~i>svvDHkdPq0d;XWxKQ9*J#QQW(j5`Al_Uw8e15a*LHfWjwE@T!e z>o0+p$o7Q+l6_$S`4=8Y6z+o;1~|6VEAtn^X%gO`300Q_0@B#_a V+4kez=X3x7002ovPDHLkV1nhGMD73p delta 183 zcmdnNc!F_)WIY=L14D6D)fXVu@9E+gQgJIeL4tL0f=EwOpaav7|Ns9V`p?3!R(6AY z)_HD)Z;VOoB|iM@dsrU1JM7`^IQl}CRe@cGC8=1Uj;)l1e=ktoDYNC(9t$iRI^QWa zzF|-?{ME|B$KK#{h^b@#WgC@-w(rdbe3sper)5j{IhhRj7%d-Z39$1{VRledAte49OqIQThgQu&X%Q~loCII00K-K^N diff --git a/eclipse-compile/appcompat/res/drawable-mdpi/abc_ic_go_search_api_mtrl_alpha.png b/eclipse-compile/appcompat/res/drawable-mdpi/abc_ic_go_search_api_mtrl_alpha.png index b5f61765867d0a948d829144ab62cb38f042c160..44c14232168e137cfaa6774f24a371cd13a253e0 100644 GIT binary patch delta 88 zcmd1HnIIX=!oa|=^_Tf8AZ6_7;uuoFm@JX=p#E=t-+!JJ0#kqgt!J)dbzlfN)ELfq rLd1zniZjZwQCYgMTA1gTe~DWM4fVp1M^ delta 90 zcmd1Fn;;p=#=yWJ|M`C+kTUgjaSW-rm7E~KYH{%Y|NpNWXEX~j?_(}xR%JWjz#OUP tXw+aceSzc!3x&7^76Q_mUB?7j7`ELFU$;T+X&BG|22WQ%mvv4FO#qnuABO+{ diff --git a/eclipse-compile/appcompat/res/drawable-mdpi/abc_ic_menu_copy_mtrl_am_alpha.png b/eclipse-compile/appcompat/res/drawable-mdpi/abc_ic_menu_copy_mtrl_am_alpha.png index 6aa238c562f08d5baf5f2ca5f85b3b12949e7c04..80c069557c2a2beb8097b66c237571807d1fd973 100644 GIT binary patch delta 105 zcmV-v0G9vQ0fqsPBw|fTL_t(|0b?Kw{15#9@;@%XfC|9`NI6Lw5E7V>sv7Y5<<)o=jeeL(UP0wQWxRW;Nse kXHk5l`~SWhCIXC%`Fu}aemH&MKG1LmPgg&ebxsLQ0FYck-T(jq diff --git a/eclipse-compile/appcompat/res/drawable-mdpi/abc_ic_menu_cut_mtrl_alpha.png b/eclipse-compile/appcompat/res/drawable-mdpi/abc_ic_menu_cut_mtrl_alpha.png index aa4f1c213acc30d04998d5587e45e963c28098d6..3966d6ad8c4722a79847ef869b30c5c4f1c031d6 100644 GIT binary patch delta 236 zcmVHC^==2hCLI8f5jav^cUUyN1HBbedLjExe=2#F|w+=5GVKqyJXKx4rr zS|C~qEaDOupdcpZ3RD(cBB5qlW)&YIISmcf7a9V_He&M=F=Z}WF~FV2GVCw(JW0Mh zrEd41=Fk7{(wo}=rt34Bx&&~vjFl2Nvm>BzTU-b1B#97c?P|0@AW1}S^7Sr-M7`*C my{9fc*;_x*#HDPGZ(Sb^er;pk1&Xf#00000Dy!50Qvv`0D$NK0Cg|`0P0`>06Lfe02gqa zx=}m;0007FOGiWi|A&vvzW@LL32;bRa{vGf6951U69E94oEQKA0NF`IK~y-)t<*tI z!!Qs=VIQJRasd?ekO;$lXwz_mZjey93Pno7_G3Y!2I43I;eT2BJ;|Q=?I8TF!e51* zTBmhXt`T4b5EN+U@j+;jCxsvQARJLC6rOOJ#|NQw zF&}f`SP@Lka!NqS%Tr=s27w0KFC*0%gb$Xn%@Q}FvY?eMe_uyT+N2x5q z?NVE7Jlfc*);|rd!$uHfXqThWVk-#pb>aKUQYP<%z8LRumfqYfKcH)t_6hudK7rNs Y2|k_Om#_3bjsO4v07*qoM6N<$f{@vX!~g&Q diff --git a/eclipse-compile/appcompat/res/drawable-mdpi/abc_ic_menu_moreoverflow_mtrl_alpha.png b/eclipse-compile/appcompat/res/drawable-mdpi/abc_ic_menu_moreoverflow_mtrl_alpha.png index 1d8ad18a0c5d891d971e991e143c3df0a9e15644..017e45edec435f227c0fadfa13a4a27353acafd0 100644 GIT binary patch delta 82 zcmV-Y0ImPZ0dSBcOgBkHK~y-)V_+Dj;D6Bn*Z*Jr_a|P%>;E9|5}Ozz`*b-fq}tl1_Oh5!JJ)zHb4oc zByV>YhX3vTXZ8bmoCO|{#S9GG!XV7ZFl&wkP|(TK#WBR6`4pIp+T2f6CX-0q2 zJyLIYtZBQ>qvY^OwAo^#RGeW4)5+;PLPxUHKcvrKExYvWVt^Fy(ud++SFSKH$QhV1 UawLT}1C3+wboFyt=akR{020hKu>b%7 diff --git a/eclipse-compile/appcompat/res/drawable-mdpi/abc_ic_menu_paste_mtrl_am_alpha.png b/eclipse-compile/appcompat/res/drawable-mdpi/abc_ic_menu_paste_mtrl_am_alpha.png index d40353c5176c4fa4e4895ac2a4e98f7e63ed78cd..ec0cff49358717ff487e332d138b2ff4a33afcc5 100644 GIT binary patch delta 128 zcmV-`0Du4R0i6MmBza^>L_t(I%VS``0RK7uPyhev|HuDR{@57-00000LqiJ#!!HIP{epp^)PRBERRRNp)eHs(@q#(K0&Rd2 zOiAAEE)4(M`_JqL@;D1TB8wRqxP?KOkzv*x37}wxr;B5V#p&c9=NlL;|M~y_|MLIw z|H1z@C!R7&xM=Xwp6AP>YXU$1Kdnz$@cq6(>wn)@`|Ve;g*^S=c*^&JOWdL?21bcq zz6np+9hmhjRwafopEcR@%b#P9!_^1<6Q5t0`umX{%Lk`PrVI>5$DW*UIJ$2F&{76Z LS3j3^P6*FHkl36Uaa>{`(Hv+z$W&7yFU8 S@PI=A0000J delta 196 zcmeBWe84zCrCuS~BgmJ5p-PQ`p`nF=;THpte!;*{YQVtoDuIE)Y6b&?c)^@qfi^%1 zrX+877l!}s{b%+Ad7K3vk;M!Q+`=Ht$S`Y;1W+)-)5S5w;&k$l^A1ue3ud<+_^*G^ zgd<^b{NL~HS3d}~JF)zobg#~#jLFJjntD9*E?c*lnop()5xw4Xa(KUdWzK!vSeE%x t^x%`fOrg#8jXYl-?bqM?*TIB^K|FNl`(O1o+kloZc)I$ztaD0e0st`2M(6+l diff --git a/eclipse-compile/appcompat/res/drawable-mdpi/abc_ic_menu_share_mtrl_alpha.png b/eclipse-compile/appcompat/res/drawable-mdpi/abc_ic_menu_share_mtrl_alpha.png index e0d5ac4e5e66cbd67464d600d64fb874700244b9..d05f969e9986b95cb0ca43bbb2e4b99ca68cc42e 100644 GIT binary patch literal 274 zcmV+t0qy>YP)?G~49aStLstfqFW@5>EK0qki&Bax!?{bj z#Lx74)4lg5e!qx+rmC&4=U6q$(3U!iGW4b1qnJrwQr*aB#Hv@BR^+kZ3VoaQbal0i z#V}@^;m4`z7)H&BzMg&CK5%J1@;H!rvZ50CJV*_UM=>{20~1lqhRn0&C}!QYTRWCK z;=){%rDoTsZ-=I$EVIt>X3ds69Zi)eV$r=!BZ?XIB9%lLI#NlLp($05GE_7q67~2q YziLMSX_)h{i~s-t07*qoM6N<$f?xx9CjbBd literal 463 zcmV;=0WkiFP)A}=bSr%fIs|UU|5z_f+n<}23cMfug3vi@QDY^ zdsRFeNBBx%+=~G1X^M+|McE{7@@K(Tk|gID%o^=~3H5m)oF0pg}FlMq&ZxzRdIhlpyEeb@@$ zV@tbVnsONp$TStA6eHS@Q>c|^6_uF7tG;xyTCx9l^Q*CeM?J0*GA1j6I!s~#L(b6|#4VbiT-MfAtL`<)U9M5Bi=3O#+d^N;?LjVaEHXWebA;2LDO$W%;W11>J z!uS?wh)&$t3d@VRjvTL!XHY*<1~Gv)d0qWKEB;6~z5(BKN^!6SZI1u|002ovPDHLk FV1ko_&9?vm diff --git a/eclipse-compile/appcompat/res/drawable-mdpi/abc_ic_search_api_mtrl_alpha.png b/eclipse-compile/appcompat/res/drawable-mdpi/abc_ic_search_api_mtrl_alpha.png index 0fb57b2ea21ff305afae89aaab1d9646b304490a..451818ce541cc517aacf2ea37e2627f35f8b9554 100644 GIT binary patch delta 392 zcmV;30eAkI2A2bn8Gi%-002sU^>Y9K0bWT&K~#7FrP48L6hRaR@VB$;5wMJ{V5-w= zECjWR+y}4`?G&xk#9r+45hQ}fP6V~FihcowAZm3NY|<%Oq!7Wt{e&G{Mu)(GH{8Pi z?fWsjnT`MYX>>YC+do6ps|-n_%x#%#kc1W2J+$kk`_2ieCVyr71)s3Ue@C{ont#dA z?xI6{uwm+|Z9lLhYLH7Kdw8tta}uujjypoD1i9b_-dhn)Xmv)yZR`o5slfwm_U$pW zoOFP(kV=r_E~dryx%vj{LR;_f0@un{8sQx-)u0pZVOtn!{HdL_@XcyHLlP!_IWiT} za9vOFNPS9jX@3h}-7*rw8PD*==?WA>?tlZYz4f!_pS?1!XNcjlZu)3pfkRK6@*Fd3 zB?*6%&e*!kR)w%;hW(Pnu^)7+?a4moJxL`fXK4qR$sBW&Ov16NATw;{6qX_9-4zbp8Cv&EEh3002ovPDHLkU;%>s6274T literal 794 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YPV z+ueoXKL{?^yL>WGgtNdSvKUBvfU(=jY&)RwuRL8GLp+Xeoo1LF;wW(Ze|5E&gMiCH zFB3B_DQ?#_Q$nILGSfY>X8$n!BzVLrS$)ymx$_S^5=mCvnK9W<(e;3{$&Wg*f8p&< z_f|h&$b5Q_xv};Bn|F8Cs{c**+{)Oo@6GdL?@yjT`+mWcH0G8glT0SGv61 zS1DD=SJCy@rTKE#lFO6SCdGMIslBX?7M#m8#c;zujy;d3n@qK1Fl*pZ>ECrC%)zrx z@<#cl?FV8LBzLgdFsOaYwW_mPz-7hLGv|Sz0nfjn1EvY*4YRjB-6xvDe(&26^8-z} z?Qi6FF)*&~lWu+MdpRtC;k#|2txA7-NLUrijnX$eHyzFW*}ZYi`!!#ul?In`%rl;7 zvh8ik-A}md*Ee_xThE&Oi07*|Eo6MI8aru=`b+1S-0PN8_#&D1 z?Y=(U`8QvZHIx6I|NN_s-`G5n*z)k?{KlylESb(R_`m(nGG`TI?S!C@YV|4N6`XsR z_ObnNf8hFJQJ%-uw$$D47^3$noig3XZ^P!ta6b1oo7nSKp4f+>54Z|!j_6uh9yoX3 z$tz)1&e3_yDaR)iHt_sf*Z0e(h}*#F7~>`r;S{%uyqoL3zL@Q8r6Ar={qbDa{s%i1 z93NfR^;}ew_MEN6VbT)$qZhunKbU{QUopMmI(MMDDKPp~OI#yLQW8s2t&)pUffR$0 zfuV`6fw``cafqRXm7%GXsUeVSWnge+!R#m$4Y~O#nQ4`{H7xzB{0yi;5@bVgep*R+ nVo@rCV@iHfs)A>3VtQ&&YGO)d;mK4`8fEZw^>bP0l+XkKMM67s diff --git a/eclipse-compile/appcompat/res/drawable-mdpi/abc_ic_voice_search_api_mtrl_alpha.png b/eclipse-compile/appcompat/res/drawable-mdpi/abc_ic_voice_search_api_mtrl_alpha.png index fca776fb9a4cec0133f5fb1fa5d121d2a044f74d..a216da173dc78f899d875fbbde8575573d519571 100644 GIT binary patch delta 207 zcmV;=05Jc;0_y>gB!99=L_t(|0qxMSNkdTph2bMw_z+hROR){Qfo@^t5Q3eB6PS>Y zNo*WIM4UmaEX4O-ilqCjE`)f|fQ^FxslVprPoyz5)0=2yb@6#qrSW=Trqrzmmiq^* zVBuCouhfdTGp~auuQtU*X(YD1d8~s=oQcL*r!}%I&T&x(yGUNV8_3d*^`7n2K^*DK zUD*?{@7h9Z@YPF)9zd%D_YS_hb;GG4xN%aywKj0Dy!50Qvv`0D$NK0Cg|`0P0`>06Lfe02gqa zx=}m;0007FOGiWi|A&vvzW@LL32;bRa{vGf6951U69E94oEQKA0J=#;K~y-)WBAWN z8e|v{4V?dH{r~*`)BhPj7Eu~z{fB|+#A)~p*YJ@z4ai_r1An@PAOClN=}&OwAHe** z|G#6`aQ^?x|I9#o23*5bAdlt$+y7^=Yp4P$i3KN(>A)!a094KaqoRE<4<2-}XzyIw<5)uqHH&}nif6PD300f?{elF{r5}E*+ C;1MbS delta 106 zcmeb4V4R?m!j$Cg?!v&Zs#n>Ffq{Xuz$3Dlfq`2Xgc%uT&5-~KvX^-Jy0YKnRZ9F{FYq*@5~0K?zxj{8}qv={7C3H4p43Es*D!yr!YZykYIZMoEUx W!Kt#Jcl&&200K`}KbLh*2~7YUZWvww delta 142 zcmYdX%{W1&o~78yGlT;OYB*9l7#J8h3p^r=85p=bL736}% X7F$ghvR&D8AEemR)z4*}Q$iB}h!qrc delta 140 zcma!?$2dWJKOkfn=G;xQBfJx&-C1HsL j_x|+r&bKUXV`Q+uDmK~JS*s3c7K5iNo1e=%r-UW|V0% X7w_mSlwN816r|YG)z4*}Q$iB}mpT;I delta 140 zcma!?$2dWEakt!I*r2;r~Tese%Jm3xb4}xG!~I`k!BLdcRk{ e*Z!h%+l4_qV>5-@r@6U)Fo^`;7xcKX$mBiHXa-MLKbLh*2~7aA`ZXN@ diff --git a/eclipse-compile/appcompat/res/drawable-mdpi/abc_list_selector_disabled_holo_light.9.png b/eclipse-compile/appcompat/res/drawable-mdpi/abc_list_selector_disabled_holo_light.9.png index 42cb6463e4c28c6aeffa315c4fc869867dbb6b7c..10851f6c87c0db0f2fc83e71e2fa99be1b49e704 100644 GIT binary patch delta 75 zcmZ3@7&k%Em4$(Uf%lQrLm;K<>Eakt!I*r2;r~U}Cxs4{3xb4}xG!~I`k!BLdcRk{ e*Zh!720!j4j%?;VDNPHb6Mw<&;$Ua>>0uU delta 153 zcma!B%{W1_o{fQlVfpJzSwM=V*vT`50|;t3QaXTq&H|6fVg?58P7r1^KY4mBP|(-Y z#WBRA^X-+5oD2#A&KJA8cl?j=`;_YxE zNswI~Cs=`|SegVx(s2umo+PkPMRgCYgk>nf7nbO|qSU`w>fyh0MEogNq?wH-{?l)N zOf!Uws{DTKq6;Ye-b@4=07g{(%m%Fih3c0c1@tUzNJ3>qC4c$`RiA~p79&{rC#pK* z8zEgtLnPsesEt{j5hVPqD9Vh0ik6{7Q2Y~^`@VnL@AohDd>4KRrIf$;o%dlFo)3q^ ztI~Gnxgk9KCZM;2*nbZYT=h4ikhDk&e_i zL^8uQ$b@Jn!n{5FqahU?+kGr+d(Vv=d<%;vF-z#O?i`($=ud2wq*C zgR~Ue2y2UT59}3&8GMyo+UHNfKTf=4fp#KjpWlWNydiNC1j1w4R-2* zE-@Yd^Km#FUVrxc{Tns6FN|-*%+HU43|IooUWIb}2~ zDb-9JYf3IT&B_Nfuh{NK=My;t8srVJqU7SLUZdKzMSp~En)x+OIx>6_qNP99bj7Mi z>c|L%Xxx3;Qo}|?>gc=(wncJ$%sXasUi=GM22MBWz1RnhXGsk?j>uY2o3CwsoHZNq;wj!oI_{mu+7-h>1MX zHXoNpNE;+<0{{(~fmmT6f&duEBR)6LX!wpa0>KDEJNt6EJa4z#&t~@IDpCmH7O(xw ze!u@3-}cx&AUq%-Fp@I}Pc3*K{b94&076}wuX(rIeVQ{M3pd*ISrD9nAP95#mG?f5 zbqd$MLKeVCgMVNM+=v!mUc36WMwV6@VfTPox%#!rgJ3ZTzCG&KQ~nvT2!dKszqk#{ zATq6JUHxiPZOAnOre@SHZ33(y_<#cWe?ZuB&c#LujQXWn(v2VmSoT$~kjv@yKyn6G zzc@=s0r4q%WX$5K*GLfH)Vf0g0#9SRC|9YvD4vR^VSi{Ns0DBzeLI~_$9TTpRi-}b zd_I4hGa$>z?cmT&&}AlW13(-OhhrSSM}Lf7%WrpI&~u!C-peqVP9J!2>1>Dg=@bO3~oev%~F@S@a0#6&=VM)$^A>|KVU~NUXbBNjX=(P zBLi1 delta 940 zcmV;d15^B{1;Gc9BYy*kNkl3iyRWpe(F-BuG-mOt7)}m;yDuPwC zif)QUD0U^dDHQ3(RlAY?igvGmO8gD2py_wuIdF_K6SL~f;J^c2*yH;?p37V!k>;*i zz<9Wt{OdkQdl1p2h(`^ud`6?ZO^c{68-*CeeU8qlb6Z|QoPR{r3(%z#LQ+TxtwLI` zA>$Kto-`R#WKI}z9EEs^(0_e3Pz!@+g`AKVI)oy0`UIV)gN!*cr|FP1W{IZ=Q$n2o zs0HNtWo4mPs0ahXpfKbU2FX+*W0}l(Lr9Wtw`4epu#B0I#%l5M^78x5&CQ=$z%G^f z;^N{5GbLxpFn^axB;p_<%9>JZtPP{R*Vos9lb|n^of*qXQI5ivHIEEd%O zqqTrvssmk$bW73IQG~_%QO4R?W5dF92t-WNrA)V0x>`;m^s=zodDW&fAuNPI!~$I^ zbhC}+;V2@>)G4tOE0c>M5V1&?A-ZMh>MA0|?pkJD&3_83ArP@jmr=Uq=;|p#t)a)l zI8$mP1R^%*GETSlMj~3c0qJE;y%M%UAYzLy6Libd^^ORAbZQZO!ldw8*a?A%9lA`? zO^eV+=p7O2SSj$sQ^FfzHv}Sf=`uyP0$p82m@`6)2+NExMYzrguRUTr1R}QYyGNKJ z^r=x5UVjLiArP@im#T4U+z}CRxR2-&#)LUx?XO%xm7ub#4s;o#o8x^%#Np1ei+l5D z!t&YK*>4%|Drgd}$#LH|Q`$ry?C)MOZwDq}fb*xFvlqEPn~_g+1Z3a3p*Yj)iYN;h0QEWZWb3 z5*Ze(;ecQKKRF=FKG}B2x=8jaT}pIo zG2T)+zN(8Fuj$%ZPyGy}*4Vu8R#*|<3F}NfKd?@w6*A6~xk`sFI;D+e;rY%o&W@Tf zWPhlekP!xbD$HPdj$h~p=EyWd#wwZn3<(*!#m#q?Zf~(;h74Q3z!ka~bb#G=gyZOm zPZ%T9Fd6&EtY6&PhJ;w7x7hU`c2Z2G41*OIxP;|yp6~rYH>NRz9nZ^t{-^RKfH(pnA$y14*mfivO8E+P}Jf8 O0000iALGZyqerCSBHX(sVvdE%rAV5V%*euHL@b`fW-;o3mCV$p;rz3=^CErW2!vL&- z8)>HkmcYf@X@`=Kv{j>8(lv_O=604_*l+TS^&MK`!3rOGt8MQshX|GgwsADT-9k3z zb7JTK*nNhim88l!tZdBZj5>^=rKFQZIRXRFV0&C*0X%_?_0MiBwX;KD1dZoEACuJO w;0k2WFab7;{v+}Fngy8i)ywa&Rknxz1=4{B-v2>lHvj+t07*qoM6N<$f)dSyiU0rr diff --git a/eclipse-compile/appcompat/res/drawable-mdpi/abc_switch_track_mtrl_alpha.9.png b/eclipse-compile/appcompat/res/drawable-mdpi/abc_switch_track_mtrl_alpha.9.png index 4918d33fde0fa16ed614956f9a0fa98254ae7fb8..fcd81de0c29ee647f00e7c525c243a40552b9a14 100644 GIT binary patch delta 221 zcmV<303!e20`38j8Gi%-008wY=B5Au0JTX(K~#7FmC~_I#6S>6;jw`pNI;^3YlUkC ziDC$eD1m^0lp2U2LKHyav-bln8X=wbIPaUtqo>iV=Z^+zwP?4Gm`;R^2OkzJK0VqR z4MrjS$+dA~LXi|axe&&bbLuT-vy@By;?0$+hn%`GDHi)ocvcp|5OVGvc3SMP^<(84 zXI`-!l<$Spl+S&kXffkO7`o)HHM$RRs(*qs*C1W*1*tcpR#toi X+>PQ#zU#!m00000NkvXXu0mjfFc4;h delta 335 zcmV-V0kHn=0p9|U8Gi-<003VlE-e5600eVFNmK|32nc)#WQYI&010qNS#tmY3yA;# z3yA?Y$;+((0099>L_t(IjkT0LZo)tiM!&_%2~r{=rAo;exB*-RiNkOL+H@&W_#Ek= zKv9ZZ0AoK2W|WDon00_pTFw5>$j+0wnXI=SKi3O-~ockP60RhUWhX9lU?om7f3i vb>K;95S;M&e?528Yn~@N9B#~DNHk*D&?v+BdZ7RxP!ofvtDnm{r-UW|idh^z literal 0 HcmV?d00001 diff --git a/eclipse-compile/appcompat/res/drawable-mdpi/abc_textfield_activated_mtrl_alpha.9.png b/eclipse-compile/appcompat/res/drawable-mdpi/abc_textfield_activated_mtrl_alpha.9.png index f3d06fe0e3861dc6ca5f0abcdea6d8809463a51e..3ffa25193cbd56b3b6e44097efe5e9d881be0c16 100644 GIT binary patch delta 64 zcmazDnILJ+!oa{_e0BO4ASLbT;uuoFn9R`h|AwLqm-r9+BPu7^Dx5lmJQ>1eZ4Wmw SJ_A-#=yWZ^G;G#&r3{{~elF{r5}E))h#7zY diff --git a/eclipse-compile/appcompat/res/drawable-mdpi/abc_textfield_default_mtrl_alpha.9.png b/eclipse-compile/appcompat/res/drawable-mdpi/abc_textfield_default_mtrl_alpha.9.png index f0e7db873e2d3942113073ba058b6a6639abe3ad..0eb61f152133d86f80f31408a6611ee5a8f0f450 100644 GIT binary patch delta 70 zcma!#njq=O!oa{_e0BO4Af@Q(;uuoFn9R`h|AwLqm-r9+BPyCq-wPZJ0**0CerVHW Y(9t)1-dQ`@1*n+8)78&qol`;+00oK`ZvX%Q delta 75 zcma!wpCIYR#=yWZ^GaSW-rm7LJf@Lwfqhg#6V|BV+dxH4GZP3(B+Fw><+ eXrao|P=*Z?HQztjb!ie%2ZN`ppUXO@geCwdw;g~0 diff --git a/eclipse-compile/appcompat/res/drawable-mdpi/abc_textfield_search_activated_mtrl_alpha.9.png b/eclipse-compile/appcompat/res/drawable-mdpi/abc_textfield_search_activated_mtrl_alpha.9.png index d7faacf3eb62942d70832896d8bc790e131ebdce..0c766f30dba513e013795c56d1a28134cef9f92b 100644 GIT binary patch delta 54 zcmbQr7&1Y{K-$yAF{FYqnW5?b4Mi6&@gM!+LM z?}IZgqCg=vPZ!4!j_b9j5Are?@H9KD*!2I@Ii}Kg-2xo--&iVTTBd}vuX)aNbSf(c T7u&L#KphO8u6{1-oD!M<0dgdG diff --git a/eclipse-compile/appcompat/res/drawable-mdpi/abc_textfield_search_default_mtrl_alpha.9.png b/eclipse-compile/appcompat/res/drawable-mdpi/abc_textfield_search_default_mtrl_alpha.9.png index 0a36039914963d8ae0802181a6753968cd20f50b..4f66d7adce19a0ae2471aebead88d74abacb0ac9 100644 GIT binary patch delta 55 zcmbQj7&<}4P{z~6F{FYqnW5?b4Mi6&@gM!+LM^Wg9TtelSu;kT)j!?6jcXAD5O})! KxvX@1nwA7)9BE+RU|{fX{qaOCWo0{S#>1ajJGMAa R3j%6j@O1TaS?83{1OOpbCLsU- diff --git a/eclipse-compile/appcompat/res/drawable-tvdpi/abc_btn_switch_to_on_mtrl_00001.9.png b/eclipse-compile/appcompat/res/drawable-tvdpi/abc_btn_switch_to_on_mtrl_00001.9.png new file mode 100644 index 0000000000000000000000000000000000000000..530ca456daaf32e76e90a260787751b3402a9230 GIT binary patch literal 801 zcmV++1K#|JP)d*gTtx+4xeF1s`HJU?g0*&WxEB9m63$g2jV!pQho zH5mehBB@9rcnVdC^`coXiXq30SA)SI4j%?EnHA^K_S}agv zAQ0H2Z`0)oMeA4>ImlyyS}zm|udx7fhMMMbxi`pTf}+QSTV1I+YFepO-myRlBvZ9o zJwr#{qMUQ&A@?SzP5K7jWk6BRXXLR!nTy4uXBkkXQptn7o1jq4GyzYSF{kqR{3-HS zCb}sWi=8av*B6h+Pmss->vOqWPwAQ0;|WFnedMq%2_k8aZef5Y6#S9Hx_F}8IXpak zDM?b52N1pVUE6FnD{}NakWHiqnM~%A2UIqjy@Wq<^gs#fXw~cWpGE?~55Dl%`|5(S zPTIHI?MKaK^Oq4ojYi|Q)9E~dFZ}0yM>mrmIvkEyw4F*V0)+nXfggMq-8kGPJ+@dZ zwsboEl_vkS&PiQMrBYYu4!Px|K!P9 ftu0CNY_0tVACYM+;iSpf00000NkvXXu0mjf;O&B1 literal 0 HcmV?d00001 diff --git a/eclipse-compile/appcompat/res/drawable-tvdpi/abc_btn_switch_to_on_mtrl_00012.9.png b/eclipse-compile/appcompat/res/drawable-tvdpi/abc_btn_switch_to_on_mtrl_00012.9.png new file mode 100644 index 0000000000000000000000000000000000000000..b527495ee61de70cc17720b69bb8c2949d4e06b1 GIT binary patch literal 939 zcmV;c162HpP)KZMvO|`X+5-_#2jiF$$y|h~IUOh-bv;o^&FQ!>f4?6`)Nvl|3~8&wso&!UUyd?_bai!A6TqkQ^Yhf@<>eJALvn<;euZ}Q zLw|B(BRFh><=7RLGN^z?K#8jaRU!6Z;FQW-AU(b3Tl7#2$KgD?D%qY7p4YH{!G?nYr$ zXu%i$oMWg!f!^-y?5x2}ssjqX@J9~kNuk6nRqX8S42V^xK^gcXN6eNC3e=^&y}dR3 z9C9=Xv-Jx($V09S$|TvbSgeg7jE+WKEiEmzWvxUhlzV-By+`Av6UuCCZ1f;c24!$# z<>uxluR6U#4)QqH_#2c(^2Foup<+N$&KKlyt`w?@rgfkgP?Yl-c`_&z6P@S=d|!-v zYI%A21M*aEbkD@ZM2GIxcX4r%nVg*LK;FNgT%=p!aQMl|$;oe>Q1C|%@;FxtEEEzbnM^Lg7yg`MsBZEs{uPfxp-}7g_V#KafM{p1N`7td zWq<2`x5GAH^QTQsO>gp@F&ZBW27~S7_l$jQ>2_GMC9dRY4%XM#zn+_$`wNuDAy-cL>0KD$K59iT7KR-W?{usyO zee7rE`!Z_rFRSGh^PKd;@AtP44-dbanwlD#o}M1VY|PBejG>P6Xh%Qp-^kqj4x&C&PPR&lBI{+YWPOAU_ N002ovPDHLkV1ib%)sX-I literal 0 HcmV?d00001 diff --git a/eclipse-compile/appcompat/res/drawable-xhdpi/abc_ab_share_pack_mtrl_alpha.9.png b/eclipse-compile/appcompat/res/drawable-xhdpi/abc_ab_share_pack_mtrl_alpha.9.png new file mode 100644 index 0000000000000000000000000000000000000000..6284eaaa17d3a168ee64a94ef5e7aefec7a4d98b GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^N+8U^0wgE+9rgrLHl8kyAr*|t2blgHj#N2u%RnN4 zA@{&BCdnxb%@5O0tWaFsc7jjW`Csr+)x~W+&*la?yYViJy8Ot#bpj(p>xXEuo}xgjd;@&6?5F-b*}y=aEt^-nd7dlhHMP1#{+dFRnx0|7Cu<`OGfC&3OS95ug|AlP2>LGbavUSx%J<*MR@M5$|@{0k}69n zDcZPV)%J%o4t!@mex6<3U}13ClEW!KbsG&$8Vy;46p+w^`5as7r)`h-2@BtQa)!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YPV z+ueoXKL{?^yL>WGgtNdSvKUA+f-s|n(iaCHJ=fF4F{I+w+gWG54m*gn?sr-0q{Vtr zyx^r%%z}6Swi)nX}EFH&0kNWoP=iKLXF<1e`b& zTLh9Oi73BL*XRwr6Yur?P0pX(v~>&SHgZ{!T8R4)}+VN?}%BO`uXGJb#tbz+xFxgv(DUxtqU2mug87c!Yg-X!hiDv zG8HW6GN%8PuH1fL&*eI%b937qpC3$I&>%FUlw}W-_yOaBDHl4JelYnpvOhTT*G{?M zXS>ve<&1F+{M#%h{?BxHT;kp-c)Fpfj4h~6q>}kmL}8L7!`mK{CHCBlzUKcFHRnoc z*vgPi5|MO|OMGuR*PpEwTOF zQkIffl4_L8Gi%-0001Bxm5rF0e4A6K~#7F?btu6GBFfD@sk;?6!A~vD#Yz+ z&Mjf@G#pp}Rce086~Q5i>kzIi(+CFGBY!+_AM68R515qvkS68( z2fsnX5HRlpM%+{YH%46pENxDJ_32!IAA}=259u1<^CxD&7QuB5@c9YQ2i6F-3qY8! zsk;M&`5txWuOP_(Lue6AK#P4jzd>kmngIW_Z|0Q%&lPqYeeCtT9zfUvGfvN7kUujG z^LhY_umbwP#D5dwd2PTNsHy)5|K;m2ul))(Kur&ra(>3+c};)~3GuuhKyb94;B$<* zaA6$Hs{um7oOwL21_%fh216CiYXSm7Jg*7}2$8%xARq+!jsSwgBCJ>;SX`dJ<<38I zo(mi<|H0(@0r?N7`H$!MFDUX~(d56R%70Cl|Dv)?nHn->%H*A2;=*risIB>H00000 LNkvXXu0mjf?6tgr literal 910 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Ea{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YPV z+ueoXKL{?^yL>WGgtNdSvKUA+f-s|n(iaB?2BsKK7srr_TW@Eb_Pb*s(zajHA%rP3 z#>~d`=q~Ck{7U&ypZ4;Pnl$>C0{#NW(?^mNI+H2Nwtx~TK%H@B% zsv?WZjc#FkX3^%SWfl;CxL*tnlYFh8E`sN(PJVqui51dY2pJ z^EIR$GU8ZyW;W9T_rDIDiYs<9KbStHndRA8#tf#1E?!)p)foTqABtEff3hX#VW+xl=^pU|mRFtFiq;9wbzZCEF5R@_XM<~fZ*133 zo)w3+lbg=0+;^Szj6`_kToF@#hw!wu9^orCGi$88^n?FuzMjeKuO~y}RNFd_i0lnk zVY{W7y}>c*@%9rrf7Dj4yY(Ws$PyUi&0lr_qaU0Kwz5^RFVg$pyktUDp&Ko0VZc^)ZjwDOCZ|sZs$@j(BeYJYmsdH?i5yIM~##$A&*0`+yjfrCvX_wRU z*f(M0N?T<&8cR!!O>qAabO~Bv{pixd*!K9CypFBaq6j8=0aF$ZG?#f zDmbXHywSN{qICqHjuew9$J_u{AR(R_c(zfykRemLWci{$7z4uv?(yG#|NE=O=CgvQBM z5u9j*Fm^NSX5hAk5S9*+^g+U*r4SZw@7=(k6T$uu;V!S?^FG&b{}0jrpW?sTv4a8t z004%7{acH1A4+WSG2(OV4~f5I{*?M#?#0BbnU_a@a2CEqi4B`cIb_Lo1CD@X@-CY>|gW!U_%O?Xx zI14-?i-9yF2s2tJeQ{u5V6OIbajXxixb=3{SuYt!kyiWkKi#_oM3{}b1!6fmtq<;) z(4a3=-jx5q_y^N3rpl%@o6a6e6=OT&RHE#0q*XxeoI&4Y*Za;>TNhtG_Db?{X@bVv zSNopdseZj*S_lffx)w4%ek-E8Bx=Fo(Ejza7mMy*zTwCbwN(=C);r=@k2TaM{{GLF zQMPkE^PPQL7(&)e`4E0UY6G7RbAIFX152)6Z;U^{S-?@l%-8T*?;D$#^NuylI*hvy zXhy1i{^R%d=2E?F?0m1DGngjGXH@WQJ!y1n!+z)X+hOIhSIp0Zoy`%qa(hx3clL{L zLFen;z6(Sxs?&tR{Zz5y&o7CSnNYHic>z|bB#kcJQo4I8PV-4H3#{L6L z2HE>rcW=x69#e7t?hIYlr29K+-tBXYoWZp3fzkCtrjL~qxMy(At2}Y9$F{iTwcMuL zhU-?!y%Bx%C*#4MO>yjH4TbOjaoxNUe$+HMc74>``+JU`b(_0;t)rs^?-mg*)BSs^ z=h(A_)$jTJi7!Sf;ONFAv%?B+SfjX_-G2M}Pnq+d?@aXH0>9($xm(1%Kc`tgxy@tZ z+AdSYJm>MI`;2vumaTqxXWDM(ZCS@27SEe479Sn5VrS-&=@aY^WU)LytguFE`uV-` z8Qt&xSl>}{_bpUk^f^(WjOkrlW|thx*UhoYc~O-dJ`u6?XVNro3mD)Zm;bumW7u+X+phve5*>1VZKm<+RZ!MH}6=t z-Tw1MnZfk(g3FJ%?@alzhVjCRTWYtbH@~iaxFsTmVH&gU@nwOVuWe?nXSnk~$ges( zOsq0Ze;t3LSZ4Po`5*ez5BV$Vy-nlr+9%sqqEOVnV2XRv1U}csN%Gy?OY01kCI&nT zPqr)6jPK)GT4$>_<69)8sy0rtZ1q}yyT$% zt_^hw33k)`JRm?r_aD>4`t|!By}i@g1I(AwC9V-A&PAz-CHX}Rjw$&`sS1v1C8cpt3=TtYiMN%)L{zIp&It%2v7%ur>mdKI;Vst0G}xVDF6Tf diff --git a/eclipse-compile/appcompat/res/drawable-xhdpi/abc_btn_radio_to_on_mtrl_015.png b/eclipse-compile/appcompat/res/drawable-xhdpi/abc_btn_radio_to_on_mtrl_015.png index 99244967ed94e02310fdeb047b5b8689860e6c9e..342323b4b505f28eed4191286a3070f3a99de049 100644 GIT binary patch delta 772 zcmV+f1N;1q3y}tp8Gi%-0001Bxm5rF0@z7JK~#7F?3BSuTVD{yf8J<9gBD$tLLn{- zT?y{oi&(fFiL6?2>q(3%;?&5*6l5 zDt1~k&4t?%x_^F&n4-Lg%pRus?%8#{$VYr(R+cPo)+|Q^dX5d|H7(0f;fo5N5V++l zrA*(OWadK25Vr&pU7;wJAy_%eIG1ye<1CJv$|SiESb9U7{|AnizAvf0;9ta5c?80=5X62wCYl zb_++zV}Df)XOzX7Bmb(C23pL?*|dBjDBE8|RSAYLq&((miKUvO2D<$wfwt{kAWCQA zsR$ntSx)i!C$C+xY>G9<6YT5#*5ztjQz86D)cL8$x>)veJb}txS4K-fq`mh?7uaLq zu_Ttdo+Za8*mS~sDrs{SX^8F#k+nfFZP*I;u6=J(&Ub+suHErQpP=iwQqMmjvR)Zd zKIVPn`fKU_{|o$V#|{brfMFN}`ge_t`+$Y5ZGwLS{|WsV`bFedu|G!s9Q#1xBbg7S zK9>7p;;Wf2r@o$hLE#mRmsDQUc~R+AEtJ)snVA6oL;P=ytbnor0000(j7?>xVaVBtoRM-Tom@(C=IQ)#&ig*^^L^g;{eGVJzc**wHT7&Ta~l8v_e1C- z3fU5j!C?U4VV3$=;#NfuiuS@f0JYuvQ;Noj z0MNGpU{7RGqou`S3A>jZ3UW=V4;M=?>0bn%T=C}^`lHqcMU73c7-P8g<7-0Qgl z+*O^kI+u&*_g1=o6%3j_W9>6lO}`4-qqYx%`UW~n&*^3HjcV6HkNYn@M$C}&aZ+F7 z2Kwlh3^r6X$w-w{R*87^#XK>6 zj|CF~y1ZnGuNbQ&2h#jw!=Fkxq$!>*2l@6x;My`c&7C2RTw@HrK3 z5yqZ_t>aC?2FVgDtdC`Y_)~)1dTL}&X{ePs&;o7@DJO*|b#lATtc7uQ zMsu~ut5D}MvK;9g#lakA6|)`)Py$y%$4l3+rchEqL%gktTjn{Gxuluqp`!ufUx(J? z{DcsJrl8kiVq@Ik=@CfTkYkjJFlN$zyz9kk8-Z8)ZTD)<82u-!1A7x2vl2smi?c$9 z$UI6M(^{l<6_c0mz#a**`KTTsXtPN;!gQ$aI`p3Cue)(V z$6cN@|I|00%Nj69RtFD}LbIN~6aY9eNqLP*@7Dxn%a^|(%HR*4ILYK=Z7kD=~Zz4dm5%*^GuuGvn ztSwAhFBh(@x5f&*`$+JJi~Y;}Lbk*f^Qdm?JnU7-w7Z9nG@~JG=@&09t-T=$J%>7r>5TskI5EC!h5Y+wzF>#iM>BeAOau{9EISiZ1)` zN4!~h#FTW%`+~EIm8spZlDjXnkoUV}I;rY#29W_aHjBD~Z!Ch|hBlwwTlGUeGP1L4 z4v?hW`=XQZNmqt6w~B2eFQ@W?D^h1|gddvPUl{a24M>=rD&$=KvB_UK+~=G~!6M;S z0}`h)YNV?zZ{eR_K;1`|VCk#_hXCwseHJ5cEL;2NY)xQvV8JPjKNG9hy}D494Ybpb z?}?-E*K{hI#kEWVe4~7z8ut>AO&h^dbvM!$DhkOu39KeFbgjK5vxm%;}$!$)i;J|`Bg^^oHSDZ_o?2W?wl(=LT= zz{l@^Ms5+p==>-wzol{*CZO!@Gu5 zT?2ROtm5%N7|!Pyj!_gMgBAr~$h07e5hjVsphOutQ>hdZBl>*_Hdo=>zv&|r85A^W z(@X*27M4~p3u_o0?qdl@BdpK}1k3`3wy@|+EK&T#{{Z1MatJm4e}E<0QUM^p13E2Z Qz6tk3?##dk`NQXAVMUQL{Rw4 zKr#i4fKho7GYlXhWC%fERo)y@6t*eIRyMZMtzQ$uFL$@L(B692Ho4F9UvHQ7+hl#7 z=k8{+_+_zJEEbE!Vj+>Y=!?zBVZ+E#Oe>XS#%e$sH9!mVVl%+bMgYJ~mskwwixW{6 zive>`T;#FX3#dWSLQ$**%tPxe39%HA!cp3q9!mkksiUo8HN1u!Q4<>hNgP9*Af1o!BF4r-z?0lStj9(+*Acski~fMQDDtt9z_*CY z^p5_3D~Ku*@4Yew(ZZx?4;X=B)&1AvaU#m2J>VNe1G&hnAE4+F%>g~QfH*^@YG!sJ z)=v7YrrBzJtKUM zmLaOKM`J)b6^H|*`W(;0g_uc#@d2sy;u*$JNFmdCn>BpNK`N=j%Y!vC((f8+ClAv= zC8ycNW|p#m@%Mgr9)rjvKD2=G?Bh69+{R0&ysQoI%lc4D=sZ;8;0PP&9DG1E`u#!{ zwg6)SH_)qvNx=t9qY-_6BO6=55zja-qtCB&3O*o?cWEGa9$Z|*K^cKReHop2kKT0cj^PZTYtXCxRQfQC@yw=#CCFIBo4m>lN@=T- z?s~pPXW>L^8A;d-9z$`W=4LO+dgp;0&ZBmRO(Yun_Vc-f)>2a2Gm)inh`XrmFzh;~ zok`T7c8j9+&%|jgN39hH;|zHFseH^W)GjfSxbQ3`im6AfjyFgSj$!5p)FHn2d%S?XR8h;H9OWIqiG?U$HalPl!prMEf8Imci5InV%p~1s zK~jzQ!R&x-h?@-29LZn>CWMDHGXqknK%AzF>K4a~I0($e63sJ=6Y(JC zni(*dTEu4AR`Muc(STMtTCG$tT6N#%FT@@*1E!#udVgUzl`CjnXBCO`=O?t>ET^mb z!6=!{%?l_){6{i2y7~F+9kREjBMWh%=HV=_kbsTVh-OBc6%a=q;%hqa5?9fxXQj_0 zAgA!4*1~QIn1*7eSphjH*6|}vXdPylpIbs1ETpYQen+v#tbnxy_759L4xG-tgt z_<#v$c{#@%9eb)ww&OzU3|)*5cpt45bVu*ir2;OZ_Afcc2kb|2kfGSxIhJu9;UUlX zfJ*>?lOj5V<>tmf*2r8!q45EgG;@ZMu>ZTn9{#44eB%SM$u;C(O5*8HKIz5>m^7>a nE5Hh{0;~WlzzVPeOc?(I$fl?PYyFTz00000NkvXXu0mjfD?_0@ literal 0 HcmV?d00001 diff --git a/eclipse-compile/appcompat/res/drawable-xhdpi/abc_btn_rating_star_on_mtrl_alpha.png b/eclipse-compile/appcompat/res/drawable-xhdpi/abc_btn_rating_star_on_mtrl_alpha.png new file mode 100644 index 0000000000000000000000000000000000000000..2f29c39cdff493d2dd0e219a299662675330519a GIT binary patch literal 932 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 Mn7IwK#LWHS-)PQsD*ylh literal 17992 zcmeI3dpJ~U+rZa|w&X3+0jZ{`Eq0AL7|aYNNluw^ED9MjYZ#2t%s7Nf*%e!5i{wx# zdykT$a;RZTdzX})LdhxZts_Mx3DLI(p;fJKfA9Cc*L%I!HFI5axS#v*tmk(>_r0F^ zV@2Dpv-pRCx&idU0CFe_;aMj=!v02dT8&>>tue*rbb7&8)=3jLN0<1pwE6QQp$ zW|d?@v@_iny_&}d(Rw<1SSFrGKpRkW2zn$6fv^Hi#1nLJ1U!yN!4e2mk^z;Vj~;tr zXbR9TBR-2wwKp>#n+}qUG2TL902PM|4i44{*45$hy>J8yg@VHqaYP~(vcL+q`3o5# zSbxEi(IB7Vn1KQ&pA#VD@chw|xC~ETpwJkDkxVrH8e11PV0WT> z<$iT)fpAR_gkTKmS3L!e+X6tGJt*J>@|ob8AZRH|zP5THhdq&;&mu`Q-@JA(g!2tI ziDuMoWGjqj$Ou|1bu}Mk2zh)*9?y?9y31@oAw;iUjn<+wm>hozQf(s~+E82pu^#?s7$t}o`D{;R3^w|V@V9Q9@Y~igIE&501tXn zh|mXf1R|Y2+5L;qW;|w~q*TU2v!KunPhEWjvL^$p&-5f?NqQ7K)>Dr`#Io^3eUMDi zCxQBuPoXEde-U~;p98fyhTkL`$<_Z~r}#>kFQ&5O2%ycmZPKQNw(dwHa{#w~KKe=F z#~Eoz0SvwXl$4t>=2N|mcd+pWCGi<4TPlMoX=OB~q#8h$5$?0miOU-I9CPD*nZUnC zc{Khc_ixV;><#)O71U^`5vy+p5%Ac;UK0+x)Y7+@*7cnTX2G8qOS`BRSni5x%;2~UOk8bS9{ zL;4TpU}FC=y&3*qAd80kw5(49|4nK8d%f?UE}bv$BmeDb8?C|5Tj8e;{$=Ylk{lkW zP}_xC0Ar-x5sYwOj7@BqQF~`e`}7MOu{R*%p%-+@gkEE=lhtrn7i8DTYPjo!r;|TN zNF$ET1{&1(F+pp8l8*T=7*$ zmv1>vQj9r{rfSl$d8BWSjzWiW=>Gt2{13qwEp`01^RN6dv7&!vR9GzOBrqVzq7)Z0 zADC8(3kC#Pl;T3>1Jg=z!GIu(Qe4P$iVFq=S(M^J z<^$78alwEfi&9+3d|+BBE*KDGQHl$h4@@h?1p|UCN^v3cfoY||Bt4s9tl2LJ_qE3;LOAx$kQcHXla)XP4$9Zjy(bP3LNY0Yn~apjRR zUZ4E6VCKskMhS^Q%9!1%n+WGD?=;uaEVpx%MYfo{_ce*`-dCqzakhD!?pU}+dHen8 zwHcd~GBqzW)IZi_#9wZF!S<@E=<~cbz9WH;`14NuT^TVT_ZQR?5*iB(!MeJt%W${)|-#)K1B9m_h zZxO7D$c~{YooMT}(2PeZFIGQL8`fRCOrz`$ZQ$9G=d@#}2=}m;`Q`LfeJ9z-RVbjn zy}c@0Wm$z8hT!yJXIl81=*2(UZV7+AC*E3=l&mZ-izg5WJQIw}l(Q?N48z|wdZ97Y zfQJ#PYHBBQy{gL>?Rbw`zTvFAf6L|9rQq$v(jS#7O`}Sb?PN_vgFTrG41*L65B6*+ z+nUYFZG4pJaB8>*T1{-pKu6a7JWjmwjD5*bN7t_$N?7^+VWb>({-&rHpOmSh*+5Nh zHEr$d5Z9UeuDu)VF3H(3)Z36)SXj7VVXT*~@?H8CFa3?n7kWKOO$3JqpH!xP^zrd2 zeBb{x&3DO?B?EnJJ9!^J^i(TG#B{kGl0&_ETiX3hkYAZwHbSrBYf*ydt=D}$2~A0KZaG2fefVduvk z>n$wy&4_3TtDY7z@7f2zkV*w23b@S~iwuKofD=OM&_PbhC0D$Y?Dd`(byv&fiVv?l z)rK-DJGellxqw^O8ttZj)dURy^^J|3`nz}S)~}DnrB*K7`aAnN7I@J`)3vg|OfTlmM?b|MP?Gh><-6V6lsDbd5FRt4+bJ06gjVtz%PpXP- zQQI#CwpwWQ1NJ2KyGbtG*23Pk*YNIBJ&NLL?5B1

      o&vHkJ6&6jrEs`x?ufX^N8 z1cg1OoWVxFxqjZ>P@#5oyus_5TUfLOdfjt3&8ob|y?rr6D17V2Hs84M$ajEPecqGw zKLb>Yf?n1pt4*0Qg`UC5h&i4(bH1%hV(A{!#m0Di&Gm}=`MyUM&e#Xp(&_ZmSy@ZU zw#oyTxSRXTW_z*+m5(i+7IBWVNo!VgxIAF3jfJk)!J+QOu3LUnhK7csNW$8ZY`3uC&YY5hO`A9O4i69aPr297P*)h(nc>!prPm4j zet)B-3)F3>zxL;=&A@s8R%$(@{|#VXP;F{z^6u+ueRpO1;2-Wemx>k72Jf3w?9LmM z3={=-7c@6DY0Zr}JR`|QQ#qzoR#)KV^)$vbih8A(e|z!H)fE+{QH51iRr8XQnHQ2Q zHRDB7%rVMmGBXzgr!zC7#c^T>^JMvbQML{aDgr(GrL#^RLS5pu9c(X)U5r|{|VFu^$Vf_HwM335UH?q5-xC+7Ea!1AzSK{r9LRg{z+GEp z^Ur|5hT4dAr?wvJ|k|ln$T?vbY9@r!&;btq8RI^T(%l{l@t2KMaA`Oj-OL=*= zOJ`}f?rv>u)rc*dW}=f?`A%#RcM)~;9+5z}^BsC#Y*}VeQIT-EdvWNTWShMxZz!=V ze-N3NrMm*rmRcg{xwThI0BroNS9h~EJ`GNJ|NK;%25{r|$nV1FbsFi-JIcYoj+_?A8@2Wax7%T`0dA~n{{26jA`1Uc*~`s!1;vQh4bgPiw`c$y{8EEoVOdIMhyYTxTm14cI7nMw%69cn~iUyYh1xkNZJngC4UAK46oH>98Nnbx3 zIREBDf6t=kg31gI?QPykP72g=!iPWf$D+;(_0+O&xa9iuVbj$1opBlLyI4#Wg zutT+~xX`v%h#Wo3K;(z036*_oM{(?s?AFYlRaa%!2CcBunYN6}{K(@g|uCFgd? zRMz&T&(%Y~I$j=dW;?B|94hF1U_*C{IJY<_r#pd@Qk(xw(Jv1CSRYd+N_at@k(!}B zI54p8C1kPSYKO#}md5)&qGM1_Jw}GS;DyX-q9RkWYBxK(3v*3+9u$YQU502HH2MYI zFW_#lzR*tgYt~<@-Tkb9o7+x4o8Z}8KuN8fvE@p5e`;}9-xbseaeBHZ7Ye~uy`ca& ziDc(ZZ_<1cQJ>Vb&Mv{D$42EA>X0&j$qvM;p4Ch*zjMcqAD>%M;RKy0vVJoE<#wR#}PcH|VEUs@NS* zo)#g$$F!ot0XiyB*vDl&#Jx&7Ti1#scg;hcCwn)bLP+$U5Tk`TZQXqxg;1&Z zmCfEz^^#qrSN6Q?^4xYgS-DcBn7`5mzx%AIDNVDJJ<;{Le^vVNm8gzVd`wahaqKO0OVr4rvLx| diff --git a/eclipse-compile/appcompat/res/drawable-xhdpi/abc_btn_switch_to_on_mtrl_00012.9.png b/eclipse-compile/appcompat/res/drawable-xhdpi/abc_btn_switch_to_on_mtrl_00012.9.png index 435ce2150d54aa2944e5eb8dfb5c72f1c555a4a7..17fc083dff11638f34acb4e6596ad7453ecda4b8 100644 GIT binary patch delta 2010 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 Hr-UW|jd~tC diff --git a/eclipse-compile/appcompat/res/drawable-xhdpi/abc_ic_ab_back_mtrl_am_alpha.png b/eclipse-compile/appcompat/res/drawable-xhdpi/abc_ic_ab_back_mtrl_am_alpha.png index 27bdcb79e3f22219e6cf48707eb27d386e818717..c465e82fc9c244da6a38a8eab7afca8a1b8be574 100644 GIT binary patch delta 310 zcmV-60m=Tt1;zr98Gi%-008|9F$@3z0S!q+K~#7F?U%hu1ThpwZ$>TM!nYCB&c-*= zLap2vwNmj1v~blq#>NkVkVNunGxxxh=fF-j+=*qD`RgHNqKBY|r04iRVj{T81XFvY zUB5+e0l+yiIw1W!8{m{+8Wbq>Z@>e`BLk)Wo&)LY{7%13w0~mK3zJ@$^rBsV*rOLF zy{PCjU-~109a0OGK%xHt?%3D4@8{<$P5Ng}2=-VtvP-H2zV$NzuiWIwQxlK8aGevO zhyv2DrSF^>a%S~^0sl{=mwf4Z$vUP=+>Se@MZ)z*D--<}T@f%R0&^lTCjxUKFeie> zgkxV!Z literal 706 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIA^$sR$z3=CCj3=9n|3=F@3LJcn%7)pVryh>nTu$sZZAYL$MSD+10f-TA0 z-G$*l2rk&Wd@@jkv%n*=7)X17vD?XPJD~BCJY5_^GVZ;d>F9UZK)`jr^XVp4q4ozH z9tZle75W@^El73FKO$|&g-g0nMMiEEFTx)Qq-|I_I5 zxa!+GwmvWxjLevm6@5ukSoFbkDSy`|tAg3G4*0t~sgZwB9cSNc{-d^SzrhdLL+NsV zmTvq0^;g8xeEvmDf4m-x3tDDp&wroW6fW9%lS_h0xmUKb=o?!Mv;P6Z32VRJ4`Vu` z>B(Tetc5FZ$w9lCM_;2E)*qO-?I_E8=HLe+GoJo=cYU(v>_(ao;KA}cRW&+duEuXp0eyBScYPMk;hwy{Ah3$W0j(9&{t2h#U zWMc1`y*u2_e=xJ+%2|9qH*fLnSuftTuW9Rir&gGD$Y%zp@y5JI_iNR6Rc{DA>{7VJ z;>D6iE;Sb^n>)F`Dr(o1YVyjizb!8#>T^M4&&d>{t?T_6qV}zE5|W+;j3(6**NBpo z#FA92$-GT;JdooS`ciNb vXU&I~Ajg@^k0M0p&O@^FmzjVB`~mO;kFMjEetUyz00000NkvXXu0mjf+AWWN delta 266 zcmV+l0rmcp1M>oqa(@8pNklZT1+@So`0ES_dy8pTvcodDW2`3 zn2_T6vJ1~G#Vc(Z6P_=^p8*b>P<@m`KhIe{eLTx zIPf#fG%X2mmFDWik$8$oFPnvV4aAuT2HfR?*Ht-qH9tD`<9i1>@L#|aaPk3^iyQLZ Q00000NkvXXt^-0~f_+nT5dZ)H diff --git a/eclipse-compile/appcompat/res/drawable-xhdpi/abc_ic_commit_search_api_mtrl_alpha.png b/eclipse-compile/appcompat/res/drawable-xhdpi/abc_ic_commit_search_api_mtrl_alpha.png index c10a1b723d6e7bb38c38a04ee307b9316f9c0730..1015e1f443df9b19cdc4adc34640e91fceb83676 100644 GIT binary patch delta 233 zcmbQq^owzVWIYQ55G3pj1(F9nT^vIy7~fvn$m!%L;&L&awa)CHZ${FKYYF{HjI(A- zMK_8iaK{Pry0WpE&#e4-=;5ZNI;S^*(Tts+vX{m#yff{2gv0aA($Dq3n;(d(%4EHB zzvZgNfxf+Q2RUDu^i{E{FUY83)nD+1E3YB$Am0V;q#KM?tkw?e6WCvfzG+xgcuCuW z(e<%HxB&x?sL27B<;HI)!69Htas;^Y4@1ky!p0n+62}Ya@)(?&AsbSFn>9}HE)`Mh(hOr{VnB; zcXS>GGl+Zt5Ob*GOlI=XPt0MssXB$lLupRRv;ZlE&VmUMho&$Dd2cYk`$ce9Hdp-W z%`IIGQTsVX1tXlcwRpb__sZnt-@Wy&PDQeO)xE!$Wgu>2V7R=O;gh6s(k!#sw;&-; MS3j3^PD}|+0O3MxGynhq diff --git a/eclipse-compile/appcompat/res/drawable-xhdpi/abc_ic_go_search_api_mtrl_alpha.png b/eclipse-compile/appcompat/res/drawable-xhdpi/abc_ic_go_search_api_mtrl_alpha.png index bd80981c3c4bb8d014a8993a2961163873c432b7..b3fa6bc2f09c291bd08d65480d3d1d8a20de6de2 100644 GIT binary patch delta 127 zcmV-_0D%9S0g(Za8F&N$007x@vVQ;o09Z*xK~#7FW55SS!6^7&{h#AM17V0;>iho& z$_xMkpb;Dt831wxMFzlJLAC)fS5RO8!WCp1fN%w+2DDJ@1^Ndfy6yB&NHE(6Ff+A~ hot+VI#27GY002y~F$GVn_QC)F002ovPDHLkV1g)7EkpnS delta 138 zcmV;50CoS70hEpulZ3-6rrX(I#@ z4QX~DzJcwB@v|uzW6Vb+?_8XQAO9WG3IwPW34XhQNnaw00000NkvXXt^-0~f}oT$?EnA( diff --git a/eclipse-compile/appcompat/res/drawable-xhdpi/abc_ic_menu_copy_mtrl_am_alpha.png b/eclipse-compile/appcompat/res/drawable-xhdpi/abc_ic_menu_copy_mtrl_am_alpha.png index a9e6cc5609e8e7df3f7d9b50572e04d0102e8811..c8a6d2585348986ac0177d5461ef10331b44fae1 100644 GIT binary patch delta 159 zcmV;Q0AT;h0=of_B!7ZQL_t(o!|m8X3V<*SMA2MEdV7l(vryfC4^WgO*o88)PaZS` z+M4|+6e^uyBJCTA_<;&@fj%3E7KBGEAPyw<;$)*Zf$Uz;ZioR$?gdbNKu-gQ4@eCC zu||LZ0RjXF5Rj@7AV7c_=gXJh0oc;OI`v`B&Jy`rIAVvx>KJbSnOu!#M42a}_#OZN N002ovPDHLkV1iQAK|%lk delta 303 zcmV+~0nq-t0m=f9B!3`dNK#Dz0D2|>0Dy!50Qvv`0D$NK0Cg|`0P0`>06Lfe02gqa zx=}m;0007FOGiWi|A&vvzW@LL32;bRa{vGf6951U69E94oEQKA0K!Q`K~z}7?U&68 z!Y~kor_!4UzJ%meeHw#j@$S=DXzO`AwIm_I%|gVVot#S9`G2}}2eKW}RvWw#;NUTW zmFI=}!2X7P%MOk$?166Wal}sNAO%oX@X=HBdw}{}%s9g(F6-Mx%d_J^jRv|Xhed#= zRz3uj$5fjOU=AzG08K73HI@Sd7{CAqFn|F>>ZO-h`v(U2iyWkSU>n^xYc9W{4zB8t zzT_8>^k^55J17tN1tf>?oT|(xo?`oO0r}P`dII_2eWx?scn<&o002ovPDHLkV1h-E Bd`AEP diff --git a/eclipse-compile/appcompat/res/drawable-xhdpi/abc_ic_menu_cut_mtrl_alpha.png b/eclipse-compile/appcompat/res/drawable-xhdpi/abc_ic_menu_cut_mtrl_alpha.png index ce5d4a7ed3312301fbddd7eba8701d01d4c50b2c..3c5e683e7c559a882f8ff9ce71131bccf7b9afe1 100644 GIT binary patch delta 468 zcmV;_0W1E|1nmQmBYy$3Nkl1LDsp zE_03`xr9+ivdA$M;=Bwr6seFDP1Pm~U#)D~_d!i}*UO#s|AZ#yNN~t1!3+U%w&Fhv zSRloBrHGL?1IYdrziEkrmstd^=qF%-zZC22IiN|+*&;+GtA8GL)ToBWo&)A&U!%1; zA*L#O21wu(vcLA>v{BhJzyVGb_U9^`_6mC&K(?1!)MFb4a9XMC8DIvd9qP1pfp<8K zRQ3!IASFZ})vN|&4-9qo{G!E>6lv@^AdjVt5bV7lyBMhlBJ#2)0Ivq7*kGU43L^|9 z1g!|Ae#8(-_J0guK#;u+Ab(UlfFT03WP}ya!WAGRG=O{gURVJS^1ZME9wA6^Oeq(A z;sei^g6mE=QL0?Tbt@cNeJSRcCuBwbscYo3eNXrqV{I@prIlYQXK$^M+yYJ`}W zMCHU!DYg{ZhO#EM$bgaz@IlBe>aY!6`b{$C=r|L@@5CN{0~X)QS#`<& zh)ZjHmvhlrGxhv)(F@LWgViS&9WnN>SLUKMCe(X7z*Z-Kp}qi=i?4aFwSWcy0000< KMNUMnLSTXzD%L{) delta 569 zcmV-90>=IA1JMMKBYyxOV@Og>004R>004l5008;`004mK004C`008P>0026e000+o zoVrmw00002VoOIv0RM-N%)bBt010qNS#tmY3ljhU3ljkVnw%H_00GHKL_t(o!|j+! zZo)7WhFKNFROmTM5K^xJVmeL-x7}7k3<0t1IV#jkP$qTJV}F2D_}MtGb{Y~-T~y*_ z_hSE_;@I!~NeZdIy;5g@KA?&T*4SZ(HOBDV0y3E505J~mk#+^h;2lvhLqyla%Dn{%;ZJDn%`_nQ#(AnG?NzrJAS($ zO)m26)=b_WkbfW_wM1=cK$mCdX7VCn%m-~yrrZ@idA4sRF9JN;rW!XX+YkcZ3zH5Er5pc3YMrL4QSDuv9^xmSo1ryH@}`_-}A_$Me=)G+uQdz zUo>#>0Wxyh7ro)a%_mfpFWO_EC~x4478oY3{rOkIKL8v7$FO$5x2*%800000NkvXX Hu0mjfOWyOu diff --git a/eclipse-compile/appcompat/res/drawable-xhdpi/abc_ic_menu_moreoverflow_mtrl_alpha.png b/eclipse-compile/appcompat/res/drawable-xhdpi/abc_ic_menu_moreoverflow_mtrl_alpha.png index bb9d84d3a3ee83be09d933a0cff686333aaf22eb..f87733af1c448bc024de0cae9d197241558e5bd9 100644 GIT binary patch delta 129 zcmV-{0Dk|B0-gboBzk2@L_t(o!|jwY3cw%`1pQ2qd|uIq#eiB*s)Seu?wYXkfSqQU z5QGpPV5c$}6r#`k$xU-mP1#=N}d%^G)ltqy21(Ej5A8Z~!iex&S00000NkvXXu0mjfUL7~e delta 240 zcmbQo*uykIrCuS~BgmJ5p-PQ`p`nF=;THpte!;*{YQVtoDuIE)Y6b&?c)^@qfi^%1 zrX+877l!}s{b%+Ad7K3vk;M!Q+`=Ht$S`Y;1W>TW)5S3);_%xkhFlE>BF>8!KQLVK z<&#+KQSC@a>*Jmm-*UeVn&emSabKWSe07GdE#{bFm+7eAltk^c53 zqw#&tYjMe8u1?=~`F+`Gp73(w_48Yw$lo-y>Y7RSf_D diff --git a/eclipse-compile/appcompat/res/drawable-xhdpi/abc_ic_menu_paste_mtrl_am_alpha.png b/eclipse-compile/appcompat/res/drawable-xhdpi/abc_ic_menu_paste_mtrl_am_alpha.png index 9f9cb3bfde3be077aabe475f6e220cd24f0f8f38..9aabc43ce6e7182c477d9ea58a1b85561bdccc14 100644 GIT binary patch delta 215 zcmV;|04V?K0`mcoB!9X|L_t(|0qxg23c^4XM&W>{8^{CfW!7b7C%7>4a2J9BS7IQO z!tN*mL4tQ?h*MbH^H+hZUp+}^tU1#1c;{psFuF~-;$5n@sfeLrocvax8l7Sv~HBdPPXWUsCcsKp_CH!6i z1;Y1tfC36Apnw7jD4>7>12M8P&=8~2{|Nl0J6qo~)-pFsIsUy2M4tlwJps>Ve@{#3 RO|Jj|002ovPDHLkV1i#}UlafU delta 336 zcmV-W0k8h^0qX*gB!3`dNK#Dz0D2|>0Dy!50Qvv`0D$NK0Cg|`0P0`>06Lfe02gqa zx=}m;0007FOGiWi|A&vvzW@LL32;bRa{vGf6951U69E94oEQKA0OLtSK~z}7?U%g@ z!Y~v@Z~Yxy9Mpol^tqhe1mD7!@ply;K(OGGSZFJ_9oMFqG=EB^2=@dEA;~>So1vc| zo~_S{m?uxJEa~~K^DRH+Mv<7XPC=KLG8fwQ2^PF#{*54FM~aONBgX8l<2eT+mmng+ z#Rx%|IOim$q9sMvG87j<;b~(iYol+RAjQp|2_eUdSy{1WfN2wBkBA?EWxYu075xAe zG%x6Q-46W*DoId*3RIv16{tW3|MqA1kikc};61th1m{{deX>WWsu1YIomo|k&Au+4 iu{Fz=Gn!u0CIl~r3wQbjh2*>d0000J^0B!7rWL_t(o!|j*L3V0Dy!50Qvv`0D$NK0Cg|`0P0`>06Lfe02gqa zx=}m;0007FOGiWi|A&vvzW@LL32;bRa{vGf6951U69E94oEQKA0J}* zD21*Wv}a%{?-+~kOm&}T@L>;Hp*@i6!B%Jw8 u2apHPIXb40(qK2Tcu@)cbxFKC4n;L># zB6z4o^Exg}q9AT*=s%b|JZ9aymWSs-ez)B3I~4eON!$K=3{as?Lc%gr6lIJ3tdRGL zeX_#LhH?;4*^}$EcHez(IA75gO#Ja+l01C*^|zi*)jxN&4i6bGZGc$}aii5iXxOA{(@D zS(g=Bxcrb69^&$aqq4yn+}hk>xBSt=6FOPr3W0pFgNVHM+-8&1TgK&!0_Scyl}@U%z)nJb;Z~Ln4)X?=P*!+`OC&2S;1bCSHC(1;g)v-8vO|rnLRq4p oDtRG&vPPMZh=^%Q+V&6n0~P4Sj+Tx-KmY&$07*qoM6N<$f;d3lY5)KL literal 857 zcmV-f1E&0mP)~17pHSp`+k4tec$K%yeEf4?;0Bf&=Sn7g@fi%Y%!p*+PmgQOJU zMPLQEXL!ON!C6oe`1~gD)X)`@X}zF{%#2mff@PA{ZUeZ*U&}u5h;w>PM2h849L{p8JP3YZDD8*)5-<_Vc7ZO2{!-sO2D^?>Jw4UW>?*5C#wsX@8x*qY{I z>QRcgQaiL&mV=4l21mPfO7x(jfMBv)OEP=rXuxqT2E1}K;G`AJp7FH5UjE&s;n+6^`L8(L&MuWLvF{t94P!{v~Nqo`KZwN-ceCsQF zqqN8r$9Q-dUK$jhYQgxJzb|967csMG)*#V{6dRE-WQRMT&M;Fr177lS8)RsDe349% z`i-C|QM+M0MoXgu%%@3F#4shuC$LuX=~Bgl!@|CTFBbhqt@J&jj+a2%vFUn9cMKXf z$~Anf+8RKO+7c}%#u3MFL9-SE{`>23R|7h<7;wPRfF>;lq#RCz0kKU{gb6K{23)0! zS4{?#^0iw&;=9%SL@s1PIX~IBA4)s`6`E6IZmw{H1JQdCxr7lXq9ais~qid=#lP4JSyR)YEjh7pC?2*&9iKk?*Gpd&NWM_IU_ zPI}R&&wsu;Rn=9M`QO_~BOptTyjhMc0U4h)_++X7@EYbA0Dl2FrMtonMww=eoAeRN z8~hs}uwJ(Fkac1XTFeGTI;^_j?*Ul@++`d1xo=hW%&PVVJKQ6uPWS;PJHtF!>MF@r zH4H3rRSf3U88-EZ*15)rcLMAi@Nv>M8GRr>g+|Qc%hgry3Om_O$*vhVTH~kcGGrV0x>mU z!nd0y)_;c~$`m+nUVCU|m@*La16WX1Za^!mhfcI@7I;i)|C!e*9Z{nOtWjb}H9F7a zb1XGEljm6jVoh_7zks1fB#s{Y9vX~*T zL5zWt5dNDTA^i+8PKgH$GC&?(A5}w~L>%YcG;bh@m=eMP&|ndgHw$fck~K~>Lu7DU z14K~>KcFe1c7SjL9Ech)DMVv{8&NbwOblEnL(TzkAY$N=bCMm1NnqA72OiU=evP~X o;I^zljv?}z|4;VY3BYZ?0B?DG?$R5ta{vGU07*qoM6N<$f+)OHasU7T delta 1365 zcmZ`(Yg7_;9Q}iWuhb$P%S@TipkL`{dK)ztaIOii&; z&|?_ot1P84>!dB`8b|X{0_mFK3tNVyHAnll4?Dke&pr44&OP_r&4W+smu+Li0RTs! zA1`Z2n~o2}1JG7#@QDJ`Xh>R!pAQfYnJY8`6-x>U1R%=}fZTil)-+b`EC6RQ0L(=L zfU5=onNs&Kc%SA0j|uQ2fQ>JAL)2WMar9D1N7FP+`WM7!iJqD|M=}A=4m%}XteH#> zJ8aU=evh}hiS#z**&?Q4HpE*jv%nQdHgvkuIJ)ymsdhloyFJ-(JR%u`FOF1R8Mr(O zkMu4qfIVhT{Dh=C(%W#Zbv5-0zXktvRZW^IYJEeNxY#u+)#_>Axxr{LoWO@HDft%C zI}m;TspH!-y61Fl!NtOST94F)5c>H z-}Dh#!r>X)x=RSB%`$8jtC+h0r6wn zfm*K{g4T*PnV)i>x5p(m=?!Wzv{ozqxFDQ!6CZy~SL)}vw~D~BX;AhY_e zr4*eYCHX-gQ9kJGp7jSCT;2@yhikkho=5m7w7ZeBO9!!2mHlmTsDqwmwvQwRg(AxW z%sQ0pUuU1U3@`5Gs9*@;jF1;Ay_aC17B}b34-E8{O|;gE2v6whOtJx4Ha^xgH_q^1 zb2n56!%s?fh(0qVtdZA7x)L@HCNx8Re}^{^SNZDPoVwZ4T z*<_&-Of#)sDa9kV95-X@YdYVd$4b^Bj6%=Yd)g^z5-hS`a3I7geeYY0EHc@Zw5#)o zgwLBP!Rb-nJ~&kOK!LeSZ>+Kngl{ZW6ag|0_u=b|n^=e<;*w(c z<$S7Xi#i5u4AlQ-AK=VJ7qr{ArxtD<7qohnJ3_n;q18Gj*scBNvAKE7gKUfsTQO)6B=lF2LuBLxTN07j2lC@^P$V@ z98c#H9jfF#=-I$;w%ploci5aLyzE;;JuGq8V!6#`I%!|*ie?v#Q%I**XhOYS-Cn49 z6KOEgMDeqeN$nLz!R|f^wAS7Ty!ceZfO`+ z*Hfv4L}lj*_$q1tv+LssglU=6{ur7)Ct?xbz*O~cNg2$&q6*TWHexZl;QnjwJ+oDm zjrk{}sA2LRyUfDo6LI-{lEO0x^`_-xt^WOV5&ABf9ad?*#C z!(fJQ)JFa%ki>|Kr)7eJ|C``{w*FI-*!HC<E*%C}*euAIFHHqR2@UIyHn!iOWoV RM*T8)fb4saAoPj8@DHwBVUhp< diff --git a/eclipse-compile/appcompat/res/drawable-xhdpi/abc_ic_voice_search_api_mtrl_alpha.png b/eclipse-compile/appcompat/res/drawable-xhdpi/abc_ic_voice_search_api_mtrl_alpha.png index b7d8dc70a12b17c76654eb31815891ee4f1f0316..d0385ba4ce2e53ac99dac61f0a53c3d1f819dc83 100644 GIT binary patch delta 392 zcmV;30eAkV1fc_vBYy#CNklWhIU@XQcoqwPbW0FoV7o$!m5a*u? zvLFkxAPc^OmDXi90=w-6AHnUgo{F&<=6AsR_JXJ2VOXz;u^Q%2z~lCUTcCFA*Sc@p zerDm5IkXFIv=^KQTn{@7wltYJ6=pX9=epdYb@0{cu+uj(QLAlQ6+ZaR`UW0#yQUWb zuM8Bw$zc`PbAO@hJGci}cl^LJC%gpQ?f%e88-RC~q9>Mp06f#{E+`Dm0BpEwF-*?5 zrULN7(Lb$jSGgYm delta 527 zcmV+q0`UEz1E&O#BYyxOV@Og>004R>004l5008;`004mK004C`008P>0026e000+o zoVrmw00002VoOIv0RM-N%)bBt010qNS#tmY3ljhU3ljkVnw%H_00Ey#L_t(o!|j;Q zN&-<7#?J($NPi%MLX&72w6k4r5N>>e+5{nl;igs53$$(<)PDoCZe>xBnTR5}41ypC zi6HzF^a| z@CXJ-@Fob7(0}uW5mnQpq#&44W`c@{h|K7D$%y*QhD1c<$)2DrA|g>eKQ^L{^eEa= zWu?h`092V!b05Voa+BAR8KeQgj=iESswUey6Qcf>+?G4U|2yNg#v|S0j(9(u zU4R5xnr*G$IcK%|m3M0$1!0<)Zofj%w$5?&m5IHh^AznL5jftzia#g#0AHMx0??53 R4*&oF00>D%PDHLkV1h}5>LCCC diff --git a/eclipse-compile/appcompat/res/drawable-xhdpi/abc_list_divider_mtrl_alpha.9.png b/eclipse-compile/appcompat/res/drawable-xhdpi/abc_list_divider_mtrl_alpha.9.png index 0d2836d868246d08fcda88bc6b36c93dd2620de8..1e571f5c6f7ae4b205aa3a050c5aec76c753b343 100644 GIT binary patch delta 48 zcmeBR^qZifCF<$o7{U>qoRE<4<2-}XzyIw<5)uqHH&}nif6PD300f?{elF{r5}E*+ C;1MbS delta 106 zcmeb4V4R?m!j$Cg?!v&Zs#n>Ffq{Xuz$3Dlfq`2Xgc%uT&5-~KvX^-Jy0YKnEal|aXmR9A>qgQ0|!og_;1gw%*@=v&Y;c6{6Biq^36a+44$rjF6*2U FngDyQ9kBoa diff --git a/eclipse-compile/appcompat/res/drawable-xhdpi/abc_list_focused_holo.9.png b/eclipse-compile/appcompat/res/drawable-xhdpi/abc_list_focused_holo.9.png index b545f8e57871c0a11cfeddb22bbd9d7f5014959b..67c25aefff272ed6716a00fe80012ded61b4d1f2 100644 GIT binary patch delta 81 zcmX@jm_I?q+sxC&F{FYq`2gd;#R)M7Dqdfnxg=piqO;HAdYwsi4sW=R)-B2S;(ByS l_L4g*l~v^qGP)?GF)-XRESVx;QqaKw1fH&bF6*2UngFXPAs+w$ delta 174 zcmc~l%{W1&o~78yGlT;OYB*9l7#J8h3p^r=85p=bL736}uU#xFL)Sd&Ecw)}QDF8)-rjnv-wgg%m4(Qu6{1-oD!M$2dWyilx}eGlT;OYB*9l7#J8h3p^r=85p=bL736}Eakt!IgTe~DWM4fVjUS4 delta 145 zcma!E%s4@^o{fQlLEc06B9LM!cJd720D>Bhlnx-Dv%n*=n1O-26NDMfPo7>26m<1; zaSYLzm~2t}jE7n5gFNrz2IKT|1_n-&d^buSGpVVm{hsM@v4MxpO}XuPW}fn2Q=?0F r-F{`IG^iDQap@JGZ&}>N$WVV>Zu*b6j;9&8fkt||`njxgN@xNAmZmP^ diff --git a/eclipse-compile/appcompat/res/drawable-xhdpi/abc_list_pressed_holo_light.9.png b/eclipse-compile/appcompat/res/drawable-xhdpi/abc_list_pressed_holo_light.9.png index f4af9265719d65e1c500c2a9de627aff162a18cc..15fcf6a3220557b772cf6c3c05ef8d521a97f124 100644 GIT binary patch delta 72 zcmZ3?7(GGKiG_iIVXNcQC?KWe>Eakt!IBhlnx-Dv%n*=n1O-26NDMfPo7>26m<1; zaSYLzm^{O>SdCfigFNrzhMC6cMg~rj$8MB7W_tPZW%>+{iw!(%Zpv-XGxL=Hni^fY r>-H-vr9rLei%YNg`8k%885x%5${1&MNJTJk1C8`_^>bP0l+XkK^W-lU diff --git a/eclipse-compile/appcompat/res/drawable-xhdpi/abc_list_selector_disabled_holo_dark.9.png b/eclipse-compile/appcompat/res/drawable-xhdpi/abc_list_selector_disabled_holo_dark.9.png index 88726b69160589c8545759440e8d4e69dc984c67..65275b38c73437c10cf4378a8313f2aafbd3e04e 100644 GIT binary patch delta 96 zcmdnTSUf>8iiLrJp~&c+29UDyba4!+V0?RaBj*7F5obqUIS;ex<{KVL2hEME)i`c? vySDkBjV8}wgPO)fiMHRjje$%MDvuCL{lj5qRy|=I&=dwwS3j3^P6dAd73=vG)*IhFhLW$WC{H*T}vO6&W%Z`FL$$u^U6ws#*`ejvd>f`_g7 zAe8#grC)!;uJ!rTYttXhXMu~WLFL6~ZJRmM`~S?`boOl`Lh~|?oxTIKoWax8&t;uc GLK6Vo07Llz diff --git a/eclipse-compile/appcompat/res/drawable-xhdpi/abc_list_selector_disabled_holo_light.9.png b/eclipse-compile/appcompat/res/drawable-xhdpi/abc_list_selector_disabled_holo_light.9.png index c6a7d4d87c0e34d3e350e3c9438895b31d135b94..5b58e760540f51bdc9ce347fde6d010c2005d3cd 100644 GIT binary patch delta 96 zcmdnPSUf>8iiLrJp~&c+29UDyba4!+V0?S_ASZ(%53^%v(aZf_OPg70CS0$WpBAw0 r`seE2Uzg-1+7dzN-R4vnYeSCqp+2d=sJ-z(Qy4s5{an^LB{Ts5mNg_+ delta 170 zcmXTk!#F{*o{fQl;fA%^Vj#s?;1OBOz`)%J!i?r8Pp<_E=6Sj}hGaCpy|IzE!GVXx zakkrw{W@BfLPAPk_Aqdsb>q|Vf9Dl6nOEK;sP@e3HFl4}u5R1IF^{SFV1j`J4;z&F zFFNnvhP$o5i(V`Kn0x?9Mg^qegUj3{yMAA-Pn&d)@l1^1yi00ntU#+7JYD@<);T3K F0RX%yKhppJ diff --git a/eclipse-compile/appcompat/res/drawable-xhdpi/abc_menu_hardkey_panel_mtrl_mult.9.png b/eclipse-compile/appcompat/res/drawable-xhdpi/abc_menu_hardkey_panel_mtrl_mult.9.png index 4fda86774c2ecc2cbb858a9b3d5707dabde4f522..c67a5ddcd17c6cf6574175018f5a2316bce2c0f8 100644 GIT binary patch delta 930 zcmV;T16};%3%3W5BYy*aNkl{P@S2?7w;EH-?%6v+=>3E%#*C|~i5O}m!Os~)t z^!HOz)EEZ0L$mhitv3g4E9|E8VZJ|;Toj}fT9b)J;mTY5K>91 z{G2`xtU(~DXn!!)tgJB@%b*5&C#YcjUMj8$>L?&X%H&u`qCNl#gh9YS1X?G6ASmWm z+)iRJa6Fhg0(JmUX`-8(o3p#SyN}n`*WYu_?}#Wb{|GZLb{yZ|;ooNF-?i4K$H&KS z_xJa|9v&W^I>SdnQ9A-P6;k*9gY_T~x3{++w%hGzB7ZvD?RE<@|5b4MAP~`u)~54| zi;GX~v#%`(Kg8?=&jU&~ zuWk7g#>Z&vR(yc8js_eN7>b-yI*%^k(_M1T=i-IuXi#jxaVqi%Qd`?+A-G!A3l) zO?%iu9xk~n+BoKVpb{K0O} zi9m>XH0WI+@J9D!b~GsaPu!*ij(``MXQqyTkWxi~Gt*xiNQ&`lDBwEq#O@1C?Hc~4 z5Pw7%bS8qJe)THwhru6v5aM?!#_vf;`kM`thN?^8O;!9Edur?md}u8SeBmR#ni>r} zPz43PR1goOk`9}HR4@Wx7-jVI@X4Uo2}JuP@Mb^uX1*g>$3x(Yc`P8wVtiNkqMa!4 zWhdH;DtHE(d05o9DS;>Yww^^QB(Iz@lN*-6I|Y-_AN)aEuHGG1CIA2c07*qoM6N<$ Ef^#IbumAu6 delta 1490 zcmV;@1ugow2jdHnBYy>|Nklf0YAfD7J!pazj!PJYtl#a$n{cJ%>b6cVCXm53xlDFN!lH$UM(w;!MpNt!g7 zG$Sp@Z6u}13xC&z>%?_y!dh}&Z#i-#M5U+;Aw*ds$SObyXs9bdlK@ZPX_E}n8j!aC zX@b^*>y#FPv$o1YN^WPim6vLCX~X4`qNw8@Ms0{HU+e5BYHIQ3E zLTm>~lz%0=hqZ2OY<%6{-~Y?ruc9}cXxMdeSLim z+eI2ol46@k1Z)vOGUST&2Jrw1WF<&*3)tD&`DSnM;NT!{?qfwzs#xi7g}T zR0dauc!6G_qzF7Fa!ZhvpbaO25u2NRu&Z@7a)RL z4cHg7U_WZd8{39vNTK+RWdIggut|Xx`-Mb-ULmvyY!Epk;K`s9U97!p8$H_<{$lidn z0)O@e_MAIxGHEicFuaQ}4Hm;-!+wD?2H7iw79l2@L>?ELvF~KjnAkTQGnp}Ys4%>X z@DMD$Hh=wK)dqGPKXcL;k0L@soEFkJmh@sKZq2)I z^2Fr1!tgG_bFjD%HiKZ*4t6{}B(5p~pDebb6J?Y53rf*5la~s^y9h7A;sMyOY3u+y zKA{XPLd+4NQHaoqnW!7W?C22)rco$&>EEd3K46G_9 zLK4T14va5H(3Spb@)#xQgTnAG!UwQ;3^sScsvGQDz%sH394+&avlL+hdy(x@Uz>bX z7~Vzr2o_JkX2KDHkES_ljx0hGUVo$$=TZ)m>?G?c_NGq?!@CHdz~U*`aIn+^cDKQ@ zED=(8v0l9RB;IV%{#~6^3^aUW3IP z*xUgt{+jv9B82&c(k#xc%S#Hwy9mo*F&p6*N|8lKI)B(Qgvr$m&aE#LhIbKOfW-{h s3^{-3k_;t+{f`pLNsY#9D!{MiKa9C}y5hHDH~;_u07*qoM6N<$f?}Vr`~Uy| diff --git a/eclipse-compile/appcompat/res/drawable-xhdpi/abc_popup_background_mtrl_mult.9.png b/eclipse-compile/appcompat/res/drawable-xhdpi/abc_popup_background_mtrl_mult.9.png index a081ceb95dbefcbd63d8fea534f5e6b06006868b..b5dd854b20c4bf3dcfacf03fe9f9f8cd93181e1a 100644 GIT binary patch delta 1453 zcmV;e1ycHu6TSjNklekf%G8yS8R5z^-OnJ4QnV4rJ{VX)MGdYiaRqccAGw5pSt}wBjt6Zg?dd% zp{Q5bYjxnROUEI*%Qb#V!aM0MN|xhUw4+ z10lc^7|rJ+z)%2!2nGZp7DC_|e|UKK)#>T!H#<8!C#|(F%d3l;rs?DT{rwLoCnrCh zot^z*cQ6-1NL#=JD$4>f8PO{qIC%Rez|r)cX4R`ul@}gC9Sey)j8) zlEa@n*z~CpBmjg5L7T_j-QD+uU=gkM_V(UeFHBOm;3&?G{7B-p1o)3vt+lTUwTNo1 z^R{0h3{U`o4}$st`0W7_VKtYC6lxiL-u5d415Dx}6%vUc!H5&Y!PL7#Evn6?uHf{?iI=c;yGeIy9~ z4-l&FVGaZdK&ZidVOdcKfu9J0*EM-TDu!WEQGW>tO2@T^+*|>GSWpxI5YG*I=LkWY zXj=yYL1;lckPZ-nLk{l}_0pomc$xJs1|gXc0=29t@lDUG_T9z~6Ue1S#rK2upIHng zTiOz+yf@;4KvA{(mg{X5)#Xp^dh8nSzh7FEqAz)0^NFB|r*M`PrLH%D@f{$95KPO1 zK!1T3=ut{FYdQh|ua^~te#HKDB!Z&h?n9W1iUKdttGI=Co+3sF#(8{JSw_^n?X4FG z!++Nrum?FXJUl#nEQ^SGe0=6g@ zr0FFPZf|ct9336~T1xr-xxO&9!iO(R!KG845HhBXre>4ZraqZ^dageM5T?*mvvAOt zolu+~co3KsZ7})7zc(N__uEsN*v5Z3wKjh<2J?l)SLeip3bqBag3UnC00K2%-hVK> z2!at6f`Bl5f~2r8V0*xHNVf(w2v@F}m8`~GY$FH(f-sAz;J4t>gTbVL2f}E|0)f(O zB48RIsq(_J_X<63FjYA}=$a=?PAaS+9imiF@X*y@)eEu zAO#=|`VJojUQb}!2GauDK;khh90@}1jIIYnd_pPn&8xwLvEVm&M)xR~l7AEg1OTN; z7}USM5T9ZWfJn6l!HJBw@^DmP0q~1S5GF%VQ?k(fd~1l>1nlW>M@-_I+56LgsQ?wE z1p1=gzt@oXj{gZw1t0{f22V=m#XFKG7l`Lu3y>3#BYz23Nkl#@+FDJF(KZ@uZ7QjaNlp6``k{%5|H{{Q6OD<0^jxxbTys2kxOW)1ChU`}#7{D3 ztu^~`=G=W_vH4lkig|@DUGws-RdeZ5Bj{2i=u#u-QX}Y6BY)_c2P1ry2NWo>A|D*j zn-Rhayd(g=R%9RuXJHMK7b64_-A~jwVW|(6DKg;46LaZjo*?GP$p~Q$5O)Y%2rMV8 zPy_;VCOq1PiRWO5P)6`Gz!Jx|ekqA=i=8kiBCI5=QaHgJF?R`vNeamraYv*m2x5jX zMzAA*Z2((%*?&~AL5V>rVKtCcI3fHnXC>fLc(sk;GQ^TBW(Z`2*&=~$fCPQpMR?gv znZX*M+@Qi>tq;~MQuy&v0nUWKGU8Q?vC=XH8)CM|5XuOCCXn#Y1}KH2MRXCj(xA#9 zWw0LDV6ai)#0KIi1@0=zG-8ekVaSnSCDj2lDd73@=MO)A{P;oTS@8A2-nSpDDLW&B$MwoUOVF^V8sS8%2D3PMj`@=O}funLnyHI4- zKocnolhc;D|A|xslQU?*r2$B|x;H)w@Z3Ft-CWEa8 zyHtwEjj#(^G(npU(5ejD66&32C z)jDWb?5Gn08-eSCHIx>-Gx06ROWznAQ7Ixf!Vze(3)*a=^svUN6LKmJy_Ftbd^Tz-v?55sD5P45$>58({!i?1eThR3}tW z8@b%kLS{9BbPQqyX&a?J*kQ2G;IP4>gF_6jS{+jR!S7_T0jE~p&z<{mnl-FaL~ev(Xt5vKw9!qaIh`!} z{pjTV=bNqH8irJg$c->${noG^4C^aGn zbx57??Afz_CnqN-RF;KZ9_JqSR3CIeo5oyjD8&NYS>(=v>x7xhDOFWfqfehc{qMz# z7wx33c4?SpIyvp^w!DWLV4Q?9z zY;e!uH-mA5M+T1#{xW!C@Hgnl0B3i=;SF$l861y-^TTw5nbU$@ANW4kkj)78BX6a2)XdL4w$p9qV+JSj0X?@~ zGWg!$8a8nYuD%P0-#7SGk%9Z*<}SFp1@5ka%S+&P6kH#p+sp0N^N*GERCH0cC!+m~ z;Cl8^4wfqDarj2ujepyLwxt)n>`8>Ia|Rdj;jh5W*Ripi*yJs^{ij8a+r-CBaC9A< zT>*y|!RatKJ_^pepurZ326B5jNpli>pM9Lo2yyFaXpRa}D>PAx=t8bKf@@QQxJx&N zQ1&f0^c^<$18`L_1L5NeIJyMRE`Y-kaC!n9_keRr2~AWRRDU{VB=`=?nD&{N;+l_8 zMDr0U(3Z&KZ_PN{-id;xo1#M>+&hGgoWZ8fA;eu!WZ*ow83R`%;O->2lqk>*u6Kg_ zW_rx6ilRXYO-*slM~G!Jf@?+s56dW{!ZA%|Xv3*i2QEi+!?lO7f#W#%7{E!`DL8yc zF@r(kWdK|q2Y+{mz-2eM?Eu$pWP&smh-HpBN`A8u0vRE0)e4d#%4l-RMuenB^srm; zA$OyQ>B0sMU^54?u_M4y#SDaxL*S?foOOf4J>YaZINl7->!3l3+Qm{D)oV{y3vC2@ z#-crBQ)VeinyAG=Mib7u+i*c*JMx$qqZ1qJ!Xd~$w0}Q~8N!3`(n-Sa0*BkcX)8Ex z0Oyhpcy>~;l@hYfTAU6!XOUAxF-3+76esHuo@x=Q8WFZyQPGMq+Oe_isCIWC*DYoU z55h}33BLs#HiOf8aGVC`m6Q&6BrlKF%Q|N<%;Z(u44fvCG<(?|y<1D;b{pa3W}pQd zRD41U@qg0<&KgL3dlat>+DuyMz|RCZjo`HhZ!YyQLkUe{FQ<9TDQf_C8XKv>rerp= z;uD0I8gP}i26d-s4s$t;-YxMl!BU?=n{%Gd9=Bf7k#HCy=@`q;Q`+rG?TSpKh$o)P zUSUmUw+)c6Ugio465M`si!FY(C@`ltxcHeNn<2PJ z%l>{Rh5vh;5YybcN diff --git a/eclipse-compile/appcompat/res/drawable-xhdpi/abc_spinner_mtrl_am_alpha.9.png b/eclipse-compile/appcompat/res/drawable-xhdpi/abc_spinner_mtrl_am_alpha.9.png index d4bd169b9d830c2c5af5b5dee586700966ba3abc..bcf6b7f059ff374cf2bcae65ad8670f5a76f5346 100644 GIT binary patch delta 287 zcmV+)0pR}f1Fr&*8Gi%-005eEVW;ff@G}V^VET&a9U|Q;9tOK16{}b# z71LbV^sE26GL4a;=R$`@n!?KTBr6=eWqQC;(#vA;Yio2aCVytuQt`}!>wCewj|*+_ zsxN7ZSZsA*gVxWq*cikX%UEz@Tbx9QPg~=lidaNnGO-IFDC|s}XRpVCo7$rz#=U8d z%3NAcl9?kq9gb$s-{!FlH`jh+C-b1nScY4GMVTsKadu0qIIG*RxF|8+jK!mrl=~>p lcEu`IF%|n;+!*!G>nC=hM=bYGiC6#t002ovPDHLkV1o9^gt7nt delta 483 zcmV<90UZ9X0`dcp8Gi-<001z0sUrXY00eVFNmK|32nc)#WQYI&010qNS#tmY3yA;# z3yA?Y$;+((00ERqL_t(oh3%NZO~XJCMgKYxCoXW{z>x+hff}eGM|wa))DbBSKn*D& z4Wxiv;E-G5#izZO}#*`!D2o z%uE)ulEtiKF)LZj%Cu>a{N4$Ty)XMo?2_2>nPJz8IRMuHb{M{L1aJZ1L#|J*Sfd#H zyLSZe1mFe0CxA($)B(U1fM)=&Dz_byjwIw*&~u=j5VKJEdMUJtX}Jl>Hz}|qdF*-Y zCFWgnRDSRfF@KOO^Q zZeZXw1P@@e#)f(T!B{Zy0y~0tFct*`Sws^B7ZX`_0=v3Cf(S)P4|Xxrf!~)FUw$=R z^WKX|C^hZ)ZZU^)3=5qQZg}9Ok4^!cI&$d1CFN9Aqe`7lxPRr)+87z%J+Ut=Cn$Bo zIZtIUNOCQd3^I=0DbkHfOW~?FNNQP4*2{P#bmPjB@S0EP{hL9;!zyX5v=GjFJy8f* zqP~9kJL5C_G@SuoTrAfQ^{;qa{#`BfcwBOZI^zo@ZDf2aIYShon@*6mGT@%Dtd(bk z`{=ckuu_yIrGMv0+8OZ9Sz)0lEreGXw3G3}zR;;3kq_FHg)6&OW|xa{u8VK|dES@L zGs7dA@2PM3hdj0?bn~~3Et=ccvF27D(gkmuTkzeIanqpq+&(B~9%u6p-D)*hSsSHo yHK-Su>wgxQH6S~2WaYr#<^|^e+1%{3;ukEe&*T|B&JFGW0000b=oClVGBcb~?unBAc>%bGBS1}ev zQHwHpr6qakSV7W7NslFMtGR|&Z%JB}bjrr+CN`#r41h>lkn|uiC`kiJ{qU{|uy1X> z-4{tW8-i9tCV!oLfMrRq%|O2a*d*Ycr0>1ph-Q%5>%kRCA8gQ_8NjOKD@pOK!V~Cw(@TZMI%=$yexpYCpy5 zq=13^4&zwX%GOq+uGP0GW9c1{C}(RLl=@yt+B4zvIq zjvwbORTCA#J3{)5wzA{wmVJwy7yowKVBHCTSz2RBb6udT(ilq&FTPKDG=x`|+UybUqJa6FfR! zN7@?D^m1TL(_Id@X1W~smur?YzzxRNEGOBW!7vE;348|L055?O>#=yX^(#z)@kTUmlaSW-rm7LJf@ZaQEfp-S)zy2tbtcxpL7mM{m7$%!J rIBsNiUcAj)lD(iO%0xpqiGd;M2J@Eev+V6aBN#kg{an^LB{Ts5GEyQg diff --git a/eclipse-compile/appcompat/res/drawable-xhdpi/abc_text_cursor_mtrl_alpha.9.png b/eclipse-compile/appcompat/res/drawable-xhdpi/abc_text_cursor_mtrl_alpha.9.png new file mode 100644 index 0000000000000000000000000000000000000000..666b10a2f2d6cd9047220fae70e16af8b93b18e8 GIT binary patch literal 99 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$0wn*`OvwRKTAnVBAr*|t4bA@pJh(r|dwuaF&!Cxwp>dW4D+~Aj|3F;~p00i_>zopr02T2bZU6uP literal 0 HcmV?d00001 diff --git a/eclipse-compile/appcompat/res/drawable-xhdpi/abc_textfield_activated_mtrl_alpha.9.png b/eclipse-compile/appcompat/res/drawable-xhdpi/abc_textfield_activated_mtrl_alpha.9.png index 7174b67fa42d34068acbaafe9f33c7bf88e7f765..8ff3a8304c19cfe6be8f848ed5483c661a069658 100644 GIT binary patch delta 70 zcmYd^njq=O!oa|=(9^E~NGW={IEGX(CNnhsU*goEcIn{%hl_GUZm-yu$a6wVq;0zy ZgZa^o{=a<}ga8#Yc)I$ztaD0e0svK&8K?jN delta 80 zcmaz_nIP%S#=yY9?a=lcNNIbzIEGZ*N=|5K_+N6Mp!)^mzy2sU)6;GTH6&OUCy4Zz jIBZWlxFXg0v=M{u)49pBW##4pwJ~_Q`njxgN@xNAh0q-_ diff --git a/eclipse-compile/appcompat/res/drawable-xhdpi/abc_textfield_default_mtrl_alpha.9.png b/eclipse-compile/appcompat/res/drawable-xhdpi/abc_textfield_default_mtrl_alpha.9.png index 46dad22fb87c67fb4aa52cefc7d8b4351c94b228..e7e693a7b81589e21048a5e7a8b28055cf48118a 100644 GIT binary patch delta 73 zcmYd~ognGL!oa|=(9^E~NU3FVdQ&MBb@0K;P&>;M1& delta 83 zcmaz|pCIYS#=yY9?a=lcNa=aHIEGZ*N=|5K_+N6Mp!)^mzy2sU)6;GTH6&OUCy4Zz lIBZX2ysInSYuwc&$iTBBd+LRKp3y*^44$rjF6*2UngGl{9ijjL diff --git a/eclipse-compile/appcompat/res/drawable-xhdpi/abc_textfield_search_activated_mtrl_alpha.9.png b/eclipse-compile/appcompat/res/drawable-xhdpi/abc_textfield_search_activated_mtrl_alpha.9.png index 33c1035620751922c5abacd0c95925f68953c9c6..819171ad6505fc94b6234fd8de11803097cac12f 100644 GIT binary patch delta 61 zcmbQu7(GG7T*=eLF{FYqnW5?b62}g)po9M%*KxM|pU830(OrolQ%U&*V{glB-~FPG QOBjH_)78&qol`;+0JUotB>(^b delta 125 zcma!^%{W1&oGHoM-G$+Qd;gjJ3=9mM1s;*b3=G`DAk4@xYmNj^kiEpy*OmPqhbWVX zK=Ub$Ge997PZ!4!iOYLWZxm!O;9%Zpe*B+ua+gm+*NW*3lLO-p96h*SpUXO@geCwp``i6~h1k delta 128 zcma!<$2dWyiYdw4-G$+Qd;gjJ3=9mM1s;*b3=G`DAk4@xYmNj^kiEpy*OmPqhbWV% zx>C-bCZLeMr;B5V#O36agoGdG9i$ReV!4?Q*Q>D^G5j?#G&1<}-+hsoniv}!TdYxz clI;n`YqQxbPyCLV1=Pym>FVdQ&MBb@0Pm$GdjJ3c diff --git a/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_ab_share_pack_mtrl_alpha.9.png b/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_ab_share_pack_mtrl_alpha.9.png new file mode 100644 index 0000000000000000000000000000000000000000..4eae28fde7ed2f69348492f8b76f0fccad273212 GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=0wlMXIamQH4^J1zkP61P=Qna52;gyc^q*|G z>3in>0IEIVuR8Sj1h#Hc8p8(SZxd^HAhivRmA< b@-u__vdL)+mb|+UG?T&8)z4*}Q$iB}db%qG literal 0 HcmV?d00001 diff --git a/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_btn_check_to_on_mtrl_000.png b/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_btn_check_to_on_mtrl_000.png index 0d544d90b068c2cc5a044133cc55733b7f0ec200..accf80e4af560daf9b06406eff1a825753e0a4ed 100644 GIT binary patch delta 292 zcmdnSwuNbeWIYQ51B1uJ{hNW*Z%-G;kP61Pw`}_k8Hg}EEX>GR%6vr9BKDkQ-(priBL4rm=JF3VJKXmia(J{W{=X;h?wY4N)nh#O3bQ3VI$Q7lh5L=Vk72&S=S6Mo zA#rDTN~TB7N;bQ8ZnJ58{E3qAh}o~>HRe9Qq_Sqpiw2+kpEnvN-g9H-F*v}0k9c6u z{=@ur@1YxoT-(<(eq7BKz5i$3)dQ*h^W(P{K79FOs`2!Hb@y*A?Ur4y3-ZGxJH~0k Wagl-F6Fh+d!QkoY=d#Wzp$P!a>wjbb literal 822 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YPV z+ueoXKL{?^yL>WGgtNdSvKUA+f-s|n(iaB?1|}9y7srr_TW{|;X59`DX?=L#k2`On z-aApC)G zEJyJM#&r#*A7ppjeZ8{s^rv5(J9J#nSMJu?`{w(#HL7=K7H!)8gTG{YQI+ES-MQXx zYdO@HZeQm7qT5=(^?zQ1V*IYJwsYja+*qSp;8=cn*5jG>C8}?{{1@xj_0ImlwS%#b zec$fof2D6O`cm+M&qCL>=b7(Pwzhd??;4FCgtsR5y|gVjyI(P+vS*#(f#5o$Pm&=A zmxRB#Vm@VYXaDt@-m~{F##=LU7&jQug4nQ<`NqB)@%5{Zt^BWE<8zx?zwAJ}CVzx- zL*0#wyPMC4AL##7ySjPyuUl|U%EZ8 z_iylp{%=v!7s+R@KgS~Ht^fK`^lJP04a~D=Jvgx`y&&WMhLdgIEVmU!{8tID%}LGW z%bN<1uO)N#Un|JvH(qc+8JIAnOI#yLoQqNuOY(~t98>a>QWYH2N>YmyT+`B0lS_)9 zEpVR-RHh12mXcVKYLyI9o62BhU}&OiV5)0m6k=#(Wo%+)WU6amZe?Il%RUv9bP*bI k^HVa@Dp52TSeY7HnHWJdBnGV$0BT_HboFyt=akR{0EX>2vH$=8 diff --git a/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_btn_check_to_on_mtrl_015.png b/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_btn_check_to_on_mtrl_015.png index 810a02942f66aad582b1443e3f56c8d847ef0259..8c82ec3d7a19e756ed5ad582c133b1f45964ce57 100644 GIT binary patch delta 579 zcmV-J0=)gY3DE?Q8Gi%-002mlzq0@U0vJg|K~#7F?9nl*!$1s%!P#}QX+sW?)A^k1 zgtw3IY z=j3^q%hRkr7o(rvk$AQp)AW`WLuX71W2j!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YPV z+ueoXKL{?^yL>WGgtNdSvKUA+f-s|n(iaB?2IdY=7srr_TW{z1<_Q~0w9Qv>T_i0Q z(5by7^!x$U8;a*Ha4UT6U%g;n>pTUKz>R5)9y(kmnTHN-JH~7L(#Ke?+UC7-wSeypCgB2i+~d{QFZ#nw0%N*{wey~u}%B-m8C++YKB-OWATG^D$~L^r%ss2 z`^fTxSOxQ&WS1Ar#R+UN4Dt=~aXu%Fw;k6k$ke|3yeKpIW3u-&!(~g~RG!>_wB+fH z&YY-sId|uBRGV#E;#x4(dXwn?*$ztEb@kd7Z{xo%(5w_I*fIQ-(tU!8IlhlgJSZ*RX4x({Q>GSId;CPxq8og7>Yr3>Q~W9PKyYc!mdD#`>htbz{gdkY zN!8)-r6Xl>SwC-bZCJUrG}T(&bn^VA4EqEObDqyh<5iSqjM-3pCX3m=aOF+EGNvDE z-^vzn#8furWLwvLy1ilU8kP_91?N}Hw?7bZEV;Vr_qna2BDXfr&0+a4xjxO_d|8E@ z;n6K|_q}G_I47F+@Oss!?OTD81y65yPuk272;lsMi>57C&S67NDjTyExYC|1ayjyx+b821 zc9m^;S?h6IvIQu3!oMzjo3RArt6PEBw;5|N%54HFH@0A0^(Mo~@Yl;rWo()bQ)L~$ zZxfDb2&tEUuqLf@=An7FzaJMled_n8)xV<}x1H4cFt;q~^r|I&sr9d$?jPW;&gs2! zy=`4Szkv47gC4OAEA|PWYqH~*U@D|w1VoA~5rI6?#fNP9a;FL~-3ijsKlxBx<6T>R zT5|T(ZL9^+)v*a~I^A#mrn7KMpKk5d&AffB&6jh5?rEt7zQ0es%(-lr8y(pveUkP5 zHY1bT`CH#q|7}IhA}s=kpUIyv(3ri#>c)3q=9DgRjVN(0N=+=uFJf>^$xljEa7-&n zEmCkzOG`~IDSo!VeJW6yDo9yMVo9o1GDvMIgOP!uiLQaEu8~oQp^=rbiItI=u7SCg tfq~Ea{t^@ox%nxXX_Y7%46IBItxSv{8WMxn2>>-Pc)I$ztaD0e0sx1?2CD!7 diff --git a/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_btn_radio_to_on_mtrl_000.png b/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_btn_radio_to_on_mtrl_000.png index c9af24b3f2fa1839c5c4d2b073e0895f0042c85d..8fc0a9b8793ffdccc2b4e4c6eeb534bd4e5b7355 100644 GIT binary patch delta 973 zcmV;;12X)a4%i2f8Gi%-002mlzq0@U1D{DmK~#7F?A0-A7E2Vy@!!tut4U!3iXtMx zMiFd+SXFMd|>FMd|>FMd|h(Zt)zx>~!C4U;w5FIgQ+_*7EL>dO7 zLq`z7Q5Vfvux!?5N!B7!IvsP^6 zB8T=>>VKXj<-aQXhWU#PD`w@jf4cm_4XaJ*L$&mar#5V4th%B2a}o*#E_s~GsZ_bd zO7)|R=6(CyH_YgR8gc90Sx&UhuMW!vO}zPRs}2|r`PE%$wCugSK0 z2Pj3Madx2)L?z&ydF#@55r5v9LO6)>PkJl))=IwZt`i_C z6@Esc6u}91ZOamJw6{)BuG~!-sq$aZnT?zP9x@6`? zDt}ewW4sser!CYU;sYO}fBi5<`-|-FcJ0^(fGC7v=zJ`E^PTj2IwUvG3(%6p^(*0- ztKVsXrjL|DeNn4?@1|m_uNIZNeZ6krNJb_mBVRkS8oEo>fb3D~HiV~AIV1gb+9mPz vTs@vuJ)UdznEbuuhE2ae{PO_-007_zm^}MlJ+CWu00000NkvXXu0mjfZpq*A literal 1820 zcmZ9NXIRr`7sme~Bp5)^K&1>3m1zrxKmv`-m;^8l8<{E~qydBk2tyKv2ueUkSVGt$ z64^6=RKO}CvSiAtM5twnpcWfMq2YSJyzO<)dG70+bN{|Rhh<}Beo$Oq8~}iWmKHcW zp?d7s0jTg@$PG6Tis&z9Br^bLNR#;L2@&?75Ib`$P&=f!B5aheSlE#OAW{tgV&ehe zi*OXX3;>}B09f?^08B0b$kGZP+8PQMP%ol64%pj|l1CMp!U>FK;SwTL(0+joPX1*I z0FYHnoS8$!%z6RI-`(;1-Wc6H5405}N!5Z)sP<~&T3k#V#g`s+``H8+l%LWO4GnOD zJSgstlhB8{kCWU=T@fA%qB_}74xYk2dNqIGcJe2~xuv4HzW#y1f%d#5u_tqPLN>Nd zmfp566)@g|dV>`Iorf?jo)S|D#uHQQ`RGgfGGKdeNiJC7;?T;q{O18Bs$IE3A;y|^ z{Q${<#C3|5pOUS;680 zQNaO0divC(`a@qO=b+J|(Ws?WmG?!^$Ii`0Vm|`@-mI|`ZFfo7K}vpcQERU&JnYoN zUd|k&R{1p>cd!mr3_tH%u&nThbYxu@uRYBu+HIj4?@ADv#pXdeQ{d*u@1c)uO$8#$ z+ysKoV=M;G^wst9K%R-15;fC6i?71oVGE{?)Gv@F3 z0G5m+6}5S`@$)v~Th%ioZO+2a^?^tw5o@^C$kJ_)Yt2OcJnTsynkmkyz~@iQsP)H( zz4}gnU+euHmzsf6D#CrzE zQm4oPB=G?MGwCs#ey?H@5SKDnxn-*ycum-Itp8Jyw}0E7HzN-3#JAe;Rx70n^>5x! z^2<+auF_ibDr@-(){GCyV^ZyiLr9v#Zz@ial9lUR3J>KH@KABu{e1j48|fhF?%t7h zUcp|GP0dz$L?s=!m_$jPcRYo*N*uHtC)XtP_RXc`6rkTE^g&>mcKsC!l^^0Ltvs#* zMrqpEq4{WG#S~SWowB5E>lJ2-LgN`DpWZRO8N*p`;>ODhR5mWr88E>un?}1ZlMCVJ z^v>XU%b)w=7L9Dl(18r9m*3WSyMbe5Plc;vN8w}JQw(-74!RsgzHQNesNaN!8knmrct?7I(1l=WGTf*>XuNxc;q7(rIm)IQ=v*H8zi}G zQdWyLmxK8tbJPg<{(VTT$25VG?W-#R+1Pp6F zAl%6YXDRa~9n3|&rCzgojl ze_>S!`WV<;$6K-RozFtai@#}7-sxfGq}!`LLuoiv`8m0bckZy)qs+&pPJ6LyKA}!z z-Bl|+XAjYLkgg#$${(I>ai%dT0vi2zmMwT(*7zjz@T~*2{d=Oc3#s82_r~d^gg>#v zNn!pHUW;YVKNo5G>(L8dqB|XFdxvQ3O->#Di`+|ijVzu~KxlnB83bSbeTTR$`h9}0 zrb+s8v&<&TrH^kfeJjy==or%2$O!ZmoFckuodxeU8C5{;=J|;TZq2~>#P3vM&rFU$ zF4vNAIaRjI$M;1yRr}$OW!H(Z?8`i4!fE|ciPrn+pqxOW>@cv=&|01xlezB0Tv;$$ zOb%Daru>>bQ`7PCQbQEfAa(ISDVeYbB4{RGls}v3CH(#s=y+%PxnLhpIyD$D^QL<_4^K79_b>HUgN%z5A+4uSYNQ91_76PS(L^|joF}ivfU0p4N tJ_dmpjVciyrvC#1sNTNhYySdtFgij2^*=!Mg5aqT04(uVxLT}7+&{fQGXVeq diff --git a/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_btn_radio_to_on_mtrl_015.png b/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_btn_radio_to_on_mtrl_015.png index db1d93af6709a587513f5d728613d920f9bc92b4..92b712e5d4cc68bd09da9781eb566b2e45ba161c 100644 GIT binary patch delta 1200 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 literal 0 HcmV?d00001 diff --git a/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_btn_rating_star_on_mtrl_alpha.png b/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_btn_rating_star_on_mtrl_alpha.png new file mode 100644 index 0000000000000000000000000000000000000000..c4ba8e64fdd26f5395b931baacc7974d4c136f92 GIT binary patch literal 891 zcmV->1BCpEP)Qn@sV9I6~CRj!1NOh%K*m&Ona_xL zbt>}_Q(moQ-lNTXvCLci<^!2m1blWb^MZuW7BVl`t|Rk|nC+%A&v@i3kqkY)mdG$= z2Q?i5yPc`o7_r-2&BmJVL~1U2d@oURF(m^v6)mzEsF}DRn>#fV|BzKn%|l3bv6_bo z*)7yOtjQx%v(P1ol;zIkO{vz#zzp1x{_Qjk!3$-s=%&Duk4uh0BigY;4sGCTK#WnS@ zB-G&%QxCT~7JB$^q+=rD5uXioY_zz;Pa7hYgE9V@5vV+z;g>{Z;{<;URRsd(_@JZe zFu`ppfvQCxca7x&LKe8FCwDNxEh&NALLYaGP+MV0_Ieq zCx0-aTvG!1g$^6a63a)NP>x^n6A9&5$xo~(OCva$~Toim{I}xgKBi-2Rc+EksnB?#-seehN?tzA0gEl$$i9B zXD0VCV;>27k^3m_fwn}zZ;BhpZ44-CqW^J5QP*-C*A%g#t9J;vr-+T*#)|xYX)A^l z5y)M%$ZJDaUm|2iUKer~=j3y#Z!sjFsocd4*=^`56GHCELGEHhR+q|!A=yQ869L(5 z=qfit?#U*WoA`??E>##qvY5(ET=AVH9qomH8@{uan^>~jg${xqPwdu`i`eCsKnKK# zUHWnlCw%3Jo(_(Xd%iM}d-%b2KXo(=*ls5GaK&dcA{`kCpFPSw%=l=aQV=oc1G$F< zZ^bGVeHOeS_ps!}NR?o~ivP$xB*2nbm7>obu#_>z7-Nhv#u#IaF~%78`~j{%YAi#( RSs4HT002ovPDHLkV1gvnmHz+$ literal 0 HcmV?d00001 diff --git a/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_btn_switch_to_on_mtrl_00001.9.png b/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_btn_switch_to_on_mtrl_00001.9.png index b149e475882064e0887c774188d28778520637ac..133de5258bde6e0cf6cf9cc4aba67156effce220 100644 GIT binary patch delta 2939 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 literal 19985 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 diff --git a/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_cab_background_top_mtrl_alpha.9.png b/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_cab_background_top_mtrl_alpha.9.png index 1dd64b9ad48fcaf08e7e11170b5f0195b903b891..f6d2f3294f543553eb8bed804b56edae6a47eaf7 100644 GIT binary patch delta 105 zcmdnSSUo`^nUR@+fk90!zz9gO1^9%x0%;&vn!fWqkYX$e@(X5gcy=QV$WiumaSW+o zOlDyG#?GU0AhE!}edgjbY)w8+YFGZZH!+JCOEXNH9lSD0j4=dchNr8a%Q~loCICqC B9B%*s literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^ULefD1|(%J94Z7-wVp1HAr-gYUOC9gz`((5_&q*K zU0}ac@dZ|;h_9RDmOZx=(g;}K(8#0;CRw?r0NJcuA{r1fU;zt|4U)pItTJE=P~X#; j&8M2Otl1%2S`~O7>~X)^XkMWYbO?i|tDnm{r-UW|75Fmx diff --git a/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_ic_ab_back_mtrl_am_alpha.png b/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_ic_ab_back_mtrl_am_alpha.png index c2d6a542cdc3786472e2ad6d3b50501e96e18b18..39178bf31a97f5c40f5db9a1f2e77d40d0e86bfb 100644 GIT binary patch delta 398 zcmV;90dfAE2b}|u8Gi%-0095wd&~d;0c1%;K~#7F?U~I=12Ggv)6qpMZheD-y6_b{ z{`3)5st+N!DO9I92JRw@S*16H54`t4p}WJJPBW9Fn3$NDnEx;=NZ6;Fgr6$1P!L)$ zka#I12ES4toecn+9!gG~g6T{JQ*z?JI!{10fGyXic`9C=5q~%q0Dgg2Zu~;NSVuAd z6Y$2`d$09~1#kp*+>sba9{R+ZfE~9aE=WFl#d>FLSI0}wSeGO}La_{?ScXt6LnxLZ z6w45bWeCMGgkl+|#QNaA#_CO5tPHlIpO2PU8TjOZfh(4*Tr69K=CN#k_~yXg%@?Z% zp;@f{b7&DVo_~Rf%z0+tc!l(YYO<`6OzcN3ciS67A@Nw1=6{STOGp28UVU+G3+I3Q z(0@SFe}vTur~ewH^`a;cPJgpOYdc0Doc@-c(x#^)+-zG|a^pOX7HYT=fYH8d98YZv sb`}%|cyr{AI4dF4pAZV65DK9`)R2=uXz9CQ00000Ne4wvM6N<$f<0fc(EtDd literal 924 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!Ea{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YPV z+ueoXKL{?^yL>WGgtNdSvKUB%?PPE}nQh0wz?9?Z;uunK>+S4|ezy%ITKj`1sBO6& z`&Nweo6YWgUK1zO-dK1Lv&G-T&17J6*bQYsKVeHIqV5`$m1A+&}vWr$UQ> z6NloF2*sbjUcF9MnDVYcSdd{uEdRnB@$S0n{yFBks;Z$&_w7(sm)f!IQ~2+QN88LF z#W)*HShHqd%Hd15v~H)_O^PaV@;=uss?WJu@QQKKHMJ#qqLcP0{xm$LbN9bcQJ7j% zvg)Ut_1jhKW%n#-jL5yy(P^lB(t6VJy#1H#ll6;!CAq41tJF`hDHr~lc+PR=#;U@i zb2+z<#ynYa?A5)aS!K%V>S6B1lNU#no(No12E;;7G{R(yL{@_^i)B}6yUfw7_BmG~ z{;K?3D!V!;^*+!{QP-cFKLt*a=_`67@o|?AZvy9oORxUjGFtnO;em8RJcHkzvZV?Q z%jd{Wvd(T=)FO4@7E9srbX(>MmJf^vmMxfZLb&0)V$1O>vXk5cyw9C_a^+jx{Z}V8 zPTjcS#9c*qfweJ=KlSA!F)tG5(>4+Q%yf3eEUx!*h6&o4 zy>4MsOs0DNy311O$#}c7DtS}Zb-C@_40X&uxE`ES@qL$X_x|$i=C!9}HR8U_Ns>9z z_-Mb!Dch?R#ccHxnyge_rj$AadEI$dx^uDfB)u7`UO{)*R5bHACy8u#@$9&u2yYo&u(h7J;Oy zKa5$j(g$lko!S9RgsLU35hW>!C8<`)MX5lF!N|bSMAyJv*T^`;(89{l)XLNl$h9&s zxUyh&6pDu2{FKbJO57Tj{#AYk)F276Aviy+q&%@GmBBG3KPgqgGdD3kH7GSPrLyp3 RDkzsQc)I$ztaD0e0swE)fB^si diff --git a/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_ic_clear_mtrl_alpha.png b/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_ic_clear_mtrl_alpha.png index 24a194fb88506adce463ba31692fd7c5dfe3f02e..f54f4f9d1103017ba9e6f5444001dfe815cf70e5 100644 GIT binary patch delta 394 zcmV;50d@ZG1M>rrbAM||L_t(&-tF2=j)O1^1z@*}a5!2nN*Sp?hZ|O}3l?psfjE9< ziYh1D$oWJ_up@SmZMFTU0Rak7fCBVsK!5@iAQ2Jiq?bg^)5svLY9z|N!wBGvq!^p; z4Q>ENwB@l{4hYi30e}$)7WCj)Ne|9MI&z>BUfZRT^vVH%o__-+TnN%Tr}&J^LG2_1 zM+35wOdK6ZkZ}DI{8|WZrP`fYjwx?qDMz+EQ~00000NkvXXu0mjfPv58e diff --git a/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_ic_commit_search_api_mtrl_alpha.png b/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_ic_commit_search_api_mtrl_alpha.png index fc1b8b442676761cd23beb71a555eb15c9667e3b..65cf0c1eb9cfd3e7548cbef55972643ef86f796b 100644 GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGor#xL8Ln>~)y`sp+!H1z?gtX3Hof}j~sfoP(^fg-g-DL?_HjsO9NmL>)z5f*`k3Jn~rj4m1+3Qmrw zQW5WVb{a?^tFtY16<`!}c@W$(x%8RRoyl)>jfEdhe3CG6CP(^XW|(7u^!*BEsYwrn T{56**fJ8lA{an^LB{Ts5UH3|^ literal 488 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPq3!f+#j|BH&GX@66QcoAhkcwMx@7Ve=8;Z1EwC-qA zy|{^i%W8$d8g3P-2!`l}T!k#I7a8qsMyyUhKUUk#pJF#txL^48$xZ9BOLp|dFflN& zFf=eQ2rw`(F*q$bZKaT3B3FbK z-ZFn!#vwXgDM~RUmOHCCpwe(1tJBx37d~;wPFw7)Tym3Nqx(Xp^D-5u?Xnx&RklwR zu*&ni7w+_8mwF7_!q3ZUI9uK=S88*&kb9A&YwhAOX*Vy2=cg1F9~+@Gs~M&$hjP>( zw>d|s{eAypHgB=hq&e!9W=wp>LiZ-^*~Kc$_R#iZ<|O~^3;vc*e4=`?-7?|OA3Izopr0K_Gr$^ZZW diff --git a/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_ic_go_search_api_mtrl_alpha.png b/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_ic_go_search_api_mtrl_alpha.png index 8e1ab5bbfb07d84836376fe3dadcab8fc940704f..d0416237311c0d6c952647ca948c0e9c564771fe 100644 GIT binary patch delta 116 zcmZ3(IFWIJN^XRwi(^Q{;kQ>eaxxh3FgxbYy_UM|pU;F(+>LdO%>qwmUW?-HOlIC- z_CQEM7#+$#aI?SYR)4v79#`d?Cp)L{_th9ZU0lC>>$OGI%#XFcTQ8fg%m4(Qu6{1- HoD!McMuu;`isR-TH=a!W!WT5~1@zHgPg|y85}Sb4q9e0MWxUssI20 diff --git a/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_ic_menu_copy_mtrl_am_alpha.png b/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_ic_menu_copy_mtrl_am_alpha.png index 5fc17a4d13bb9d90b69094c9236b0bdd24dec06f..9dff893e772731f6d5881dcaa30499dcab6567b2 100644 GIT binary patch delta 238 zcmdnO+{H9OrT(I)i(^Oyh`%QrVi@x9tExOM^K{J5|SUH+RzLq2FqJMg7He^AcEsWQOy{=a+33=9><9U{O!mw;8KZAJv4h3>L^hM; ZH)j5gy4p~Ub!W-`97aO8Vm^^a%U zCvUHwdGgH7wJ9vOB&Ix_WYsRRHtYlQ)QUw}zfajM(8)h0<9|VP`?sYZ821)!ie8|< zSxdU{*}LXLHQ$&xzpQt#oE0M=T)Eyd`G|7)nHmT7Jp!}yjUqDM3ls=&I?HQfy5f`n%zy&soB#Og=BiC_VB%CkB}4?Cm^djkvIu!7 zG=5|FlJ3rZdQyQ5%N76lmmdKI;Vst0J{mA+5i9m diff --git a/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_ic_menu_cut_mtrl_alpha.png b/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_ic_menu_cut_mtrl_alpha.png index 11a9f9787ecd48fb355a83120448ae19775f80b5..a1f8c33394416d4c57a81c700d81fb35cb81d6f0 100644 GIT binary patch delta 688 zcmV;h0#E(K2FC@EBYy&pNkl7{>AJf+#(Jl1BHUEqv98r4?&x$*427i6z;Rbx55x|iZoDS9{<7$q9 z>>L4Bmt7VZV~j-_)xAA>k4$Z>Aa*5afv$GL@F4u5c2nB&~! z*Epo$ewP7~!|_3O>TJ;Bl$<{2oUqC`+2ct*#|NqYvwzHj90Tb|4#x-SNdb<5)TH>) zJn;3|qe-D4RZx)j?p`+`M$&_tcdz#$K$3yJVHGslr%-&C;vBE+DM8<{#3V7tC+R^y zu%sj(WEFGh*(NnN7YG+}=#;6_61smhK@HtMfF&4ZMK3WPk#slHgu3%%l;HCZn zJiajwc&pz8;v3_D_d$+N3T%uQ;XfVy#z?_I=qbA+-xzaFX|eAAMOTCLrv#Ot67&a2 WP7e)oU?e>N0000004R>004l5008;`004mK004C`008P>0026e000+o zoVrmw00002VoOIv0RM-N%)bBt010qNS#tmY3ljhU3ljkVnw%H_00O*8L_t(&-tC&r zP8%^0$M+URpgusAF5D4N@%17VRbBzLDyjq`hkh7(MxdNf#D4`L#3MvR>dQ1l9C`tI zXcEHydub()cfGr|$4;cKbKF_yC(n8_^K&9Zv-OE8pbF@J0$M~1Jq$3$7z6ZhfQ9J+ z#kj^Z)G@&o8q)x3;umz|5!<1GJ|cf4_~7uBLNlw-0X0!P66;kez)1teImx1lYxuxP z16`BA5!%?oJb!9f#|ehy+NBR16=;#{tXr&-tIN10J1*wOQGr@ybyic8u3#iZ?DONO zKs_n6ojLKT6w&3!QGo_h@K)y38&X7{A4dfmOX2gGlh;X7*>UoKYK1^g{5W|jThF{< zQ;N9b$H{xBPcm<4OA$BxI4aPAblVWisqoii+wbt>sDD5Un2;Caih?7j^Z|4HIO(5` zD{}h~r`SLpb!?(dRwsXQYn(Jt1CJ;_1UF7r`SBKs6Ot27c7e9*faHjyD`B^-6DQno z^hJIHmt@EN+gUb9f~yURv5zkL7~u(bxWNwQN~J{D~RiBkJiCCd6A0HK!=u< zfG40MhvLKo(2--k#0>Nea4zAT9pf{8;yZTnLW}d2>s4vy7B7 zBORZ8m#|F-91lf)Y?Q1|{@Wnx7=Pm!Yp7*9Mt>a+YokaV;}0z5IK~H!L1JyCTV!>X z3LN7*|FS{WF~^0DvFBgM$aZ6`&@l!ORx_vc%zy$&Pcz3DKnt5W#sK2n%rWlyKUy$x zj1#=_fB0hJ7%xH`PnCC!_jnoR0I!^5Oz syC-8Dp^q;13^#i9@0bdx0-8ynKmM%BUre>~0000007*qoM6N<$f=@(i^Z)<= diff --git a/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_ic_menu_moreoverflow_mtrl_alpha.png b/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_ic_menu_moreoverflow_mtrl_alpha.png index cada2fb70252bacec39040d612203ecbd0d0ee57..28a3bbf21cb1915fa1c589df6f61afbc10bd8d7d 100644 GIT binary patch delta 187 zcmdnNbe(a6O8q=f7srr{dvC89ay2^$xFx>M$rCJg3EZ=I(OQpn8*lFwXv5BpsfP3y zzNl4>!7&#Ccwaqg68ar}?wIN);jQwX(%WCe&wVlTWQy9Z3$HzjObmBP#P;a9i7)QH mcvR!$(HBW2a1j+x`}dqC5%)Hm7k%5v00f?{elF{r5}E+F@mP8Q delta 285 zcmcc4xPxheO1(m|N02WALzNl>LqiJ#!!HIP{epp^)PRBERRRNp)eHs(@q#(K0&Rd2 zOiAAEE)4(M`_JqL@;D1TB8wRqxP?KOkzv*x383HxPZ!6KjC*gd8FDo{2sm6^yZN5d zvyMd-?yk`jW1M%-R}yHtsW(CJQ@Y-V8%fXAFV*if;}lZyn4sXepDpyunKy5IN}gm~ z=(T>oImo?f74vh?Q-urWUD{H(U?+#vV~1+NEu2+vLs)nV7p&vRdgL(kYxCxU&OZ{b znKK_s)mj$A7xs%a Z%k5g%C=>P9wGrrg22WQ%mvv4FO#sZIY_R|U diff --git a/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_ic_menu_paste_mtrl_am_alpha.png b/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_ic_menu_paste_mtrl_am_alpha.png index 556c30df8d478c8cfa7f7ebfa95721f14546e1a2..29a4e5295182b4119e3e31a6b761039eea16640f 100644 GIT binary patch delta 324 zcmaFCe2-~@ay_G}r;B4q1>@UW_I^x(B5ofqKJsPEaj@d%7M7Nd=JrnZS9p`awEB{6 z#LdGAB4!J`CFWWvZnOyU?WuoX`eorW>v;2%bN`5an3T5hBxm}aPdje$E|=Ntcqyf~ z@8;u4)1SUs$6a!SIX|>$2j2z0?|Z@zmepKfl`oZ(E;*3?wqCzpV}jwrBSDV+*RpE4 zbaZDLs(o$P6_dO^{66o7?F+J5S;g6-zNSk17dP=vIVkQZThp7ffOFrkuTKTyck+fj zTAko9o6q^(htQi2=d1tTo%ht9iBn~QL%r0M8ZZMZ@z?3Xq=-14Ba#1H&%{ApL@Yq11qZ;Z*_ygVhWM2JwP9y8>;1 z5==?n?k)`f+xyS#2l6-zJR*x37`TN&n2}-D90>*n#sp6n$B>MBZ*SRqA9j#A_A%aN z*21r%CB+2-s~%jsdeBwm;>L)WqYGbD2Yu1C*qL1~n)Py>zGBpxYkcwBd7dpQ|2tX9 z&VO3Lo%in!%c@M6lPDa^{ig7!v9g;@;Yq!VDawAwR(?G2eM{tA@r-Wsn3tO^`7dy- zf1;YWv*H4;{nK3;0dwzfGK>xA6x;sgqo-4|Q7WJ3o?rC^=Oqg{R(P@hH@UPc%^`I9 zD*Y8AM;eQwBI`L&&gdadf;WmUAx+_jEvjYbQ?BLej4#E yuzN=EEuI;!YSB!A6GL_t(|0qxm8iiI!~MscgShjEQTxA|1?&sGGnJJY7H_;^Du z1NqMFg6OYF5YkCG=bR&v`Ebz{Q}n0xhn0z*?rmNd8Q8!4u)cmWsG!6S)j@EOG*E^R z5R4k=69!r|&=m%{1yJm?2QtVYVY})H?`Z;LkU{zsRd~K7kYhmx6;%NhH2^ZmAfH14 zAcG9@KXn|)AcNwkQIJ6fJ^$@$VGRS#8fXdwWewDGhJZGbe#LoI2W|YI?=pHu7Vavb ko0&}VIV6oi1{q|~FaIF;-PYJ?WdHyG07*qoM6N<$f`xZyFaQ7m delta 395 zcmV;60d)R`0;L0xB!3`dNK#Dz0D2|>0Dy!50Qvv`0D$NK0Cg|`0P0`>06Lfe02gqa zx=}m;0007FOGiWi|A&vvzW@LL32;bRa{vGf6951U69E94oEQKA0Ub$1K~!ko?U`Q+ zfa(we#net)xXBQif`cJ^Bx2Qn<1 z2!RMhAOZ~&$dy1&l9qfZtTz5kuCf=eCNi|;0t?ghXlB1}7D)aaA(sq-M{STR$0P!3m5P`b1sj4R5+qkKj90x2J zfyUEiPQ$K|+JC#>5AU*M1RAxLb!F5t0$^b9a26%NN&Zu{w5DU{0XP%`UF1Yss pbjKNimK_MFWdtG+fe7?zPob0@YI`*?9|Xo-Hu4lMh#a|w;|F}aoS2Il_Mns@@$Wk9G2(PNXd*m zXCoyIdFqjpC3)(Rl5_G*MJlfHj0^INL>eCTgLZ6-;(7PO~keH2N> zpm|w8n$t?n_9&A3os@Onv#QqkM%F3oqd3+WlXb}#dEuMOnNZV@SHq<*sBt$ z_)wndNXb!o79%C2@+?M5-jwHTq~sxa&U;!VQnAX6d?(!(so1SOpXiS?e5^eey`UP! zQ#GuWU%cdZ&Cb{yDcEJoa*IB2Lxk(S?~-O;SQo`p@qkwi8}pv0^v8eP<+x@wuj`A> zQSzkUH2c|O(MhiHwgt_Oxh*=$t-jK1!H{dClMI;AY|b8~xXfx#c-IkQh79P9;_366 znr0{59buK1{b{**`<0`3*7{ttC5If-%7ng1!6VLS&xBH>pz3)SwPRnTqTh&ob9y2j zn|v?N)=0@a@*Iqm9F=D@QZgpbXryFFo&%AR0eQAWN_x#($*gLmWxtgSMrz6?T*R>t*4XDHcc&T_K`m7Px#0%A)?L;(MXkIcUS000SaNLh0L01FZT01FZU(%pXi00007bV*G`2i^h^7aI~a zW4l5C00ZkuL_t(|+U=V^XcJK!$G=ZX77=w2y+yk?v5H}H*KzmN&A4E!Y za8N`_77-~(U0R0@k%~));#8CrT2Puo7rhKFsY@dnGSnQkx6?zjhiN!$91KSu@WDzsT zRjk|Guliinz@!pUhz9dmx6S%pycUC)>F9n&Y{_&VX+=hZdDd+8R*lp9Yl0P*imXnH zhFnD!DFAa0_iD`3up!Q}+-6gxDff6IEh(A99UQTJ`5E`cj>iHYYTj|NeSX9;g=n(m zm=pyjyXeXH7zi8+&*2h)Z}{Q9#F)k#N3h&RR;)x7Bcw-wIon(7IV73GiLIr(bFUEKB#4>LqFGzWKk2Eu4|=t%yhAhEj&Gi01>` zZxriX?WS;va0CDra4}Gyp`~)+i~um01fWNk$YlPtJcn9+F`SQp|H3$$2cjTQ@>a+MH^4v13s5U~hbG-){? zHoJ>Wu_<#jZ3;%6^=<-eteZVJje9n2&LhAwiyM2tTW%u1uOY?0-G;L+(r#OTSbZjwu`d9LIs*5qTKLT#1xqT_A8i!@t0Wq-g@Cf&c){N?Ypf zHX5MER#p>WQ`&M(O#s=7c^4~60*DoCOBudXDwVLkk>`Aksu)yu5sUYJo5|3?-B5(B z2o;e|l34>8u@a8372POY!AzT))H-=GlA9Ca{Rc-=O{#gRO^W}6qXlCEV>kw&h_zOI tyXT5brxF@K184vZpaC?12G9U1x4*RHhl9_dd&&R+002ovPDHLkV1hri@_PUP diff --git a/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_ic_search_api_mtrl_alpha.png b/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_ic_search_api_mtrl_alpha.png index 6f60bd3c2b7b25e030baa323ed58ddf1fec4e079..d967ae70fad412dd07fdcae44e23b7db8a116077 100644 GIT binary patch delta 1331 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 diff --git a/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_ic_voice_search_api_mtrl_alpha.png b/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_ic_voice_search_api_mtrl_alpha.png index 658c5a5a29167d0a1082cecf011960ca33f860e6..5baef9ff2f5533324a5254deae54932d2ab826ff 100644 GIT binary patch delta 563 zcmV-30?hsX1^9j9R$USQd&Cne`rao zlS4&t6OB-HPy+>_i<5stjp^u6P#hgf1tksHOxsb4RgjY04f#6#$a{Ar&+snS!Qba? z_kLHto!&bVq)I8J6a|*ppV7BCc7__i<@i^EVNPenEA_g7v(H%Z4?73-Q%2sD`Lm&r7)2|G+Cm)i0=w z_#FF`ZZJqa_J1k;1@XWyXbRC~(%P9Jq@NDc*6d|^uJ{E7G!d_3JEcBJoy2$j8^kVw zZ_r~zn~B)oEDhr7Ovk1sjqpeQL1X+zY$bN{EK+5UkdPJ|ERc^)o0ddle>9j9p`x~vS9bDu7vK{2hf>;{pM^z@%|o_`xTA=lG9T<>9e&$#oAi)>+9 zN&B>4!}N!joa;M#o;8j!Rs2tTR}viamSrwjGvnOm9c^qcMs**$ONXQ%Z1aJSY;#Cb zn>(YtpiQyMFurkh)HlW=Wqtu}M?B004R>004l5008;`004mK004C`008P>0026e000+o zoVrmw00002VoOIv0RM-N%)bBt010qNS#tmY3ljhU3ljkVnw%H_00MSNL_t(&-tC&p zYZE~n$A6QU_M-9NgC3-ZD2NuTLP;p}BwiHlis%~;;S%90hksqvc{*thq{mZefK*1_6FH@QC42SbjxM&1ZjUdAr5c>~o?nNM zF~D!z1Euj(ms_auCXmN0R^Y(FG9F{FMut&%sq;6mKMH+l%$WbZmKC1~BYQL&!K%Yp zM-_~;gnx4r6+^^IMWvvfH{`nt#slNrH*g%BjZ)IP&KB--bopi+!vf10iCSYUvhtgF zh(irykD!Px7C#Y(=vnmK;9Ho%5RS5#E(~K1+n&e=!M~+7!Ri`4s-ug2r&anziqe#! z!!_PA-Jt3Cl>AEa=fCMOJ Z`wI`zAokC>;oATJ002ovPDHLkV1kn)RFfq{Xuz$3Dlfq`2Xgc%uT&5-~KvX^-Jy0YKnEal|aozWzAtM6=#{q>c_0NBDO^|5aIPVB!IRoqe%p~9EKxGV`u6{1- HoD!M+gI literal 1079 zcmbVL%WKp?9F7)?6e}ot@W~KG5#3}a`^bZ??dGv|!L4Px;^INfCbPS-O(rH&ce@9v zf@r~libpHn6a=pd9uySOL;nGL_M!)Go`gEtcB_ZdgMnlo`F-E_doD~)oEsiGIK*+> zaB1AEuytSZ?i^&_#f2loY&k%!8l55y+O{Li6ZUlOl{EdXM$MkL6JQq;AlM3QveFhW9PUMBuBLPSl?K+vId7gQ?7J?s^%NxW&yq+kQGO=Ta zA`+nJ`$=3q>zG#XUpF?jj;nJa7ArU=vysE<(Kyxzv)pYhlo&E^v)CtvIKJqLW+ShrmRcFqH1NOjMC@W44X?EhMtv_qG=$6EU24M zRjjlM(>WC?y4uHmrX;EoGSlyX$rhm`ZjlfeQ&~{9 z9WO}ENqN?yHF4zKz-}=jKIr9F^ES~}CEbt;mRdk-aTf|Y()FC2HLYwx$;kXV*8QKH ziOd->X^wxIrGLdbFxhUjK09m-4-VMGL~JzPobkT1v1*pgLbda?{(E(GbU=9j`SZPt zdtcn$^Ze+8TPIeYF1ydRD?d_8pFWOZcny4;-|;we|Ml6WJI2k^yRVZcgL~~$-OKLb z#eI)HJa~9~pm5;Gg)6^~E}#1Fek@#AeEH(!{`tzTvH5M>${}EkqaTfAluOox`AWZf F`ww_FQj-7x diff --git a/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_list_longpressed_holo.9.png b/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_list_longpressed_holo.9.png index 8f436eaf1559340b5c35fcf307431065582d27d4..00e370a1a98a123fd943cd6f318bfd731b06aaad 100644 GIT binary patch delta 71 zcmbQikvc)eQODE8F{FYqS%KkS@==z9XN=QVG&)Y>4PtiZ{bO&#BV$@%lGrcBkrcpb a%)oH)*4NJ;rX0P)00f?{elF{r5}E*YPZ?eS literal 1048 zcmbVLJ#W)M70scF(WZB00R=gfDHy#W+phNNnxluV9CA@zt8i$pSw$o^OF;oCpeCq ztkU!LvU_EcEmPE9q06L0dv1ccici`Y)I)b2H?iyY?|sIz9CxY{v{vX! zW5Mu9D7d+ekcBZrbKLA)7Q5aCrl5`2gQ(2^eD|IQfnVltD-GC)tGFA~wiCR(z1Z@$ zH$2_v=dOd<%wPl|rY^|B%_udpGC$xo*gn4&c`z`c8)g2`sg=eOsFDN&MSuklst~A1 zKt);8v}-_u2#Qb=kyJpMQIre_!SLakTH<$%rsWK^*s08SDUA(L?Dcv=uPBgYT|~OB z=Nyt$U>1e6A5k|eMCtU1!NRGR1ThUr1ad~VO}1#6XPzF05XOzh5pk3b6U9;{W^ODZ z0g7Rm$2G7{X%qi-<5=so)sL~*#3|WIJXVj+^a#vycd}4!$hLRwTJJ;y4bgDT19mv z$yRk)S0q>*Ve3&!-N?fu-GJ#1vFeFfqncoslB7k*=BNXfx`dLnOJY!6RzSn`f+#=d z;F&AMCOc` zH^)ECGP+_Nm~W3-pB;{d2S;pT5;hv))A>hitZH?u(#pQJ{b&81v6-6oYwy;BA5+eq z)k`nNzoUcG`%(ML#~T>l1#3nT3IYLA~K>8<0}=ba4!+U`%#k{y$N{%Hpwu1k+Yt{nr2POPty!t`zVP bXyai}a%>j(R{iHFP&tFAtDnm{r-UW|AF>xK literal 1051 zcmbVLzi-n(6gH};5Nd$|B#KmVa)ks^WBVM(cC5H1w&T_kDN!1Uh=n@#wK1)I#=a7_ z6JkJA0>RP&F*3l!Kfu617baGOSXfw*n1BV&X&!D53L1}&VGCImIZ;Yvo|VDp&6T~A1rPsXnA|7 z<87~dRiB-o1GP+}1R)|W$ij^%)iRwO@@jOSt9cd-O~|^=?g!Ovwt$Hf1S(v)~Wrk!3gwL;;GtKwr58C9NWBq5?(_OT8ujs@AsbkuNIgY@d)= ztyXgmQ7lo5Qo0opH!DTyOu=BG)JuYx1ULdYquaxqL}zKF`zeHRvw1)qrK3X8lJS`v z^NUV@KABok>1i1t!9gH`M4rui;!D%1Iz+9HW<)-Te zQLea>U(kNO7D|G<$hQ+5f?t*@m(}WyO%#5!U~os_`@! zK5vhI+NDs@9?Z7~%}<4c@j(%tnS>4p|M}NE9W2MO>YeOUuaaDGX)IZR diff --git a/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_list_pressed_holo_light.9.png b/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_list_pressed_holo_light.9.png index 1352a1702a7bd044d5e9eb2424f2501b3360abe8..75bd5803fd0ba79a5573238d5d7ed6b25a0828f7 100644 GIT binary patch delta 73 zcmbQu5i>#3nT3IYLA~K>8<0}=ba4!+U`%#k{y$N{YDT7y1k+Yt{nr2POPty!t`zVP bXyak??6Q zp$>=&D!MQrP!|T6SP^1iXcztkHa0f?1K^y-g`w(zW&3`;?|bik_uh7Ees*%=@&v;$ zlZ`pMO~;G*cV?Xacebxg(qW3!yJP_`lYyHcrsm@w0*%mJL2cyv8xOytX@(i=2c0hI zHt*;j4mmfs;j%EMXoi`d$zs=AMFjNFN)Q?B&(B|25cmdruhJBnv4#4<+-8CnHs?Fu z=BlUp?944No#~VyM8pMIxE7^)X0StEozC-Zo&`e_vTCr0L3NugVBrLT3MZ940YacC z9F!}H0&fCQfFdu@S1ChTuPC}$1*32}LF2GdJcT zC-7mI=QXrWNgMqQ<5=sovk@b{jZ(axc=SG&O9hx}ce110kVd25O#*r;?wXCg^$RgomqQ5~q(9SG}^saQ2r zu2)UfavVpk6xc?T5;yWt;WwauN7(v_SlvpHOK{S`c&(^_Rv#0b_HhiX1qEDhx?T|F z8#nR`I?UHbN$?2yPJ%-)R9Fv=i9k`RHOZ6}OBiJ?sFLbvR1jINX_mx}u>Sw3#?xT< zygdFXmtu?7U_L!6e!4hn9~9A^NoaFCTl_Rj8>`WBO_I_P`t+vjW zIOBP1Y-j2{^Z1;)e{dTK55T3f2QOu3KUSxn@^4=}`7XfSQ}=tn-;IyII(=b@k+(|e S$9VBa-mZ=My#2vk+WG^{9zwkU diff --git a/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_list_selector_disabled_holo_dark.9.png b/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_list_selector_disabled_holo_dark.9.png index 175b82ca6dab168b6e0e7fd2946650c69337eec9..9cc366665ccd933e0746d349c94c04a7b926edac 100644 GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^IzZgO!2%?21v|?FsbEhR$B+ufw-+|@HW-LFJM!~2 zojuFdIpzL>&#%`PY`d=W-uBjH>u@Ws=7R|a59s(?3!W~HAr*7p-ZIQ$F%)1pcyZsI2ldr+WTwmK+|(&i4KjJ<@bJt# zzOviQyRDy>{@<0YvBCKBXRH0|>-&C29E>6p-ZC}UEB@D-{cNwnFOL2{Lj6G-!YF`c kW##8A`)^#jclR@Q>T=;v*Ng7#1Nx1@)78&qol`;+0NCM#T>t<8 diff --git a/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_list_selector_disabled_holo_light.9.png b/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_list_selector_disabled_holo_light.9.png index aad8a46870d782710e9495db741f3d2c19923de5..224a08157f83679a73e8f3f466f18b40db936a5e 100644 GIT binary patch delta 117 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 diff --git a/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_spinner_mtrl_am_alpha.9.png b/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_spinner_mtrl_am_alpha.9.png index 2e7bc12c1e60b6fbf876737371107bbcc4b5c2f0..6940b603ea086d7db2288d9cd44081c1ebc0f1fc 100644 GIT binary patch delta 410 zcmV;L0cHNN1*rp&8Gi%-002Z~Uta(K0dPq~K~#7F?b2d*j zE|J`U6C_=70IonoPeDzQTmhxx22@l?LGs@lG@8OuEW&Oq7tzc}TkLxE=#$YJ$#&5IY&M{`$*0!j>s2` zNm&w7OA=yFP{@dsHIQFT<-nShNH`x*$QZ|nH=w$TtAKY#$WCui$Qv9PTcG%rD}XH- zvMUhOlw)>4d66rD9b-)w4r{|4s+Fs#IWSf3@1T+ooTz`M zl(`d+%5?z>d4G#zMk#5&a}^aceZYaUto1>lkbtcPpTv09Gx>SeKyQ$pISxHVlxN5YUgz_&9f_ToC9>-k&>&3jp=; zEMrfgq>Mv3>~CUEpn(P&XrO@x8fb6V3^cI!4+p*gRui9WVpbW*k^lez07*qoM6N<$ Eg1Z{94*&oF delta 676 zcmZ3M0o4tf{7Sj#Z56lO?uW0+DB%x#md@pE~$@-S7Zvi{L!SZcUlW%{$+6Vv%PBt0kmarv}d#ON%?@{M(#eHQ7K z2c(|#y>VB`U$VfH&7!wZdE?_4--nkNvnN=sVpn;;WW#f@f?MDHlAaa3d)r{@A$wPO z5`WNxHH>q)o*p4y;Bl zdOfTOLCtdt3#}#G&$T)gIIMda%d#?W4!1|m?+e$TPb|(&)AU^Wv@@tQXnD!>iIZR5 zQLWDoHV|$&aH;cv`=sj=o3CG*_StRUwl#Y${%e<+xMynamP8ANj6V{atR5};z}O(! z;9OZRzjbR|mxu0h6@`G>fVDPT^0+p{q%cl(E)v+D8*o=&Lv-4IzhisAQ3#Ahbaan3 wVZC_Tz1HTv)0m^e-^((7J&z2+ahL8Gi%-002cj8@B)e0u)I^K~#7F<=8PxELRwZ@popHd%2y3+|n&f z$OZ{$L@@bK8c5LALhh%y&Dv?XjlG>BNv?#N;NBTn6P%RU-+@ervPNl%DEg@^5mI^<3#MJUk@n|5V3#w%j8}3lRH_Gp9 zNM!2O5}A)iEq{oiz{p3LM7>%#!c;p3nr23{h&25E~U!YnvndzIu-U%YM&B&Li+Zs4_2r? z@OsuWd|jdX>-^1ig-ZKWxSFqiSfTo1zWQl}>U_RBUw@(c&+ZodzT@Al!_C#vk<#%& z+Tr!l<)zs{sjw^bx+sv&glw_0u+kot7e5NA`eN8|%f;}qSga0DeRA1i3vlU^tWG^! z^uD_mWwqG00eVFNmK|32nc)#WQYI&010qNS#tmY3yA;# z3yA?Y$;+((00Z+$L_t(&f$f@Iixfu`hM%5Y*Bd`!@xn#K7)K!(6NOzg*GdSikqG_` zFU*ZUz<=N$h?hcwD8!K5D+-GrAkh^JONcD1#7J@xbY@O2PJbPzrtPlo>84)6?EbN5UGUA*C#B$en(wOW0_R^Lv12Al&<0mrJe zox&3EGjJ8SpMPbug7D#en26Y4%lo}wM7|S|HR+=(A{|%uq#SywdWJRE{{AfcBNOcz z^9|03$ORGk(mH%548EP1NVk36+4uRB z6+X0RGw_LsJaPm&Qoj4H7d`3sqDPL$fbcSM3cY~WP=5>Pp`Q3Aun+at)1{tVT$tV8 zfUkhZ9={^zR$BCwYj6+n3(!VCA5+zNuNx+O88`|2jtcJb~sH44?y;BR0a zZ+z!;^MCB_?L8%{brBWZi%K&ddMLk(?l^(`w;dYOHfD~Y9%1=kZs0JACp?^dh+ODi^m2#ahp6$?0MWT1d;Zi$- zyfa06k<7N(Y-+-G$e(Q$z3Gk8tyv3zK+eNCj0}{!cc(cvDwsw)zHNv(aWyf zD5)Rgxg5HwC?b0pjZVEV-ou5VZamx`1)~~pJGJUFfTD=(De!>)1fm78_kW^E@;2kkV;Ri;Q#7r!LbzKSN^i6=@3;bd zjV8{f8DCfT6L_cb1V^(V%}v!FmI|rbVMR|)Qa(d?di%vIkI;v){US%aZ}4LgxgsJj zJc2Pd+PrY>AIP#ltc2KGsy+wKqTY1AO4}*iMK=L_58TVLS!GMrs5Z~dqFIJ{;6MxX z6E_F!B>VgRFS<0fiY@@$LIp3Q@iau-JooP31mXV;u@i%|Bbo#x{{gk6t@ga>wWR<6 N002ovPDHLkV1g=z4EF#4 diff --git a/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_tab_indicator_mtrl_alpha.9.png b/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_tab_indicator_mtrl_alpha.9.png index 248f4f8604de1fb8a4eacff291340295470f7ba2..eeb74c8693ec012e9fef19a68979c97e57d7185e 100644 GIT binary patch delta 76 zcmeBU%$lI$X6WhS7*fIb_RL1n1_puF4O`yXe<<(V{E@LX!996hRK$(r5nym*-fZ5o dvK#dV`rkgZo_i~7dw~H6JYD@<);T3K0RZ`9AqW5f delta 112 zcmd1mW1OIp#aZAHSgI0 L)z4*}Q$iB};-)HM diff --git a/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_text_cursor_mtrl_alpha.9.png b/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_text_cursor_mtrl_alpha.9.png new file mode 100644 index 0000000000000000000000000000000000000000..08ee2b4779b7a96aa69a461fe4252eb5fc7b446b GIT binary patch literal 86 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn0wgD<^cMmtSx*=x<( literal 0 HcmV?d00001 diff --git a/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_textfield_activated_mtrl_alpha.9.png b/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_textfield_activated_mtrl_alpha.9.png index 661d5f0a8d57459bad107e2b0e0f92ef823f6f36..4d3d3a4d05bf3af555900fe405607edd22ab9765 100644 GIT binary patch delta 81 zcmXR&ognGM!oa}bW6+=qq;x!8978G?-=1+4WKdu@Z188coQ%}B=v(#Yw2#_f*Ktq~ k;9&XYkUQnk0nQIho~t6Z#plgC2-L^m>FVdQ&MBb@026Z?*#H0l delta 92 zcmYc-m>?O>#=yYv%+g~WkTUmlaSW-r_4bA#7lQ)_v*Z8&nYw&ybc+p`zui8zYPoa% uea|@0qSM&boFyt=akR{0GJdV9RL6T delta 97 zcmc~Sogf**#=yYv%+g~Wkh1Y~aSW-r_4bA$AAzopr05yss AdH?_b diff --git a/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_textfield_search_activated_mtrl_alpha.9.png b/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_textfield_search_activated_mtrl_alpha.9.png index b6efff3096a1632776dd09ee6aea2ea042799cdc..30328ae1d2e01163f15a2f10fa817c46bf88417b 100644 GIT binary patch delta 62 zcmZ3$7&Ae|LfO;BF{FYqnW5?bl}3TZD_H;Ws~>jbWlq#$WNSN^EfKm|m|?~iokuC1 RCtVqUz|+;wWt~$(69A$66-)pC delta 130 zcma!9z&JsrhAGM0-G$+Qd;gjJ3=9mM1s;*b3=G`DAk4@xYmNj^kiEpy*OmPqhbWVX zQ0@`W2S6c1PZ!4!jq`6W9pq#%;5qEDGUfl&yQ(~Im8BjWNNBupQjXP9B>Ih^+L98! fzva&wOy4kNb+L-oF6LDLYG&|s^>bP0l+XkKCa@}g diff --git a/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_textfield_search_default_mtrl_alpha.9.png b/eclipse-compile/appcompat/res/drawable-xxhdpi/abc_textfield_search_default_mtrl_alpha.9.png index 2b253fb266b1af136625ff4bf3e2ef60779bf08a..d4f3650622c028eaead94a59c3c2b77c3844ce46 100644 GIT binary patch delta 67 zcmZ3;m^eYjR>RZ9F+}5hazaAF4}Vn-v#zKI|5qd)K5fwUKZHquS$YMt3)8;Z< Xt-EY5z_M140SG)@{an^LB{Ts5WhEGr delta 131 zcmYdX$T&fzmMO{G-G$+Qd;gjJ3=9mM1s;*b3=G`DAk4@xYmNj^kiEpy*OmPqhbWV% z%;faYWk4Y#PZ!4!jq`6WZ{%fA6ktAR`0LopKN*LFRb|;G$J`O)0qSP(boFyt=akR{00@;SeEna*S0GIgEQ?@r2P)zz3GxeO zFrIb$_kXUr|Bf)TwXD3E1r(p{>EalYaqsO7MWLnuk=8_^a{`_r&DIT~7I_Rd#ihWM{dxaMGXnX1g75I94`|4@3F*sJSoqK+^I1Q-poTrOpNX4AD zcMXe#9YtI(rsoLd9@kDVed8G##obx<@W}586FE&7IRmDA_#=7GGE~+w3}-j^b&%i#>|Y{b9^W zof|B6Q1i3%{aaRdO)tt;`h8#jH-2q4+ds7*TfVhj5a)v zTVpr7Gyjq5$;$`!RezZF+lv3stx7lg$d%yC65z-1 zbbyJx?(g4i{puU|x9m(WE_||WOCt`=5T^v(GcG=(l*`uK>HM o*lFpu%U;aoM??US^+(#CLH6WQht2ERzJeq?UHx3vIVCg!0M1Y3#{d8T diff --git a/eclipse-compile/appcompat/res/drawable-xxxhdpi/abc_btn_check_to_on_mtrl_015.png b/eclipse-compile/appcompat/res/drawable-xxxhdpi/abc_btn_check_to_on_mtrl_015.png index f0ff1a70f3a18178f67214177c941a4ec40cc994..4e18de21a61fb762467d1fa2552baf5b8081d3b9 100644 GIT binary patch literal 476 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H0wgodS2{2-FfR6VaSW+od~?B(w^fmc<)LLV z`*xKbKVubITkN>sU-@QmU*m@BBo$96`ezg=qc`!+(+xAGNae@{-bgln^{n2ddEY8- zvx`f78&75zA4r~*C)gXc#Ck2C#gg4?`F1Snj{AFKd-LVCCIyZ~b7%Af{dTL=IPtgq z=Z)ix&W?%a(*pRvnf*P^D3$<551#y;&*&%Tsb|bEf4+4arwnJ$>vO!b zX|J(%`0UN_WH#fhcqWDWOa@P;Gn^=A+B0b;!)f!nMj?iudJT;aw9O~HXOiHUx3jTE z_J9M!lh+JvObYSr1_B`InG7e)8PBjd?Bh&OWB9a{LABx2UpzztNY(*FD1e9^--4#F zM>Md)kgVUklCtBMt>^#Ge9i}o6o!UB@zRP%91<5A2Ht!T5();47Agl+l$%AuK?*!w L{an^LB{Ts5gOA8R literal 881 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSoCO|{#Xy=7gc&WAzBm9GDpes7 zCC){ui6!|(3=9=>ihWM{dxaMGXnX1g75I94`|4@3F*sJSoqK+^IE{gU>9ePcV@SoE zw|5=$E;~pZ{TS|IzR&NPYvS$h0`4UtwyrANd54&4na}_iX9UR5I1Y^cf3U7)AOJNawM} z%k5vqA5Q%mz0Ujj{3Y%0cD_@ysr$Ny+bgtAzl3FVdTh|CPu1rc>(9N46rZ~5&%GOh zYvz?kiaq^)tVcofpQyq4z)Opl?7tT8;kRagvhKdms&P#JHtU@${>h`ztP^R+Trh9x z>2!uZ;i!L?j}(WU-*rOdsedK+3`PszQ=cRoHZRee&uG!*`jh8@SKUh8l($cf8@O+l z_E!hY5{#I3p5fdk>*_a`lr6k&vDr+&0hDw+cly1qDHH!wV}`qW`^BqS;!dSA{Mz#; zZjE4t)_lelwf}3@>{R{`X2%?G!=Ewp7l#ed6gE!DgXUXXpT*fRTX>(~*d}GpbRJ|; zrzO*SAg$eL*dzlq#@r~KW#^Rh40b1{2tEn1W0shBK`@88Zhz@do`e)9H-l;IpCla| zlKKvK13hP8==NY`4V!^tvD<^SK-w_a?ZHMMt*og0A5Mk9TTFJKLG9R znBuK`Vqp!NfZ<`mCqZ?e7}xy#|Mq|7)9VrsJ~RD!_?c+}AG3xGDw=bY;U3SqGp?U@ zZsXzb#0@z7JK~#7F?7@Km0001hp#7;AsR9510001( zJ^N)*Cy3)X{uYCXA|eJg8Z;b&)oj(a(G5Na(`wwOU^8qNE?EWhmCKep4RYb+if|wY zH@`k#2D#rkGwb2&^8n_%v-6J`OBxJ`NZ7FD$Qgy=%#ke{5`Q9wH29N>1T1(#T@EiS z2q^MLWErsJ6ZOMe}_#sewRGJbwSjo+w| z7`vcFO4JR5e@CBd=(96SggX9_H!OXRl)08NkA~$ik9P@5+FCV7tUGH>R`IE-RddEVr6q??IZ@BO1MXAcz6jp8 z!GG=CZ4H1x31d-7G0I6J6H~A%rIT3=t`JiV$UKEHidZ6J@)KOCtB$ zn#q#_Lu#_FqPJB{Xb7yMO=&U|nG@Us%SG#&PBj6y@qbqLWWo}3cq$05h2lKl<^bsN>`JwvHD79UMGhkm0 zc%%j_RIso6ys&O!!b=~{Bfxk4RJY5O(~xG}2=XV&ZXYGQ$VUpnM>cXoz(dRe?(F^j z&@rJh_BcC*Y+xrXXZDLR&`TD;bpH5e_ihMDV@PHdflQ2>1@NY z30y`x0Y*i|1w<4=hd57 zq*}5I;i>1fT+dXf{>4BR3~o_gIa1YFAu>-`_ht4MlTy8~rLdQBT4}HWAc(eDXWS#z z%^58RM~?bC*zthq5%GiHXL-(d??Up}rd6N=XN2 zGapbb7k??Yk;34YsX3OkbB4=nP7ctQ9-)Kq4ZkKwS6z{_FmrBgR6d55L>;TGU}RdL zO@Dv4x^xs>pd#&|_8x8`czXyA@lfyJfNOSbWJKDW`z4l*JTb4qyVQW&MnT+QK0^85 zx9N9cMA%K`+z{16@TVUHPa&wh!O&$X??cV=8G*Y?Wlp@v!YFBM5wm7%uEb;ZYR?Wa z;xQ^ndrlM1DhBfnwvjoBQ59ruXS#pc+{mw22hij1!+CFnHQmlE=?{B_-br$V?vZJam z4x?Q>vJq3|JT(BiqA4VqI3V9~#2mZA8ZP!f5MHssrVg1lLHL=Gc78NqYjw)9`nXU0zgDT&IsgCw diff --git a/eclipse-compile/appcompat/res/drawable-xxxhdpi/abc_btn_radio_to_on_mtrl_015.png b/eclipse-compile/appcompat/res/drawable-xxxhdpi/abc_btn_radio_to_on_mtrl_015.png index 44028af07b6c34ea519c66a0ad37c309479a92df..c11cb2ec658905996d5a1ecb86e8d4c6caf106b0 100644 GIT binary patch delta 935 zcmV;Y16cgt4YCK28Gi%-003z>sXzb#19?eAK~#7F?7@Km0001hp#7;AsR9510001( zJ-b(Fq>BSE{>X?BW|$^TKB@$g6kDbXxq?Nju@u2eP^@Oa8_?cDg%sPRvlYR{X0Jdk z)>qiDDMCUBEE{C=fBW;1L^CrdW;c-F+HAnphd_Y z1^!7M`&{z_nWGM>RtTmrg-jD_Qk5hcsl1oG%iJ?9bE^B3r z13E~IbvR&)HBsgsNuYbmtbrp&NJ5P`Vx?thAv5|(n}~oqMO?Po#-&J|fQU9fkr}nf zu%hyON32bF&w9k}QkJa>-xI6jWIedCSZHLW4Loc(E*mJS!k$+4{cW5f_hdmhCXZ z(zT4Q{xNYoHZFx0OLl~4{UIO;0e=v!BbKPl$nf*Ol7E!1hA9|PW=XcVH@y4-NeT=L z;hrs);sDV)CTYir)&Wc4(lPA(^KfW##w||_nJ{6<6Sthv#9O21{^Zo zC8Bgnihms5v_CnE-3~X%2fJYhyR0^yZ#bl87f}kabGbu4(H$;!A)>TPYTDZW-^XT$ zJLHqyv4f4Ty#sAh;%T2b&at~e7U%}MbL~@#M=JKU%dQGGhsc5*VpGvB&h|;gwKD7@ zHaP~!f(^)F^Qb&~O&YXMoF~{^Au)7?&58C|HGc&KM5%^ZiFYK1-YH>LLzD_6Zcn@C zx4A%K>H-VxJHj4`3+Ft19J)wMb#dlAki+z^z#`0=NQ^Zxi_*U$dr*c9FgrtH>=v`S^4v3t>nTGPF?&K{>2(MzZg-B@J@~gc2oEP9E2Q& zU4~qTJ&1S`^C;?B+{cKoF`uJ7-{VmjP*PM@SXx|OVM1j_X-aKQaZ+_w zd0KtmfPx7PBPwQe{tqdoXGqDEmNB*2nIPu$ULA4(0000004`zx^aM-qrl0@-002ov JPDHLkV1gkkt&IQx literal 1758 zcmZ`)Sv1>;8%-pZP)ZxMq-tr0rgq~{wM3BGLu^B*)u6FdRYD1J)H;r>bgK4@XseCd z(;zfDg2AX*rh{s2KSM1o75+K482P6&&+~Ba{a(KF-E$xAm*a_bl$BPM27y4b&Q1o(-!;!AYX zb=LPHy1Tl%8z3b>=p>2J)sfgx5J&>=?11)3pl<#$7J0@|c@P!Rpp}FEz2~>Ur@+aJ z>EnTqtCCtf%R^cc^sJFp@FU5MxeNs_UPJA}0Um2>MW`WQ6j6J;D zzBpXLC*)-*gPXu(FNHN*p=!-RHS?bR^b=t7RNo5A?U|^_NYy&yuT$TH+#tH9DZON- zVl!hwy{RbnY#IIF^!16AH=#IiDXBT!oi^e5B{3_8ov7W+Gz`(VTXg^Tz51-VIOZ!AgjC%6%B>iWY-_^7m01M4I*P z$#slB95A_F?SI~%{!`xo1df>x zR-u{ezCK^y!bJm?fHqOxT!*J~H=H~y6ud;m|0!&LdxxeKEvegjfd)v#6ZE`B>gSCC zrP*bVKi)H&-s}kX{KctU@?yKnBiFK>#E_D4w`?PLPN% zw(&4zXWdw2xt5S}I)+q-r@FRGW(_DEa9aM17V|%6amgA z+0Z?h4|Ev1dr380ngALs^!)(&OMSXYiHA~Iw~SnAX+AC!EZl!rb>x9SyLlL;&&hBx z`y&-W8yEyjE1ABwOPP}k?jY>XX^g>|!(Xha@y?LStx8XHBlT8#c+mKy4?dX-cgmlT zTVxb$25VO%P!m(x6wGy_qfv)_?wQCZE0a<*@(CJp6PtNlpEdSeiWU$9XN%c0$%VKP z4G-VlG@e4AxA@UHS-uKaDNZT%N7_Q3A`nnLMoUX3#oP{3$9hYR5gB{Eb?kRF;h?bm zrIV1qWgo3_KbS5;F8gix%@u27AT1_%b;(0Z$+I~VUOJA%k9IA=&DNC57)Y5>0ZNv? zmt0c-&%DhHre#my%HXmbmz1y2LxGu>qqJRHT>erUy?`DLnpz&Mw@tAytdp7y?GF?@ zErrVh4@pN+)!kGjpKsf&&rPPtQwk{6!EWd=jK{+K3VW;$W7qC34#+3rA{&rNpr4JA zsvOGFewuB{7lz#_`MQzZxqqGeJwGeQ-!t)Z60>UyV7#B7_BKs5AJ`r*Z|(Qjgnc`C zck)JrmnrB=U6~YrkMfV>N~41J^E1!GL266;>$WM~n9ok=S~J~UY)wJ0C=EYWg4y_j zJrGw@awXAy|F;rF$|j2~vYkV+x+g{`x?TFfx8IuDF5fWS_!qM``}L zf11s?U-GGrH2y&XxFhY6*7>Z?4_8!|U*<2tD=mNTUy0b}-Mw)F2<7IweP>S44GbA& zO<9l08<2Y6>bXSJ2YN@Y{4W*{Ek(V5(s_DeTlLW9fo_-tDPkgaI?to7MfT>@g=Fd* z_75rp`Y$Vbj<2G#^%H5{%N7cX?%k+{{H6A2>kPzCmAn*0e^l@E$W}@rC5n=PXxap{ q$yGpm@=#*PrT=bpQPsCTP60ba<94czy(2`w3FM5yIyBkg)Bg|OlR2*d diff --git a/eclipse-compile/appcompat/res/drawable-xxxhdpi/abc_btn_switch_to_on_mtrl_00001.9.png b/eclipse-compile/appcompat/res/drawable-xxxhdpi/abc_btn_switch_to_on_mtrl_00001.9.png index d3f2a9a4d87f55cdb04f1644c7f5a654697ad3ce..e075ab8ddaee1a01e725188a41cd3449a9b53f68 100644 GIT binary patch literal 2548 zcmZWqdpy%^8>f^*%$`XMmE=&)hdIn?s;!8eS!zZPrCK~=m@p|J2~nAxQbLd3S0PGH zMH)ur99s^XIV^KF>A`cq?a%l6{C?lxb$_qxy6^9G{rC}R#sN{eE!ehw(;8v z3kzpwX8{j50)eo$wg%{uk`j=-xVQ*>LqkIzj|ZY(zkUU^b8~ZmOiN1xC5?@Z>+9?N z{rw<1I5-H723xhZwt}UmrY6{GdV2c){rmUs-2)*|2&zB`_&|)4lM|?AGMQkxw6sK_ zPy`_X15N}yNXX62?d$6U{`mMfKrWXH5C{Xfy1EJwNRs$%z!w-0Ha|blX0w4XzyOhC zGFcD;k_1&O77H*RKYj#w^5jW?Kx$Q06>yZ5l?6G#@9ypfh(@D<65s$6h_SS^1X~Fh z!6rZg&=wgPDadSUY68)Ti3x!E`uc))e0+SCmzMz(6B8pSkBf^FoCVqkytlVEm=eer zGz*lINF*>)5E2&`udAyQBqI=ruC6Z7IN;6A&D+}AK+AAAytK3wbPY%o6O;1ta=|2V zI2?^e8y+48GZ)MaB#4NJ0Q@vHbQ*jbLtP!+gtoVZgm>%|*|l3#OkDjeYjL+X>Y0b2R0-FAf?bL z{R`6Zu#&y4vJ-MVxWXR_imdkkq`(O%`NOlbhbj(+?>A9z3f`y3l{xZA)nZLqGhfMq zr=k^qz_7=4T`$?NPRDv!!+~qyHLvZxV02E`aRgOwl7j6uMkdXxp`YfQQi=tlpb+i94s$-ZmO53JRmn0^!Gf85k#P)#x0S>- zuUaY2M1rm9+q&b)ipQy@ztq)Qce!~9hz|I^`vXTonCqK_^W{BwCnN->t?{z+^-Q1z!f;W$!c*7-)%Ck>CD-?r*@QGY(t=!-OcljD zKNGY4nu5w10}^X(6k|1yeh7U|^HEHw+RvcV`1x{1!xvO-Mzl{JQmLG==sQe5Y=+PO za+VjZiEJ?l%Gr}yi^w#(E8}7GAtbIChL|dY<-ROLP6l1(arU+pwTrG8#$k`PTshe7 zA&&3GQEvFw(CW9SQGeEGbZ(+~@ss%U!&?r;lnB2X@|Y{{=; zwMo%l#tZMBDH}E(A@e%mo`IaCfpCtE!%YQ0F{#_x3u3dlc+!DAm!zBt&PY2luj5}QkY-N{X?oP-Rvz&^{KzE!-PU$mB3 zCSJ6oY4Ryr@l*vnRo?m8vOI0UWBGC>!=^YfBLplnjS*KG2 zX!|uvcZ@(-5^65JPX4sKZsT%yo0{nKx1A44Dta9A5P=O@w0F4tafM8hxfbt@pRt+x zlM~1nT2-9KmESH0bRh`NZbV(|5s7MU9zDTgs;1gmn@vp3Kc*A1b$s7&{PJ^*)4|-r zizF|?FS*Jw-HpJ&$NL;|>9S*fUTRcby)y3xwCDJVqikYOh!}k9Q5B}DN~^&D8BI(r z#-{7QaNZAV6`=OuZy(_g&cg8#fd+Hurr~Z{i9|&G$(L~N#_~JitjNA=#>E*Y%xs-r zcRCVDl$gNHOWg*6!Wkn}`d4~r{an~z%zSJuhY5j4#xQ{bsfx@97n6 zhl*KPC>U-Q4Sw=YOM)J2A|raB&k#ehaIuUCE!e17y9_nOrHP|stMA)-1G)m5^HEXRp-}}#vl2*sGT06|JX9Lr5Lu5} z+vuksQ;N{*kWIfTpBN>nF|5N(YEq>vuQ5@6^WPin9_WXxWa@-S_Ul9VnP-oc!EdW) zHH`if`<;B_*Xy6wMSuTMsJ`b1taMySB;q2zN1M4AXJ(gp5Jka{`eAQutpsPO2aj32 zFS3hZrcQ~xin}}PO){PyUjt+pS91WvQ%I9Qi5`uG`L8mUwKXE9Kb^XC_) zPg#wU?(oi?^AMJ_lbR&H?nsuZEz3^$uDU;ftmK%82y1rdhM!>5%@Rmvtq;xc5B<-- z{QG6`%<(Kv>ABu(Ua;$BpOodl%$lofz96FL}$6aH!InM9dOj+4cd!?>8I9KdTg&eMJPdZ& c=KE}k;B;)$vVEt-!0jt!hjB!g9rwNUFH804M*si- literal 18883 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 diff --git a/eclipse-compile/appcompat/res/drawable-xxxhdpi/abc_btn_switch_to_on_mtrl_00012.9.png b/eclipse-compile/appcompat/res/drawable-xxxhdpi/abc_btn_switch_to_on_mtrl_00012.9.png index a3caefb7f4b266021f8926725926cf0cc057206e..25274ee8a1f02c7549e64596baa58133338e1257 100644 GIT binary patch literal 2963 zcma)8c|4Te`yP?CiL%TXhOvY}WQ|FYCRr-XASQ&elzkbpWlPGECge>tCHpWU#*!sV zyp!!kBx@#Q%f4mF_mt1)_xJDqJkRx9=bY=l&vowe&-2LS>Ln;Af)fIPKn?V%nab)zI_8p`T6;4Yir}<<6s7azP>)l zee&eV`uaMBLMbaN%gxP=kB`52@sC@u-RS6Oc6K({bYx`2z`y`_u&}TIbr=i=6bjw^ z8$j9C)^?x=DOfBP@Q#iSfU~o+06}qkd;8|*X21sq1^`Y>OaKI8fS@=);0ho(1wc?A z;Qs{>tgNhnA*crY(CPGof&yJ#T`&WV32=CLxUjGg5HT?^;0O>9;JhFJA(P364<9~I zHZ(N+S%W~Nq@;kW0}hNKk;sEB4(c4(1FP4rT|2NurBcBVG!`Hn4hJpO(a`~|1Kl`C zbaHYsH#a{hcz{4KJv|LL3pPeP&H=&UaG-&JEF3fRiqCHzTr;R`-+@5b zMGUa#&F(S{C!4woUE+)G(p0gEvt%Lk;7&y}OC}`ii0o;v^n_(>sz+-{CZL7H{Rq-*no1 zl=e;D7SqyQr}3P4r!x6rd~10-tl{cEGq>vEX#yKN@lj!tahMNkZ`B62m{K=51lioI z=O!M+_;pDs5Vk9#Rp3vU)g!Goko5b?-R)Fs7friCw9WnZ{nes(&z@K0*xI?Y^R$aU ze0_qeN!{Rl@8Y^~Gs?S9SmKzZut#OHTORV^A=+Ns8EHM`@;#-Zw|XM=-$6Oda$t834>c0y*$O)=1G10;%< zY{{2ghK+8;S?&7fPV1N20ip&FZ_8B2WZRIJcHC0r8~W{y4OMZ0!)vRemj>eQ61QRf zc}O@**VT&J-O603#`YHOss5PH(y6aXM!fSKk{tsPSIo|Rx>nuHWIdZAS*`fkg+Jpv zs?*$q-#td6X--J^Uj`B7ThlNYEm-W0x}nJxRo<4u6|%&^wmQSqWg-n`7z$+-%28^4Ml~oVwgw+Hs>F8UIKS9gYg0B-f(gG`*4ykj2vg9EEG!WcVOedS zwq2bQLg6`%54Fj>@8j%4xN-Vqwy(Bx0LeoSBHv{bYO_DQY${=<*CA1w$BZbsXig|V zXRGiun_bHLM9M+2%VisJ@tBJVAFf9M0eVhW{RS$Qm6c8ZsS) zVo*@*nKH5G^1`AY?v%P?h2ktqwC`uT!Fqc*%Aa4BrtfNOre_$jMY<_(TpC#PLbE*J z{&D#zl&&ew-z|+t_y_w7N8$>?to6|BRXbrU4h)`=dp@`-xUv#)JYJtKkP%W}w%Qo? zFwd39-oE?5PgI*`gjTDyclzLQQ>3-E1_#@IV`Czlcur*#?(4)^)K^z)m5ifU=vorm zZNlkFP?5+|O}gC>wxj8yN2;XZf2KXmbXxjVRIiiXe_6*Np}gNkosyM&W{qlqHdjA0 zSn%4Zk+1V}?hmhOiyPjvh5nzrD6w;$hPCPmzJs5iwTLO!T1Fs1YFOqJ0wQ`Td*CsU7=b>*=wpDlheiDI~Da-fY7T>)$&go9(uWK~x zkZ!vXLaaJJzFHQ8BxC z(ZYtkR~wDtr=F*@+CRSf)__F_fpFiSh%fJ<)nV^Z+*D_&9Md!OcuZ28RlRXoK-M^U zTduw?jK>ACp(`!KW8iX{v$I>!HLU!1FIPRkF$BjAy`@K-w0r`Y_|m%i%Q={DC`in6 zv4p#b+vz<1$AbF(pOG2wxaA8eq0}9DzjRHN(Ib_$NNrXr-Sp6(Xq@7cQZgcLzRo?04 z!}Xi8gG=DfYp;@@?RqP;goUOuC-rlOwR~8vnBXny=yh_`8$y3!f}-y|vqHxZaFHyK zLz(H9_j19IAN&a`&6!EyXl03uE(8>Ycvn0-7%vn!$-x3GV4hU b$}X2G+J$)izf7w?e@X@yuVSgXc9H)BE$xS> literal 19168 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 XTYAGZlR*Msg8>IyXPaYIzT5r_zF5dP diff --git a/eclipse-compile/appcompat/res/drawable-xxxhdpi/abc_ic_ab_back_mtrl_am_alpha.png b/eclipse-compile/appcompat/res/drawable-xxxhdpi/abc_ic_ab_back_mtrl_am_alpha.png index 70c2040210887f654dfea3b13ca7758424c5f070..16b0f1d40912926dd6d0b4e080c9f6e5c81c77ab 100644 GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD3?#3*wSy$21AIbUf%JbI;I*&aA)quzNswPK z0}pRvQhmeW`Oot}W>tB*IEGZ*dV6&@Z-WC5OW@~?h5tpB1!HPtX0e8kAV@S4u!XFz#{KG|@*4U z8jvj$wasDJPO33bi+E&(N315Rk;4cau~R18YN2ra6@XPzF;mQJl9d(|rzi@=2$Ud<(83t)lvFlul%i!B4-6mW z6d|GtvV^2OvLU%cbr@i#+a-vRKw!tQ6ipKaDMRCI1jS7lDvGJPwydLS9sh3{yIMzs zoe>_bSr7V_{S6$!n7G9yoAN< z_L2l)BXJxGm&Z%GyqMKYVVEW3V>c}BB5jn}OJbCb!Evv}ZS&wBi;p2Z9?a^tkQuCB zimI%{@tL>+jGM;VpNgeD3eT#t5|rik%mmc7%Bmb~l_QA9gOmqYPLNW1MXEpBatG0Y!y*X@ApQF6w)cyIBx_dK&xsOWS z)2n059Y^=XZ*V+45QbsXs!N(4h8B@<@KCi|`ga&AdVsHs zED%jhJoY!9BF$un6#PCYBuWqqgzKIg>i`E>2ROhwzya0)4zLbzfOUWatOFci9pC`# z00&qH)CV--IjmJ$+R%rkcrVDd1|I;vu@>$(zqL35*yCQdpMPwT2Yg}}HetvIfHxT- zFP}{~<%9bIRtus89++dPUas< z@=E~{f=YflAb*vhl+OU95Y+NHfH{IP{@ x_c*|M94KHt4zL~vSdRm&#{t&k0PDGWz%Q}RQ_;hgcO3u#002ovPDHLkV1g6W_dfst delta 525 zcmV+o0`mQq1@r`va(@BrNkl%Kp(cmVjt(RN);J_LkUK7Rn*a8d!*d^TatHxp{} znS}RzBcXho1)u9qAbjQnz`_Sya2F7^^9|3fWivjZIp6vz#3c~&tpFy0l5YpF2&DWP zK%Ox5&#wa{Oicu0el4JdK+UfQ)Dp<~Er1#VJ--cLB?$6c0SVJ))MJAn$!`ag5=8k7 zKnX#X&jEZR2!HcgfIWgVp9jbjr1?xh?xiBl=K{(IKs&Q!?&-k6F+@XDtV{PIZz z&wL7@e5*x}pC`uK;+j0C=wec&`9>uK;+j;Q>#sy-Ba)ZPCpD P0000wf)5S5Qg7NKj$1EmC5w?eMFJ;tT#a<13rsG(|otkH~*(3afmVnA^ zoA}ECU*F&1kvBP^ecsrZFJ@+BW$DxU>VKaPxTx+^IdFj8VSfW>6`Rb8TIO{Z%oE

      BNNM>e{m5rcW&rseR7|B>cm_Xh5vC4($4id2}-*Sg$fo-icJ+~ z-*IVCu}s1;*M5rwUft6e96rh4eg6okmqS3op#fwFR>p(%oXGMZtriD-y5AKxaO+wf zW&9Sh>Gu;|z5t1n?>stLa&}I eBr!cwf55%R|43|^{R>G3An8G*(1o8fuTx`fuW&=f#DYekbc3yP-?)y@G60U!DETXlC=k5c5q@EXwAqp52(kKFy$;1tLZ9jTBqNv?y=A)7$q01l10TlH^V~D1&04kHy#J8?_Qh}R z?=F=4{6esDPW_RT>7Qp0(%f~2IO-kSeS_t$F&!{<-`WW1Xz zr^d8sVR%`Ct8&As(8C91FI=Ae`^HS|tII=K@0k|w|2KKnm;RLvQ(j#BD)4V}TU2!3 z;+bu;tlrw~lq*|WAH!-^xOO7juArdX$97(F`uysdrRagV5(g?7>KM+k*uLbPd$bm0 Nx2LP0%Q~loCIHWh&>jE) diff --git a/eclipse-compile/appcompat/res/drawable-xxxhdpi/abc_ic_menu_cut_mtrl_alpha.png b/eclipse-compile/appcompat/res/drawable-xxxhdpi/abc_ic_menu_cut_mtrl_alpha.png index 13cc0fd03e768199e34167fa0f6549d6f511b8b6..4b2d05ab0cfff9bc6ed8108d2872a1e77c784cb3 100644 GIT binary patch delta 894 zcmV-^1A+Xn2$TnqBYy*1Nkl9EOv#$Vk+Me>UCJ7(}$#dnnSqXQAj7 zh(^7G{+U`4_ZE%1DM&ZHhq_b z%FOS3lS)WPNJvPqpqDxJC~-}L2G^9>WtJXN?O*m=M%d$qW`ES!A>Y{oU2M=Gihy;z zP8G;g25e5qb)vvae(+zpWa5c~`9$Me0(q`5aTIbbj~^k>MVbH0F<$H9TLK$AhP773 zw**FL5C+ODFiM6Dqbzbt7zh|{MSNRek1)5)lXl*dra+xAMSXl*pqHC)d|ox(ZjxJE zs&wn)TLN>0nSXz9%K~9$^zq$gUqEHj4{n;~440xlz9mq?Wg&9oC0vg5@hyRCTt*|e z9>b-gk8cSyaLGh&?%@(>iD)m4>ersOg8=SYXV$qWPkPX?VGtB!rW3I9lCf{2nch4 zKE5qLzDYDVV~H_5JjPk(+}K6*9p4tPS2r^hIif_j{Q-ym=~ge$`3l-|mCy9i&%RP2g;JsK z{@&b1UqGNB5cq(BLO~E;p`aI7#XzMXj;~h`#1|+?1wIl7 zAH4u>U+5SA@SU$L@eDiud;Ay*;=a(o99r>X+b}qo-C6~GU+8b`1Vi5! z`XnF1==(xS1$|%Wr(hKJr`2sbz3`;(3&|ApeIb46Pu~~X)=swdeW7XPa9-aRs*+Wn zFL&tsLR;!15^Z0o&XE3;N7)xzZOuWIsxMR`)2g#JMPKNG=k5CvQ2f5o1uxq7HLUo3 zq0&?Q_S@ALsR07*qoM6N<$f^BTHP5=M^ delta 1051 zcmV+$1myda2d@Z_BYyxOV@Og>004R>004l5008;`004mK004C`008P>0026e000+o zoVrmw00002VoOIv0RM-N%)bBt010qNS#tmY3ljhU3ljkVnw%H_00XB;(z8Q5=xVI2qj3CKtPJT z03vbdVh}b&`O-uY?9N`ib6ZP0ZqMxbKl|)>=ghwjPHTUh3?Ku@05X6KKtDhavy`cD z#T|ECQDKi6x?2Nam@+qr#x=VX(hbnT26u#w2J7V03Q*vbIOBxDGy=TfJ8{P)H+S}%9k&pF{u)gmLKOPUI@Lwk|+Amtb7r`p64=WA*A zX61_jW_*__22Nl0#ZH=)F9PW1+H`)76?j9&XkdPm@z23z%I~-A^ z!97(D*<_N=1eNWom9OG}Lk_`}&2OQX_8{Js℘AoB2Q9Rgv35Klxw0t0uFRmUvoE zDXk#rJy-ciFMaImL{NRf#|XVRIP~lM74!o1;ovZ!vyk+b&_4YP@JZ*rpi=&-qFtLM zfK`PXPYVDg#d~MN03{9Ee}e!e4cmW%0PjKh_Ft=C=nud6#%C6J5<~tw-47TtexctS zMt{oJ{){B+7YZA1O+4nQ@C!xB*NULVFXSI9wi{c``h}w88*VLjNEOeD{pRk5g#0)5 z+v`dFLecUK9dIP~3w=q$5tEEx=q9FLNb4b=oL}g*{bN=+zt9K!2i@lULYk}wa(jXthQHR9Ts#ya`wmMjSAgc*iejdf|SiAp;P2 My85}Sb4q9e0D>)eI(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>XMsm#F#`j)FbFd;%$g$s z6#VDu;uunK>+Ow$yv+sztbu-wNlah3BwTa_y~GvDnb?2qRO6`O>I#><+%SL3p>HZ) zIrW@CZE*02dCIFNTQeqxuRbKE5WL>^efH$wEY=AxS1vZy*v$B%blV(Ohn>>%&O4rZ z%wEE^R;{jqpJ~|-MsEQF<{uw9dOtGXQdrO@AHY(#c=bCmKBIE36*+T`tZX~{*1lwO z@yz1gj!~hp8~v4t5Qm@z&{t!O(|&g0=nuo zl-@#j1$7ixrI(Qe$z6<&`v_TtK*(YSoq4khQApxBCr-}ddwlz5?EJ z$sw(I>nGqZhxW%uz#DEkv>R&00Xj^HNii>?OO+ZumYA0kGokGUs4yePuIRy^-e8Gc zIU!|RK!tPc>+Wpzv2RYr4lu)|>dsajmqHsrha8t`F9^tKnFFS{)!SJc;MUk25aZU8 z#{JeiR=Bk=2O^~4Oz2am&VUuJCFX$r_P;x3y6+D_009ILKmY**5TJk)ll}oDlMVt2 zVW6lJAjPK=b3lwwMdpABJ~c82w8`K1EmF!BYyxOV@Og>004R>004l5008;`004mK004C`008P>0026e000+o zoVrmw00002VoOIv0RM-N%)bBt010qNS#tmY3ljhU3ljkVnw%H_00JFJL_t(|+U?uV zN*hrW$MJ89m{3P*3rck%bx}&8HSb^$L}}Hfi>|uRS8(A|lz%8$m9F{*T^YL7mC}ka zT}T%Np-_td7O|S+LJ-C<$;{jvGnC)SYRGWz`OKYr?kr|DH)&)Z*%ia$1+b-;VOvUYK4@3IV-=}`U+q2zPSoX17{ zgc>6;&O72I$A7*Cec-Vlti>uHMp^YYsJ|H)z+br}Ci`I+}Ltl`JP;#C3Cv z0~@-{_1JzmW~)Wj89f8f92@itwpbt_V3BQ}J7$|mzL8nWG`9cWc}q<=eit4kdJ+N% zAbZ4&rDtD!{mT!rT~%E zM1O)Z$!=C&t)xkjy`(enjg8D)|8i9M?Z0Nt^M$Dll)uRw7irpPgE`iF+SzI;svB5r|hhmu&npURKuR(!{F$S;9mzOcIxv#way zp7M;v`zAZgmf&Gh0)k&N@>X5Rj@k3?+V$)1U$v&bk+ut3d-Gz$?Q7|xTyKxpTgVrj zu3CJ8FF@Yp!LO>s^0(*jF{B-R*6`{88G*(1o8fuTx`fuW&=f#DYekbc3yP-?)y@G60U!DE%IAg$+crx)5;S?WZ1%C_6HfEE&AIB&Z3&i?xb#2ys^8^(@-_)^r&5+x z9&ZJj4gpF`T)A6=FIV5Ux_#ksZ`rQvuM+B>-7Z?aX6ySGeWl9hDzcaA)>{6$T;DVA zf#Kt=PnR>UnkZyr6Sr&gnKQA!{ZG~HIajsyyLD3EY_7d+^NwuayMB(IQSPDjPUfDm zy4U??*Kcl-(sk3Gc=&PervQfXB#^BZ><5;n&yy`v{`J2^@y&NlMUY@ewLC|zhO>SC z;Tm~W7LbVWSLTh)bs!eQv#b0(vR{}%OoR1x2`~P0zhDP(5~f6&pXX)-G5;QzZ#bDf z{;vB2+m*6=`SllCX*$T-O-+e-X*u)w`)JWBZd)e(TWXvCdx!t}wC+Jf)Z8OneeBV5 zwz0TQi?;lzw7`G&=cW1XKFil{y%-g~_jJUY;s?&vS6A5_b+!kY4+0j|2gF^}pXA+M R@On0g@9FC2vd$@?2>`QY!u$XL diff --git a/eclipse-compile/appcompat/res/drawable-xxxhdpi/abc_ic_menu_share_mtrl_alpha.png b/eclipse-compile/appcompat/res/drawable-xxxhdpi/abc_ic_menu_share_mtrl_alpha.png new file mode 100644 index 0000000000000000000000000000000000000000..77318c711194f3aa207fab8b100b6e10f437672f GIT binary patch literal 941 zcmV;e15*5nP)Mp3+1I9X*L}Sl+&d&M2gV9A>zjHjlbMyZW{;!u5i9{liNa$$f zD5E4uks`q;UEHhnf(8c2uvVH2)X6^fF;6ygbjmgklUu+mvWtD(UO=a8qJeqxF-M&& zVt{khyv=5wW07oT*sCzHgJH6{!gj5oi9rI^N^_2F3J;s#}zL2 zlP0%$+@^V%jS3f!u}mS-^i!j-QNa|2_>!HnfY|}vL1e~Q-7Vrd%HW_*; z36i*d%cEKkXyy~L8K6$<0Z%cB+akv(lYJBuV-C0LbZ8A4I6yD&a+>3GP$LVtoA(HC z`+^7bFWUK<)s`8eRTl6Nb8Gi%-002mlzq0@U1D8oeK~#7F?3vw56j2z5XS~rq$e{WIDqAhT zau-_-Dd;A|E}}96^P)(kF#iRu%L21nQy~NqFX~b-2qP#ZV>hJe(+fYyQd^|_+AQ7e z={84Ehpa4m~rML%3 z4yqNnj$C;AEXD0XZUo!Z3ValC_pHXzEh^5Ss}smWa(~FOfFDV|I)OS7HDSxSYD83R zP$$qKqB_uQ7`H^#yXpjV6G&Gip#NL1&=yfOqV5Tdizu%x0=c5-@pmQIxHd_R4h^k%c z1TKoGQGZ*u67NLSdUXN?_V3>DA}LZQpz~RT^;j0@luMX2mFIzG5f>%fQrs?9M8#IM z2b%pz`YgruA}LWTV05WcYdY*KlA!uqiDO7295C5YTSRhNy?{;#N!UdHaVL{VLg?xR zG>VBKnZcLjuRn$47iCUe?go%RgmVdpRI`W#0)MH$Uhg9-fmf#&Bi=iCy{?hX97e3t zwMP5YM<**7F;A}3EvCanh{p&wsU(L?G&C~taDo=z5}znl&NulgSjK*?Di#n=;Tu+& zm+ca+IN9jV;WbuxgNG_4P0k5uY^0SKW{44BlRVU0S1@-$J4~_!|M+ZSr-Hd@I>&iI zqJM;_L`RbXf=2ZMa+K1}7uI5$fWd~j$xa0gYeOfG2D*686!QQqF-?$eE>jrywAJ{# z{du=x7zThCI<`Kx)MxA50&LO*1P)w)4+!^1z#k&QkpR*qf(5{YR{}_f2@U`g9tj}5 zM6dvuuq^;4ED0bzM6dvuFeQMriC_URVLn&@MEGa`Y4N@T5CZQj0BQ2R0}ul5D*$Qm nJ_A%0P(T3%6i`3`1r+cFNj5W78CeTH00000NkvXXu0mjfu?e15 literal 2402 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 Hu0mjf^@;3g literal 1874 zcmbVNc~BE)6pukbFhDJb!qBn=#Bk);goGp{Vjw}n5E>vNUX)F;K!jx1WHA9NhtW>G z#jzX$3J4cfIzUz(J0ceG+6>)g=lGz&4y;uqBxpB5JZ_!NR88#q!dKF%e%z!a4p1aRGvKivh@W0V(@S;GuVnmgvg>{%zEF|M6G_^*} zXEB%(W;iQa!euf!ToA;CC`Q5+Nf>MvkHH8Zqje9P9j!3qZh*u!$ksZbwh}Vha#hpZb`zu(F=Itp0_T7~H*Zmi%z4L`=HW zf>7!?YcJO~_zt&Gn&JYs|GkUFoY41%`|QcjgGcS6yw6wW4?Z|JxWyQ?WhR^y<`w*8 zNPxWUHy^!RtQs+XAxUu!N_aTZ)I`)y&Q>)LSJ?MuyRxhWZJs+FLTA`j*!6ACA2bfR z9I@MDHK2}yaYf3>Q?~u&)8;r}e?6^CO=&)G+!OU&6C}wHJ|uqimcMR_!@Jt@Z|4Q0 zUR;MmqS)^HErdj~dvBABXe?pXUf9q-0z4dlMK+o1UVYEZ1{LkoNrjaZbev^ek9YbC zfqkUtR$xh}$SZ7L!=@#6i;K&HCd_wzQu4a&@~?iPP}8oI+K|FQpG$L=Kbk-HAZ7i6 z+K@GVY3SK!23f9CvZ;LH&Q(JlLZ=NgzjGDVMQ+;QZK*=aH+uAOp3U`@S-kF9e_8J2 zOKdf@)z`~jWfSjD+S*+jA91^2cO7%n845~`oZn0uNNf|_G4!`698%3MGrpc0Io&MD zNZ{LD_r+<~X$$}6{$O3KpLVUW3Uz5(d~#BWebT)MmB&E%B3%OlgVC z)j4;g$JK#aE3T|{b$*`LRk#FVYZg4Hu$G?g;+@G})4DqIh$7?Fl)J;T#kD>Gt$7K( zlQ*k_<13 zTlHsE??8W5V)`YLqVD8x>GDGsio)T`BGF7@`=0Lgf|aDO4*Rw!|EIKNc1IhXsDI6h zEWLE+>AtegB@X-L#We{RSDzU)ca;5}vbu9#TsQey^3_9UZ@Xu0>Cw72wk_JWc5aF1 z!fMvdzNwbWt?@(Fr#AwJNo7~govJ7ww#Ms>v&iLB$X%Ns?{@F3zWcoB?A|VyD}6mF zTFZ!kS)R}Sw|+#&<2Nc!H1lq@_j=4Za=%EaFq}K!mOJhBK29HJz{@gTmt5@M97pUd zs(Z9|T8^bGx0h5S?08dXXjizu^Rs*(DtvJdd}JDMYIM6LweR!bjs&cgmpZQrIUgEP g89UVTc6RYNLiPQmihZ~CQ*3`ZsU%UnJ33?8KlPi_WdHyG diff --git a/eclipse-compile/appcompat/res/drawable-xxxhdpi/abc_tab_indicator_mtrl_alpha.9.png b/eclipse-compile/appcompat/res/drawable-xxxhdpi/abc_tab_indicator_mtrl_alpha.9.png index 5813179d4ca5aaa34ca66c35766f15c39e9804a8..929be19b09ab00c568c765de1e5b0bbe20b05d0b 100644 GIT binary patch delta 82 zcmZ3@STI4w$K2D!F{Fa=?b(gI3DN0!_k`XuH99B=aIgTW jeJns`^;<`U3Fd_i7Sm0ii?-hrX8;0ES3j3^P6lFzi8%cBh9lPj1s<1+k{|zt&%5W) zw59RY`Ka1i9uBgWzszz}GG`Z+{r7pJ=hPlh=Ie?)z4*}Q$iB}WAioS diff --git a/eclipse-compile/appcompat/res/drawable/abc_btn_borderless_material.xml b/eclipse-compile/appcompat/res/drawable/abc_btn_borderless_material.xml new file mode 100644 index 0000000000..f3894600ba --- /dev/null +++ b/eclipse-compile/appcompat/res/drawable/abc_btn_borderless_material.xml @@ -0,0 +1,22 @@ + + + + + + + + + diff --git a/eclipse-compile/appcompat/res/drawable/abc_btn_default_mtrl_shape.xml b/eclipse-compile/appcompat/res/drawable/abc_btn_default_mtrl_shape.xml new file mode 100644 index 0000000000..c50d4b10f0 --- /dev/null +++ b/eclipse-compile/appcompat/res/drawable/abc_btn_default_mtrl_shape.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + diff --git a/eclipse-compile/appcompat/res/drawable/abc_dialog_material_background_dark.xml b/eclipse-compile/appcompat/res/drawable/abc_dialog_material_background_dark.xml new file mode 100644 index 0000000000..41c4a6f842 --- /dev/null +++ b/eclipse-compile/appcompat/res/drawable/abc_dialog_material_background_dark.xml @@ -0,0 +1,26 @@ + + + + + + + + + \ No newline at end of file diff --git a/eclipse-compile/appcompat/res/drawable/abc_dialog_material_background_light.xml b/eclipse-compile/appcompat/res/drawable/abc_dialog_material_background_light.xml new file mode 100644 index 0000000000..248b13af94 --- /dev/null +++ b/eclipse-compile/appcompat/res/drawable/abc_dialog_material_background_light.xml @@ -0,0 +1,26 @@ + + + + + + + + + \ No newline at end of file diff --git a/eclipse-compile/appcompat/res/drawable/abc_edit_text_material.xml b/eclipse-compile/appcompat/res/drawable/abc_edit_text_material.xml index 754ab18d03..46c4e91200 100644 --- a/eclipse-compile/appcompat/res/drawable/abc_edit_text_material.xml +++ b/eclipse-compile/appcompat/res/drawable/abc_edit_text_material.xml @@ -15,16 +15,15 @@ --> + android:insetLeft="@dimen/abc_edit_text_inset_horizontal_material" + android:insetRight="@dimen/abc_edit_text_inset_horizontal_material" + android:insetTop="@dimen/abc_edit_text_inset_top_material" + android:insetBottom="@dimen/abc_edit_text_inset_bottom_material"> - - - - + + + diff --git a/eclipse-compile/appcompat/res/drawable/abc_ratingbar_full_material.xml b/eclipse-compile/appcompat/res/drawable/abc_ratingbar_full_material.xml new file mode 100644 index 0000000000..535e2da25e --- /dev/null +++ b/eclipse-compile/appcompat/res/drawable/abc_ratingbar_full_material.xml @@ -0,0 +1,24 @@ + + + + + + + + diff --git a/eclipse-compile/appcompat/res/drawable/abc_spinner_textfield_background_material.xml b/eclipse-compile/appcompat/res/drawable/abc_spinner_textfield_background_material.xml new file mode 100644 index 0000000000..d0f46a8097 --- /dev/null +++ b/eclipse-compile/appcompat/res/drawable/abc_spinner_textfield_background_material.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/eclipse-compile/appcompat/res/layout/abc_activity_chooser_view.xml b/eclipse-compile/appcompat/res/layout/abc_activity_chooser_view.xml index 99c2395bc9..923fda355d 100644 --- a/eclipse-compile/appcompat/res/layout/abc_activity_chooser_view.xml +++ b/eclipse-compile/appcompat/res/layout/abc_activity_chooser_view.xml @@ -16,14 +16,56 @@ ** limitations under the License. */ --> - - + - \ No newline at end of file + + + + + + + + + + + diff --git a/eclipse-compile/appcompat/res/layout/abc_dialog_title_material.xml b/eclipse-compile/appcompat/res/layout/abc_dialog_title_material.xml new file mode 100644 index 0000000000..068b9e907c --- /dev/null +++ b/eclipse-compile/appcompat/res/layout/abc_dialog_title_material.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/eclipse-compile/appcompat/res/layout/abc_expanded_menu_layout.xml b/eclipse-compile/appcompat/res/layout/abc_expanded_menu_layout.xml index 20e8b19be9..371151f2ec 100644 --- a/eclipse-compile/appcompat/res/layout/abc_expanded_menu_layout.xml +++ b/eclipse-compile/appcompat/res/layout/abc_expanded_menu_layout.xml @@ -18,5 +18,4 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/expanded_menu" android:layout_width="?attr/panelMenuListWidth" - android:layout_height="wrap_content" - android:background="?attr/panelBackground"/> + android:layout_height="wrap_content" /> diff --git a/eclipse-compile/appcompat/res/values-af/strings.xml b/eclipse-compile/appcompat/res/values-af/strings.xml index 474f3aa5a2..549ab7654c 100644 --- a/eclipse-compile/appcompat/res/values-af/strings.xml +++ b/eclipse-compile/appcompat/res/values-af/strings.xml @@ -20,9 +20,11 @@ "Navigeer tuis" "Navigeer op" "Nog opsies" + "Vou in" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Soek" + "Soek …" "Soeknavraag" "Vee navraag uit" "Dien navraag in" diff --git a/eclipse-compile/appcompat/res/values-am/strings.xml b/eclipse-compile/appcompat/res/values-am/strings.xml index dbd53d6ec4..9bcea17b8e 100644 --- a/eclipse-compile/appcompat/res/values-am/strings.xml +++ b/eclipse-compile/appcompat/res/values-am/strings.xml @@ -20,9 +20,11 @@ "ወደ መነሻ ይዳስሱ" "ወደ ላይ ይዳስሱ" "ተጨማሪ አማራጮች" + "ሰብስብ" "%1$s፣ %2$s" "%1$s፣ %2$s፣ %3$s" "ፍለጋ" + "ፈልግ…" "የፍለጋ ጥያቄ" "መጠይቅ አጽዳ" "መጠይቅ ያስረክቡ" diff --git a/eclipse-compile/appcompat/res/values-ar/strings.xml b/eclipse-compile/appcompat/res/values-ar/strings.xml index 84d6fbaa70..4ed5f59d45 100644 --- a/eclipse-compile/appcompat/res/values-ar/strings.xml +++ b/eclipse-compile/appcompat/res/values-ar/strings.xml @@ -20,9 +20,11 @@ "التنقل إلى الشاشة الرئيسية" "التنقل إلى أعلى" "خيارات إضافية" + "تصغير" "%1$s، %2$s" "%1$s، %2$s، %3$s" "بحث" + "بحث…" "طلب البحث" "محو طلب البحث" "إرسال طلب البحث" diff --git a/eclipse-compile/appcompat/res/values-bg/strings.xml b/eclipse-compile/appcompat/res/values-bg/strings.xml index 9d87ef7b23..74963a2079 100644 --- a/eclipse-compile/appcompat/res/values-bg/strings.xml +++ b/eclipse-compile/appcompat/res/values-bg/strings.xml @@ -20,9 +20,11 @@ "Придвижване към „Начало“" "Придвижване нагоре" "Още опции" + "Свиване" "„%1$s“ – %2$s" "„%1$s“, „%2$s“ – %3$s" "Търсене" + "Търсете…" "Заявка за търсене" "Изчистване на заявката" "Изпращане на заявката" diff --git a/eclipse-compile/appcompat/res/values-bn-rBD/strings.xml b/eclipse-compile/appcompat/res/values-bn-rBD/strings.xml index ee522c6791..93a599757e 100644 --- a/eclipse-compile/appcompat/res/values-bn-rBD/strings.xml +++ b/eclipse-compile/appcompat/res/values-bn-rBD/strings.xml @@ -20,9 +20,11 @@ "হোম এ নেভিগেট করুন" "উপরের দিকে নেভিগেট করুন" "আরো বিকল্প" + "সঙ্কুচিত করুন" "%1$s, %2$s" "%1$s, %2$s, %3$s" "অনুসন্ধান করুন" + "অনুসন্ধান..." "ক্যোয়ারী অনুসন্ধান করুন" "ক্যোয়ারী সাফ করুন" "ক্যোয়ারী জমা দিন" diff --git a/eclipse-compile/appcompat/res/values-ca/strings.xml b/eclipse-compile/appcompat/res/values-ca/strings.xml index 5fe4b0dd37..97789f520f 100644 --- a/eclipse-compile/appcompat/res/values-ca/strings.xml +++ b/eclipse-compile/appcompat/res/values-ca/strings.xml @@ -20,9 +20,11 @@ "Navega a la pàgina d\'inici" "Navega cap a dalt" "Més opcions" + "Replega" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Cerca" + "Cerca..." "Consulta de cerca" "Esborra la consulta" "Envia la consulta" diff --git a/eclipse-compile/appcompat/res/values-cs/strings.xml b/eclipse-compile/appcompat/res/values-cs/strings.xml index 13c9ba8eb3..9c3b2b0414 100644 --- a/eclipse-compile/appcompat/res/values-cs/strings.xml +++ b/eclipse-compile/appcompat/res/values-cs/strings.xml @@ -20,9 +20,11 @@ "Přejít na plochu" "Přejít nahoru" "Více možností" + "Sbalit" "%1$s – %2$s" "%1$s, %2$s – %3$s" "Hledat" + "Vyhledat…" "Vyhledávací dotaz" "Smazat dotaz" "Odeslat dotaz" diff --git a/eclipse-compile/appcompat/res/values-da/strings.xml b/eclipse-compile/appcompat/res/values-da/strings.xml index 03fec328ca..fda0c2453c 100644 --- a/eclipse-compile/appcompat/res/values-da/strings.xml +++ b/eclipse-compile/appcompat/res/values-da/strings.xml @@ -20,9 +20,11 @@ "Naviger hjem" "Naviger op" "Flere muligheder" + "Skjul" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Søg" + "Søg…" "Søgeforespørgsel" "Ryd forespørgslen" "Indsend forespørgslen" diff --git a/eclipse-compile/appcompat/res/values-de/strings.xml b/eclipse-compile/appcompat/res/values-de/strings.xml index 8a0224c47d..2905d60788 100644 --- a/eclipse-compile/appcompat/res/values-de/strings.xml +++ b/eclipse-compile/appcompat/res/values-de/strings.xml @@ -20,9 +20,11 @@ "Zur Startseite" "Nach oben" "Weitere Optionen" + "Minimieren" "%1$s: %2$s" "%1$s, %2$s: %3$s" "Suchen" + "Suchen…" "Suchanfrage" "Suchanfrage löschen" "Suchanfrage senden" diff --git a/eclipse-compile/appcompat/res/values-el/strings.xml b/eclipse-compile/appcompat/res/values-el/strings.xml index 52d1b81e74..779c83f954 100644 --- a/eclipse-compile/appcompat/res/values-el/strings.xml +++ b/eclipse-compile/appcompat/res/values-el/strings.xml @@ -20,9 +20,11 @@ "Πλοήγηση στην αρχική σελίδα" "Πλοήγηση προς τα επάνω" "Περισσότερες επιλογές" + "Σύμπτυξη" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Αναζήτηση" + "Αναζήτηση…" "Ερώτημα αναζήτησης" "Διαγραφή ερωτήματος" "Υποβολή ερωτήματος" diff --git a/eclipse-compile/appcompat/res/values-en-rGB/strings.xml b/eclipse-compile/appcompat/res/values-en-rGB/strings.xml index 8a8a1119ed..a85156e85d 100644 --- a/eclipse-compile/appcompat/res/values-en-rGB/strings.xml +++ b/eclipse-compile/appcompat/res/values-en-rGB/strings.xml @@ -20,9 +20,11 @@ "Navigate home" "Navigate up" "More options" + "Collapse" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Search" + "Search…" "Search query" "Clear query" "Submit query" diff --git a/eclipse-compile/appcompat/res/values-en-rIN/strings.xml b/eclipse-compile/appcompat/res/values-en-rIN/strings.xml index 8a8a1119ed..a85156e85d 100644 --- a/eclipse-compile/appcompat/res/values-en-rIN/strings.xml +++ b/eclipse-compile/appcompat/res/values-en-rIN/strings.xml @@ -20,9 +20,11 @@ "Navigate home" "Navigate up" "More options" + "Collapse" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Search" + "Search…" "Search query" "Clear query" "Submit query" diff --git a/eclipse-compile/appcompat/res/values-es-rUS/strings.xml b/eclipse-compile/appcompat/res/values-es-rUS/strings.xml index ea5004cbb9..b8488e17fa 100644 --- a/eclipse-compile/appcompat/res/values-es-rUS/strings.xml +++ b/eclipse-compile/appcompat/res/values-es-rUS/strings.xml @@ -20,9 +20,11 @@ "Navegar a la página principal" "Navegar hacia arriba" "Más opciones" + "Contraer" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Búsqueda" + "Buscar…" "Consulta de búsqueda" "Eliminar la consulta" "Enviar consulta" diff --git a/eclipse-compile/appcompat/res/values-es/strings.xml b/eclipse-compile/appcompat/res/values-es/strings.xml index c50796ee8c..70ea32d15a 100644 --- a/eclipse-compile/appcompat/res/values-es/strings.xml +++ b/eclipse-compile/appcompat/res/values-es/strings.xml @@ -20,9 +20,11 @@ "Ir a la pantalla de inicio" "Desplazarse hacia arriba" "Más opciones" + "Contraer" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Buscar" + "Buscar…" "Consulta" "Borrar consulta" "Enviar consulta" diff --git a/eclipse-compile/appcompat/res/values-et-rEE/strings.xml b/eclipse-compile/appcompat/res/values-et-rEE/strings.xml index 139fcf915d..cf4deacc1e 100644 --- a/eclipse-compile/appcompat/res/values-et-rEE/strings.xml +++ b/eclipse-compile/appcompat/res/values-et-rEE/strings.xml @@ -20,9 +20,11 @@ "Navigeerimine avaekraanile" "Navigeerimine üles" "Rohkem valikuid" + "Ahendamine" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Otsing" + "Otsige …" "Otsingupäring" "Päringu tühistamine" "Päringu esitamine" diff --git a/eclipse-compile/appcompat/res/values-eu-rES/strings.xml b/eclipse-compile/appcompat/res/values-eu-rES/strings.xml index 541c2ed3cd..dddc924ac3 100644 --- a/eclipse-compile/appcompat/res/values-eu-rES/strings.xml +++ b/eclipse-compile/appcompat/res/values-eu-rES/strings.xml @@ -20,9 +20,11 @@ "Joan orri nagusira" "Joan gora" "Aukera gehiago" + "Tolestu" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Bilatu" + "Bilatu…" "Bilaketa-kontsulta" "Garbitu kontsulta" "Bidali kontsulta" diff --git a/eclipse-compile/appcompat/res/values-fa/strings.xml b/eclipse-compile/appcompat/res/values-fa/strings.xml index c317bdaf3a..3e85c47a2d 100644 --- a/eclipse-compile/appcompat/res/values-fa/strings.xml +++ b/eclipse-compile/appcompat/res/values-fa/strings.xml @@ -20,9 +20,11 @@ "پیمایش به صفحه اصلی" "پیمایش به بالا" "گزینه‌های بیشتر" + "کوچک کردن" "‏%1$s‏، %2$s" "‏%1$s‏، %2$s‏، %3$s" "جستجو" + "جستجو…" "عبارت جستجو" "پاک کردن عبارت جستجو" "ارسال عبارت جستجو" diff --git a/eclipse-compile/appcompat/res/values-fi/strings.xml b/eclipse-compile/appcompat/res/values-fi/strings.xml index 218229b0f1..f706ebe9e8 100644 --- a/eclipse-compile/appcompat/res/values-fi/strings.xml +++ b/eclipse-compile/appcompat/res/values-fi/strings.xml @@ -20,9 +20,11 @@ "Siirry etusivulle" "Siirry ylös" "Lisää" + "Kutista" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Haku" + "Haku…" "Hakulauseke" "Tyhjennä kysely" "Lähetä kysely" diff --git a/eclipse-compile/appcompat/res/values-fr-rCA/strings.xml b/eclipse-compile/appcompat/res/values-fr-rCA/strings.xml index 571ff9a333..979bfa5480 100644 --- a/eclipse-compile/appcompat/res/values-fr-rCA/strings.xml +++ b/eclipse-compile/appcompat/res/values-fr-rCA/strings.xml @@ -20,9 +20,11 @@ "Revenir à l\'accueil" "Revenir en haut de la page" "Plus d\'options" + "Réduire" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Rechercher" + "Recherche en cours..." "Requête de recherche" "Effacer la requête" "Envoyer la requête" diff --git a/eclipse-compile/appcompat/res/values-fr/strings.xml b/eclipse-compile/appcompat/res/values-fr/strings.xml index 353665a880..df851d3634 100644 --- a/eclipse-compile/appcompat/res/values-fr/strings.xml +++ b/eclipse-compile/appcompat/res/values-fr/strings.xml @@ -20,9 +20,11 @@ "Revenir à l\'accueil" "Revenir en haut de la page" "Plus d\'options" + "Réduire" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Rechercher" + "Rechercher…" "Requête de recherche" "Effacer la requête" "Envoyer la requête" diff --git a/eclipse-compile/appcompat/res/values-gl-rES/strings.xml b/eclipse-compile/appcompat/res/values-gl-rES/strings.xml index 3f665ed6ce..618aec0e20 100644 --- a/eclipse-compile/appcompat/res/values-gl-rES/strings.xml +++ b/eclipse-compile/appcompat/res/values-gl-rES/strings.xml @@ -20,9 +20,11 @@ "Ir á páxina de inicio" "Desprazarse cara arriba" "Máis opcións" + "Contraer" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Buscar" + "Buscar…" "Consulta de busca" "Borrar consulta" "Enviar consulta" diff --git a/eclipse-compile/appcompat/res/values-h720dp/dimens.xml b/eclipse-compile/appcompat/res/values-h720dp/dimens.xml new file mode 100644 index 0000000000..09c43f0ef4 --- /dev/null +++ b/eclipse-compile/appcompat/res/values-h720dp/dimens.xml @@ -0,0 +1,20 @@ + + + + + + 54dip + diff --git a/eclipse-compile/appcompat/res/values-hdpi/styles_base.xml b/eclipse-compile/appcompat/res/values-hdpi/styles_base.xml new file mode 100644 index 0000000000..442ea292a0 --- /dev/null +++ b/eclipse-compile/appcompat/res/values-hdpi/styles_base.xml @@ -0,0 +1,23 @@ + + + + + + \ No newline at end of file diff --git a/eclipse-compile/appcompat/res/values-hi/strings.xml b/eclipse-compile/appcompat/res/values-hi/strings.xml index 23cfacaa30..2ee69d967a 100644 --- a/eclipse-compile/appcompat/res/values-hi/strings.xml +++ b/eclipse-compile/appcompat/res/values-hi/strings.xml @@ -17,12 +17,14 @@ "पूर्ण" - "मुखपृष्ठ पर नेविगेट करें" + "मुख्यपृष्ठ पर नेविगेट करें" "ऊपर नेविगेट करें" "अधिक विकल्प" + "संक्षिप्त करें" "%1$s, %2$s" "%1$s, %2$s, %3$s" "खोजें" + "खोजा जा रहा है…" "खोज क्वेरी" "क्‍वेरी साफ़ करें" "क्वेरी सबमिट करें" diff --git a/eclipse-compile/appcompat/res/values-hr/strings.xml b/eclipse-compile/appcompat/res/values-hr/strings.xml index 034859635c..7e8968f68a 100644 --- a/eclipse-compile/appcompat/res/values-hr/strings.xml +++ b/eclipse-compile/appcompat/res/values-hr/strings.xml @@ -20,9 +20,11 @@ "Idi na početnu" "Idi gore" "Dodatne opcije" + "Sažmi" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Pretraživanje" + "Pretražite…" "Upit za pretraživanje" "Izbriši upit" "Pošalji upit" diff --git a/eclipse-compile/appcompat/res/values-hu/strings.xml b/eclipse-compile/appcompat/res/values-hu/strings.xml index fc67f00ef5..7fe27d2887 100644 --- a/eclipse-compile/appcompat/res/values-hu/strings.xml +++ b/eclipse-compile/appcompat/res/values-hu/strings.xml @@ -20,9 +20,11 @@ "Ugrás a főoldalra" "Felfelé mozgatás" "További lehetőségek" + "Összecsukás" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Keresés" + "Keresés…" "Keresési lekérdezés" "Lekérdezés törlése" "Lekérdezés küldése" diff --git a/eclipse-compile/appcompat/res/values-hy-rAM/strings.xml b/eclipse-compile/appcompat/res/values-hy-rAM/strings.xml index da67fe4c5f..47c29a5bd5 100644 --- a/eclipse-compile/appcompat/res/values-hy-rAM/strings.xml +++ b/eclipse-compile/appcompat/res/values-hy-rAM/strings.xml @@ -20,9 +20,11 @@ "Ուղղվել տուն" "Ուղղվել վերև" "Այլ ընտրանքներ" + "Թաքցնել" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Որոնել" + "Որոնում..." "Որոնման հարցում" "Մաքրել հարցումը" "Ուղարկել հարցումը" diff --git a/eclipse-compile/appcompat/res/values-in/strings.xml b/eclipse-compile/appcompat/res/values-in/strings.xml index 3c31755ad0..d102ba6dc2 100644 --- a/eclipse-compile/appcompat/res/values-in/strings.xml +++ b/eclipse-compile/appcompat/res/values-in/strings.xml @@ -20,9 +20,11 @@ "Navigasi ke beranda" "Navigasi naik" "Opsi lain" + "Ciutkan" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Telusuri" + "Telusuri..." "Kueri penelusuran" "Hapus kueri" "Kirim kueri" diff --git a/eclipse-compile/appcompat/res/values-is-rIS/strings.xml b/eclipse-compile/appcompat/res/values-is-rIS/strings.xml index 7846b514f5..a205e8bf73 100644 --- a/eclipse-compile/appcompat/res/values-is-rIS/strings.xml +++ b/eclipse-compile/appcompat/res/values-is-rIS/strings.xml @@ -20,9 +20,11 @@ "Fara heim" "Fara upp" "Fleiri valkostir" + "Minnka" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Leita" + "Leita…" "Leitarfyrirspurn" "Hreinsa fyrirspurn" "Senda fyrirspurn" diff --git a/eclipse-compile/appcompat/res/values-it/strings.xml b/eclipse-compile/appcompat/res/values-it/strings.xml index 6ed52be06d..71cb54fcb7 100644 --- a/eclipse-compile/appcompat/res/values-it/strings.xml +++ b/eclipse-compile/appcompat/res/values-it/strings.xml @@ -20,9 +20,11 @@ "Vai alla home page" "Vai in alto" "Altre opzioni" + "Comprimi" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Cerca" + "Cerca…" "Query di ricerca" "Cancella query" "Invia query" diff --git a/eclipse-compile/appcompat/res/values-iw/strings.xml b/eclipse-compile/appcompat/res/values-iw/strings.xml index fec0e62287..c5ef730fb8 100644 --- a/eclipse-compile/appcompat/res/values-iw/strings.xml +++ b/eclipse-compile/appcompat/res/values-iw/strings.xml @@ -20,9 +20,11 @@ "נווט לדף הבית" "נווט למעלה" "עוד אפשרויות" + "כווץ" "‏%1$s‏, %2$s" "‏%1$s‏, %2$s‏, %3$s" "חפש" + "חפש…" "שאילתת חיפוש" "מחק שאילתה" "שלח שאילתה" diff --git a/eclipse-compile/appcompat/res/values-ja/strings.xml b/eclipse-compile/appcompat/res/values-ja/strings.xml index 181dd5e5fa..736d454701 100644 --- a/eclipse-compile/appcompat/res/values-ja/strings.xml +++ b/eclipse-compile/appcompat/res/values-ja/strings.xml @@ -20,9 +20,11 @@ "ホームへ移動" "上へ移動" "その他のオプション" + "折りたたむ" "%1$s、%2$s" "%1$s、%2$s、%3$s" "検索" + "検索…" "検索キーワード" "検索キーワードを削除" "検索キーワードを送信" diff --git a/eclipse-compile/appcompat/res/values-ka-rGE/strings.xml b/eclipse-compile/appcompat/res/values-ka-rGE/strings.xml index a96f26c3fe..2341e3d0a3 100644 --- a/eclipse-compile/appcompat/res/values-ka-rGE/strings.xml +++ b/eclipse-compile/appcompat/res/values-ka-rGE/strings.xml @@ -20,9 +20,11 @@ "მთავარზე ნავიგაცია" "ზემოთ ნავიგაცია" "მეტი ვარიანტები" + "აკეცვა" "%1$s, %2$s" "%1$s, %2$s, %3$s" "ძიება" + "ძიება..." "ძიების მოთხოვნა" "მოთხოვნის გასუფთავება" "მოთხოვნის გადაგზავნა" diff --git a/eclipse-compile/appcompat/res/values-kk-rKZ/strings.xml b/eclipse-compile/appcompat/res/values-kk-rKZ/strings.xml index fb20a0049c..1af9a5ffbf 100644 --- a/eclipse-compile/appcompat/res/values-kk-rKZ/strings.xml +++ b/eclipse-compile/appcompat/res/values-kk-rKZ/strings.xml @@ -20,9 +20,11 @@ "Негізгі бетте қозғалу" "Жоғары қозғалу" "Басқа опциялар" + "Тасалау" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Іздеу" + "Іздеу…" "Сұрақты іздеу" "Сұрақты жою" "Сұрақты жіберу" diff --git a/eclipse-compile/appcompat/res/values-km-rKH/strings.xml b/eclipse-compile/appcompat/res/values-km-rKH/strings.xml index 704f4ee48f..5fda61ae57 100644 --- a/eclipse-compile/appcompat/res/values-km-rKH/strings.xml +++ b/eclipse-compile/appcompat/res/values-km-rKH/strings.xml @@ -20,9 +20,11 @@ "រកមើល​ទៅ​ដើម" "រកមើល​ឡើងលើ" "ជម្រើស​ច្រើន​ទៀត" + "បង្រួម" "%1$s, %2$s" "%1$s, %2$s, %3$s" "ស្វែងរក" + "ស្វែងរក…" "ស្វែងរក​សំណួរ" "សម្អាត​សំណួរ" "ដាក់​​​ស្នើ​សំណួរ" diff --git a/eclipse-compile/appcompat/res/values-kn-rIN/strings.xml b/eclipse-compile/appcompat/res/values-kn-rIN/strings.xml index d472ff32ea..669c21ccaf 100644 --- a/eclipse-compile/appcompat/res/values-kn-rIN/strings.xml +++ b/eclipse-compile/appcompat/res/values-kn-rIN/strings.xml @@ -20,9 +20,11 @@ "ಮುಖಪುಟವನ್ನು ನ್ಯಾವಿಗೇಟ್ ಮಾಡಿ" "ಮೇಲಕ್ಕೆ ನ್ಯಾವಿಗೇಟ್ ಮಾಡಿ" "ಇನ್ನಷ್ಟು ಆಯ್ಕೆಗಳು" + "ಸಂಕುಚಿಸು" "%1$s, %2$s" "%1$s, %2$s, %3$s" "ಹುಡುಕು" + "ಹುಡುಕಿ…" "ಪ್ರಶ್ನೆಯನ್ನು ಹುಡುಕಿ" "ಪ್ರಶ್ನೆಯನ್ನು ತೆರವುಗೊಳಿಸು" "ಪ್ರಶ್ನೆಯನ್ನು ಸಲ್ಲಿಸು" diff --git a/eclipse-compile/appcompat/res/values-ko/strings.xml b/eclipse-compile/appcompat/res/values-ko/strings.xml index 0a92a83dc7..ad83225fcd 100644 --- a/eclipse-compile/appcompat/res/values-ko/strings.xml +++ b/eclipse-compile/appcompat/res/values-ko/strings.xml @@ -20,9 +20,11 @@ "홈 탐색" "위로 탐색" "옵션 더보기" + "접기" "%1$s, %2$s" "%1$s, %2$s, %3$s" "검색" + "검색..." "검색어" "검색어 삭제" "검색어 보내기" diff --git a/eclipse-compile/appcompat/res/values-ky-rKG/strings.xml b/eclipse-compile/appcompat/res/values-ky-rKG/strings.xml index b091f608ca..b9f0bb1654 100644 --- a/eclipse-compile/appcompat/res/values-ky-rKG/strings.xml +++ b/eclipse-compile/appcompat/res/values-ky-rKG/strings.xml @@ -20,9 +20,11 @@ "Үйгө багыттоо" "Жогору" "Көбүрөөк мүмкүнчүлүктөр" + "Жыйнап коюу" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Издөө" + "Издөө…" "Издөө талаптары" "Талаптарды тазалоо" "Талап жөнөтүү" diff --git a/eclipse-compile/appcompat/res/values-lo-rLA/strings.xml b/eclipse-compile/appcompat/res/values-lo-rLA/strings.xml index 33614e6715..45f830f3f9 100644 --- a/eclipse-compile/appcompat/res/values-lo-rLA/strings.xml +++ b/eclipse-compile/appcompat/res/values-lo-rLA/strings.xml @@ -20,9 +20,11 @@ "ກັບໄປໜ້າຫຼັກ" "ຂຶ້ນເທິງ" "ໂຕເລືອກອື່ນ" + "ຫຍໍ້" "%1$s, %2$s" "%1$s, %2$s, %3$s" "ຊອກຫາ" + "ຊອກຫາ" "ຊອກຫາ" "ລຶບຂໍ້ຄວາມຊອກຫາ" "ສົ່ງການຊອກຫາ" diff --git a/eclipse-compile/appcompat/res/values-lt/strings.xml b/eclipse-compile/appcompat/res/values-lt/strings.xml index 3c992a7bb1..27713a79b4 100644 --- a/eclipse-compile/appcompat/res/values-lt/strings.xml +++ b/eclipse-compile/appcompat/res/values-lt/strings.xml @@ -20,9 +20,11 @@ "Eiti į pagrindinį puslapį" "Eiti į viršų" "Daugiau parinkčių" + "Sutraukti" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Paieška" + "Ieškoti..." "Paieškos užklausa" "Išvalyti užklausą" "Pateikti užklausą" diff --git a/eclipse-compile/appcompat/res/values-lv/strings.xml b/eclipse-compile/appcompat/res/values-lv/strings.xml index 3bd72591b1..986e8eb985 100644 --- a/eclipse-compile/appcompat/res/values-lv/strings.xml +++ b/eclipse-compile/appcompat/res/values-lv/strings.xml @@ -20,9 +20,11 @@ "Pārvietoties uz sākuma ekrānu" "Pārvietoties augšup" "Vairāk opciju" + "Sakļaut" "%1$s: %2$s" "%1$s, %2$s: %3$s" "Meklēt" + "Meklējiet…" "Meklēšanas vaicājums" "Notīrīt vaicājumu" "Iesniegt vaicājumu" diff --git a/eclipse-compile/appcompat/res/values-mk-rMK/strings.xml b/eclipse-compile/appcompat/res/values-mk-rMK/strings.xml index b1abf10683..916809aaf1 100644 --- a/eclipse-compile/appcompat/res/values-mk-rMK/strings.xml +++ b/eclipse-compile/appcompat/res/values-mk-rMK/strings.xml @@ -20,11 +20,13 @@ "Движи се кон дома" "Движи се нагоре" "Повеќе опции" + "Собери" "%1$s, %2$s, %3$s" "Пребарај" + "Пребарување…" "Пребарај барање" "Исчисти барање" "Поднеси барање" diff --git a/eclipse-compile/appcompat/res/values-ml-rIN/strings.xml b/eclipse-compile/appcompat/res/values-ml-rIN/strings.xml index f7512adaaf..c122ed5c64 100644 --- a/eclipse-compile/appcompat/res/values-ml-rIN/strings.xml +++ b/eclipse-compile/appcompat/res/values-ml-rIN/strings.xml @@ -20,13 +20,15 @@ "ഹോമിലേക്ക് നാവിഗേറ്റുചെയ്യുക" "മുകളിലേക്ക് നാവിഗേറ്റുചെയ്യുക" "കൂടുതല്‍ ഓപ്‌ഷനുകള്‍" + "ചുരുക്കുക" "%1$s, %2$s" "%1$s, %2$s, %3$s" "തിരയൽ" + "തിരയുക…" "തിരയൽ അന്വേഷണം" "അന്വേഷണം മായ്‌ക്കുക" "അന്വേഷണം സമർപ്പിക്കുക" - "വോയ്‌സ് തിരയൽ" + "ശബ്ദ തിരയൽ" "ഒരു അപ്ലിക്കേഷൻ തിരഞ്ഞെടുക്കുക" "എല്ലാം കാണുക" "%s എന്നതുമായി പങ്കിടുക" diff --git a/eclipse-compile/appcompat/res/values-mn-rMN/strings.xml b/eclipse-compile/appcompat/res/values-mn-rMN/strings.xml index a1a9c6fb01..eadbb9fc0e 100644 --- a/eclipse-compile/appcompat/res/values-mn-rMN/strings.xml +++ b/eclipse-compile/appcompat/res/values-mn-rMN/strings.xml @@ -20,9 +20,11 @@ "Нүүр хуудас руу шилжих" "Дээш шилжих" "Нэмэлт сонголтууд" + "Хумих" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Хайх" + "Хайх..." "Хайх асуулга" "Асуулгыг цэвэрлэх" "Асуулгыг илгээх" diff --git a/eclipse-compile/appcompat/res/values-mr-rIN/strings.xml b/eclipse-compile/appcompat/res/values-mr-rIN/strings.xml index 3d0e71888c..a2fb945118 100644 --- a/eclipse-compile/appcompat/res/values-mr-rIN/strings.xml +++ b/eclipse-compile/appcompat/res/values-mr-rIN/strings.xml @@ -20,9 +20,11 @@ "मुख्‍यपृष्‍ठ नेव्‍हिगेट करा" "वर नेव्‍हिगेट करा" "अधिक पर्याय" + "संक्षिप्त करा" "%1$s, %2$s" "%1$s, %2$s, %3$s" "शोध" + "शोधा…" "शोध क्वेरी" "क्‍वेरी स्‍पष्‍ट करा" "क्वेरी सबमिट करा" diff --git a/eclipse-compile/appcompat/res/values-ms-rMY/strings.xml b/eclipse-compile/appcompat/res/values-ms-rMY/strings.xml index d2886a1a6d..f42fe3d614 100644 --- a/eclipse-compile/appcompat/res/values-ms-rMY/strings.xml +++ b/eclipse-compile/appcompat/res/values-ms-rMY/strings.xml @@ -20,9 +20,11 @@ "Navigasi skrin utama" "Navigasi ke atas" "Lagi pilihan" + "Runtuhkan" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Cari" + "Cari…" "Pertanyaan carian" "Kosongkan pertanyaan" "Serah pertanyaan" diff --git a/eclipse-compile/appcompat/res/values-my-rMM/strings.xml b/eclipse-compile/appcompat/res/values-my-rMM/strings.xml index 3ac8472d1a..6313bcb35d 100644 --- a/eclipse-compile/appcompat/res/values-my-rMM/strings.xml +++ b/eclipse-compile/appcompat/res/values-my-rMM/strings.xml @@ -20,9 +20,11 @@ "မူလနေရာကို သွားရန်" "အပေါ်သို့သွားရန်" "ပိုမိုရွေးချယ်စရာများ" + "ခေါက်ရန်" "%1$s၊ %2$s" "%1$s ၊ %2$s ၊ %3$s" "ရှာဖွေရန်" + "ရှာဖွေပါ..." "ရှာစရာ အချက်အလက်နေရာ" "ရှာစရာ အချက်အလက်များ ရှင်းလင်းရန်" "ရှာဖွေစရာ အချက်အလက်ကို အတည်ပြုရန်" diff --git a/eclipse-compile/appcompat/res/values-nb/strings.xml b/eclipse-compile/appcompat/res/values-nb/strings.xml index 3dbd071e76..6e50a58186 100644 --- a/eclipse-compile/appcompat/res/values-nb/strings.xml +++ b/eclipse-compile/appcompat/res/values-nb/strings.xml @@ -20,9 +20,11 @@ "Gå til startsiden" "Gå opp" "Flere alternativer" + "Skjul" "%1$s – %2$s" "%1$s – %2$s – %3$s" "Søk" + "Søk …" "Søkeord" "Slett søket" "Utfør søket" diff --git a/eclipse-compile/appcompat/res/values-ne-rNP/strings.xml b/eclipse-compile/appcompat/res/values-ne-rNP/strings.xml index 01546624d3..5b804d87d1 100644 --- a/eclipse-compile/appcompat/res/values-ne-rNP/strings.xml +++ b/eclipse-compile/appcompat/res/values-ne-rNP/strings.xml @@ -20,9 +20,11 @@ "गृह खोज्नुहोस्" "माथि खोज्नुहोस्" "थप विकल्पहरू" + "संक्षिप्त पार्नुहोस्" "%1$s, %2$s" "%1$s, %2$s, %3$s" "खोज्नुहोस्" + "खोज्नुहोस्..." "जिज्ञासाको खोज गर्नुहोस्" "प्रश्‍न हटाउनुहोस्" "जिज्ञासा पेस गर्नुहोस्" diff --git a/eclipse-compile/appcompat/res/values-nl/strings.xml b/eclipse-compile/appcompat/res/values-nl/strings.xml index 330de8daa6..61546dff52 100644 --- a/eclipse-compile/appcompat/res/values-nl/strings.xml +++ b/eclipse-compile/appcompat/res/values-nl/strings.xml @@ -20,9 +20,11 @@ "Navigeren naar startpositie" "Omhoog navigeren" "Meer opties" + "Samenvouwen" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Zoeken" + "Zoeken…" "Zoekopdracht" "Zoekopdracht wissen" "Zoekopdracht verzenden" diff --git a/eclipse-compile/appcompat/res/values-pl/strings.xml b/eclipse-compile/appcompat/res/values-pl/strings.xml index 8e32155f19..9d99e9226f 100644 --- a/eclipse-compile/appcompat/res/values-pl/strings.xml +++ b/eclipse-compile/appcompat/res/values-pl/strings.xml @@ -20,9 +20,11 @@ "Przejdź do strony głównej" "Przejdź wyżej" "Więcej opcji" + "Zwiń" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Szukaj" + "Szukaj…" "Wyszukiwane hasło" "Wyczyść zapytanie" "Wyślij zapytanie" diff --git a/eclipse-compile/appcompat/res/values-pt-rPT/strings.xml b/eclipse-compile/appcompat/res/values-pt-rPT/strings.xml index e1c622e980..e905530d3c 100644 --- a/eclipse-compile/appcompat/res/values-pt-rPT/strings.xml +++ b/eclipse-compile/appcompat/res/values-pt-rPT/strings.xml @@ -20,9 +20,11 @@ "Navegar para a página inicial" "Navegar para cima" "Mais opções" + "Reduzir" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Pesquisar" + "Pesquisar..." "Consulta de pesquisa" "Limpar consulta" "Enviar consulta" diff --git a/eclipse-compile/appcompat/res/values-pt/strings.xml b/eclipse-compile/appcompat/res/values-pt/strings.xml index abdd650c60..b6c94e901c 100644 --- a/eclipse-compile/appcompat/res/values-pt/strings.xml +++ b/eclipse-compile/appcompat/res/values-pt/strings.xml @@ -20,9 +20,11 @@ "Navegar para a página inicial" "Navegar para cima" "Mais opções" + "Recolher" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Pesquisar" + "Pesquisar..." "Consulta de pesquisa" "Limpar consulta" "Enviar consulta" diff --git a/eclipse-compile/appcompat/res/values-ro/strings.xml b/eclipse-compile/appcompat/res/values-ro/strings.xml index 6dd2b67c6a..4c741f391d 100644 --- a/eclipse-compile/appcompat/res/values-ro/strings.xml +++ b/eclipse-compile/appcompat/res/values-ro/strings.xml @@ -20,9 +20,11 @@ "Navigați la ecranul de pornire" "Navigați în sus" "Mai multe opțiuni" + "Restrângeți" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Căutați" + "Căutați…" "Interogare de căutare" "Ștergeți interogarea" "Trimiteți interogarea" diff --git a/eclipse-compile/appcompat/res/values-ru/strings.xml b/eclipse-compile/appcompat/res/values-ru/strings.xml index 9c5ed8958d..4879b5d6b3 100644 --- a/eclipse-compile/appcompat/res/values-ru/strings.xml +++ b/eclipse-compile/appcompat/res/values-ru/strings.xml @@ -20,9 +20,11 @@ "Перейти на главный экран" "Перейти вверх" "Другие параметры" + "Свернуть" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Поиск" + "Поиск" "Поисковый запрос" "Удалить запрос" "Отправить запрос" diff --git a/eclipse-compile/appcompat/res/values-si-rLK/strings.xml b/eclipse-compile/appcompat/res/values-si-rLK/strings.xml index 22809d63d1..252448f307 100644 --- a/eclipse-compile/appcompat/res/values-si-rLK/strings.xml +++ b/eclipse-compile/appcompat/res/values-si-rLK/strings.xml @@ -20,9 +20,11 @@ "ගෙදරට සංචාලනය කරන්න" "ඉහලට සංචාලනය කරන්න" "තවත් විකල්ප" + "හකුළන්න" "%1$s, %2$s" "%1$s, %2$s, %3$s" "සෙවීම" + "සොයන්න..." "සෙවුම් විමසුම" "විමසුම හිස් කරන්න" "විමසුම යොමු කරන්න" diff --git a/eclipse-compile/appcompat/res/values-sk/strings.xml b/eclipse-compile/appcompat/res/values-sk/strings.xml index 2b09cce78f..501e0653fd 100644 --- a/eclipse-compile/appcompat/res/values-sk/strings.xml +++ b/eclipse-compile/appcompat/res/values-sk/strings.xml @@ -20,9 +20,11 @@ "Prejsť na plochu" "Prejsť hore" "Ďalšie možnosti" + "Zbaliť" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Hľadať" + "Vyhľadať…" "Vyhľadávací dopyt" "Vymazať dopyt" "Odoslať dopyt" diff --git a/eclipse-compile/appcompat/res/values-sl/strings.xml b/eclipse-compile/appcompat/res/values-sl/strings.xml index a522de23ca..da49123fca 100644 --- a/eclipse-compile/appcompat/res/values-sl/strings.xml +++ b/eclipse-compile/appcompat/res/values-sl/strings.xml @@ -20,9 +20,11 @@ "Krmarjenje domov" "Krmarjenje navzgor" "Več možnosti" + "Strni" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Iskanje" + "Iskanje …" "Iskalna poizvedba" "Izbris poizvedbe" "Pošiljanje poizvedbe" diff --git a/eclipse-compile/appcompat/res/values-sr/strings.xml b/eclipse-compile/appcompat/res/values-sr/strings.xml index c26945bfb8..9e2a9e8c9d 100644 --- a/eclipse-compile/appcompat/res/values-sr/strings.xml +++ b/eclipse-compile/appcompat/res/values-sr/strings.xml @@ -20,9 +20,11 @@ "Одлазак на Почетну" "Кретање нагоре" "Још опција" + "Скупи" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Претрага" + "Претражите..." "Упит за претрагу" "Брисање упита" "Слање упита" diff --git a/eclipse-compile/appcompat/res/values-sv/strings.xml b/eclipse-compile/appcompat/res/values-sv/strings.xml index 3120ad805f..905e3ea740 100644 --- a/eclipse-compile/appcompat/res/values-sv/strings.xml +++ b/eclipse-compile/appcompat/res/values-sv/strings.xml @@ -20,9 +20,11 @@ "Visa startsidan" "Navigera uppåt" "Fler alternativ" + "Komprimera" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Sök" + "Sök …" "Sökfråga" "Ta bort frågan" "Skicka fråga" diff --git a/eclipse-compile/appcompat/res/values-sw/strings.xml b/eclipse-compile/appcompat/res/values-sw/strings.xml index afe54f6fd8..7287c0dc94 100644 --- a/eclipse-compile/appcompat/res/values-sw/strings.xml +++ b/eclipse-compile/appcompat/res/values-sw/strings.xml @@ -20,9 +20,11 @@ "Nenda mwanzo" "Nenda juu" "Chaguo zaidi" + "Kunja" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Tafuta" + "Tafuta…" "Hoja ya utafutaji" "Futa hoja" "Wasilisha hoja" diff --git a/eclipse-compile/appcompat/res/values-sw600dp/dimens.xml b/eclipse-compile/appcompat/res/values-sw600dp/dimens.xml index cba2150682..e221b50164 100644 --- a/eclipse-compile/appcompat/res/values-sw600dp/dimens.xml +++ b/eclipse-compile/appcompat/res/values-sw600dp/dimens.xml @@ -29,5 +29,12 @@ 64dp 4dp + + 24dp + + + 8dp + + 18dp \ No newline at end of file diff --git a/eclipse-compile/appcompat/res/values-ta-rIN/strings.xml b/eclipse-compile/appcompat/res/values-ta-rIN/strings.xml index 542fd3468a..ab728a602a 100644 --- a/eclipse-compile/appcompat/res/values-ta-rIN/strings.xml +++ b/eclipse-compile/appcompat/res/values-ta-rIN/strings.xml @@ -20,9 +20,11 @@ "முகப்பிற்கு வழிசெலுத்து" "மேலே வழிசெலுத்து" "மேலும் விருப்பங்கள்" + "சுருக்கு" "%1$s, %2$s" "%1$s, %2$s, %3$s" "தேடு" + "தேடு..." "தேடல் வினவல்" "வினவலை அழி" "வினவலைச் சமர்ப்பி" diff --git a/eclipse-compile/appcompat/res/values-te-rIN/strings.xml b/eclipse-compile/appcompat/res/values-te-rIN/strings.xml index 5f36cc5c18..901859b015 100644 --- a/eclipse-compile/appcompat/res/values-te-rIN/strings.xml +++ b/eclipse-compile/appcompat/res/values-te-rIN/strings.xml @@ -20,9 +20,11 @@ "హోమ్‌కు నావిగేట్ చేయండి" "పైకి నావిగేట్ చేయండి" "మరిన్ని ఎంపికలు" + "కుదించండి" "%1$s, %2$s" "%1$s, %2$s, %3$s" "శోధించు" + "శోధించు..." "ప్రశ్న శోధించండి" "ప్రశ్నను క్లియర్ చేయి" "ప్రశ్నని సమర్పించు" diff --git a/eclipse-compile/appcompat/res/values-th/strings.xml b/eclipse-compile/appcompat/res/values-th/strings.xml index d8c04c4454..e962aa56bd 100644 --- a/eclipse-compile/appcompat/res/values-th/strings.xml +++ b/eclipse-compile/appcompat/res/values-th/strings.xml @@ -20,9 +20,11 @@ "นำทางไปหน้าแรก" "นำทางขึ้น" "ตัวเลือกอื่น" + "ยุบ" "%1$s, %2$s" "%1$s, %2$s, %3$s" "ค้นหา" + "ค้นหา…" "ข้อความค้นหา" "ล้างข้อความค้นหา" "ส่งข้อความค้นหา" diff --git a/eclipse-compile/appcompat/res/values-tl/strings.xml b/eclipse-compile/appcompat/res/values-tl/strings.xml index 0384435313..f41b15ff6f 100644 --- a/eclipse-compile/appcompat/res/values-tl/strings.xml +++ b/eclipse-compile/appcompat/res/values-tl/strings.xml @@ -20,9 +20,11 @@ "Mag-navigate patungo sa home" "Mag-navigate pataas" "Higit pang mga opsyon" + "I-collapse" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Maghanap" + "Maghanap…" "Query sa paghahanap" "I-clear ang query" "Isumite ang query" diff --git a/eclipse-compile/appcompat/res/values-tr/strings.xml b/eclipse-compile/appcompat/res/values-tr/strings.xml index c06069cf4c..9cde4a2214 100644 --- a/eclipse-compile/appcompat/res/values-tr/strings.xml +++ b/eclipse-compile/appcompat/res/values-tr/strings.xml @@ -20,9 +20,11 @@ "Ana ekrana git" "Yukarı git" "Diğer seçenekler" + "Daralt" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Ara" + "Ara…" "Arama sorgusu" "Sorguyu temizle" "Sorguyu gönder" diff --git a/eclipse-compile/appcompat/res/values-uk/strings.xml b/eclipse-compile/appcompat/res/values-uk/strings.xml index d07404b654..0a5c31cd18 100644 --- a/eclipse-compile/appcompat/res/values-uk/strings.xml +++ b/eclipse-compile/appcompat/res/values-uk/strings.xml @@ -20,9 +20,11 @@ "Перейти на головний" "Перейти вгору" "Інші опції" + "Згорнути" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Пошук" + "Пошук…" "Пошуковий запит" "Очистити запит" "Надіслати запит" diff --git a/eclipse-compile/appcompat/res/values-ur-rPK/strings.xml b/eclipse-compile/appcompat/res/values-ur-rPK/strings.xml index 89c0ea69e6..e6f6260d4d 100644 --- a/eclipse-compile/appcompat/res/values-ur-rPK/strings.xml +++ b/eclipse-compile/appcompat/res/values-ur-rPK/strings.xml @@ -20,9 +20,11 @@ "ہوم پر نیویگیٹ کریں" "اوپر نیویگیٹ کریں" "مزید اختیارات" + "سکیڑیں" "%1$s, %2$s" "%1$s, %2$s, %3$s" "تلاش کریں" + "تلاش کریں…" "استفسار تلاش کریں" "استفسار صاف کریں" "استفسار جمع کرائیں" diff --git a/eclipse-compile/appcompat/res/values-uz-rUZ/strings.xml b/eclipse-compile/appcompat/res/values-uz-rUZ/strings.xml index 537afa169d..241b3b121b 100644 --- a/eclipse-compile/appcompat/res/values-uz-rUZ/strings.xml +++ b/eclipse-compile/appcompat/res/values-uz-rUZ/strings.xml @@ -20,9 +20,11 @@ "Boshiga o‘tish" "Yuqoriga o‘tish" "Qo‘shimcha sozlamalar" + "Yig‘ish" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Izlash" + "Qidirish…" "So‘rovni izlash" "So‘rovni tozalash" "So‘rov yaratish" diff --git a/eclipse-compile/appcompat/res/values-v11/themes_base.xml b/eclipse-compile/appcompat/res/values-v11/themes_base.xml index ca583fab12..d344bf594e 100644 --- a/eclipse-compile/appcompat/res/values-v11/themes_base.xml +++ b/eclipse-compile/appcompat/res/values-v11/themes_base.xml @@ -22,12 +22,17 @@ unbundled Action Bar. --> - - - - - - - - - - - - + + + + + diff --git a/eclipse-compile/appcompat/res/values-v14/styles_base_text.xml b/eclipse-compile/appcompat/res/values-v14/styles_base_text.xml new file mode 100644 index 0000000000..54c8de2ae4 --- /dev/null +++ b/eclipse-compile/appcompat/res/values-v14/styles_base_text.xml @@ -0,0 +1,26 @@ + + + + + + + + \ No newline at end of file diff --git a/eclipse-compile/appcompat/res/values-v14/themes_base.xml b/eclipse-compile/appcompat/res/values-v14/themes_base.xml index 3f26ca2233..5fdc73c72b 100644 --- a/eclipse-compile/appcompat/res/values-v14/themes_base.xml +++ b/eclipse-compile/appcompat/res/values-v14/themes_base.xml @@ -16,41 +16,21 @@ - - - - - diff --git a/eclipse-compile/appcompat/res/values-v17/styles_rtl.xml b/eclipse-compile/appcompat/res/values-v17/styles_rtl.xml index 0c7d861144..d89a63d057 100644 --- a/eclipse-compile/appcompat/res/values-v17/styles_rtl.xml +++ b/eclipse-compile/appcompat/res/values-v17/styles_rtl.xml @@ -47,14 +47,9 @@ 8dp - - + + \ No newline at end of file diff --git a/eclipse-compile/appcompat/res/values-v18/dimens.xml b/eclipse-compile/appcompat/res/values-v18/dimens.xml new file mode 100644 index 0000000000..bb784b76b9 --- /dev/null +++ b/eclipse-compile/appcompat/res/values-v18/dimens.xml @@ -0,0 +1,22 @@ + + + + + + + 0px + + diff --git a/eclipse-compile/appcompat/res/values-v21/styles_base.xml b/eclipse-compile/appcompat/res/values-v21/styles_base.xml index 648dfd2d80..aac01dc37e 100644 --- a/eclipse-compile/appcompat/res/values-v21/styles_base.xml +++ b/eclipse-compile/appcompat/res/values-v21/styles_base.xml @@ -78,6 +78,7 @@ - - + - - - @@ -212,18 +215,31 @@ diff --git a/eclipse-compile/appcompat/res/values-vi/strings.xml b/eclipse-compile/appcompat/res/values-vi/strings.xml index 21dd883430..9cf34c2974 100644 --- a/eclipse-compile/appcompat/res/values-vi/strings.xml +++ b/eclipse-compile/appcompat/res/values-vi/strings.xml @@ -20,9 +20,11 @@ "Điều hướng về trang chủ" "Điều hướng lên trên" "Thêm tùy chọn" + "Thu gọn" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Tìm kiếm" + "Tìm kiếm…" "Tìm kiếm truy vấn" "Xóa truy vấn" "Gửi truy vấn" diff --git a/eclipse-compile/appcompat/res/values-zh-rCN/strings.xml b/eclipse-compile/appcompat/res/values-zh-rCN/strings.xml index 54e2c86f42..a0b492a03c 100644 --- a/eclipse-compile/appcompat/res/values-zh-rCN/strings.xml +++ b/eclipse-compile/appcompat/res/values-zh-rCN/strings.xml @@ -20,9 +20,11 @@ "转到主屏幕" "转到上一层级" "更多选项" + "收起" "%1$s:%2$s" "%1$s - %2$s:%3$s" "搜索" + "搜索…" "搜索查询" "清除查询" "提交查询" diff --git a/eclipse-compile/appcompat/res/values-zh-rHK/strings.xml b/eclipse-compile/appcompat/res/values-zh-rHK/strings.xml index e35d46512a..2e373073ac 100644 --- a/eclipse-compile/appcompat/res/values-zh-rHK/strings.xml +++ b/eclipse-compile/appcompat/res/values-zh-rHK/strings.xml @@ -20,9 +20,11 @@ "瀏覽主頁" "向上瀏覽" "更多選項" + "收合" "%1$s:%2$s" "%1$s (%2$s):%3$s" "搜尋" + "搜尋…" "搜尋查詢" "清除查詢" "提交查詢" diff --git a/eclipse-compile/appcompat/res/values-zh-rTW/strings.xml b/eclipse-compile/appcompat/res/values-zh-rTW/strings.xml index 24d530cb1b..41a940101d 100644 --- a/eclipse-compile/appcompat/res/values-zh-rTW/strings.xml +++ b/eclipse-compile/appcompat/res/values-zh-rTW/strings.xml @@ -20,9 +20,11 @@ "瀏覽首頁" "向上瀏覽" "更多選項" + "收合" "%1$s:%2$s" "%1$s - %2$s:%3$s" "搜尋" + "搜尋…" "搜尋查詢" "清除查詢" "提交查詢" diff --git a/eclipse-compile/appcompat/res/values-zu/strings.xml b/eclipse-compile/appcompat/res/values-zu/strings.xml index a6a06ab2f1..48d586bba3 100644 --- a/eclipse-compile/appcompat/res/values-zu/strings.xml +++ b/eclipse-compile/appcompat/res/values-zu/strings.xml @@ -20,9 +20,11 @@ "Zulazulela ekhaya" "Zulazulela phezulu" "Izinketho eziningi" + "Goqa" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Sesha" + "Iyasesha..." "Umbuzo wosesho" "Sula inkinga" "Hambisa umbuzo" diff --git a/eclipse-compile/appcompat/res/values/attrs.xml b/eclipse-compile/appcompat/res/values/attrs.xml index e2dbdea8af..62c608508c 100644 --- a/eclipse-compile/appcompat/res/values/attrs.xml +++ b/eclipse-compile/appcompat/res/values/attrs.xml @@ -42,6 +42,9 @@ in place of the usual title bar. --> + + + @@ -70,6 +73,7 @@ + @@ -161,6 +165,17 @@ + + + + + + + + + + + @@ -181,11 +196,9 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + @@ -626,6 +668,8 @@ + + @@ -655,6 +699,7 @@ + @@ -718,13 +763,6 @@ - - - - @@ -814,4 +852,12 @@ + + + + + + + + diff --git a/eclipse-compile/appcompat/res/values/colors_material.xml b/eclipse-compile/appcompat/res/values/colors_material.xml index 94448b5800..6b3cca5d48 100644 --- a/eclipse-compile/appcompat/res/values/colors_material.xml +++ b/eclipse-compile/appcompat/res/values/colors_material.xml @@ -23,12 +23,12 @@ #ffeeeeee #ff212121 - #ffbdbdbd + #ffefefef #ff000000 #ff757575 - #40ffffff - #40000000 + #4dffffff + #1f000000 @color/material_deep_teal_500 @color/material_deep_teal_200 @@ -38,6 +38,8 @@ #ffbdbdbd #fff1f1f1 + #ff616161 + #ffbdbdbd @android:color/white @android:color/black diff --git a/eclipse-compile/appcompat/res/values/config.xml b/eclipse-compile/appcompat/res/values/config.xml index a57f2e4a3f..be6a7a1a12 100644 --- a/eclipse-compile/appcompat/res/values/config.xml +++ b/eclipse-compile/appcompat/res/values/config.xml @@ -32,4 +32,10 @@ it should be disabled in that locale's resources. --> true + + 150 + 220 + + true + \ No newline at end of file diff --git a/eclipse-compile/appcompat/res/values/dimens.xml b/eclipse-compile/appcompat/res/values/dimens.xml index 54baac37d6..fb0d94caaf 100644 --- a/eclipse-compile/appcompat/res/values/dimens.xml +++ b/eclipse-compile/appcompat/res/values/dimens.xml @@ -58,9 +58,30 @@ (the screen is in landscape). This may be either a fraction or a dimension.--> 100% + 6dp + @dimen/abc_control_inset_material + + @dimen/abc_control_padding_material + 8dp + 4dp 4dp + + 2dp + + 4dp + 10dp + 7dp + + + 3dp + + 24dp + 18dp + + + 48dp diff --git a/eclipse-compile/appcompat/res/values/dimens_material.xml b/eclipse-compile/appcompat/res/values/dimens_material.xml index a620b31079..6f5f1f8f56 100644 --- a/eclipse-compile/appcompat/res/values/dimens_material.xml +++ b/eclipse-compile/appcompat/res/values/dimens_material.xml @@ -20,6 +20,8 @@ 56dp 4dp + + 16dp 16dp @@ -27,6 +29,17 @@ 5dp + + @dimen/abc_action_bar_content_inset_material + + + 0dp + + 6dp + + 10dp + 36dp 48dp 48dp @@ -50,4 +63,9 @@ 18sp 14sp + 16dp + + 0.26 + 0.30 + diff --git a/eclipse-compile/appcompat/res/values/strings.xml b/eclipse-compile/appcompat/res/values/strings.xml index 5080070da9..87cfd29cf9 100644 --- a/eclipse-compile/appcompat/res/values/strings.xml +++ b/eclipse-compile/appcompat/res/values/strings.xml @@ -41,6 +41,8 @@ Search + + Search… Search query diff --git a/eclipse-compile/appcompat/res/values/styles.xml b/eclipse-compile/appcompat/res/values/styles.xml index 1b8b53b809..13d910e23c 100644 --- a/eclipse-compile/appcompat/res/values/styles.xml +++ b/eclipse-compile/appcompat/res/values/styles.xml @@ -60,8 +60,7 @@ - - - - + + @@ -72,6 +74,7 @@ + + - - - - @@ -334,27 +334,49 @@ @drawable/abc_textfield_search_material @drawable/abc_ic_clear_mtrl_alpha @drawable/abc_ic_search_api_mtrl_alpha + @drawable/abc_ic_search_api_mtrl_alpha @drawable/abc_ic_go_search_api_mtrl_alpha @drawable/abc_ic_voice_search_api_mtrl_alpha @drawable/abc_ic_commit_search_api_mtrl_alpha @layout/abc_search_dropdown_item_icons_2line + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/eclipse-compile/appcompat/res/values/styles_rtl.xml b/eclipse-compile/appcompat/res/values/styles_rtl.xml index fad129176f..53208008a5 100644 --- a/eclipse-compile/appcompat/res/values/styles_rtl.xml +++ b/eclipse-compile/appcompat/res/values/styles_rtl.xml @@ -47,14 +47,9 @@ 8dp - - + + \ No newline at end of file diff --git a/eclipse-compile/appcompat/res/values/themes.xml b/eclipse-compile/appcompat/res/values/themes.xml index 05b8657456..5742251ea2 100644 --- a/eclipse-compile/appcompat/res/values/themes.xml +++ b/eclipse-compile/appcompat/res/values/themes.xml @@ -36,12 +36,12 @@ + - - - @@ -337,8 +304,8 @@ 64dp 48dp 80dp - 16dip - 16dip + @dimen/abc_list_item_padding_horizontal_material + @dimen/abc_list_item_padding_horizontal_material @style/Widget.AppCompat.DropDownItem.Spinner @@ -359,7 +326,7 @@ @style/TextAppearance.AppCompat.SearchResult.Subtitle - @style/Widget.AppCompat.Light.ActivityChooserView + @style/Widget.AppCompat.ActivityChooserView @style/Widget.AppCompat.Toolbar @@ -368,6 +335,7 @@ @style/Widget.AppCompat.EditText @drawable/abc_edit_text_material ?android:attr/textColorPrimary + @style/Widget.AppCompat.AutoCompleteTextView @color/primary_dark_material_light @@ -377,11 +345,28 @@ ?android:attr/textColorSecondary ?attr/colorAccent @color/ripple_material_light - @color/switch_thumb_normal_material_light + @color/button_material_light + @color/switch_thumb_material_light @style/Widget.AppCompat.DrawerArrowToggle + @style/Widget.AppCompat.CompoundButton.CheckBox + @style/Widget.AppCompat.CompoundButton.RadioButton @style/Widget.AppCompat.CompoundButton.Switch + + @style/Widget.AppCompat.RatingBar + + + @style/Widget.AppCompat.Button + @style/Widget.AppCompat.Button.Small + @style/TextAppearance.AppCompat.Button + + @style/Widget.AppCompat.ButtonBar + @style/Widget.AppCompat.Button.ButtonBar.AlertDialog + + + @style/Theme.AppCompat.Light.Dialog + @dimen/abc_dialog_padding_material - - - @style/Widget.AppCompat.ActionMode - @drawable/abc_cab_background_top_material - ?attr/colorPrimaryDark - @drawable/abc_ic_ab_back_mtrl_am_alpha - @style/Widget.AppCompat.ActionButton.CloseMode + diff --git a/eclipse-compile/appcompat/src/android/support/v7/app/ActionBar.java b/eclipse-compile/appcompat/src/android/support/v7/app/ActionBar.java new file mode 100644 index 0000000000..d48dd31772 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/app/ActionBar.java @@ -0,0 +1,1358 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.app; + +import android.content.Context; +import android.content.res.Configuration; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.support.annotation.DrawableRes; +import android.support.annotation.IntDef; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.annotation.StringRes; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentTransaction; +import android.support.v4.view.GravityCompat; +import android.support.v7.appcompat.R; +import android.support.v7.view.ActionMode; +import android.util.AttributeSet; +import android.view.Gravity; +import android.view.KeyEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.widget.SpinnerAdapter; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * A primary toolbar within the activity that may display the activity title, application-level + * navigation affordances, 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. + *

      + * + *

      Beginning with Android L (API level 21), the action bar may be represented by any + * Toolbar widget within the application layout. The application may signal to the Activity + * which Toolbar should be treated as the Activity's action bar. Activities that use this + * feature should use one of the supplied .NoActionBar themes, set the + * {@link android.R.styleable#Theme_windowActionBar windowActionBar} attribute to false + * or otherwise not request the window feature.

      + * + *

      By adjusting the window features requested by the theme and the layouts used for + * an Activity's content view, an app can use the standard system action bar on older platform + * releases and the newer inline toolbars on newer platform releases. The ActionBar + * object obtained from the Activity can be used to control either configuration transparently.

      + * + *

      When using the Holo themes 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.

      + * + *

      When using the Material themes (default in API 21 or newer) the navigation button + * (formerly "Home") takes over the space previously occupied by the application icon. + * Apps wishing to express a stronger branding should use their brand colors heavily + * in the action bar and other application chrome or use a {@link #setLogo(int) logo} + * in place of their standard title text.

      + * + *

      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 { + + /** @hide */ + @Retention(RetentionPolicy.SOURCE) + @IntDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS}) + public @interface NavigationMode {} + + /** + * 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. + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + public static final int NAVIGATION_MODE_STANDARD = 0; + + /** + * 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. + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + public static final int NAVIGATION_MODE_LIST = 1; + + /** + * Tab navigation mode. Instead of static title text this mode + * presents a series of tabs for navigation within the activity. + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + public static final int NAVIGATION_MODE_TABS = 2; + + /** @hide */ + @IntDef(flag=true, value={ + DISPLAY_USE_LOGO, + DISPLAY_SHOW_HOME, + DISPLAY_HOME_AS_UP, + DISPLAY_SHOW_TITLE, + DISPLAY_SHOW_CUSTOM + }) + @Retention(RetentionPolicy.SOURCE) + public @interface DisplayOptions {} + + /** + * 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 = 0x1; + + /** + * 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 = 0x2; + + /** + * 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 = 0x4; + + /** + * 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 = 0x8; + + /** + * 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 = 0x10; + + /** + * 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(@DrawableRes 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(@DrawableRes 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. + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + 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. + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + 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. + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + public abstract int getSelectedNavigationIndex(); + + /** + * Get the number of navigation items present in the current navigation mode. + * + * @return Number of navigation items. + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + 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(@StringRes 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(@DisplayOptions 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(@DisplayOptions int options, @DisplayOptions 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(@Nullable 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. + */ + @Nullable + 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. + */ + @Nullable + 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. + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + @NavigationMode + 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 + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + public abstract void setNavigationMode(@NavigationMode int mode); + + /** + * @return The current set of display options. + */ + @DisplayOptions + 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) + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + 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 + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + 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. + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + 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 + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + 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. + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + 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 + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + 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 + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + public abstract void removeTabAt(int position); + + /** + * Remove all tabs from the action bar and deselect the current tab. + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + 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 + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + 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 + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + @Nullable + public abstract Tab getSelectedTab(); + + /** + * Returns the tab at the specified index. + * + * @param index Index value in the range 0-get + * @return + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + public abstract Tab getTabAt(int index); + + /** + * Returns the number of tabs currently registered with the action bar. + * + * @return Tab count + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + 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. + * + *

      If you are hiding the ActionBar through + * {@link View#SYSTEM_UI_FLAG_FULLSCREEN View.SYSTEM_UI_FLAG_FULLSCREEN}, + * you should not call this function directly. + */ + 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. + * + *

      Instead of calling this function directly, you can also cause an + * ActionBar using the overlay feature to hide through + * {@link View#SYSTEM_UI_FLAG_FULLSCREEN View.SYSTEM_UI_FLAG_FULLSCREEN}. + * Hiding the ActionBar through this system UI flag allows you to more + * seamlessly hide it in conjunction with other screen decorations. + */ + 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; + } + + /** + * Returns true if the Title field has been truncated during layout for lack + * of available space. + * + * @return true if the Title field has been truncated + * @hide pending API approval + */ + public boolean isTitleTruncated() { return false; } + + /** + * Set an alternate drawable to display next to the icon/logo/title + * when {@link #DISPLAY_HOME_AS_UP} is enabled. This can be useful if you are using + * this mode to display an alternate selection for up navigation, such as a sliding drawer. + * + *

      If you pass null to this method, the default drawable from the theme + * will be used.

      + * + *

      If you implement alternate or intermediate behavior around Up, you should also + * call {@link #setHomeActionContentDescription(int) setHomeActionContentDescription()} + * to provide a correct description of the action for accessibility support.

      + * + * @param indicator A drawable to use for the up indicator, or null to use the theme's default + * + * @see #setDisplayOptions(int, int) + * @see #setDisplayHomeAsUpEnabled(boolean) + * @see #setHomeActionContentDescription(int) + */ + public void setHomeAsUpIndicator(@Nullable Drawable indicator) {} + + /** + * Set an alternate drawable to display next to the icon/logo/title + * when {@link #DISPLAY_HOME_AS_UP} is enabled. This can be useful if you are using + * this mode to display an alternate selection for up navigation, such as a sliding drawer. + * + *

      If you pass 0 to this method, the default drawable from the theme + * will be used.

      + * + *

      If you implement alternate or intermediate behavior around Up, you should also + * call {@link #setHomeActionContentDescription(int) setHomeActionContentDescription()} + * to provide a correct description of the action for accessibility support.

      + * + * @param resId Resource ID of a drawable to use for the up indicator, or 0 + * to use the theme's default + * + * @see #setDisplayOptions(int, int) + * @see #setDisplayHomeAsUpEnabled(boolean) + * @see #setHomeActionContentDescription(int) + */ + public void setHomeAsUpIndicator(@DrawableRes int resId) {} + + /** + * Set an alternate description for the Home/Up action, when enabled. + * + *

      This description is commonly used for accessibility/screen readers when + * the Home action is enabled. (See {@link #setDisplayHomeAsUpEnabled(boolean)}.) + * Examples of this are, "Navigate Home" or "Navigate Up" depending on the + * {@link #DISPLAY_HOME_AS_UP} display option. If you have changed the home-as-up + * indicator using {@link #setHomeAsUpIndicator(int)} to indicate more specific + * functionality such as a sliding drawer, you should also set this to accurately + * describe the action.

      + * + *

      Setting this to null will use the system default description.

      + * + * @param description New description for the Home action when enabled + * @see #setHomeAsUpIndicator(int) + * @see #setHomeAsUpIndicator(android.graphics.drawable.Drawable) + */ + public void setHomeActionContentDescription(@Nullable CharSequence description) {} + + /** + * Set an alternate description for the Home/Up action, when enabled. + * + *

      This description is commonly used for accessibility/screen readers when + * the Home action is enabled. (See {@link #setDisplayHomeAsUpEnabled(boolean)}.) + * Examples of this are, "Navigate Home" or "Navigate Up" depending on the + * {@link #DISPLAY_HOME_AS_UP} display option. If you have changed the home-as-up + * indicator using {@link #setHomeAsUpIndicator(int)} to indicate more specific + * functionality such as a sliding drawer, you should also set this to accurately + * describe the action.

      + * + *

      Setting this to 0 will use the system default description.

      + * + * @param resId Resource ID of a string to use as the new description + * for the Home action when enabled + * @see #setHomeAsUpIndicator(int) + * @see #setHomeAsUpIndicator(android.graphics.drawable.Drawable) + */ + public void setHomeActionContentDescription(@StringRes int resId) {} + + /** + * Enable hiding the action bar on content scroll. + * + *

      If enabled, the action bar will scroll out of sight along with a + * {@link View#setNestedScrollingEnabled(boolean) nested scrolling child} view's content. + * The action bar must be in {@link Window#FEATURE_ACTION_BAR_OVERLAY overlay mode} + * to enable hiding on content scroll.

      + * + *

      When partially scrolled off screen the action bar is considered + * {@link #hide() hidden}. A call to {@link #show() show} will cause it to return to full view. + *

      + * @param hideOnContentScroll true to enable hiding on content scroll. + */ + public void setHideOnContentScrollEnabled(boolean hideOnContentScroll) { + if (hideOnContentScroll) { + throw new UnsupportedOperationException("Hide on content scroll is not supported in " + + "this action bar configuration."); + } + } + + /** + * Return whether the action bar is configured to scroll out of sight along with + * a {@link View#setNestedScrollingEnabled(boolean) nested scrolling child}. + * + * @return true if hide-on-content-scroll is enabled + * @see #setHideOnContentScrollEnabled(boolean) + */ + public boolean isHideOnContentScrollEnabled() { + return false; + } + + /** + * Return the current vertical offset of the action bar. + * + *

      The action bar's current hide offset is the distance that the action bar is currently + * scrolled offscreen in pixels. The valid range is 0 (fully visible) to the action bar's + * current measured {@link #getHeight() height} (fully invisible).

      + * + * @return The action bar's offset toward its fully hidden state in pixels + */ + public int getHideOffset() { + return 0; + } + + /** + * Set the current hide offset of the action bar. + * + *

      The action bar's current hide offset is the distance that the action bar is currently + * scrolled offscreen in pixels. The valid range is 0 (fully visible) to the action bar's + * current measured {@link #getHeight() height} (fully invisible).

      + * + * @param offset The action bar's offset toward its fully hidden state in pixels. + */ + public void setHideOffset(int offset) { + if (offset != 0) { + throw new UnsupportedOperationException("Setting an explicit action bar hide offset " + + "is not supported in this action bar configuration."); + } + } + + /** + * Set the Z-axis elevation of the action bar in pixels. + * + *

      The action bar's elevation is the distance it is placed from its parent surface. Higher + * values are closer to the user.

      + * + * @param elevation Elevation value in pixels + */ + public void setElevation(float elevation) { + if (elevation != 0) { + throw new UnsupportedOperationException("Setting a non-zero elevation is " + + "not supported in this action bar configuration."); + } + } + + /** + * Get the Z-axis elevation of the action bar in pixels. + * + *

      The action bar's elevation is the distance it is placed from its parent surface. Higher + * values are closer to the user.

      + * + * @return Elevation value in pixels + */ + public float getElevation() { + return 0; + } + + /** @hide */ + public void setDefaultDisplayHomeAsUpEnabled(boolean enabled) { + } + + /** @hide */ + public void setShowHideAnimationEnabled(boolean enabled) { + } + + /** @hide */ + public void onConfigurationChanged(Configuration config) { + } + + /** @hide */ + public void dispatchMenuVisibilityChanged(boolean visible) { + } + + /** @hide */ + public ActionMode startActionMode(ActionMode.Callback callback) { + return null; + } + + /** @hide */ + public boolean openOptionsMenu() { + return false; + } + + /** @hide */ + public boolean invalidateOptionsMenu() { + return false; + } + + /** @hide */ + public boolean onMenuKeyEvent(KeyEvent event) { + return false; + } + + /** @hide **/ + public boolean onKeyShortcut(int keyCode, KeyEvent ev) { + return false; + } + + /** @hide */ + public boolean collapseActionView() { + return false; + } + + /** @hide */ + public void setWindowTitle(CharSequence title) { + } + + /** + * Listener interface for ActionBar navigation events. + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + 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. + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + 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(@DrawableRes 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. + * + * @deprecated Action bar navigation modes are deprecated and not supported by inline + * toolbar action bars. Consider using other + * common + * navigation patterns instead. + */ + 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. + */ + public static class LayoutParams extends ViewGroup.MarginLayoutParams { + /** + * Gravity for the view associated with these LayoutParams. + * + * @see android.view.Gravity + */ + public int gravity = Gravity.NO_GRAVITY; + + public LayoutParams(@NonNull Context c, AttributeSet attrs) { + super(c, attrs); + + TypedArray a = c.obtainStyledAttributes(attrs, R.styleable.ActionBarLayout); + gravity = a.getInt(R.styleable.ActionBarLayout_android_layout_gravity, Gravity.NO_GRAVITY); + a.recycle(); + } + + public LayoutParams(int width, int height) { + super(width, height); + this.gravity = Gravity.CENTER_VERTICAL | GravityCompat.START; + } + + public LayoutParams(int width, int height, int gravity) { + super(width, height); + this.gravity = gravity; + } + + public LayoutParams(int gravity) { + this(WRAP_CONTENT, MATCH_PARENT, gravity); + } + + public LayoutParams(LayoutParams source) { + super(source); + + this.gravity = source.gravity; + } + + public LayoutParams(ViewGroup.LayoutParams source) { + super(source); + } + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/app/ActionBarActivity.java b/eclipse-compile/appcompat/src/android/support/v7/app/ActionBarActivity.java new file mode 100644 index 0000000000..1834681d80 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/app/ActionBarActivity.java @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.app; + +/** + * @deprecated Use {@link android.support.v7.app.AppCompatActivity} instead. + */ +@Deprecated +public class ActionBarActivity extends AppCompatActivity { +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/app/ActionBarDrawerToggle.java b/eclipse-compile/appcompat/src/android/support/v7/app/ActionBarDrawerToggle.java new file mode 100644 index 0000000000..93a79a63d3 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/app/ActionBarDrawerToggle.java @@ -0,0 +1,697 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package android.support.v7.app; + +import android.app.Activity; +import android.app.ActionBar; +import android.content.Context; +import android.content.res.Configuration; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.support.annotation.Nullable; +import android.support.annotation.StringRes; +import android.support.v4.view.GravityCompat; +import android.support.v4.view.ViewCompat; +import android.support.v4.widget.DrawerLayout; +import android.support.v7.widget.Toolbar; +import android.util.Log; +import android.view.MenuItem; +import android.view.View; +import android.support.v7.appcompat.R; + +/** + * This class provides a handy way to tie together the functionality of + * {@link android.support.v4.widget.DrawerLayout} and the framework ActionBar to + * implement the recommended design for navigation drawers. + * + *

      To use ActionBarDrawerToggle, create one in your Activity and call through + * to the following methods corresponding to your Activity callbacks:

      + * + *
        + *
      • {@link android.app.Activity#onConfigurationChanged(android.content.res.Configuration) + * onConfigurationChanged} + *
      • {@link android.app.Activity#onOptionsItemSelected(android.view.MenuItem) + * onOptionsItemSelected}
      • + *
      + * + *

      Call {@link #syncState()} from your Activity's + * {@link android.app.Activity#onPostCreate(android.os.Bundle) onPostCreate} to synchronize the + * indicator with the state of the linked DrawerLayout after onRestoreInstanceState + * has occurred.

      + * + *

      ActionBarDrawerToggle can be used directly as a + * {@link android.support.v4.widget.DrawerLayout.DrawerListener}, or if you are already providing + * your own listener, call through to each of the listener methods from your own.

      + * + *

      + * You can customize the the animated toggle by defining the + * {@link android.support.v7.appcompat.R.styleable#DrawerArrowToggle drawerArrowStyle} in your + * ActionBar theme. + */ +public class ActionBarDrawerToggle implements DrawerLayout.DrawerListener { + + /** + * Allows an implementing Activity to return an {@link ActionBarDrawerToggle.Delegate} to use + * with ActionBarDrawerToggle. + */ + public interface DelegateProvider { + + /** + * @return Delegate to use for ActionBarDrawableToggles, or null if the Activity + * does not wish to override the default behavior. + */ + @Nullable + Delegate getDrawerToggleDelegate(); + } + + public interface Delegate { + + /** + * Set the Action Bar's up indicator drawable and content description. + * + * @param upDrawable - Drawable to set as up indicator + * @param contentDescRes - Content description to set + */ + void setActionBarUpIndicator(Drawable upDrawable, @StringRes int contentDescRes); + + /** + * Set the Action Bar's up indicator content description. + * + * @param contentDescRes - Content description to set + */ + void setActionBarDescription(@StringRes int contentDescRes); + + /** + * Returns the drawable to be set as up button when DrawerToggle is disabled + */ + Drawable getThemeUpIndicator(); + + /** + * Returns the context of ActionBar + */ + Context getActionBarThemedContext(); + + /** + * Returns whether navigation icon is visible or not. + * Used to print warning messages in case developer forgets to set displayHomeAsUp to true + */ + boolean isNavigationVisible(); + } + + private final Delegate mActivityImpl; + private final DrawerLayout mDrawerLayout; + + private DrawerToggle mSlider; + private Drawable mHomeAsUpIndicator; + private boolean mDrawerIndicatorEnabled = true; + private boolean mHasCustomUpIndicator; + private final int mOpenDrawerContentDescRes; + private final int mCloseDrawerContentDescRes; + // used in toolbar mode when DrawerToggle is disabled + private View.OnClickListener mToolbarNavigationClickListener; + // If developer does not set displayHomeAsUp, DrawerToggle won't show up. + // DrawerToggle logs a warning if this case is detected + private boolean mWarnedForDisplayHomeAsUp = false; + + /** + * Construct a new ActionBarDrawerToggle. + * + *

      The given {@link Activity} will be linked to the specified {@link DrawerLayout} and + * its Actionbar's Up button will be set to a custom drawable. + *

      This drawable shows a Hamburger icon when drawer is closed and an arrow when drawer + * is open. It animates between these two states as the drawer opens.

      + * + *

      String resources must be provided to describe the open/close drawer actions for + * accessibility services.

      + * + * @param activity The Activity hosting the drawer. Should have an ActionBar. + * @param drawerLayout The DrawerLayout to link to the given Activity's ActionBar + * @param openDrawerContentDescRes A String resource to describe the "open drawer" action + * for accessibility + * @param closeDrawerContentDescRes A String resource to describe the "close drawer" action + * for accessibility + */ + public ActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout, + @StringRes int openDrawerContentDescRes, + @StringRes int closeDrawerContentDescRes) { + this(activity, null, drawerLayout, null, openDrawerContentDescRes, + closeDrawerContentDescRes); + } + + /** + * Construct a new ActionBarDrawerToggle with a Toolbar. + *

      + * The given {@link Activity} will be linked to the specified {@link DrawerLayout} and + * the Toolbar's navigation icon will be set to a custom drawable. Using this constructor + * will set Toolbar's navigation click listener to toggle the drawer when it is clicked. + *

      + * This drawable shows a Hamburger icon when drawer is closed and an arrow when drawer + * is open. It animates between these two states as the drawer opens. + *

      + * String resources must be provided to describe the open/close drawer actions for + * accessibility services. + *

      + * Please use {@link #ActionBarDrawerToggle(Activity, DrawerLayout, int, int)} if you are + * setting the Toolbar as the ActionBar of your activity. + * + * @param activity The Activity hosting the drawer. + * @param toolbar The toolbar to use if you have an independent Toolbar. + * @param drawerLayout The DrawerLayout to link to the given Activity's ActionBar + * @param openDrawerContentDescRes A String resource to describe the "open drawer" action + * for accessibility + * @param closeDrawerContentDescRes A String resource to describe the "close drawer" action + * for accessibility + */ + public ActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout, + Toolbar toolbar, @StringRes int openDrawerContentDescRes, + @StringRes int closeDrawerContentDescRes) { + this(activity, toolbar, drawerLayout, null, openDrawerContentDescRes, + closeDrawerContentDescRes); + } + + /** + * In the future, we can make this constructor public if we want to let developers customize + * the + * animation. + */ + ActionBarDrawerToggle(Activity activity, Toolbar toolbar, + DrawerLayout drawerLayout, T slider, + @StringRes int openDrawerContentDescRes, + @StringRes int closeDrawerContentDescRes) { + if (toolbar != null) { + mActivityImpl = new ToolbarCompatDelegate(toolbar); + toolbar.setNavigationOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (mDrawerIndicatorEnabled) { + toggle(); + } else if (mToolbarNavigationClickListener != null) { + mToolbarNavigationClickListener.onClick(v); + } + } + }); + } else if (activity instanceof DelegateProvider) { // Allow the Activity to provide an impl + mActivityImpl = ((DelegateProvider) activity).getDrawerToggleDelegate(); + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { + mActivityImpl = new JellybeanMr2Delegate(activity); + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + mActivityImpl = new HoneycombDelegate(activity); + } else { + mActivityImpl = new DummyDelegate(activity); + } + + mDrawerLayout = drawerLayout; + mOpenDrawerContentDescRes = openDrawerContentDescRes; + mCloseDrawerContentDescRes = closeDrawerContentDescRes; + if (slider == null) { + mSlider = new DrawerArrowDrawableToggle(activity, + mActivityImpl.getActionBarThemedContext()); + } else { + mSlider = slider; + } + + mHomeAsUpIndicator = getThemeUpIndicator(); + } + + /** + * Synchronize the state of the drawer indicator/affordance with the linked DrawerLayout. + * + *

      This should be called from your Activity's + * {@link Activity#onPostCreate(android.os.Bundle) onPostCreate} method to synchronize after + * the DrawerLayout's instance state has been restored, and any other time when the state + * may have diverged in such a way that the ActionBarDrawerToggle was not notified. + * (For example, if you stop forwarding appropriate drawer events for a period of time.)

      + */ + public void syncState() { + if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) { + mSlider.setPosition(1); + } else { + mSlider.setPosition(0); + } + if (mDrawerIndicatorEnabled) { + setActionBarUpIndicator((Drawable) mSlider, + mDrawerLayout.isDrawerOpen(GravityCompat.START) ? + mCloseDrawerContentDescRes : mOpenDrawerContentDescRes); + } + } + + /** + * This method should always be called by your Activity's + * {@link Activity#onConfigurationChanged(android.content.res.Configuration) + * onConfigurationChanged} + * method. + * + * @param newConfig The new configuration + */ + public void onConfigurationChanged(Configuration newConfig) { + // Reload drawables that can change with configuration + if (!mHasCustomUpIndicator) { + mHomeAsUpIndicator = getThemeUpIndicator(); + } + syncState(); + } + + /** + * This method should be called by your Activity's + * {@link Activity#onOptionsItemSelected(android.view.MenuItem) onOptionsItemSelected} method. + * If it returns true, your onOptionsItemSelected method should return true and + * skip further processing. + * + * @param item the MenuItem instance representing the selected menu item + * @return true if the event was handled and further processing should not occur + */ + public boolean onOptionsItemSelected(MenuItem item) { + if (item != null && item.getItemId() == android.R.id.home && mDrawerIndicatorEnabled) { + toggle(); + return true; + } + return false; + } + + private void toggle() { + if (mDrawerLayout.isDrawerVisible(GravityCompat.START)) { + mDrawerLayout.closeDrawer(GravityCompat.START); + } else { + mDrawerLayout.openDrawer(GravityCompat.START); + } + } + + /** + * Set the up indicator to display when the drawer indicator is not + * enabled. + *

      + * If you pass null to this method, the default drawable from + * the theme will be used. + * + * @param indicator A drawable to use for the up indicator, or null to use + * the theme's default + * @see #setDrawerIndicatorEnabled(boolean) + */ + public void setHomeAsUpIndicator(Drawable indicator) { + if (indicator == null) { + mHomeAsUpIndicator = getThemeUpIndicator(); + mHasCustomUpIndicator = false; + } else { + mHomeAsUpIndicator = indicator; + mHasCustomUpIndicator = true; + } + + if (!mDrawerIndicatorEnabled) { + setActionBarUpIndicator(mHomeAsUpIndicator, 0); + } + } + + /** + * Set the up indicator to display when the drawer indicator is not + * enabled. + *

      + * If you pass 0 to this method, the default drawable from the theme will + * be used. + * + * @param resId Resource ID of a drawable to use for the up indicator, or 0 + * to use the theme's default + * @see #setDrawerIndicatorEnabled(boolean) + */ + public void setHomeAsUpIndicator(int resId) { + Drawable indicator = null; + if (resId != 0) { + indicator = mDrawerLayout.getResources().getDrawable(resId); + } + setHomeAsUpIndicator(indicator); + } + + /** + * @return true if the enhanced drawer indicator is enabled, false otherwise + * @see #setDrawerIndicatorEnabled(boolean) + */ + public boolean isDrawerIndicatorEnabled() { + return mDrawerIndicatorEnabled; + } + + /** + * Enable or disable the drawer indicator. The indicator defaults to enabled. + * + *

      When the indicator is disabled, the ActionBar will revert to displaying + * the home-as-up indicator provided by the Activity's theme in the + * android.R.attr.homeAsUpIndicator attribute instead of the animated + * drawer glyph.

      + * + * @param enable true to enable, false to disable + */ + public void setDrawerIndicatorEnabled(boolean enable) { + if (enable != mDrawerIndicatorEnabled) { + if (enable) { + setActionBarUpIndicator((Drawable) mSlider, + mDrawerLayout.isDrawerOpen(GravityCompat.START) ? + mCloseDrawerContentDescRes : mOpenDrawerContentDescRes); + } else { + setActionBarUpIndicator(mHomeAsUpIndicator, 0); + } + mDrawerIndicatorEnabled = enable; + } + } + + + /** + * {@link DrawerLayout.DrawerListener} callback method. If you do not use your + * ActionBarDrawerToggle instance directly as your DrawerLayout's listener, you should call + * through to this method from your own listener object. + * + * @param drawerView The child view that was moved + * @param slideOffset The new offset of this drawer within its range, from 0-1 + */ + @Override + public void onDrawerSlide(View drawerView, float slideOffset) { + mSlider.setPosition(Math.min(1f, Math.max(0, slideOffset))); + } + + /** + * {@link DrawerLayout.DrawerListener} callback method. If you do not use your + * ActionBarDrawerToggle instance directly as your DrawerLayout's listener, you should call + * through to this method from your own listener object. + * + * @param drawerView Drawer view that is now open + */ + @Override + public void onDrawerOpened(View drawerView) { + mSlider.setPosition(1); + if (mDrawerIndicatorEnabled) { + setActionBarDescription(mCloseDrawerContentDescRes); + } + } + + /** + * {@link DrawerLayout.DrawerListener} callback method. If you do not use your + * ActionBarDrawerToggle instance directly as your DrawerLayout's listener, you should call + * through to this method from your own listener object. + * + * @param drawerView Drawer view that is now closed + */ + @Override + public void onDrawerClosed(View drawerView) { + mSlider.setPosition(0); + if (mDrawerIndicatorEnabled) { + setActionBarDescription(mOpenDrawerContentDescRes); + } + } + + /** + * {@link DrawerLayout.DrawerListener} callback method. If you do not use your + * ActionBarDrawerToggle instance directly as your DrawerLayout's listener, you should call + * through to this method from your own listener object. + * + * @param newState The new drawer motion state + */ + @Override + public void onDrawerStateChanged(int newState) { + } + + /** + * Returns the fallback listener for Navigation icon click events. + * + * @return The click listener which receives Navigation click events from Toolbar when + * drawer indicator is disabled. + * @see #setToolbarNavigationClickListener(android.view.View.OnClickListener) + * @see #setDrawerIndicatorEnabled(boolean) + * @see #isDrawerIndicatorEnabled() + */ + public View.OnClickListener getToolbarNavigationClickListener() { + return mToolbarNavigationClickListener; + } + + /** + * When DrawerToggle is constructed with a Toolbar, it sets the click listener on + * the Navigation icon. If you want to listen for clicks on the Navigation icon when + * DrawerToggle is disabled ({@link #setDrawerIndicatorEnabled(boolean)}, you should call this + * method with your listener and DrawerToggle will forward click events to that listener + * when drawer indicator is disabled. + * + * @see #setDrawerIndicatorEnabled(boolean) + */ + public void setToolbarNavigationClickListener( + View.OnClickListener onToolbarNavigationClickListener) { + mToolbarNavigationClickListener = onToolbarNavigationClickListener; + } + + void setActionBarUpIndicator(Drawable upDrawable, int contentDescRes) { + if (!mWarnedForDisplayHomeAsUp && !mActivityImpl.isNavigationVisible()) { + Log.w("ActionBarDrawerToggle", "DrawerToggle may not show up because NavigationIcon" + + " is not visible. You may need to call " + + "actionbar.setDisplayHomeAsUpEnabled(true);"); + mWarnedForDisplayHomeAsUp = true; + } + mActivityImpl.setActionBarUpIndicator(upDrawable, contentDescRes); + } + + void setActionBarDescription(int contentDescRes) { + mActivityImpl.setActionBarDescription(contentDescRes); + } + + Drawable getThemeUpIndicator() { + return mActivityImpl.getThemeUpIndicator(); + } + + static class DrawerArrowDrawableToggle extends DrawerArrowDrawable + implements DrawerToggle { + + private final Activity mActivity; + + public DrawerArrowDrawableToggle(Activity activity, Context themedContext) { + super(themedContext); + mActivity = activity; + } + + public void setPosition(float position) { + if (position == 1f) { + setVerticalMirror(true); + } else if (position == 0f) { + setVerticalMirror(false); + } + super.setProgress(position); + } + + @Override + boolean isLayoutRtl() { + return ViewCompat.getLayoutDirection(mActivity.getWindow().getDecorView()) + == ViewCompat.LAYOUT_DIRECTION_RTL; + } + + public float getPosition() { + return super.getProgress(); + } + } + + /** + * Interface for toggle drawables. Can be public in the future + */ + static interface DrawerToggle { + + public void setPosition(float position); + + public float getPosition(); + } + + /** + * Delegate if SDK version is between honeycomb and JBMR2 + */ + private static class HoneycombDelegate implements Delegate { + + final Activity mActivity; + ActionBarDrawerToggleHoneycomb.SetIndicatorInfo mSetIndicatorInfo; + + private HoneycombDelegate(Activity activity) { + mActivity = activity; + } + + @Override + public Drawable getThemeUpIndicator() { + return ActionBarDrawerToggleHoneycomb.getThemeUpIndicator(mActivity); + } + + @Override + public Context getActionBarThemedContext() { + final ActionBar actionBar = mActivity.getActionBar(); + final Context context; + if (actionBar != null) { + context = actionBar.getThemedContext(); + } else { + context = mActivity; + } + return context; + } + + @Override + public boolean isNavigationVisible() { + final ActionBar actionBar = mActivity.getActionBar(); + return actionBar != null + && (actionBar.getDisplayOptions() & ActionBar.DISPLAY_HOME_AS_UP) != 0; + } + + @Override + public void setActionBarUpIndicator(Drawable themeImage, int contentDescRes) { + mActivity.getActionBar().setDisplayShowHomeEnabled(true); + mSetIndicatorInfo = ActionBarDrawerToggleHoneycomb.setActionBarUpIndicator( + mSetIndicatorInfo, mActivity, themeImage, contentDescRes); + mActivity.getActionBar().setDisplayShowHomeEnabled(false); + } + + @Override + public void setActionBarDescription(int contentDescRes) { + mSetIndicatorInfo = ActionBarDrawerToggleHoneycomb.setActionBarDescription( + mSetIndicatorInfo, mActivity, contentDescRes); + } + } + + /** + * Delegate if SDK version is JB MR2 or newer + */ + private static class JellybeanMr2Delegate implements Delegate { + + final Activity mActivity; + + private JellybeanMr2Delegate(Activity activity) { + mActivity = activity; + } + + @Override + public Drawable getThemeUpIndicator() { + final TypedArray a = getActionBarThemedContext().obtainStyledAttributes(null, + new int[]{android.R.attr.homeAsUpIndicator}, android.R.attr.actionBarStyle, 0); + final Drawable result = a.getDrawable(0); + a.recycle(); + return result; + } + + @Override + public Context getActionBarThemedContext() { + final ActionBar actionBar = mActivity.getActionBar(); + final Context context; + if (actionBar != null) { + context = actionBar.getThemedContext(); + } else { + context = mActivity; + } + return context; + } + + @Override + public boolean isNavigationVisible() { + final ActionBar actionBar = mActivity.getActionBar(); + return actionBar != null && + (actionBar.getDisplayOptions() & ActionBar.DISPLAY_HOME_AS_UP) != 0; + } + + @Override + public void setActionBarUpIndicator(Drawable drawable, int contentDescRes) { + final ActionBar actionBar = mActivity.getActionBar(); + if (actionBar != null) { + actionBar.setHomeAsUpIndicator(drawable); + actionBar.setHomeActionContentDescription(contentDescRes); + } + } + + @Override + public void setActionBarDescription(int contentDescRes) { + final ActionBar actionBar = mActivity.getActionBar(); + if (actionBar != null) { + actionBar.setHomeActionContentDescription(contentDescRes); + } + } + } + + /** + * Used when DrawerToggle is initialized with a Toolbar + */ + static class ToolbarCompatDelegate implements Delegate { + + final Toolbar mToolbar; + final Drawable mDefaultUpIndicator; + final CharSequence mDefaultContentDescription; + + ToolbarCompatDelegate(Toolbar toolbar) { + mToolbar = toolbar; + mDefaultUpIndicator = toolbar.getNavigationIcon(); + mDefaultContentDescription = toolbar.getNavigationContentDescription(); + } + + @Override + public void setActionBarUpIndicator(Drawable upDrawable, @StringRes int contentDescRes) { + mToolbar.setNavigationIcon(upDrawable); + setActionBarDescription(contentDescRes); + } + + @Override + public void setActionBarDescription(@StringRes int contentDescRes) { + if (contentDescRes == 0) { + mToolbar.setNavigationContentDescription(mDefaultContentDescription); + } else { + mToolbar.setNavigationContentDescription(contentDescRes); + } + } + + @Override + public Drawable getThemeUpIndicator() { + return mDefaultUpIndicator; + } + + @Override + public Context getActionBarThemedContext() { + return mToolbar.getContext(); + } + + @Override + public boolean isNavigationVisible() { + return true; + } + } + + /** + * Fallback delegate + */ + static class DummyDelegate implements Delegate { + final Activity mActivity; + + DummyDelegate(Activity activity) { + mActivity = activity; + } + + @Override + public void setActionBarUpIndicator(Drawable upDrawable, @StringRes int contentDescRes) { + + } + + @Override + public void setActionBarDescription(@StringRes int contentDescRes) { + + } + + @Override + public Drawable getThemeUpIndicator() { + return null; + } + + @Override + public Context getActionBarThemedContext() { + return mActivity; + } + + @Override + public boolean isNavigationVisible() { + return true; + } + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/app/ActionBarDrawerToggleHoneycomb.java b/eclipse-compile/appcompat/src/android/support/v7/app/ActionBarDrawerToggleHoneycomb.java new file mode 100644 index 0000000000..f25365ee1d --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/app/ActionBarDrawerToggleHoneycomb.java @@ -0,0 +1,139 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package android.support.v7.app; + +import android.R; +import android.app.ActionBar; +import android.app.Activity; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.util.Log; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; + +import java.lang.reflect.Method; + +/** + * This class encapsulates some awful hacks. + * + * Before JB-MR2 (API 18) it was not possible to change the home-as-up indicator glyph + * in an action bar without some really gross hacks. Since the MR2 SDK is not published as of + * this writing, the new API is accessed via reflection here if available. + * + * Moved from Support-v4 + */ +class ActionBarDrawerToggleHoneycomb { + private static final String TAG = "ActionBarDrawerToggleHoneycomb"; + + private static final int[] THEME_ATTRS = new int[] { + R.attr.homeAsUpIndicator + }; + + public static SetIndicatorInfo setActionBarUpIndicator(SetIndicatorInfo info, Activity activity, + Drawable drawable, int contentDescRes) { + if (true || info == null) { + info = new SetIndicatorInfo(activity); + } + if (info.setHomeAsUpIndicator != null) { + try { + final ActionBar actionBar = activity.getActionBar(); + info.setHomeAsUpIndicator.invoke(actionBar, drawable); + info.setHomeActionContentDescription.invoke(actionBar, contentDescRes); + } catch (Exception e) { + Log.w(TAG, "Couldn't set home-as-up indicator via JB-MR2 API", e); + } + } else if (info.upIndicatorView != null) { + info.upIndicatorView.setImageDrawable(drawable); + } else { + Log.w(TAG, "Couldn't set home-as-up indicator"); + } + return info; + } + + public static SetIndicatorInfo setActionBarDescription(SetIndicatorInfo info, Activity activity, + int contentDescRes) { + if (info == null) { + info = new SetIndicatorInfo(activity); + } + if (info.setHomeAsUpIndicator != null) { + try { + final ActionBar actionBar = activity.getActionBar(); + info.setHomeActionContentDescription.invoke(actionBar, contentDescRes); + if (Build.VERSION.SDK_INT <= 19) { + // For API 19 and earlier, we need to manually force the + // action bar to generate a new content description. + actionBar.setSubtitle(actionBar.getSubtitle()); + } + } catch (Exception e) { + Log.w(TAG, "Couldn't set content description via JB-MR2 API", e); + } + } + return info; + } + + public static Drawable getThemeUpIndicator(Activity activity) { + final TypedArray a = activity.obtainStyledAttributes(THEME_ATTRS); + final Drawable result = a.getDrawable(0); + a.recycle(); + return result; + } + + static class SetIndicatorInfo { + public Method setHomeAsUpIndicator; + public Method setHomeActionContentDescription; + public ImageView upIndicatorView; + + SetIndicatorInfo(Activity activity) { + try { + setHomeAsUpIndicator = ActionBar.class.getDeclaredMethod("setHomeAsUpIndicator", + Drawable.class); + setHomeActionContentDescription = ActionBar.class.getDeclaredMethod( + "setHomeActionContentDescription", Integer.TYPE); + + // If we got the method we won't need the stuff below. + return; + } catch (NoSuchMethodException e) { + // Oh well. We'll use the other mechanism below instead. + } + + final View home = activity.findViewById(android.R.id.home); + if (home == null) { + // Action bar doesn't have a known configuration, an OEM messed with things. + return; + } + + final ViewGroup parent = (ViewGroup) home.getParent(); + final int childCount = parent.getChildCount(); + if (childCount != 2) { + // No idea which one will be the right one, an OEM messed with things. + return; + } + + final View first = parent.getChildAt(0); + final View second = parent.getChildAt(1); + final View up = first.getId() == android.R.id.home ? second : first; + + if (up instanceof ImageView) { + // Jackpot! (Probably...) + upIndicatorView = (ImageView) up; + } + } + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/app/AppCompatActivity.java b/eclipse-compile/appcompat/src/android/support/v7/app/AppCompatActivity.java new file mode 100644 index 0000000000..5be3d3ddf3 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/app/AppCompatActivity.java @@ -0,0 +1,416 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.app; + +import android.content.Intent; +import android.content.res.Configuration; +import android.os.Bundle; +import android.support.annotation.LayoutRes; +import android.support.annotation.Nullable; +import android.support.v4.app.ActivityCompat; +import android.support.v4.app.FragmentActivity; +import android.support.v4.app.NavUtils; +import android.support.v4.app.TaskStackBuilder; +import android.support.v7.view.ActionMode; +import android.support.v7.widget.Toolbar; +import android.view.MenuInflater; +import android.view.View; +import android.view.ViewGroup; + +/** + * Base class for activities that use the + * support library action bar features. + * + *

      You can add an {@link android.support.v7.app.ActionBar} to your activity when running on API level 7 or higher + * by extending this class for your activity and setting the activity theme to + * {@link android.support.v7.appcompat.R.style#Theme_AppCompat Theme.AppCompat} or a similar theme. + * + *

      + *

      Developer Guides

      + * + *

      For information about how to use the action bar, including how to add action items, navigation + * modes and more, read the Action + * Bar API guide.

      + *
      + */ +public class AppCompatActivity extends FragmentActivity implements AppCompatCallback, + TaskStackBuilder.SupportParentable, ActionBarDrawerToggle.DelegateProvider { + + private AppCompatDelegate mDelegate; + + @Override + protected void onCreate(Bundle savedInstanceState) { + getDelegate().installViewFactory(); + super.onCreate(savedInstanceState); + getDelegate().onCreate(savedInstanceState); + } + + @Override + protected void onPostCreate(Bundle savedInstanceState) { + super.onPostCreate(savedInstanceState); + getDelegate().onPostCreate(savedInstanceState); + } + + /** + * Support library version of {@link android.app.Activity#getActionBar}. + * + *

      Retrieve a reference to this activity's ActionBar. + * + * @return The Activity's ActionBar, or null if it does not have one. + */ + public ActionBar getSupportActionBar() { + return getDelegate().getSupportActionBar(); + } + + /** + * Set a {@link android.widget.Toolbar Toolbar} to act as the {@link android.support.v7.app.ActionBar} for this + * Activity window. + * + *

      When set to a non-null value the {@link #getActionBar()} method will return + * an {@link android.support.v7.app.ActionBar} object that can be used to control the given toolbar as if it were + * a traditional window decor action bar. The toolbar's menu will be populated with the + * Activity's options menu and the navigation button will be wired through the standard + * {@link android.R.id#home home} menu select action.

      + * + *

      In order to use a Toolbar within the Activity's window content the application + * must not request the window feature {@link android.view.Window#FEATURE_ACTION_BAR FEATURE_ACTION_BAR}.

      + * + * @param toolbar Toolbar to set as the Activity's action bar + */ + public void setSupportActionBar(@Nullable Toolbar toolbar) { + getDelegate().setSupportActionBar(toolbar); + } + + @Override + public MenuInflater getMenuInflater() { + return getDelegate().getMenuInflater(); + } + + @Override + public void setContentView(@LayoutRes int layoutResID) { + getDelegate().setContentView(layoutResID); + } + + @Override + public void setContentView(View view) { + getDelegate().setContentView(view); + } + + @Override + public void setContentView(View view, ViewGroup.LayoutParams params) { + getDelegate().setContentView(view, params); + } + + @Override + public void addContentView(View view, ViewGroup.LayoutParams params) { + getDelegate().addContentView(view, params); + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + getDelegate().onConfigurationChanged(newConfig); + } + + @Override + protected void onStop() { + super.onStop(); + getDelegate().onStop(); + } + + @Override + protected void onPostResume() { + super.onPostResume(); + getDelegate().onPostResume(); + } + + @Override + public final boolean onMenuItemSelected(int featureId, android.view.MenuItem item) { + if (super.onMenuItemSelected(featureId, item)) { + return true; + } + + final ActionBar ab = getSupportActionBar(); + if (item.getItemId() == android.R.id.home && ab != null && + (ab.getDisplayOptions() & ActionBar.DISPLAY_HOME_AS_UP) != 0) { + return onSupportNavigateUp(); + } + return false; + } + + @Override + protected void onDestroy() { + super.onDestroy(); + getDelegate().onDestroy(); + } + + @Override + protected void onTitleChanged(CharSequence title, int color) { + super.onTitleChanged(title, color); + getDelegate().setTitle(title); + } + + /** + * Enable extended support library window features. + *

      + * This is a convenience for calling + * {@link android.view.Window#requestFeature getWindow().requestFeature()}. + *

      + * + * @param featureId The desired feature as defined in + * {@link android.view.Window} or {@link android.support.v4.view.WindowCompat}. + * @return Returns true if the requested feature is supported and now enabled. + * + * @see android.app.Activity#requestWindowFeature + * @see android.view.Window#requestFeature + */ + public boolean supportRequestWindowFeature(int featureId) { + return getDelegate().requestWindowFeature(featureId); + } + + @Override + public void supportInvalidateOptionsMenu() { + getDelegate().invalidateOptionsMenu(); + } + + /** + * @hide + */ + public void invalidateOptionsMenu() { + getDelegate().invalidateOptionsMenu(); + } + + /** + * Notifies the Activity that a support action mode has been started. + * Activity subclasses overriding this method should call the superclass implementation. + * + * @param mode The new action mode. + */ + public void onSupportActionModeStarted(ActionMode mode) { + } + + /** + * Notifies the activity that a support action mode has finished. + * Activity subclasses overriding this method should call the superclass implementation. + * + * @param mode The action mode that just finished. + */ + public void onSupportActionModeFinished(ActionMode mode) { + } + + public ActionMode startSupportActionMode(ActionMode.Callback callback) { + return getDelegate().startSupportActionMode(callback); + } + + /** + * @deprecated Progress bars are no longer provided in AppCompat. + */ + @Deprecated + public void setSupportProgressBarVisibility(boolean visible) { + } + + /** + * @deprecated Progress bars are no longer provided in AppCompat. + */ + @Deprecated + public void setSupportProgressBarIndeterminateVisibility(boolean visible) { + } + + /** + * @deprecated Progress bars are no longer provided in AppCompat. + */ + @Deprecated + public void setSupportProgressBarIndeterminate(boolean indeterminate) { + } + + /** + * @deprecated Progress bars are no longer provided in AppCompat. + */ + @Deprecated + public void setSupportProgress(int progress) { + } + + /** + * Support version of {@link #onCreateNavigateUpTaskStack(android.app.TaskStackBuilder)}. + * This method will be called on all platform versions. + * + * Define the synthetic task stack that will be generated during Up navigation from + * a different task. + * + *

      The default implementation of this method adds the parent chain of this activity + * as specified in the manifest to the supplied {@link android.support.v4.app.TaskStackBuilder}. Applications + * may choose to override this method to construct the desired task stack in a different + * way.

      + * + *

      This method will be invoked by the default implementation of {@link #onNavigateUp()} + * if {@link #shouldUpRecreateTask(android.content.Intent)} returns true when supplied with the intent + * returned by {@link #getParentActivityIntent()}.

      + * + *

      Applications that wish to supply extra Intent parameters to the parent stack defined + * by the manifest should override + * {@link #onPrepareSupportNavigateUpTaskStack(android.support.v4.app.TaskStackBuilder)}.

      + * + * @param builder An empty TaskStackBuilder - the application should add intents representing + * the desired task stack + */ + public void onCreateSupportNavigateUpTaskStack(TaskStackBuilder builder) { + builder.addParentStack(this); + } + + /** + * Support version of {@link #onPrepareNavigateUpTaskStack(android.app.TaskStackBuilder)}. + * This method will be called on all platform versions. + * + * Prepare the synthetic task stack that will be generated during Up navigation + * from a different task. + * + *

      This method receives the {@link android.support.v4.app.TaskStackBuilder} with the constructed series of + * Intents as generated by {@link #onCreateSupportNavigateUpTaskStack(android.support.v4.app.TaskStackBuilder)}. + * If any extra data should be added to these intents before launching the new task, + * the application should override this method and add that data here.

      + * + * @param builder A TaskStackBuilder that has been populated with Intents by + * onCreateNavigateUpTaskStack. + */ + public void onPrepareSupportNavigateUpTaskStack(TaskStackBuilder builder) { + } + + /** + * This method is called whenever the user chooses to navigate Up within your application's + * activity hierarchy from the action bar. + * + *

      If a parent was specified in the manifest for this activity or an activity-alias to it, + * default Up navigation will be handled automatically. See + * {@link #getSupportParentActivityIntent()} for how to specify the parent. If any activity + * along the parent chain requires extra Intent arguments, the Activity subclass + * should override the method {@link #onPrepareSupportNavigateUpTaskStack(android.support.v4.app.TaskStackBuilder)} + * to supply those arguments.

      + * + *

      See Tasks and + * Back Stack from the developer guide and + * Navigation from the design guide + * for more information about navigating within your app.

      + * + *

      See the {@link android.support.v4.app.TaskStackBuilder} class and the Activity methods + * {@link #getSupportParentActivityIntent()}, {@link #supportShouldUpRecreateTask(android.content.Intent)}, and + * {@link #supportNavigateUpTo(android.content.Intent)} for help implementing custom Up navigation.

      + * + * @return true if Up navigation completed successfully and this Activity was finished, + * false otherwise. + */ + public boolean onSupportNavigateUp() { + Intent upIntent = getSupportParentActivityIntent(); + + if (upIntent != null) { + if (supportShouldUpRecreateTask(upIntent)) { + TaskStackBuilder b = TaskStackBuilder.create(this); + onCreateSupportNavigateUpTaskStack(b); + onPrepareSupportNavigateUpTaskStack(b); + b.startActivities(); + + try { + ActivityCompat.finishAffinity(this); + } catch (IllegalStateException e) { + // This can only happen on 4.1+, when we don't have a parent or a result set. + // In that case we should just finish(). + finish(); + } + } else { + // This activity is part of the application's task, so simply + // navigate up to the hierarchical parent activity. + supportNavigateUpTo(upIntent); + } + return true; + } + return false; + } + + /** + * Obtain an {@link android.content.Intent} that will launch an explicit target activity + * specified by sourceActivity's {@link android.support.v4.app.NavUtils#PARENT_ACTIVITY} <meta-data> + * element in the application's manifest. If the device is running + * Jellybean or newer, the android:parentActivityName attribute will be preferred + * if it is present. + * + * @return a new Intent targeting the defined parent activity of sourceActivity + */ + public Intent getSupportParentActivityIntent() { + return NavUtils.getParentActivityIntent(this); + } + + /** + * Returns true if sourceActivity should recreate the task when navigating 'up' + * by using targetIntent. + * + *

      If this method returns false the app can trivially call + * {@link #supportNavigateUpTo(android.content.Intent)} using the same parameters to correctly perform + * up navigation. If this method returns false, the app should synthesize a new task stack + * by using {@link android.support.v4.app.TaskStackBuilder} or another similar mechanism to perform up navigation.

      + * + * @param targetIntent An intent representing the target destination for up navigation + * @return true if navigating up should recreate a new task stack, false if the same task + * should be used for the destination + */ + public boolean supportShouldUpRecreateTask(Intent targetIntent) { + return NavUtils.shouldUpRecreateTask(this, targetIntent); + } + + /** + * Navigate from sourceActivity to the activity specified by upIntent, finishing sourceActivity + * in the process. upIntent will have the flag {@link android.content.Intent#FLAG_ACTIVITY_CLEAR_TOP} set + * by this method, along with any others required for proper up navigation as outlined + * in the Android Design Guide. + * + *

      This method should be used when performing up navigation from within the same task + * as the destination. If up navigation should cross tasks in some cases, see + * {@link #supportShouldUpRecreateTask(android.content.Intent)}.

      + * + * @param upIntent An intent representing the target destination for up navigation + */ + public void supportNavigateUpTo(Intent upIntent) { + NavUtils.navigateUpTo(this, upIntent); + } + + @Override + public void onContentChanged() { + // Call onSupportContentChanged() for legacy reasons + onSupportContentChanged(); + } + + /** + * @deprecated Use {@link #onContentChanged()} instead. + */ + @Deprecated + public void onSupportContentChanged() { + } + + @Nullable + @Override + public ActionBarDrawerToggle.Delegate getDrawerToggleDelegate() { + return getDelegate().getDrawerToggleDelegate(); + } + + /** + * @return The {@link AppCompatDelegate} being used by this Activity. + */ + public AppCompatDelegate getDelegate() { + if (mDelegate == null) { + mDelegate = AppCompatDelegate.create(this, this); + } + return mDelegate; + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/app/AppCompatCallback.java b/eclipse-compile/appcompat/src/android/support/v7/app/AppCompatCallback.java new file mode 100644 index 0000000000..dba77a2445 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/app/AppCompatCallback.java @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.app; + +import android.support.v7.view.ActionMode; + +/** + * Implemented this in order for AppCompat to be able to callback in certain situations. + *

      + * This should be provided to + * {@link AppCompatDelegate#create(android.app.Activity, AppCompatCallback)}. + */ +public interface AppCompatCallback { + + /** + * Called when a support action mode has been started. + * + * @param mode The new action mode. + */ + void onSupportActionModeStarted(ActionMode mode); + + /** + * Called when a support action mode has finished. + * + * @param mode The action mode that just finished. + */ + void onSupportActionModeFinished(ActionMode mode); + +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/app/AppCompatDelegate.java b/eclipse-compile/appcompat/src/android/support/v7/app/AppCompatDelegate.java new file mode 100644 index 0000000000..ecb1178484 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/app/AppCompatDelegate.java @@ -0,0 +1,251 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.app; + +import android.app.Activity; +import android.app.Dialog; +import android.content.Context; +import android.content.res.Configuration; +import android.os.Build; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.v4.app.FragmentActivity; +import android.support.v7.view.ActionMode; +import android.support.v7.widget.Toolbar; +import android.util.AttributeSet; +import android.view.MenuInflater; +import android.view.View; +import android.view.ViewGroup; + +/** + * This class represents a delegate which you can use to extend AppCompat's support to any + * {@link android.app.Activity}. + *

      + * When using an {@link AppCompatDelegate}, you should any methods exposed in it rather than the + * {@link android.app.Activity} method of the same name. This applies to: + *

        + *
      • {@link #addContentView(android.view.View, android.view.ViewGroup.LayoutParams)}
      • + *
      • {@link #setContentView(int)}
      • + *
      • {@link #setContentView(android.view.View)}
      • + *
      • {@link #setContentView(android.view.View, android.view.ViewGroup.LayoutParams)}
      • + *
      • {@link #requestWindowFeature(int)}
      • + *
      • {@link #invalidateOptionsMenu()}
      • + *
      • {@link #startSupportActionMode(android.support.v7.view.ActionMode.Callback)}
      • + *
      • {@link #setSupportActionBar(android.support.v7.widget.Toolbar)}
      • + *
      • {@link #getSupportActionBar()}
      • + *
      • {@link #getMenuInflater()}
      • + *
      + * There also some Activity lifecycle methods which should be proxied to the delegate: + *
        + *
      • {@link #onCreate(android.os.Bundle)}
      • + *
      • {@link #onPostCreate(android.os.Bundle)}
      • + *
      • {@link #onConfigurationChanged(android.content.res.Configuration)}
      • + *
      • {@link #setTitle(CharSequence)}
      • + *
      • {@link #onStop()}
      • + *
      • {@link #onDestroy()}
      • + *
      + *

      + * An {@link Activity} can only be linked with one {@link AppCompatDelegate} instance, + * so the instance returned from {@link #create(Activity, AppCompatCallback)} should be kept + * until the Activity is destroyed. + */ +public abstract class AppCompatDelegate { + + static final String TAG = "AppCompatDelegate"; + + /** + * Create a {@link android.support.v7.app.AppCompatDelegate} to use with {@code activity}. + * + * @param callback An optional callback for AppCompat specific events + */ + public static AppCompatDelegate create(Activity activity, AppCompatCallback callback) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + return new AppCompatDelegateImplV11(activity, activity.getWindow(), callback); + } else { + return new AppCompatDelegateImplV7(activity, activity.getWindow(), callback); + } + } + + /** + * Create a {@link android.support.v7.app.AppCompatDelegate} to use with {@code dialog}. + * + * @param callback An optional callback for AppCompat specific events + */ + public static AppCompatDelegate create(Dialog dialog, AppCompatCallback callback) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + return new AppCompatDelegateImplV11(dialog.getContext(), dialog.getWindow(), callback); + } else { + return new AppCompatDelegateImplV7(dialog.getContext(), dialog.getWindow(), callback); + } + } + + /** + * Private constructor + */ + AppCompatDelegate() {} + + /** + * Support library version of {@link Activity#getActionBar}. + * + * @return AppCompat's action bar, or null if it does not have one. + */ + public abstract ActionBar getSupportActionBar(); + + /** + * Set a {@link Toolbar} to act as the {@link ActionBar} for this delegate. + * + *

      When set to a non-null value the {@link #getSupportActionBar()} ()} method will return + * an {@link ActionBar} object that can be used to control the given toolbar as if it were + * a traditional window decor action bar. The toolbar's menu will be populated with the + * Activity's options menu and the navigation button will be wired through the standard + * {@link android.R.id#home home} menu select action.

      + * + *

      In order to use a Toolbar within the Activity's window content the application + * must not request the window feature + * {@link android.view.Window#FEATURE_ACTION_BAR FEATURE_ACTION_BAR}.

      + * + * @param toolbar Toolbar to set as the Activity's action bar + */ + public abstract void setSupportActionBar(Toolbar toolbar); + + /** + * Return the value of this call from your {@link Activity#getMenuInflater()} + */ + public abstract MenuInflater getMenuInflater(); + + /** + * Should be called from {@link Activity#onCreate Activity.onCreate()} + */ + public abstract void onCreate(Bundle savedInstanceState); + + /** + * Should be called from {@link Activity#onPostCreate(android.os.Bundle)} + */ + public abstract void onPostCreate(Bundle savedInstanceState); + + /** + * Should be called from + * {@link Activity#onConfigurationChanged} + */ + public abstract void onConfigurationChanged(Configuration newConfig); + + /** + * Should be called from {@link Activity#onStop Activity.onStop()} + */ + public abstract void onStop(); + + /** + * Should be called from {@link Activity#onPostResume()} + */ + public abstract void onPostResume(); + + /** + * Should be called instead of {@link Activity#setContentView(android.view.View)}} + */ + public abstract void setContentView(View v); + + /** + * Should be called instead of {@link Activity#setContentView(int)}} + */ + public abstract void setContentView(int resId); + + /** + * Should be called instead of + * {@link Activity#setContentView(android.view.View, android.view.ViewGroup.LayoutParams)}} + */ + public abstract void setContentView(View v, ViewGroup.LayoutParams lp); + + /** + * Should be called instead of + * {@link Activity#addContentView(android.view.View, android.view.ViewGroup.LayoutParams)}} + */ + public abstract void addContentView(View v, ViewGroup.LayoutParams lp); + + /** + * Should be called from {@link Activity#onTitleChanged(CharSequence, int)}} + */ + public abstract void setTitle(CharSequence title); + + /** + * Should be called from {@link Activity#invalidateOptionsMenu()}} or + * {@link FragmentActivity#supportInvalidateOptionsMenu()}. + */ + public abstract void invalidateOptionsMenu(); + + /** + * Should be called from {@link Activity#onDestroy()} + */ + public abstract void onDestroy(); + + /** + * Returns an {@link ActionBarDrawerToggle.Delegate} which can be returned from your Activity + * if it implements {@link ActionBarDrawerToggle.DelegateProvider}. + */ + public abstract ActionBarDrawerToggle.Delegate getDrawerToggleDelegate(); + + /** + * Enable extended window features. This should be called instead of + * {@link android.app.Activity#requestWindowFeature(int)} or + * {@link android.view.Window#requestFeature getWindow().requestFeature()}. + * + * @param featureId The desired feature as defined in {@link android.view.Window}. + * @return Returns true if the requested feature is supported and now + * enabled. + */ + public abstract boolean requestWindowFeature(int featureId); + + /** + * 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 + */ + public abstract ActionMode startSupportActionMode(ActionMode.Callback callback); + + /** + * Installs AppCompat's {@link android.view.LayoutInflater} Factory so that it can replace + * the framework widgets with compatible tinted versions. This should be called before + * {@code super.onCreate()} as so: + *
      +     * protected void onCreate(Bundle savedInstanceState) {
      +     *     getDelegate().installViewFactory();
      +     *     super.onCreate(savedInstanceState);
      +     *     getDelegate().onCreate(savedInstanceState);
      +     *
      +     *     // ...
      +     * }
      +     * 
      + * If you are using your own {@link android.view.LayoutInflater.Factory Factory} or + * {@link android.view.LayoutInflater.Factory2 Factory2} then you can omit this call, and instead call + * {@link #createView(android.view.View, String, android.content.Context, android.util.AttributeSet)} + * from your factory to return any compatible widgets. + */ + public abstract void installViewFactory(); + + /** + * This should be called from a + * {@link android.support.v4.view.LayoutInflaterFactory LayoutInflaterFactory} in order + * to return tint-aware widgets. + *

      + * This is only needed if you are using your own + * {@link android.view.LayoutInflater LayoutInflater} factory, and have therefore not + * installed the default factory via {@link #installViewFactory()}. + */ + public abstract View createView(View parent, String name, @NonNull Context context, + @NonNull AttributeSet attrs); + +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/app/AppCompatDelegateImplBase.java b/eclipse-compile/appcompat/src/android/support/v7/app/AppCompatDelegateImplBase.java new file mode 100644 index 0000000000..ac46f3cef8 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/app/AppCompatDelegateImplBase.java @@ -0,0 +1,325 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.app; + +import android.app.Activity; +import android.app.Dialog; +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.os.Bundle; +import android.support.v7.appcompat.R; +import android.support.v7.internal.view.SupportMenuInflater; +import android.support.v7.internal.view.WindowCallbackWrapper; +import android.support.v7.internal.view.menu.MenuBuilder; +import android.support.v7.internal.widget.TintTypedArray; +import android.support.v7.view.ActionMode; +import android.view.KeyEvent; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.View; +import android.view.Window; + +abstract class AppCompatDelegateImplBase extends AppCompatDelegate { + + final Context mContext; + final Window mWindow; + final Window.Callback mOriginalWindowCallback; + final AppCompatCallback mAppCompatCallback; + + private ActionBar mActionBar; + private MenuInflater mMenuInflater; + + // true if this activity has an action bar. + boolean mHasActionBar; + // true if this activity's action bar overlays other activity content. + boolean mOverlayActionBar; + // true if this any action modes should overlay the activity content + boolean mOverlayActionMode; + // true if this activity is floating (e.g. Dialog) + boolean mIsFloating; + // true if this activity has no title + boolean mWindowNoTitle; + + private CharSequence mTitle; + + private boolean mIsDestroyed; + + AppCompatDelegateImplBase(Context context, Window window, AppCompatCallback callback) { + mContext = context; + mWindow = window; + mAppCompatCallback = callback; + + mOriginalWindowCallback = mWindow.getCallback(); + if (mOriginalWindowCallback instanceof AppCompatWindowCallback) { + throw new IllegalStateException( + "AppCompat has already installed itself into the Window"); + } + // Now install the new callback + mWindow.setCallback(new AppCompatWindowCallback(mOriginalWindowCallback)); + } + + abstract ActionBar createSupportActionBar(); + + @Override + public ActionBar getSupportActionBar() { + // The Action Bar should be lazily created as hasActionBar + // could change after onCreate + if (mHasActionBar) { + if (mActionBar == null) { + mActionBar = createSupportActionBar(); + } + } + return mActionBar; + } + + final ActionBar peekSupportActionBar() { + return mActionBar; + } + + final void setSupportActionBar(ActionBar actionBar) { + mActionBar = actionBar; + } + + @Override + public MenuInflater getMenuInflater() { + if (mMenuInflater == null) { + mMenuInflater = new SupportMenuInflater(getActionBarThemedContext()); + } + return mMenuInflater; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + TypedArray a = mContext.obtainStyledAttributes(R.styleable.Theme); + + if (!a.hasValue(R.styleable.Theme_windowActionBar)) { + a.recycle(); + throw new IllegalStateException( + "You need to use a Theme.AppCompat theme (or descendant) with this activity."); + } + + if (a.getBoolean(R.styleable.Theme_windowActionBar, false)) { + mHasActionBar = true; + } + if (a.getBoolean(R.styleable.Theme_windowActionBarOverlay, false)) { + mOverlayActionBar = true; + } + if (a.getBoolean(R.styleable.Theme_windowActionModeOverlay, false)) { + mOverlayActionMode = true; + } + mIsFloating = a.getBoolean(R.styleable.Theme_android_windowIsFloating, false); + mWindowNoTitle = a.getBoolean(R.styleable.Theme_windowNoTitle, false); + a.recycle(); + } + + // Methods used to create and respond to options menu + abstract boolean onPanelClosed(int featureId, Menu menu); + + abstract boolean onMenuOpened(int featureId, Menu menu); + + abstract boolean dispatchKeyEvent(KeyEvent event); + + abstract boolean onKeyShortcut(int keyCode, KeyEvent event); + + @Override + public final ActionBarDrawerToggle.Delegate getDrawerToggleDelegate() { + return new ActionBarDrawableToggleImpl(); + } + + final Context getActionBarThemedContext() { + Context context = null; + + // If we have an action bar, let it return a themed context + ActionBar ab = getSupportActionBar(); + if (ab != null) { + context = ab.getThemedContext(); + } + + if (context == null) { + context = mContext; + } + return context; + } + + private class ActionBarDrawableToggleImpl implements ActionBarDrawerToggle.Delegate { + @Override + public Drawable getThemeUpIndicator() { + final TintTypedArray a = TintTypedArray.obtainStyledAttributes( + getActionBarThemedContext(), null, new int[]{ R.attr.homeAsUpIndicator }); + final Drawable result = a.getDrawable(0); + a.recycle(); + return result; + } + + @Override + public Context getActionBarThemedContext() { + return AppCompatDelegateImplBase.this.getActionBarThemedContext(); + } + + @Override + public boolean isNavigationVisible() { + final ActionBar ab = getSupportActionBar(); + return ab != null && (ab.getDisplayOptions() & ActionBar.DISPLAY_HOME_AS_UP) != 0; + } + + @Override + public void setActionBarUpIndicator(Drawable upDrawable, int contentDescRes) { + ActionBar ab = getSupportActionBar(); + if (ab != null) { + ab.setHomeAsUpIndicator(upDrawable); + ab.setHomeActionContentDescription(contentDescRes); + } + } + + @Override + public void setActionBarDescription(int contentDescRes) { + ActionBar ab = getSupportActionBar(); + if (ab != null) { + ab.setHomeActionContentDescription(contentDescRes); + } + } + } + + abstract ActionMode startSupportActionModeFromWindow(ActionMode.Callback callback); + + @Override + public final void onDestroy() { + mIsDestroyed = true; + } + + final boolean isDestroyed() { + return mIsDestroyed; + } + + final Window.Callback getWindowCallback() { + return mWindow.getCallback(); + } + + @Override + public final void setTitle(CharSequence title) { + mTitle = title; + onTitleChanged(title); + } + + abstract void onTitleChanged(CharSequence title); + + final CharSequence getTitle() { + // If the original window callback is an Activity, we'll use it's title + if (mOriginalWindowCallback instanceof Activity) { + return ((Activity) mOriginalWindowCallback).getTitle(); + } + // Else, we'll return the title we have recorded ourselves + return mTitle; + } + + private class AppCompatWindowCallback extends WindowCallbackWrapper { + AppCompatWindowCallback(Window.Callback callback) { + super(callback); + } + + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + if (AppCompatDelegateImplBase.this.dispatchKeyEvent(event)) { + return true; + } + return super.dispatchKeyEvent(event); + } + + @Override + public boolean onCreatePanelMenu(int featureId, Menu menu) { + if (featureId == Window.FEATURE_OPTIONS_PANEL && !(menu instanceof MenuBuilder)) { + // If this is an options menu but it's not an AppCompat menu, we eat the event + // and return false + return false; + } + return super.onCreatePanelMenu(featureId, menu); + } + + @Override + public boolean onPreparePanel(int featureId, View view, Menu menu) { + if (featureId == Window.FEATURE_OPTIONS_PANEL && !(menu instanceof MenuBuilder)) { + // If this is an options menu but it's not an AppCompat menu, we eat the event + // and return false + return false; + } + + if (featureId == Window.FEATURE_OPTIONS_PANEL && bypassPrepareOptionsPanelIfNeeded()) { + // If this is an options menu and we need to bypass onPreparePanel, do so + if (mOriginalWindowCallback instanceof Activity) { + return ((Activity) mOriginalWindowCallback).onPrepareOptionsMenu(menu); + } else if (mOriginalWindowCallback instanceof Dialog) { + return ((Dialog) mOriginalWindowCallback).onPrepareOptionsMenu(menu); + } + return false; + } + + // Else, defer to the default handling + return super.onPreparePanel(featureId, view, menu); + } + + @Override + public boolean onMenuOpened(int featureId, Menu menu) { + if (AppCompatDelegateImplBase.this.onMenuOpened(featureId, menu)) { + return true; + } + return super.onMenuOpened(featureId, menu); + } + + @Override + public boolean dispatchKeyShortcutEvent(KeyEvent event) { + if (AppCompatDelegateImplBase.this.onKeyShortcut(event.getKeyCode(), event)) { + return true; + } + return super.dispatchKeyShortcutEvent(event); + } + + @Override + public void onContentChanged() { + // We purposely do not propagate this call as this is called when we install + // our sub-decor rather than the user's content + } + + @Override + public void onPanelClosed(int featureId, Menu menu) { + if (AppCompatDelegateImplBase.this.onPanelClosed(featureId, menu)) { + return; + } + super.onPanelClosed(featureId, menu); + } + + /** + * For the options menu, we may need to call onPrepareOptionsMenu() directly, + * bypassing onPreparePanel(). This is because onPreparePanel() in certain situations + * calls menu.hasVisibleItems(), which interferes with any initial invisible items. + * + * @return true if onPrepareOptionsMenu should be called directly. + */ + private boolean bypassPrepareOptionsPanelIfNeeded() { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN + && mOriginalWindowCallback instanceof Activity) { + // For Activities, we only need to bypass onPreparePanel if we're running pre-JB + return true; + } else if (mOriginalWindowCallback instanceof Dialog) { + // For Dialogs, we always need to bypass onPreparePanel + return true; + } + return false; + } + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/app/AppCompatDelegateImplV11.java b/eclipse-compile/appcompat/src/android/support/v7/app/AppCompatDelegateImplV11.java new file mode 100644 index 0000000000..a480ee69cd --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/app/AppCompatDelegateImplV11.java @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.app; + +import android.annotation.TargetApi; +import android.content.Context; +import android.os.Build; +import android.support.v7.internal.view.SupportActionModeWrapper; +import android.support.v7.internal.widget.NativeActionModeAwareLayout; +import android.util.AttributeSet; +import android.view.ActionMode; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; + +@TargetApi(Build.VERSION_CODES.HONEYCOMB) +class AppCompatDelegateImplV11 extends AppCompatDelegateImplV7 + implements NativeActionModeAwareLayout.OnActionModeForChildListener { + + private NativeActionModeAwareLayout mNativeActionModeAwareLayout; + + AppCompatDelegateImplV11(Context context, Window window, AppCompatCallback callback) { + super(context, window, callback); + } + + @Override + void onSubDecorInstalled(ViewGroup subDecor) { + // NativeActionModeAwareLayout is used to notify us when a native Action Mode is started + mNativeActionModeAwareLayout = (NativeActionModeAwareLayout) + subDecor.findViewById(android.R.id.content); + + // Can be null when using FEATURE_ACTION_BAR_OVERLAY + if (mNativeActionModeAwareLayout != null) { + mNativeActionModeAwareLayout.setActionModeForChildListener(this); + } + } + + // From NativeActionModeAwareLayout.OnActionModeForChildListener + @Override + public ActionMode startActionModeForChild(View originalView, ActionMode.Callback callback) { + Context context = originalView.getContext(); + + // Try and start a support action mode, wrapping the callback + final android.support.v7.view.ActionMode supportActionMode = startSupportActionMode( + new SupportActionModeWrapper.CallbackWrapper(context, callback)); + + if (supportActionMode != null) { + // If we received a support action mode, wrap and return it + return new SupportActionModeWrapper(mContext, supportActionMode); + } + return null; + } + + View callActivityOnCreateView(View parent, String name, Context context, AttributeSet attrs) { + // First let super have a try, this allows FragmentActivity to inflate any support + // fragments + final View view = super.callActivityOnCreateView(parent, name, context, attrs); + if (view != null) { + return view; + } + + // Now, let the Activity's LayoutInflater.Factory2 method try... + if (mOriginalWindowCallback instanceof LayoutInflater.Factory2) { + return ((LayoutInflater.Factory2) mOriginalWindowCallback) + .onCreateView(parent, name, context, attrs); + } + + return null; + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/app/AppCompatDelegateImplV7.java b/eclipse-compile/appcompat/src/android/support/v7/app/AppCompatDelegateImplV7.java new file mode 100644 index 0000000000..273beba642 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/app/AppCompatDelegateImplV7.java @@ -0,0 +1,1808 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.app; + +import android.app.Activity; +import android.app.Dialog; +import android.content.Context; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.graphics.PixelFormat; +import android.graphics.Rect; +import android.media.AudioManager; +import android.os.Build; +import android.os.Bundle; +import android.os.Parcel; +import android.os.Parcelable; +import android.support.annotation.NonNull; +import android.support.v4.app.NavUtils; +import android.support.v4.view.LayoutInflaterCompat; +import android.support.v4.view.LayoutInflaterFactory; +import android.support.v4.view.OnApplyWindowInsetsListener; +import android.support.v4.view.ViewCompat; +import android.support.v4.view.ViewConfigurationCompat; +import android.support.v4.view.WindowInsetsCompat; +import android.support.v7.appcompat.R; +import android.support.v7.internal.app.TintViewInflater; +import android.support.v7.internal.app.ToolbarActionBar; +import android.support.v7.internal.app.WindowDecorActionBar; +import android.support.v7.internal.view.ContextThemeWrapper; +import android.support.v7.internal.view.StandaloneActionMode; +import android.support.v7.internal.view.menu.ListMenuPresenter; +import android.support.v7.internal.view.menu.MenuBuilder; +import android.support.v7.internal.view.menu.MenuPresenter; +import android.support.v7.internal.view.menu.MenuView; +import android.support.v7.internal.widget.ActionBarContextView; +import android.support.v7.internal.widget.DecorContentParent; +import android.support.v7.internal.widget.FitWindowsViewGroup; +import android.support.v7.internal.widget.TintManager; +import android.support.v7.internal.widget.ViewStubCompat; +import android.support.v7.internal.widget.ViewUtils; +import android.support.v7.view.ActionMode; +import android.support.v7.widget.Toolbar; +import android.text.TextUtils; +import android.util.AndroidRuntimeException; +import android.util.AttributeSet; +import android.util.DisplayMetrics; +import android.util.Log; +import android.util.TypedValue; +import android.view.Gravity; +import android.view.KeyCharacterMap; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewConfiguration; +import android.view.ViewGroup; +import android.view.ViewParent; +import android.view.Window; +import android.view.WindowManager; +import android.view.accessibility.AccessibilityEvent; +import android.widget.FrameLayout; +import android.widget.PopupWindow; +import android.widget.TextView; + +import static android.support.v4.view.WindowCompat.FEATURE_ACTION_BAR; +import static android.support.v4.view.WindowCompat.FEATURE_ACTION_BAR_OVERLAY; +import static android.support.v4.view.WindowCompat.FEATURE_ACTION_MODE_OVERLAY; +import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; +import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; +import static android.view.Window.FEATURE_OPTIONS_PANEL; + +class AppCompatDelegateImplV7 extends AppCompatDelegateImplBase + implements MenuBuilder.Callback, LayoutInflaterFactory { + + private DecorContentParent mDecorContentParent; + private ActionMenuPresenterCallback mActionMenuPresenterCallback; + private PanelMenuPresenterCallback mPanelMenuPresenterCallback; + + ActionMode mActionMode; + ActionBarContextView mActionModeView; + PopupWindow mActionModePopup; + Runnable mShowActionModePopup; + + // true if we have installed a window sub-decor layout. + private boolean mSubDecorInstalled; + private ViewGroup mWindowDecor; + private ViewGroup mSubDecor; + + private TextView mTitleView; + private View mStatusGuard; + + // Used to keep track of Progress Bar Window features + private boolean mFeatureProgress, mFeatureIndeterminateProgress; + + // Used for emulating PanelFeatureState + private boolean mClosingActionMenu; + private PanelFeatureState[] mPanels; + private PanelFeatureState mPreparedPanel; + + private boolean mInvalidatePanelMenuPosted; + private int mInvalidatePanelMenuFeatures; + private final Runnable mInvalidatePanelMenuRunnable = new Runnable() { + @Override + public void run() { + if ((mInvalidatePanelMenuFeatures & 1 << FEATURE_OPTIONS_PANEL) != 0) { + doInvalidatePanelMenu(FEATURE_OPTIONS_PANEL); + } + if ((mInvalidatePanelMenuFeatures & 1 << FEATURE_ACTION_BAR) != 0) { + doInvalidatePanelMenu(FEATURE_ACTION_BAR); + } + mInvalidatePanelMenuPosted = false; + mInvalidatePanelMenuFeatures = 0; + } + }; + + private boolean mEnableDefaultActionBarUp; + + private Rect mTempRect1; + private Rect mTempRect2; + + private TintViewInflater mTintViewInflater; + + AppCompatDelegateImplV7(Context context, Window window, AppCompatCallback callback) { + super(context, window, callback); + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + mWindowDecor = (ViewGroup) mWindow.getDecorView(); + + if (mOriginalWindowCallback instanceof Activity) { + if (NavUtils.getParentActivityName((Activity) mOriginalWindowCallback) != null) { + // Peek at the Action Bar and update it if it already exists + ActionBar ab = peekSupportActionBar(); + if (ab == null) { + mEnableDefaultActionBarUp = true; + } else { + ab.setDefaultDisplayHomeAsUpEnabled(true); + } + } + } + } + + @Override + public void onPostCreate(Bundle savedInstanceState) { + // Make sure that the sub decor is installed + ensureSubDecor(); + } + + @Override + public ActionBar createSupportActionBar() { + ensureSubDecor(); + ActionBar ab = null; + if (mOriginalWindowCallback instanceof Activity) { + ab = new WindowDecorActionBar((Activity) mOriginalWindowCallback, mOverlayActionBar); + } else if (mOriginalWindowCallback instanceof Dialog) { + ab = new WindowDecorActionBar((Dialog) mOriginalWindowCallback); + } + if (ab != null) { + ab.setDefaultDisplayHomeAsUpEnabled(mEnableDefaultActionBarUp); + } + return ab; + } + + @Override + public void setSupportActionBar(Toolbar toolbar) { + if (!(mOriginalWindowCallback instanceof Activity)) { + // Only Activities support custom Action Bars + return; + } + + final ActionBar ab = getSupportActionBar(); + if (ab instanceof WindowDecorActionBar) { + throw new IllegalStateException("This Activity already has an action bar supplied " + + "by the window decor. Do not request Window.FEATURE_ACTION_BAR and set " + + "windowActionBar to false in your theme to use a Toolbar instead."); + } + + ToolbarActionBar tbab = new ToolbarActionBar(toolbar, ((Activity) mContext).getTitle(), + mWindow); + setSupportActionBar(tbab); + mWindow.setCallback(tbab.getWrappedWindowCallback()); + tbab.invalidateOptionsMenu(); + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + // If this is called before sub-decor is installed, ActionBar will not + // be properly initialized. + if (mHasActionBar && mSubDecorInstalled) { + // Note: The action bar will need to access + // view changes from superclass. + ActionBar ab = getSupportActionBar(); + if (ab != null) { + ab.onConfigurationChanged(newConfig); + } + } + } + + @Override + public void onStop() { + ActionBar ab = getSupportActionBar(); + if (ab != null) { + ab.setShowHideAnimationEnabled(false); + } + } + + @Override + public void onPostResume() { + ActionBar ab = getSupportActionBar(); + if (ab != null) { + ab.setShowHideAnimationEnabled(true); + } + } + + @Override + public void setContentView(View v) { + ensureSubDecor(); + ViewGroup contentParent = (ViewGroup) mSubDecor.findViewById(android.R.id.content); + contentParent.removeAllViews(); + contentParent.addView(v); + mOriginalWindowCallback.onContentChanged(); + } + + @Override + public void setContentView(int resId) { + ensureSubDecor(); + ViewGroup contentParent = (ViewGroup) mSubDecor.findViewById(android.R.id.content); + contentParent.removeAllViews(); + LayoutInflater.from(mContext).inflate(resId, contentParent); + mOriginalWindowCallback.onContentChanged(); + } + + @Override + public void setContentView(View v, ViewGroup.LayoutParams lp) { + ensureSubDecor(); + ViewGroup contentParent = (ViewGroup) mSubDecor.findViewById(android.R.id.content); + contentParent.removeAllViews(); + contentParent.addView(v, lp); + mOriginalWindowCallback.onContentChanged(); + } + + @Override + public void addContentView(View v, ViewGroup.LayoutParams lp) { + ensureSubDecor(); + ViewGroup contentParent = (ViewGroup) mSubDecor.findViewById(android.R.id.content); + contentParent.addView(v, lp); + mOriginalWindowCallback.onContentChanged(); + } + + private void ensureSubDecor() { + if (!mSubDecorInstalled) { + final LayoutInflater inflater = LayoutInflater.from(mContext); + + if (!mWindowNoTitle) { + if (mIsFloating) { + // If we're floating, inflate the dialog title decor + mSubDecor = (ViewGroup) inflater.inflate( + R.layout.abc_dialog_title_material, null); + } else if (mHasActionBar) { + /** + * This needs some explanation. As we can not use the android:theme attribute + * pre-L, we emulate it by manually creating a LayoutInflater using a + * ContextThemeWrapper pointing to actionBarTheme. + */ + TypedValue outValue = new TypedValue(); + mContext.getTheme().resolveAttribute(R.attr.actionBarTheme, outValue, true); + + Context themedContext; + if (outValue.resourceId != 0) { + themedContext = new ContextThemeWrapper(mContext, outValue.resourceId); + } else { + themedContext = mContext; + } + + // Now inflate the view using the themed context and set it as the content view + mSubDecor = (ViewGroup) LayoutInflater.from(themedContext) + .inflate(R.layout.abc_screen_toolbar, null); + + mDecorContentParent = (DecorContentParent) mSubDecor + .findViewById(R.id.decor_content_parent); + mDecorContentParent.setWindowCallback(getWindowCallback()); + + /** + * Propagate features to DecorContentParent + */ + if (mOverlayActionBar) { + mDecorContentParent.initFeature(FEATURE_ACTION_BAR_OVERLAY); + } + if (mFeatureProgress) { + mDecorContentParent.initFeature(Window.FEATURE_PROGRESS); + } + if (mFeatureIndeterminateProgress) { + mDecorContentParent.initFeature(Window.FEATURE_INDETERMINATE_PROGRESS); + } + } + } else { + if (mOverlayActionMode) { + mSubDecor = (ViewGroup) inflater.inflate( + R.layout.abc_screen_simple_overlay_action_mode, null); + } else { + mSubDecor = (ViewGroup) inflater.inflate(R.layout.abc_screen_simple, null); + } + + if (Build.VERSION.SDK_INT >= 21) { + // If we're running on L or above, we can rely on ViewCompat's + // setOnApplyWindowInsetsListener + ViewCompat.setOnApplyWindowInsetsListener(mSubDecor, + new OnApplyWindowInsetsListener() { + @Override + public WindowInsetsCompat onApplyWindowInsets(View v, + WindowInsetsCompat insets) { + final int top = insets.getSystemWindowInsetTop(); + final int newTop = updateStatusGuard(top); + + if (top != newTop) { + insets = insets.replaceSystemWindowInsets( + insets.getSystemWindowInsetLeft(), + newTop, + insets.getSystemWindowInsetRight(), + insets.getSystemWindowInsetBottom()); + } + + // Now apply the insets on our view + return ViewCompat.onApplyWindowInsets(v, insets); + } + }); + } else { + // Else, we need to use our own FitWindowsViewGroup handling + ((FitWindowsViewGroup) mSubDecor).setOnFitSystemWindowsListener( + new FitWindowsViewGroup.OnFitSystemWindowsListener() { + @Override + public void onFitSystemWindows(Rect insets) { + insets.top = updateStatusGuard(insets.top); + } + }); + } + } + + if (mSubDecor == null) { + throw new IllegalArgumentException( + "AppCompat does not support the current theme features"); + } + + if (mDecorContentParent == null) { + mTitleView = (TextView) mSubDecor.findViewById(R.id.title); + } + + // Make the decor optionally fit system windows, like the window's decor + ViewUtils.makeOptionalFitsSystemWindows(mSubDecor); + + final ViewGroup decorContent = (ViewGroup) mWindow.findViewById(android.R.id.content); + final ViewGroup abcContent = (ViewGroup) mSubDecor.findViewById( + R.id.action_bar_activity_content); + + // There might be Views already added to the Window's content view so we need to + // migrate them to our content view + while (decorContent.getChildCount() > 0) { + final View child = decorContent.getChildAt(0); + decorContent.removeViewAt(0); + abcContent.addView(child); + } + + // Now set the Window's content view with the decor + mWindow.setContentView(mSubDecor); + + // Change our content FrameLayout to use the android.R.id.content id. + // Useful for fragments. + decorContent.setId(View.NO_ID); + abcContent.setId(android.R.id.content); + + // The decorContent may have a foreground drawable set (windowContentOverlay). + // Remove this as we handle it ourselves + if (decorContent instanceof FrameLayout) { + ((FrameLayout) decorContent).setForeground(null); + } + + // If a title was set before we installed the decor, propogate it now + CharSequence title = getTitle(); + if (!TextUtils.isEmpty(title)) { + onTitleChanged(title); + } + + applyFixedSizeWindow(); + + onSubDecorInstalled(mSubDecor); + + mSubDecorInstalled = true; + + // Invalidate if the panel menu hasn't been created before this. + // Panel menu invalidation is deferred avoiding application onCreateOptionsMenu + // being called in the middle of onCreate or similar. + // A pending invalidation will typically be resolved before the posted message + // would run normally in order to satisfy instance state restoration. + PanelFeatureState st = getPanelState(FEATURE_OPTIONS_PANEL, false); + if (!isDestroyed() && (st == null || st.menu == null)) { + invalidatePanelMenu(FEATURE_ACTION_BAR); + } + } + } + + void onSubDecorInstalled(ViewGroup subDecor) {} + + private void applyFixedSizeWindow() { + TypedArray a = mContext.obtainStyledAttributes(R.styleable.Theme); + + TypedValue mFixedWidthMajor = null; + TypedValue mFixedWidthMinor = null; + TypedValue mFixedHeightMajor = null; + TypedValue mFixedHeightMinor = null; + + if (a.hasValue(R.styleable.Theme_windowFixedWidthMajor)) { + if (mFixedWidthMajor == null) mFixedWidthMajor = new TypedValue(); + a.getValue(R.styleable.Theme_windowFixedWidthMajor, mFixedWidthMajor); + } + if (a.hasValue(R.styleable.Theme_windowFixedWidthMinor)) { + if (mFixedWidthMinor == null) mFixedWidthMinor = new TypedValue(); + a.getValue(R.styleable.Theme_windowFixedWidthMinor, mFixedWidthMinor); + } + if (a.hasValue(R.styleable.Theme_windowFixedHeightMajor)) { + if (mFixedHeightMajor == null) mFixedHeightMajor = new TypedValue(); + a.getValue(R.styleable.Theme_windowFixedHeightMajor, mFixedHeightMajor); + } + if (a.hasValue(R.styleable.Theme_windowFixedHeightMinor)) { + if (mFixedHeightMinor == null) mFixedHeightMinor = new TypedValue(); + a.getValue(R.styleable.Theme_windowFixedHeightMinor, mFixedHeightMinor); + } + + final DisplayMetrics metrics = mContext.getResources().getDisplayMetrics(); + final boolean isPortrait = metrics.widthPixels < metrics.heightPixels; + int w = ViewGroup.LayoutParams.MATCH_PARENT; + int h = ViewGroup.LayoutParams.MATCH_PARENT; + + final TypedValue tvw = isPortrait ? mFixedWidthMinor : mFixedWidthMajor; + if (tvw != null && tvw.type != TypedValue.TYPE_NULL) { + 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); + } + } + + final TypedValue tvh = isPortrait ? mFixedHeightMajor : mFixedHeightMinor; + if (tvh != null && tvh.type != TypedValue.TYPE_NULL) { + 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); + } + } + + if (w != ViewGroup.LayoutParams.MATCH_PARENT || h != ViewGroup.LayoutParams.MATCH_PARENT) { + mWindow.setLayout(w, h); + } + + a.recycle(); + } + + @Override + public boolean requestWindowFeature(int featureId) { + switch (featureId) { + case FEATURE_ACTION_BAR: + throwFeatureRequestIfSubDecorInstalled(); + mHasActionBar = true; + return true; + case FEATURE_ACTION_BAR_OVERLAY: + throwFeatureRequestIfSubDecorInstalled(); + mOverlayActionBar = true; + return true; + case FEATURE_ACTION_MODE_OVERLAY: + throwFeatureRequestIfSubDecorInstalled(); + mOverlayActionMode = true; + return true; + case Window.FEATURE_PROGRESS: + throwFeatureRequestIfSubDecorInstalled(); + mFeatureProgress = true; + return true; + case Window.FEATURE_INDETERMINATE_PROGRESS: + throwFeatureRequestIfSubDecorInstalled(); + mFeatureIndeterminateProgress = true; + return true; + } + + return mWindow.requestFeature(featureId); + } + + @Override + void onTitleChanged(CharSequence title) { + if (mDecorContentParent != null) { + mDecorContentParent.setWindowTitle(title); + } else if (getSupportActionBar() != null) { + getSupportActionBar().setWindowTitle(title); + } else if (mTitleView != null) { + mTitleView.setText(title); + } + } + + @Override + boolean onPanelClosed(final int featureId, Menu menu) { + if (featureId == FEATURE_ACTION_BAR) { + ActionBar ab = getSupportActionBar(); + if (ab != null) { + ab.dispatchMenuVisibilityChanged(false); + } + return true; + } else if (featureId == FEATURE_OPTIONS_PANEL) { + // Make sure that the options panel is closed. This is mainly used when we're using a + // ToolbarActionBar + PanelFeatureState st = getPanelState(featureId, true); + if (st.isOpen) { + closePanel(st, false); + } + } + return false; + } + + @Override + boolean onMenuOpened(final int featureId, Menu menu) { + if (featureId == FEATURE_ACTION_BAR) { + ActionBar ab = getSupportActionBar(); + if (ab != null) { + ab.dispatchMenuVisibilityChanged(true); + } + return true; + } + return false; + } + + @Override + public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) { + final Window.Callback cb = getWindowCallback(); + if (cb != null && !isDestroyed()) { + final PanelFeatureState panel = findMenuPanel(menu.getRootMenu()); + if (panel != null) { + return cb.onMenuItemSelected(panel.featureId, item); + } + } + return false; + } + + @Override + public void onMenuModeChange(MenuBuilder menu) { + reopenMenu(menu, true); + } + + @Override + public ActionMode startSupportActionMode(ActionMode.Callback callback) { + if (callback == null) { + throw new IllegalArgumentException("ActionMode callback can not be null."); + } + + if (mActionMode != null) { + mActionMode.finish(); + } + + final ActionMode.Callback wrappedCallback = new ActionModeCallbackWrapper(callback); + + ActionBar ab = getSupportActionBar(); + if (ab != null) { + mActionMode = ab.startActionMode(wrappedCallback); + if (mActionMode != null && mAppCompatCallback != null) { + mAppCompatCallback.onSupportActionModeStarted(mActionMode); + } + } + + if (mActionMode == null) { + // If the action bar didn't provide an action mode, start the emulated window one + mActionMode = startSupportActionModeFromWindow(wrappedCallback); + } + + return mActionMode; + } + + @Override + public void invalidateOptionsMenu() { + final ActionBar ab = getSupportActionBar(); + if (ab != null && ab.invalidateOptionsMenu()) return; + + invalidatePanelMenu(FEATURE_OPTIONS_PANEL); + } + + @Override + ActionMode startSupportActionModeFromWindow(ActionMode.Callback callback) { + if (mActionMode != null) { + mActionMode.finish(); + } + + final ActionMode.Callback wrappedCallback = new ActionModeCallbackWrapper(callback); + final Context context = getActionBarThemedContext(); + + if (mActionModeView == null) { + if (mIsFloating) { + mActionModeView = new ActionBarContextView(context); + mActionModePopup = new PopupWindow(context, null, + R.attr.actionModePopupWindowStyle); + mActionModePopup.setContentView(mActionModeView); + mActionModePopup.setWidth(ViewGroup.LayoutParams.MATCH_PARENT); + + TypedValue heightValue = new TypedValue(); + mContext.getTheme().resolveAttribute(R.attr.actionBarSize, heightValue, true); + final int height = TypedValue.complexToDimensionPixelSize(heightValue.data, + mContext.getResources().getDisplayMetrics()); + mActionModeView.setContentHeight(height); + mActionModePopup.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT); + mShowActionModePopup = new Runnable() { + public void run() { + mActionModePopup.showAtLocation( + mActionModeView, + Gravity.TOP | Gravity.FILL_HORIZONTAL, 0, 0); + } + }; + } else { + ViewStubCompat stub = (ViewStubCompat) mSubDecor + .findViewById(R.id.action_mode_bar_stub); + if (stub != null) { + // Set the layout inflater so that it is inflated with the action bar's context + stub.setLayoutInflater(LayoutInflater.from(context)); + mActionModeView = (ActionBarContextView) stub.inflate(); + } + } + } + + if (mActionModeView != null) { + mActionModeView.killMode(); + ActionMode mode = new StandaloneActionMode(context, mActionModeView, wrappedCallback, + mActionModePopup == null); + if (callback.onCreateActionMode(mode, mode.getMenu())) { + mode.invalidate(); + mActionModeView.initForMode(mode); + mActionModeView.setVisibility(View.VISIBLE); + mActionMode = mode; + if (mActionModePopup != null) { + mWindow.getDecorView().post(mShowActionModePopup); + } + mActionModeView.sendAccessibilityEvent( + AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); + + if (mActionModeView.getParent() != null) { + ViewCompat.requestApplyInsets((View) mActionModeView.getParent()); + } + } else { + mActionMode = null; + } + } + if (mActionMode != null && mAppCompatCallback != null) { + mAppCompatCallback.onSupportActionModeStarted(mActionMode); + } + return mActionMode; + } + + boolean onBackPressed() { + // Back cancels action modes first. + if (mActionMode != null) { + mActionMode.finish(); + return true; + } + + // Next collapse any expanded action views. + ActionBar ab = getSupportActionBar(); + if (ab != null && ab.collapseActionView()) { + return true; + } + + // Let the call through... + return false; + } + + @Override + boolean onKeyShortcut(int keyCode, KeyEvent ev) { + // Let the Action Bar have a chance at handling the shortcut + ActionBar ab = getSupportActionBar(); + if (ab != null && ab.onKeyShortcut(keyCode, ev)) { + return true; + } + + // If the panel is already prepared, then perform the shortcut using it. + boolean handled; + if (mPreparedPanel != null) { + handled = performPanelShortcut(mPreparedPanel, ev.getKeyCode(), ev, + Menu.FLAG_PERFORM_NO_CLOSE); + if (handled) { + if (mPreparedPanel != null) { + mPreparedPanel.isHandled = true; + } + return true; + } + } + + // If the panel is not prepared, then we may be trying to handle a shortcut key + // combination such as Control+C. Temporarily prepare the panel then mark it + // unprepared again when finished to ensure that the panel will again be prepared + // the next time it is shown for real. + if (mPreparedPanel == null) { + PanelFeatureState st = getPanelState(FEATURE_OPTIONS_PANEL, true); + preparePanel(st, ev); + handled = performPanelShortcut(st, ev.getKeyCode(), ev, Menu.FLAG_PERFORM_NO_CLOSE); + st.isPrepared = false; + if (handled) { + return true; + } + } + return false; + } + + @Override + boolean dispatchKeyEvent(KeyEvent event) { + final int keyCode = event.getKeyCode(); + final int action = event.getAction(); + final boolean isDown = action == KeyEvent.ACTION_DOWN; + + return isDown ? onKeyDown(keyCode, event) : onKeyUp(keyCode, event); + } + + boolean onKeyUp(int keyCode, KeyEvent event) { + switch (keyCode) { + case KeyEvent.KEYCODE_MENU: + onKeyUpPanel(Window.FEATURE_OPTIONS_PANEL, event); + return true; + case KeyEvent.KEYCODE_BACK: + PanelFeatureState st = getPanelState(Window.FEATURE_OPTIONS_PANEL, false); + if (st != null && st.isOpen) { + closePanel(st, true); + return true; + } + if (onBackPressed()) { + return true; + } + break; + } + return false; + } + + boolean onKeyDown(int keyCode, KeyEvent event) { + switch (keyCode) { + case KeyEvent.KEYCODE_MENU: + onKeyDownPanel(Window.FEATURE_OPTIONS_PANEL, event); + return true; + } + + // On API v7-10 we need to manually call onKeyShortcut() as this is not called + // from the Activity + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { + return onKeyShortcut(keyCode, event); + } + return false; + } + + @Override + public View createView(View parent, final String name, @NonNull Context context, + @NonNull AttributeSet attrs) { + final boolean isPre21 = Build.VERSION.SDK_INT < 21; + + if (mTintViewInflater == null) { + mTintViewInflater = new TintViewInflater(mContext); + } + + // We only want the View to inherit it's context from the parent if it is from the + // apps content, and not part of our sub-decor + final boolean inheritContext = isPre21 && mSubDecorInstalled && parent != null + && parent.getId() != android.R.id.content; + + return mTintViewInflater.createView(parent, name, context, attrs, + inheritContext, isPre21); + } + + @Override + public void installViewFactory() { + LayoutInflater layoutInflater = LayoutInflater.from(mContext); + if (layoutInflater.getFactory() == null) { + LayoutInflaterCompat.setFactory(layoutInflater, this); + } else { + Log.i(TAG, "The Activity's LayoutInflater already has a Factory installed" + + " so we can not install AppCompat's"); + } + } + + /** + * From {@link android.support.v4.view.LayoutInflaterFactory} + */ + @Override + public final View onCreateView(View parent, String name, + Context context, AttributeSet attrs) { + // First let the Activity's Factory try and inflate the view + final View view = callActivityOnCreateView(parent, name, context, attrs); + if (view != null) { + return view; + } + + // If the Factory didn't handle it, let our createView() method try + return createView(parent, name, context, attrs); + } + + View callActivityOnCreateView(View parent, String name, Context context, AttributeSet attrs) { + // Let the Activity's LayoutInflater.Factory try and handle it + if (mOriginalWindowCallback instanceof LayoutInflater.Factory) { + final View result = ((LayoutInflater.Factory) mOriginalWindowCallback) + .onCreateView(name, context, attrs); + if (result != null) { + return result; + } + } + return null; + } + + private void openPanel(final PanelFeatureState st, KeyEvent event) { + // Already open, return + if (st.isOpen || isDestroyed()) { + return; + } + + // Don't open an options panel for honeycomb apps on xlarge devices. + // (The app should be using an action bar for menu items.) + if (st.featureId == FEATURE_OPTIONS_PANEL) { + Context context = mContext; + Configuration config = context.getResources().getConfiguration(); + boolean isXLarge = (config.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == + Configuration.SCREENLAYOUT_SIZE_XLARGE; + boolean isHoneycombApp = context.getApplicationInfo().targetSdkVersion >= + android.os.Build.VERSION_CODES.HONEYCOMB; + + if (isXLarge && isHoneycombApp) { + return; + } + } + + Window.Callback cb = getWindowCallback(); + if ((cb != null) && (!cb.onMenuOpened(st.featureId, st.menu))) { + // Callback doesn't want the menu to open, reset any state + closePanel(st, true); + return; + } + + final WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); + if (wm == null) { + return; + } + + // Prepare panel (should have been done before, but just in case) + if (!preparePanel(st, event)) { + return; + } + + int width = WRAP_CONTENT; + if (st.decorView == null || st.refreshDecorView) { + if (st.decorView == null) { + // Initialize the panel decor, this will populate st.decorView + if (!initializePanelDecor(st) || (st.decorView == null)) + return; + } else if (st.refreshDecorView && (st.decorView.getChildCount() > 0)) { + // Decor needs refreshing, so remove its views + st.decorView.removeAllViews(); + } + + // This will populate st.shownPanelView + if (!initializePanelContent(st) || !st.hasPanelItems()) { + return; + } + + ViewGroup.LayoutParams lp = st.shownPanelView.getLayoutParams(); + if (lp == null) { + lp = new ViewGroup.LayoutParams(WRAP_CONTENT, WRAP_CONTENT); + } + + int backgroundResId = st.background; + st.decorView.setBackgroundResource(backgroundResId); + + ViewParent shownPanelParent = st.shownPanelView.getParent(); + if (shownPanelParent != null && shownPanelParent instanceof ViewGroup) { + ((ViewGroup) shownPanelParent).removeView(st.shownPanelView); + } + st.decorView.addView(st.shownPanelView, lp); + + /* + * Give focus to the view, if it or one of its children does not + * already have it. + */ + if (!st.shownPanelView.hasFocus()) { + st.shownPanelView.requestFocus(); + } + } else if (st.createdPanelView != null) { + // If we already had a panel view, carry width=MATCH_PARENT through + // as we did above when it was created. + ViewGroup.LayoutParams lp = st.createdPanelView.getLayoutParams(); + if (lp != null && lp.width == ViewGroup.LayoutParams.MATCH_PARENT) { + width = MATCH_PARENT; + } + } + + st.isHandled = false; + + WindowManager.LayoutParams lp = new WindowManager.LayoutParams( + width, WRAP_CONTENT, + st.x, st.y, WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL, + WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM + | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH, + PixelFormat.TRANSLUCENT); + + lp.gravity = st.gravity; + lp.windowAnimations = st.windowAnimations; + + wm.addView(st.decorView, lp); + st.isOpen = true; + } + + private boolean initializePanelDecor(PanelFeatureState st) { + st.setStyle(getActionBarThemedContext()); + st.decorView = new ListMenuDecorView(st.listPresenterContext); + st.gravity = Gravity.CENTER | Gravity.BOTTOM; + return true; + } + + private void reopenMenu(MenuBuilder menu, boolean toggleMenuMode) { + if (mDecorContentParent != null && mDecorContentParent.canShowOverflowMenu() && + (!ViewConfigurationCompat.hasPermanentMenuKey(ViewConfiguration.get(mContext)) || + mDecorContentParent.isOverflowMenuShowPending())) { + + final Window.Callback cb = getWindowCallback(); + + if (!mDecorContentParent.isOverflowMenuShowing() || !toggleMenuMode) { + if (cb != null && !isDestroyed()) { + // If we have a menu invalidation pending, do it now. + if (mInvalidatePanelMenuPosted && + (mInvalidatePanelMenuFeatures & (1 << FEATURE_OPTIONS_PANEL)) != 0) { + mWindowDecor.removeCallbacks(mInvalidatePanelMenuRunnable); + mInvalidatePanelMenuRunnable.run(); + } + + final PanelFeatureState st = getPanelState(FEATURE_OPTIONS_PANEL, true); + + // If we don't have a menu or we're waiting for a full content refresh, + // forget it. This is a lingering event that no longer matters. + if (st.menu != null && !st.refreshMenuContent && + cb.onPreparePanel(FEATURE_OPTIONS_PANEL, st.createdPanelView, st.menu)) { + cb.onMenuOpened(FEATURE_ACTION_BAR, st.menu); + mDecorContentParent.showOverflowMenu(); + } + } + } else { + mDecorContentParent.hideOverflowMenu(); + if (!isDestroyed()) { + final PanelFeatureState st = getPanelState(FEATURE_OPTIONS_PANEL, true); + cb.onPanelClosed(FEATURE_ACTION_BAR, st.menu); + } + } + return; + } + + PanelFeatureState st = getPanelState(FEATURE_OPTIONS_PANEL, true); + + st.refreshDecorView = true; + closePanel(st, false); + + openPanel(st, null); + } + + private boolean initializePanelMenu(final PanelFeatureState st) { + Context context = mContext; + + // If we have an action bar, initialize the menu with the right theme. + if ((st.featureId == FEATURE_OPTIONS_PANEL || st.featureId == FEATURE_ACTION_BAR) && + mDecorContentParent != null) { + final TypedValue outValue = new TypedValue(); + final Resources.Theme baseTheme = context.getTheme(); + baseTheme.resolveAttribute(R.attr.actionBarTheme, outValue, true); + + Resources.Theme widgetTheme = null; + if (outValue.resourceId != 0) { + widgetTheme = context.getResources().newTheme(); + widgetTheme.setTo(baseTheme); + widgetTheme.applyStyle(outValue.resourceId, true); + widgetTheme.resolveAttribute( + R.attr.actionBarWidgetTheme, outValue, true); + } else { + baseTheme.resolveAttribute( + R.attr.actionBarWidgetTheme, outValue, true); + } + + if (outValue.resourceId != 0) { + if (widgetTheme == null) { + widgetTheme = context.getResources().newTheme(); + widgetTheme.setTo(baseTheme); + } + widgetTheme.applyStyle(outValue.resourceId, true); + } + + if (widgetTheme != null) { + context = new ContextThemeWrapper(context, 0); + context.getTheme().setTo(widgetTheme); + } + } + + final MenuBuilder menu = new MenuBuilder(context); + menu.setCallback(this); + st.setMenu(menu); + + return true; + } + + private boolean initializePanelContent(PanelFeatureState st) { + if (st.createdPanelView != null) { + st.shownPanelView = st.createdPanelView; + return true; + } + + if (st.menu == null) { + return false; + } + + if (mPanelMenuPresenterCallback == null) { + mPanelMenuPresenterCallback = new PanelMenuPresenterCallback(); + } + + MenuView menuView = st.getListMenuView(mPanelMenuPresenterCallback); + + st.shownPanelView = (View) menuView; + + return st.shownPanelView != null; + } + + private boolean preparePanel(PanelFeatureState st, KeyEvent event) { + if (isDestroyed()) { + return false; + } + + // Already prepared (isPrepared will be reset to false later) + if (st.isPrepared) { + return true; + } + + if ((mPreparedPanel != null) && (mPreparedPanel != st)) { + // Another Panel is prepared and possibly open, so close it + closePanel(mPreparedPanel, false); + } + + final Window.Callback cb = getWindowCallback(); + + if (cb != null) { + st.createdPanelView = cb.onCreatePanelView(st.featureId); + } + + final boolean isActionBarMenu = + (st.featureId == FEATURE_OPTIONS_PANEL || st.featureId == FEATURE_ACTION_BAR); + + if (isActionBarMenu && mDecorContentParent != null) { + // Enforce ordering guarantees around events so that the action bar never + // dispatches menu-related events before the panel is prepared. + mDecorContentParent.setMenuPrepared(); + } + + if (st.createdPanelView == null) { + // Init the panel state's menu--return false if init failed + if (st.menu == null || st.refreshMenuContent) { + if (st.menu == null) { + if (!initializePanelMenu(st) || (st.menu == null)) { + return false; + } + } + + if (isActionBarMenu && mDecorContentParent != null) { + if (mActionMenuPresenterCallback == null) { + mActionMenuPresenterCallback = new ActionMenuPresenterCallback(); + } + mDecorContentParent.setMenu(st.menu, mActionMenuPresenterCallback); + } + + // Creating the panel menu will involve a lot of manipulation; + // don't dispatch change events to presenters until we're done. + st.menu.stopDispatchingItemsChanged(); + if (!cb.onCreatePanelMenu(st.featureId, st.menu)) { + // Ditch the menu created above + st.setMenu(null); + + if (isActionBarMenu && mDecorContentParent != null) { + // Don't show it in the action bar either + mDecorContentParent.setMenu(null, mActionMenuPresenterCallback); + } + + return false; + } + + st.refreshMenuContent = false; + } + + // Preparing the panel menu can involve a lot of manipulation; + // don't dispatch change events to presenters until we're done. + st.menu.stopDispatchingItemsChanged(); + + // Restore action view state before we prepare. This gives apps + // an opportunity to override frozen/restored state in onPrepare. + if (st.frozenActionViewState != null) { + st.menu.restoreActionViewStates(st.frozenActionViewState); + st.frozenActionViewState = null; + } + + // Callback and return if the callback does not want to show the menu + if (!cb.onPreparePanel(FEATURE_OPTIONS_PANEL, st.createdPanelView, st.menu)) { + if (isActionBarMenu && mDecorContentParent != null) { + // The app didn't want to show the menu for now but it still exists. + // Clear it out of the action bar. + mDecorContentParent.setMenu(null, mActionMenuPresenterCallback); + } + st.menu.startDispatchingItemsChanged(); + return false; + } + + // Set the proper keymap + KeyCharacterMap kmap = KeyCharacterMap.load( + event != null ? event.getDeviceId() : KeyCharacterMap.VIRTUAL_KEYBOARD); + st.qwertyMode = kmap.getKeyboardType() != KeyCharacterMap.NUMERIC; + st.menu.setQwertyMode(st.qwertyMode); + st.menu.startDispatchingItemsChanged(); + } + + // Set other state + st.isPrepared = true; + st.isHandled = false; + mPreparedPanel = st; + + return true; + } + + private void checkCloseActionMenu(MenuBuilder menu) { + if (mClosingActionMenu) { + return; + } + + mClosingActionMenu = true; + mDecorContentParent.dismissPopups(); + Window.Callback cb = getWindowCallback(); + if (cb != null && !isDestroyed()) { + cb.onPanelClosed(FEATURE_ACTION_BAR, menu); + } + mClosingActionMenu = false; + } + + private void closePanel(int featureId) { + closePanel(getPanelState(featureId, true), true); + } + + private void closePanel(PanelFeatureState st, boolean doCallback) { + if (doCallback && st.featureId == FEATURE_OPTIONS_PANEL && + mDecorContentParent != null && mDecorContentParent.isOverflowMenuShowing()) { + checkCloseActionMenu(st.menu); + return; + } + + final boolean wasOpen = st.isOpen; + + final WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); + if (wm != null && wasOpen && st.decorView != null) { + wm.removeView(st.decorView); + } + + st.isPrepared = false; + st.isHandled = false; + st.isOpen = false; + + if (wasOpen && doCallback) { + // If the panel was open and we should callback, do so. This should be done after + // isOpen is updated to ensure that we do not get into an infinite recursion + callOnPanelClosed(st.featureId, st, null); + } + + // This view is no longer shown, so null it out + st.shownPanelView = null; + + // Next time the menu opens, it should not be in expanded mode, so + // force a refresh of the decor + st.refreshDecorView = true; + + if (mPreparedPanel == st) { + mPreparedPanel = null; + } + } + + private boolean onKeyDownPanel(int featureId, KeyEvent event) { + if (event.getRepeatCount() == 0) { + PanelFeatureState st = getPanelState(featureId, true); + if (!st.isOpen) { + return preparePanel(st, event); + } + } + + return false; + } + + private void onKeyUpPanel(int featureId, KeyEvent event) { + if (mActionMode != null) { + return; + } + + boolean playSoundEffect = false; + final PanelFeatureState st = getPanelState(featureId, true); + if (featureId == FEATURE_OPTIONS_PANEL && mDecorContentParent != null && + mDecorContentParent.canShowOverflowMenu() && + !ViewConfigurationCompat.hasPermanentMenuKey(ViewConfiguration.get(mContext))) { + if (!mDecorContentParent.isOverflowMenuShowing()) { + if (!isDestroyed() && preparePanel(st, event)) { + playSoundEffect = mDecorContentParent.showOverflowMenu(); + } + } else { + playSoundEffect = mDecorContentParent.hideOverflowMenu(); + } + } else { + if (st.isOpen || st.isHandled) { + + // Play the sound effect if the user closed an open menu (and not if + // they just released a menu shortcut) + playSoundEffect = st.isOpen; + + // Close menu + closePanel(st, true); + + } else if (st.isPrepared) { + boolean show = true; + if (st.refreshMenuContent) { + // Something may have invalidated the menu since we prepared it. + // Re-prepare it to refresh. + st.isPrepared = false; + show = preparePanel(st, event); + } + + if (show) { + // Show menu + openPanel(st, event); + + playSoundEffect = true; + } + } + } + + if (playSoundEffect) { + AudioManager audioManager = (AudioManager) mContext.getSystemService( + Context.AUDIO_SERVICE); + if (audioManager != null) { + audioManager.playSoundEffect(AudioManager.FX_KEY_CLICK); + } else { + Log.w(TAG, "Couldn't get audio manager"); + } + } + } + + private void callOnPanelClosed(int featureId, PanelFeatureState panel, Menu menu) { + // Try to get a menu + if (menu == null) { + // Need a panel to grab the menu, so try to get that + if (panel == null) { + if ((featureId >= 0) && (featureId < mPanels.length)) { + panel = mPanels[featureId]; + } + } + + if (panel != null) { + // menu still may be null, which is okay--we tried our best + menu = panel.menu; + } + } + + // If the panel is not open, do not callback + if ((panel != null) && (!panel.isOpen)) + return; + + Window.Callback cb = getWindowCallback(); + if (cb != null) { + cb.onPanelClosed(featureId, menu); + } + } + + private PanelFeatureState findMenuPanel(Menu menu) { + final PanelFeatureState[] panels = mPanels; + final int N = panels != null ? panels.length : 0; + for (int i = 0; i < N; i++) { + final PanelFeatureState panel = panels[i]; + if (panel != null && panel.menu == menu) { + return panel; + } + } + return null; + } + + private PanelFeatureState getPanelState(int featureId, boolean required) { + PanelFeatureState[] ar; + if ((ar = mPanels) == null || ar.length <= featureId) { + PanelFeatureState[] nar = new PanelFeatureState[featureId + 1]; + if (ar != null) { + System.arraycopy(ar, 0, nar, 0, ar.length); + } + mPanels = ar = nar; + } + + PanelFeatureState st = ar[featureId]; + if (st == null) { + ar[featureId] = st = new PanelFeatureState(featureId); + } + return st; + } + + private boolean performPanelShortcut(PanelFeatureState st, int keyCode, KeyEvent event, + int flags) { + if (event.isSystem()) { + return false; + } + + boolean handled = false; + + // Only try to perform menu shortcuts if preparePanel returned true (possible false + // return value from application not wanting to show the menu). + if ((st.isPrepared || preparePanel(st, event)) && st.menu != null) { + // The menu is prepared now, perform the shortcut on it + handled = st.menu.performShortcut(keyCode, event, flags); + } + + if (handled) { + // Only close down the menu if we don't have an action bar keeping it open. + if ((flags & Menu.FLAG_PERFORM_NO_CLOSE) == 0 && mDecorContentParent == null) { + closePanel(st, true); + } + } + + return handled; + } + + private void invalidatePanelMenu(int featureId) { + mInvalidatePanelMenuFeatures |= 1 << featureId; + + if (!mInvalidatePanelMenuPosted && mWindowDecor != null) { + ViewCompat.postOnAnimation(mWindowDecor, mInvalidatePanelMenuRunnable); + mInvalidatePanelMenuPosted = true; + } + } + + private void doInvalidatePanelMenu(int featureId) { + PanelFeatureState st = getPanelState(featureId, true); + Bundle savedActionViewStates = null; + if (st.menu != null) { + savedActionViewStates = new Bundle(); + st.menu.saveActionViewStates(savedActionViewStates); + if (savedActionViewStates.size() > 0) { + st.frozenActionViewState = savedActionViewStates; + } + // This will be started again when the panel is prepared. + st.menu.stopDispatchingItemsChanged(); + st.menu.clear(); + } + st.refreshMenuContent = true; + st.refreshDecorView = true; + + // Prepare the options panel if we have an action bar + if ((featureId == FEATURE_ACTION_BAR || featureId == FEATURE_OPTIONS_PANEL) + && mDecorContentParent != null) { + st = getPanelState(Window.FEATURE_OPTIONS_PANEL, false); + if (st != null) { + st.isPrepared = false; + preparePanel(st, null); + } + } + } + + /** + * Updates the status bar guard + * + * @param insetTop the current top system window inset + * @return the new top system window inset + */ + private int updateStatusGuard(int insetTop) { + boolean showStatusGuard = false; + // Show the status guard when the non-overlay contextual action bar is showing + if (mActionModeView != null) { + if (mActionModeView.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) { + ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams) + mActionModeView.getLayoutParams(); + boolean mlpChanged = false; + + if (mActionModeView.isShown()) { + if (mTempRect1 == null) { + mTempRect1 = new Rect(); + mTempRect2 = new Rect(); + } + final Rect insets = mTempRect1; + final Rect localInsets = mTempRect2; + insets.set(0, insetTop, 0, 0); + + ViewUtils.computeFitSystemWindows(mSubDecor, insets, localInsets); + final int newMargin = localInsets.top == 0 ? insetTop : 0; + if (mlp.topMargin != newMargin) { + mlpChanged = true; + mlp.topMargin = insetTop; + + if (mStatusGuard == null) { + mStatusGuard = new View(mContext); + mStatusGuard.setBackgroundColor(mContext.getResources() + .getColor(R.color.abc_input_method_navigation_guard)); + mSubDecor.addView(mStatusGuard, -1, + new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, + insetTop)); + } else { + ViewGroup.LayoutParams lp = mStatusGuard.getLayoutParams(); + if (lp.height != insetTop) { + lp.height = insetTop; + mStatusGuard.setLayoutParams(lp); + } + } + } + + // The action mode's theme may differ from the app, so + // always show the status guard above it. + showStatusGuard = mStatusGuard != null; + + // We only need to consume the insets if the action + // mode is overlaid on the app content (e.g. it's + // sitting in a FrameLayout, see + // screen_simple_overlay_action_mode.xml). + if (!mOverlayActionMode && showStatusGuard) { + insetTop = 0; + } + } else { + // reset top margin + if (mlp.topMargin != 0) { + mlpChanged = true; + mlp.topMargin = 0; + } + } + if (mlpChanged) { + mActionModeView.setLayoutParams(mlp); + } + } + } + if (mStatusGuard != null) { + mStatusGuard.setVisibility(showStatusGuard ? View.VISIBLE : View.GONE); + } + + return insetTop; + } + + private void throwFeatureRequestIfSubDecorInstalled() { + if (mSubDecorInstalled) { + throw new AndroidRuntimeException( + "Window feature must be requested before adding content"); + } + } + + ViewGroup getSubDecor() { + return mSubDecor; + } + + /** + * Clears out internal reference when the action mode is destroyed. + */ + private class ActionModeCallbackWrapper implements ActionMode.Callback { + private 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 (mActionModePopup != null) { + mWindow.getDecorView().removeCallbacks(mShowActionModePopup); + mActionModePopup.dismiss(); + } else if (mActionModeView != null) { + mActionModeView.setVisibility(View.GONE); + if (mActionModeView.getParent() != null) { + ViewCompat.requestApplyInsets((View) mActionModeView.getParent()); + } + } + if (mActionModeView != null) { + mActionModeView.removeAllViews(); + } + if (mAppCompatCallback != null) { + mAppCompatCallback.onSupportActionModeFinished(mActionMode); + } + mActionMode = null; + } + } + + private final class PanelMenuPresenterCallback implements MenuPresenter.Callback { + @Override + public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { + final Menu parentMenu = menu.getRootMenu(); + final boolean isSubMenu = parentMenu != menu; + final PanelFeatureState panel = findMenuPanel(isSubMenu ? parentMenu : menu); + if (panel != null) { + if (isSubMenu) { + callOnPanelClosed(panel.featureId, panel, parentMenu); + closePanel(panel, true); + } else { + // Close the panel and only do the callback if the menu is being + // closed completely, not if opening a sub menu + closePanel(panel, allMenusAreClosing); + } + } + } + + @Override + public boolean onOpenSubMenu(MenuBuilder subMenu) { + if (subMenu == null && mHasActionBar) { + Window.Callback cb = getWindowCallback(); + if (cb != null && !isDestroyed()) { + cb.onMenuOpened(FEATURE_ACTION_BAR, subMenu); + } + } + return true; + } + } + + private final class ActionMenuPresenterCallback implements MenuPresenter.Callback { + @Override + public boolean onOpenSubMenu(MenuBuilder subMenu) { + Window.Callback cb = getWindowCallback(); + if (cb != null) { + cb.onMenuOpened(FEATURE_ACTION_BAR, subMenu); + } + return true; + } + + @Override + public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { + checkCloseActionMenu(menu); + } + } + + private static final class PanelFeatureState { + + /** Feature ID for this panel. */ + int featureId; + + int background; + + int gravity; + + int x; + + int y; + + int windowAnimations; + + /** Dynamic state of the panel. */ + ViewGroup decorView; + + /** The panel that we are actually showing. */ + View shownPanelView; + + /** The panel that was returned by onCreatePanelView(). */ + View createdPanelView; + + /** Use {@link #setMenu} to set this. */ + MenuBuilder menu; + + ListMenuPresenter listMenuPresenter; + + Context listPresenterContext; + + /** + * Whether the panel has been prepared (see + * {@link #preparePanel}). + */ + boolean isPrepared; + + /** + * Whether an item's action has been performed. This happens in obvious + * scenarios (user clicks on menu item), but can also happen with + * chording menu+(shortcut key). + */ + boolean isHandled; + + boolean isOpen; + + public boolean qwertyMode; + + boolean refreshDecorView; + + boolean refreshMenuContent; + + boolean wasLastOpen; + + /** + * Contains the state of the menu when told to freeze. + */ + Bundle frozenMenuState; + + /** + * Contains the state of associated action views when told to freeze. + * These are saved across invalidations. + */ + Bundle frozenActionViewState; + + PanelFeatureState(int featureId) { + this.featureId = featureId; + + refreshDecorView = false; + } + + public boolean hasPanelItems() { + if (shownPanelView == null) return false; + if (createdPanelView != null) return true; + + return listMenuPresenter.getAdapter().getCount() > 0; + } + + /** + * Unregister and free attached MenuPresenters. They will be recreated as needed. + */ + public void clearMenuPresenters() { + if (menu != null) { + menu.removeMenuPresenter(listMenuPresenter); + } + listMenuPresenter = null; + } + + void setStyle(Context context) { + final TypedValue outValue = new TypedValue(); + final Resources.Theme widgetTheme = context.getResources().newTheme(); + widgetTheme.setTo(context.getTheme()); + + // First apply the actionBarPopupTheme + widgetTheme.resolveAttribute(R.attr.actionBarPopupTheme, outValue, true); + if (outValue.resourceId != 0) { + widgetTheme.applyStyle(outValue.resourceId, true); + } + + // Now apply the panelMenuListTheme + widgetTheme.resolveAttribute(R.attr.panelMenuListTheme, outValue, true); + if (outValue.resourceId != 0) { + widgetTheme.applyStyle(outValue.resourceId, true); + } else { + widgetTheme.applyStyle(R.style.Theme_AppCompat_CompactMenu, true); + } + + context = new ContextThemeWrapper(context, 0); + context.getTheme().setTo(widgetTheme); + + listPresenterContext = context; + + TypedArray a = context.obtainStyledAttributes(R.styleable.Theme); + background = a.getResourceId( + R.styleable.Theme_panelBackground, 0); + windowAnimations = a.getResourceId( + R.styleable.Theme_android_windowAnimationStyle, 0); + a.recycle(); + } + + void setMenu(MenuBuilder menu) { + if (menu == this.menu) return; + + if (this.menu != null) { + this.menu.removeMenuPresenter(listMenuPresenter); + } + this.menu = menu; + if (menu != null) { + if (listMenuPresenter != null) menu.addMenuPresenter(listMenuPresenter); + } + } + + MenuView getListMenuView(MenuPresenter.Callback cb) { + if (menu == null) return null; + + if (listMenuPresenter == null) { + listMenuPresenter = new ListMenuPresenter(listPresenterContext, + R.layout.abc_list_menu_item_layout); + listMenuPresenter.setCallback(cb); + menu.addMenuPresenter(listMenuPresenter); + } + + MenuView result = listMenuPresenter.getMenuView(decorView); + + return result; + } + + Parcelable onSaveInstanceState() { + SavedState savedState = new SavedState(); + savedState.featureId = featureId; + savedState.isOpen = isOpen; + + if (menu != null) { + savedState.menuState = new Bundle(); + menu.savePresenterStates(savedState.menuState); + } + + return savedState; + } + + void onRestoreInstanceState(Parcelable state) { + SavedState savedState = (SavedState) state; + featureId = savedState.featureId; + wasLastOpen = savedState.isOpen; + frozenMenuState = savedState.menuState; + + shownPanelView = null; + decorView = null; + } + + void applyFrozenState() { + if (menu != null && frozenMenuState != null) { + menu.restorePresenterStates(frozenMenuState); + frozenMenuState = null; + } + } + + private static class SavedState implements Parcelable { + int featureId; + boolean isOpen; + Bundle menuState; + + public int describeContents() { + return 0; + } + + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(featureId); + dest.writeInt(isOpen ? 1 : 0); + + if (isOpen) { + dest.writeBundle(menuState); + } + } + + private static SavedState readFromParcel(Parcel source) { + SavedState savedState = new SavedState(); + savedState.featureId = source.readInt(); + savedState.isOpen = source.readInt() == 1; + + if (savedState.isOpen) { + savedState.menuState = source.readBundle(); + } + + return savedState; + } + + public static final Parcelable.Creator CREATOR + = new Parcelable.Creator() { + public SavedState createFromParcel(Parcel in) { + return readFromParcel(in); + } + + public SavedState[] newArray(int size) { + return new SavedState[size]; + } + }; + } + } + + private class ListMenuDecorView extends FrameLayout { + public ListMenuDecorView(Context context) { + super(context); + } + + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + return AppCompatDelegateImplV7.this.dispatchKeyEvent(event); + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent event) { + int action = event.getAction(); + if (action == MotionEvent.ACTION_DOWN) { + int x = (int) event.getX(); + int y = (int) event.getY(); + if (isOutOfBounds(x, y)) { + closePanel(Window.FEATURE_OPTIONS_PANEL); + return true; + } + } + return super.onInterceptTouchEvent(event); + } + + @Override + public void setBackgroundResource(int resid) { + setBackgroundDrawable(TintManager.getDrawable(getContext(), resid)); + } + + private boolean isOutOfBounds(int x, int y) { + return x < -5 || y < -5 || x > (getWidth() + 5) || y > (getHeight() + 5); + } + } + +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/app/AppCompatDialog.java b/eclipse-compile/appcompat/src/android/support/v7/app/AppCompatDialog.java new file mode 100644 index 0000000000..90393425db --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/app/AppCompatDialog.java @@ -0,0 +1,163 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.app; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.support.annotation.LayoutRes; +import android.support.v7.appcompat.R; +import android.support.v7.view.ActionMode; +import android.util.TypedValue; +import android.view.View; +import android.view.ViewGroup; + +/** + * Base class for AppCompat themed {@link android.app.Dialog}s. + */ +public class AppCompatDialog extends Dialog implements AppCompatCallback { + + private AppCompatDelegate mDelegate; + + public AppCompatDialog(Context context) { + this(context, 0); + } + + public AppCompatDialog(Context context, int theme) { + super(context, getThemeResId(context, theme)); + + // This is a bit weird, but Dialog's are typically created and setup before being shown, + // which means that we can't rely on onCreate() being called before a content view is set. + // To workaround this, we call onCreate(null) in the ctor, and then again as usual in + // onCreate(). + getDelegate().onCreate(null); + } + + protected AppCompatDialog(Context context, boolean cancelable, + OnCancelListener cancelListener) { + super(context, cancelable, cancelListener); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + getDelegate().installViewFactory(); + super.onCreate(savedInstanceState); + getDelegate().onCreate(savedInstanceState); + } + + /** + * Support library version of {@link android.app.Dialog#getActionBar}. + * + *

      Retrieve a reference to this dialog's ActionBar. + * + * @return The Dialog's ActionBar, or null if it does not have one. + */ + public ActionBar getSupportActionBar() { + return getDelegate().getSupportActionBar(); + } + + @Override + public void setContentView(@LayoutRes int layoutResID) { + getDelegate().setContentView(layoutResID); + } + + @Override + public void setContentView(View view) { + getDelegate().setContentView(view); + } + + @Override + public void setContentView(View view, ViewGroup.LayoutParams params) { + getDelegate().setContentView(view, params); + } + + @Override + public void setTitle(CharSequence title) { + super.setTitle(title); + getDelegate().setTitle(title); + } + + @Override + public void setTitle(int titleId) { + super.setTitle(titleId); + getDelegate().setTitle(getContext().getString(titleId)); + } + + @Override + public void addContentView(View view, ViewGroup.LayoutParams params) { + getDelegate().addContentView(view, params); + } + + @Override + protected void onStop() { + super.onStop(); + getDelegate().onStop(); + } + + /** + * Enable extended support library window features. + *

      + * This is a convenience for calling + * {@link android.view.Window#requestFeature getWindow().requestFeature()}. + *

      + * + * @param featureId The desired feature as defined in {@link android.view.Window} or + * {@link android.support.v4.view.WindowCompat}. + * @return Returns true if the requested feature is supported and now enabled. + * + * @see android.app.Dialog#requestWindowFeature + * @see android.view.Window#requestFeature + */ + public boolean supportRequestWindowFeature(int featureId) { + return getDelegate().requestWindowFeature(featureId); + } + + /** + * @hide + */ + public void invalidateOptionsMenu() { + getDelegate().invalidateOptionsMenu(); + } + + /** + * @return The {@link AppCompatDelegate} being used by this Dialog. + */ + public AppCompatDelegate getDelegate() { + if (mDelegate == null) { + mDelegate = AppCompatDelegate.create(this, this); + } + return mDelegate; + } + + private static int getThemeResId(Context context, int themeId) { + if (themeId == 0) { + // If the provided theme is 0, then retrieve the dialogTheme from our theme + TypedValue outValue = new TypedValue(); + context.getTheme().resolveAttribute(R.attr.dialogTheme, outValue, true); + themeId = outValue.resourceId; + } + return themeId; + } + + @Override + public void onSupportActionModeStarted(ActionMode mode) { + } + + @Override + public void onSupportActionModeFinished(ActionMode mode) { + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/app/DrawerArrowDrawable.java b/eclipse-compile/appcompat/src/android/support/v7/app/DrawerArrowDrawable.java new file mode 100644 index 0000000000..06bb360232 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/app/DrawerArrowDrawable.java @@ -0,0 +1,207 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package android.support.v7.app; + + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.ColorFilter; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.PixelFormat; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.support.v7.appcompat.R; + +/** + * A drawable that can draw a "Drawer hamburger" menu or an Arrow and animate between them. + */ +abstract class DrawerArrowDrawable extends Drawable { + + private final Paint mPaint = new Paint(); + + // The angle in degress that the arrow head is inclined at. + private static final float ARROW_HEAD_ANGLE = (float) Math.toRadians(45); + private final float mBarThickness; + // The length of top and bottom bars when they merge into an arrow + private final float mTopBottomArrowSize; + // The length of middle bar + private final float mBarSize; + // The length of the middle bar when arrow is shaped + private final float mMiddleArrowSize; + // The space between bars when they are parallel + private final float mBarGap; + // Whether bars should spin or not during progress + private final boolean mSpin; + // Use Path instead of canvas operations so that if color has transparency, overlapping sections + // wont look different + private final Path mPath = new Path(); + // The reported intrinsic size of the drawable. + private final int mSize; + // Whether we should mirror animation when animation is reversed. + private boolean mVerticalMirror = false; + // The interpolated version of the original progress + private float mProgress; + // the amount that overlaps w/ bar size when rotation is max + private float mMaxCutForBarSize; + // The distance of arrow's center from top when horizontal + private float mCenterOffset; + + /** + * @param context used to get the configuration for the drawable from + */ + DrawerArrowDrawable(Context context) { + final TypedArray typedArray = context.getTheme() + .obtainStyledAttributes(null, R.styleable.DrawerArrowToggle, + R.attr.drawerArrowStyle, + R.style.Base_Widget_AppCompat_DrawerArrowToggle); + mPaint.setAntiAlias(true); + mPaint.setColor(typedArray.getColor(R.styleable.DrawerArrowToggle_color, 0)); + mSize = typedArray.getDimensionPixelSize(R.styleable.DrawerArrowToggle_drawableSize, 0); + // round this because having this floating may cause bad measurements + mBarSize = Math.round(typedArray.getDimension(R.styleable.DrawerArrowToggle_barSize, 0)); + // round this because having this floating may cause bad measurements + mTopBottomArrowSize = Math.round(typedArray.getDimension( + R.styleable.DrawerArrowToggle_topBottomBarArrowSize, 0)); + mBarThickness = typedArray.getDimension(R.styleable.DrawerArrowToggle_thickness, 0); + // round this because having this floating may cause bad measurements + mBarGap = Math.round(typedArray.getDimension( + R.styleable.DrawerArrowToggle_gapBetweenBars, 0)); + mSpin = typedArray.getBoolean(R.styleable.DrawerArrowToggle_spinBars, true); + mMiddleArrowSize = typedArray + .getDimension(R.styleable.DrawerArrowToggle_middleBarArrowSize, 0); + final int remainingSpace = (int) (mSize - mBarThickness * 3 - mBarGap * 2); + mCenterOffset = (remainingSpace / 4) * 2; //making sure it is a multiple of 2. + mCenterOffset += mBarThickness * 1.5 + mBarGap; + typedArray.recycle(); + + mPaint.setStyle(Paint.Style.STROKE); + mPaint.setStrokeJoin(Paint.Join.MITER); + mPaint.setStrokeCap(Paint.Cap.BUTT); + mPaint.setStrokeWidth(mBarThickness); + + mMaxCutForBarSize = (float) (mBarThickness / 2 * Math.cos(ARROW_HEAD_ANGLE)); + } + + abstract boolean isLayoutRtl(); + + /** + * If set, canvas is flipped when progress reached to end and going back to start. + */ + protected void setVerticalMirror(boolean verticalMirror) { + mVerticalMirror = verticalMirror; + } + + @Override + public void draw(Canvas canvas) { + Rect bounds = getBounds(); + final boolean isRtl = isLayoutRtl(); + // Interpolated widths of arrow bars + final float arrowSize = lerp(mBarSize, mTopBottomArrowSize, mProgress); + final float middleBarSize = lerp(mBarSize, mMiddleArrowSize, mProgress); + // Interpolated size of middle bar + final float middleBarCut = Math.round(lerp(0, mMaxCutForBarSize, mProgress)); + // The rotation of the top and bottom bars (that make the arrow head) + final float rotation = lerp(0, ARROW_HEAD_ANGLE, mProgress); + + // The whole canvas rotates as the transition happens + final float canvasRotate = lerp(isRtl ? 0 : -180, isRtl ? 180 : 0, mProgress); + final float arrowWidth = Math.round(arrowSize * Math.cos(rotation)); + final float arrowHeight = Math.round(arrowSize * Math.sin(rotation)); + + + mPath.rewind(); + final float topBottomBarOffset = lerp(mBarGap + mBarThickness, -mMaxCutForBarSize, + mProgress); + + final float arrowEdge = -middleBarSize / 2; + // draw middle bar + mPath.moveTo(arrowEdge + middleBarCut, 0); + mPath.rLineTo(middleBarSize - middleBarCut * 2, 0); + + // bottom bar + mPath.moveTo(arrowEdge, topBottomBarOffset); + mPath.rLineTo(arrowWidth, arrowHeight); + + // top bar + mPath.moveTo(arrowEdge, -topBottomBarOffset); + mPath.rLineTo(arrowWidth, -arrowHeight); + + mPath.close(); + + canvas.save(); + // Rotate the whole canvas if spinning, if not, rotate it 180 to get + // the arrow pointing the other way for RTL. + canvas.translate(bounds.centerX(), mCenterOffset); + if (mSpin) { + canvas.rotate(canvasRotate * ((mVerticalMirror ^ isRtl) ? -1 : 1)); + } else if (isRtl) { + canvas.rotate(180); + } + canvas.drawPath(mPath, mPaint); + + canvas.restore(); + } + + @Override + public void setAlpha(int i) { + mPaint.setAlpha(i); + } + + // override + public boolean isAutoMirrored() { + // Draws rotated 180 degrees in RTL mode. + return true; + } + + @Override + public void setColorFilter(ColorFilter colorFilter) { + mPaint.setColorFilter(colorFilter); + } + + @Override + public int getIntrinsicHeight() { + return mSize; + } + + @Override + public int getIntrinsicWidth() { + return mSize; + } + + @Override + public int getOpacity() { + return PixelFormat.TRANSLUCENT; + } + + public float getProgress() { + return mProgress; + } + + public void setProgress(float progress) { + mProgress = progress; + invalidateSelf(); + } + + /** + * Linear interpolate between a and b with parameter t. + */ + private static float lerp(float a, float b, float t) { + return a + (b - a) * t; + } +} \ No newline at end of file diff --git a/eclipse-compile/appcompat/src/android/support/v7/graphics/drawable/DrawableWrapper.java b/eclipse-compile/appcompat/src/android/support/v7/graphics/drawable/DrawableWrapper.java new file mode 100644 index 0000000000..b97d07c809 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/graphics/drawable/DrawableWrapper.java @@ -0,0 +1,225 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.graphics.drawable; + +import android.content.res.ColorStateList; +import android.graphics.Canvas; +import android.graphics.ColorFilter; +import android.graphics.PorterDuff; +import android.graphics.Rect; +import android.graphics.Region; +import android.graphics.drawable.Drawable; +import android.support.v4.graphics.drawable.DrawableCompat; +import android.view.View; + +/** + * Drawable which delegates all calls to it's wrapped {@link Drawable}. + *

      + * The wrapped {@link Drawable} must be fully released from any {@link View} + * before wrapping, otherwise internal {@link Drawable.Callback} may be dropped. + * + * @hide + */ +public class DrawableWrapper extends Drawable implements Drawable.Callback { + + private Drawable mDrawable; + + public DrawableWrapper(Drawable drawable) { + setWrappedDrawable(drawable); + } + + @Override + public void draw(Canvas canvas) { + mDrawable.draw(canvas); + } + + @Override + protected void onBoundsChange(Rect bounds) { + mDrawable.setBounds(bounds); + } + + @Override + public void setChangingConfigurations(int configs) { + mDrawable.setChangingConfigurations(configs); + } + + @Override + public int getChangingConfigurations() { + return mDrawable.getChangingConfigurations(); + } + + @Override + public void setDither(boolean dither) { + mDrawable.setDither(dither); + } + + @Override + public void setFilterBitmap(boolean filter) { + mDrawable.setFilterBitmap(filter); + } + + @Override + public void setAlpha(int alpha) { + mDrawable.setAlpha(alpha); + } + + @Override + public void setColorFilter(ColorFilter cf) { + mDrawable.setColorFilter(cf); + } + + @Override + public boolean isStateful() { + return mDrawable.isStateful(); + } + + @Override + public boolean setState(final int[] stateSet) { + return mDrawable.setState(stateSet); + } + + @Override + public int[] getState() { + return mDrawable.getState(); + } + + public void jumpToCurrentState() { + DrawableCompat.jumpToCurrentState(mDrawable); + } + + @Override + public Drawable getCurrent() { + return mDrawable.getCurrent(); + } + + @Override + public boolean setVisible(boolean visible, boolean restart) { + return super.setVisible(visible, restart) || mDrawable.setVisible(visible, restart); + } + + @Override + public int getOpacity() { + return mDrawable.getOpacity(); + } + + @Override + public Region getTransparentRegion() { + return mDrawable.getTransparentRegion(); + } + + @Override + public int getIntrinsicWidth() { + return mDrawable.getIntrinsicWidth(); + } + + @Override + public int getIntrinsicHeight() { + return mDrawable.getIntrinsicHeight(); + } + + @Override + public int getMinimumWidth() { + return mDrawable.getMinimumWidth(); + } + + @Override + public int getMinimumHeight() { + return mDrawable.getMinimumHeight(); + } + + @Override + public boolean getPadding(Rect padding) { + return mDrawable.getPadding(padding); + } + + /** + * {@inheritDoc} + */ + public void invalidateDrawable(Drawable who) { + invalidateSelf(); + } + + /** + * {@inheritDoc} + */ + public void scheduleDrawable(Drawable who, Runnable what, long when) { + scheduleSelf(what, when); + } + + /** + * {@inheritDoc} + */ + public void unscheduleDrawable(Drawable who, Runnable what) { + unscheduleSelf(what); + } + + @Override + protected boolean onLevelChange(int level) { + return mDrawable.setLevel(level); + } + + @Override + public void setAutoMirrored(boolean mirrored) { + DrawableCompat.setAutoMirrored(mDrawable, mirrored); + } + + @Override + public boolean isAutoMirrored() { + return DrawableCompat.isAutoMirrored(mDrawable); + } + + @Override + public void setTint(int tint) { + DrawableCompat.setTint(mDrawable, tint); + } + + @Override + public void setTintList(ColorStateList tint) { + DrawableCompat.setTintList(mDrawable, tint); + } + + @Override + public void setTintMode(PorterDuff.Mode tintMode) { + DrawableCompat.setTintMode(mDrawable, tintMode); + } + + @Override + public void setHotspot(float x, float y) { + DrawableCompat.setHotspot(mDrawable, x, y); + } + + @Override + public void setHotspotBounds(int left, int top, int right, int bottom) { + DrawableCompat.setHotspotBounds(mDrawable, left, top, right, bottom); + } + + public Drawable getWrappedDrawable() { + return mDrawable; + } + + public void setWrappedDrawable(Drawable drawable) { + if (mDrawable != null) { + mDrawable.setCallback(null); + } + + mDrawable = drawable; + + if (drawable != null) { + drawable.setCallback(this); + } + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/VersionUtils.java b/eclipse-compile/appcompat/src/android/support/v7/internal/VersionUtils.java new file mode 100644 index 0000000000..babd65c8b5 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/VersionUtils.java @@ -0,0 +1,16 @@ +package android.support.v7.internal; + +import android.os.Build; + +/** + * @hide + */ +public class VersionUtils { + + private VersionUtils() {} + + public static boolean isAtLeastL() { + return Build.VERSION.SDK_INT >= 21; + } + +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/app/NavItemSelectedListener.java b/eclipse-compile/appcompat/src/android/support/v7/internal/app/NavItemSelectedListener.java new file mode 100644 index 0000000000..189260a5bf --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/app/NavItemSelectedListener.java @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package android.support.v7.internal.app; + +import android.support.v7.app.ActionBar; +import android.support.v7.internal.widget.AdapterViewCompat; +import android.view.View; + +/** + * Wrapper to adapt the ActionBar.OnNavigationListener in an AdapterView.OnItemSelectedListener + * for use in Spinner widgets. Used by action bar implementations. + * + * @hide + */ +class NavItemSelectedListener implements AdapterViewCompat.OnItemSelectedListener { + private final ActionBar.OnNavigationListener mListener; + + public NavItemSelectedListener(ActionBar.OnNavigationListener listener) { + mListener = listener; + } + + @Override + public void onItemSelected(AdapterViewCompat parent, View view, int position, long id) { + if (mListener != null) { + mListener.onNavigationItemSelected(position, id); + } + } + + @Override + public void onNothingSelected(AdapterViewCompat parent) { + // Do nothing + } +} \ No newline at end of file diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/app/TintViewInflater.java b/eclipse-compile/appcompat/src/android/support/v7/internal/app/TintViewInflater.java new file mode 100644 index 0000000000..9f59256338 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/app/TintViewInflater.java @@ -0,0 +1,156 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.app; + +import android.content.Context; +import android.support.annotation.NonNull; +import android.support.v7.internal.widget.TintAutoCompleteTextView; +import android.support.v7.internal.widget.TintButton; +import android.support.v7.internal.widget.TintCheckBox; +import android.support.v7.internal.widget.TintCheckedTextView; +import android.support.v7.internal.widget.TintEditText; +import android.support.v7.internal.widget.TintMultiAutoCompleteTextView; +import android.support.v7.internal.widget.TintRadioButton; +import android.support.v7.internal.widget.TintRatingBar; +import android.support.v7.internal.widget.TintSpinner; +import android.support.v7.internal.widget.ViewUtils; +import android.util.AttributeSet; +import android.view.InflateException; +import android.view.View; + +import java.lang.reflect.Constructor; +import java.util.HashMap; +import java.util.Map; + +/** + * This class is responsible for manually inflating our tinted widgets which are used on devices + * running {@link android.os.Build.VERSION_CODES#KITKAT KITKAT} or below. As such, this class + * should only be used when running on those devices. + *

      This class two main responsibilities: the first is to 'inject' our tinted views in place of + * the framework versions in layout inflation; the second is backport the {@code android:theme} + * functionality for any inflated widgets. This include theme inheritance from it's parent. + * + * @hide + */ +public class TintViewInflater { + + static final Class[] sConstructorSignature = new Class[] { + Context.class, AttributeSet.class}; + + private static final Map> sConstructorMap = new HashMap<>(); + + private final Context mContext; + private final Object[] mConstructorArgs = new Object[2]; + + public TintViewInflater(Context context) { + mContext = context; + } + + public final View createView(View parent, final String name, @NonNull Context context, + @NonNull AttributeSet attrs, boolean inheritContext, boolean themeContext) { + final Context originalContext = context; + + // We can emulate Lollipop's android:theme attribute propagating down the view hierarchy + // by using the parent's context + if (inheritContext && parent != null) { + context = parent.getContext(); + } + if (themeContext) { + // We then apply the theme on the context, if specified + context = ViewUtils.themifyContext(context, attrs, true, true); + } + + // We need to 'inject' our tint aware Views in place of the standard framework versions + switch (name) { + case "EditText": + return new TintEditText(context, attrs); + case "Spinner": + return new TintSpinner(context, attrs); + case "CheckBox": + return new TintCheckBox(context, attrs); + case "RadioButton": + return new TintRadioButton(context, attrs); + case "CheckedTextView": + return new TintCheckedTextView(context, attrs); + case "AutoCompleteTextView": + return new TintAutoCompleteTextView(context, attrs); + case "MultiAutoCompleteTextView": + return new TintMultiAutoCompleteTextView(context, attrs); + case "RatingBar": + return new TintRatingBar(context, attrs); + case "Button": + return new TintButton(context, attrs); + } + + if (originalContext != context) { + // If the original context does not equal our themed context, then we need to manually + // inflate it using the name so that app:theme takes effect. + return createViewFromTag(context, name, attrs); + } + + return null; + } + + private View createViewFromTag(Context context, String name, AttributeSet attrs) { + if (name.equals("view")) { + name = attrs.getAttributeValue(null, "class"); + } + + try { + mConstructorArgs[0] = context; + mConstructorArgs[1] = attrs; + + if (-1 == name.indexOf('.')) { + // try the android.widget prefix first... + return createView(name, "android.widget."); + } else { + return createView(name, null); + } + } catch (Exception e) { + // We do not want to catch these, lets return null and let the actual LayoutInflater + // try + return null; + } finally { + // Don't retain static reference on context. + mConstructorArgs[0] = null; + mConstructorArgs[1] = null; + } + } + + private View createView(String name, String prefix) + throws ClassNotFoundException, InflateException { + Constructor constructor = sConstructorMap.get(name); + + try { + if (constructor == null) { + // Class not found in the cache, see if it's real, and try to add it + Class clazz = mContext.getClassLoader().loadClass( + prefix != null ? (prefix + name) : name).asSubclass(View.class); + + constructor = clazz.getConstructor(sConstructorSignature); + sConstructorMap.put(name, constructor); + } + constructor.setAccessible(true); + return constructor.newInstance(mConstructorArgs); + } catch (Exception e) { + // We do not want to catch these, lets return null and let the actual LayoutInflater + // try + return null; + } + } + +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/app/ToolbarActionBar.java b/eclipse-compile/appcompat/src/android/support/v7/internal/app/ToolbarActionBar.java new file mode 100644 index 0000000000..9653f42c5d --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/app/ToolbarActionBar.java @@ -0,0 +1,635 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.app; + +import android.content.Context; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.graphics.drawable.Drawable; +import android.support.annotation.Nullable; +import android.support.v4.view.ViewCompat; +import android.support.v4.view.WindowCompat; +import android.support.v7.app.ActionBar; +import android.support.v7.internal.view.WindowCallbackWrapper; +import android.support.v7.appcompat.R; +import android.support.v7.internal.view.menu.ListMenuPresenter; +import android.support.v7.internal.view.menu.MenuBuilder; +import android.support.v7.internal.view.menu.MenuPresenter; +import android.support.v7.internal.widget.DecorToolbar; +import android.support.v7.internal.widget.ToolbarWidgetWrapper; +import android.support.v7.widget.Toolbar; +import android.util.TypedValue; +import android.view.ContextThemeWrapper; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.Window; +import android.widget.SpinnerAdapter; + +import java.util.ArrayList; + +/** + * @hide + */ +public class ToolbarActionBar extends ActionBar { + private DecorToolbar mDecorToolbar; + private boolean mToolbarMenuPrepared; + private Window.Callback mWindowCallback; + private boolean mMenuCallbackSet; + + private boolean mLastMenuVisibility; + private ArrayList mMenuVisibilityListeners = + new ArrayList(); + + private Window mWindow; + private ListMenuPresenter mListMenuPresenter; + + private final Runnable mMenuInvalidator = new Runnable() { + @Override + public void run() { + populateOptionsMenu(); + } + }; + + private final Toolbar.OnMenuItemClickListener mMenuClicker = + new Toolbar.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + return mWindowCallback.onMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, item); + } + }; + + public ToolbarActionBar(Toolbar toolbar, CharSequence title, Window window) { + mDecorToolbar = new ToolbarWidgetWrapper(toolbar, false); + mWindowCallback = new ToolbarCallbackWrapper(window.getCallback()); + mDecorToolbar.setWindowCallback(mWindowCallback); + toolbar.setOnMenuItemClickListener(mMenuClicker); + mDecorToolbar.setWindowTitle(title); + + mWindow = window; + } + + public Window.Callback getWrappedWindowCallback() { + return mWindowCallback; + } + + @Override + public void setCustomView(View view) { + setCustomView(view, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); + } + + @Override + public void setCustomView(View view, LayoutParams layoutParams) { + view.setLayoutParams(layoutParams); + mDecorToolbar.setCustomView(view); + } + + @Override + public void setCustomView(int resId) { + final LayoutInflater inflater = LayoutInflater.from(mDecorToolbar.getContext()); + setCustomView(inflater.inflate(resId, mDecorToolbar.getViewGroup(), false)); + } + + @Override + public void setIcon(int resId) { + mDecorToolbar.setIcon(resId); + } + + @Override + public void setIcon(Drawable icon) { + mDecorToolbar.setIcon(icon); + } + + @Override + public void setLogo(int resId) { + mDecorToolbar.setLogo(resId); + } + + @Override + public void setLogo(Drawable logo) { + mDecorToolbar.setLogo(logo); + } + + @Override + public void setStackedBackgroundDrawable(Drawable d) { + // This space for rent (do nothing) + } + + @Override + public void setSplitBackgroundDrawable(Drawable d) { + // This space for rent (do nothing) + } + + @Override + public void setHomeButtonEnabled(boolean enabled) { + // If the nav button on a Toolbar is present, it's enabled. No-op. + } + + @Override + public void setElevation(float elevation) { + ViewCompat.setElevation(mDecorToolbar.getViewGroup(), elevation); + } + + @Override + public float getElevation() { + return ViewCompat.getElevation(mDecorToolbar.getViewGroup()); + } + + @Override + public Context getThemedContext() { + return mDecorToolbar.getContext(); + } + + @Override + public boolean isTitleTruncated() { + return super.isTitleTruncated(); + } + + @Override + public void setHomeAsUpIndicator(Drawable indicator) { + mDecorToolbar.setNavigationIcon(indicator); + } + + @Override + public void setHomeAsUpIndicator(int resId) { + mDecorToolbar.setNavigationIcon(resId); + } + + @Override + public void setHomeActionContentDescription(CharSequence description) { + mDecorToolbar.setNavigationContentDescription(description); + } + + @Override + public void setDefaultDisplayHomeAsUpEnabled(boolean enabled) { + // Do nothing + } + + @Override + public void setHomeActionContentDescription(int resId) { + mDecorToolbar.setNavigationContentDescription(resId); + } + + @Override + public void setShowHideAnimationEnabled(boolean enabled) { + // This space for rent; no-op. + } + + @Override + public void onConfigurationChanged(Configuration config) { + super.onConfigurationChanged(config); + } + + @Override + public void setListNavigationCallbacks(SpinnerAdapter adapter, OnNavigationListener callback) { + mDecorToolbar.setDropdownParams(adapter, new NavItemSelectedListener(callback)); + } + + @Override + public void setSelectedNavigationItem(int position) { + switch (mDecorToolbar.getNavigationMode()) { + case NAVIGATION_MODE_LIST: + mDecorToolbar.setDropdownSelectedPosition(position); + break; + default: + throw new IllegalStateException( + "setSelectedNavigationIndex not valid for current navigation mode"); + } + } + + @Override + public int getSelectedNavigationIndex() { + return -1; + } + + @Override + public int getNavigationItemCount() { + return 0; + } + + @Override + public void setTitle(CharSequence title) { + mDecorToolbar.setTitle(title); + } + + @Override + public void setTitle(int resId) { + mDecorToolbar.setTitle(resId != 0 ? mDecorToolbar.getContext().getText(resId) : null); + } + + @Override + public void setWindowTitle(CharSequence title) { + mDecorToolbar.setWindowTitle(title); + } + + @Override + public void setSubtitle(CharSequence subtitle) { + mDecorToolbar.setSubtitle(subtitle); + } + + @Override + public void setSubtitle(int resId) { + mDecorToolbar.setSubtitle(resId != 0 ? mDecorToolbar.getContext().getText(resId) : null); + } + + @Override + public void setDisplayOptions(@DisplayOptions int options) { + setDisplayOptions(options, 0xffffffff); + } + + @Override + public void setDisplayOptions(@DisplayOptions int options, @DisplayOptions int mask) { + final int currentOptions = mDecorToolbar.getDisplayOptions(); + mDecorToolbar.setDisplayOptions(options & mask | currentOptions & ~mask); + } + + @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 setBackgroundDrawable(@Nullable Drawable d) { + mDecorToolbar.setBackgroundDrawable(d); + } + + @Override + public View getCustomView() { + return mDecorToolbar.getCustomView(); + } + + @Override + public CharSequence getTitle() { + return mDecorToolbar.getTitle(); + } + + @Override + public CharSequence getSubtitle() { + return mDecorToolbar.getSubtitle(); + } + + @Override + public int getNavigationMode() { + return NAVIGATION_MODE_STANDARD; + } + + @Override + public void setNavigationMode(@NavigationMode int mode) { + if (mode == ActionBar.NAVIGATION_MODE_TABS) { + throw new IllegalArgumentException("Tabs not supported in this configuration"); + } + mDecorToolbar.setNavigationMode(mode); + } + + @Override + public int getDisplayOptions() { + return mDecorToolbar.getDisplayOptions(); + } + + @Override + public Tab newTab() { + throw new UnsupportedOperationException( + "Tabs are not supported in toolbar action bars"); + } + + @Override + public void addTab(Tab tab) { + throw new UnsupportedOperationException( + "Tabs are not supported in toolbar action bars"); + } + + @Override + public void addTab(Tab tab, boolean setSelected) { + throw new UnsupportedOperationException( + "Tabs are not supported in toolbar action bars"); + } + + @Override + public void addTab(Tab tab, int position) { + throw new UnsupportedOperationException( + "Tabs are not supported in toolbar action bars"); + } + + @Override + public void addTab(Tab tab, int position, boolean setSelected) { + throw new UnsupportedOperationException( + "Tabs are not supported in toolbar action bars"); + } + + @Override + public void removeTab(Tab tab) { + throw new UnsupportedOperationException( + "Tabs are not supported in toolbar action bars"); + } + + @Override + public void removeTabAt(int position) { + throw new UnsupportedOperationException( + "Tabs are not supported in toolbar action bars"); + } + + @Override + public void removeAllTabs() { + throw new UnsupportedOperationException( + "Tabs are not supported in toolbar action bars"); + } + + @Override + public void selectTab(Tab tab) { + throw new UnsupportedOperationException( + "Tabs are not supported in toolbar action bars"); + } + + @Override + public Tab getSelectedTab() { + throw new UnsupportedOperationException( + "Tabs are not supported in toolbar action bars"); + } + + @Override + public Tab getTabAt(int index) { + throw new UnsupportedOperationException( + "Tabs are not supported in toolbar action bars"); + } + + @Override + public int getTabCount() { + return 0; + } + + @Override + public int getHeight() { + return mDecorToolbar.getHeight(); + } + + @Override + public void show() { + // TODO: Consider a better transition for this. + // Right now use no automatic transition so that the app can supply one if desired. + mDecorToolbar.setVisibility(View.VISIBLE); + } + + @Override + public void hide() { + // TODO: Consider a better transition for this. + // Right now use no automatic transition so that the app can supply one if desired. + mDecorToolbar.setVisibility(View.GONE); + } + + @Override + public boolean isShowing() { + return mDecorToolbar.getVisibility() == View.VISIBLE; + } + + @Override + public boolean openOptionsMenu() { + return mDecorToolbar.showOverflowMenu(); + } + + @Override + public boolean invalidateOptionsMenu() { + mDecorToolbar.getViewGroup().removeCallbacks(mMenuInvalidator); + ViewCompat.postOnAnimation(mDecorToolbar.getViewGroup(), mMenuInvalidator); + return true; + } + + @Override + public boolean collapseActionView() { + if (mDecorToolbar.hasExpandedActionView()) { + mDecorToolbar.collapseActionView(); + return true; + } + return false; + } + + void populateOptionsMenu() { + final Menu menu = getMenu(); + final MenuBuilder mb = menu instanceof MenuBuilder ? (MenuBuilder) menu : null; + if (mb != null) { + mb.stopDispatchingItemsChanged(); + } + try { + menu.clear(); + if (!mWindowCallback.onCreatePanelMenu(Window.FEATURE_OPTIONS_PANEL, menu) || + !mWindowCallback.onPreparePanel(Window.FEATURE_OPTIONS_PANEL, null, menu)) { + menu.clear(); + } + } finally { + if (mb != null) { + mb.startDispatchingItemsChanged(); + } + } + } + + @Override + public boolean onMenuKeyEvent(KeyEvent event) { + if (event.getAction() == KeyEvent.ACTION_UP) { + openOptionsMenu(); + } + return true; + } + + @Override + public boolean onKeyShortcut(int keyCode, KeyEvent ev) { + Menu menu = getMenu(); + return menu != null ? menu.performShortcut(keyCode, ev, 0) : false; + } + + 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); + } + } + + private View getListMenuView(Menu menu) { + ensureListMenuPresenter(menu); + + if (menu == null || mListMenuPresenter == null) { + return null; + } + + if (mListMenuPresenter.getAdapter().getCount() > 0) { + return (View) mListMenuPresenter.getMenuView(mDecorToolbar.getViewGroup()); + } + return null; + } + + private void ensureListMenuPresenter(Menu menu) { + if (mListMenuPresenter == null && (menu instanceof MenuBuilder)) { + MenuBuilder mb = (MenuBuilder) menu; + + Context context = mDecorToolbar.getContext(); + final TypedValue outValue = new TypedValue(); + final Resources.Theme widgetTheme = context.getResources().newTheme(); + widgetTheme.setTo(context.getTheme()); + + // Apply the panelMenuListTheme + widgetTheme.resolveAttribute(R.attr.panelMenuListTheme, outValue, true); + if (outValue.resourceId != 0) { + widgetTheme.applyStyle(outValue.resourceId, true); + } else { + widgetTheme.applyStyle(R.style.Theme_AppCompat_CompactMenu, true); + } + + context = new ContextThemeWrapper(context, 0); + context.getTheme().setTo(widgetTheme); + + // Finally create the list menu presenter + mListMenuPresenter = new ListMenuPresenter(context, R.layout.abc_list_menu_item_layout); + mListMenuPresenter.setCallback(new PanelMenuPresenterCallback()); + mb.addMenuPresenter(mListMenuPresenter); + } + } + + private class ToolbarCallbackWrapper extends WindowCallbackWrapper { + public ToolbarCallbackWrapper(Window.Callback wrapped) { + super(wrapped); + } + + @Override + public boolean onPreparePanel(int featureId, View view, Menu menu) { + final boolean result = super.onPreparePanel(featureId, view, menu); + if (result && !mToolbarMenuPrepared) { + mDecorToolbar.setMenuPrepared(); + mToolbarMenuPrepared = true; + } + return result; + } + + @Override + public View onCreatePanelView(int featureId) { + switch (featureId) { + case Window.FEATURE_OPTIONS_PANEL: + final Menu menu = mDecorToolbar.getMenu(); + if (onPreparePanel(featureId, null, menu) && onMenuOpened(featureId, menu)) { + return getListMenuView(menu); + } + break; + } + return super.onCreatePanelView(featureId); + } + } + + private Menu getMenu() { + if (!mMenuCallbackSet) { + mDecorToolbar.setMenuCallbacks(new ActionMenuPresenterCallback(), + new MenuBuilderCallback()); + mMenuCallbackSet = true; + } + return mDecorToolbar.getMenu(); + } + + private final class ActionMenuPresenterCallback implements MenuPresenter.Callback { + private boolean mClosingActionMenu; + + @Override + public boolean onOpenSubMenu(MenuBuilder subMenu) { + if (mWindowCallback != null) { + mWindowCallback.onMenuOpened(WindowCompat.FEATURE_ACTION_BAR, subMenu); + return true; + } + return false; + } + + @Override + public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { + if (mClosingActionMenu) { + return; + } + + mClosingActionMenu = true; + mDecorToolbar.dismissPopupMenus(); + if (mWindowCallback != null) { + mWindowCallback.onPanelClosed(WindowCompat.FEATURE_ACTION_BAR, menu); + } + mClosingActionMenu = false; + } + } + + private final class PanelMenuPresenterCallback implements MenuPresenter.Callback { + @Override + public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { + if (mWindowCallback != null) { + mWindowCallback.onPanelClosed(Window.FEATURE_OPTIONS_PANEL, menu); + } + } + + @Override + public boolean onOpenSubMenu(MenuBuilder subMenu) { + if (subMenu == null && mWindowCallback != null) { + mWindowCallback.onMenuOpened(Window.FEATURE_OPTIONS_PANEL, subMenu); + } + return true; + } + } + + private final class MenuBuilderCallback implements MenuBuilder.Callback { + + @Override + public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) { + return false; + } + + @Override + public void onMenuModeChange(MenuBuilder menu) { + if (mWindowCallback != null) { + if (mDecorToolbar.isOverflowMenuShowing()) { + mWindowCallback.onPanelClosed(WindowCompat.FEATURE_ACTION_BAR, menu); + } else if (mWindowCallback.onPreparePanel(Window.FEATURE_OPTIONS_PANEL, + null, menu)) { + mWindowCallback.onMenuOpened(WindowCompat.FEATURE_ACTION_BAR, menu); + } + } + } + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/app/WindowDecorActionBar.java b/eclipse-compile/appcompat/src/android/support/v7/internal/app/WindowDecorActionBar.java new file mode 100644 index 0000000000..ef196a40ef --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/app/WindowDecorActionBar.java @@ -0,0 +1,1369 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.app; + +import android.app.Activity; +import android.app.Dialog; +import android.content.Context; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.support.v4.app.FragmentActivity; +import android.support.v4.app.FragmentTransaction; +import android.support.v4.view.ViewCompat; +import android.support.v4.view.ViewPropertyAnimatorCompat; +import android.support.v4.view.ViewPropertyAnimatorListener; +import android.support.v4.view.ViewPropertyAnimatorListenerAdapter; +import android.support.v4.view.ViewPropertyAnimatorUpdateListener; +import android.support.v7.app.ActionBar; +import android.support.v7.appcompat.R; +import android.support.v7.internal.view.ActionBarPolicy; +import android.support.v7.internal.view.ViewPropertyAnimatorCompatSet; +import android.support.v7.internal.view.SupportMenuInflater; +import android.support.v7.internal.view.menu.MenuBuilder; +import android.support.v7.internal.view.menu.MenuPopupHelper; +import android.support.v7.internal.view.menu.SubMenuBuilder; +import android.support.v7.internal.widget.ActionBarContainer; +import android.support.v7.internal.widget.ActionBarContextView; +import android.support.v7.internal.widget.ActionBarOverlayLayout; +import android.support.v7.internal.widget.DecorToolbar; +import android.support.v7.internal.widget.TintManager; +import android.support.v7.internal.widget.ScrollingTabContainerView; +import android.support.v7.view.ActionMode; +import android.support.v7.widget.Toolbar; +import android.util.TypedValue; +import android.view.ContextThemeWrapper; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewParent; +import android.view.Window; +import android.view.accessibility.AccessibilityEvent; +import android.view.animation.AnimationUtils; +import android.widget.SpinnerAdapter; + +import java.lang.ref.WeakReference; +import java.util.ArrayList; + +/** + * WindowDecorActionBar is the ActionBar implementation used + * by devices of all screen sizes as part of the window decor layout. + * 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. + * + * @hide + */ +public class WindowDecorActionBar extends ActionBar implements + ActionBarOverlayLayout.ActionBarVisibilityCallback { + private static final String TAG = "WindowDecorActionBar"; + + /** + * Only allow show/hide animations on ICS+, as that is what ViewPropertyAnimatorCompat supports + */ + private static final boolean ALLOW_SHOW_HIDE_ANIMATIONS = Build.VERSION.SDK_INT >= 14; + + private Context mContext; + private Context mThemedContext; + private Activity mActivity; + private Dialog mDialog; + + private ActionBarOverlayLayout mOverlayLayout; + private ActionBarContainer mContainerView; + private DecorToolbar mDecorToolbar; + private ActionBarContextView mContextView; + private ActionBarContainer mSplitView; + private View mContentView; + private ScrollingTabContainerView mTabScrollView; + + private ArrayList mTabs = new ArrayList(); + + private TabImpl mSelectedTab; + private int mSavedTabPosition = INVALID_POSITION; + + private boolean mDisplayHomeAsUpSet; + + 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; + + private int mCurWindowVisibility = View.VISIBLE; + + private boolean mContentAnimations = true; + private boolean mHiddenByApp; + private boolean mHiddenBySystem; + private boolean mShowingForMode; + + private boolean mNowShowing = true; + + private ViewPropertyAnimatorCompatSet mCurrentShowAnim; + private boolean mShowHideAnimationEnabled; + boolean mHideOnContentScroll; + + private TintManager mTintManager; + + final ViewPropertyAnimatorListener mHideListener = new ViewPropertyAnimatorListenerAdapter() { + @Override + public void onAnimationEnd(View view) { + if (mContentAnimations && mContentView != null) { + ViewCompat.setTranslationY(mContentView, 0f); + ViewCompat.setTranslationY(mContainerView, 0f); + } + if (mSplitView != null && mContextDisplayMode == CONTEXT_DISPLAY_SPLIT) { + mSplitView.setVisibility(View.GONE); + } + mContainerView.setVisibility(View.GONE); + mContainerView.setTransitioning(false); + mCurrentShowAnim = null; + completeDeferredDestroyActionMode(); + if (mOverlayLayout != null) { + ViewCompat.requestApplyInsets(mOverlayLayout); + } + } + }; + + final ViewPropertyAnimatorListener mShowListener = new ViewPropertyAnimatorListenerAdapter() { + @Override + public void onAnimationEnd(View view) { + mCurrentShowAnim = null; + mContainerView.requestLayout(); + } + }; + + final ViewPropertyAnimatorUpdateListener mUpdateListener = + new ViewPropertyAnimatorUpdateListener() { + @Override + public void onAnimationUpdate(View view) { + final ViewParent parent = mContainerView.getParent(); + ((View) parent).invalidate(); + } + }; + + public WindowDecorActionBar(Activity activity, boolean overlayMode) { + mActivity = activity; + Window window = activity.getWindow(); + View decor = window.getDecorView(); + init(decor); + if (!overlayMode) { + mContentView = decor.findViewById(android.R.id.content); + } + } + + public WindowDecorActionBar(Dialog dialog) { + mDialog = dialog; + init(dialog.getWindow().getDecorView()); + } + + /** + * Only for edit mode. + * @hide + */ + public WindowDecorActionBar(View layout) { + assert layout.isInEditMode(); + init(layout); + } + + private void init(View decor) { + mOverlayLayout = (ActionBarOverlayLayout) decor.findViewById(R.id.decor_content_parent); + if (mOverlayLayout != null) { + mOverlayLayout.setActionBarVisibilityCallback(this); + } + mDecorToolbar = getDecorToolbar(decor.findViewById(R.id.action_bar)); + mContextView = (ActionBarContextView) decor.findViewById( + R.id.action_context_bar); + mContainerView = (ActionBarContainer) decor.findViewById( + R.id.action_bar_container); + + mSplitView = (ActionBarContainer) decor.findViewById(R.id.split_action_bar); + + if (mDecorToolbar == null || mContextView == null || mContainerView == null) { + throw new IllegalStateException(getClass().getSimpleName() + " can only be used " + + "with a compatible window decor layout"); + } + + mContext = mDecorToolbar.getContext(); + mContextDisplayMode = mDecorToolbar.isSplit() ? + CONTEXT_DISPLAY_SPLIT : CONTEXT_DISPLAY_NORMAL; + + // This was initially read from the action bar style + final int current = mDecorToolbar.getDisplayOptions(); + final boolean homeAsUp = (current & DISPLAY_HOME_AS_UP) != 0; + if (homeAsUp) { + mDisplayHomeAsUpSet = true; + } + + ActionBarPolicy abp = ActionBarPolicy.get(mContext); + setHomeButtonEnabled(abp.enableHomeButtonByDefault() || homeAsUp); + setHasEmbeddedTabs(abp.hasEmbeddedTabs()); + + final TypedArray a = mContext.obtainStyledAttributes(null, + R.styleable.ActionBar, + R.attr.actionBarStyle, 0); + if (a.getBoolean(R.styleable.ActionBar_hideOnContentScroll, false)) { + setHideOnContentScrollEnabled(true); + } + final int elevation = a.getDimensionPixelSize(R.styleable.ActionBar_elevation, 0); + if (elevation != 0) { + setElevation(elevation); + } + a.recycle(); + } + + private DecorToolbar getDecorToolbar(View view) { + if (view instanceof DecorToolbar) { + return (DecorToolbar) view; + } else if (view instanceof Toolbar) { + return ((Toolbar) view).getWrapper(); + } else { + throw new IllegalStateException("Can't make a decor toolbar out of " + + view.getClass().getSimpleName()); + } + } + + @Override + public void setElevation(float elevation) { + ViewCompat.setElevation(mContainerView, elevation); + if (mSplitView != null) { + ViewCompat.setElevation(mSplitView, elevation); + } + } + + @Override + public float getElevation() { + return ViewCompat.getElevation(mContainerView); + } + + public void onConfigurationChanged(Configuration newConfig) { + setHasEmbeddedTabs(ActionBarPolicy.get(mContext).hasEmbeddedTabs()); + } + + private void setHasEmbeddedTabs(boolean hasEmbeddedTabs) { + mHasEmbeddedTabs = hasEmbeddedTabs; + // Switch tab layout configuration if needed + if (!mHasEmbeddedTabs) { + mDecorToolbar.setEmbeddedTabView(null); + mContainerView.setTabContainer(mTabScrollView); + } else { + mContainerView.setTabContainer(null); + mDecorToolbar.setEmbeddedTabView(mTabScrollView); + } + final boolean isInTabMode = getNavigationMode() == NAVIGATION_MODE_TABS; + if (mTabScrollView != null) { + if (isInTabMode) { + mTabScrollView.setVisibility(View.VISIBLE); + if (mOverlayLayout != null) { + ViewCompat.requestApplyInsets(mOverlayLayout); + } + } else { + mTabScrollView.setVisibility(View.GONE); + } + } + mDecorToolbar.setCollapsible(!mHasEmbeddedTabs && isInTabMode); + mOverlayLayout.setHasNonEmbeddedTabs(!mHasEmbeddedTabs && isInTabMode); + } + + private void ensureTabsExist() { + if (mTabScrollView != null) { + return; + } + + ScrollingTabContainerView tabScroller = new ScrollingTabContainerView(mContext); + + if (mHasEmbeddedTabs) { + tabScroller.setVisibility(View.VISIBLE); + mDecorToolbar.setEmbeddedTabView(tabScroller); + } else { + if (getNavigationMode() == NAVIGATION_MODE_TABS) { + tabScroller.setVisibility(View.VISIBLE); + if (mOverlayLayout != null) { + ViewCompat.requestApplyInsets(mOverlayLayout); + } + } else { + tabScroller.setVisibility(View.GONE); + } + mContainerView.setTabContainer(tabScroller); + } + mTabScrollView = tabScroller; + } + + void completeDeferredDestroyActionMode() { + if (mDeferredModeDestroyCallback != null) { + mDeferredModeDestroyCallback.onDestroyActionMode(mDeferredDestroyActionMode); + mDeferredDestroyActionMode = null; + mDeferredModeDestroyCallback = null; + } + } + + public void onWindowVisibilityChanged(int visibility) { + mCurWindowVisibility = visibility; + } + + /** + * 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.cancel(); + } + } + + 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, + mDecorToolbar.getViewGroup(), 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) { + mDecorToolbar.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 (mDecorToolbar.getNavigationMode()) { + case NAVIGATION_MODE_TABS: + selectTab(mTabs.get(position)); + break; + case NAVIGATION_MODE_LIST: + mDecorToolbar.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) { + mDecorToolbar.setTitle(title); + } + + @Override + public void setWindowTitle(CharSequence title) { + mDecorToolbar.setWindowTitle(title); + } + + public void setSubtitle(CharSequence subtitle) { + mDecorToolbar.setSubtitle(subtitle); + } + + public void setDisplayOptions(int options) { + if ((options & DISPLAY_HOME_AS_UP) != 0) { + mDisplayHomeAsUpSet = true; + } + mDecorToolbar.setDisplayOptions(options); + } + + public void setDisplayOptions(int options, int mask) { + final int current = mDecorToolbar.getDisplayOptions(); + if ((mask & DISPLAY_HOME_AS_UP) != 0) { + mDisplayHomeAsUpSet = true; + } + mDecorToolbar.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 mDecorToolbar.getCustomView(); + } + + public CharSequence getTitle() { + return mDecorToolbar.getTitle(); + } + + public CharSequence getSubtitle() { + return mDecorToolbar.getSubtitle(); + } + + public int getNavigationMode() { + return mDecorToolbar.getNavigationMode(); + } + + public int getDisplayOptions() { + return mDecorToolbar.getDisplayOptions(); + } + + public ActionMode startActionMode(ActionMode.Callback callback) { + if (mActionMode != null) { + mActionMode.finish(); + } + + mOverlayLayout.setHideOnContentScrollEnabled(false); + mContextView.killMode(); + ActionModeImpl mode = new ActionModeImpl(mContextView.getContext(), callback); + if (mode.dispatchOnCreate()) { + mode.invalidate(); + mContextView.initForMode(mode); + animateToMode(true); + if (mSplitView != null && mContextDisplayMode == CONTEXT_DISPLAY_SPLIT) { + // TODO animate this + if (mSplitView.getVisibility() != View.VISIBLE) { + mSplitView.setVisibility(View.VISIBLE); + if (mOverlayLayout != null) { + ViewCompat.requestApplyInsets(mOverlayLayout); + } + } + } + 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; + } + + final FragmentTransaction trans; + if (mActivity instanceof FragmentActivity && !mDecorToolbar.getViewGroup().isInEditMode()) { + // If we're not in edit mode and our Activity is a FragmentActivity, start a tx + trans = ((FragmentActivity) mActivity).getSupportFragmentManager() + .beginTransaction().disallowAddToBackStack(); + } else { + trans = null; + } + + 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(); + } + + public void enableContentAnimations(boolean enabled) { + mContentAnimations = enabled; + } + + @Override + public void show() { + if (mHiddenByApp) { + mHiddenByApp = false; + updateVisibility(false); + } + } + + private void showForActionMode() { + if (!mShowingForMode) { + mShowingForMode = true; + if (mOverlayLayout != null) { + mOverlayLayout.setShowingForActionMode(true); + } + updateVisibility(false); + } + } + + public void showForSystem() { + if (mHiddenBySystem) { + mHiddenBySystem = false; + updateVisibility(true); + } + } + + @Override + public void hide() { + if (!mHiddenByApp) { + mHiddenByApp = true; + updateVisibility(false); + } + } + + private void hideForActionMode() { + if (mShowingForMode) { + mShowingForMode = false; + if (mOverlayLayout != null) { + mOverlayLayout.setShowingForActionMode(false); + } + updateVisibility(false); + } + } + + public void hideForSystem() { + if (!mHiddenBySystem) { + mHiddenBySystem = true; + updateVisibility(true); + } + } + + @Override + public void setHideOnContentScrollEnabled(boolean hideOnContentScroll) { + if (hideOnContentScroll && !mOverlayLayout.isInOverlayMode()) { + throw new IllegalStateException("Action bar must be in overlay mode " + + "(Window.FEATURE_OVERLAY_ACTION_BAR) to enable hide on content scroll"); + } + mHideOnContentScroll = hideOnContentScroll; + mOverlayLayout.setHideOnContentScrollEnabled(hideOnContentScroll); + } + + @Override + public boolean isHideOnContentScrollEnabled() { + return mOverlayLayout.isHideOnContentScrollEnabled(); + } + + @Override + public int getHideOffset() { + return mOverlayLayout.getActionBarHideOffset(); + } + + @Override + public void setHideOffset(int offset) { + if (offset != 0 && !mOverlayLayout.isInOverlayMode()) { + throw new IllegalStateException("Action bar must be in overlay mode " + + "(Window.FEATURE_OVERLAY_ACTION_BAR) to set a non-zero hide offset"); + } + mOverlayLayout.setActionBarHideOffset(offset); + } + + private static boolean checkShowingFlags(boolean hiddenByApp, boolean hiddenBySystem, + boolean showingForMode) { + if (showingForMode) { + return true; + } else if (hiddenByApp || hiddenBySystem) { + return false; + } else { + return true; + } + } + + private void updateVisibility(boolean fromSystem) { + // Based on the current state, should we be hidden or shown? + final boolean shown = checkShowingFlags(mHiddenByApp, mHiddenBySystem, + mShowingForMode); + + if (shown) { + if (!mNowShowing) { + mNowShowing = true; + doShow(fromSystem); + } + } else { + if (mNowShowing) { + mNowShowing = false; + doHide(fromSystem); + } + } + } + + public void doShow(boolean fromSystem) { + if (mCurrentShowAnim != null) { + mCurrentShowAnim.cancel(); + } + mContainerView.setVisibility(View.VISIBLE); + + if (mCurWindowVisibility == View.VISIBLE && ALLOW_SHOW_HIDE_ANIMATIONS && + (mShowHideAnimationEnabled || fromSystem)) { + // because we're about to ask its window loc + ViewCompat.setTranslationY(mContainerView, 0f); + float startingY = -mContainerView.getHeight(); + if (fromSystem) { + int topLeft[] = {0, 0}; + mContainerView.getLocationInWindow(topLeft); + startingY -= topLeft[1]; + } + ViewCompat.setTranslationY(mContainerView, startingY); + ViewPropertyAnimatorCompatSet anim = new ViewPropertyAnimatorCompatSet(); + ViewPropertyAnimatorCompat a = ViewCompat.animate(mContainerView).translationY(0f); + a.setUpdateListener(mUpdateListener); + anim.play(a); + if (mContentAnimations && mContentView != null) { + ViewCompat.setTranslationY(mContentView, startingY); + anim.play(ViewCompat.animate(mContentView).translationY(0f)); + } + if (mSplitView != null && mContextDisplayMode == CONTEXT_DISPLAY_SPLIT) { + ViewCompat.setTranslationY(mSplitView, mSplitView.getHeight()); + mSplitView.setVisibility(View.VISIBLE); + anim.play(ViewCompat.animate(mSplitView).translationY(0f)); + } + anim.setInterpolator(AnimationUtils.loadInterpolator(mContext, + android.R.anim.decelerate_interpolator)); + anim.setDuration(250); + // If this is being shown from the system, add a small delay. + // This is because we will also be animating in the status bar, + // and these two elements can't be done in lock-step. So we give + // a little time for the status bar to start its animation before + // the action bar animates. (This corresponds to the corresponding + // case when hiding, where the status bar has a small delay before + // starting.) + anim.setListener(mShowListener); + mCurrentShowAnim = anim; + anim.start(); + } else { + ViewCompat.setAlpha(mContainerView, 1f); + ViewCompat.setTranslationY(mContainerView, 0); + if (mContentAnimations && mContentView != null) { + ViewCompat.setTranslationY(mContentView, 0); + } + if (mSplitView != null && mContextDisplayMode == CONTEXT_DISPLAY_SPLIT) { + ViewCompat.setAlpha(mSplitView, 1f); + ViewCompat.setTranslationY(mSplitView, 0); + mSplitView.setVisibility(View.VISIBLE); + } + mShowListener.onAnimationEnd(null); + } + if (mOverlayLayout != null) { + ViewCompat.requestApplyInsets(mOverlayLayout); + } + } + + public void doHide(boolean fromSystem) { + if (mCurrentShowAnim != null) { + mCurrentShowAnim.cancel(); + } + + if (mCurWindowVisibility == View.VISIBLE && ALLOW_SHOW_HIDE_ANIMATIONS && + (mShowHideAnimationEnabled || fromSystem)) { + ViewCompat.setAlpha(mContainerView, 1f); + mContainerView.setTransitioning(true); + ViewPropertyAnimatorCompatSet anim = new ViewPropertyAnimatorCompatSet(); + float endingY = -mContainerView.getHeight(); + if (fromSystem) { + int topLeft[] = {0, 0}; + mContainerView.getLocationInWindow(topLeft); + endingY -= topLeft[1]; + } + ViewPropertyAnimatorCompat a = ViewCompat.animate(mContainerView).translationY(endingY); + a.setUpdateListener(mUpdateListener); + anim.play(a); + if (mContentAnimations && mContentView != null) { + anim.play(ViewCompat.animate(mContentView).translationY(endingY)); + } + if (mSplitView != null && mSplitView.getVisibility() == View.VISIBLE) { + ViewCompat.setAlpha(mSplitView, 1f); + anim.play(ViewCompat.animate(mSplitView).translationY(mSplitView.getHeight())); + } + anim.setInterpolator(AnimationUtils.loadInterpolator(mContext, + android.R.anim.accelerate_interpolator)); + anim.setDuration(250); + anim.setListener(mHideListener); + mCurrentShowAnim = anim; + anim.start(); + } else { + mHideListener.onAnimationEnd(null); + } + } + + public boolean isShowing() { + final int height = getHeight(); + // Take into account the case where the bar has a 0 height due to not being measured yet. + return mNowShowing && (height == 0 || getHideOffset() < height); + } + + public void animateToMode(boolean toActionMode) { + if (toActionMode) { + showForActionMode(); + } else { + hideForActionMode(); + } + + mDecorToolbar.animateToVisibility(toActionMode ? View.GONE : View.VISIBLE); + mContextView.animateToVisibility(toActionMode ? View.VISIBLE : View.GONE); + // mTabScrollView's visibility is not affected by action mode. + } + + 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) { + mThemedContext = new ContextThemeWrapper(mContext, targetThemeRes); + } else { + mThemedContext = mContext; + } + } + return mThemedContext; + } + + @Override + public boolean isTitleTruncated() { + return mDecorToolbar != null && mDecorToolbar.isTitleTruncated(); + } + + @Override + public void setHomeAsUpIndicator(Drawable indicator) { + mDecorToolbar.setNavigationIcon(indicator); + } + + @Override + public void setHomeAsUpIndicator(int resId) { + mDecorToolbar.setNavigationIcon(resId); + } + + @Override + public void setHomeActionContentDescription(CharSequence description) { + mDecorToolbar.setNavigationContentDescription(description); + } + + @Override + public void setHomeActionContentDescription(int resId) { + mDecorToolbar.setNavigationContentDescription(resId); + } + + @Override + public void onContentScrollStarted() { + if (mCurrentShowAnim != null) { + mCurrentShowAnim.cancel(); + mCurrentShowAnim = null; + } + } + + @Override + public void onContentScrollStopped() { + } + + @Override + public boolean collapseActionView() { + if (mDecorToolbar != null && mDecorToolbar.hasExpandedActionView()) { + mDecorToolbar.collapseActionView(); + return true; + } + return false; + } + + /** + * @hide + */ + public class ActionModeImpl extends ActionMode implements MenuBuilder.Callback { + private final Context mActionModeContext; + private final MenuBuilder mMenu; + + private ActionMode.Callback mCallback; + private WeakReference mCustomView; + + public ActionModeImpl(Context context, ActionMode.Callback callback) { + mActionModeContext = context; + mCallback = callback; + mMenu = new MenuBuilder(context) + .setDefaultShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); + mMenu.setCallback(this); + } + + @Override + public MenuInflater getMenuInflater() { + return new SupportMenuInflater(mActionModeContext); + } + + @Override + public Menu getMenu() { + return mMenu; + } + + @Override + public void finish() { + if (mActionMode != this) { + // Not the active action mode - no-op + return; + } + + // If this change in state is going to cause the action bar + // to be hidden, 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 (!checkShowingFlags(mHiddenByApp, mHiddenBySystem, false)) { + // With the current state but the action bar hidden, our + // overall showing state is going to be false. + mDeferredDestroyActionMode = this; + mDeferredModeDestroyCallback = mCallback; + } else { + mCallback.onDestroyActionMode(this); + } + mCallback = null; + animateToMode(false); + + // Clear out the context mode views after the animation finishes + mContextView.closeMode(); + mDecorToolbar.getViewGroup().sendAccessibilityEvent( + AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); + mOverlayLayout.setHideOnContentScrollEnabled(mHideOnContentScroll); + + mActionMode = null; + } + + @Override + public void invalidate() { + if (mActionMode != this) { + // Not the active action mode - no-op. It's possible we are + // currently deferring onDestroy, so the app doesn't yet know we + // are going away and is trying to use us. That's also a no-op. + return; + } + + 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 void setTitleOptionalHint(boolean titleOptional) { + super.setTitleOptionalHint(titleOptional); + mContextView.setTitleOptional(titleOptional); + } + + @Override + public boolean isTitleOptional() { + return mContextView.isTitleOptional(); + } + + @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(getTintManager().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) { + mDecorToolbar.setCustomView(view); + } + + @Override + public void setCustomView(View view, LayoutParams layoutParams) { + view.setLayoutParams(layoutParams); + mDecorToolbar.setCustomView(view); + } + + @Override + public void setListNavigationCallbacks(SpinnerAdapter adapter, OnNavigationListener callback) { + mDecorToolbar.setDropdownParams(adapter, new NavItemSelectedListener(callback)); + } + + @Override + public int getSelectedNavigationIndex() { + switch (mDecorToolbar.getNavigationMode()) { + case NAVIGATION_MODE_TABS: + return mSelectedTab != null ? mSelectedTab.getPosition() : -1; + case NAVIGATION_MODE_LIST: + return mDecorToolbar.getDropdownSelectedPosition(); + default: + return -1; + } + } + + @Override + public int getNavigationItemCount() { + switch (mDecorToolbar.getNavigationMode()) { + case NAVIGATION_MODE_TABS: + return mTabs.size(); + case NAVIGATION_MODE_LIST: + return mDecorToolbar.getDropdownItemCount(); + default: + return 0; + } + } + + @Override + public int getTabCount() { + return mTabs.size(); + } + + @Override + public void setNavigationMode(int mode) { + final int oldMode = mDecorToolbar.getNavigationMode(); + switch (oldMode) { + case NAVIGATION_MODE_TABS: + mSavedTabPosition = getSelectedNavigationIndex(); + selectTab(null); + mTabScrollView.setVisibility(View.GONE); + break; + } + if (oldMode != mode && !mHasEmbeddedTabs) { + if (mOverlayLayout != null) { + ViewCompat.requestApplyInsets(mOverlayLayout); + } + } + mDecorToolbar.setNavigationMode(mode); + switch (mode) { + case NAVIGATION_MODE_TABS: + ensureTabsExist(); + mTabScrollView.setVisibility(View.VISIBLE); + if (mSavedTabPosition != INVALID_POSITION) { + setSelectedNavigationItem(mSavedTabPosition); + mSavedTabPosition = INVALID_POSITION; + } + break; + } + mDecorToolbar.setCollapsible(mode == NAVIGATION_MODE_TABS && !mHasEmbeddedTabs); + mOverlayLayout.setHasNonEmbeddedTabs(mode == NAVIGATION_MODE_TABS && !mHasEmbeddedTabs); + } + + @Override + public Tab getTabAt(int index) { + return mTabs.get(index); + } + + + @Override + public void setIcon(int resId) { + mDecorToolbar.setIcon(resId); + } + + @Override + public void setIcon(Drawable icon) { + mDecorToolbar.setIcon(icon); + } + + public boolean hasIcon() { + return mDecorToolbar.hasIcon(); + } + + @Override + public void setLogo(int resId) { + mDecorToolbar.setLogo(resId); + } + + @Override + public void setLogo(Drawable logo) { + mDecorToolbar.setLogo(logo); + } + + public boolean hasLogo() { + return mDecorToolbar.hasLogo(); + } + + public void setDefaultDisplayHomeAsUpEnabled(boolean enable) { + if (!mDisplayHomeAsUpSet) { + setDisplayHomeAsUpEnabled(enable); + } + } + + TintManager getTintManager() { + if (mTintManager == null) { + mTintManager = new TintManager(mContext); + } + return mTintManager; + } + +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/text/AllCapsTransformationMethod.java b/eclipse-compile/appcompat/src/android/support/v7/internal/text/AllCapsTransformationMethod.java new file mode 100644 index 0000000000..76d1aed398 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/text/AllCapsTransformationMethod.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.text; + +import android.content.Context; +import android.graphics.Rect; +import android.text.method.TransformationMethod; +import android.view.View; + +import java.util.Locale; + +/** + * @hide + */ +public class AllCapsTransformationMethod implements TransformationMethod { + private Locale mLocale; + + public AllCapsTransformationMethod(Context context) { + mLocale = context.getResources().getConfiguration().locale; + } + + @Override + public CharSequence getTransformation(CharSequence source, View view) { + return source != null ? source.toString().toUpperCase(mLocale) : null; + } + + @Override + public void onFocusChanged(View view, CharSequence sourceText, boolean focused, + int direction, Rect previouslyFocusedRect) { + } +} \ No newline at end of file diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/transition/ActionBarTransition.java b/eclipse-compile/appcompat/src/android/support/v7/internal/transition/ActionBarTransition.java new file mode 100644 index 0000000000..bc4ad0451e --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/transition/ActionBarTransition.java @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package android.support.v7.internal.transition; + +import android.view.ViewGroup; + +/** + * @hide + */ +public class ActionBarTransition { + + private static final boolean TRANSITIONS_ENABLED = false; + + private static final int TRANSITION_DURATION = 120; // ms + +// private static final Transition sTransition; +// +// static { +// if (TRANSITIONS_ENABLED) { +//// final ChangeText tc = new ChangeText(); +//// tc.setChangeBehavior(ChangeText.CHANGE_BEHAVIOR_OUT_IN); +// final TransitionSet inner = new TransitionSet(); +// inner.addTransition(new ChangeBounds()); +// final TransitionSet tg = new TransitionSet(); +// tg.addTransition(new Fade(Fade.OUT)).addTransition(inner). +// addTransition(new Fade(Fade.IN)); +// tg.setOrdering(TransitionSet.ORDERING_SEQUENTIAL); +// tg.setDuration(TRANSITION_DURATION); +// sTransition = tg; +// } else { +// sTransition = null; +// } +// } + + public static void beginDelayedTransition(ViewGroup sceneRoot) { +// if (TRANSITIONS_ENABLED) { +// TransitionManager.beginDelayedTransition(sceneRoot, sTransition); +// } + } +} \ No newline at end of file diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/view/ActionBarPolicy.java b/eclipse-compile/appcompat/src/android/support/v7/internal/view/ActionBarPolicy.java new file mode 100644 index 0000000000..dc5c4f0b7f --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/view/ActionBarPolicy.java @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.view; + +import android.content.Context; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.os.Build; +import android.support.v4.view.ViewConfigurationCompat; +import android.support.v7.appcompat.R; +import android.view.ViewConfiguration; + +/** + * Allows components to query for various configuration policy decisions about how the action bar + * should lay out and behave on the current device. + * + * @hide + */ +public class ActionBarPolicy { + + private Context mContext; + + public static ActionBarPolicy get(Context context) { + return new ActionBarPolicy(context); + } + + private ActionBarPolicy(Context context) { + mContext = context; + } + + public int getMaxActionButtons() { + return mContext.getResources().getInteger(R.integer.abc_max_action_buttons); + } + + public boolean showsOverflowMenuButton() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + return true; + } else { + return !ViewConfigurationCompat.hasPermanentMenuKey(ViewConfiguration.get(mContext)); + } + } + + public int getEmbeddedMenuWidthLimit() { + return mContext.getResources().getDisplayMetrics().widthPixels / 2; + } + + public boolean hasEmbeddedTabs() { + final int targetSdk = mContext.getApplicationInfo().targetSdkVersion; + if (targetSdk >= Build.VERSION_CODES.JELLY_BEAN) { + return mContext.getResources().getBoolean(R.bool.abc_action_bar_embed_tabs); + } + + // The embedded tabs policy changed in Jellybean; give older apps the old policy + // so they get what they expect. + return mContext.getResources().getBoolean(R.bool.abc_action_bar_embed_tabs_pre_jb); + } + + public int getTabContainerHeight() { + TypedArray a = mContext.obtainStyledAttributes(null, R.styleable.ActionBar, + R.attr.actionBarStyle, 0); + int height = a.getLayoutDimension(R.styleable.ActionBar_height, 0); + Resources r = mContext.getResources(); + if (!hasEmbeddedTabs()) { + // Stacked tabs; limit the height + height = Math.min(height, + r.getDimensionPixelSize(R.dimen.abc_action_bar_stacked_max_height)); + } + a.recycle(); + return height; + } + + public boolean enableHomeButtonByDefault() { + // Older apps get the home button interaction enabled by default. + // Newer apps need to enable it explicitly. + return mContext.getApplicationInfo().targetSdkVersion < + Build.VERSION_CODES.ICE_CREAM_SANDWICH; + } + + public int getStackedTabMaxWidth() { + return mContext.getResources().getDimensionPixelSize( + R.dimen.abc_action_bar_stacked_tab_max_width); + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/view/ContextThemeWrapper.java b/eclipse-compile/appcompat/src/android/support/v7/internal/view/ContextThemeWrapper.java new file mode 100644 index 0000000000..e4142035a3 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/view/ContextThemeWrapper.java @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.view; + +import android.content.Context; +import android.content.ContextWrapper; +import android.content.res.Resources; +import android.support.v7.appcompat.R; +import android.view.LayoutInflater; + +/** + * A ContextWrapper that allows you to modify the theme from what is in the + * wrapped context. + * + * @hide + */ +public class ContextThemeWrapper extends ContextWrapper { + private int mThemeResource; + private Resources.Theme mTheme; + private LayoutInflater mInflater; + + public ContextThemeWrapper(Context base, int themeres) { + super(base); + mThemeResource = themeres; + } + + @Override + public void setTheme(int resid) { + mThemeResource = resid; + initializeTheme(); + } + + public int getThemeResId() { + return mThemeResource; + } + + @Override + public Resources.Theme getTheme() { + if (mTheme != null) { + return mTheme; + } + + if (mThemeResource == 0) { + mThemeResource = R.style.Theme_AppCompat_Light; + } + initializeTheme(); + + return mTheme; + } + + @Override + public Object getSystemService(String name) { + if (LAYOUT_INFLATER_SERVICE.equals(name)) { + if (mInflater == null) { + mInflater = LayoutInflater.from(getBaseContext()).cloneInContext(this); + } + return mInflater; + } + return getBaseContext().getSystemService(name); + } + + /** + * Called by {@link #setTheme} and {@link #getTheme} to apply a theme + * resource to the current Theme object. Can override to change the + * default (simple) behavior. This method will not be called in multiple + * threads simultaneously. + * + * @param theme The Theme object being modified. + * @param resid The theme style resource being applied to theme. + * @param first Set to true if this is the first time a style is being + * applied to theme. + */ + protected void onApplyThemeResource(Resources.Theme theme, int resid, boolean first) { + theme.applyStyle(resid, true); + } + + private void initializeTheme() { + final boolean first = mTheme == null; + if (first) { + mTheme = getResources().newTheme(); + Resources.Theme theme = getBaseContext().getTheme(); + if (theme != null) { + mTheme.setTo(theme); + } + } + onApplyThemeResource(mTheme, mThemeResource, first); + } +} + diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/view/StandaloneActionMode.java b/eclipse-compile/appcompat/src/android/support/v7/internal/view/StandaloneActionMode.java new file mode 100644 index 0000000000..7e31988c4c --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/view/StandaloneActionMode.java @@ -0,0 +1,163 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package android.support.v7.internal.view; + +import android.annotation.TargetApi; +import android.content.Context; +import android.os.Build; +import android.support.v7.internal.view.menu.MenuBuilder; +import android.support.v7.internal.view.menu.MenuPopupHelper; +import android.support.v7.internal.view.menu.SubMenuBuilder; +import android.support.v7.internal.widget.ActionBarContextView; +import android.support.v7.view.ActionMode; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.accessibility.AccessibilityEvent; + +import java.lang.ref.WeakReference; + +/** + * @hide + */ +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 setTitleOptionalHint(boolean titleOptional) { + super.setTitleOptionalHint(titleOptional); + mContextView.setTitleOptional(titleOptional); + } + + @Override + public boolean isTitleOptional() { + return mContextView.isTitleOptional(); + } + + @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; + } +} \ No newline at end of file diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/view/SupportActionModeWrapper.java b/eclipse-compile/appcompat/src/android/support/v7/internal/view/SupportActionModeWrapper.java new file mode 100644 index 0000000000..029ad977b3 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/view/SupportActionModeWrapper.java @@ -0,0 +1,199 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.view; + +import android.annotation.TargetApi; +import android.content.Context; +import android.os.Build; +import android.support.v4.internal.view.SupportMenu; +import android.support.v4.internal.view.SupportMenuItem; +import android.support.v4.util.SimpleArrayMap; +import android.support.v7.internal.view.menu.MenuWrapperFactory; +import android.view.ActionMode; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.View; + +/** + * Wraps a support {@link android.support.v7.view.ActionMode} as a framework + * {@link android.view.ActionMode}. + * + * @hide + */ +@TargetApi(Build.VERSION_CODES.HONEYCOMB) +public class SupportActionModeWrapper extends ActionMode { + + final Context mContext; + final android.support.v7.view.ActionMode mWrappedObject; + + public SupportActionModeWrapper(Context context, + android.support.v7.view.ActionMode supportActionMode) { + mContext = context; + mWrappedObject = supportActionMode; + } + + @Override + public Object getTag() { + return mWrappedObject.getTag(); + } + + @Override + public void setTag(Object tag) { + mWrappedObject.setTag(tag); + } + + @Override + public void setTitle(CharSequence title) { + mWrappedObject.setTitle(title); + } + + @Override + public void setSubtitle(CharSequence subtitle) { + mWrappedObject.setSubtitle(subtitle); + } + + @Override + public void invalidate() { + mWrappedObject.invalidate(); + } + + @Override + public void finish() { + mWrappedObject.finish(); + } + + @Override + public Menu getMenu() { + return MenuWrapperFactory.wrapSupportMenu(mContext, (SupportMenu) mWrappedObject.getMenu()); + } + + @Override + public CharSequence getTitle() { + return mWrappedObject.getTitle(); + } + + @Override + public void setTitle(int resId) { + mWrappedObject.setTitle(resId); + } + + @Override + public CharSequence getSubtitle() { + return mWrappedObject.getSubtitle(); + } + + @Override + public void setSubtitle(int resId) { + mWrappedObject.setSubtitle(resId); + } + + @Override + public View getCustomView() { + return mWrappedObject.getCustomView(); + } + + @Override + public void setCustomView(View view) { + mWrappedObject.setCustomView(view); + } + + @Override + public MenuInflater getMenuInflater() { + return mWrappedObject.getMenuInflater(); + } + + @Override + public boolean getTitleOptionalHint() { + return mWrappedObject.getTitleOptionalHint(); + } + + @Override + public void setTitleOptionalHint(boolean titleOptional) { + mWrappedObject.setTitleOptionalHint(titleOptional); + } + + @Override + public boolean isTitleOptional() { + return mWrappedObject.isTitleOptional(); + } + + /** + * @hide + */ + public static class CallbackWrapper implements android.support.v7.view.ActionMode.Callback { + final Callback mWrappedCallback; + final Context mContext; + + final SimpleArrayMap + mActionModes; + final SimpleArrayMap mMenus; + + public CallbackWrapper(Context context, Callback supportCallback) { + mContext = context; + mWrappedCallback = supportCallback; + mActionModes = new SimpleArrayMap<>(); + mMenus = new SimpleArrayMap<>(); + } + + @Override + public boolean onCreateActionMode(android.support.v7.view.ActionMode mode, Menu menu) { + return mWrappedCallback.onCreateActionMode(getActionModeWrapper(mode), + getMenuWrapper(menu)); + } + + @Override + public boolean onPrepareActionMode(android.support.v7.view.ActionMode mode, Menu menu) { + return mWrappedCallback.onPrepareActionMode(getActionModeWrapper(mode), + getMenuWrapper(menu)); + } + + @Override + public boolean onActionItemClicked(android.support.v7.view.ActionMode mode, + android.view.MenuItem item) { + return mWrappedCallback.onActionItemClicked(getActionModeWrapper(mode), + MenuWrapperFactory.wrapSupportMenuItem(mContext, (SupportMenuItem) item)); + } + + @Override + public void onDestroyActionMode(android.support.v7.view.ActionMode mode) { + mWrappedCallback.onDestroyActionMode(getActionModeWrapper(mode)); + } + + private Menu getMenuWrapper(Menu menu) { + Menu wrapper = mMenus.get(menu); + if (wrapper == null) { + wrapper = MenuWrapperFactory.wrapSupportMenu(mContext, (SupportMenu) menu); + mMenus.put(menu, wrapper); + } + return wrapper; + } + + private ActionMode getActionModeWrapper(android.support.v7.view.ActionMode mode) { + // First see if we already have a wrapper for this mode + SupportActionModeWrapper wrapper = mActionModes.get(mode); + if (wrapper != null) { + return wrapper; + } + + // If we reach here then we haven't seen this mode before. Create a new wrapper and + // add it to our collection + wrapper = new SupportActionModeWrapper(mContext, mode); + mActionModes.put(mode, wrapper); + return wrapper; + } + } +} \ No newline at end of file diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/view/SupportMenuInflater.java b/eclipse-compile/appcompat/src/android/support/v7/internal/view/SupportMenuInflater.java new file mode 100644 index 0000000000..84a07dac22 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/view/SupportMenuInflater.java @@ -0,0 +1,506 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.view; + +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +import android.app.Activity; +import android.content.Context; +import android.content.ContextWrapper; +import android.content.res.TypedArray; +import android.content.res.XmlResourceParser; +import android.support.v4.internal.view.SupportMenu; +import android.support.v4.view.ActionProvider; +import android.support.v4.view.MenuItemCompat; +import android.support.v7.appcompat.R; +import android.support.v7.internal.view.menu.MenuItemImpl; +import android.support.v7.internal.view.menu.MenuItemWrapperICS; +import android.util.AttributeSet; +import android.util.Log; +import android.util.Xml; +import android.view.InflateException; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.SubMenu; +import android.view.View; + +import java.io.IOException; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; + +/** + * 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 SupportMenuInflater with an XmlPullParser over a plain XML file at runtime; + * it only works with an XmlPullParser returned from a compiled resource (R. + * something file.) + * + * @hide + */ +public class SupportMenuInflater extends MenuInflater { + private static final String LOG_TAG = "SupportMenuInflater"; + + /** 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 SupportMenuInflater(Context context) { + super(context); + mContext = context; + 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. + */ + @Override + public void inflate(int menuRes, Menu menu) { + // If we're not dealing with a SupportMenu instance, let super handle + if (!(menu instanceof SupportMenu)) { + super.inflate(menuRes, menu); + return; + } + + 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 Object getRealOwner() { + if (mRealOwner == null) { + mRealOwner = findRealOwner(mContext); + } + return mRealOwner; + } + + private Object findRealOwner(Object owner) { + if (owner instanceof Activity) { + return owner; + } + if (owner instanceof ContextWrapper) { + return findRealOwner(((ContextWrapper) owner).getBaseContext()); + } + return owner; + } + + 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.MenuGroup); + + groupId = a.getResourceId(R.styleable.MenuGroup_android_id, defaultGroupId); + groupCategory = a.getInt( + R.styleable.MenuGroup_android_menuCategory, defaultItemCategory); + groupOrder = a.getInt(R.styleable.MenuGroup_android_orderInCategory, defaultItemOrder); + groupCheckable = a.getInt( + R.styleable.MenuGroup_android_checkableBehavior, defaultItemCheckable); + groupVisible = a.getBoolean(R.styleable.MenuGroup_android_visible, defaultItemVisible); + groupEnabled = a.getBoolean(R.styleable.MenuGroup_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.MenuItem); + + // Inherit attributes from the group as default value + itemId = a.getResourceId(R.styleable.MenuItem_android_id, defaultItemId); + final int category = a.getInt(R.styleable.MenuItem_android_menuCategory, groupCategory); + final int order = a.getInt(R.styleable.MenuItem_android_orderInCategory, groupOrder); + itemCategoryOrder = (category & SupportMenu.CATEGORY_MASK) | + (order & SupportMenu.USER_MASK); + itemTitle = a.getText(R.styleable.MenuItem_android_title); + itemTitleCondensed = a.getText(R.styleable.MenuItem_android_titleCondensed); + itemIconResId = a.getResourceId(R.styleable.MenuItem_android_icon, 0); + itemAlphabeticShortcut = + getShortcut(a.getString(R.styleable.MenuItem_android_alphabeticShortcut)); + itemNumericShortcut = + getShortcut(a.getString(R.styleable.MenuItem_android_numericShortcut)); + if (a.hasValue(R.styleable.MenuItem_android_checkable)) { + // Item has attribute checkable, use it + itemCheckable = a.getBoolean(R.styleable.MenuItem_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.MenuItem_android_checked, defaultItemChecked); + itemVisible = a.getBoolean(R.styleable.MenuItem_android_visible, groupVisible); + itemEnabled = a.getBoolean(R.styleable.MenuItem_android_enabled, groupEnabled); + itemShowAsAction = a.getInt(R.styleable.MenuItem_showAsAction, -1); + itemListenerMethodName = a.getString(R.styleable.MenuItem_android_onClick); + itemActionViewLayout = a.getResourceId(R.styleable.MenuItem_actionLayout, 0); + itemActionViewClassName = a.getString(R.styleable.MenuItem_actionViewClass); + itemActionProviderClassName = a.getString(R.styleable.MenuItem_actionProviderClass); + + 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) { + MenuItemCompat.setShowAsAction(item, 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(getRealOwner(), itemListenerMethodName)); + } + + final MenuItemImpl impl = item instanceof MenuItemImpl ? (MenuItemImpl) item : null; + if (itemCheckable >= 2) { + if (item instanceof MenuItemImpl) { + ((MenuItemImpl) item).setExclusiveCheckable(true); + } else if (item instanceof MenuItemWrapperICS) { + ((MenuItemWrapperICS) item).setExclusiveCheckable(true); + } + } + + boolean actionViewSpecified = false; + if (itemActionViewClassName != null) { + View actionView = (View) newInstance(itemActionViewClassName, + ACTION_VIEW_CONSTRUCTOR_SIGNATURE, mActionViewConstructorArguments); + MenuItemCompat.setActionView(item, actionView); + actionViewSpecified = true; + } + if (itemActionViewLayout > 0) { + if (!actionViewSpecified) { + MenuItemCompat.setActionView(item, itemActionViewLayout); + actionViewSpecified = true; + } else { + Log.w(LOG_TAG, "Ignoring attribute 'itemActionViewLayout'." + + " Action view already specified."); + } + } + if (itemActionProvider != null) { + MenuItemCompat.setActionProvider(item, 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/eclipse-compile/appcompat/src/android/support/v7/internal/view/ViewPropertyAnimatorCompatSet.java b/eclipse-compile/appcompat/src/android/support/v7/internal/view/ViewPropertyAnimatorCompatSet.java new file mode 100644 index 0000000000..457e1b1674 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/view/ViewPropertyAnimatorCompatSet.java @@ -0,0 +1,139 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.view; + +import android.support.v4.view.ViewPropertyAnimatorCompat; +import android.support.v4.view.ViewPropertyAnimatorListener; +import android.support.v4.view.ViewPropertyAnimatorListenerAdapter; +import android.view.View; +import android.view.animation.Interpolator; + +import java.util.ArrayList; + +/** + * A very naive implementation of a set of + * {@link android.support.v4.view.ViewPropertyAnimatorCompat}. + * + * @hide + */ +public class ViewPropertyAnimatorCompatSet { + + private final ArrayList mAnimators; + + private long mDuration = -1; + private Interpolator mInterpolator; + private ViewPropertyAnimatorListener mListener; + + private boolean mIsStarted; + + public ViewPropertyAnimatorCompatSet() { + mAnimators = new ArrayList(); + } + + public ViewPropertyAnimatorCompatSet play(ViewPropertyAnimatorCompat animator) { + if (!mIsStarted) { + mAnimators.add(animator); + } + return this; + } + + public void start() { + if (mIsStarted) return; + for (ViewPropertyAnimatorCompat animator : mAnimators) { + if (mDuration >= 0) { + animator.setDuration(mDuration); + } + if (mInterpolator != null) { + animator.setInterpolator(mInterpolator); + } + if (mListener != null) { + animator.setListener(mProxyListener); + } + animator.start(); + } + + mIsStarted = true; + } + + private void onAnimationsEnded() { + mIsStarted = false; + } + + public void cancel() { + if (!mIsStarted) { + return; + } + for (ViewPropertyAnimatorCompat animator : mAnimators) { + animator.cancel(); + } + mIsStarted = false; + } + + public ViewPropertyAnimatorCompatSet setDuration(long duration) { + if (!mIsStarted) { + mDuration = duration; + } + return this; + } + + public ViewPropertyAnimatorCompatSet setInterpolator(Interpolator interpolator) { + if (!mIsStarted) { + mInterpolator = interpolator; + } + return this; + } + + public ViewPropertyAnimatorCompatSet setListener(ViewPropertyAnimatorListener listener) { + if (!mIsStarted) { + mListener = listener; + } + return this; + } + + private final ViewPropertyAnimatorListenerAdapter mProxyListener + = new ViewPropertyAnimatorListenerAdapter() { + private boolean mProxyStarted = false; + private int mProxyEndCount = 0; + + @Override + public void onAnimationStart(View view) { + if (mProxyStarted) { + return; + } + mProxyStarted = true; + if (mListener != null) { + mListener.onAnimationStart(null); + } + } + + void onEnd() { + mProxyEndCount = 0; + mProxyStarted = false; + onAnimationsEnded(); + } + + @Override + public void onAnimationEnd(View view) { + if (++mProxyEndCount == mAnimators.size()) { + if (mListener != null) { + mListener.onAnimationEnd(null); + } + onEnd(); + } + } + }; +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/view/WindowCallbackWrapper.java b/eclipse-compile/appcompat/src/android/support/v7/internal/view/WindowCallbackWrapper.java new file mode 100644 index 0000000000..d799d00e95 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/view/WindowCallbackWrapper.java @@ -0,0 +1,151 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.view; + +import android.view.ActionMode; +import android.view.KeyEvent; +import android.view.Menu; +import android.view.MenuItem; +import android.view.MotionEvent; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.view.accessibility.AccessibilityEvent; + +/** + * A simple decorator stub for Window.Callback that passes through any calls + * to the wrapped instance as a base implementation. Call super.foo() to call into + * the wrapped callback for any subclasses. + * + * @hide + */ +public class WindowCallbackWrapper implements Window.Callback { + + final Window.Callback mWrapped; + + public WindowCallbackWrapper(Window.Callback wrapped) { + if (wrapped == null) { + throw new IllegalArgumentException("Window callback may not be null"); + } + mWrapped = wrapped; + } + + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + return mWrapped.dispatchKeyEvent(event); + } + + @Override + public boolean dispatchKeyShortcutEvent(KeyEvent event) { + return mWrapped.dispatchKeyShortcutEvent(event); + } + + @Override + public boolean dispatchTouchEvent(MotionEvent event) { + return mWrapped.dispatchTouchEvent(event); + } + + @Override + public boolean dispatchTrackballEvent(MotionEvent event) { + return mWrapped.dispatchTrackballEvent(event); + } + + @Override + public boolean dispatchGenericMotionEvent(MotionEvent event) { + return mWrapped.dispatchGenericMotionEvent(event); + } + + @Override + public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { + return mWrapped.dispatchPopulateAccessibilityEvent(event); + } + + @Override + public View onCreatePanelView(int featureId) { + return mWrapped.onCreatePanelView(featureId); + } + + @Override + public boolean onCreatePanelMenu(int featureId, Menu menu) { + return mWrapped.onCreatePanelMenu(featureId, menu); + } + + @Override + public boolean onPreparePanel(int featureId, View view, Menu menu) { + return mWrapped.onPreparePanel(featureId, view, menu); + } + + @Override + public boolean onMenuOpened(int featureId, Menu menu) { + return mWrapped.onMenuOpened(featureId, menu); + } + + @Override + public boolean onMenuItemSelected(int featureId, MenuItem item) { + return mWrapped.onMenuItemSelected(featureId, item); + } + + @Override + public void onWindowAttributesChanged(WindowManager.LayoutParams attrs) { + mWrapped.onWindowAttributesChanged(attrs); + } + + @Override + public void onContentChanged() { + mWrapped.onContentChanged(); + } + + @Override + public void onWindowFocusChanged(boolean hasFocus) { + mWrapped.onWindowFocusChanged(hasFocus); + } + + @Override + public void onAttachedToWindow() { + mWrapped.onAttachedToWindow(); + } + + @Override + public void onDetachedFromWindow() { + mWrapped.onDetachedFromWindow(); + } + + @Override + public void onPanelClosed(int featureId, Menu menu) { + mWrapped.onPanelClosed(featureId, menu); + } + + @Override + public boolean onSearchRequested() { + return mWrapped.onSearchRequested(); + } + + @Override + public ActionMode onWindowStartingActionMode(ActionMode.Callback callback) { + return mWrapped.onWindowStartingActionMode(callback); + } + + @Override + public void onActionModeStarted(ActionMode mode) { + mWrapped.onActionModeStarted(mode); + } + + @Override + public void onActionModeFinished(ActionMode mode) { + mWrapped.onActionModeFinished(mode); + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/ActionMenuItem.java b/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/ActionMenuItem.java new file mode 100644 index 0000000000..b466a0ba27 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/ActionMenuItem.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 android.support.v7.internal.view.menu; + +import android.content.Context; +import android.content.Intent; +import android.graphics.drawable.Drawable; +import android.support.v4.content.ContextCompat; +import android.support.v4.view.ActionProvider; +import android.support.v4.internal.view.SupportMenuItem; +import android.support.v4.view.MenuItemCompat; +import android.view.ContextMenu.ContextMenuInfo; +import android.view.MenuItem; +import android.view.SubMenu; +import android.view.View; + +/** + * @hide + */ +public class ActionMenuItem implements SupportMenuItem { + + 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; + + private Drawable mIconDrawable; + private int mIconResId = NO_ICON; + + private Context mContext; + + private SupportMenuItem.OnMenuItemClickListener mClickListener; + + 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; + 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 != null ? mTitleCondensed : mTitle; + } + + 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; + mIconResId = NO_ICON; + return this; + } + + public MenuItem setIcon(int iconRes) { + mIconResId = iconRes; + mIconDrawable = ContextCompat.getDrawable(mContext, 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 SupportMenuItem setActionView(View actionView) { + throw new UnsupportedOperationException(); + } + + public View getActionView() { + return null; + } + + @Override + public MenuItem setActionProvider(android.view.ActionProvider actionProvider) { + throw new UnsupportedOperationException(); + } + + @Override + public android.view.ActionProvider getActionProvider() { + throw new UnsupportedOperationException(); + } + + @Override + public SupportMenuItem setActionView(int resId) { + throw new UnsupportedOperationException(); + } + + @Override + public ActionProvider getSupportActionProvider() { + return null; + } + + @Override + public SupportMenuItem setSupportActionProvider(ActionProvider actionProvider) { + throw new UnsupportedOperationException(); + } + + @Override + public SupportMenuItem 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(MenuItem.OnActionExpandListener listener) { + throw new UnsupportedOperationException(); + } + + @Override + public SupportMenuItem setSupportOnActionExpandListener(MenuItemCompat.OnActionExpandListener listener) { + // No need to save the listener; ActionMenuItem does not support collapsing items. + return this; + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/ActionMenuItemView.java b/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/ActionMenuItemView.java new file mode 100644 index 0000000000..8755ef27a3 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/ActionMenuItemView.java @@ -0,0 +1,334 @@ +/* + * 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 android.support.v7.internal.view.menu; + +import android.content.Context; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.support.v4.view.GravityCompat; +import android.support.v4.view.ViewCompat; +import android.support.v7.appcompat.R; +import android.support.v7.internal.text.AllCapsTransformationMethod; +import android.support.v7.internal.widget.CompatTextView; +import android.support.v7.widget.ActionMenuView; +import android.support.v7.widget.ListPopupWindow; +import android.text.TextUtils; +import android.text.method.TransformationMethod; +import android.util.AttributeSet; +import android.view.Gravity; +import android.view.MotionEvent; +import android.view.View; +import android.widget.Toast; + +import java.util.Locale; + +/** + * @hide + */ +public class ActionMenuItemView extends CompatTextView + implements MenuView.ItemView, View.OnClickListener, View.OnLongClickListener, + ActionMenuView.ActionMenuChildView { + + private static final String TAG = "ActionMenuItemView"; + + private MenuItemImpl mItemData; + private CharSequence mTitle; + private Drawable mIcon; + private MenuBuilder.ItemInvoker mItemInvoker; + private ListPopupWindow.ForwardingListener mForwardingListener; + private PopupCallback mPopupCallback; + + private boolean mAllowTextWithIcon; + private boolean mExpandedFormat; + private int mMinWidth; + private int mSavedPaddingLeft; + + private static final int MAX_ICON_SIZE = 32; // dp + private int mMaxIconSize; + + 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) { + super(context, attrs, defStyle); + final Resources res = context.getResources(); + mAllowTextWithIcon = res.getBoolean( + R.bool.abc_config_allowActionMenuItemTextWithIcon); + TypedArray a = context.obtainStyledAttributes(attrs, + R.styleable.ActionMenuItemView, defStyle, 0); + mMinWidth = a.getDimensionPixelSize( + R.styleable.ActionMenuItemView_android_minWidth, 0); + a.recycle(); + + final float density = res.getDisplayMetrics().density; + mMaxIconSize = (int) (MAX_ICON_SIZE * density + 0.5f); + + setOnClickListener(this); + setOnLongClickListener(this); + + mSavedPaddingLeft = -1; + } + + public void onConfigurationChanged(Configuration newConfig) { + if (Build.VERSION.SDK_INT >= 8) { + super.onConfigurationChanged(newConfig); + } + + mAllowTextWithIcon = getContext().getResources().getBoolean( + R.bool.abc_config_allowActionMenuItemTextWithIcon); + updateTextButtonVisibility(); + } + + @Override + public void setPadding(int l, int t, int r, int b) { + mSavedPaddingLeft = l; + super.setPadding(l, t, r, b); + } + + 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()); + if (itemData.hasSubMenu()) { + if (mForwardingListener == null) { + mForwardingListener = new ActionMenuItemForwardingListener(); + } + } + } + + @Override + public boolean onTouchEvent(MotionEvent e) { + if (mItemData.hasSubMenu() && mForwardingListener != null + && mForwardingListener.onTouch(this, e)) { + return true; + } + return super.onTouchEvent(e); + } + + @Override + public void onClick(View v) { + if (mItemInvoker != null) { + mItemInvoker.invokeItem(mItemData); + } + } + + public void setItemInvoker(MenuBuilder.ItemInvoker invoker) { + mItemInvoker = invoker; + } + + public void setPopupCallback(PopupCallback popupCallback) { + mPopupCallback = popupCallback; + } + + 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(mTitle); + visible &= mIcon == null || + (mItemData.showsTextAsAction() && (mAllowTextWithIcon || mExpandedFormat)); + + setText(visible ? mTitle : null); + } + + public void setIcon(Drawable icon) { + mIcon = icon; + if (icon != null) { + int width = icon.getIntrinsicWidth(); + int height = icon.getIntrinsicHeight(); + if (width > mMaxIconSize) { + final float scale = (float) mMaxIconSize / width; + width = mMaxIconSize; + height *= scale; + } + if (height > mMaxIconSize) { + final float scale = (float) mMaxIconSize / height; + height = mMaxIconSize; + width *= scale; + } + icon.setBounds(0, 0, width, height); + } + setCompoundDrawables(icon, null, null, null); + + updateTextButtonVisibility(); + } + + public boolean hasText() { + return !TextUtils.isEmpty(getText()); + } + + public void setShortcut(boolean showShortcut, char shortcutKey) { + // Action buttons don't show text for shortcut keys. + } + + public void setTitle(CharSequence title) { + mTitle = title; + + setContentDescription(mTitle); + updateTextButtonVisibility(); + } + + 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; + int referenceX = screenPos[0] + width / 2; + if (ViewCompat.getLayoutDirection(v) == ViewCompat.LAYOUT_DIRECTION_LTR) { + final int screenWidth = context.getResources().getDisplayMetrics().widthPixels; + referenceX = screenWidth - referenceX; // mirror + } + Toast cheatSheet = Toast.makeText(context, mItemData.getTitle(), Toast.LENGTH_SHORT); + if (midy < displayFrame.height()) { + // Show along the top; follow action buttons + cheatSheet.setGravity(Gravity.TOP | GravityCompat.END, referenceX, 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) { + final boolean textVisible = hasText(); + if (textVisible && mSavedPaddingLeft >= 0) { + super.setPadding(mSavedPaddingLeft, getPaddingTop(), + getPaddingRight(), getPaddingBottom()); + } + + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + + final int widthMode = MeasureSpec.getMode(widthMeasureSpec); + final int widthSize = MeasureSpec.getSize(widthMeasureSpec); + final int oldMeasuredWidth = getMeasuredWidth(); + final int targetWidth = widthMode == MeasureSpec.AT_MOST ? Math.min(widthSize, mMinWidth) + : mMinWidth; + + if (widthMode != MeasureSpec.EXACTLY && mMinWidth > 0 && oldMeasuredWidth < targetWidth) { + // Remeasure at exactly the minimum width. + super.onMeasure(MeasureSpec.makeMeasureSpec(targetWidth, MeasureSpec.EXACTLY), + heightMeasureSpec); + } + + if (!textVisible && mIcon != null) { + // TextView won't center compound drawables in both dimensions without + // a little coercion. Pad in to center the icon after we've measured. + final int w = getMeasuredWidth(); + final int dw = mIcon.getBounds().width(); + super.setPadding((w - dw) / 2, getPaddingTop(), getPaddingRight(), getPaddingBottom()); + } + } + + private class ActionMenuItemForwardingListener extends ListPopupWindow.ForwardingListener { + public ActionMenuItemForwardingListener() { + super(ActionMenuItemView.this); + } + + @Override + public ListPopupWindow getPopup() { + if (mPopupCallback != null) { + return mPopupCallback.getPopup(); + } + return null; + } + + @Override + protected boolean onForwardingStarted() { + // Call the invoker, then check if the expected popup is showing. + if (mItemInvoker != null && mItemInvoker.invokeItem(mItemData)) { + final ListPopupWindow popup = getPopup(); + return popup != null && popup.isShowing(); + } + return false; + } + + @Override + protected boolean onForwardingStopped() { + final ListPopupWindow popup = getPopup(); + if (popup != null) { + popup.dismiss(); + return true; + } + return false; + } + } + + public static abstract class PopupCallback { + public abstract ListPopupWindow getPopup(); + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/BaseMenuPresenter.java b/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/BaseMenuPresenter.java new file mode 100644 index 0000000000..34cc821f5e --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/BaseMenuPresenter.java @@ -0,0 +1,237 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.view.menu; + +import android.content.Context; +import android.support.v4.view.ViewCompat; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import java.util.ArrayList; + +/** + * 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. + * + * @hide + */ +public abstract class BaseMenuPresenter implements MenuPresenter { + + 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); + ViewCompat.jumpDrawablesToCurrentState(itemView); + } + 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; + } + + public Callback getCallback() { + return mCallback; + } + + /** + * 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/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/BaseMenuWrapper.java b/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/BaseMenuWrapper.java new file mode 100644 index 0000000000..b8f7793b35 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/BaseMenuWrapper.java @@ -0,0 +1,126 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.view.menu; + +import android.content.Context; +import android.support.v4.internal.view.SupportMenuItem; +import android.support.v4.internal.view.SupportSubMenu; +import android.support.v4.util.ArrayMap; +import android.view.MenuItem; +import android.view.SubMenu; + +import java.util.Iterator; +import java.util.Map; + +abstract class BaseMenuWrapper extends BaseWrapper { + + final Context mContext; + + private Map mMenuItems; + private Map mSubMenus; + + BaseMenuWrapper(Context context, T object) { + super(object); + mContext = context; + } + + final MenuItem getMenuItemWrapper(final MenuItem menuItem) { + if (menuItem instanceof SupportMenuItem) { + final SupportMenuItem supportMenuItem = (SupportMenuItem) menuItem; + + // Instantiate Map if null + if (mMenuItems == null) { + mMenuItems = new ArrayMap<>(); + } + + // First check if we already have a wrapper for this item + MenuItem wrappedItem = mMenuItems.get(menuItem); + + if (null == wrappedItem) { + // ... if not, create one and add it to our map + wrappedItem = MenuWrapperFactory.wrapSupportMenuItem(mContext, supportMenuItem); + mMenuItems.put(supportMenuItem, wrappedItem); + } + + return wrappedItem; + } + return menuItem; + } + + final SubMenu getSubMenuWrapper(final SubMenu subMenu) { + if (subMenu instanceof SupportSubMenu) { + final SupportSubMenu supportSubMenu = (SupportSubMenu) subMenu; + + // Instantiate Map if null + if (mSubMenus == null) { + mSubMenus = new ArrayMap<>(); + } + + SubMenu wrappedMenu = mSubMenus.get(supportSubMenu); + + if (null == wrappedMenu) { + wrappedMenu = MenuWrapperFactory.wrapSupportSubMenu(mContext, supportSubMenu); + mSubMenus.put(supportSubMenu, wrappedMenu); + } + return wrappedMenu; + } + return subMenu; + } + + + final void internalClear() { + if (mMenuItems != null) { + mMenuItems.clear(); + } + if (mSubMenus != null) { + mSubMenus.clear(); + } + } + + final void internalRemoveGroup(final int groupId) { + if (mMenuItems == null) { + return; + } + + Iterator iterator = mMenuItems.keySet().iterator(); + android.view.MenuItem menuItem; + + while (iterator.hasNext()) { + menuItem = iterator.next(); + if (groupId == menuItem.getGroupId()) { + iterator.remove(); + } + } + } + + final void internalRemoveItem(final int id) { + if (mMenuItems == null) { + return; + } + + Iterator iterator = mMenuItems.keySet().iterator(); + android.view.MenuItem menuItem; + + while (iterator.hasNext()) { + menuItem = iterator.next(); + if (id == menuItem.getItemId()) { + iterator.remove(); + break; + } + } + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/BaseWrapper.java b/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/BaseWrapper.java new file mode 100644 index 0000000000..116bc23756 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/BaseWrapper.java @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.view.menu; + +class BaseWrapper { + + final T mWrappedObject; + + BaseWrapper(T object) { + if (null == object) { + throw new IllegalArgumentException("Wrapped Object can not be null."); + } + mWrappedObject = object; + } + + public T getWrappedObject() { + return mWrappedObject; + } + +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/ExpandedMenuView.java b/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/ExpandedMenuView.java new file mode 100644 index 0000000000..fa12f67b82 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/ExpandedMenuView.java @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.view.menu; + +import android.content.Context; +import android.support.v7.internal.view.menu.MenuBuilder; +import android.support.v7.internal.view.menu.MenuBuilder.ItemInvoker; +import android.support.v7.internal.view.menu.MenuView; +import android.support.v7.internal.widget.TintTypedArray; +import android.util.AttributeSet; +import android.view.View; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemClickListener; +import android.widget.ListView; + +/** + * The expanded menu view is a list-like menu with all of the available menu items. It is opened + * by the user clicking no the 'More' button on the icon menu view. + * + * @hide + */ +public final class ExpandedMenuView extends ListView + implements ItemInvoker, MenuView, OnItemClickListener { + + private static final int[] TINT_ATTRS = { + android.R.attr.background, + android.R.attr.divider + }; + + private MenuBuilder mMenu; + + /** Default animations for this menu */ + private int mAnimations; + + public ExpandedMenuView(Context context, AttributeSet attrs) { + this(context, attrs, android.R.attr.listViewStyle); + } + + public ExpandedMenuView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs); + setOnItemClickListener(this); + + TintTypedArray a = TintTypedArray.obtainStyledAttributes(context, attrs, TINT_ATTRS, + defStyleAttr, 0); + if (a.hasValue(0)) { + setBackgroundDrawable(a.getDrawable(0)); + } + if (a.hasValue(1)) { + setDivider(a.getDrawable(1)); + } + a.recycle(); + } + + @Override + public void initialize(MenuBuilder menu) { + mMenu = menu; + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + + // Clear the cached bitmaps of children + setChildrenDrawingCacheEnabled(false); + } + + @Override + public boolean invokeItem(MenuItemImpl item) { + return mMenu.performItemAction(item, 0); + } + + @Override + @SuppressWarnings("rawtypes") + public void onItemClick(AdapterView parent, View v, int position, long id) { + invokeItem((MenuItemImpl) getAdapter().getItem(position)); + } + + @Override + public int getWindowAnimations() { + return mAnimations; + } + +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/ListMenuItemView.java b/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/ListMenuItemView.java new file mode 100644 index 0000000000..ebb9529fee --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/ListMenuItemView.java @@ -0,0 +1,282 @@ +/* + * 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 android.support.v7.internal.view.menu; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.support.v7.appcompat.R; +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. + * + * @hide + */ +public class ListMenuItemView extends LinearLayout implements MenuView.ItemView { + + private static final String TAG = "ListMenuItemView"; + 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; + + private int mMenuType; + + private Context mContext; + private LayoutInflater mInflater; + + private boolean mForceShowIcon; + + public ListMenuItemView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs); + mContext = context; + + final TypedArray a = context.obtainStyledAttributes( + attrs, R.styleable.MenuView, defStyle, 0); + + mBackground = a.getDrawable(R.styleable.MenuView_android_itemBackground); + mTextAppearance = a.getResourceId(R.styleable. + MenuView_android_itemTextAppearance, -1); + mPreserveIconSpacing = a.getBoolean( + R.styleable.MenuView_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.title); + if (mTextAppearance != -1) { + mTitleView.setTextAppearance(mTextAppearanceContext, + mTextAppearance); + } + + mShortcutView = (TextView) findViewById(R.id.shortcut); + } + + public void initialize(MenuItemImpl itemData, int menuType) { + mItemData = itemData; + 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; + } + + // 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 ? VISIBLE : GONE; + if (compoundButton.getVisibility() != newVisibility) { + compoundButton.setVisibility(newVisibility); + } + + // Make sure the other compound button isn't visible + if (otherCompoundButton != null && otherCompoundButton.getVisibility() != GONE) { + otherCompoundButton.setVisibility(GONE); + } + } else { + if (mCheckBox != null) { + mCheckBox.setVisibility(GONE); + } + if (mRadioButton != null) { + 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.abc_list_menu_item_icon, + this, false); + addView(mIconView, 0); + } + + private void insertRadioButton() { + LayoutInflater inflater = getInflater(); + mRadioButton = + (RadioButton) inflater.inflate(R.layout.abc_list_menu_item_radio, + this, false); + addView(mRadioButton); + } + + private void insertCheckBox() { + LayoutInflater inflater = getInflater(); + mCheckBox = + (CheckBox) inflater.inflate(R.layout.abc_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/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/ListMenuPresenter.java b/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/ListMenuPresenter.java new file mode 100644 index 0000000000..ac988405f2 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/ListMenuPresenter.java @@ -0,0 +1,288 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.view.menu; + +import android.content.Context; +import android.database.DataSetObserver; +import android.os.Bundle; +import android.os.Parcelable; +import android.support.v7.appcompat.R; +import android.util.SparseArray; +import android.view.ContextThemeWrapper; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.BaseAdapter; +import android.widget.ListAdapter; + +import java.util.ArrayList; + +/** + * MenuPresenter for list-style menus. + * + * @hide + */ +public class ListMenuPresenter implements MenuPresenter, AdapterView.OnItemClickListener { + private static final String TAG = "ListMenuPresenter"; + + Context mContext; + LayoutInflater mInflater; + MenuBuilder mMenu; + + ExpandedMenuView mMenuView; + + private int mItemIndexOffset; + int mThemeRes; + int mItemLayoutRes; + + private Callback mCallback; + MenuAdapter mAdapter; + + private int mId; + + public static final String VIEWS_TAG = "android:menu:list"; + + /** + * Construct a new ListMenuPresenter. + * @param context Context to use for theming. This will supersede the context provided + * to initForMenu when this presenter is added. + * @param itemLayoutRes Layout resource for individual item views. + */ + public ListMenuPresenter(Context context, int itemLayoutRes) { + this(itemLayoutRes, 0); + mContext = context; + mInflater = LayoutInflater.from(mContext); + } + + /** + * Construct a new ListMenuPresenter. + * @param itemLayoutRes Layout resource for individual item views. + * @param themeRes Resource ID of a theme to use for views. + */ + public ListMenuPresenter(int itemLayoutRes, int themeRes) { + mItemLayoutRes = itemLayoutRes; + mThemeRes = themeRes; + } + + @Override + public void initForMenu(Context context, MenuBuilder menu) { + if (mThemeRes != 0) { + mContext = new ContextThemeWrapper(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 MenuView getMenuView(ViewGroup root) { + if (mMenuView == null) { + mMenuView = (ExpandedMenuView) mInflater.inflate( + R.layout.abc_expanded_menu_layout, root, false); + if (mAdapter == null) { + mAdapter = new MenuAdapter(); + } + mMenuView.setAdapter(mAdapter); + mMenuView.setOnItemClickListener(this); + } + return mMenuView; + } + + /** + * Call this instead of getMenuView if you want to manage your own ListView. + * For proper operation, the ListView hosting this adapter should add + * this presenter as an OnItemClickListener. + * + * @return A ListAdapter containing the items in the menu. + */ + public ListAdapter getAdapter() { + if (mAdapter == null) { + mAdapter = new MenuAdapter(); + } + return mAdapter; + } + + @Override + public void updateMenuView(boolean cleared) { + if (mAdapter != null) mAdapter.notifyDataSetChanged(); + } + + @Override + public void setCallback(Callback cb) { + mCallback = cb; + } + + @Override + public boolean onSubMenuSelected(SubMenuBuilder subMenu) { + if (!subMenu.hasVisibleItems()) return false; + + // The window manager will give us a token. + new MenuDialogHelper(subMenu).show(null); + if (mCallback != null) { + mCallback.onOpenSubMenu(subMenu); + } + return true; + } + + @Override + public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { + if (mCallback != null) { + mCallback.onCloseMenu(menu, allMenusAreClosing); + } + } + + int getItemIndexOffset() { + return mItemIndexOffset; + } + + public void setItemIndexOffset(int offset) { + mItemIndexOffset = offset; + if (mMenuView != null) { + updateMenuView(false); + } + } + + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + mMenu.performItemAction(mAdapter.getItem(position), this, 0); + } + + @Override + public boolean flagActionItems() { + return false; + } + + public boolean expandItemActionView(MenuBuilder menu, MenuItemImpl item) { + return false; + } + + public boolean collapseItemActionView(MenuBuilder menu, MenuItemImpl item) { + return false; + } + + public void saveHierarchyState(Bundle outState) { + SparseArray viewStates = new SparseArray(); + if (mMenuView != null) { + ((View) mMenuView).saveHierarchyState(viewStates); + } + outState.putSparseParcelableArray(VIEWS_TAG, viewStates); + } + + public void restoreHierarchyState(Bundle inState) { + SparseArray viewStates = inState.getSparseParcelableArray(VIEWS_TAG); + if (viewStates != null) { + ((View) mMenuView).restoreHierarchyState(viewStates); + } + } + + public void setId(int id) { + mId = id; + } + + @Override + public int getId() { + return mId; + } + + @Override + public Parcelable onSaveInstanceState() { + if (mMenuView == null) { + return null; + } + + Bundle state = new Bundle(); + saveHierarchyState(state); + return state; + } + + @Override + public void onRestoreInstanceState(Parcelable state) { + restoreHierarchyState((Bundle) state); + } + + private class MenuAdapter extends BaseAdapter { + private int mExpandedIndex = -1; + + public MenuAdapter() { + findExpandedIndex(); + } + + public int getCount() { + ArrayList items = mMenu.getNonActionItems(); + int count = items.size() - mItemIndexOffset; + if (mExpandedIndex < 0) { + return count; + } + return count - 1; + } + + public MenuItemImpl getItem(int position) { + ArrayList items = mMenu.getNonActionItems(); + position += mItemIndexOffset; + 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(mItemLayoutRes, parent, false); + } + + MenuView.ItemView itemView = (MenuView.ItemView) convertView; + 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; + } + + @Override + public void notifyDataSetChanged() { + findExpandedIndex(); + super.notifyDataSetChanged(); + } + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/MenuBuilder.java b/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/MenuBuilder.java new file mode 100644 index 0000000000..675a823391 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/MenuBuilder.java @@ -0,0 +1,1352 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.view.menu; + +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.os.Parcelable; +import android.support.v4.content.ContextCompat; +import android.support.v4.view.MenuItemCompat; +import android.support.v7.appcompat.R; +import android.support.v4.view.ActionProvider; +import android.support.v4.internal.view.SupportMenu; +import android.support.v4.internal.view.SupportMenuItem; +import android.util.SparseArray; +import android.view.ContextMenu; +import android.view.KeyCharacterMap; +import android.view.KeyEvent; +import android.view.MenuItem; +import android.view.SubMenu; +import android.view.View; + +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +/** + * Implementation of the {@link android.support.v4.internal.view.SupportMenu} interface for creating a + * standard menu UI. + * + * @hide + */ +public class MenuBuilder implements SupportMenu { + + 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 = SupportMenuItem.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 ContextMenu.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. + */ + 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. + * @hide + */ + 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 + * @hide + */ + 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) { + addMenuPresenter(presenter, mContext); + } + + /** + * Add a presenter to this menu that uses an alternate context for + * inflating menu items. 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 + * @param menuContext The context used to inflate menu items + */ + public void addMenuPresenter(MenuPresenter presenter, Context menuContext) { + mPresenters.add(new WeakReference(presenter)); + presenter.initForMenu(menuContext, 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, + MenuPresenter preferredPresenter) { + if (mPresenters.isEmpty()) return false; + + boolean result = false; + + // Try the preferred presenter first. + if (preferredPresenter != null) { + result = preferredPresenter.onSubMenuSelected(subMenu); + } + + 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 = MenuItemCompat.getActionView(item); + if (v != null && v.getId() != View.NO_ID) { + if (viewStates == null) { + viewStates = new SparseArray(); + } + v.saveHierarchyState(viewStates); + if (MenuItemCompat.isActionViewExpanded(item)) { + outStates.putInt(EXPANDED_ACTION_VIEW_ID, item.getItemId()); + } + } + if (item.hasSubMenu()) { + final SubMenuBuilder subMenu = (SubMenuBuilder) item.getSubMenu(); + subMenu.saveActionViewStates(outStates); + } + } + + if (viewStates != null) { + outStates.putSparseParcelableArray(getActionViewStatesKey(), viewStates); + } + } + + public void restoreActionViewStates(Bundle states) { + if (states == null) { + return; + } + + SparseArray viewStates = states.getSparseParcelableArray( + getActionViewStatesKey()); + + final int itemCount = size(); + for (int i = 0; i < itemCount; i++) { + final MenuItem item = getItem(i); + final View v = MenuItemCompat.getActionView(item); + 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) { + MenuItemCompat.expandActionView(itemToExpand); + } + } + } + + 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 = createNewMenuItem(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; + } + + // Layoutlib overrides this method to return its custom implementation of MenuItemImpl + private MenuItemImpl createNewMenuItem(int group, int id, int categoryOrder, int ordering, + CharSequence title, int defaultShowAsAction) { + return new MenuItemImpl(this, group, id, categoryOrder, ordering, title, + defaultShowAsAction); + } + + public MenuItem add(CharSequence title) { + return addInternal(0, 0, 0, title); + } + + @Override + public MenuItem add(int titleRes) { + return addInternal(0, 0, 0, mResources.getString(titleRes)); + } + + @Override + public MenuItem add(int group, int id, int categoryOrder, CharSequence title) { + return addInternal(group, id, categoryOrder, title); + } + + @Override + public MenuItem add(int group, int id, int categoryOrder, int title) { + return addInternal(group, id, categoryOrder, mResources.getString(title)); + } + + @Override + public SubMenu addSubMenu(CharSequence title) { + return addSubMenu(0, 0, 0, title); + } + + @Override + public SubMenu addSubMenu(int titleRes) { + return addSubMenu(0, 0, 0, mResources.getString(titleRes)); + } + + @Override + 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; + } + + @Override + public SubMenu addSubMenu(int group, int id, int categoryOrder, int title) { + return addSubMenu(group, id, categoryOrder, mResources.getString(title)); + } + + @Override + 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 < N; i++) { + final ResolveInfo ri = lri.get(i); + Intent rintent = new Intent( + ri.specificIndex < 0 ? intent : specifics[ri.specificIndex]); + rintent.setComponent(new ComponentName( + ri.activityInfo.applicationInfo.packageName, + ri.activityInfo.name)); + final MenuItem item = add(group, id, categoryOrder, ri.loadLabel(pm)) + .setIcon(ri.loadIcon(pm)) + .setIntent(rintent); + if (outSpecificItems != null && ri.specificIndex >= 0) { + outSpecificItems[ri.specificIndex] = item; + } + } + + return N; + } + + @Override + public void removeItem(int id) { + removeItemAtInt(findItemIndex(id), true); + } + + @Override + 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); + } + + @Override + 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); + } + } + } + + @Override + 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); + } + } + } + + @Override + 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); + } + + @Override + 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); + } + } + } + + @Override + 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; + } + + @Override + 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; + } + + @Override + public int size() { + return mItems.size(); + } + + @Override + public MenuItem getItem(int index) { + return mItems.get(index); + } + + @Override + public boolean isShortcutKey(int keyCode, KeyEvent event) { + return findItemWithShortcutForKey(keyCode, event) != null; + } + + @Override + 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.abc_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; + } + + @Override + 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; + } + + @Override + 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) { + return performItemAction(item, null, flags); + } + + public boolean performItemAction(MenuItem item, MenuPresenter preferredPresenter, int flags) { + MenuItemImpl itemImpl = (MenuItemImpl) item; + + if (itemImpl == null || !itemImpl.isEnabled()) { + return false; + } + + boolean invoked = itemImpl.invoke(); + + final ActionProvider provider = itemImpl.getSupportActionProvider(); + final boolean providerHasSubMenu = provider != null && provider.hasSubMenu(); + if (itemImpl.hasCollapsibleActionView()) { + invoked |= itemImpl.expandActionView(); + if (invoked) close(true); + } else if (itemImpl.hasSubMenu() || providerHasSubMenu) { + close(false); + + if (!itemImpl.hasSubMenu()) { + itemImpl.setSubMenu(new SubMenuBuilder(getContext(), this, itemImpl)); + } + + final SubMenuBuilder subMenu = (SubMenuBuilder) itemImpl.getSubMenu(); + if (providerHasSubMenu) { + provider.onPrepareSubMenu(subMenu); + } + invoked |= dispatchSubMenuSelected(subMenu, preferredPresenter); + 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. + */ + public 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; + } + + @Override + 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.) + */ + public 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); + } + + public 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() { + // Important side effect: if getVisibleItems is stale it may refresh, + // which can affect action items staleness. + final ArrayList visibleItems = getVisibleItems(); + + 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(); + 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; + } + + public ArrayList getActionItems() { + flagActionItems(); + return mActionItems; + } + + public 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 = ContextCompat.getDrawable(getContext(), 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(ContextMenu.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; + } +} + diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/MenuDialogHelper.java b/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/MenuDialogHelper.java new file mode 100644 index 0000000000..2707abe64e --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/MenuDialogHelper.java @@ -0,0 +1,172 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.view.menu; + +import android.app.AlertDialog; +import android.app.Dialog; +import android.content.DialogInterface; +import android.os.IBinder; +import android.support.v7.appcompat.R; +import android.view.KeyEvent; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; + +/** + * Helper for menus that appear as Dialogs (context and submenus). + * + * @hide + */ +public class MenuDialogHelper implements DialogInterface.OnKeyListener, + DialogInterface.OnClickListener, + DialogInterface.OnDismissListener, + MenuPresenter.Callback { + private MenuBuilder mMenu; + private AlertDialog mDialog; + ListMenuPresenter mPresenter; + private MenuPresenter.Callback mPresenterCallback; + + public MenuDialogHelper(MenuBuilder menu) { + mMenu = menu; + } + + /** + * Shows menu as a dialog. + * + * @param windowToken Optional token to assign to the window. + */ + public void show(IBinder windowToken) { + // Many references to mMenu, create local reference + final MenuBuilder menu = mMenu; + + // Get the builder for the dialog + final AlertDialog.Builder builder = new AlertDialog.Builder(menu.getContext()); + + // Need to force Light Menu theme as list_menu_item_layout is usually against a dark bg and + // AlertDialog's bg is white + mPresenter = new ListMenuPresenter(R.layout.abc_list_menu_item_layout, + R.style.Theme_AppCompat_CompactMenu); + + mPresenter.setCallback(this); + mMenu.addMenuPresenter(mPresenter); + builder.setAdapter(mPresenter.getAdapter(), this); + + // Set the title + final View headerView = menu.getHeaderView(); + if (headerView != null) { + // Menu's client has given a custom header view, use it + builder.setCustomTitle(headerView); + } else { + // Otherwise use the (text) title and icon + builder.setIcon(menu.getHeaderIcon()).setTitle(menu.getHeaderTitle()); + } + + // Set the key listener + builder.setOnKeyListener(this); + + // Show the menu + mDialog = builder.create(); + mDialog.setOnDismissListener(this); + + 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(); + } + + 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; + } + } + } + } + } + + // Menu shortcut matching + return mMenu.performShortcut(keyCode, event, 0); + + } + + public void setPresenterCallback(MenuPresenter.Callback cb) { + mPresenterCallback = cb; + } + + /** + * Dismisses the menu's dialog. + * + * @see Dialog#dismiss() + */ + public void dismiss() { + if (mDialog != null) { + mDialog.dismiss(); + } + } + + @Override + public void onDismiss(DialogInterface dialog) { + mPresenter.onCloseMenu(mMenu, true); + } + + @Override + public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { + if (allMenusAreClosing || menu == mMenu) { + dismiss(); + } + if (mPresenterCallback != null) { + mPresenterCallback.onCloseMenu(menu, allMenusAreClosing); + } + } + + @Override + public boolean onOpenSubMenu(MenuBuilder subMenu) { + if (mPresenterCallback != null) { + return mPresenterCallback.onOpenSubMenu(subMenu); + } + return false; + } + + public void onClick(DialogInterface dialog, int which) { + mMenu.performItemAction((MenuItemImpl) mPresenter.getAdapter().getItem(which), 0); + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/MenuItemImpl.java b/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/MenuItemImpl.java new file mode 100644 index 0000000000..a2e9783c53 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/MenuItemImpl.java @@ -0,0 +1,743 @@ +/* + * 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 android.support.v7.internal.view.menu; + +import android.content.ActivityNotFoundException; +import android.content.Context; +import android.content.Intent; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.support.v4.content.ContextCompat; +import android.support.v4.view.ActionProvider; +import android.support.v4.internal.view.SupportMenuItem; +import android.support.v4.view.MenuItemCompat; +import android.support.v7.internal.widget.TintManager; +import android.util.Log; +import android.view.ContextMenu.ContextMenuInfo; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.SubMenu; +import android.view.View; +import android.view.ViewDebug; +import android.widget.LinearLayout; + +/** + * @hide + */ +public final class MenuItemImpl implements SupportMenuItem { + + 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 SupportMenuItem.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 MenuItemCompat.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) { + + /*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; + } + + @Override + public boolean isEnabled() { + return (mFlags & ENABLED) != 0; + } + + @Override + public MenuItem setEnabled(boolean enabled) { + if (enabled) { + mFlags |= ENABLED; + } else { + mFlags &= ~ENABLED; + } + + mMenu.onItemsChanged(false); + + return this; + } + + @Override + public int getGroupId() { + return mGroup; + } + + @Override + @ViewDebug.CapturedViewProperty + public int getItemId() { + return mId; + } + + @Override + public int getOrder() { + return mCategoryOrder; + } + + public int getOrdering() { + return mOrdering; + } + + @Override + public Intent getIntent() { + return mIntent; + } + + @Override + public MenuItem setIntent(Intent intent) { + mIntent = intent; + return this; + } + + Runnable getCallback() { + return mItemCallback; + } + + public MenuItem setCallback(Runnable callback) { + mItemCallback = callback; + return this; + } + + @Override + public char getAlphabeticShortcut() { + return mShortcutAlphabeticChar; + } + + @Override + public MenuItem setAlphabeticShortcut(char alphaChar) { + if (mShortcutAlphabeticChar == alphaChar) { + return this; + } + + mShortcutAlphabeticChar = Character.toLowerCase(alphaChar); + + mMenu.onItemsChanged(false); + + return this; + } + + @Override + public char getNumericShortcut() { + return mShortcutNumericChar; + } + + @Override + public MenuItem setNumericShortcut(char numericChar) { + if (mShortcutNumericChar == numericChar) { + return this; + } + + mShortcutNumericChar = numericChar; + + mMenu.onItemsChanged(false); + + return this; + } + + @Override + 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); + } + + @Override + public SubMenu getSubMenu() { + return mSubMenu; + } + + @Override + public boolean hasSubMenu() { + return mSubMenu != null; + } + + void setSubMenu(SubMenuBuilder subMenu) { + mSubMenu = subMenu; + + subMenu.setHeaderTitle(getTitle()); + } + + @Override + @ViewDebug.CapturedViewProperty + public CharSequence getTitle() { + return mTitle; + } + + /** + * Gets the title for a particular {@link MenuView.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(); + } + + @Override + public MenuItem setTitle(CharSequence title) { + mTitle = title; + + mMenu.onItemsChanged(false); + + if (mSubMenu != null) { + mSubMenu.setHeaderTitle(title); + } + + return this; + } + + @Override + public MenuItem setTitle(int title) { + return setTitle(mMenu.getContext().getString(title)); + } + + @Override + public CharSequence getTitleCondensed() { + final CharSequence ctitle = mTitleCondensed != null ? mTitleCondensed : mTitle; + + if (Build.VERSION.SDK_INT < 18 && ctitle != null && !(ctitle instanceof String)) { + // For devices pre-JB-MR2, where we have a non-String CharSequence, we need to + // convert this to a String so that EventLog.writeEvent() does not throw an exception + // in Activity.onMenuItemSelected() + return ctitle.toString(); + } else { + // Else, we just return the condensed title + return ctitle; + } + } + + @Override + 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; + } + + @Override + public Drawable getIcon() { + if (mIconDrawable != null) { + return mIconDrawable; + } + + if (mIconResId != NO_ICON) { + Drawable icon = TintManager.getDrawable(mMenu.getContext(), mIconResId); + mIconResId = NO_ICON; + mIconDrawable = icon; + return icon; + } + + return null; + } + + @Override + public MenuItem setIcon(Drawable icon) { + mIconResId = NO_ICON; + mIconDrawable = icon; + mMenu.onItemsChanged(false); + + return this; + } + + @Override + 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; + } + + @Override + public boolean isCheckable() { + return (mFlags & CHECKABLE) == CHECKABLE; + } + + @Override + 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; + } + + @Override + public boolean isChecked() { + return (mFlags & CHECKED) == CHECKED; + } + + @Override + 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); + } + } + + @Override + public boolean isVisible() { + if (mActionProvider != null && mActionProvider.overridesItemVisibility()) { + return (mFlags & HIDDEN) == 0 && mActionProvider.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; + } + + @Override + 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; + } + + @Override + public MenuItem setOnMenuItemClickListener(MenuItem.OnMenuItemClickListener clickListener) { + mClickListener = clickListener; + return this; + } + + @Override + public String toString() { + return mTitle.toString(); + } + + void setMenuInfo(ContextMenuInfo menuInfo) { + mMenuInfo = menuInfo; + } + + @Override + 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; + } + + @Override + 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); + } + + @Override + public SupportMenuItem 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; + } + + @Override + public SupportMenuItem setActionView(int resId) { + final Context context = mMenu.getContext(); + final LayoutInflater inflater = LayoutInflater.from(context); + setActionView(inflater.inflate(resId, new LinearLayout(context), false)); + return this; + } + + @Override + public View getActionView() { + if (mActionView != null) { + return mActionView; + } else if (mActionProvider != null) { + mActionView = mActionProvider.onCreateActionView(this); + return mActionView; + } else { + return null; + } + } + + @Override + public MenuItem setActionProvider(android.view.ActionProvider actionProvider) { + throw new UnsupportedOperationException( + "This is not supported, use MenuItemCompat.setActionProvider()"); + } + + @Override + public android.view.ActionProvider getActionProvider() { + throw new UnsupportedOperationException( + "This is not supported, use MenuItemCompat.getActionProvider()"); + } + + @Override + public ActionProvider getSupportActionProvider() { + return mActionProvider; + } + + @Override + public SupportMenuItem setSupportActionProvider(ActionProvider actionProvider) { + if (mActionProvider != null) { + mActionProvider.setVisibilityListener(null); + } + mActionView = null; + mActionProvider = actionProvider; + mMenu.onItemsChanged(true); // Measurement can be changed + if (mActionProvider != null) { + mActionProvider.setVisibilityListener(new ActionProvider.VisibilityListener() { + @Override + public void onActionProviderVisibilityChanged(boolean isVisible) { + mMenu.onItemVisibleChanged(MenuItemImpl.this); + } + }); + } + return this; + } + + @Override + public SupportMenuItem setShowAsActionFlags(int actionEnum) { + setShowAsAction(actionEnum); + return this; + } + + @Override + public boolean expandActionView() { + if (!hasCollapsibleActionView()) { + 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 SupportMenuItem setSupportOnActionExpandListener( + MenuItemCompat.OnActionExpandListener listener) { + mOnActionExpandListener = listener; + return this; + } + + public boolean hasCollapsibleActionView() { + if ((mShowAsAction & SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW) != 0) { + if (mActionView == null && mActionProvider != null) { + mActionView = mActionProvider.onCreateActionView(this); + } + return mActionView != null; + } + return false; + } + + public void setActionViewExpanded(boolean isExpanded) { + mIsActionViewExpanded = isExpanded; + mMenu.onItemsChanged(false); + } + + @Override + public boolean isActionViewExpanded() { + return mIsActionViewExpanded; + } + + @Override + public MenuItem setOnActionExpandListener(MenuItem.OnActionExpandListener listener) { + throw new UnsupportedOperationException( + "This is not supported, use MenuItemCompat.setOnActionExpandListener()"); + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/MenuItemWrapperICS.java b/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/MenuItemWrapperICS.java new file mode 100644 index 0000000000..3e6a99aa29 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/MenuItemWrapperICS.java @@ -0,0 +1,401 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.view.menu; + +import android.annotation.TargetApi; +import android.content.Context; +import android.content.Intent; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.support.v4.internal.view.SupportMenuItem; +import android.support.v4.view.ActionProvider; +import android.support.v4.view.MenuItemCompat; +import android.support.v7.view.CollapsibleActionView; +import android.util.Log; +import android.view.ContextMenu; +import android.view.MenuItem; +import android.view.SubMenu; +import android.view.View; +import android.widget.FrameLayout; + +import java.lang.reflect.Method; + +/** + * Wraps a support {@link SupportMenuItem} as a framework {@link android.view.MenuItem} + * @hide + */ +@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) +public class MenuItemWrapperICS extends BaseMenuWrapper implements MenuItem { + static final String LOG_TAG = "MenuItemWrapper"; + + // Reflection Method to call setExclusiveCheckable + private Method mSetExclusiveCheckableMethod; + + MenuItemWrapperICS(Context context, SupportMenuItem object) { + super(context, object); + } + + @Override + public int getItemId() { + return mWrappedObject.getItemId(); + } + + @Override + public int getGroupId() { + return mWrappedObject.getGroupId(); + } + + @Override + public int getOrder() { + return mWrappedObject.getOrder(); + } + + @Override + public MenuItem setTitle(CharSequence title) { + mWrappedObject.setTitle(title); + return this; + } + + @Override + public MenuItem setTitle(int title) { + mWrappedObject.setTitle(title); + return this; + } + + @Override + public CharSequence getTitle() { + return mWrappedObject.getTitle(); + } + + @Override + public MenuItem setTitleCondensed(CharSequence title) { + mWrappedObject.setTitleCondensed(title); + return this; + } + + @Override + public CharSequence getTitleCondensed() { + return mWrappedObject.getTitleCondensed(); + } + + @Override + public MenuItem setIcon(Drawable icon) { + mWrappedObject.setIcon(icon); + return this; + } + + @Override + public MenuItem setIcon(int iconRes) { + mWrappedObject.setIcon(iconRes); + return this; + } + + @Override + public Drawable getIcon() { + return mWrappedObject.getIcon(); + } + + @Override + public MenuItem setIntent(Intent intent) { + mWrappedObject.setIntent(intent); + return this; + } + + @Override + public Intent getIntent() { + return mWrappedObject.getIntent(); + } + + @Override + public MenuItem setShortcut(char numericChar, char alphaChar) { + mWrappedObject.setShortcut(numericChar, alphaChar); + return this; + } + + @Override + public MenuItem setNumericShortcut(char numericChar) { + mWrappedObject.setNumericShortcut(numericChar); + return this; + } + + @Override + public char getNumericShortcut() { + return mWrappedObject.getNumericShortcut(); + } + + @Override + public MenuItem setAlphabeticShortcut(char alphaChar) { + mWrappedObject.setAlphabeticShortcut(alphaChar); + return this; + } + + @Override + public char getAlphabeticShortcut() { + return mWrappedObject.getAlphabeticShortcut(); + } + + @Override + public MenuItem setCheckable(boolean checkable) { + mWrappedObject.setCheckable(checkable); + return this; + } + + @Override + public boolean isCheckable() { + return mWrappedObject.isCheckable(); + } + + @Override + public MenuItem setChecked(boolean checked) { + mWrappedObject.setChecked(checked); + return this; + } + + @Override + public boolean isChecked() { + return mWrappedObject.isChecked(); + } + + @Override + public MenuItem setVisible(boolean visible) { + return mWrappedObject.setVisible(visible); + } + + @Override + public boolean isVisible() { + return mWrappedObject.isVisible(); + } + + @Override + public MenuItem setEnabled(boolean enabled) { + mWrappedObject.setEnabled(enabled); + return this; + } + + @Override + public boolean isEnabled() { + return mWrappedObject.isEnabled(); + } + + @Override + public boolean hasSubMenu() { + return mWrappedObject.hasSubMenu(); + } + + @Override + public SubMenu getSubMenu() { + return getSubMenuWrapper(mWrappedObject.getSubMenu()); + } + + @Override + public MenuItem setOnMenuItemClickListener(OnMenuItemClickListener menuItemClickListener) { + mWrappedObject.setOnMenuItemClickListener(menuItemClickListener != null ? + new OnMenuItemClickListenerWrapper(menuItemClickListener) : null); + return this; + } + + @Override + public ContextMenu.ContextMenuInfo getMenuInfo() { + return mWrappedObject.getMenuInfo(); + } + + @Override + public void setShowAsAction(int actionEnum) { + mWrappedObject.setShowAsAction(actionEnum); + } + + @Override + public MenuItem setShowAsActionFlags(int actionEnum) { + mWrappedObject.setShowAsActionFlags(actionEnum); + return this; + } + + @Override + public MenuItem setActionView(View view) { + if (view instanceof android.view.CollapsibleActionView) { + view = new CollapsibleActionViewWrapper(view); + } + mWrappedObject.setActionView(view); + return this; + } + + @Override + public MenuItem setActionView(int resId) { + // Make framework menu item inflate the view + mWrappedObject.setActionView(resId); + + View actionView = mWrappedObject.getActionView(); + if (actionView instanceof android.view.CollapsibleActionView) { + // If the inflated Action View is support-collapsible, wrap it + mWrappedObject.setActionView(new CollapsibleActionViewWrapper(actionView)); + } + return this; + } + + @Override + public View getActionView() { + View actionView = mWrappedObject.getActionView(); + if (actionView instanceof CollapsibleActionViewWrapper) { + return ((CollapsibleActionViewWrapper) actionView).getWrappedView(); + } + return actionView; + } + + @Override + public MenuItem setActionProvider(android.view.ActionProvider provider) { + mWrappedObject.setSupportActionProvider( + provider != null ? createActionProviderWrapper(provider) : null); + return this; + } + + @Override + public android.view.ActionProvider getActionProvider() { + ActionProvider provider = mWrappedObject.getSupportActionProvider(); + if (provider instanceof ActionProviderWrapper) { + return ((ActionProviderWrapper) provider).mInner; + } + return null; + } + + @Override + public boolean expandActionView() { + return mWrappedObject.expandActionView(); + } + + @Override + public boolean collapseActionView() { + return mWrappedObject.collapseActionView(); + } + + @Override + public boolean isActionViewExpanded() { + return mWrappedObject.isActionViewExpanded(); + } + + @Override + public MenuItem setOnActionExpandListener(MenuItem.OnActionExpandListener listener) { + mWrappedObject.setSupportOnActionExpandListener(listener != null ? + new OnActionExpandListenerWrapper(listener) : null); + return this; + } + + public void setExclusiveCheckable(boolean checkable) { + try { + if (mSetExclusiveCheckableMethod == null) { + mSetExclusiveCheckableMethod = mWrappedObject.getClass() + .getDeclaredMethod("setExclusiveCheckable", Boolean.TYPE); + } + mSetExclusiveCheckableMethod.invoke(mWrappedObject, checkable); + } catch (Exception e) { + Log.w(LOG_TAG, "Error while calling setExclusiveCheckable", e); + } + } + + ActionProviderWrapper createActionProviderWrapper(android.view.ActionProvider provider) { + return new ActionProviderWrapper(mContext, provider); + } + + private class OnMenuItemClickListenerWrapper extends BaseWrapper + implements android.view.MenuItem.OnMenuItemClickListener { + + OnMenuItemClickListenerWrapper(OnMenuItemClickListener object) { + super(object); + } + + @Override + public boolean onMenuItemClick(android.view.MenuItem item) { + return mWrappedObject.onMenuItemClick(getMenuItemWrapper(item)); + } + } + + private class OnActionExpandListenerWrapper extends BaseWrapper + implements MenuItemCompat.OnActionExpandListener { + + OnActionExpandListenerWrapper(MenuItem.OnActionExpandListener object) { + super(object); + } + + @Override + public boolean onMenuItemActionExpand(android.view.MenuItem item) { + return mWrappedObject.onMenuItemActionExpand(getMenuItemWrapper(item)); + } + + @Override + public boolean onMenuItemActionCollapse(android.view.MenuItem item) { + return mWrappedObject.onMenuItemActionCollapse(getMenuItemWrapper(item)); + } + } + + class ActionProviderWrapper extends android.support.v4.view.ActionProvider { + final android.view.ActionProvider mInner; + + public ActionProviderWrapper(Context context, android.view.ActionProvider inner) { + super(context); + mInner = inner; + } + + @Override + public View onCreateActionView() { + return mInner.onCreateActionView(); + } + + @Override + public boolean onPerformDefaultAction() { + return mInner.onPerformDefaultAction(); + } + + @Override + public boolean hasSubMenu() { + return mInner.hasSubMenu(); + } + + @Override + public void onPrepareSubMenu(android.view.SubMenu subMenu) { + mInner.onPrepareSubMenu(getSubMenuWrapper(subMenu)); + } + } + + /** + * Wrap a support {@link android.support.v7.view.CollapsibleActionView} into a framework + * {@link android.view.CollapsibleActionView}. + */ + static class CollapsibleActionViewWrapper extends FrameLayout + implements CollapsibleActionView { + + final android.view.CollapsibleActionView mWrappedView; + + CollapsibleActionViewWrapper(View actionView) { + super(actionView.getContext()); + mWrappedView = (android.view.CollapsibleActionView) actionView; + addView(actionView); + } + + @Override + public void onActionViewExpanded() { + mWrappedView.onActionViewExpanded(); + } + + @Override + public void onActionViewCollapsed() { + mWrappedView.onActionViewCollapsed(); + } + + View getWrappedView() { + return (View) mWrappedView; + } + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/MenuItemWrapperJB.java b/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/MenuItemWrapperJB.java new file mode 100644 index 0000000000..4dbb0e0fbf --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/MenuItemWrapperJB.java @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.view.menu; + +import android.annotation.TargetApi; +import android.content.Context; +import android.os.Build; +import android.support.v4.internal.view.SupportMenuItem; +import android.support.v4.view.ActionProvider; +import android.view.MenuItem; +import android.view.View; + +/** + * Wraps a support {@link SupportMenuItem} as a framework {@link android.view.MenuItem} + * @hide + */ +@TargetApi(Build.VERSION_CODES.JELLY_BEAN) +class MenuItemWrapperJB extends MenuItemWrapperICS { + + MenuItemWrapperJB(Context context, SupportMenuItem object) { + super(context, object); + } + + @Override + ActionProviderWrapper createActionProviderWrapper(android.view.ActionProvider provider) { + return new ActionProviderWrapperJB(mContext, provider); + } + + class ActionProviderWrapperJB extends ActionProviderWrapper + implements android.view.ActionProvider.VisibilityListener { + ActionProvider.VisibilityListener mListener; + + public ActionProviderWrapperJB(Context context, android.view.ActionProvider inner) { + super(context, inner); + } + + @Override + public View onCreateActionView(MenuItem forItem) { + return mInner.onCreateActionView(forItem); + } + + @Override + public boolean overridesItemVisibility() { + return mInner.overridesItemVisibility(); + } + + @Override + public boolean isVisible() { + return mInner.isVisible(); + } + + @Override + public void refreshVisibility() { + mInner.refreshVisibility(); + } + + @Override + public void setVisibilityListener(ActionProvider.VisibilityListener listener) { + mListener = listener; + mInner.setVisibilityListener(listener != null ? this : null); + } + + @Override + public void onActionProviderVisibilityChanged(boolean isVisible) { + if (mListener != null) { + mListener.onActionProviderVisibilityChanged(isVisible); + } + } + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/MenuPopupHelper.java b/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/MenuPopupHelper.java new file mode 100644 index 0000000000..af7deefe4a --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/MenuPopupHelper.java @@ -0,0 +1,404 @@ +/* + * 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 android.support.v7.internal.view.menu; + +import android.content.Context; +import android.content.res.Resources; +import android.os.Parcelable; +import android.support.v7.appcompat.R; +import android.support.v7.widget.ListPopupWindow; +import android.view.Gravity; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.MenuItem; +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 java.util.ArrayList; + +/** + * 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, + MenuPresenter { + + private static final String TAG = "MenuPopupHelper"; + + static final int ITEM_LAYOUT = R.layout.abc_popup_menu_item_layout; + + private final Context mContext; + private final LayoutInflater mInflater; + private final MenuBuilder mMenu; + private final MenuAdapter mAdapter; + private final boolean mOverflowOnly; + private final int mPopupMaxWidth; + private final int mPopupStyleAttr; + private final int mPopupStyleRes; + + private View mAnchorView; + private ListPopupWindow mPopup; + private ViewTreeObserver mTreeObserver; + private Callback mPresenterCallback; + + boolean mForceShowIcon; + + private ViewGroup mMeasureParent; + + /** Whether the cached content width value is valid. */ + private boolean mHasContentWidth; + + /** Cached content width from {@link #measureContentWidth}. */ + private int mContentWidth; + + private int mDropDownGravity = Gravity.NO_GRAVITY; + + public MenuPopupHelper(Context context, MenuBuilder menu) { + this(context, menu, null, false, R.attr.popupMenuStyle); + } + + public MenuPopupHelper(Context context, MenuBuilder menu, View anchorView) { + this(context, menu, anchorView, false, R.attr.popupMenuStyle); + } + + public MenuPopupHelper(Context context, MenuBuilder menu, View anchorView, + boolean overflowOnly, int popupStyleAttr) { + this(context, menu, anchorView, overflowOnly, popupStyleAttr, 0); + } + + public MenuPopupHelper(Context context, MenuBuilder menu, View anchorView, + boolean overflowOnly, int popupStyleAttr, int popupStyleRes) { + mContext = context; + mInflater = LayoutInflater.from(context); + mMenu = menu; + mAdapter = new MenuAdapter(mMenu); + mOverflowOnly = overflowOnly; + mPopupStyleAttr = popupStyleAttr; + mPopupStyleRes = popupStyleRes; + + final Resources res = context.getResources(); + mPopupMaxWidth = Math.max(res.getDisplayMetrics().widthPixels / 2, + res.getDimensionPixelSize(R.dimen.abc_config_prefDialogWidth)); + + mAnchorView = anchorView; + + // Present the menu using our context, not the menu builder's context. + menu.addMenuPresenter(this, context); + } + + public void setAnchorView(View anchor) { + mAnchorView = anchor; + } + + public void setForceShowIcon(boolean forceShow) { + mForceShowIcon = forceShow; + } + + public void setGravity(int gravity) { + mDropDownGravity = gravity; + } + + public void show() { + if (!tryShow()) { + throw new IllegalStateException("MenuPopupHelper cannot be used without an anchor"); + } + } + + public ListPopupWindow getPopup() { + return mPopup; + } + + public boolean tryShow() { + mPopup = new ListPopupWindow(mContext, null, mPopupStyleAttr, mPopupStyleRes); + mPopup.setOnDismissListener(this); + mPopup.setOnItemClickListener(this); + 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); + mPopup.setAnchorView(anchor); + mPopup.setDropDownGravity(mDropDownGravity); + } else { + return false; + } + + if (!mHasContentWidth) { + mContentWidth = measureContentWidth(); + mHasContentWidth = true; + } + + mPopup.setContentWidth(mContentWidth); + 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; + } + } + + 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() { + // Menus don't tend to be long, so this is more sane than it looks. + int maxWidth = 0; + View itemView = null; + int itemType = 0; + + final ListAdapter adapter = mAdapter; + 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); + + final int itemWidth = itemView.getMeasuredWidth(); + if (itemWidth >= mPopupMaxWidth) { + return mPopupMaxWidth; + } else if (itemWidth > maxWidth) { + maxWidth = itemWidth; + } + } + + return maxWidth; + } + + @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 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) { + mHasContentWidth = false; + + 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); + 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; + 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; + } + + @Override + public void notifyDataSetChanged() { + findExpandedIndex(); + super.notifyDataSetChanged(); + } + } +} + diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/MenuPresenter.java b/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/MenuPresenter.java new file mode 100644 index 0000000000..4e92426153 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/MenuPresenter.java @@ -0,0 +1,153 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.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. + * + * @hide + */ +public interface MenuPresenter { + + /** + * Called by menu implementation to notify another component of open/close events. + * + * @hide + */ + 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, MenuBuilder)}. + * + * @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/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/MenuView.java b/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/MenuView.java new file mode 100644 index 0000000000..7a3aabccbd --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/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 android.support.v7.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/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/MenuWrapperFactory.java b/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/MenuWrapperFactory.java new file mode 100644 index 0000000000..7435874758 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/MenuWrapperFactory.java @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.view.menu; + +import android.content.Context; +import android.os.Build; +import android.support.v4.internal.view.SupportMenu; +import android.support.v4.internal.view.SupportMenuItem; +import android.support.v4.internal.view.SupportSubMenu; +import android.view.Menu; +import android.view.MenuItem; +import android.view.SubMenu; + +/** + * @hide + */ +public final class MenuWrapperFactory { + private MenuWrapperFactory() { + } + + public static Menu wrapSupportMenu(Context context, SupportMenu supportMenu) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { + return new MenuWrapperICS(context, supportMenu); + } + throw new UnsupportedOperationException(); + } + + public static MenuItem wrapSupportMenuItem(Context context, SupportMenuItem supportMenuItem) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + return new MenuItemWrapperJB(context, supportMenuItem); + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { + return new MenuItemWrapperICS(context, supportMenuItem); + } + throw new UnsupportedOperationException(); + } + + public static SubMenu wrapSupportSubMenu(Context context, SupportSubMenu supportSubMenu) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { + return new SubMenuWrapperICS(context, supportSubMenu); + } + throw new UnsupportedOperationException(); + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/MenuWrapperICS.java b/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/MenuWrapperICS.java new file mode 100644 index 0000000000..79833f5c3a --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/MenuWrapperICS.java @@ -0,0 +1,177 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.view.menu; + +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.support.v4.internal.view.SupportMenu; +import android.support.v4.internal.view.SupportMenuItem; +import android.view.KeyEvent; +import android.view.Menu; +import android.view.MenuItem; +import android.view.SubMenu; + +/** + * Wraps a support {@link SupportMenu} as a framework {@link android.view.Menu} + * @hide + */ +class MenuWrapperICS extends BaseMenuWrapper implements Menu { + + MenuWrapperICS(Context context, SupportMenu object) { + super(context, object); + } + + @Override + public MenuItem add(CharSequence title) { + return getMenuItemWrapper(mWrappedObject.add(title)); + } + + @Override + public MenuItem add(int titleRes) { + return getMenuItemWrapper(mWrappedObject.add(titleRes)); + } + + @Override + public MenuItem add(int groupId, int itemId, int order, CharSequence title) { + return getMenuItemWrapper(mWrappedObject.add(groupId, itemId, order, title)); + } + + @Override + public MenuItem add(int groupId, int itemId, int order, int titleRes) { + return getMenuItemWrapper(mWrappedObject.add(groupId, itemId, order, titleRes)); + } + + @Override + public SubMenu addSubMenu(CharSequence title) { + return getSubMenuWrapper(mWrappedObject.addSubMenu(title)); + } + + @Override + public SubMenu addSubMenu(int titleRes) { + return getSubMenuWrapper(mWrappedObject.addSubMenu(titleRes)); + } + + @Override + public SubMenu addSubMenu(int groupId, int itemId, int order, CharSequence title) { + return getSubMenuWrapper(mWrappedObject.addSubMenu(groupId, itemId, order, title)); + } + + @Override + public SubMenu addSubMenu(int groupId, int itemId, int order, int titleRes) { + return getSubMenuWrapper( + mWrappedObject.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) { + android.view.MenuItem[] items = null; + if (outSpecificItems != null) { + items = new android.view.MenuItem[outSpecificItems.length]; + } + + int result = mWrappedObject + .addIntentOptions(groupId, itemId, order, caller, specifics, intent, flags, items); + + if (items != null) { + for (int i = 0, z = items.length; i < z; i++) { + outSpecificItems[i] = getMenuItemWrapper(items[i]); + } + } + + return result; + } + + @Override + public void removeItem(int id) { + internalRemoveItem(id); + mWrappedObject.removeItem(id); + } + + @Override + public void removeGroup(int groupId) { + internalRemoveGroup(groupId); + mWrappedObject.removeGroup(groupId); + } + + @Override + public void clear() { + internalClear(); + mWrappedObject.clear(); + } + + @Override + public void setGroupCheckable(int group, boolean checkable, boolean exclusive) { + mWrappedObject.setGroupCheckable(group, checkable, exclusive); + } + + @Override + public void setGroupVisible(int group, boolean visible) { + mWrappedObject.setGroupVisible(group, visible); + } + + @Override + public void setGroupEnabled(int group, boolean enabled) { + mWrappedObject.setGroupEnabled(group, enabled); + } + + @Override + public boolean hasVisibleItems() { + return mWrappedObject.hasVisibleItems(); + } + + @Override + public MenuItem findItem(int id) { + return getMenuItemWrapper(mWrappedObject.findItem(id)); + } + + @Override + public int size() { + return mWrappedObject.size(); + } + + @Override + public MenuItem getItem(int index) { + return getMenuItemWrapper(mWrappedObject.getItem(index)); + } + + @Override + public void close() { + mWrappedObject.close(); + } + + @Override + public boolean performShortcut(int keyCode, KeyEvent event, int flags) { + return mWrappedObject.performShortcut(keyCode, event, flags); + } + + @Override + public boolean isShortcutKey(int keyCode, KeyEvent event) { + return mWrappedObject.isShortcutKey(keyCode, event); + } + + @Override + public boolean performIdentifierAction(int id, int flags) { + return mWrappedObject.performIdentifierAction(id, flags); + } + + @Override + public void setQwertyMode(boolean isQwerty) { + mWrappedObject.setQwertyMode(isQwerty); + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/SubMenuBuilder.java b/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/SubMenuBuilder.java new file mode 100644 index 0000000000..90bf77f2c7 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/SubMenuBuilder.java @@ -0,0 +1,141 @@ +/* + * 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 android.support.v7.internal.view.menu; + +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.support.v4.content.ContextCompat; +import android.view.Menu; +import android.view.MenuItem; +import android.view.SubMenu; +import android.view.View; + +/** + * The model for a sub menu, which is an extension of the menu. Most methods are proxied to the + * parent menu. + * + * @hide + */ +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) { + super.setHeaderIconInt(icon); + return this; + } + + public SubMenu setHeaderIcon(int iconRes) { + super.setHeaderIconInt(ContextCompat.getDrawable(getContext(), iconRes)); + return this; + } + + public SubMenu setHeaderTitle(CharSequence title) { + super.setHeaderTitleInt(title); + return this; + } + + public SubMenu setHeaderTitle(int titleRes) { + super.setHeaderTitleInt(getContext().getResources().getString(titleRes)); + return this; + } + + public SubMenu setHeaderView(View view) { + super.setHeaderViewInt(view); + return this; + } + + @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/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/SubMenuWrapperICS.java b/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/SubMenuWrapperICS.java new file mode 100644 index 0000000000..a4306e996b --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/view/menu/SubMenuWrapperICS.java @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.view.menu; + +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.support.v4.internal.view.SupportSubMenu; +import android.view.MenuItem; +import android.view.SubMenu; +import android.view.View; + +/** + * Wraps a support {@link SupportSubMenu} as a framework {@link android.view.SubMenu} + * @hide + */ +class SubMenuWrapperICS extends MenuWrapperICS implements SubMenu { + + SubMenuWrapperICS(Context context, SupportSubMenu subMenu) { + super(context, subMenu); + } + + @Override + public SupportSubMenu getWrappedObject() { + return (SupportSubMenu) mWrappedObject; + } + + @Override + public SubMenu setHeaderTitle(int titleRes) { + getWrappedObject().setHeaderTitle(titleRes); + return this; + } + + @Override + public SubMenu setHeaderTitle(CharSequence title) { + getWrappedObject().setHeaderTitle(title); + return this; + } + + @Override + public SubMenu setHeaderIcon(int iconRes) { + getWrappedObject().setHeaderIcon(iconRes); + return this; + } + + @Override + public SubMenu setHeaderIcon(Drawable icon) { + getWrappedObject().setHeaderIcon(icon); + return this; + } + + @Override + public SubMenu setHeaderView(View view) { + getWrappedObject().setHeaderView(view); + return this; + } + + @Override + public void clearHeader() { + getWrappedObject().clearHeader(); + } + + @Override + public SubMenu setIcon(int iconRes) { + getWrappedObject().setIcon(iconRes); + return this; + } + + @Override + public SubMenu setIcon(Drawable icon) { + getWrappedObject().setIcon(icon); + return this; + } + + @Override + public MenuItem getItem() { + return getMenuItemWrapper(getWrappedObject().getItem()); + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/AbsActionBarView.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/AbsActionBarView.java new file mode 100644 index 0000000000..0d06065ec7 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/AbsActionBarView.java @@ -0,0 +1,288 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package android.support.v7.internal.widget; + +import android.content.Context; +import android.content.res.Configuration; +import android.content.res.TypedArray; +import android.os.Build; +import android.support.v4.view.ViewCompat; +import android.support.v4.view.ViewPropertyAnimatorCompat; +import android.support.v4.view.ViewPropertyAnimatorListener; +import android.support.v7.appcompat.R; +import android.support.v7.internal.view.ViewPropertyAnimatorCompatSet; +import android.support.v7.widget.ActionMenuPresenter; +import android.support.v7.widget.ActionMenuView; +import android.util.AttributeSet; +import android.util.TypedValue; +import android.view.ContextThemeWrapper; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.DecelerateInterpolator; +import android.view.animation.Interpolator; + +abstract class AbsActionBarView extends ViewGroup { + private static final Interpolator sAlphaInterpolator = new DecelerateInterpolator(); + + private static final int FADE_DURATION = 200; + + protected final VisibilityAnimListener mVisAnimListener = new VisibilityAnimListener(); + + /** Context against which to inflate popup menus. */ + protected final Context mPopupContext; + + protected ActionMenuView mMenuView; + protected ActionMenuPresenter mActionMenuPresenter; + protected ViewGroup mSplitView; + protected boolean mSplitActionBar; + protected boolean mSplitWhenNarrow; + protected int mContentHeight; + + protected ViewPropertyAnimatorCompat mVisibilityAnim; + + AbsActionBarView(Context context) { + this(context, null); + } + + AbsActionBarView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + AbsActionBarView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + + final TypedValue tv = new TypedValue(); + if (context.getTheme().resolveAttribute(R.attr.actionBarPopupTheme, tv, true) + && tv.resourceId != 0) { + mPopupContext = new ContextThemeWrapper(context, tv.resourceId); + } else { + mPopupContext = context; + } + } + + @Override + protected void onConfigurationChanged(Configuration newConfig) { + if (Build.VERSION.SDK_INT >= 8) { + 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.ActionBar, + R.attr.actionBarStyle, 0); + setContentHeight(a.getLayoutDimension(R.styleable.ActionBar_height, 0)); + a.recycle(); + + 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 setSplitToolbar(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(ViewGroup 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) { + ViewCompat.setAlpha(this, 0f); + if (mSplitView != null && mMenuView != null) { + ViewCompat.setAlpha(mMenuView, 0f); + } + } + ViewPropertyAnimatorCompat anim = ViewCompat.animate(this).alpha(1f); + anim.setDuration(FADE_DURATION); + anim.setInterpolator(sAlphaInterpolator); + if (mSplitView != null && mMenuView != null) { + ViewPropertyAnimatorCompatSet set = new ViewPropertyAnimatorCompatSet(); + ViewPropertyAnimatorCompat splitAnim = ViewCompat.animate(mMenuView).alpha(1f); + splitAnim.setDuration(FADE_DURATION); + set.setListener(mVisAnimListener.withFinalVisibility(anim, visibility)); + set.play(anim).play(splitAnim); + set.start(); + } else { + anim.setListener(mVisAnimListener.withFinalVisibility(anim, visibility)); + anim.start(); + } + } else { + ViewPropertyAnimatorCompat anim = ViewCompat.animate(this).alpha(0f); + anim.setDuration(FADE_DURATION); + anim.setInterpolator(sAlphaInterpolator); + if (mSplitView != null && mMenuView != null) { + ViewPropertyAnimatorCompatSet set = new ViewPropertyAnimatorCompatSet(); + ViewPropertyAnimatorCompat splitAnim = ViewCompat.animate(mMenuView).alpha(0f); + splitAnim.setDuration(FADE_DURATION); + set.setListener(mVisAnimListener.withFinalVisibility(anim, visibility)); + set.play(anim).play(splitAnim); + set.start(); + } else { + anim.setListener(mVisAnimListener.withFinalVisibility(anim, visibility)); + anim.start(); + } + } + } + + 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 isOverflowMenuShowPending() { + if (mActionMenuPresenter != null) { + return mActionMenuPresenter.isOverflowMenuShowPending(); + } + return false; + } + + public boolean isOverflowReserved() { + return mActionMenuPresenter != null && mActionMenuPresenter.isOverflowReserved(); + } + + public boolean canShowOverflowMenu() { + return isOverflowReserved() && getVisibility() == VISIBLE; + } + + 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); + } + + static protected int next(int x, int val, boolean isRtl) { + return isRtl ? x - val : x + val; + } + + protected int positionChild(View child, int x, int y, int contentHeight, boolean reverse) { + int childWidth = child.getMeasuredWidth(); + int childHeight = child.getMeasuredHeight(); + int childTop = y + (contentHeight - childHeight) / 2; + + if (reverse) { + child.layout(x - childWidth, childTop, x, childTop + childHeight); + } else { + child.layout(x, childTop, x + childWidth, childTop + childHeight); + } + + return (reverse ? -childWidth : childWidth); + } + + protected class VisibilityAnimListener implements ViewPropertyAnimatorListener { + private boolean mCanceled = false; + int mFinalVisibility; + + public VisibilityAnimListener withFinalVisibility(ViewPropertyAnimatorCompat animation, + int visibility) { + mVisibilityAnim = animation; + mFinalVisibility = visibility; + return this; + } + + @Override + public void onAnimationStart(View view) { + setVisibility(VISIBLE); + mCanceled = false; + } + + @Override + public void onAnimationEnd(View view) { + if (mCanceled) return; + + mVisibilityAnim = null; + setVisibility(mFinalVisibility); + if (mSplitView != null && mMenuView != null) { + mMenuView.setVisibility(mFinalVisibility); + } + } + + @Override + public void onAnimationCancel(View view) { + mCanceled = true; + } + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/AbsSpinnerCompat.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/AbsSpinnerCompat.java new file mode 100644 index 0000000000..0ec8e7a7b8 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/AbsSpinnerCompat.java @@ -0,0 +1,451 @@ +/* + * 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 android.support.v7.internal.widget; + +import android.content.Context; +import android.database.DataSetObserver; +import android.graphics.Rect; +import android.os.Parcel; +import android.os.Parcelable; +import android.support.v4.view.ViewCompat; +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. + */ +abstract class AbsSpinnerCompat extends AdapterViewCompat { + SpinnerAdapter mAdapter; + + int mHeightMeasureSpec; + int mWidthMeasureSpec; + + 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; + + AbsSpinnerCompat(Context context) { + super(context); + initAbsSpinner(); + } + + AbsSpinnerCompat(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + AbsSpinnerCompat(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + initAbsSpinner(); + } + + /** + * 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 paddingLeft = getPaddingLeft(); + final int paddingTop = getPaddingTop(); + final int paddingRight = getPaddingRight(); + final int paddingBottom = getPaddingBottom(); + + mSpinnerPadding.left = paddingLeft > mSelectionLeftPadding ? paddingLeft + : mSelectionLeftPadding; + mSpinnerPadding.top = paddingTop > mSelectionTopPadding ? paddingTop + : mSelectionTopPadding; + mSpinnerPadding.right = paddingRight > mSelectionRightPadding ? paddingRight + : mSelectionRightPadding; + mSpinnerPadding.bottom = paddingBottom > mSelectionBottomPadding ? paddingBottom + : 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.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()); + + heightSize = ViewCompat.resolveSizeAndState(preferredHeight, heightMeasureSpec, 0); + widthSize = ViewCompat.resolveSizeAndState(preferredWidth, widthMeasureSpec, 0); + + 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 AbsSpinnerCompat.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 AbsSpinnerCompat#onSaveInstanceState()} + */ + SavedState(Parcelable superState) { + super(superState); + } + + /** + * Constructor called from {@link #CREATOR} + */ + 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(); + } + } +} \ No newline at end of file diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ActionBarBackgroundDrawable.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ActionBarBackgroundDrawable.java new file mode 100644 index 0000000000..6248f798be --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ActionBarBackgroundDrawable.java @@ -0,0 +1,44 @@ +package android.support.v7.internal.widget; + +import android.graphics.Canvas; +import android.graphics.ColorFilter; +import android.graphics.drawable.Drawable; + +class ActionBarBackgroundDrawable extends Drawable { + + final ActionBarContainer mContainer; + + public ActionBarBackgroundDrawable(ActionBarContainer container) { + mContainer = container; + } + + @Override + public void draw(Canvas canvas) { + if (mContainer.mIsSplit) { + if (mContainer.mSplitBackground != null) { + mContainer.mSplitBackground.draw(canvas); + } + } else { + if (mContainer.mBackground != null) { + mContainer.mBackground.draw(canvas); + } + if (mContainer.mStackedBackground != null && mContainer.mIsStacked) { + mContainer.mStackedBackground.draw(canvas); + } + } + } + + @Override + public void setAlpha(int alpha) { + } + + @Override + public void setColorFilter(ColorFilter cf) { + } + + @Override + public int getOpacity() { + return 0; + } + +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ActionBarBackgroundDrawableV21.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ActionBarBackgroundDrawableV21.java new file mode 100644 index 0000000000..19cd5a1998 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ActionBarBackgroundDrawableV21.java @@ -0,0 +1,26 @@ +package android.support.v7.internal.widget; + +import android.graphics.Outline; +import android.graphics.drawable.Drawable; +import android.support.annotation.NonNull; + +class ActionBarBackgroundDrawableV21 extends ActionBarBackgroundDrawable { + + public ActionBarBackgroundDrawableV21(ActionBarContainer container) { + super(container); + } + + @Override + public void getOutline(@NonNull Outline outline) { + if (mContainer.mIsSplit) { + if (mContainer.mSplitBackground != null) { + mContainer.mSplitBackground.getOutline(outline); + } + } else { + // ignore the stacked background for shadow casting + if (mContainer.mBackground != null) { + mContainer.mBackground.getOutline(outline); + } + } + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ActionBarContainer.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ActionBarContainer.java new file mode 100644 index 0000000000..239fe4ce93 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ActionBarContainer.java @@ -0,0 +1,326 @@ +/* + * 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 android.support.v7.internal.widget; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.support.v7.appcompat.R; +import android.support.v7.internal.VersionUtils; +import android.support.v7.view.ActionMode; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; + +/** + * 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 FrameLayout { + private boolean mIsTransitioning; + private View mTabContainer; + private View mActionBarView; + private View mContextView; + + Drawable mBackground; + Drawable mStackedBackground; + Drawable mSplitBackground; + boolean mIsSplit; + boolean mIsStacked; + private int mHeight; + + public ActionBarContainer(Context context) { + this(context, null); + } + + public ActionBarContainer(Context context, AttributeSet attrs) { + super(context, attrs); + + // Set a transparent background so that we project appropriately. + final Drawable bg = VersionUtils.isAtLeastL() + ? new ActionBarBackgroundDrawableV21(this) + : new ActionBarBackgroundDrawable(this); + setBackgroundDrawable(bg); + + TypedArray a = context.obtainStyledAttributes(attrs, + R.styleable.ActionBar); + mBackground = a.getDrawable(R.styleable.ActionBar_background); + mStackedBackground = a.getDrawable( + R.styleable.ActionBar_backgroundStacked); + mHeight = a.getDimensionPixelSize(R.styleable.ActionBar_height, -1); + + if (getId() == R.id.split_action_bar) { + mIsSplit = true; + mSplitBackground = a.getDrawable(R.styleable.ActionBar_backgroundSplit); + } + a.recycle(); + + setWillNotDraw(mIsSplit ? mSplitBackground == null : + mBackground == null && mStackedBackground == null); + } + + @Override + public void onFinishInflate() { + super.onFinishInflate(); + mActionBarView = findViewById(R.id.action_bar); + mContextView = findViewById(R.id.action_context_bar); + } + + public void setPrimaryBackground(Drawable bg) { + if (mBackground != null) { + mBackground.setCallback(null); + unscheduleDrawable(mBackground); + } + mBackground = bg; + if (bg != null) { + bg.setCallback(this); + if (mActionBarView != null) { + mBackground.setBounds(mActionBarView.getLeft(), mActionBarView.getTop(), + mActionBarView.getRight(), mActionBarView.getBottom()); + } + } + setWillNotDraw(mIsSplit ? mSplitBackground == null : + mBackground == null && mStackedBackground == null); + invalidate(); + } + + public void setStackedBackground(Drawable bg) { + if (mStackedBackground != null) { + mStackedBackground.setCallback(null); + unscheduleDrawable(mStackedBackground); + } + mStackedBackground = bg; + if (bg != null) { + bg.setCallback(this); + if ((mIsStacked && mStackedBackground != null)) { + mStackedBackground.setBounds(mTabContainer.getLeft(), mTabContainer.getTop(), + mTabContainer.getRight(), mTabContainer.getBottom()); + } + } + setWillNotDraw(mIsSplit ? mSplitBackground == null : + mBackground == null && mStackedBackground == null); + invalidate(); + } + + public void setSplitBackground(Drawable bg) { + if (mSplitBackground != null) { + mSplitBackground.setCallback(null); + unscheduleDrawable(mSplitBackground); + } + mSplitBackground = bg; + if (bg != null) { + bg.setCallback(this); + if (mIsSplit && mSplitBackground != null) { + mSplitBackground.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight()); + } + } + setWillNotDraw(mIsSplit ? mSplitBackground == null : + mBackground == null && mStackedBackground == null); + invalidate(); + } + + @Override + public void setVisibility(int visibility) { + super.setVisibility(visibility); + final boolean isVisible = visibility == VISIBLE; + if (mBackground != null) mBackground.setVisible(isVisible, false); + if (mStackedBackground != null) mStackedBackground.setVisible(isVisible, false); + if (mSplitBackground != null) mSplitBackground.setVisible(isVisible, false); + } + + @Override + protected boolean verifyDrawable(Drawable who) { + return (who == mBackground && !mIsSplit) || (who == mStackedBackground && mIsStacked) || + (who == mSplitBackground && mIsSplit) || super.verifyDrawable(who); + } + + @Override + protected void drawableStateChanged() { + super.drawableStateChanged(); + if (mBackground != null && mBackground.isStateful()) { + mBackground.setState(getDrawableState()); + } + if (mStackedBackground != null && mStackedBackground.isStateful()) { + mStackedBackground.setState(getDrawableState()); + } + if (mSplitBackground != null && mSplitBackground.isStateful()) { + mSplitBackground.setState(getDrawableState()); + } + } + + public void jumpDrawablesToCurrentState() { + if (Build.VERSION.SDK_INT >= 11) { + super.jumpDrawablesToCurrentState(); + if (mBackground != null) { + mBackground.jumpToCurrentState(); + } + if (mStackedBackground != null) { + mStackedBackground.jumpToCurrentState(); + } + if (mSplitBackground != null) { + mSplitBackground.jumpToCurrentState(); + } + } + } + + /** + * 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; + } + + 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 ActionMode startActionModeForChild(View child, ActionMode.Callback callback) { + // No starting an action mode for an action bar child! (Where would it go?) + return null; + } + + @Override + public android.view.ActionMode startActionModeForChild(View originalView, + android.view.ActionMode.Callback callback) { + return null; + } + + private boolean isCollapsed(View view) { + return view == null || view.getVisibility() == GONE || view.getMeasuredHeight() == 0; + } + + private int getMeasuredHeightWithMargins(View view) { + final LayoutParams lp = (LayoutParams) view.getLayoutParams(); + return view.getMeasuredHeight() + lp.topMargin + lp.bottomMargin; + } + + @Override + public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + if (mActionBarView == null && + MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST && mHeight >= 0) { + heightMeasureSpec = MeasureSpec.makeMeasureSpec( + Math.min(mHeight, MeasureSpec.getSize(heightMeasureSpec)), MeasureSpec.AT_MOST); + } + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + + if (mActionBarView == null) return; + + final int mode = MeasureSpec.getMode(heightMeasureSpec); + if (mTabContainer != null && mTabContainer.getVisibility() != GONE + && mode != MeasureSpec.EXACTLY) { + final int topMarginForTabs; + if (!isCollapsed(mActionBarView)) { + topMarginForTabs = getMeasuredHeightWithMargins(mActionBarView); + } else if (!isCollapsed(mContextView)) { + topMarginForTabs = getMeasuredHeightWithMargins(mContextView); + } else { + topMarginForTabs = 0; + } + final int maxHeight = mode == MeasureSpec.AT_MOST ? + MeasureSpec.getSize(heightMeasureSpec) : Integer.MAX_VALUE; + setMeasuredDimension(getMeasuredWidth(), + Math.min(topMarginForTabs + getMeasuredHeightWithMargins(mTabContainer), + maxHeight)); + } + } + + @Override + public void onLayout(boolean changed, int l, int t, int r, int b) { + super.onLayout(changed, l, t, r, b); + + final View tabContainer = mTabContainer; + final boolean hasTabs = tabContainer != null && tabContainer.getVisibility() != GONE; + + if (tabContainer != null && tabContainer.getVisibility() != GONE) { + final int containerHeight = getMeasuredHeight(); + final LayoutParams lp = (LayoutParams) tabContainer.getLayoutParams(); + final int tabHeight = tabContainer.getMeasuredHeight(); + tabContainer.layout(l, containerHeight - tabHeight - lp.bottomMargin, r, + containerHeight - lp.bottomMargin); + } + + boolean needsInvalidate = false; + if (mIsSplit) { + if (mSplitBackground != null) { + mSplitBackground.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight()); + needsInvalidate = true; + } + } else { + if (mBackground != null) { + if (mActionBarView.getVisibility() == View.VISIBLE) { + mBackground.setBounds(mActionBarView.getLeft(), mActionBarView.getTop(), + mActionBarView.getRight(), mActionBarView.getBottom()); + } else if (mContextView != null && + mContextView.getVisibility() == View.VISIBLE) { + mBackground.setBounds(mContextView.getLeft(), mContextView.getTop(), + mContextView.getRight(), mContextView.getBottom()); + } else { + mBackground.setBounds(0, 0, 0, 0); + } + needsInvalidate = true; + } + mIsStacked = hasTabs; + if (hasTabs && mStackedBackground != null) { + mStackedBackground.setBounds(tabContainer.getLeft(), tabContainer.getTop(), + tabContainer.getRight(), tabContainer.getBottom()); + needsInvalidate = true; + } + } + + if (needsInvalidate) { + invalidate(); + } + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ActionBarContextView.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ActionBarContextView.java new file mode 100644 index 0000000000..97a44ad68e --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ActionBarContextView.java @@ -0,0 +1,546 @@ +/* + * 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 android.support.v7.internal.widget; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.support.v4.view.ViewCompat; +import android.support.v4.view.ViewPropertyAnimatorCompat; +import android.support.v4.view.ViewPropertyAnimatorListener; +import android.support.v7.appcompat.R; +import android.support.v7.internal.view.ViewPropertyAnimatorCompatSet; +import android.support.v7.view.ActionMode; +import android.support.v7.widget.ActionMenuPresenter; +import android.support.v7.widget.ActionMenuView; +import android.support.v7.internal.view.menu.MenuBuilder; +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; + +/** + * @hide + */ +public class ActionBarContextView extends AbsActionBarView implements ViewPropertyAnimatorListener { + private static final String TAG = "ActionBarContextView"; + + private CharSequence mTitle; + private CharSequence mSubtitle; + + private View mClose; + private View mCustomView; + private LinearLayout mTitleLayout; + private TextView mTitleView; + private TextView mSubtitleView; + private int mTitleStyleRes; + private int mSubtitleStyleRes; + private Drawable mSplitBackground; + private boolean mTitleOptional; + private int mCloseItemLayout; + + private ViewPropertyAnimatorCompatSet 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); + + final TintTypedArray a = TintTypedArray.obtainStyledAttributes(context, attrs, + R.styleable.ActionMode, defStyle, 0); + setBackgroundDrawable(a.getDrawable( + R.styleable.ActionMode_background)); + mTitleStyleRes = a.getResourceId( + R.styleable.ActionMode_titleTextStyle, 0); + mSubtitleStyleRes = a.getResourceId( + R.styleable.ActionMode_subtitleTextStyle, 0); + + mContentHeight = a.getLayoutDimension( + R.styleable.ActionMode_height, 0); + + mSplitBackground = a.getDrawable( + R.styleable.ActionMode_backgroundSplit); + + mCloseItemLayout = a.getResourceId( + R.styleable.ActionMode_closeItemLayout, + R.layout.abc_action_mode_close_item_material); + + a.recycle(); + } + + @Override + public void onDetachedFromWindow() { + super.onDetachedFromWindow(); + if (mActionMenuPresenter != null) { + mActionMenuPresenter.hideOverflowMenu(); + mActionMenuPresenter.hideSubMenus(); + } + } + + @Override + public void setSplitToolbar(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.setSplitToolbar(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.abc_action_bar_title_item, this); + mTitleLayout = (LinearLayout) getChildAt(getChildCount() - 1); + mTitleView = (TextView) mTitleLayout.findViewById(R.id.action_bar_title); + mSubtitleView = (TextView) mTitleLayout.findViewById(R.id.action_bar_subtitle); + if (mTitleStyleRes != 0) { + mTitleView.setTextAppearance(getContext(), mTitleStyleRes); + } + if (mSubtitleStyleRes != 0) { + mSubtitleView.setTextAppearance(getContext(), 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(getContext()); + mClose = inflater.inflate(mCloseItemLayout, this, false); + addView(mClose); + } else if (mClose.getParent() == null) { + addView(mClose); + } + + View closeButton = mClose.findViewById(R.id.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(getContext()); + mActionMenuPresenter.setReserveOverflow(true); + + final LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT, + LayoutParams.MATCH_PARENT); + if (!mSplitActionBar) { + menu.addMenuPresenter(mActionMenuPresenter, mPopupContext); + 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, mPopupContext); + 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 ViewPropertyAnimatorCompatSet a = mCurrentAnimation; + if (a != null) { + mCurrentAnimation = null; + a.cancel(); + } + } + + 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) { + if (mTitleOptional) { + final int titleWidthSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); + mTitleLayout.measure(titleWidthSpec, childSpecHeight); + final int titleWidth = mTitleLayout.getMeasuredWidth(); + final boolean titleFits = titleWidth <= availableWidth; + if (titleFits) { + availableWidth -= titleWidth; + } + mTitleLayout.setVisibility(titleFits ? VISIBLE : GONE); + } else { + 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 ViewPropertyAnimatorCompatSet makeInAnimation() { + ViewCompat.setTranslationX(mClose, -mClose.getWidth() - + ((MarginLayoutParams) mClose.getLayoutParams()).leftMargin); + ViewPropertyAnimatorCompat buttonAnimator = ViewCompat.animate(mClose).translationX(0); + buttonAnimator.setDuration(200); + buttonAnimator.setListener(this); + buttonAnimator.setInterpolator(new DecelerateInterpolator()); + + ViewPropertyAnimatorCompatSet set = new ViewPropertyAnimatorCompatSet(); + 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++) { + View child = mMenuView.getChildAt(i); + ViewCompat.setScaleY(child, 0); + ViewPropertyAnimatorCompat a = ViewCompat.animate(child).scaleY(1); + a.setDuration(300); + set.play(a); + } + } + } + + return set; + } + + private ViewPropertyAnimatorCompatSet makeOutAnimation() { + ViewPropertyAnimatorCompat buttonAnimator = ViewCompat.animate(mClose) + .translationX(-mClose.getWidth() - + ((MarginLayoutParams) mClose.getLayoutParams()).leftMargin); + buttonAnimator.setDuration(200); + buttonAnimator.setListener(this); + buttonAnimator.setInterpolator(new DecelerateInterpolator()); + + ViewPropertyAnimatorCompatSet set = new ViewPropertyAnimatorCompatSet(); + set.play(buttonAnimator); + + if (mMenuView != null) { + final int count = mMenuView.getChildCount(); + if (count > 0) { + for (int i = 0; i < 0; i++) { + View child = mMenuView.getChildAt(i); + ViewCompat.setScaleY(child, 1); + ViewPropertyAnimatorCompat a = ViewCompat.animate(child).scaleY(0); + a.setDuration(300); + set.play(a); + } + } + } + + return set; + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + final boolean isLayoutRtl = ViewUtils.isLayoutRtl(this); + int x = isLayoutRtl ? r - l - getPaddingRight() : getPaddingLeft(); + final int y = getPaddingTop(); + final int contentHeight = b - t - getPaddingTop() - getPaddingBottom(); + + if (mClose != null && mClose.getVisibility() != GONE) { + MarginLayoutParams lp = (MarginLayoutParams) mClose.getLayoutParams(); + final int startMargin = (isLayoutRtl ? lp.rightMargin : lp.leftMargin); + final int endMargin = (isLayoutRtl ? lp.leftMargin : lp.rightMargin); + x = next(x, startMargin, isLayoutRtl); + x += positionChild(mClose, x, y, contentHeight, isLayoutRtl); + x = next(x, endMargin, isLayoutRtl); + + if (mAnimateInOnLayout) { + mAnimationMode = ANIMATE_IN; + mCurrentAnimation = makeInAnimation(); + mCurrentAnimation.start(); + mAnimateInOnLayout = false; + } + } + + if (mTitleLayout != null && mCustomView == null && mTitleLayout.getVisibility() != GONE) { + x += positionChild(mTitleLayout, x, y, contentHeight, isLayoutRtl); + } + + if (mCustomView != null) { + x += positionChild(mCustomView, x, y, contentHeight, isLayoutRtl); + } + + x = isLayoutRtl ? getPaddingLeft() : r - l - getPaddingRight(); + + if (mMenuView != null) { + x += positionChild(mMenuView, x, y, contentHeight, !isLayoutRtl); + } + } + + @Override + public void onAnimationStart(View view) { + } + + @Override + public void onAnimationEnd(View view) { + if (mAnimationMode == ANIMATE_OUT) { + killMode(); + } + mAnimationMode = ANIMATE_IDLE; + } + + @Override + public void onAnimationCancel(View view) { + } + + @Override + public boolean shouldDelayChildPressedState() { + return false; + } + + @Override + public void onInitializeAccessibilityEvent(AccessibilityEvent event) { + if (Build.VERSION.SDK_INT >= 14) { + if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) { + // Action mode started + event.setSource(this); + event.setClassName(getClass().getName()); + event.setPackageName(getContext().getPackageName()); + event.setContentDescription(mTitle); + } else { + super.onInitializeAccessibilityEvent(event); + } + } + } + + public void setTitleOptional(boolean titleOptional) { + if (titleOptional != mTitleOptional) { + requestLayout(); + } + mTitleOptional = titleOptional; + } + + public boolean isTitleOptional() { + return mTitleOptional; + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ActionBarOverlayLayout.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ActionBarOverlayLayout.java new file mode 100644 index 0000000000..1332b8b8ed --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ActionBarOverlayLayout.java @@ -0,0 +1,822 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.content.res.Configuration; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.os.Parcelable; +import android.support.v4.view.ViewCompat; +import android.support.v4.view.ViewPropertyAnimatorCompat; +import android.support.v4.view.ViewPropertyAnimatorListener; +import android.support.v4.view.ViewPropertyAnimatorListenerAdapter; +import android.support.v4.widget.ScrollerCompat; +import android.support.v7.appcompat.R; +import android.support.v7.internal.VersionUtils; +import android.support.v7.internal.view.menu.MenuPresenter; +import android.support.v7.widget.Toolbar; +import android.util.AttributeSet; +import android.util.SparseArray; +import android.view.Menu; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; + +/** + * Special layout for the containing of an overlay action bar (and its content) to correctly handle + * fitting system windows when the content has request that its layout ignore them. + * + * @hide + */ +public class ActionBarOverlayLayout extends ViewGroup implements DecorContentParent { + private static final String TAG = "ActionBarOverlayLayout"; + + private int mActionBarHeight; + //private WindowDecorActionBar mActionBar; + private int mWindowVisibility = View.VISIBLE; + + // The main UI elements that we handle the layout of. + private ContentFrameLayout mContent; + private ActionBarContainer mActionBarBottom; + private ActionBarContainer mActionBarTop; + + // Some interior UI elements. + private DecorToolbar mDecorToolbar; + + // Content overlay drawable - generally the action bar's shadow + private Drawable mWindowContentOverlay; + private boolean mIgnoreWindowContentOverlay; + + private boolean mOverlayMode; + private boolean mHasNonEmbeddedTabs; + private boolean mHideOnContentScroll; + private boolean mAnimatingForFling; + private int mHideOnContentScrollReference; + private int mLastSystemUiVisibility; + private final Rect mBaseContentInsets = new Rect(); + private final Rect mLastBaseContentInsets = new Rect(); + private final Rect mContentInsets = new Rect(); + private final Rect mBaseInnerInsets = new Rect(); + private final Rect mInnerInsets = new Rect(); + private final Rect mLastInnerInsets = new Rect(); + + private ActionBarVisibilityCallback mActionBarVisibilityCallback; + + private final int ACTION_BAR_ANIMATE_DELAY = 600; // ms + + private ScrollerCompat mFlingEstimator; + + private ViewPropertyAnimatorCompat mCurrentActionBarTopAnimator; + private ViewPropertyAnimatorCompat mCurrentActionBarBottomAnimator; + + private final ViewPropertyAnimatorListener mTopAnimatorListener + = new ViewPropertyAnimatorListenerAdapter() { + @Override + public void onAnimationEnd(View view) { + mCurrentActionBarTopAnimator = null; + mAnimatingForFling = false; + } + + @Override + public void onAnimationCancel(View view) { + mCurrentActionBarTopAnimator = null; + mAnimatingForFling = false; + } + }; + + private final ViewPropertyAnimatorListener mBottomAnimatorListener = + new ViewPropertyAnimatorListenerAdapter() { + @Override + public void onAnimationEnd(View view) { + mCurrentActionBarBottomAnimator = null; + mAnimatingForFling = false; + } + + @Override + public void onAnimationCancel(View view) { + mCurrentActionBarBottomAnimator = null; + mAnimatingForFling = false; + } + }; + + private final Runnable mRemoveActionBarHideOffset = new Runnable() { + public void run() { + haltActionBarHideOffsetAnimations(); + mCurrentActionBarTopAnimator = ViewCompat.animate(mActionBarTop).translationY(0) + .setListener(mTopAnimatorListener); + if (mActionBarBottom != null && mActionBarBottom.getVisibility() != GONE) { + mCurrentActionBarBottomAnimator = ViewCompat.animate(mActionBarBottom).translationY(0) + .setListener(mBottomAnimatorListener); + } + } + }; + + private final Runnable mAddActionBarHideOffset = new Runnable() { + public void run() { + haltActionBarHideOffsetAnimations(); + mCurrentActionBarTopAnimator = ViewCompat.animate(mActionBarTop) + .translationY(-mActionBarTop.getHeight()) + .setListener(mTopAnimatorListener); + if (mActionBarBottom != null && mActionBarBottom.getVisibility() != GONE) { + mCurrentActionBarBottomAnimator = ViewCompat.animate(mActionBarBottom) + .translationY(mActionBarBottom.getHeight()) + .setListener(mBottomAnimatorListener); + } + } + }; + +// public static final Property ACTION_BAR_HIDE_OFFSET = +// new IntProperty("actionBarHideOffset") { +// +// @Override +// public void setValue(ActionBarOverlayLayout object, int value) { +// object.setActionBarHideOffset(value); +// } +// +// @Override +// public Integer get(ActionBarOverlayLayout object) { +// return object.getActionBarHideOffset(); +// } +// }; + + static final int[] ATTRS = new int [] { + R.attr.actionBarSize, + android.R.attr.windowContentOverlay + }; + + public ActionBarOverlayLayout(Context context) { + super(context); + init(context); + } + + public ActionBarOverlayLayout(Context context, AttributeSet attrs) { + super(context, attrs); + init(context); + } + + private void init(Context context) { + TypedArray ta = getContext().getTheme().obtainStyledAttributes(ATTRS); + mActionBarHeight = ta.getDimensionPixelSize(0, 0); + mWindowContentOverlay = ta.getDrawable(1); + setWillNotDraw(mWindowContentOverlay == null); + ta.recycle(); + + mIgnoreWindowContentOverlay = context.getApplicationInfo().targetSdkVersion < + Build.VERSION_CODES.KITKAT; + + mFlingEstimator = ScrollerCompat.create(context); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + haltActionBarHideOffsetAnimations(); + } + + public void setActionBarVisibilityCallback(ActionBarVisibilityCallback cb) { + mActionBarVisibilityCallback = cb; + if (getWindowToken() != null) { + // This is being initialized after being added to a window; + // make sure to update all state now. + mActionBarVisibilityCallback.onWindowVisibilityChanged(mWindowVisibility); + if (mLastSystemUiVisibility != 0) { + int newVis = mLastSystemUiVisibility; + onWindowSystemUiVisibilityChanged(newVis); + ViewCompat.requestApplyInsets(this); + } + } + } + + public void setOverlayMode(boolean overlayMode) { + mOverlayMode = overlayMode; + + /* + * Drawing the window content overlay was broken before K so starting to draw it + * again unexpectedly will cause artifacts in some apps. They should fix it. + */ + mIgnoreWindowContentOverlay = overlayMode && + getContext().getApplicationInfo().targetSdkVersion < + Build.VERSION_CODES.KITKAT; + } + + public boolean isInOverlayMode() { + return mOverlayMode; + } + + public void setHasNonEmbeddedTabs(boolean hasNonEmbeddedTabs) { + mHasNonEmbeddedTabs = hasNonEmbeddedTabs; + } + + public void setShowingForActionMode(boolean showing) { + // TODO: Add workaround for this +// if (showing) { +// // Here's a fun hack: if the status bar is currently being hidden, +// // and the application has asked for stable content insets, then +// // we will end up with the action mode action bar being shown +// // without the status bar, but moved below where the status bar +// // would be. Not nice. Trying to have this be positioned +// // correctly is not easy (basically we need yet *another* content +// // inset from the window manager to know where to put it), so +// // instead we will just temporarily force the status bar to be shown. +// if ((getWindowSystemUiVisibility() & (SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN +// | SYSTEM_UI_FLAG_LAYOUT_STABLE)) +// == (SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | SYSTEM_UI_FLAG_LAYOUT_STABLE)) { +// setDisabledSystemUiVisibility(SYSTEM_UI_FLAG_FULLSCREEN); +// } +// } else { +// setDisabledSystemUiVisibility(0); +// } + } + + protected void onConfigurationChanged(Configuration newConfig) { + if (Build.VERSION.SDK_INT >= 8) { + super.onConfigurationChanged(newConfig); + } + init(getContext()); + ViewCompat.requestApplyInsets(this); + } + + public void onWindowSystemUiVisibilityChanged(int visible) { + if (Build.VERSION.SDK_INT >= 16) { + super.onWindowSystemUiVisibilityChanged(visible); + } + pullChildren(); + final int diff = mLastSystemUiVisibility ^ visible; + mLastSystemUiVisibility = visible; + final boolean barVisible = (visible & SYSTEM_UI_FLAG_FULLSCREEN) == 0; + final boolean stable = (visible & SYSTEM_UI_FLAG_LAYOUT_STABLE) != 0; + if (mActionBarVisibilityCallback != null) { + // We want the bar to be visible if it is not being hidden, + // or the app has not turned on a stable UI mode (meaning they + // are performing explicit layout around the action bar). + mActionBarVisibilityCallback.enableContentAnimations(!stable); + if (barVisible || !stable) mActionBarVisibilityCallback.showForSystem(); + else mActionBarVisibilityCallback.hideForSystem(); + } + if ((diff & SYSTEM_UI_FLAG_LAYOUT_STABLE) != 0) { + if (mActionBarVisibilityCallback != null) { + ViewCompat.requestApplyInsets(this); + } + } + } + + @Override + protected void onWindowVisibilityChanged(int visibility) { + super.onWindowVisibilityChanged(visibility); + mWindowVisibility = visibility; + if (mActionBarVisibilityCallback != null) { + mActionBarVisibilityCallback.onWindowVisibilityChanged(visibility); + } + } + + private boolean applyInsets(View view, Rect insets, boolean left, boolean top, + boolean bottom, boolean right) { + boolean changed = false; + LayoutParams lp = (LayoutParams)view.getLayoutParams(); + if (left && lp.leftMargin != insets.left) { + changed = true; + lp.leftMargin = insets.left; + } + if (top && lp.topMargin != insets.top) { + changed = true; + lp.topMargin = insets.top; + } + if (right && lp.rightMargin != insets.right) { + changed = true; + lp.rightMargin = insets.right; + } + if (bottom && lp.bottomMargin != insets.bottom) { + changed = true; + lp.bottomMargin = insets.bottom; + } + return changed; + } + + @Override + protected boolean fitSystemWindows(Rect insets) { + pullChildren(); + + final int vis = ViewCompat.getWindowSystemUiVisibility(this); + final boolean stable = (vis & SYSTEM_UI_FLAG_LAYOUT_STABLE) != 0; + final Rect systemInsets = insets; + + // Since we're not the top level view in the window decor, we do not need to + // inset the Action Bars + + boolean changed = false; + mBaseInnerInsets.set(systemInsets); + ViewUtils.computeFitSystemWindows(this, mBaseInnerInsets, mBaseContentInsets); + if (!mLastBaseContentInsets.equals(mBaseContentInsets)) { + changed = true; + mLastBaseContentInsets.set(mBaseContentInsets); + } + + if (changed) { + requestLayout(); + } + + // We don't do any more at this point. To correctly compute the content/inner + // insets in all cases, we need to know the measured size of the various action + // bar elements. fitSystemWindows() happens before the measure pass, so we can't + // do that here. Instead we will take this up in onMeasure(). + return true; + } + + @Override + protected LayoutParams generateDefaultLayoutParams() { + return new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); + } + + @Override + public LayoutParams generateLayoutParams(AttributeSet attrs) { + return new LayoutParams(getContext(), attrs); + } + + @Override + protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) { + return new LayoutParams(p); + } + + @Override + protected boolean checkLayoutParams(ViewGroup.LayoutParams p) { + return p instanceof LayoutParams; + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + pullChildren(); + + int maxHeight = 0; + int maxWidth = 0; + int childState = 0; + + int topInset = 0; + int bottomInset = 0; + + measureChildWithMargins(mActionBarTop, widthMeasureSpec, 0, heightMeasureSpec, 0); + LayoutParams lp = (LayoutParams) mActionBarTop.getLayoutParams(); + maxWidth = Math.max(maxWidth, + mActionBarTop.getMeasuredWidth() + lp.leftMargin + lp.rightMargin); + maxHeight = Math.max(maxHeight, + mActionBarTop.getMeasuredHeight() + lp.topMargin + lp.bottomMargin); + childState = ViewUtils.combineMeasuredStates(childState, + ViewCompat.getMeasuredState(mActionBarTop)); + + // xlarge screen layout doesn't have bottom action bar. + if (mActionBarBottom != null) { + measureChildWithMargins(mActionBarBottom, widthMeasureSpec, 0, heightMeasureSpec, 0); + lp = (LayoutParams) mActionBarBottom.getLayoutParams(); + maxWidth = Math.max(maxWidth, + mActionBarBottom.getMeasuredWidth() + lp.leftMargin + lp.rightMargin); + maxHeight = Math.max(maxHeight, + mActionBarBottom.getMeasuredHeight() + lp.topMargin + lp.bottomMargin); + childState = ViewUtils.combineMeasuredStates(childState, + ViewCompat.getMeasuredState(mActionBarBottom)); + } + + final int vis = ViewCompat.getWindowSystemUiVisibility(this); + final boolean stable = (vis & SYSTEM_UI_FLAG_LAYOUT_STABLE) != 0; + + if (stable) { + // This is the standard space needed for the action bar. For stable measurement, + // we can't depend on the size currently reported by it -- this must remain constant. + topInset = mActionBarHeight; + if (mHasNonEmbeddedTabs) { + final View tabs = mActionBarTop.getTabContainer(); + if (tabs != null) { + // If tabs are not embedded, increase space on top to account for them. + topInset += mActionBarHeight; + } + } + } else if (mActionBarTop.getVisibility() != GONE) { + // This is the space needed on top of the window for all of the action bar + // and tabs. + topInset = mActionBarTop.getMeasuredHeight(); + } + + if (mDecorToolbar.isSplit()) { + // If action bar is split, adjust bottom insets for it. + if (mActionBarBottom != null) { + if (stable) { + bottomInset = mActionBarHeight; + } else { + bottomInset = mActionBarBottom.getMeasuredHeight(); + } + } + } + + // If the window has not requested system UI layout flags, we need to + // make sure its content is not being covered by system UI... though it + // will still be covered by the action bar if they have requested it to + // overlay. + mContentInsets.set(mBaseContentInsets); + mInnerInsets.set(mBaseInnerInsets); + if (!mOverlayMode && !stable) { + mContentInsets.top += topInset; + mContentInsets.bottom += bottomInset; + } else { + mInnerInsets.top += topInset; + mInnerInsets.bottom += bottomInset; + } + applyInsets(mContent, mContentInsets, true, true, true, true); + + if (!mLastInnerInsets.equals(mInnerInsets)) { + // If the inner insets have changed, we need to dispatch this down to + // the app's fitSystemWindows(). We do this before measuring the content + // view to keep the same semantics as the normal fitSystemWindows() call. + mLastInnerInsets.set(mInnerInsets); + + mContent.dispatchFitSystemWindows(mInnerInsets); + } + + measureChildWithMargins(mContent, widthMeasureSpec, 0, heightMeasureSpec, 0); + lp = (LayoutParams) mContent.getLayoutParams(); + maxWidth = Math.max(maxWidth, + mContent.getMeasuredWidth() + lp.leftMargin + lp.rightMargin); + maxHeight = Math.max(maxHeight, + mContent.getMeasuredHeight() + lp.topMargin + lp.bottomMargin); + childState = ViewUtils.combineMeasuredStates(childState, + ViewCompat.getMeasuredState(mContent)); + + // Account for padding too + maxWidth += getPaddingLeft() + getPaddingRight(); + maxHeight += getPaddingTop() + getPaddingBottom(); + + // Check against our minimum height and width + maxHeight = Math.max(maxHeight, getSuggestedMinimumHeight()); + maxWidth = Math.max(maxWidth, getSuggestedMinimumWidth()); + + setMeasuredDimension( + ViewCompat.resolveSizeAndState(maxWidth, widthMeasureSpec, childState), + ViewCompat.resolveSizeAndState(maxHeight, heightMeasureSpec, + childState << MEASURED_HEIGHT_STATE_SHIFT)); + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + final int count = getChildCount(); + + final int parentLeft = getPaddingLeft(); + final int parentRight = right - left - getPaddingRight(); + + final int parentTop = getPaddingTop(); + final int parentBottom = bottom - top - getPaddingBottom(); + + for (int i = 0; i < count; i++) { + final View child = getChildAt(i); + if (child.getVisibility() != GONE) { + final LayoutParams lp = (LayoutParams) child.getLayoutParams(); + + final int width = child.getMeasuredWidth(); + final int height = child.getMeasuredHeight(); + + int childLeft = parentLeft + lp.leftMargin; + int childTop; + if (child == mActionBarBottom) { + childTop = parentBottom - height - lp.bottomMargin; + } else { + childTop = parentTop + lp.topMargin; + } + + child.layout(childLeft, childTop, childLeft + width, childTop + height); + } + } + } + + @Override + public void draw(Canvas c) { + super.draw(c); + if (mWindowContentOverlay != null && !mIgnoreWindowContentOverlay) { + final int top = mActionBarTop.getVisibility() == VISIBLE ? + (int) (mActionBarTop.getBottom() + ViewCompat.getTranslationY(mActionBarTop) + 0.5f) + : 0; + mWindowContentOverlay.setBounds(0, top, getWidth(), + top + mWindowContentOverlay.getIntrinsicHeight()); + mWindowContentOverlay.draw(c); + } + } + + @Override + public boolean shouldDelayChildPressedState() { + return false; + } + + @Override + public boolean onStartNestedScroll(View child, View target, int axes) { + if ((axes & SCROLL_AXIS_VERTICAL) == 0 || mActionBarTop.getVisibility() != VISIBLE) { + return false; + } + return mHideOnContentScroll; + } + + @Override + public void onNestedScrollAccepted(View child, View target, int axes) { + super.onNestedScrollAccepted(child, target, axes); + mHideOnContentScrollReference = getActionBarHideOffset(); + haltActionBarHideOffsetAnimations(); + if (mActionBarVisibilityCallback != null) { + mActionBarVisibilityCallback.onContentScrollStarted(); + } + } + + @Override + public void onNestedScroll(View target, int dxConsumed, int dyConsumed, + int dxUnconsumed, int dyUnconsumed) { + mHideOnContentScrollReference += dyConsumed; + setActionBarHideOffset(mHideOnContentScrollReference); + } + + @Override + public void onStopNestedScroll(View target) { + super.onStopNestedScroll(target); + if (mHideOnContentScroll && !mAnimatingForFling) { + if (mHideOnContentScrollReference <= mActionBarTop.getHeight()) { + postRemoveActionBarHideOffset(); + } else { + postAddActionBarHideOffset(); + } + } + if (mActionBarVisibilityCallback != null) { + mActionBarVisibilityCallback.onContentScrollStopped(); + } + } + + @Override + public boolean onNestedFling(View target, float velocityX, float velocityY, boolean consumed) { + if (!mHideOnContentScroll || !consumed) { + return false; + } + if (shouldHideActionBarOnFling(velocityX, velocityY)) { + addActionBarHideOffset(); + } else { + removeActionBarHideOffset(); + } + mAnimatingForFling = true; + return true; + } + + void pullChildren() { + if (mContent == null) { + mContent = (ContentFrameLayout) findViewById(R.id.action_bar_activity_content); + mActionBarTop = (ActionBarContainer) findViewById(R.id.action_bar_container); + mDecorToolbar = getDecorToolbar(findViewById(R.id.action_bar)); + mActionBarBottom = (ActionBarContainer) findViewById(R.id.split_action_bar); + } + } + + private DecorToolbar getDecorToolbar(View view) { + if (view instanceof DecorToolbar) { + return (DecorToolbar) view; + } else if (view instanceof Toolbar) { + return ((Toolbar) view).getWrapper(); + } else { + throw new IllegalStateException("Can't make a decor toolbar out of " + + view.getClass().getSimpleName()); + } + } + + public void setHideOnContentScrollEnabled(boolean hideOnContentScroll) { + if (hideOnContentScroll != mHideOnContentScroll) { + mHideOnContentScroll = hideOnContentScroll; + if (!hideOnContentScroll) { + if (VersionUtils.isAtLeastL()) { + stopNestedScroll(); + } + haltActionBarHideOffsetAnimations(); + setActionBarHideOffset(0); + } + } + } + + public boolean isHideOnContentScrollEnabled() { + return mHideOnContentScroll; + } + + public int getActionBarHideOffset() { + return mActionBarTop != null ? -((int) ViewCompat.getTranslationY(mActionBarTop)) : 0; + } + + public void setActionBarHideOffset(int offset) { + haltActionBarHideOffsetAnimations(); + final int topHeight = mActionBarTop.getHeight(); + offset = Math.max(0, Math.min(offset, topHeight)); + ViewCompat.setTranslationY(mActionBarTop, -offset); + if (mActionBarBottom != null && mActionBarBottom.getVisibility() != GONE) { + // Match the hide offset proportionally for a split bar + final float fOffset = (float) offset / topHeight; + final int bOffset = (int) (mActionBarBottom.getHeight() * fOffset); + ViewCompat.setTranslationY(mActionBarBottom, bOffset); + } + } + + private void haltActionBarHideOffsetAnimations() { + removeCallbacks(mRemoveActionBarHideOffset); + removeCallbacks(mAddActionBarHideOffset); + if (mCurrentActionBarTopAnimator != null) { + mCurrentActionBarTopAnimator.cancel(); + } + if (mCurrentActionBarBottomAnimator != null) { + mCurrentActionBarBottomAnimator.cancel(); + } + } + + private void postRemoveActionBarHideOffset() { + haltActionBarHideOffsetAnimations(); + postDelayed(mRemoveActionBarHideOffset, ACTION_BAR_ANIMATE_DELAY); + } + + private void postAddActionBarHideOffset() { + haltActionBarHideOffsetAnimations(); + postDelayed(mAddActionBarHideOffset, ACTION_BAR_ANIMATE_DELAY); + } + + private void removeActionBarHideOffset() { + haltActionBarHideOffsetAnimations(); + mRemoveActionBarHideOffset.run(); + } + + private void addActionBarHideOffset() { + haltActionBarHideOffsetAnimations(); + mAddActionBarHideOffset.run(); + } + + private boolean shouldHideActionBarOnFling(float velocityX, float velocityY) { + mFlingEstimator.fling(0, 0, 0, (int) velocityY, 0, 0, Integer.MIN_VALUE, Integer.MAX_VALUE); + final int finalY = mFlingEstimator.getFinalY(); + return finalY > mActionBarTop.getHeight(); + } + + @Override + public void setWindowCallback(Window.Callback cb) { + pullChildren(); + mDecorToolbar.setWindowCallback(cb); + } + + @Override + public void setWindowTitle(CharSequence title) { + pullChildren(); + mDecorToolbar.setWindowTitle(title); + } + + @Override + public CharSequence getTitle() { + pullChildren(); + return mDecorToolbar.getTitle(); + } + + @Override + public void initFeature(int windowFeature) { + pullChildren(); + switch (windowFeature) { + case Window.FEATURE_PROGRESS: + mDecorToolbar.initProgress(); + break; + case Window.FEATURE_INDETERMINATE_PROGRESS: + mDecorToolbar.initIndeterminateProgress(); + break; + case Window.FEATURE_ACTION_BAR_OVERLAY: + setOverlayMode(true); + break; + } + } + + @Override + public void setUiOptions(int uiOptions) { + // Split Action Bar not included. + } + + @Override + public boolean hasIcon() { + pullChildren(); + return mDecorToolbar.hasIcon(); + } + + @Override + public boolean hasLogo() { + pullChildren(); + return mDecorToolbar.hasLogo(); + } + + @Override + public void setIcon(int resId) { + pullChildren(); + mDecorToolbar.setIcon(resId); + } + + @Override + public void setIcon(Drawable d) { + pullChildren(); + mDecorToolbar.setIcon(d); + } + + @Override + public void setLogo(int resId) { + pullChildren(); + mDecorToolbar.setLogo(resId); + } + + @Override + public boolean canShowOverflowMenu() { + pullChildren(); + return mDecorToolbar.canShowOverflowMenu(); + } + + @Override + public boolean isOverflowMenuShowing() { + pullChildren(); + return mDecorToolbar.isOverflowMenuShowing(); + } + + @Override + public boolean isOverflowMenuShowPending() { + pullChildren(); + return mDecorToolbar.isOverflowMenuShowPending(); + } + + @Override + public boolean showOverflowMenu() { + pullChildren(); + return mDecorToolbar.showOverflowMenu(); + } + + @Override + public boolean hideOverflowMenu() { + pullChildren(); + return mDecorToolbar.hideOverflowMenu(); + } + + @Override + public void setMenuPrepared() { + pullChildren(); + mDecorToolbar.setMenuPrepared(); + } + + @Override + public void setMenu(Menu menu, MenuPresenter.Callback cb) { + pullChildren(); + mDecorToolbar.setMenu(menu, cb); + } + + @Override + public void saveToolbarHierarchyState(SparseArray toolbarStates) { + pullChildren(); + mDecorToolbar.saveHierarchyState(toolbarStates); + } + + @Override + public void restoreToolbarHierarchyState(SparseArray toolbarStates) { + pullChildren(); + mDecorToolbar.restoreHierarchyState(toolbarStates); + } + + @Override + public void dismissPopups() { + pullChildren(); + mDecorToolbar.dismissPopupMenus(); + } + + public static class LayoutParams extends MarginLayoutParams { + public LayoutParams(Context c, AttributeSet attrs) { + super(c, attrs); + } + + public LayoutParams(int width, int height) { + super(width, height); + } + + public LayoutParams(ViewGroup.LayoutParams source) { + super(source); + } + + public LayoutParams(ViewGroup.MarginLayoutParams source) { + super(source); + } + } + + public interface ActionBarVisibilityCallback { + void onWindowVisibilityChanged(int visibility); + void showForSystem(); + void hideForSystem(); + void enableContentAnimations(boolean enable); + void onContentScrollStarted(); + void onContentScrollStopped(); + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ActivityChooserModel.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ActivityChooserModel.java new file mode 100644 index 0000000000..d97f8e7b9a --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ActivityChooserModel.java @@ -0,0 +1,1100 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.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.AsyncTask; +import android.os.Build; +import android.support.v4.os.AsyncTaskCompat; +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.List; +import java.util.Map; + +/** + *

      + * 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 + */ +public 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 mActivities = 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 #readHistoricalDataIfNeeded()} 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 #persistHistoricalDataIfNeeded()} 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 #persistHistoricalDataIfNeeded()} a call to + * {@link #persistHistoricalDataIfNeeded()} 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 #persistHistoricalDataIfNeeded()} 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; + + /** + * Flag whether to reload the activities for the current intent. + */ + private boolean mReloadActivities = false; + + /** + * 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); + } + 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; + mReloadActivities = true; + ensureConsistentState(); + } + } + + /** + * 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) { + ensureConsistentState(); + return mActivities.size(); + } + } + + /** + * Gets an activity at a given index. + * + * @return The activity. + * + * @see ActivityResolveInfo + * @see #setIntent(Intent) + */ + public ResolveInfo getActivity(int index) { + synchronized (mInstanceLock) { + ensureConsistentState(); + return mActivities.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) { + synchronized (mInstanceLock) { + ensureConsistentState(); + List activities = mActivities; + 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 or there is not current intent + * set via {@link #setIntent(Intent)}. + * + * @see HistoricalRecord + * @see OnChooseActivityListener + */ + public Intent chooseActivity(int index) { + synchronized (mInstanceLock) { + if (mIntent == null) { + return null; + } + + ensureConsistentState(); + + ActivityResolveInfo chosenActivity = mActivities.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) { + synchronized (mInstanceLock) { + 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) { + ensureConsistentState(); + if (!mActivities.isEmpty()) { + return mActivities.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) { + synchronized (mInstanceLock) { + ensureConsistentState(); + + ActivityResolveInfo newDefaultActivity = mActivities.get(index); + ActivityResolveInfo oldDefaultActivity = mActivities.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); + } + } + + /** + * Persists the history data to the backing file if the latter + * was provided. Calling this method before a call to {@link #readHistoricalDataIfNeeded()} + * 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 #readHistoricalDataIfNeeded()}. + */ + private void persistHistoricalDataIfNeeded() { + if (!mReadShareHistoryCalled) { + throw new IllegalStateException("No preceding call to #readHistoricalData"); + } + if (!mHistoricalRecordsChanged) { + return; + } + mHistoricalRecordsChanged = false; + if (!TextUtils.isEmpty(mHistoryFileName)) { + AsyncTaskCompat.executeParallel(new PersistHistoryAsyncTask(), + mHistoricalRecords, mHistoryFileName); + } + } + + /** + * 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; + if (sortActivitiesIfNeeded()) { + 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; + pruneExcessiveHistoricalRecordsIfNeeded(); + if (sortActivitiesIfNeeded()) { + notifyChanged(); + } + } + } + + /** + * 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) { + ensureConsistentState(); + return mHistoricalRecords.size(); + } + } + + /** + * Ensures the model is in a consistent state which is the + * activities for the current intent have been loaded, the + * most recent history has been read, and the activities + * are sorted. + */ + private void ensureConsistentState() { + boolean stateChanged = loadActivitiesIfNeeded(); + stateChanged |= readHistoricalDataIfNeeded(); + pruneExcessiveHistoricalRecordsIfNeeded(); + if (stateChanged) { + sortActivitiesIfNeeded(); + notifyChanged(); + } + } + + /** + * Sorts the activities if necessary which is if there is a + * sorter, there are some activities to sort, and there is some + * historical data. + * + * @return Whether sorting was performed. + */ + private boolean sortActivitiesIfNeeded() { + if (mActivitySorter != null && mIntent != null + && !mActivities.isEmpty() && !mHistoricalRecords.isEmpty()) { + mActivitySorter.sort(mIntent, mActivities, + Collections.unmodifiableList(mHistoricalRecords)); + return true; + } + return false; + } + + /** + * Loads the activities for the current intent if needed which is + * if they are not already loaded for the current intent. + * + * @return Whether loading was performed. + */ + private boolean loadActivitiesIfNeeded() { + if (mReloadActivities && mIntent != null) { + mReloadActivities = false; + mActivities.clear(); + List resolveInfos = mContext.getPackageManager() + .queryIntentActivities(mIntent, 0); + final int resolveInfoCount = resolveInfos.size(); + for (int i = 0; i < resolveInfoCount; i++) { + ResolveInfo resolveInfo = resolveInfos.get(i); + mActivities.add(new ActivityResolveInfo(resolveInfo)); + } + return true; + } + return false; + } + + /** + * Reads the historical data if necessary which is it has + * changed, there is a history file, and there is not persist + * in progress. + * + * @return Whether reading was performed. + */ + private boolean readHistoricalDataIfNeeded() { + if (mCanReadHistoricalData && mHistoricalRecordsChanged && + !TextUtils.isEmpty(mHistoryFileName)) { + mCanReadHistoricalData = false; + mReadShareHistoryCalled = true; + readHistoricalDataImpl(); + return true; + } + return false; + } + + /** + * Adds a historical record. + * + * @param historicalRecord The record to add. + * @return True if the record was added. + */ + private boolean addHisoricalRecord(HistoricalRecord historicalRecord) { + final boolean added = mHistoricalRecords.add(historicalRecord); + if (added) { + mHistoricalRecordsChanged = true; + pruneExcessiveHistoricalRecordsIfNeeded(); + persistHistoricalDataIfNeeded(); + sortActivitiesIfNeeded(); + notifyChanged(); + } + return added; + } + + /** + * Prunes older excessive records to guarantee maxHistorySize. + */ + private void pruneExcessiveHistoricalRecordsIfNeeded() { + final int pruneCount = mHistoricalRecords.size() - mHistoryMaxSize; + if (pruneCount <= 0) { + return; + } + mHistoricalRecordsChanged = true; + for (int i = 0; i < pruneCount; i++) { + HistoricalRecord prunedRecord = mHistoricalRecords.remove(0); + if (DEBUG) { + Log.i(LOG_TAG, "Pruned: " + prunedRecord); + } + } + } + + /** + * 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 void readHistoricalDataImpl() { + 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 historicalRecords = mHistoricalRecords; + historicalRecords.clear(); + + 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); + historicalRecords.add(readRecord); + + if (DEBUG) { + Log.i(LOG_TAG, "Read " + readRecord.toString()); + } + } + + if (DEBUG) { + Log.i(LOG_TAG, "Read " + historicalRecords.size() + " historical records."); + } + } 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 PersistHistoryAsyncTask extends AsyncTask { + + @Override + @SuppressWarnings("unchecked") + public Void doInBackground(Object... args) { + List historicalRecords = (List) args[0]; + String hostoryFileName = (String) args[1]; + + FileOutputStream fos = null; + + try { + fos = mContext.openFileOutput(hostoryFileName, Context.MODE_PRIVATE); + } catch (FileNotFoundException fnfe) { + Log.e(LOG_TAG, "Error writing historical recrod file: " + hostoryFileName, fnfe); + return null; + } + + XmlSerializer serializer = Xml.newSerializer(); + + try { + serializer.setOutput(fos, null); + serializer.startDocument("UTF-8", true); + serializer.startTag(null, TAG_HISTORICAL_RECORDS); + + final int recordCount = historicalRecords.size(); + for (int i = 0; i < recordCount; i++) { + HistoricalRecord record = historicalRecords.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 { + mCanReadHistoricalData = true; + if (fos != null) { + try { + fos.close(); + } catch (IOException e) { + /* ignore */ + } + } + } + return null; + } + } +} \ No newline at end of file diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ActivityChooserView.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ActivityChooserView.java new file mode 100644 index 0000000000..9931afb758 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ActivityChooserView.java @@ -0,0 +1,843 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +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.support.v4.view.ActionProvider; +import android.support.v4.view.ViewCompat; +import android.support.v7.appcompat.R; +import android.support.v7.widget.LinearLayoutCompat; +import android.support.v7.widget.ListPopupWindow; +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 + */ +public class ActivityChooserView extends ViewGroup implements + ActivityChooserModel.ActivityChooserModelClient { + + private static final String LOG_TAG = "ActivityChooserView"; + + /** + * An adapter for displaying the activities in an {@link android.widget.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 LinearLayoutCompat 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 ListPopupWindow 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; + + /** + * 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); + + TypedArray attributesArray = context.obtainStyledAttributes(attrs, + R.styleable.ActivityChooserView, defStyle, 0); + + mInitialActivityCount = attributesArray.getInt( + R.styleable.ActivityChooserView_initialActivityCount, + ActivityChooserViewAdapter.MAX_ACTIVITY_COUNT_DEFAULT); + + Drawable expandActivityOverflowButtonDrawable = attributesArray.getDrawable( + R.styleable.ActivityChooserView_expandActivityOverflowButtonDrawable); + + attributesArray.recycle(); + + LayoutInflater inflater = LayoutInflater.from(getContext()); + inflater.inflate(R.layout.abc_activity_chooser_view, this, true); + + mCallbacks = new Callbacks(); + + mActivityChooserContent = (LinearLayoutCompat) findViewById(R.id.activity_chooser_view_content); + mActivityChooserContentBackground = mActivityChooserContent.getBackground(); + + mDefaultActivityButton = (FrameLayout) findViewById(R.id.default_activity_button); + mDefaultActivityButton.setOnClickListener(mCallbacks); + mDefaultActivityButton.setOnLongClickListener(mCallbacks); + mDefaultActivityButtonImage = (ImageView) mDefaultActivityButton.findViewById(R.id.image); + + final FrameLayout expandButton = (FrameLayout) findViewById(R.id.expand_activities_button); + expandButton.setOnClickListener(mCallbacks); + expandButton.setOnTouchListener(new ListPopupWindow.ForwardingListener(expandButton) { + @Override + public ListPopupWindow getPopup() { + return getListPopupWindow(); + } + + @Override + protected boolean onForwardingStarted() { + showPopup(); + return true; + } + + @Override + protected boolean onForwardingStopped() { + dismissPopup(); + return true; + } + }); + mExpandActivityOverflowButton = expandButton; + mExpandActivityOverflowButtonImage = + (ImageView) expandButton.findViewById(R.id.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.abc_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 = getContext().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); + } + + ListPopupWindow 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(getContext().getString( + R.string.abc_activitychooserview_choose_application)); + } + } + + /** + * Dismisses the popup window with activities. + * + * @return True if dismissed, false if already dismissed. + */ + public boolean dismissPopup() { + if (isShowingPopup()) { + getListPopupWindow().dismiss(); + ViewTreeObserver viewTreeObserver = getViewTreeObserver(); + if (viewTreeObserver.isAlive()) { + viewTreeObserver.removeGlobalOnLayoutListener(mOnGlobalLayoutListener); + } + } + return true; + } + + /** + * Gets whether the popup window with activities is shown. + * + * @return True if the popup is shown. + */ + public boolean isShowingPopup() { + return getListPopupWindow().isShowing(); + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + ActivityChooserModel dataModel = mAdapter.getDataModel(); + if (dataModel != null) { + dataModel.registerObserver(mModelDataSetOberver); + } + mIsAttachedToWindow = true; + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + ActivityChooserModel dataModel = mAdapter.getDataModel(); + if (dataModel != null) { + dataModel.unregisterObserver(mModelDataSetOberver); + } + ViewTreeObserver viewTreeObserver = getViewTreeObserver(); + if (viewTreeObserver.isAlive()) { + viewTreeObserver.removeGlobalOnLayoutListener(mOnGlobalLayoutListener); + } + if (isShowingPopup()) { + dismissPopup(); + } + 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 (!isShowingPopup()) { + 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 ListPopupWindow getListPopupWindow() { + if (mListPopupWindow == null) { + mListPopupWindow = new ListPopupWindow(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==1 || activityCount > 1 && historySize > 0) { + mDefaultActivityButton.setVisibility(VISIBLE); + ResolveInfo activity = mAdapter.getDefaultActivity(); + PackageManager packageManager = getContext().getPackageManager(); + mDefaultActivityButtonImage.setImageDrawable(activity.loadIcon(packageManager)); + if (mDefaultActionButtonContentDescription != 0) { + CharSequence label = activity.loadLabel(packageManager); + String contentDescription = getContext().getString( + mDefaultActionButtonContentDescription, label); + mDefaultActivityButton.setContentDescription(contentDescription); + } + } else { + mDefaultActivityButton.setVisibility(View.GONE); + } + // Activity chooser content. + if (mDefaultActivityButton.getVisibility() == VISIBLE) { + mActivityChooserContent.setBackgroundDrawable(mActivityChooserContentBackground); + } else { + mActivityChooserContent.setBackgroundDrawable(null); + } + } + + /** + * 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) { + launchIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); + getContext().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) { + launchIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); + getContext().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(); + } + } + } + + /** + * Adapter for backing the list of activities shown in the popup. + */ + private class ActivityChooserViewAdapter extends BaseAdapter { + + public static final int MAX_ACTIVITY_COUNT_UNLIMITED = Integer.MAX_VALUE; + + public static final int MAX_ACTIVITY_COUNT_DEFAULT = 4; + + private static final int ITEM_VIEW_TYPE_ACTIVITY = 0; + + private static final int ITEM_VIEW_TYPE_FOOTER = 1; + + private static final int ITEM_VIEW_TYPE_COUNT = 3; + + private ActivityChooserModel mDataModel; + + private int mMaxActivityCount = MAX_ACTIVITY_COUNT_DEFAULT; + + private boolean mShowDefaultActivity; + + private boolean mHighlightDefaultActivity; + + private boolean mShowFooterView; + + public void setDataModel(ActivityChooserModel dataModel) { + ActivityChooserModel oldDataModel = mAdapter.getDataModel(); + if (oldDataModel != null && isShown()) { + oldDataModel.unregisterObserver(mModelDataSetOberver); + } + mDataModel = dataModel; + if (dataModel != null && isShown()) { + dataModel.registerObserver(mModelDataSetOberver); + } + notifyDataSetChanged(); + } + + @Override + public int getItemViewType(int position) { + if (mShowFooterView && position == getCount() - 1) { + return ITEM_VIEW_TYPE_FOOTER; + } else { + return ITEM_VIEW_TYPE_ACTIVITY; + } + } + + @Override + public int getViewTypeCount() { + return ITEM_VIEW_TYPE_COUNT; + } + + public int getCount() { + int count = 0; + int activityCount = mDataModel.getActivityCount(); + if (!mShowDefaultActivity && mDataModel.getDefaultActivity() != null) { + activityCount--; + } + count = Math.min(activityCount, mMaxActivityCount); + if (mShowFooterView) { + count++; + } + return count; + } + + public Object getItem(int position) { + final int itemViewType = getItemViewType(position); + switch (itemViewType) { + case ITEM_VIEW_TYPE_FOOTER: + return null; + case ITEM_VIEW_TYPE_ACTIVITY: + if (!mShowDefaultActivity && mDataModel.getDefaultActivity() != null) { + position++; + } + return mDataModel.getActivity(position); + default: + throw new IllegalArgumentException(); + } + } + + public long getItemId(int position) { + return position; + } + + public View getView(int position, View convertView, ViewGroup parent) { + final int itemViewType = getItemViewType(position); + switch (itemViewType) { + case ITEM_VIEW_TYPE_FOOTER: + if (convertView == null || convertView.getId() != ITEM_VIEW_TYPE_FOOTER) { + convertView = LayoutInflater.from(getContext()).inflate( + R.layout.abc_activity_chooser_view_list_item, parent, false); + convertView.setId(ITEM_VIEW_TYPE_FOOTER); + TextView titleView = (TextView) convertView.findViewById(R.id.title); + titleView.setText(getContext().getString( + R.string.abc_activity_chooser_view_see_all)); + } + return convertView; + case ITEM_VIEW_TYPE_ACTIVITY: + if (convertView == null || convertView.getId() != R.id.list_item) { + convertView = LayoutInflater.from(getContext()).inflate( + R.layout.abc_activity_chooser_view_list_item, parent, false); + } + PackageManager packageManager = getContext().getPackageManager(); + // Set the icon + ImageView iconView = (ImageView) convertView.findViewById(R.id.icon); + ResolveInfo activity = (ResolveInfo) getItem(position); + iconView.setImageDrawable(activity.loadIcon(packageManager)); + // Set the title. + TextView titleView = (TextView) convertView.findViewById(R.id.title); + titleView.setText(activity.loadLabel(packageManager)); + // Highlight the default. + if (mShowDefaultActivity && position == 0 && mHighlightDefaultActivity) { + ViewCompat.setActivated(convertView, true); + } else { + ViewCompat.setActivated(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 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; + } + } + + /** + * Allows us to set the background using TintTypedArray + * @hide + */ + public static class InnerLayout extends LinearLayoutCompat { + + private static final int[] TINT_ATTRS = { + android.R.attr.background + }; + + public InnerLayout(Context context, AttributeSet attrs) { + super(context, attrs); + TintTypedArray a = TintTypedArray.obtainStyledAttributes(context, attrs, TINT_ATTRS); + setBackgroundDrawable(a.getDrawable(0)); + a.recycle(); + } + } +} \ No newline at end of file diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/AdapterViewCompat.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/AdapterViewCompat.java new file mode 100644 index 0000000000..bdce3c86a4 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/AdapterViewCompat.java @@ -0,0 +1,1150 @@ +package android.support.v7.internal.widget; + +/* + * 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. + */ + +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.ContextMenu.ContextMenuInfo; +import android.view.SoundEffectConstants; +import android.view.View; +import android.view.ViewDebug; +import android.view.ViewGroup; +import android.view.accessibility.AccessibilityEvent; +import android.widget.Adapter; +import android.widget.AdapterView; +import android.widget.ListView; + + +/** + * An AdapterView is a view whose children are determined by an {@link android.widget.Adapter}. + * + *

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

      + *

      Developer Guides

      + *

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

      + * + * @hide + */ +public abstract class AdapterViewCompat extends ViewGroup { + + /** + * The item view type returned by {@link Adapter#getItemViewType(int)} when + * the adapter does not want the item's view recycled. + */ + 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. + */ + 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; + + AdapterViewCompat(Context context) { + super(context); + } + + AdapterViewCompat(Context context, AttributeSet attrs) { + super(context, attrs); + } + + AdapterViewCompat(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + /** + * Interface definition for a callback to be invoked when an item in this + * AdapterView has been clicked. + */ + public interface OnItemClickListener { + + /** + * Callback method to be invoked when an item in this AdapterView has + * been clicked. + *

      + * Implementers can call getItemAtPosition(position) if they need + * to access the data associated with the selected item. + * + * @param parent The AdapterView where the click happened. + * @param view The view within the AdapterView that was clicked (this + * will be a view provided by the adapter) + * @param position The position of the view in the adapter. + * @param id The row id of the item that was clicked. + */ + void onItemClick(AdapterViewCompat parent, View view, int position, long id); + } + + class OnItemClickListenerWrapper implements AdapterView.OnItemClickListener { + + private final OnItemClickListener mWrappedListener; + + public OnItemClickListenerWrapper(OnItemClickListener listener) { + mWrappedListener = listener; + } + + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + mWrappedListener.onItemClick(AdapterViewCompat.this, view, position, id); + } + } + + /** + * 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, 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(AdapterViewCompat 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(AdapterViewCompat 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(AdapterViewCompat 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 (AdapterViewCompat.this.getAdapter().hasStableIds() && mInstanceState != null + && mOldItemCount == 0 && mItemCount > 0) { + AdapterViewCompat.this.onRestoreInstanceState(mInstanceState); + mInstanceState = null; + } else { + rememberSyncState(); + } + checkFocus(); + requestLayout(); + } + + @Override + public void onInvalidated() { + mDataChanged = true; + + if (AdapterViewCompat.this.getAdapter().hasStableIds()) { + // Remember the current state for the case where our hosting activity is being + // stopped and later restarted + mInstanceState = AdapterViewCompat.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 + 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; + } + } + } +} \ No newline at end of file diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/AppCompatPopupWindow.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/AppCompatPopupWindow.java new file mode 100644 index 0000000000..511a332639 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/AppCompatPopupWindow.java @@ -0,0 +1,120 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.annotation.TargetApi; +import android.content.Context; +import android.os.Build; +import android.support.v7.appcompat.R; +import android.util.AttributeSet; +import android.util.Log; +import android.view.View; +import android.view.ViewTreeObserver.OnScrollChangedListener; +import android.widget.PopupWindow; + +import java.lang.ref.WeakReference; +import java.lang.reflect.Field; + +/** + * @hide + */ +public class AppCompatPopupWindow extends PopupWindow { + + private static final String TAG = "AppCompatPopupWindow"; + + private final boolean mOverlapAnchor; + + public AppCompatPopupWindow(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + TintTypedArray a = TintTypedArray.obtainStyledAttributes(context, attrs, + R.styleable.PopupWindow, defStyleAttr, 0); + mOverlapAnchor = a.getBoolean(R.styleable.PopupWindow_overlapAnchor, false); + // We re-set this for tinting purposes + setBackgroundDrawable(a.getDrawable(R.styleable.PopupWindow_android_popupBackground)); + a.recycle(); + + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { + // For devices pre-ICS, we need to wrap the internal OnScrollChangedListener + // due to NPEs. + wrapOnScrollChangedListener(this); + } + } + + @Override + public void showAsDropDown(View anchor, int xoff, int yoff) { + if (Build.VERSION.SDK_INT < 21 && mOverlapAnchor) { + // If we're pre-L, emulate overlapAnchor by modifying the yOff + yoff -= anchor.getHeight(); + } + super.showAsDropDown(anchor, xoff, yoff); + } + + @TargetApi(Build.VERSION_CODES.KITKAT) + @Override + public void showAsDropDown(View anchor, int xoff, int yoff, int gravity) { + if (Build.VERSION.SDK_INT < 21 && mOverlapAnchor) { + // If we're pre-L, emulate overlapAnchor by modifying the yOff + yoff -= anchor.getHeight(); + } + super.showAsDropDown(anchor, xoff, yoff, gravity); + } + + @Override + public void update(View anchor, int xoff, int yoff, int width, int height) { + if (Build.VERSION.SDK_INT < 21 && mOverlapAnchor) { + // If we're pre-L, emulate overlapAnchor by modifying the yOff + yoff -= anchor.getHeight(); + } + super.update(anchor, xoff, yoff, width, height); + } + + private static void wrapOnScrollChangedListener(final PopupWindow popup) { + try { + final Field fieldAnchor = PopupWindow.class.getDeclaredField("mAnchor"); + fieldAnchor.setAccessible(true); + + final Field fieldListener = PopupWindow.class + .getDeclaredField("mOnScrollChangedListener"); + fieldListener.setAccessible(true); + + final OnScrollChangedListener originalListener = + (OnScrollChangedListener) fieldListener.get(popup); + + // Now set a new listener, wrapping the original and only proxying the call when + // we have an anchor view. + fieldListener.set(popup, new OnScrollChangedListener() { + @Override + public void onScrollChanged() { + try { + WeakReference mAnchor = (WeakReference) fieldAnchor.get(popup); + if (mAnchor == null || mAnchor.get() == null) { + return; + } else { + originalListener.onScrollChanged(); + } + } catch (IllegalAccessException e) { + // Oh well... + } + } + }); + } catch (Exception e) { + Log.d(TAG, "Exception while installing workaround OnScrollChangedListener", e); + } + } + +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/CompatTextView.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/CompatTextView.java new file mode 100644 index 0000000000..f90ab75338 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/CompatTextView.java @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Rect; +import android.support.v7.appcompat.R; +import android.support.v7.internal.text.AllCapsTransformationMethod; +import android.text.method.TransformationMethod; +import android.util.AttributeSet; +import android.view.View; +import android.widget.TextView; + +import java.util.Locale; + +/** + * @hide + */ +public class CompatTextView extends TextView { + + public CompatTextView(Context context) { + this(context, null); + } + + public CompatTextView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public CompatTextView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + + // First read the TextAppearance style id + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CompatTextView, + defStyle, 0); + final int ap = a.getResourceId(R.styleable.CompatTextView_android_textAppearance, -1); + a.recycle(); + + // Now check TextAppearance's textAllCaps value + if (ap != -1) { + TypedArray appearance = context.obtainStyledAttributes(ap, R.styleable.TextAppearance); + if (appearance.hasValue(R.styleable.TextAppearance_textAllCaps)) { + setAllCaps(appearance.getBoolean(R.styleable.TextAppearance_textAllCaps, false)); + } + appearance.recycle(); + } + + // Now read the style's value + a = context.obtainStyledAttributes(attrs, R.styleable.CompatTextView, defStyle, 0); + if (a.hasValue(R.styleable.CompatTextView_textAllCaps)) { + setAllCaps(a.getBoolean(R.styleable.CompatTextView_textAllCaps, false)); + } + a.recycle(); + } + + public void setAllCaps(boolean allCaps) { + setTransformationMethod(allCaps ? new AllCapsTransformationMethod(getContext()) : null); + } + + @Override + public void setTextAppearance(Context context, int resid) { + super.setTextAppearance(context, resid); + + TypedArray appearance = context.obtainStyledAttributes(resid, R.styleable.TextAppearance); + if (appearance.hasValue(R.styleable.TextAppearance_textAllCaps)) { + setAllCaps(appearance.getBoolean(R.styleable.TextAppearance_textAllCaps, false)); + } + appearance.recycle(); + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ContentFrameLayout.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ContentFrameLayout.java new file mode 100644 index 0000000000..1f140d164b --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ContentFrameLayout.java @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.graphics.Rect; +import android.util.AttributeSet; +import android.widget.FrameLayout; + +/** + * @hide + */ +public class ContentFrameLayout extends FrameLayout { + + public ContentFrameLayout(Context context) { + this(context, null); + } + + public ContentFrameLayout(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public ContentFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + /** + * @hide + */ + public void dispatchFitSystemWindows(Rect insets) { + fitSystemWindows(insets); + } + +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/DecorContentParent.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/DecorContentParent.java new file mode 100644 index 0000000000..e4400acc16 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/DecorContentParent.java @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package android.support.v7.internal.widget; + +import android.graphics.drawable.Drawable; +import android.os.Parcelable; +import android.support.v7.internal.view.menu.MenuPresenter; +import android.util.SparseArray; +import android.view.Menu; +import android.view.Window; + +/** + * Implemented by the top-level decor layout for a window. DecorContentParent offers + * entry points for a number of title/window decor features. + * + * @hide + */ +public interface DecorContentParent { + void setWindowCallback(Window.Callback cb); + void setWindowTitle(CharSequence title); + CharSequence getTitle(); + void initFeature(int windowFeature); + void setUiOptions(int uiOptions); + boolean hasIcon(); + boolean hasLogo(); + void setIcon(int resId); + void setIcon(Drawable d); + void setLogo(int resId); + boolean canShowOverflowMenu(); + boolean isOverflowMenuShowing(); + boolean isOverflowMenuShowPending(); + boolean showOverflowMenu(); + boolean hideOverflowMenu(); + void setMenuPrepared(); + void setMenu(Menu menu, MenuPresenter.Callback cb); + void saveToolbarHierarchyState(SparseArray toolbarStates); + void restoreToolbarHierarchyState(SparseArray toolbarStates); + void dismissPopups(); + +} \ No newline at end of file diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/DecorToolbar.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/DecorToolbar.java new file mode 100644 index 0000000000..c601e642a7 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/DecorToolbar.java @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.os.Parcelable; +import android.support.v7.internal.view.menu.MenuBuilder; +import android.support.v7.internal.view.menu.MenuPresenter; +import android.util.SparseArray; +import android.view.Menu; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.widget.SpinnerAdapter; + +/** + * Common interface for a toolbar that sits as part of the window decor. + * Layouts that control window decor use this as a point of interaction with different + * bar implementations. + * + * @hide + */ +public interface DecorToolbar { + ViewGroup getViewGroup(); + Context getContext(); + boolean isSplit(); + boolean hasExpandedActionView(); + void collapseActionView(); + void setWindowCallback(Window.Callback cb); + void setWindowTitle(CharSequence title); + CharSequence getTitle(); + void setTitle(CharSequence title); + CharSequence getSubtitle(); + void setSubtitle(CharSequence subtitle); + void initProgress(); + void initIndeterminateProgress(); + boolean canSplit(); + void setSplitView(ViewGroup splitView); + void setSplitToolbar(boolean split); + void setSplitWhenNarrow(boolean splitWhenNarrow); + boolean hasIcon(); + boolean hasLogo(); + void setIcon(int resId); + void setIcon(Drawable d); + void setLogo(int resId); + void setLogo(Drawable d); + boolean canShowOverflowMenu(); + boolean isOverflowMenuShowing(); + boolean isOverflowMenuShowPending(); + boolean showOverflowMenu(); + boolean hideOverflowMenu(); + void setMenuPrepared(); + void setMenu(Menu menu, MenuPresenter.Callback cb); + void dismissPopupMenus(); + + int getDisplayOptions(); + void setDisplayOptions(int opts); + void setEmbeddedTabView(ScrollingTabContainerView tabView); + boolean hasEmbeddedTabs(); + boolean isTitleTruncated(); + void setCollapsible(boolean collapsible); + void setHomeButtonEnabled(boolean enable); + int getNavigationMode(); + void setNavigationMode(int mode); + void setDropdownParams(SpinnerAdapter adapter, AdapterViewCompat.OnItemSelectedListener listener); + void setDropdownSelectedPosition(int position); + int getDropdownSelectedPosition(); + int getDropdownItemCount(); + void setCustomView(View view); + View getCustomView(); + void animateToVisibility(int visibility); + void setNavigationIcon(Drawable icon); + void setNavigationIcon(int resId); + void setNavigationContentDescription(CharSequence description); + void setNavigationContentDescription(int resId); + void setDefaultNavigationContentDescription(int defaultNavigationContentDescription); + void setDefaultNavigationIcon(Drawable icon); + void saveHierarchyState(SparseArray toolbarStates); + void restoreHierarchyState(SparseArray toolbarStates); + void setBackgroundDrawable(Drawable d); + int getHeight(); + void setVisibility(int visible); + int getVisibility(); + void setMenuCallbacks(MenuPresenter.Callback presenterCallback, + MenuBuilder.Callback menuBuilderCallback); + Menu getMenu(); + int getPopupTheme(); +} \ No newline at end of file diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/DrawableUtils.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/DrawableUtils.java new file mode 100644 index 0000000000..1ff5e4ddf6 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/DrawableUtils.java @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.support.v4.graphics.drawable.DrawableCompat; +import android.util.Log; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +/** + * @hide + */ +public class DrawableUtils { + + private static final String TAG = "DrawableUtils"; + + public static final Rect INSETS_NONE = new Rect(); + + private static Class sInsetsClazz; + + static { + if (Build.VERSION.SDK_INT >= 18) { + try { + sInsetsClazz = Class.forName("android.graphics.Insets"); + } catch (ClassNotFoundException e) { + // Oh well... + } + } + } + + private DrawableUtils() {} + + /** + * Allows us to get the optical insets for a {@link Drawable}. Since this is hidden we need to + * use reflection. Since the {@code Insets} class is hidden also, we return a Rect instead. + */ + public static Rect getOpticalBounds(Drawable drawable) { + if (sInsetsClazz != null) { + try { + // If the Drawable is wrapped, we need to manually unwrap it and process + // the wrapped drawable. + drawable = DrawableCompat.unwrap(drawable); + + final Method getOpticalInsetsMethod = drawable.getClass() + .getMethod("getOpticalInsets"); + final Object insets = getOpticalInsetsMethod.invoke(drawable); + + if (insets != null) { + // If the drawable has some optical insets, let's copy them into a Rect + final Rect result = new Rect(); + + for (Field field : sInsetsClazz.getFields()) { + switch (field.getName()) { + case "left": + result.left = field.getInt(insets); + break; + case "top": + result.top = field.getInt(insets); + break; + case "right": + result.right = field.getInt(insets); + break; + case "bottom": + result.bottom = field.getInt(insets); + break; + } + } + return result; + } + } catch (Exception e) { + // Eugh, we hit some kind of reflection issue... + Log.e(TAG, "Couldn't obtain the optical insets. Ignoring."); + } + } + + // If we reach here, either we're running on a device pre-v18, the Drawable didn't have + // any optical insets, or a reflection issue, so we'll just return an empty rect + return INSETS_NONE; + } + +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/FitWindowsFrameLayout.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/FitWindowsFrameLayout.java new file mode 100644 index 0000000000..49f95fa3b3 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/FitWindowsFrameLayout.java @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.graphics.Rect; +import android.util.AttributeSet; +import android.widget.FrameLayout; + +/** + * @hide + */ +public class FitWindowsFrameLayout extends FrameLayout implements FitWindowsViewGroup { + + private OnFitSystemWindowsListener mListener; + + public FitWindowsFrameLayout(Context context) { + super(context); + } + + public FitWindowsFrameLayout(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + public void setOnFitSystemWindowsListener(OnFitSystemWindowsListener listener) { + mListener = listener; + } + + @Override + protected boolean fitSystemWindows(Rect insets) { + if (mListener != null) { + mListener.onFitSystemWindows(insets); + } + return super.fitSystemWindows(insets); + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/FitWindowsLinearLayout.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/FitWindowsLinearLayout.java new file mode 100644 index 0000000000..6adf74dae2 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/FitWindowsLinearLayout.java @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.graphics.Rect; +import android.util.AttributeSet; +import android.widget.LinearLayout; + +/** + * @hide + */ +public class FitWindowsLinearLayout extends LinearLayout implements FitWindowsViewGroup { + + private OnFitSystemWindowsListener mListener; + + public FitWindowsLinearLayout(Context context) { + super(context); + } + + public FitWindowsLinearLayout(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public void setOnFitSystemWindowsListener(OnFitSystemWindowsListener listener) { + mListener = listener; + } + + @Override + protected boolean fitSystemWindows(Rect insets) { + if (mListener != null) { + mListener.onFitSystemWindows(insets); + } + return super.fitSystemWindows(insets); + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/FitWindowsViewGroup.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/FitWindowsViewGroup.java new file mode 100644 index 0000000000..c84fda0e4a --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/FitWindowsViewGroup.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.graphics.Rect; + +/** + * @hide + */ +public interface FitWindowsViewGroup { + + public interface OnFitSystemWindowsListener { + void onFitSystemWindows(Rect insets); + } + + public void setOnFitSystemWindowsListener(OnFitSystemWindowsListener listener); + +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ListViewCompat.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ListViewCompat.java new file mode 100644 index 0000000000..e2e6c4c569 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ListViewCompat.java @@ -0,0 +1,388 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.support.v4.graphics.drawable.DrawableCompat; +import android.support.v7.graphics.drawable.DrawableWrapper; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AbsListView; +import android.widget.ListAdapter; +import android.widget.ListView; + +import java.lang.reflect.Field; + +/** + * This class contains a number of useful things for ListView. Mainly used by + * {@link android.support.v7.widget.ListPopupWindow}. + * + * @hide + */ +public class ListViewCompat extends ListView { + + public static final int INVALID_POSITION = -1; + public static final int NO_POSITION = -1; + + private static final int[] STATE_SET_NOTHING = new int[] { 0 }; + + final Rect mSelectorRect = new Rect(); + int mSelectionLeftPadding = 0; + int mSelectionTopPadding = 0; + int mSelectionRightPadding = 0; + int mSelectionBottomPadding = 0; + + private Field mIsChildViewEnabled; + + private GateKeeperDrawable mSelector; + + public ListViewCompat(Context context) { + this(context, null); + } + + public ListViewCompat(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public ListViewCompat(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + try { + mIsChildViewEnabled = AbsListView.class.getDeclaredField("mIsChildViewEnabled"); + mIsChildViewEnabled.setAccessible(true); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } + } + + @Override + public void setSelector(Drawable sel) { + mSelector = sel != null ? new GateKeeperDrawable(sel) : null; + super.setSelector(mSelector); + + final Rect padding = new Rect(); + if (sel != null) { + sel.getPadding(padding); + } + + mSelectionLeftPadding = padding.left; + mSelectionTopPadding = padding.top; + mSelectionRightPadding = padding.right; + mSelectionBottomPadding = padding.bottom; + } + + @Override + protected void drawableStateChanged() { + super.drawableStateChanged(); + + setSelectorEnabled(true); + updateSelectorStateCompat(); + } + + @Override + protected void dispatchDraw(Canvas canvas) { + final boolean drawSelectorOnTop = false; + if (!drawSelectorOnTop) { + drawSelectorCompat(canvas); + } + + super.dispatchDraw(canvas); + } + + protected void updateSelectorStateCompat() { + Drawable selector = getSelector(); + if (selector != null && shouldShowSelectorCompat()) { + selector.setState(getDrawableState()); + } + } + + protected boolean shouldShowSelectorCompat() { + return touchModeDrawsInPressedStateCompat() && isPressed(); + } + + protected boolean touchModeDrawsInPressedStateCompat() { + return false; + } + + protected void drawSelectorCompat(Canvas canvas) { + if (!mSelectorRect.isEmpty()) { + final Drawable selector = getSelector(); + if (selector != null) { + selector.setBounds(mSelectorRect); + selector.draw(canvas); + } + } + } + + /** + * 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. + */ + public int lookForSelectablePosition(int position, boolean lookDown) { + final ListAdapter adapter = getAdapter(); + if (adapter == null || isInTouchMode()) { + return INVALID_POSITION; + } + + final int count = adapter.getCount(); + if (!getAdapter().areAllItemsEnabled()) { + if (lookDown) { + position = Math.max(0, position); + while (position < count && !adapter.isEnabled(position)) { + position++; + } + } else { + position = Math.min(position, count - 1); + while (position >= 0 && !adapter.isEnabled(position)) { + position--; + } + } + + if (position < 0 || position >= count) { + return INVALID_POSITION; + } + return position; + } else { + if (position < 0 || position >= count) { + return INVALID_POSITION; + } + return position; + } + } + + protected void positionSelectorLikeTouchCompat(int position, View sel, float x, float y) { + positionSelectorLikeFocusCompat(position, sel); + + Drawable selector = getSelector(); + if (selector != null && position != INVALID_POSITION) { + DrawableCompat.setHotspot(selector, x, y); + } + } + + protected void positionSelectorLikeFocusCompat(int position, View sel) { + // If we're changing position, update the visibility since the selector + // is technically being detached from the previous selection. + final Drawable selector = getSelector(); + final boolean manageState = selector != null && position != INVALID_POSITION; + if (manageState) { + selector.setVisible(false, false); + } + + positionSelectorCompat(position, sel); + + if (manageState) { + final Rect bounds = mSelectorRect; + final float x = bounds.exactCenterX(); + final float y = bounds.exactCenterY(); + selector.setVisible(getVisibility() == VISIBLE, false); + DrawableCompat.setHotspot(selector, x, y); + } + } + + protected void positionSelectorCompat(int position, View sel) { + final Rect selectorRect = mSelectorRect; + selectorRect.set(sel.getLeft(), sel.getTop(), sel.getRight(), sel.getBottom()); + + // Adjust for selection padding. + selectorRect.left -= mSelectionLeftPadding; + selectorRect.top -= mSelectionTopPadding; + selectorRect.right += mSelectionRightPadding; + selectorRect.bottom += mSelectionBottomPadding; + + try { + // AbsListView.mIsChildViewEnabled controls the selector's state so we need to + // modify it's value + final boolean isChildViewEnabled = mIsChildViewEnabled.getBoolean(this); + if (sel.isEnabled() != isChildViewEnabled) { + mIsChildViewEnabled.set(this, !isChildViewEnabled); + if (position != INVALID_POSITION) { + refreshDrawableState(); + } + } + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + + /** + * Measures the height of the given range of children (inclusive) and returns the height + * with this ListView's padding and divider heights included. If maxHeight is provided, the + * measuring will stop when the current height reaches maxHeight. + * + * @param widthMeasureSpec The width measure spec to be given to a child's + * {@link View#measure(int, int)}. + * @param startPosition The position of the first child to be shown. + * @param endPosition The (inclusive) position of the last child to be + * shown. Specify {@link #NO_POSITION} if the last child + * should be the last available child from the adapter. + * @param maxHeight The maximum height that will be returned (if all the + * children don't fit in this value, this value will be + * returned). + * @param disallowPartialChildPosition In general, whether the returned height should only + * contain entire children. This is more powerful--it is + * the first inclusive position at which partial + * children will not be allowed. Example: it looks nice + * to have at least 3 completely visible children, and + * in portrait this will most likely fit; but in + * landscape there could be times when even 2 children + * can not be completely shown, so a value of 2 + * (remember, inclusive) would be good (assuming + * startPosition is 0). + * @return The height of this ListView with the given children. + */ + public int measureHeightOfChildrenCompat(int widthMeasureSpec, int startPosition, + int endPosition, final int maxHeight, + int disallowPartialChildPosition) { + + final int paddingTop = getListPaddingTop(); + final int paddingBottom = getListPaddingBottom(); + final int paddingLeft = getListPaddingLeft(); + final int paddingRight = getListPaddingRight(); + final int reportedDividerHeight = getDividerHeight(); + final Drawable divider = getDivider(); + + final ListAdapter adapter = getAdapter(); + + if (adapter == null) { + return paddingTop + paddingBottom; + } + + // Include the padding of the list + int returnedHeight = paddingTop + paddingBottom; + final int dividerHeight = ((reportedDividerHeight > 0) && divider != null) + ? reportedDividerHeight : 0; + + // The previous height value that was less than maxHeight and contained + // no partial children + int prevHeightWithoutPartialChild = 0; + + View child = null; + int viewType = 0; + int count = adapter.getCount(); + for (int i = 0; i < count; i++) { + int newType = adapter.getItemViewType(i); + if (newType != viewType) { + child = null; + viewType = newType; + } + child = adapter.getView(i, child, this); + + // Compute child height spec + int heightMeasureSpec; + final ViewGroup.LayoutParams childLp = child.getLayoutParams(); + if (childLp != null && childLp.height > 0) { + heightMeasureSpec = MeasureSpec.makeMeasureSpec(childLp.height, + MeasureSpec.EXACTLY); + } else { + heightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); + } + child.measure(widthMeasureSpec, heightMeasureSpec); + + 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; + } + + protected void setSelectorEnabled(boolean enabled) { + if (mSelector != null) { + mSelector.setEnabled(enabled); + } + } + + private static class GateKeeperDrawable extends DrawableWrapper { + private boolean mEnabled; + + public GateKeeperDrawable(Drawable drawable) { + super(drawable); + mEnabled = true; + } + + void setEnabled(boolean enabled) { + mEnabled = enabled; + } + + @Override + public boolean setState(int[] stateSet) { + if (mEnabled) { + return super.setState(stateSet); + } + return false; + } + + @Override + public void draw(Canvas canvas) { + if (mEnabled) { + super.draw(canvas); + } + } + + @Override + public void setHotspot(float x, float y) { + if (mEnabled) { + super.setHotspot(x, y); + } + } + + @Override + public void setHotspotBounds(int left, int top, int right, int bottom) { + if (mEnabled) { + super.setHotspotBounds(left, top, right, bottom); + } + } + + @Override + public boolean setVisible(boolean visible, boolean restart) { + if (mEnabled) { + return super.setVisible(visible, restart); + } + return false; + } + } + + +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/NativeActionModeAwareLayout.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/NativeActionModeAwareLayout.java new file mode 100644 index 0000000000..d19fff9263 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/NativeActionModeAwareLayout.java @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.annotation.TargetApi; +import android.content.Context; +import android.os.Build; +import android.util.AttributeSet; +import android.view.ActionMode; +import android.view.View; + +/** + * @hide + */ +@TargetApi(Build.VERSION_CODES.HONEYCOMB) +public class NativeActionModeAwareLayout extends ContentFrameLayout { + + private OnActionModeForChildListener mActionModeForChildListener; + + public NativeActionModeAwareLayout(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public void setActionModeForChildListener(OnActionModeForChildListener listener) { + mActionModeForChildListener = listener; + } + + public ActionMode startActionModeForChild(View originalView, ActionMode.Callback callback) { + if (mActionModeForChildListener != null) { + return mActionModeForChildListener.startActionModeForChild(originalView, callback); + } + return super.startActionModeForChild(originalView, callback); + } + + /** + * @hide + */ + public interface OnActionModeForChildListener { + ActionMode startActionModeForChild(View originalView, ActionMode.Callback callback); + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ResourcesWrapper.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ResourcesWrapper.java new file mode 100644 index 0000000000..48ebab82c9 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ResourcesWrapper.java @@ -0,0 +1,282 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import org.xmlpull.v1.XmlPullParserException; + +import android.content.res.AssetFileDescriptor; +import android.content.res.AssetManager; +import android.content.res.ColorStateList; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.content.res.XmlResourceParser; +import android.graphics.Movie; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.Drawable.ConstantState; +import android.os.Bundle; +import android.util.AttributeSet; +import android.util.DisplayMetrics; +import android.util.LongSparseArray; +import android.util.TypedValue; + +import java.io.IOException; +import java.io.InputStream; + +/** + * This extends Resources but delegates the calls to another Resources object. This enables + * any customization done by some subclass of Resources to be also picked up. + */ +class ResourcesWrapper extends Resources { + + private final Resources mResources; + + public ResourcesWrapper(Resources resources) { + super(resources.getAssets(), resources.getDisplayMetrics(), resources.getConfiguration()); + mResources = resources; + } + + @Override + public CharSequence getText(int id) throws NotFoundException { + return mResources.getText(id); + } + + @Override + public CharSequence getQuantityText(int id, int quantity) throws NotFoundException { + return mResources.getQuantityText(id, quantity); + } + + @Override + public String getString(int id) throws NotFoundException { + return mResources.getString(id); + } + + @Override + public String getString(int id, Object... formatArgs) throws NotFoundException { + return mResources.getString(id, formatArgs); + } + + @Override + public String getQuantityString(int id, int quantity, Object... formatArgs) + throws NotFoundException { + return mResources.getQuantityString(id, quantity, formatArgs); + } + + @Override + public String getQuantityString(int id, int quantity) throws NotFoundException { + return mResources.getQuantityString(id, quantity); + } + + @Override + public CharSequence getText(int id, CharSequence def) { + return mResources.getText(id, def); + } + + @Override + public CharSequence[] getTextArray(int id) throws NotFoundException { + return mResources.getTextArray(id); + } + + @Override + public String[] getStringArray(int id) throws NotFoundException { + return mResources.getStringArray(id); + } + + @Override + public int[] getIntArray(int id) throws NotFoundException { + return mResources.getIntArray(id); + } + + @Override + public TypedArray obtainTypedArray(int id) throws NotFoundException { + return mResources.obtainTypedArray(id); + } + + @Override + public float getDimension(int id) throws NotFoundException { + return mResources.getDimension(id); + } + + @Override + public int getDimensionPixelOffset(int id) throws NotFoundException { + return mResources.getDimensionPixelOffset(id); + } + + @Override + public int getDimensionPixelSize(int id) throws NotFoundException { + return mResources.getDimensionPixelSize(id); + } + + @Override + public float getFraction(int id, int base, int pbase) { + return mResources.getFraction(id, base, pbase); + } + + @Override + public Drawable getDrawable(int id) throws NotFoundException { + return mResources.getDrawable(id); + } + + @Override + public Drawable getDrawable(int id, Theme theme) throws NotFoundException { + return mResources.getDrawable(id, theme); + } + + @Override + public Drawable getDrawableForDensity(int id, int density) throws NotFoundException { + return mResources.getDrawableForDensity(id, density); + } + + @Override + public Drawable getDrawableForDensity(int id, int density, Theme theme) { + return mResources.getDrawableForDensity(id, density, theme); + } + + @Override + public Movie getMovie(int id) throws NotFoundException { + return mResources.getMovie(id); + } + + @Override + public int getColor(int id) throws NotFoundException { + return mResources.getColor(id); + } + + @Override + public ColorStateList getColorStateList(int id) throws NotFoundException { + return mResources.getColorStateList(id); + } + + @Override + public boolean getBoolean(int id) throws NotFoundException { + return mResources.getBoolean(id); + } + + @Override + public int getInteger(int id) throws NotFoundException { + return mResources.getInteger(id); + } + + @Override + public XmlResourceParser getLayout(int id) throws NotFoundException { + return mResources.getLayout(id); + } + + @Override + public XmlResourceParser getAnimation(int id) throws NotFoundException { + return mResources.getAnimation(id); + } + + @Override + public XmlResourceParser getXml(int id) throws NotFoundException { + return mResources.getXml(id); + } + + @Override + public InputStream openRawResource(int id) throws NotFoundException { + return mResources.openRawResource(id); + } + + @Override + public InputStream openRawResource(int id, TypedValue value) throws NotFoundException { + return mResources.openRawResource(id, value); + } + + @Override + public AssetFileDescriptor openRawResourceFd(int id) throws NotFoundException { + return mResources.openRawResourceFd(id); + } + + @Override + public void getValue(int id, TypedValue outValue, boolean resolveRefs) + throws NotFoundException { + mResources.getValue(id, outValue, resolveRefs); + } + + @Override + public void getValueForDensity(int id, int density, TypedValue outValue, boolean resolveRefs) + throws NotFoundException { + mResources.getValueForDensity(id, density, outValue, resolveRefs); + } + + @Override + public void getValue(String name, TypedValue outValue, boolean resolveRefs) + throws NotFoundException { + mResources.getValue(name, outValue, resolveRefs); + } + + @Override + public TypedArray obtainAttributes(AttributeSet set, int[] attrs) { + return mResources.obtainAttributes(set, attrs); + } + + @Override + public void updateConfiguration(Configuration config, DisplayMetrics metrics) { + super.updateConfiguration(config, metrics); + if (mResources != null) { // called from super's constructor. So, need to check. + mResources.updateConfiguration(config, metrics); + } + } + + @Override + public DisplayMetrics getDisplayMetrics() { + return mResources.getDisplayMetrics(); + } + + @Override + public Configuration getConfiguration() { + return mResources.getConfiguration(); + } + + @Override + public int getIdentifier(String name, String defType, String defPackage) { + return mResources.getIdentifier(name, defType, defPackage); + } + + @Override + public String getResourceName(int resid) throws NotFoundException { + return mResources.getResourceName(resid); + } + + @Override + public String getResourcePackageName(int resid) throws NotFoundException { + return mResources.getResourcePackageName(resid); + } + + @Override + public String getResourceTypeName(int resid) throws NotFoundException { + return mResources.getResourceTypeName(resid); + } + + @Override + public String getResourceEntryName(int resid) throws NotFoundException { + return mResources.getResourceEntryName(resid); + } + + @Override + public void parseBundleExtras(XmlResourceParser parser, Bundle outBundle) + throws XmlPullParserException, IOException { + mResources.parseBundleExtras(parser, outBundle); + } + + @Override + public void parseBundleExtra(String tagName, AttributeSet attrs, Bundle outBundle) + throws XmlPullParserException { + mResources.parseBundleExtra(tagName, attrs, outBundle); + } +} + diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/RtlSpacingHelper.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/RtlSpacingHelper.java new file mode 100644 index 0000000000..e6c80d1572 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/RtlSpacingHelper.java @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package android.support.v7.internal.widget; + +/** + * RtlSpacingHelper manages the relationship between left/right and start/end for views + * that need to maintain both absolute and relative settings for a form of spacing similar + * to view padding. + * + * @hide + */ +public class RtlSpacingHelper { + public static final int UNDEFINED = Integer.MIN_VALUE; + + private int mLeft = 0; + private int mRight = 0; + private int mStart = UNDEFINED; + private int mEnd = UNDEFINED; + private int mExplicitLeft = 0; + private int mExplicitRight = 0; + + private boolean mIsRtl = false; + private boolean mIsRelative = false; + + public int getLeft() { + return mLeft; + } + + public int getRight() { + return mRight; + } + + public int getStart() { + return mIsRtl ? mRight : mLeft; + } + + public int getEnd() { + return mIsRtl ? mLeft : mRight; + } + + public void setRelative(int start, int end) { + mStart = start; + mEnd = end; + mIsRelative = true; + if (mIsRtl) { + if (end != UNDEFINED) mLeft = end; + if (start != UNDEFINED) mRight = start; + } else { + if (start != UNDEFINED) mLeft = start; + if (end != UNDEFINED) mRight = end; + } + } + + public void setAbsolute(int left, int right) { + mIsRelative = false; + if (left != UNDEFINED) mLeft = mExplicitLeft = left; + if (right != UNDEFINED) mRight = mExplicitRight = right; + } + + public void setDirection(boolean isRtl) { + if (isRtl == mIsRtl) { + return; + } + mIsRtl = isRtl; + if (mIsRelative) { + if (isRtl) { + mLeft = mEnd != UNDEFINED ? mEnd : mExplicitLeft; + mRight = mStart != UNDEFINED ? mStart : mExplicitRight; + } else { + mLeft = mStart != UNDEFINED ? mStart : mExplicitLeft; + mRight = mEnd != UNDEFINED ? mEnd : mExplicitRight; + } + } else { + mLeft = mExplicitLeft; + mRight = mExplicitRight; + } + } +} \ No newline at end of file diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ScrollingTabContainerView.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ScrollingTabContainerView.java new file mode 100644 index 0000000000..1426208572 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ScrollingTabContainerView.java @@ -0,0 +1,609 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package android.support.v7.internal.widget; + +import android.content.Context; +import android.content.res.Configuration; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.support.v4.view.GravityCompat; +import android.support.v4.view.ViewCompat; +import android.support.v4.view.ViewPropertyAnimatorCompat; +import android.support.v4.view.ViewPropertyAnimatorListener; +import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat; +import android.support.v7.app.ActionBar; +import android.support.v7.appcompat.R; +import android.support.v7.internal.view.ActionBarPolicy; +import android.support.v7.widget.LinearLayoutCompat; +import android.text.TextUtils; +import android.text.TextUtils.TruncateAt; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewParent; +import android.view.accessibility.AccessibilityEvent; +import android.view.accessibility.AccessibilityNodeInfo; +import android.view.animation.DecelerateInterpolator; +import android.view.animation.Interpolator; +import android.widget.BaseAdapter; +import android.widget.HorizontalScrollView; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ListView; +import android.widget.TextView; +import android.widget.Toast; + +/** + * This widget implements the dynamic action bar tab behavior that can change across different + * configurations or circumstances. + * + * @hide + */ +public class ScrollingTabContainerView extends HorizontalScrollView + implements AdapterViewCompat.OnItemClickListener { + + private static final String TAG = "ScrollingTabContainerView"; + Runnable mTabSelector; + private TabClickListener mTabClickListener; + + private LinearLayoutCompat mTabLayout; + private SpinnerCompat mTabSpinner; + private boolean mAllowCollapse; + + int mMaxTabWidth; + int mStackedTabMaxWidth; + private int mContentHeight; + private int mSelectedTabIndex; + + protected ViewPropertyAnimatorCompat mVisibilityAnim; + protected final VisibilityAnimListener mVisAnimListener = new VisibilityAnimListener(); + + private static final Interpolator sAlphaInterpolator = new DecelerateInterpolator(); + + private static final int FADE_DURATION = 200; + + public ScrollingTabContainerView(Context context) { + super(context); + + setHorizontalScrollBarEnabled(false); + + ActionBarPolicy abp = ActionBarPolicy.get(context); + setContentHeight(abp.getTabContainerHeight()); + mStackedTabMaxWidth = abp.getStackedTabMaxWidth(); + + 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; + } + mMaxTabWidth = Math.min(mMaxTabWidth, mStackedTabMaxWidth); + } 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); + } + } + if (mTabSpinner != null && position >= 0) { + mTabSpinner.setSelection(position); + } + } + + public void setContentHeight(int contentHeight) { + mContentHeight = contentHeight; + requestLayout(); + } + + private LinearLayoutCompat createTabLayout() { + final LinearLayoutCompat tabLayout = new LinearLayoutCompat(getContext(), null, + R.attr.actionBarTabBarStyle); + tabLayout.setMeasureWithLargestChildEnabled(true); + tabLayout.setGravity(Gravity.CENTER); + tabLayout.setLayoutParams(new LinearLayoutCompat.LayoutParams( + LinearLayoutCompat.LayoutParams.WRAP_CONTENT, LinearLayoutCompat.LayoutParams.MATCH_PARENT)); + return tabLayout; + } + + private SpinnerCompat createSpinner() { + final SpinnerCompat spinner = new SpinnerCompat(getContext(), null, + R.attr.actionDropDownStyle); + spinner.setLayoutParams(new LinearLayoutCompat.LayoutParams( + LinearLayoutCompat.LayoutParams.WRAP_CONTENT, LinearLayoutCompat.LayoutParams.MATCH_PARENT)); + spinner.setOnItemClickListenerInt(this); + return spinner; + } + + protected void onConfigurationChanged(Configuration newConfig) { + if (Build.VERSION.SDK_INT >= 8) { + super.onConfigurationChanged(newConfig); + } + + ActionBarPolicy abp = ActionBarPolicy.get(getContext()); + // Action bar can change size on configuration changes. + // Reread the desired height from the theme-specified style. + setContentHeight(abp.getTabContainerHeight()); + mStackedTabMaxWidth = abp.getStackedTabMaxWidth(); + } + + public void animateToVisibility(int visibility) { + if (mVisibilityAnim != null) { + mVisibilityAnim.cancel(); + } + if (visibility == VISIBLE) { + if (getVisibility() != VISIBLE) { + ViewCompat.setAlpha(this, 0f); + } + + ViewPropertyAnimatorCompat anim = ViewCompat.animate(this).alpha(1f); + anim.setDuration(FADE_DURATION); + + anim.setInterpolator(sAlphaInterpolator); + anim.setListener(mVisAnimListener.withFinalVisibility(anim, visibility)); + anim.start(); + } else { + ViewPropertyAnimatorCompat anim = ViewCompat.animate(this).alpha(0f); + anim.setDuration(FADE_DURATION); + + anim.setInterpolator(sAlphaInterpolator); + anim.setListener(mVisAnimListener.withFinalVisibility(anim, 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) { + final TabView tabView = new TabView(getContext(), 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 LinearLayoutCompat.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 LinearLayoutCompat.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 onItemClick(AdapterViewCompat parent, View view, int position, long id) { + TabView tabView = (TabView) view; + tabView.getTab().select(); + } + + private class TabView extends LinearLayoutCompat implements OnLongClickListener { + private final int[] BG_ATTRS = { + android.R.attr.background + }; + + private ActionBar.Tab mTab; + private TextView mTextView; + private ImageView mIconView; + private View mCustomView; + + public TabView(Context context, ActionBar.Tab tab, boolean forList) { + super(context, null, R.attr.actionBarTabStyle); + mTab = tab; + + TintTypedArray a = TintTypedArray.obtainStyledAttributes(context, null, BG_ATTRS, + R.attr.actionBarTabStyle, 0); + if (a.hasValue(0)) { + setBackgroundDrawable(a.getDrawable(0)); + } + a.recycle(); + + if (forList) { + setGravity(GravityCompat.START | Gravity.CENTER_VERTICAL); + } + + update(); + } + + public void bindTab(ActionBar.Tab tab) { + mTab = tab; + update(); + } + + @Override + public void setSelected(boolean selected) { + final boolean changed = (isSelected() != selected); + super.setSelected(selected); + if (changed && selected) { + sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED); + } + } + + @Override + public void onInitializeAccessibilityEvent(AccessibilityEvent event) { + super.onInitializeAccessibilityEvent(event); + // This view masquerades as an action bar tab. + event.setClassName(ActionBar.Tab.class.getName()); + } + + @Override + public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { + super.onInitializeAccessibilityNodeInfo(info); + + if (Build.VERSION.SDK_INT >= 14) { + // This view masquerades as an action bar tab. + info.setClassName(ActionBar.Tab.class.getName()); + } + } + + @Override + public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + + // Re-measure if we went beyond our maximum size. + if (mMaxTabWidth > 0 && getMeasuredWidth() > mMaxTabWidth) { + super.onMeasure(MeasureSpec.makeMeasureSpec(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); + } + + final boolean hasText = !TextUtils.isEmpty(text); + if (hasText) { + if (mTextView == null) { + TextView textView = new CompatTextView(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.setText(text); + mTextView.setVisibility(VISIBLE); + } else if (mTextView != null) { + mTextView.setVisibility(GONE); + mTextView.setText(null); + } + + if (mIconView != null) { + mIconView.setContentDescription(tab.getContentDescription()); + } + + if (!hasText && !TextUtils.isEmpty(tab.getContentDescription())) { + setOnLongClickListener(this); + } else { + setOnLongClickListener(null); + setLongClickable(false); + } + } + } + + public boolean onLongClick(View v) { + final int[] screenPos = new int[2]; + getLocationOnScreen(screenPos); + + final Context context = getContext(); + final int width = getWidth(); + final int height = getHeight(); + final int screenWidth = context.getResources().getDisplayMetrics().widthPixels; + + Toast cheatSheet = Toast.makeText(context, mTab.getContentDescription(), + Toast.LENGTH_SHORT); + // Show under the tab + cheatSheet.setGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL, + (screenPos[0] + width / 2) - screenWidth / 2, height); + + cheatSheet.show(); + return true; + } + + 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 ViewPropertyAnimatorListener { + private boolean mCanceled = false; + private int mFinalVisibility; + + public VisibilityAnimListener withFinalVisibility(ViewPropertyAnimatorCompat animation, + int visibility) { + mFinalVisibility = visibility; + mVisibilityAnim = animation; + return this; + } + + @Override + public void onAnimationStart(View view) { + setVisibility(VISIBLE); + mCanceled = false; + } + + @Override + public void onAnimationEnd(View view) { + if (mCanceled) return; + + mVisibilityAnim = null; + setVisibility(mFinalVisibility); + } + + @Override + public void onAnimationCancel(View view) { + mCanceled = true; + } + } +} + diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/SpinnerCompat.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/SpinnerCompat.java new file mode 100644 index 0000000000..b2b8af24ad --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/SpinnerCompat.java @@ -0,0 +1,1102 @@ +/* + * 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 android.support.v7.internal.widget; + +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.database.DataSetObserver; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.os.Parcel; +import android.os.Parcelable; +import android.support.v4.view.GravityCompat; +import android.support.v4.view.ViewCompat; +import android.support.v7.appcompat.R; +import android.support.v7.widget.ListPopupWindow; +import android.util.AttributeSet; +import android.util.Log; +import android.view.Gravity; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewTreeObserver; +import android.widget.AdapterView; +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 android.widget.Adapter} associated with this view. + * + *

      See the Spinner + * tutorial.

      + */ +class SpinnerCompat extends AbsSpinnerCompat implements DialogInterface.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; + + /** + * Forwarding listener used to implement drag-to-open. + */ + private ListPopupWindow.ForwardingListener mForwardingListener; + + private SpinnerPopup mPopup; + + private DropDownAdapter mTempAdapter; + + int mDropDownWidth; + + private int mGravity; + + private boolean mDisableChildrenWhenDisabled; + + private Rect mTempRect = new Rect(); + + private final TintManager mTintManager; + + /** + * Construct a new spinner with the given context's theme. + * + * @param context The Context the view is running in, through which it can access the current + * theme, resources, etc. + */ + SpinnerCompat(Context context) { + this(context, null); + } + + /** + * Construct a new spinner with the given context's theme and the supplied mode of displaying + * choices. mode may be one of {@link #MODE_DIALOG} or {@link #MODE_DROPDOWN}. + * + * @param context The Context the view is running in, through which it can access the current + * theme, resources, etc. + * @param mode Constant describing how the user will select choices from the spinner. + * @see #MODE_DIALOG + * @see #MODE_DROPDOWN + */ + SpinnerCompat(Context context, int mode) { + this(context, null, R.attr.spinnerStyle, mode); + } + + /** + * Construct a new spinner with the given context's theme and the supplied attribute set. + * + * @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. + */ + SpinnerCompat(Context context, AttributeSet attrs) { + this(context, attrs, R.attr.spinnerStyle); + } + + /** + * 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. + */ + SpinnerCompat(Context context, AttributeSet attrs, int defStyle) { + this(context, attrs, defStyle, MODE_THEME); + } + + /** + * Construct a new spinner with the given context's theme, the supplied attribute set, and + * default style. mode may be one of {@link #MODE_DIALOG} or {@link #MODE_DROPDOWN} + * and determines how the user will select choices from the spinner. + * + * @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. + * @param mode Constant describing how the user will select choices from the spinner. + * @see #MODE_DIALOG + * @see #MODE_DROPDOWN + */ + SpinnerCompat(Context context, AttributeSet attrs, int defStyle, int mode) { + super(context, attrs, defStyle); + + TintTypedArray a = TintTypedArray.obtainStyledAttributes(context, attrs, + R.styleable.Spinner, defStyle, 0); + + // Need to reset this for tinting purposes + if (a.hasValue(R.styleable.Spinner_android_background)) { + setBackgroundDrawable(a.getDrawable(R.styleable.Spinner_android_background)); + } + + if (mode == MODE_THEME) { + mode = a.getInt(R.styleable.Spinner_spinnerMode, MODE_DIALOG); + } + + switch (mode) { + case MODE_DIALOG: { + mPopup = new DialogPopup(); + break; + } + + case MODE_DROPDOWN: { + final 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)); + + mPopup = popup; + mForwardingListener = new ListPopupWindow.ForwardingListener(this) { + @Override + public ListPopupWindow getPopup() { + return popup; + } + + @Override + public boolean onForwardingStarted() { + if (!mPopup.isShowing()) { + mPopup.show(); + } + return true; + } + }; + break; + } + } + + mGravity = a.getInt(R.styleable.Spinner_android_gravity, Gravity.CENTER); + + mPopup.setPromptText(a.getString(R.styleable.Spinner_prompt)); + + mDisableChildrenWhenDisabled = a.getBoolean( + R.styleable.Spinner_disableChildrenWhenDisabled, false); + + 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; + } + + // Keep the TintManager in case we need it later + mTintManager = a.getTintManager(); + } + + /** + * Set the background drawable for the spinner's popup window of choices. Only valid in {@link + * #MODE_DROPDOWN}; this method is a no-op in other modes. + * + * @param background Background drawable + */ + public void setPopupBackgroundDrawable(Drawable background) { + if (!(mPopup instanceof DropdownPopup)) { + Log.e(TAG, "setPopupBackgroundDrawable: incompatible spinner mode; ignoring..."); + return; + } + ((DropdownPopup) mPopup).setBackgroundDrawable(background); + } + + /** + * Set the background drawable for the spinner's popup window of choices. Only valid in {@link + * #MODE_DROPDOWN}; this method is a no-op in other modes. + * + * @param resId Resource ID of a background drawable + */ + public void setPopupBackgroundResource(int resId) { + setPopupBackgroundDrawable(mTintManager.getDrawable(resId)); + } + + /** + * Get the background drawable for the spinner's popup window of choices. Only valid in {@link + * #MODE_DROPDOWN}; other modes will return null. + * + * @return background Background drawable + */ + public Drawable getPopupBackground() { + return mPopup.getBackground(); + } + + /** + * Set a vertical offset in pixels for the spinner's popup window of choices. Only valid in + * {@link #MODE_DROPDOWN}; this method is a no-op in other modes. + * + * @param pixels Vertical offset in pixels + */ + public void setDropDownVerticalOffset(int pixels) { + mPopup.setVerticalOffset(pixels); + } + + /** + * Get the configured vertical offset in pixels for the spinner's popup window of choices. Only + * valid in {@link #MODE_DROPDOWN}; other modes will return 0. + * + * @return Vertical offset in pixels + */ + public int getDropDownVerticalOffset() { + return mPopup.getVerticalOffset(); + } + + /** + * Set a horizontal offset in pixels for the spinner's popup window of choices. Only valid in + * {@link #MODE_DROPDOWN}; this method is a no-op in other modes. + * + * @param pixels Horizontal offset in pixels + */ + public void setDropDownHorizontalOffset(int pixels) { + mPopup.setHorizontalOffset(pixels); + } + + /** + * Get the configured horizontal offset in pixels for the spinner's popup window of choices. + * Only valid in {@link #MODE_DROPDOWN}; other modes will return 0. + * + * @return Horizontal offset in pixels + */ + public int getDropDownHorizontalOffset() { + return mPopup.getHorizontalOffset(); + } + + /** + * Set the width of the spinner's popup window of choices in pixels. This value may also be set + * to {@link android.view.ViewGroup.LayoutParams#MATCH_PARENT} to match the width of the Spinner + * itself, or {@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT} to wrap to the measured + * size of contained dropdown list items. + * + *

      Only valid in {@link #MODE_DROPDOWN}; this method is a no-op in other modes.

      + * + * @param pixels Width in pixels, WRAP_CONTENT, or MATCH_PARENT + */ + public void setDropDownWidth(int pixels) { + if (!(mPopup instanceof DropdownPopup)) { + Log.e(TAG, "Cannot set dropdown width for MODE_DIALOG, ignoring"); + return; + } + mDropDownWidth = pixels; + } + + /** + * Get the configured width of the spinner's popup window of choices in pixels. The returned + * value may also be {@link android.view.ViewGroup.LayoutParams#MATCH_PARENT} meaning the popup + * window will match the width of the Spinner itself, or {@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT} + * to wrap to the measured size of contained dropdown list items. + * + * @return Width in pixels, WRAP_CONTENT, or MATCH_PARENT + */ + public int getDropDownWidth() { + return mDropDownWidth; + } + + @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} + */ + public void setGravity(int gravity) { + if (mGravity != gravity) { + if ((gravity & Gravity.HORIZONTAL_GRAVITY_MASK) == 0) { + gravity |= GravityCompat.START; + } + mGravity = gravity; + requestLayout(); + } + } + + @Override + public void setAdapter(SpinnerAdapter adapter) { + super.setAdapter(adapter); + + mRecycler.clear(); + + final int targetSdkVersion = getContext().getApplicationInfo().targetSdkVersion; + if (targetSdkVersion >= Build.VERSION_CODES.LOLLIPOP + && adapter != null && adapter.getViewTypeCount() != 1) { + throw new IllegalArgumentException("Spinner adapter view type count must be 1"); + } + 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 = makeView(0, false); + mRecycler.put(0, child); + } + + 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."); + } + + void setOnItemClickListenerInt(OnItemClickListener l) { + super.setOnItemClickListener(l); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + if (mForwardingListener != null && mForwardingListener.onTouch(this, event)) { + return true; + } + + return super.onTouchEvent(event); + } + + @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 means 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; + if (mAdapter != null) { + View sel = makeView(mSelectedPosition, true); + int width = sel.getMeasuredWidth(); + int selectedOffset = childrenLeft; + final int layoutDirection = ViewCompat.getLayoutDirection(this); + final int absoluteGravity = GravityCompat.getAbsoluteGravity(mGravity, layoutDirection); + switch (absoluteGravity & 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 + * @param addChild true to add the child to the spinner, false to obtain and configure only. + * @return A view for the given position + */ + private View makeView(int position, boolean addChild) { + + View child; + + if (!mDataChanged) { + child = mRecycler.get(position); + if (child != null) { + // Position the view + setUpChild(child, addChild); + + return child; + } + } + + // Nothing found in the recycler -- ask the adapter for a view + child = mAdapter.getView(position, null, this); + + // Position the view + setUpChild(child, addChild); + + return child; + } + + /** + * Helper for makeAndAddView to set the position of a view and fill out its layout paramters. + * + * @param child The view to position + * @param addChild true if the child should be added to the Spinner during setup + */ + private void setUpChild(View child, boolean addChild) { + + // Respect layout params that are already in the view. Otherwise + // make some up... + ViewGroup.LayoutParams lp = child.getLayoutParams(); + if (lp == null) { + lp = generateDefaultLayoutParams(); + } + + if (addChild) { + 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; + } + + @Override + public Parcelable onSaveInstanceState() { + final SavedState ss = new SavedState(super.onSaveInstanceState()); + ss.showDropdown = mPopup != null && mPopup.isShowing(); + return ss; + } + + @Override + public void onRestoreInstanceState(Parcelable state) { + SavedState ss = (SavedState) state; + + super.onRestoreInstanceState(ss.getSuperState()); + + if (ss.showDropdown) { + ViewTreeObserver vto = getViewTreeObserver(); + if (vto != null) { + final ViewTreeObserver.OnGlobalLayoutListener listener + = new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + if (!mPopup.isShowing()) { + mPopup.show(); + } + final ViewTreeObserver vto = getViewTreeObserver(); + if (vto != null) { + vto.removeGlobalOnLayoutListener(this); + } + } + }; + vto.addOnGlobalLayoutListener(listener); + } + } + } + + static class SavedState extends AbsSpinnerCompat.SavedState { + + boolean showDropdown; + + SavedState(Parcelable superState) { + super(superState); + } + + private SavedState(Parcel in) { + super(in); + showDropdown = in.readByte() != 0; + } + + @Override + public void writeToParcel(Parcel out, int flags) { + super.writeToParcel(out, flags); + out.writeByte((byte) (showDropdown ? 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]; + } + }; + } + + /** + *

      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(); + + public void setBackgroundDrawable(Drawable bg); + + public void setVerticalOffset(int px); + + public void setHorizontalOffset(int px); + + public Drawable getBackground(); + + public int getVerticalOffset(); + + public int getHorizontalOffset(); + } + + private class DialogPopup implements SpinnerPopup, DialogInterface.OnClickListener { + + private AlertDialog mPopup; + + private ListAdapter mListAdapter; + + private CharSequence mPrompt; + + public void dismiss() { + if (mPopup != null) { + 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() { + if (mListAdapter == null) { + return; + } + AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); + if (mPrompt != null) { + builder.setTitle(mPrompt); + } + mPopup = builder.setSingleChoiceItems(mListAdapter, + getSelectedItemPosition(), this).create(); + mPopup.show(); + } + + public void onClick(DialogInterface dialog, int which) { + setSelection(which); + if (mOnItemClickListener != null) { + performItemClick(null, which, mListAdapter.getItemId(which)); + } + dismiss(); + } + + @Override + public void setBackgroundDrawable(Drawable bg) { + Log.e(TAG, "Cannot set popup background for MODE_DIALOG, ignoring"); + } + + @Override + public void setVerticalOffset(int px) { + Log.e(TAG, "Cannot set vertical offset for MODE_DIALOG, ignoring"); + } + + @Override + public void setHorizontalOffset(int px) { + Log.e(TAG, "Cannot set horizontal offset for MODE_DIALOG, ignoring"); + } + + @Override + public Drawable getBackground() { + return null; + } + + @Override + public int getVerticalOffset() { + return 0; + } + + @Override + public int getHorizontalOffset() { + return 0; + } + } + + private class DropdownPopup extends ListPopupWindow implements SpinnerPopup { + + private CharSequence mHintText; + + private ListAdapter mAdapter; + + public DropdownPopup( + Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + setAnchorView(SpinnerCompat.this); + setModal(true); + setPromptPosition(POSITION_PROMPT_ABOVE); + + setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View v, int position, long id) { + SpinnerCompat.this.setSelection(position); + if (mOnItemClickListener != null) { + SpinnerCompat.this + .performItemClick(v, position, mAdapter.getItemId(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; + } + + void computeContentWidth() { + final Drawable background = getBackground(); + int hOffset = 0; + if (background != null) { + background.getPadding(mTempRect); + hOffset = ViewUtils.isLayoutRtl(SpinnerCompat.this) ? mTempRect.right + : -mTempRect.left; + } else { + mTempRect.left = mTempRect.right = 0; + } + + final int spinnerPaddingLeft = SpinnerCompat.this.getPaddingLeft(); + final int spinnerPaddingRight = SpinnerCompat.this.getPaddingRight(); + final int spinnerWidth = SpinnerCompat.this.getWidth(); + if (mDropDownWidth == WRAP_CONTENT) { + 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 == MATCH_PARENT) { + setContentWidth(spinnerWidth - spinnerPaddingLeft - spinnerPaddingRight); + } else { + setContentWidth(mDropDownWidth); + } + if (ViewUtils.isLayoutRtl(SpinnerCompat.this)) { + hOffset += spinnerWidth - spinnerPaddingRight - getWidth(); + } else { + hOffset += spinnerPaddingLeft; + } + setHorizontalOffset(hOffset); + } + + public void show(int textDirection, int textAlignment) { + final boolean wasShowing = isShowing(); + + computeContentWidth(); + setInputMethodMode(ListPopupWindow.INPUT_METHOD_NOT_NEEDED); + super.show(); + final ListView listView = getListView(); + listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); + //listView.setTextDirection(textDirection); + //listView.setTextAlignment(textAlignment); + setSelection(SpinnerCompat.this.getSelectedItemPosition()); + + if (wasShowing) { + // Skip setting up the layout/dismiss listener below. If we were previously + // showing it will still stick around. + return; + } + + // Make sure we hide if our anchor goes away. + // TODO: This might be appropriate to push all the way down to PopupWindow, + // but it may have other side effects to investigate first. (Text editing handles, etc.) + final ViewTreeObserver vto = getViewTreeObserver(); + if (vto != null) { + final ViewTreeObserver.OnGlobalLayoutListener layoutListener + = new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + computeContentWidth(); + + // Use super.show here to update; we don't want to move the selected + // position or adjust other things that would be reset otherwise. + DropdownPopup.super.show(); + } + }; + vto.addOnGlobalLayoutListener(layoutListener); + setOnDismissListener(new PopupWindow.OnDismissListener() { + @Override + public void onDismiss() { + final ViewTreeObserver vto = getViewTreeObserver(); + if (vto != null) { + vto.removeGlobalOnLayoutListener(layoutListener); + } + } + }); + } + } + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ThemeUtils.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ThemeUtils.java new file mode 100644 index 0000000000..aacecfa36b --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ThemeUtils.java @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.content.res.ColorStateList; +import android.content.res.TypedArray; +import android.graphics.Color; +import android.support.v4.graphics.ColorUtils; +import android.util.TypedValue; + +class ThemeUtils { + + private static final ThreadLocal TL_TYPED_VALUE = new ThreadLocal<>(); + + private static final int[] DISABLED_STATE_SET = new int[]{-android.R.attr.state_enabled}; + private static final int[] EMPTY_STATE_SET = new int[0]; + + private static final int[] TEMP_ARRAY = new int[1]; + + static ColorStateList createDisabledStateList(int textColor, int disabledTextColor) { + // Now create a new ColorStateList with the default color, and the new disabled + // color + final int[][] states = new int[2][]; + final int[] colors = new int[2]; + int i = 0; + + // Disabled state + states[i] = DISABLED_STATE_SET; + colors[i] = disabledTextColor; + i++; + + // Default state + states[i] = EMPTY_STATE_SET; + colors[i] = textColor; + i++; + + return new ColorStateList(states, colors); + } + + static int getThemeAttrColor(Context context, int attr) { + TEMP_ARRAY[0] = attr; + TypedArray a = context.obtainStyledAttributes(null, TEMP_ARRAY); + try { + return a.getColor(0, 0); + } finally { + a.recycle(); + } + } + + static ColorStateList getThemeAttrColorStateList(Context context, int attr) { + TEMP_ARRAY[0] = attr; + TypedArray a = context.obtainStyledAttributes(null, TEMP_ARRAY); + try { + return a.getColorStateList(0); + } finally { + a.recycle(); + } + } + + static int getDisabledThemeAttrColor(Context context, int attr) { + final ColorStateList csl = getThemeAttrColorStateList(context, attr); + if (csl != null && csl.isStateful()) { + // If the CSL is stateful, we'll assume it has a disabled state and use it + return csl.getColorForState(DISABLED_STATE_SET, csl.getDefaultColor()); + } else { + // Else, we'll generate the color using disabledAlpha from the theme + + final TypedValue tv = getTypedValue(); + // Now retrieve the disabledAlpha value from the theme + context.getTheme().resolveAttribute(android.R.attr.disabledAlpha, tv, true); + final float disabledAlpha = tv.getFloat(); + + return getThemeAttrColor(context, attr, disabledAlpha); + } + } + + private static TypedValue getTypedValue() { + TypedValue typedValue = TL_TYPED_VALUE.get(); + if (typedValue == null) { + typedValue = new TypedValue(); + TL_TYPED_VALUE.set(typedValue); + } + return typedValue; + } + + static int getThemeAttrColor(Context context, int attr, float alpha) { + final int color = getThemeAttrColor(context, attr); + final int originalAlpha = Color.alpha(color); + return ColorUtils.setAlphaComponent(color, Math.round(originalAlpha * alpha)); + } + +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintAutoCompleteTextView.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintAutoCompleteTextView.java new file mode 100644 index 0000000000..29ec605f46 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintAutoCompleteTextView.java @@ -0,0 +1,142 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.content.res.ColorStateList; +import android.graphics.PorterDuff; +import android.support.annotation.Nullable; +import android.support.v4.view.TintableBackgroundView; +import android.util.AttributeSet; +import android.widget.AutoCompleteTextView; + +/** + * An tint aware {@link android.widget.AutoCompleteTextView}. + *

      + * This will automatically be used when you use {@link AutoCompleteTextView} in your layouts. You + * should only need to manually use this class writing custom views. + */ +public class TintAutoCompleteTextView extends AutoCompleteTextView implements + TintableBackgroundView { + + private static final int[] TINT_ATTRS = { + android.R.attr.background, + android.R.attr.popupBackground + }; + + private TintManager mTintManager; + private TintInfo mBackgroundTint; + + public TintAutoCompleteTextView(Context context) { + this(context, null); + } + + public TintAutoCompleteTextView(Context context, AttributeSet attrs) { + this(context, attrs, android.R.attr.autoCompleteTextViewStyle); + } + + public TintAutoCompleteTextView(Context context, AttributeSet attrs, int defStyleAttr) { + super(TintContextWrapper.wrap(context), attrs, defStyleAttr); + + if (TintManager.SHOULD_BE_USED) { + TintTypedArray a = TintTypedArray.obtainStyledAttributes(getContext(), attrs, + TINT_ATTRS, defStyleAttr, 0); + mTintManager = a.getTintManager(); + + if (a.hasValue(0)) { + setSupportBackgroundTintList( + mTintManager.getColorStateList(a.getResourceId(0, -1))); + } + if (a.hasValue(1)) { + setDropDownBackgroundDrawable(a.getDrawable(1)); + } + a.recycle(); + } + } + + @Override + public void setDropDownBackgroundResource(int id) { + setDropDownBackgroundDrawable(mTintManager.getDrawable(id)); + } + + /** + * This should be accessed via + * {@link android.support.v4.view.ViewCompat#setBackgroundTintList(android.view.View, + * android.content.res.ColorStateList)} + * + * @hide + */ + @Override + public void setSupportBackgroundTintList(@Nullable ColorStateList tint) { + if (mBackgroundTint == null) { + mBackgroundTint = new TintInfo(); + } + mBackgroundTint.mTintList = tint; + applySupportBackgroundTint(); + } + + /** + * This should be accessed via + * {@link android.support.v4.view.ViewCompat#getBackgroundTintList(android.view.View)} + * + * @hide + */ + @Override + @Nullable + public ColorStateList getSupportBackgroundTintList() { + return mBackgroundTint != null ? mBackgroundTint.mTintList : null; + } + + /** + * This should be accessed via + * {@link android.support.v4.view.ViewCompat#setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode)} + * + * @hide + */ + @Override + public void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) { + if (mBackgroundTint == null) { + mBackgroundTint = new TintInfo(); + } + mBackgroundTint.mTintMode = tintMode; + applySupportBackgroundTint(); + } + + /** + * This should be accessed via + * {@link android.support.v4.view.ViewCompat#getBackgroundTintMode(android.view.View)} + * + * @hide + */ + @Override + @Nullable + public PorterDuff.Mode getSupportBackgroundTintMode() { + return mBackgroundTint != null ? mBackgroundTint.mTintMode : null; + } + + @Override + protected void drawableStateChanged() { + super.drawableStateChanged(); + applySupportBackgroundTint(); + } + + private void applySupportBackgroundTint() { + if (getBackground() != null && mBackgroundTint != null) { + TintManager.tintViewBackground(this, mBackgroundTint); + } + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintButton.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintButton.java new file mode 100644 index 0000000000..41b3c3b354 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintButton.java @@ -0,0 +1,154 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.content.res.ColorStateList; +import android.graphics.PorterDuff; +import android.os.Build; +import android.support.annotation.Nullable; +import android.support.v4.view.TintableBackgroundView; +import android.util.AttributeSet; +import android.widget.Button; + +/** + * An tint aware {@link android.widget.Button}. + *

      + * This will automatically be used when you use {@link android.widget.Button} in your layouts. You + * should only need to manually use this class when writing custom views. + */ +public class TintButton extends Button implements TintableBackgroundView { + + private static final int[] TINT_ATTRS = { + android.R.attr.background + }; + + private TintInfo mBackgroundTint; + + public TintButton(Context context) { + this(context, null); + } + + public TintButton(Context context, AttributeSet attrs) { + this(context, attrs, android.R.attr.buttonStyle); + } + + public TintButton(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + if (TintManager.SHOULD_BE_USED) { + TintTypedArray a = TintTypedArray.obtainStyledAttributes(getContext(), attrs, + TINT_ATTRS, defStyleAttr, 0); + if (a.hasValue(0)) { + setSupportBackgroundTintList( + a.getTintManager().getColorStateList(a.getResourceId(0, -1))); + } + a.recycle(); + } + + final ColorStateList textColors = getTextColors(); + if (textColors != null && !textColors.isStateful()) { + // If we have a ColorStateList which isn't stateful, create one which includes + // a disabled state + + final int disabledTextColor; + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { + // Pre-Lollipop, we will use textColorSecondary with android:disabledAlpha + // applied + disabledTextColor = ThemeUtils.getDisabledThemeAttrColor(context, + android.R.attr.textColorSecondary); + } else { + // With certain styles on Lollipop, there is a StateListAnimator which sets + // an alpha on the whole view, so we don't need to apply disabledAlpha to + // textColorSecondary + disabledTextColor = ThemeUtils.getThemeAttrColor(context, + android.R.attr.textColorSecondary); + } + + setTextColor(ThemeUtils.createDisabledStateList( + textColors.getDefaultColor(), disabledTextColor)); + } + } + + /** + * This should be accessed via + * {@link android.support.v4.view.ViewCompat#setBackgroundTintList(android.view.View, + * android.content.res.ColorStateList)} + * + * @hide + */ + @Override + public void setSupportBackgroundTintList(@Nullable ColorStateList tint) { + if (mBackgroundTint == null) { + mBackgroundTint = new TintInfo(); + } + mBackgroundTint.mTintList = tint; + applySupportBackgroundTint(); + } + + /** + * This should be accessed via + * {@link android.support.v4.view.ViewCompat#getBackgroundTintList(android.view.View)} + * + * @hide + */ + @Override + @Nullable + public ColorStateList getSupportBackgroundTintList() { + return mBackgroundTint != null ? mBackgroundTint.mTintList : null; + } + + /** + * This should be accessed via + * {@link android.support.v4.view.ViewCompat#setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode)} + * + * @hide + */ + @Override + public void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) { + if (mBackgroundTint == null) { + mBackgroundTint = new TintInfo(); + } + mBackgroundTint.mTintMode = tintMode; + applySupportBackgroundTint(); + } + + /** + * This should be accessed via + * {@link android.support.v4.view.ViewCompat#getBackgroundTintMode(android.view.View)} + * + * @hide + */ + @Override + @Nullable + public PorterDuff.Mode getSupportBackgroundTintMode() { + return mBackgroundTint != null ? mBackgroundTint.mTintMode : null; + } + + @Override + protected void drawableStateChanged() { + super.drawableStateChanged(); + applySupportBackgroundTint(); + } + + private void applySupportBackgroundTint() { + if (getBackground() != null && mBackgroundTint != null) { + TintManager.tintViewBackground(this, mBackgroundTint); + } + } + +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintCheckBox.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintCheckBox.java new file mode 100644 index 0000000000..ea1fa684f5 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintCheckBox.java @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.CheckBox; + +/** + * An tint aware {@link android.widget.CheckBox}. + *

      + * This will automatically be used when you use {@link android.widget.CheckBox} in your layouts. + * You should only need to manually use this class when writing custom views. + */ +public class TintCheckBox extends CheckBox { + + private static final int[] TINT_ATTRS = { + android.R.attr.button + }; + + private TintManager mTintManager; + + public TintCheckBox(Context context) { + this(context, null); + } + + public TintCheckBox(Context context, AttributeSet attrs) { + this(context, attrs, android.R.attr.checkboxStyle); + } + + public TintCheckBox(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + if (TintManager.SHOULD_BE_USED) { + TintTypedArray a = TintTypedArray.obtainStyledAttributes(getContext(), attrs, + TINT_ATTRS, defStyleAttr, 0); + setButtonDrawable(a.getDrawable(0)); + a.recycle(); + + mTintManager = a.getTintManager(); + } + } + + @Override + public void setButtonDrawable(int resid) { + if (mTintManager != null) { + setButtonDrawable(mTintManager.getDrawable(resid)); + } else { + super.setButtonDrawable(resid); + } + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintCheckedTextView.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintCheckedTextView.java new file mode 100644 index 0000000000..c969ad21ad --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintCheckedTextView.java @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.CheckedTextView; + +/** + * An tint aware {@link android.widget.CheckedTextView}. + *

      + * This will automatically be used when you use {@link android.widget.CheckedTextView} in your + * layouts. You should only need to manually use this class when writing custom views. + */ +public class TintCheckedTextView extends CheckedTextView { + + private static final int[] TINT_ATTRS = { + android.R.attr.checkMark + }; + + private TintManager mTintManager; + + public TintCheckedTextView(Context context) { + this(context, null); + } + + public TintCheckedTextView(Context context, AttributeSet attrs) { + this(context, attrs, android.R.attr.checkedTextViewStyle); + } + + public TintCheckedTextView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + if (TintManager.SHOULD_BE_USED) { + TintTypedArray a = TintTypedArray.obtainStyledAttributes(getContext(), attrs, + TINT_ATTRS, defStyleAttr, 0); + setCheckMarkDrawable(a.getDrawable(0)); + a.recycle(); + + mTintManager = a.getTintManager(); + } + } + + @Override + public void setCheckMarkDrawable(int resid) { + if (mTintManager != null) { + setCheckMarkDrawable(mTintManager.getDrawable(resid)); + } else { + super.setCheckMarkDrawable(resid); + } + } + +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintContextWrapper.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintContextWrapper.java new file mode 100644 index 0000000000..794728862a --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintContextWrapper.java @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.content.ContextWrapper; +import android.content.res.Resources; + +/** + * A {@link android.content.ContextWrapper} which returns a tint-aware + * {@link android.content.res.Resources} instance from {@link #getResources()}. + * + * @hide + */ +class TintContextWrapper extends ContextWrapper { + + private final TintManager mTintManager; + + public static Context wrap(Context context) { + if (!(context instanceof TintContextWrapper)) { + context = new TintContextWrapper(context); + } + return context; + } + + TintContextWrapper(Context base) { + super(base); + mTintManager = new TintManager(base); + } + + @Override + public Resources getResources() { + return mTintManager.getResources(); + } + + final TintManager getTintManager() { + return mTintManager; + } +} \ No newline at end of file diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintEditText.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintEditText.java new file mode 100644 index 0000000000..95ba859701 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintEditText.java @@ -0,0 +1,129 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.content.res.ColorStateList; +import android.graphics.PorterDuff; +import android.support.annotation.Nullable; +import android.support.v4.view.TintableBackgroundView; +import android.util.AttributeSet; +import android.widget.EditText; + +/** + * An tint aware {@link android.widget.EditText}. + *

      + * This will automatically be used when you use {@link android.widget.EditText} in your + * layouts. You should only need to manually use this class when writing custom views. + */ +public class TintEditText extends EditText implements TintableBackgroundView { + + private static final int[] TINT_ATTRS = { + android.R.attr.background + }; + + private TintInfo mBackgroundTint; + + public TintEditText(Context context) { + this(context, null); + } + + public TintEditText(Context context, AttributeSet attrs) { + this(TintContextWrapper.wrap(context), attrs, android.R.attr.editTextStyle); + } + + public TintEditText(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + if (TintManager.SHOULD_BE_USED) { + TintTypedArray a = TintTypedArray.obtainStyledAttributes(getContext(), attrs, + TINT_ATTRS, defStyleAttr, 0); + if (a.hasValue(0)) { + setSupportBackgroundTintList( + a.getTintManager().getColorStateList(a.getResourceId(0, -1))); + } + a.recycle(); + } + } + + /** + * This should be accessed via + * {@link android.support.v4.view.ViewCompat#setBackgroundTintList(android.view.View, + * android.content.res.ColorStateList)} + * + * @hide + */ + @Override + public void setSupportBackgroundTintList(@Nullable ColorStateList tint) { + if (mBackgroundTint == null) { + mBackgroundTint = new TintInfo(); + } + mBackgroundTint.mTintList = tint; + applySupportBackgroundTint(); + } + + /** + * This should be accessed via + * {@link android.support.v4.view.ViewCompat#getBackgroundTintList(android.view.View)} + * + * @hide + */ + @Override + @Nullable + public ColorStateList getSupportBackgroundTintList() { + return mBackgroundTint != null ? mBackgroundTint.mTintList : null; + } + + /** + * This should be accessed via + * {@link android.support.v4.view.ViewCompat#setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode)} + * + * @hide + */ + @Override + public void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) { + if (mBackgroundTint == null) { + mBackgroundTint = new TintInfo(); + } + mBackgroundTint.mTintMode = tintMode; + applySupportBackgroundTint(); + } + + /** + * This should be accessed via + * {@link android.support.v4.view.ViewCompat#getBackgroundTintMode(android.view.View)} + * + * @hide + */ + @Override + @Nullable + public PorterDuff.Mode getSupportBackgroundTintMode() { + return mBackgroundTint != null ? mBackgroundTint.mTintMode : null; + } + + @Override + protected void drawableStateChanged() { + super.drawableStateChanged(); + applySupportBackgroundTint(); + } + + private void applySupportBackgroundTint() { + if (getBackground() != null && mBackgroundTint != null) { + TintManager.tintViewBackground(this, mBackgroundTint); + } + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintImageView.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintImageView.java new file mode 100644 index 0000000000..17dd557385 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintImageView.java @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.support.annotation.DrawableRes; +import android.util.AttributeSet; +import android.widget.ImageView; + +/** + * An tint aware {@link android.widget.ImageView} + * + * @hide + */ +public class TintImageView extends ImageView { + + private static final int[] TINT_ATTRS = { + android.R.attr.background, + android.R.attr.src + }; + + private final TintManager mTintManager; + + public TintImageView(Context context) { + this(context, null); + } + + public TintImageView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public TintImageView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + TintTypedArray a = TintTypedArray.obtainStyledAttributes(getContext(), attrs, TINT_ATTRS, + defStyleAttr, 0); + if (a.length() > 0) { + if (a.hasValue(0)) { + setBackgroundDrawable(a.getDrawable(0)); + } + if (a.hasValue(1)) { + setImageDrawable(a.getDrawable(1)); + } + } + a.recycle(); + + // Keep the TintManager in case we need it later + mTintManager = a.getTintManager(); + } + + @Override + public void setImageResource(@DrawableRes int resId) { + // Intercept this call and instead retrieve the Drawable via the tint manager + setImageDrawable(mTintManager.getDrawable(resId)); + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintInfo.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintInfo.java new file mode 100644 index 0000000000..ba2a56a385 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintInfo.java @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.res.ColorStateList; +import android.graphics.PorterDuff; + +class TintInfo { + ColorStateList mTintList; + PorterDuff.Mode mTintMode; +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintManager.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintManager.java new file mode 100644 index 0000000000..9fdfaa8339 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintManager.java @@ -0,0 +1,511 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.content.res.ColorStateList; +import android.content.res.Resources; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.support.v4.content.ContextCompat; +import android.support.v4.graphics.drawable.DrawableCompat; +import android.support.v4.util.LruCache; +import android.support.v7.appcompat.R; +import android.util.Log; +import android.util.SparseArray; +import android.util.TypedValue; +import android.view.View; + +import static android.support.v7.internal.widget.ThemeUtils.getDisabledThemeAttrColor; +import static android.support.v7.internal.widget.ThemeUtils.getThemeAttrColor; +import static android.support.v7.internal.widget.ThemeUtils.getThemeAttrColorStateList; + +/** + * @hide + */ +public final class TintManager { + + static final boolean SHOULD_BE_USED = Build.VERSION.SDK_INT < 21; + + private static final String TAG = TintManager.class.getSimpleName(); + private static final boolean DEBUG = false; + + static final PorterDuff.Mode DEFAULT_MODE = PorterDuff.Mode.SRC_IN; + + private static final ColorFilterLruCache COLOR_FILTER_CACHE = new ColorFilterLruCache(6); + + /** + * Drawables which should be tinted with the value of {@code R.attr.colorControlNormal}, + * using the default mode. + */ + private static final int[] TINT_COLOR_CONTROL_NORMAL = { + R.drawable.abc_ic_ab_back_mtrl_am_alpha, + R.drawable.abc_ic_go_search_api_mtrl_alpha, + R.drawable.abc_ic_search_api_mtrl_alpha, + R.drawable.abc_ic_commit_search_api_mtrl_alpha, + R.drawable.abc_ic_clear_mtrl_alpha, + R.drawable.abc_ic_menu_share_mtrl_alpha, + R.drawable.abc_ic_menu_copy_mtrl_am_alpha, + R.drawable.abc_ic_menu_cut_mtrl_alpha, + R.drawable.abc_ic_menu_selectall_mtrl_alpha, + R.drawable.abc_ic_menu_paste_mtrl_am_alpha, + R.drawable.abc_ic_menu_moreoverflow_mtrl_alpha, + R.drawable.abc_ic_voice_search_api_mtrl_alpha, + R.drawable.abc_textfield_search_default_mtrl_alpha, + R.drawable.abc_textfield_default_mtrl_alpha, + R.drawable.abc_ab_share_pack_mtrl_alpha + }; + + /** + * Drawables which should be tinted with the value of {@code R.attr.colorControlActivated}, + * using the default mode. + */ + private static final int[] TINT_COLOR_CONTROL_ACTIVATED = { + R.drawable.abc_textfield_activated_mtrl_alpha, + R.drawable.abc_textfield_search_activated_mtrl_alpha, + R.drawable.abc_cab_background_top_mtrl_alpha, + R.drawable.abc_text_cursor_mtrl_alpha + }; + + /** + * Drawables which should be tinted with the value of {@code android.R.attr.colorBackground}, + * using the {@link android.graphics.PorterDuff.Mode#MULTIPLY} mode. + */ + private static final int[] TINT_COLOR_BACKGROUND_MULTIPLY = { + R.drawable.abc_popup_background_mtrl_mult, + R.drawable.abc_cab_background_internal_bg, + R.drawable.abc_menu_hardkey_panel_mtrl_mult + }; + + /** + * Drawables which should be tinted using a state list containing values of + * {@code R.attr.colorControlNormal} and {@code R.attr.colorControlActivated} + */ + private static final int[] TINT_COLOR_CONTROL_STATE_LIST = { + R.drawable.abc_edit_text_material, + R.drawable.abc_tab_indicator_material, + R.drawable.abc_textfield_search_material, + R.drawable.abc_spinner_mtrl_am_alpha, + R.drawable.abc_btn_check_material, + R.drawable.abc_btn_radio_material, + R.drawable.abc_spinner_textfield_background_material, + R.drawable.abc_ratingbar_full_material, + R.drawable.abc_switch_track_mtrl_alpha, + R.drawable.abc_switch_thumb_material, + R.drawable.abc_btn_default_mtrl_shape, + R.drawable.abc_btn_borderless_material + }; + + /** + * Drawables which contain other drawables which should be tinted. The child drawable IDs + * should be defined in one of the arrays above. + */ + private static final int[] CONTAINERS_WITH_TINT_CHILDREN = { + R.drawable.abc_cab_background_top_material + }; + + private final Context mContext; + private final Resources mResources; + private final TypedValue mTypedValue; + + private final SparseArray mColorStateLists; + private ColorStateList mDefaultColorStateList; + + /** + * A helper method to instantiate a {@link TintManager} and then call {@link #getDrawable(int)}. + * This method should not be used routinely. + */ + public static Drawable getDrawable(Context context, int resId) { + if (isInTintList(resId)) { + final TintManager tm = (context instanceof TintContextWrapper) + ? ((TintContextWrapper) context).getTintManager() + : new TintManager(context); + return tm.getDrawable(resId); + } else { + return ContextCompat.getDrawable(context, resId); + } + } + + public TintManager(Context context) { + mColorStateLists = new SparseArray<>(); + mContext = context; + mTypedValue = new TypedValue(); + mResources = new TintResources(context.getResources(), this); + } + + Resources getResources() { + return mResources; + } + + public Drawable getDrawable(int resId) { + Drawable drawable = ContextCompat.getDrawable(mContext, resId); + + if (drawable != null) { + drawable = drawable.mutate(); + + if (arrayContains(TINT_COLOR_CONTROL_STATE_LIST, resId)) { + ColorStateList colorStateList = getColorStateListForKnownDrawableId(resId); + PorterDuff.Mode tintMode = DEFAULT_MODE; + if (resId == R.drawable.abc_switch_thumb_material) { + tintMode = PorterDuff.Mode.MULTIPLY; + } + + if (colorStateList != null) { + drawable = DrawableCompat.wrap(drawable); + DrawableCompat.setTintList(drawable, colorStateList); + DrawableCompat.setTintMode(drawable, tintMode); + } + } else if (arrayContains(CONTAINERS_WITH_TINT_CHILDREN, resId)) { + drawable = mResources.getDrawable(resId); + } else { + tintDrawable(resId, drawable); + } + } + return drawable; + } + + void tintDrawable(final int resId, final Drawable drawable) { + PorterDuff.Mode tintMode = null; + boolean colorAttrSet = false; + int colorAttr = 0; + int alpha = -1; + + if (arrayContains(TINT_COLOR_CONTROL_NORMAL, resId)) { + colorAttr = R.attr.colorControlNormal; + colorAttrSet = true; + } else if (arrayContains(TINT_COLOR_CONTROL_ACTIVATED, resId)) { + colorAttr = R.attr.colorControlActivated; + colorAttrSet = true; + } else if (arrayContains(TINT_COLOR_BACKGROUND_MULTIPLY, resId)) { + colorAttr = android.R.attr.colorBackground; + colorAttrSet = true; + tintMode = PorterDuff.Mode.MULTIPLY; + } else if (resId == R.drawable.abc_list_divider_mtrl_alpha) { + colorAttr = android.R.attr.colorForeground; + colorAttrSet = true; + alpha = Math.round(0.16f * 255); + } + + if (colorAttrSet) { + if (tintMode == null) { + tintMode = DEFAULT_MODE; + } + final int color = getThemeAttrColor(mContext, colorAttr); + + tintDrawableUsingColorFilter(drawable, color, tintMode); + + if (alpha != -1) { + drawable.setAlpha(alpha); + } + + if (DEBUG) { + Log.d(TAG, "Tinted Drawable ID: " + mResources.getResourceName(resId) + + " with color: #" + Integer.toHexString(color)); + } + } + } + + private static boolean arrayContains(int[] array, int value) { + for (int id : array) { + if (id == value) { + return true; + } + } + return false; + } + + private static boolean isInTintList(int drawableId) { + return arrayContains(TINT_COLOR_BACKGROUND_MULTIPLY, drawableId) || + arrayContains(TINT_COLOR_CONTROL_NORMAL, drawableId) || + arrayContains(TINT_COLOR_CONTROL_ACTIVATED, drawableId) || + arrayContains(TINT_COLOR_CONTROL_STATE_LIST, drawableId) || + arrayContains(CONTAINERS_WITH_TINT_CHILDREN, drawableId); + } + + ColorStateList getColorStateList(int resId) { + return arrayContains(TINT_COLOR_CONTROL_STATE_LIST, resId) + ? getColorStateListForKnownDrawableId(resId) + : null; + } + + private ColorStateList getColorStateListForKnownDrawableId(int resId) { + // Try the cache first + ColorStateList colorStateList = mColorStateLists.get(resId); + + if (colorStateList == null) { + // ...if the cache did not contain a color state list, try and create + if (resId == R.drawable.abc_edit_text_material) { + colorStateList = createEditTextColorStateList(); + } else if (resId == R.drawable.abc_switch_track_mtrl_alpha) { + colorStateList = createSwitchTrackColorStateList(); + } else if (resId == R.drawable.abc_switch_thumb_material) { + colorStateList = createSwitchThumbColorStateList(); + } else if (resId == R.drawable.abc_btn_default_mtrl_shape + || resId == R.drawable.abc_btn_borderless_material) { + colorStateList = createButtonColorStateList(); + } else if (resId == R.drawable.abc_spinner_mtrl_am_alpha + || resId == R.drawable.abc_spinner_textfield_background_material) { + colorStateList = createSpinnerColorStateList(); + } else { + // If we don't have an explicit color state list for this Drawable, use the default + colorStateList = getDefaultColorStateList(); + } + + // ..and add it to the cache + mColorStateLists.append(resId, colorStateList); + } + return colorStateList; + } + + private ColorStateList getDefaultColorStateList() { + if (mDefaultColorStateList == null) { + /** + * Generate the default color state list which uses the colorControl attributes. + * Order is important here. The default enabled state needs to go at the bottom. + */ + + final int colorControlNormal = getThemeAttrColor(mContext, R.attr.colorControlNormal); + final int colorControlActivated = getThemeAttrColor(mContext, + R.attr.colorControlActivated); + + final int[][] states = new int[7][]; + final int[] colors = new int[7]; + int i = 0; + + // Disabled state + states[i] = new int[] { -android.R.attr.state_enabled }; + colors[i] = getDisabledThemeAttrColor(mContext, R.attr.colorControlNormal); + i++; + + states[i] = new int[] { android.R.attr.state_focused }; + colors[i] = colorControlActivated; + i++; + + states[i] = new int[] { android.R.attr.state_activated }; + colors[i] = colorControlActivated; + i++; + + states[i] = new int[] { android.R.attr.state_pressed }; + colors[i] = colorControlActivated; + i++; + + states[i] = new int[] { android.R.attr.state_checked }; + colors[i] = colorControlActivated; + i++; + + states[i] = new int[] { android.R.attr.state_selected }; + colors[i] = colorControlActivated; + i++; + + // Default enabled state + states[i] = new int[0]; + colors[i] = colorControlNormal; + i++; + + mDefaultColorStateList = new ColorStateList(states, colors); + } + return mDefaultColorStateList; + } + + private ColorStateList createSwitchTrackColorStateList() { + final int[][] states = new int[3][]; + final int[] colors = new int[3]; + int i = 0; + + // Disabled state + states[i] = new int[]{-android.R.attr.state_enabled}; + colors[i] = getThemeAttrColor(mContext, android.R.attr.colorForeground, 0.1f); + i++; + + states[i] = new int[]{android.R.attr.state_checked}; + colors[i] = getThemeAttrColor(mContext, R.attr.colorControlActivated, 0.3f); + i++; + + // Default enabled state + states[i] = new int[0]; + colors[i] = getThemeAttrColor(mContext, android.R.attr.colorForeground, 0.3f); + i++; + + return new ColorStateList(states, colors); + } + + private ColorStateList createSwitchThumbColorStateList() { + final int[][] states = new int[3][]; + final int[] colors = new int[3]; + int i = 0; + + final ColorStateList thumbColor = getThemeAttrColorStateList(mContext, + R.attr.colorSwitchThumbNormal); + + if (thumbColor != null && thumbColor.isStateful()) { + // If colorSwitchThumbNormal is a valid ColorStateList, extract the default and + // disabled colors from it + + // Disabled state + states[i] = new int[]{-android.R.attr.state_enabled}; + colors[i] = thumbColor.getColorForState(states[i], 0); + i++; + + states[i] = new int[]{android.R.attr.state_checked}; + colors[i] = getThemeAttrColor(mContext, R.attr.colorControlActivated); + i++; + + // Default enabled state + states[i] = new int[0]; + colors[i] = thumbColor.getDefaultColor(); + i++; + } else { + // Else we'll use an approximation using the default disabled alpha + + // Disabled state + states[i] = new int[]{-android.R.attr.state_enabled}; + colors[i] = getDisabledThemeAttrColor(mContext, R.attr.colorSwitchThumbNormal); + i++; + + states[i] = new int[]{android.R.attr.state_checked}; + colors[i] = getThemeAttrColor(mContext, R.attr.colorControlActivated); + i++; + + // Default enabled state + states[i] = new int[0]; + colors[i] = getThemeAttrColor(mContext, R.attr.colorSwitchThumbNormal); + i++; + } + + return new ColorStateList(states, colors); + } + + private ColorStateList createEditTextColorStateList() { + final int[][] states = new int[3][]; + final int[] colors = new int[3]; + int i = 0; + + // Disabled state + states[i] = new int[]{-android.R.attr.state_enabled}; + colors[i] = getDisabledThemeAttrColor(mContext, R.attr.colorControlNormal); + i++; + + states[i] = new int[]{-android.R.attr.state_pressed, -android.R.attr.state_focused}; + colors[i] = getThemeAttrColor(mContext, R.attr.colorControlNormal); + i++; + + // Default enabled state + states[i] = new int[0]; + colors[i] = getThemeAttrColor(mContext, R.attr.colorControlActivated); + i++; + + return new ColorStateList(states, colors); + } + + private ColorStateList createButtonColorStateList() { + final int[][] states = new int[4][]; + final int[] colors = new int[4]; + int i = 0; + + // Disabled state + states[i] = new int[]{-android.R.attr.state_enabled}; + colors[i] = getDisabledThemeAttrColor(mContext, R.attr.colorButtonNormal); + i++; + + states[i] = new int[]{android.R.attr.state_pressed}; + colors[i] = getThemeAttrColor(mContext, R.attr.colorControlHighlight); + i++; + + states[i] = new int[]{android.R.attr.state_focused}; + colors[i] = getThemeAttrColor(mContext, R.attr.colorControlHighlight); + i++; + + // Default enabled state + states[i] = new int[0]; + colors[i] = getThemeAttrColor(mContext, R.attr.colorButtonNormal); + i++; + + return new ColorStateList(states, colors); + } + + private ColorStateList createSpinnerColorStateList() { + final int[][] states = new int[3][]; + final int[] colors = new int[3]; + int i = 0; + + // Disabled state + states[i] = new int[]{-android.R.attr.state_enabled}; + colors[i] = getDisabledThemeAttrColor(mContext, R.attr.colorControlNormal); + i++; + + states[i] = new int[]{-android.R.attr.state_pressed, -android.R.attr.state_focused}; + colors[i] = getThemeAttrColor(mContext, R.attr.colorControlNormal); + i++; + + states[i] = new int[0]; + colors[i] = getThemeAttrColor(mContext, R.attr.colorControlActivated); + i++; + + return new ColorStateList(states, colors); + } + + private static class ColorFilterLruCache extends LruCache { + + public ColorFilterLruCache(int maxSize) { + super(maxSize); + } + + PorterDuffColorFilter get(int color, PorterDuff.Mode mode) { + return get(generateCacheKey(color, mode)); + } + + PorterDuffColorFilter put(int color, PorterDuff.Mode mode, PorterDuffColorFilter filter) { + return put(generateCacheKey(color, mode), filter); + } + + private static int generateCacheKey(int color, PorterDuff.Mode mode) { + int hashCode = 1; + hashCode = 31 * hashCode + color; + hashCode = 31 * hashCode + mode.hashCode(); + return hashCode; + } + } + + public static void tintViewBackground(View view, TintInfo tint) { + final Drawable background = view.getBackground(); + if (tint.mTintList != null) { + tintDrawableUsingColorFilter( + background, + tint.mTintList.getColorForState(view.getDrawableState(), + tint.mTintList.getDefaultColor()), + tint.mTintMode != null ? tint.mTintMode : DEFAULT_MODE); + } else { + background.clearColorFilter(); + } + } + + private static void tintDrawableUsingColorFilter(Drawable drawable, int color, + PorterDuff.Mode mode) { + // First, lets see if the cache already contains the color filter + PorterDuffColorFilter filter = COLOR_FILTER_CACHE.get(color, mode); + + if (filter == null) { + // Cache miss, so create a color filter and add it to the cache + filter = new PorterDuffColorFilter(color, mode); + COLOR_FILTER_CACHE.put(color, mode, filter); + } + + drawable.setColorFilter(filter); + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintMultiAutoCompleteTextView.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintMultiAutoCompleteTextView.java new file mode 100644 index 0000000000..336243c170 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintMultiAutoCompleteTextView.java @@ -0,0 +1,147 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.content.res.ColorStateList; +import android.graphics.PorterDuff; +import android.support.annotation.Nullable; +import android.support.v4.view.TintableBackgroundView; +import android.util.AttributeSet; +import android.widget.MultiAutoCompleteTextView; + +/** + * An tint aware {@link android.widget.MultiAutoCompleteTextView}. + *

      + * This will automatically be used when you use {@link android.widget.MultiAutoCompleteTextView} + * in your layouts. You should only need to manually use this class when writing custom views. + */ +public class TintMultiAutoCompleteTextView extends MultiAutoCompleteTextView + implements TintableBackgroundView { + + private static final int[] TINT_ATTRS = { + android.R.attr.background, + android.R.attr.popupBackground + }; + + private TintManager mTintManager; + private TintInfo mBackgroundTint; + + public TintMultiAutoCompleteTextView(Context context) { + this(context, null); + } + + public TintMultiAutoCompleteTextView(Context context, AttributeSet attrs) { + this(context, attrs, android.R.attr.autoCompleteTextViewStyle); + } + + public TintMultiAutoCompleteTextView(Context context, AttributeSet attrs, int defStyleAttr) { + super(TintContextWrapper.wrap(context), attrs, defStyleAttr); + + if (TintManager.SHOULD_BE_USED) { + TintTypedArray a = TintTypedArray.obtainStyledAttributes(getContext(), attrs, + TINT_ATTRS, defStyleAttr, 0); + mTintManager = a.getTintManager(); + + if (a.hasValue(0)) { + setSupportBackgroundTintList( + mTintManager.getColorStateList(a.getResourceId(0, -1))); + } + if (a.hasValue(1)) { + setDropDownBackgroundDrawable(a.getDrawable(1)); + } + a.recycle(); + } + } + + @Override + public void setDropDownBackgroundResource(int id) { + if (mTintManager != null) { + setDropDownBackgroundDrawable(mTintManager.getDrawable(id)); + } else { + super.setDropDownBackgroundResource(id); + } + } + + /** + * This should be accessed via + * {@link android.support.v4.view.ViewCompat#setBackgroundTintList(android.view.View, + * android.content.res.ColorStateList)} + * + * @hide + */ + @Override + public void setSupportBackgroundTintList(@Nullable ColorStateList tint) { + if (mBackgroundTint == null) { + mBackgroundTint = new TintInfo(); + } + mBackgroundTint.mTintList = tint; + applySupportBackgroundTint(); + } + + /** + * This should be accessed via + * {@link android.support.v4.view.ViewCompat#getBackgroundTintList(android.view.View)} + * + * @hide + */ + @Override + @Nullable + public ColorStateList getSupportBackgroundTintList() { + return mBackgroundTint != null ? mBackgroundTint.mTintList : null; + } + + /** + * This should be accessed via + * {@link android.support.v4.view.ViewCompat#setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode)} + * + * @hide + */ + @Override + public void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) { + if (mBackgroundTint == null) { + mBackgroundTint = new TintInfo(); + } + mBackgroundTint.mTintMode = tintMode; + applySupportBackgroundTint(); + } + + /** + * This should be accessed via + * {@link android.support.v4.view.ViewCompat#getBackgroundTintMode(android.view.View)} + * + * @hide + */ + @Override + @Nullable + public PorterDuff.Mode getSupportBackgroundTintMode() { + return mBackgroundTint != null ? mBackgroundTint.mTintMode : null; + } + + @Override + protected void drawableStateChanged() { + super.drawableStateChanged(); + applySupportBackgroundTint(); + } + + private void applySupportBackgroundTint() { + if (getBackground() != null && mBackgroundTint != null) { + TintManager.tintViewBackground(this, mBackgroundTint); + } + } + +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintRadioButton.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintRadioButton.java new file mode 100644 index 0000000000..f5e537cf99 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintRadioButton.java @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.RadioButton; + +/** + * An tint aware {@link android.widget.RadioButton}. + *

      + * This will automatically be used when you use {@link android.widget.RadioButton} in your + * layouts. You should only need to manually use this class when writing custom views. + */ +public class TintRadioButton extends RadioButton { + + private static final int[] TINT_ATTRS = { + android.R.attr.button + }; + + private TintManager mTintManager; + + public TintRadioButton(Context context) { + this(context, null); + } + + public TintRadioButton(Context context, AttributeSet attrs) { + this(context, attrs, android.R.attr.radioButtonStyle); + } + + public TintRadioButton(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + if (TintManager.SHOULD_BE_USED) { + TintTypedArray a = TintTypedArray.obtainStyledAttributes(getContext(), attrs, + TINT_ATTRS, defStyleAttr, 0); + setButtonDrawable(a.getDrawable(0)); + a.recycle(); + + mTintManager = a.getTintManager(); + } + } + + @Override + public void setButtonDrawable(int resid) { + if (mTintManager != null) { + setButtonDrawable(mTintManager.getDrawable(resid)); + } else { + super.setButtonDrawable(resid); + } + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintRatingBar.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintRatingBar.java new file mode 100644 index 0000000000..da0b965943 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintRatingBar.java @@ -0,0 +1,166 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapShader; +import android.graphics.Shader; +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.support.v4.graphics.drawable.DrawableWrapper; +import android.support.v4.view.ViewCompat; +import android.util.AttributeSet; +import android.view.Gravity; +import android.widget.RatingBar; + +/** + * An tint aware {@link android.widget.RatingBar}. + *

      + * This will automatically be used when you use {@link android.widget.RatingBar} in your + * layouts. You should only need to manually use this class when writing custom views. + */ +public class TintRatingBar extends RatingBar { + + private static final int[] TINT_ATTRS = { + android.R.attr.indeterminateDrawable, + android.R.attr.progressDrawable + }; + + private Bitmap mSampleTile; + + public TintRatingBar(Context context) { + this(context, null); + } + + public TintRatingBar(Context context, AttributeSet attrs) { + this(context, attrs, android.R.attr.ratingBarStyle); + } + + public TintRatingBar(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + if (TintManager.SHOULD_BE_USED) { + TintTypedArray a = TintTypedArray.obtainStyledAttributes(getContext(), attrs, + TINT_ATTRS, defStyleAttr, 0); + + Drawable drawable = a.getDrawable(0); + if (drawable != null) { + setIndeterminateDrawable(tileifyIndeterminate(drawable)); + } + + drawable = a.getDrawable(1); + if (drawable != null) { + setProgressDrawable(tileify(drawable, false)); + } + + a.recycle(); + } + } + + /** + * 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 DrawableWrapper) { + Drawable inner = ((DrawableWrapper) drawable).getWrappedDrawable(); + if (inner != null) { + inner = tileify(inner, clip); + ((DrawableWrapper) drawable).setWrappedDrawable(inner); + } + } else 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 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; + } + + /** + * 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; + } + + private Shape getDrawableShape() { + final float[] roundedCorners = new float[] { 5, 5, 5, 5, 5, 5, 5, 5 }; + return new RoundRectShape(roundedCorners, null, null); + } + + @Override + protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + + if (mSampleTile != null) { + final int width = mSampleTile.getWidth() * getNumStars(); + setMeasuredDimension(ViewCompat.resolveSizeAndState(width, widthMeasureSpec, 0), + getMeasuredHeight()); + } + } + +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintResources.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintResources.java new file mode 100644 index 0000000000..3dfbbc1d5d --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintResources.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.res.Resources; +import android.graphics.drawable.Drawable; +import android.support.v7.appcompat.R; + +/** + * This class allows us to intercept calls so that we can tint resources (if applicable). + * + * @hide + */ +class TintResources extends ResourcesWrapper { + + private final TintManager mTintManager; + + public TintResources(Resources resources, TintManager tintManager) { + super(resources); + mTintManager = tintManager; + } + + /** + * We intercept this call so that we tint the result (if applicable). This is needed for things + * like {@link DrawableContainer}s which retrieve their children via this method. + */ + @Override + public Drawable getDrawable(int id) throws NotFoundException { + Drawable d = super.getDrawable(id); + if (d != null) { + mTintManager.tintDrawable(id, d); + } + return d; + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintSpinner.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintSpinner.java new file mode 100644 index 0000000000..a1b99bc26d --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintSpinner.java @@ -0,0 +1,163 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.annotation.TargetApi; +import android.content.Context; +import android.content.res.ColorStateList; +import android.graphics.PorterDuff; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.support.annotation.Nullable; +import android.support.v4.view.TintableBackgroundView; +import android.util.AttributeSet; +import android.widget.ListPopupWindow; +import android.widget.Spinner; + +import java.lang.reflect.Field; + +/** + * An tint aware {@link android.widget.Spinner}. + *

      + * This will automatically be used when you use {@link android.widget.Spinner} in your + * layouts. You should only need to manually use this class when writing custom views. + */ +public class TintSpinner extends Spinner implements TintableBackgroundView { + + private static final int[] TINT_ATTRS = { + android.R.attr.background, + android.R.attr.popupBackground + }; + + private TintInfo mBackgroundTint; + + public TintSpinner(Context context) { + this(context, null); + } + + public TintSpinner(Context context, AttributeSet attrs) { + this(context, attrs, android.R.attr.spinnerStyle); + } + + public TintSpinner(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + if (TintManager.SHOULD_BE_USED) { + TintTypedArray a = TintTypedArray.obtainStyledAttributes(getContext(), attrs, + TINT_ATTRS, defStyleAttr, 0); + if (a.hasValue(0)) { + setSupportBackgroundTintList( + a.getTintManager().getColorStateList(a.getResourceId(0, -1))); + } + if (a.hasValue(1)) { + final Drawable popupBackground = a.getDrawable(1); + if (Build.VERSION.SDK_INT >= 16) { + setPopupBackgroundDrawable(popupBackground); + } else if (Build.VERSION.SDK_INT >= 11) { + setPopupBackgroundDrawableV11(this, popupBackground); + } + } + a.recycle(); + } + } + + @TargetApi(Build.VERSION_CODES.HONEYCOMB) + private static void setPopupBackgroundDrawableV11(Spinner view, Drawable background) { + try { + Field popupField = Spinner.class.getDeclaredField("mPopup"); + popupField.setAccessible(true); + + Object popup = popupField.get(view); + + if (popup instanceof ListPopupWindow) { + ((ListPopupWindow) popup).setBackgroundDrawable(background); + } + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + + /** + * This should be accessed via + * {@link android.support.v4.view.ViewCompat#setBackgroundTintList(android.view.View, + * android.content.res.ColorStateList)} + * + * @hide + */ + @Override + public void setSupportBackgroundTintList(@Nullable ColorStateList tint) { + if (mBackgroundTint == null && tint != null) { + mBackgroundTint = new TintInfo(); + } + mBackgroundTint.mTintList = tint; + applySupportBackgroundTint(); + } + + /** + * This should be accessed via + * {@link android.support.v4.view.ViewCompat#getBackgroundTintList(android.view.View)} + * + * @hide + */ + @Override + @Nullable + public ColorStateList getSupportBackgroundTintList() { + return mBackgroundTint != null ? mBackgroundTint.mTintList : null; + } + + /** + * This should be accessed via + * {@link android.support.v4.view.ViewCompat#setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode)} + * + * @hide + */ + @Override + public void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) { + if (mBackgroundTint == null) { + mBackgroundTint = new TintInfo(); + } + mBackgroundTint.mTintMode = tintMode; + applySupportBackgroundTint(); + } + + /** + * This should be accessed via + * {@link android.support.v4.view.ViewCompat#getBackgroundTintMode(android.view.View)} + * + * @hide + */ + @Override + @Nullable + public PorterDuff.Mode getSupportBackgroundTintMode() { + return mBackgroundTint != null ? mBackgroundTint.mTintMode : null; + } + + @Override + protected void drawableStateChanged() { + super.drawableStateChanged(); + applySupportBackgroundTint(); + } + + private void applySupportBackgroundTint() { + if (getBackground() != null && mBackgroundTint != null) { + TintManager.tintViewBackground(this, mBackgroundTint); + } + } + +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintTypedArray.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintTypedArray.java new file mode 100644 index 0000000000..221e2a12fa --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/TintTypedArray.java @@ -0,0 +1,189 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.content.res.ColorStateList; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.util.TypedValue; + +/** + * A class that wraps a {@link android.content.res.TypedArray} and provides the same public API + * surface. The purpose of this class is so that we can intercept the {@link #getDrawable(int)} + * call and tint the result. + * + * @hide + */ +public class TintTypedArray { + + private final Context mContext; + private final TypedArray mWrapped; + + private TintManager mTintManager; + + public static TintTypedArray obtainStyledAttributes(Context context, AttributeSet set, + int[] attrs) { + TypedArray array = context.obtainStyledAttributes(set, attrs); + return new TintTypedArray(context, array); + } + + public static TintTypedArray obtainStyledAttributes(Context context, AttributeSet set, + int[] attrs, int defStyleAttr, int defStyleRes) { + TypedArray array = context.obtainStyledAttributes(set, attrs, defStyleAttr, defStyleRes); + return new TintTypedArray(context, array); + } + + private TintTypedArray(Context context, TypedArray array) { + mContext = context; + mWrapped = array; + } + + public Drawable getDrawable(int index) { + if (mWrapped.hasValue(index)) { + final int resourceId = mWrapped.getResourceId(index, 0); + if (resourceId != 0) { + return getTintManager().getDrawable(resourceId); + } + } + return mWrapped.getDrawable(index); + } + + public int length() { + return mWrapped.length(); + } + + public int getIndexCount() { + return mWrapped.getIndexCount(); + } + + public int getIndex(int at) { + return mWrapped.getIndex(at); + } + + public Resources getResources() { + return mWrapped.getResources(); + } + + public CharSequence getText(int index) { + return mWrapped.getText(index); + } + + public String getString(int index) { + return mWrapped.getString(index); + } + + public String getNonResourceString(int index) { + return mWrapped.getNonResourceString(index); + } + + public boolean getBoolean(int index, boolean defValue) { + return mWrapped.getBoolean(index, defValue); + } + + public int getInt(int index, int defValue) { + return mWrapped.getInt(index, defValue); + } + + public float getFloat(int index, float defValue) { + return mWrapped.getFloat(index, defValue); + } + + public int getColor(int index, int defValue) { + return mWrapped.getColor(index, defValue); + } + + public ColorStateList getColorStateList(int index) { + return mWrapped.getColorStateList(index); + } + + public int getInteger(int index, int defValue) { + return mWrapped.getInteger(index, defValue); + } + + public float getDimension(int index, float defValue) { + return mWrapped.getDimension(index, defValue); + } + + public int getDimensionPixelOffset(int index, int defValue) { + return mWrapped.getDimensionPixelOffset(index, defValue); + } + + public int getDimensionPixelSize(int index, int defValue) { + return mWrapped.getDimensionPixelSize(index, defValue); + } + + public int getLayoutDimension(int index, String name) { + return mWrapped.getLayoutDimension(index, name); + } + + public int getLayoutDimension(int index, int defValue) { + return mWrapped.getLayoutDimension(index, defValue); + } + + public float getFraction(int index, int base, int pbase, float defValue) { + return mWrapped.getFraction(index, base, pbase, defValue); + } + + public int getResourceId(int index, int defValue) { + return mWrapped.getResourceId(index, defValue); + } + + public CharSequence[] getTextArray(int index) { + return mWrapped.getTextArray(index); + } + + public boolean getValue(int index, TypedValue outValue) { + return mWrapped.getValue(index, outValue); + } + + public int getType(int index) { + return mWrapped.getType(index); + } + + public boolean hasValue(int index) { + return mWrapped.hasValue(index); + } + + public TypedValue peekValue(int index) { + return mWrapped.peekValue(index); + } + + public String getPositionDescription() { + return mWrapped.getPositionDescription(); + } + + public void recycle() { + mWrapped.recycle(); + } + + public int getChangingConfigurations() { + return mWrapped.getChangingConfigurations(); + } + + public TintManager getTintManager() { + if (mTintManager == null) { + mTintManager = (mContext instanceof TintContextWrapper) + ? ((TintContextWrapper) mContext).getTintManager() + : new TintManager(mContext); + } + return mTintManager; + } + +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ToolbarWidgetWrapper.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ToolbarWidgetWrapper.java new file mode 100644 index 0000000000..b466010c84 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ToolbarWidgetWrapper.java @@ -0,0 +1,716 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package android.support.v7.internal.widget; + +import android.app.ActionBar; +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.os.Parcelable; +import android.support.v4.view.ViewCompat; +import android.support.v4.view.ViewPropertyAnimatorListenerAdapter; +import android.support.v7.appcompat.R; +import android.support.v7.internal.view.menu.ActionMenuItem; +import android.support.v7.internal.view.menu.MenuBuilder; +import android.support.v7.internal.view.menu.MenuPresenter; +import android.support.v7.widget.ActionMenuPresenter; +import android.support.v7.widget.Toolbar; +import android.text.TextUtils; +import android.util.Log; +import android.util.SparseArray; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.widget.SpinnerAdapter; + +/** + * Internal class used to interact with the Toolbar widget without + * exposing interface methods to the public API. + * + *

      ToolbarWidgetWrapper manages the differences between Toolbar and ActionBarView + * so that either variant acting as a + * {@link android.support.v7.internal.app.WindowDecorActionBar WindowDecorActionBar} can behave + * in the same way.

      + * + * @hide + */ +public class ToolbarWidgetWrapper implements DecorToolbar { + private static final String TAG = "ToolbarWidgetWrapper"; + + private static final int AFFECTS_LOGO_MASK = + ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_USE_LOGO; + + private Toolbar mToolbar; + + private int mDisplayOpts; + private View mTabView; + private SpinnerCompat mSpinner; + private View mCustomView; + + private Drawable mIcon; + private Drawable mLogo; + private Drawable mNavIcon; + + private boolean mTitleSet; + private CharSequence mTitle; + private CharSequence mSubtitle; + private CharSequence mHomeDescription; + + private Window.Callback mWindowCallback; + private boolean mMenuPrepared; + private ActionMenuPresenter mActionMenuPresenter; + + private int mNavigationMode = ActionBar.NAVIGATION_MODE_STANDARD; + + private final TintManager mTintManager; + private int mDefaultNavigationContentDescription = 0; + private Drawable mDefaultNavigationIcon; + + public ToolbarWidgetWrapper(Toolbar toolbar, boolean style) { + this(toolbar, style, R.string.abc_action_bar_up_description, + R.drawable.abc_ic_ab_back_mtrl_am_alpha); + } + + public ToolbarWidgetWrapper(Toolbar toolbar, boolean style, + int defaultNavigationContentDescription, int defaultNavigationIcon) { + mToolbar = toolbar; + mTitle = toolbar.getTitle(); + mSubtitle = toolbar.getSubtitle(); + mTitleSet = mTitle != null; + mNavIcon = toolbar.getNavigationIcon(); + + if (style) { + final TintTypedArray a = TintTypedArray.obtainStyledAttributes(toolbar.getContext(), + null, R.styleable.ActionBar, R.attr.actionBarStyle, 0); + + final CharSequence title = a.getText(R.styleable.ActionBar_title); + if (!TextUtils.isEmpty(title)) { + setTitle(title); + } + + final CharSequence subtitle = a.getText(R.styleable.ActionBar_subtitle); + if (!TextUtils.isEmpty(subtitle)) { + setSubtitle(subtitle); + } + + final Drawable logo = a.getDrawable(R.styleable.ActionBar_logo); + if (logo != null) { + setLogo(logo); + } + + final Drawable icon = a.getDrawable(R.styleable.ActionBar_icon); + if (mNavIcon == null && icon != null) { + setIcon(icon); + } + + final Drawable navIcon = a.getDrawable(R.styleable.ActionBar_homeAsUpIndicator); + if (navIcon != null) { + setNavigationIcon(navIcon); + } + + setDisplayOptions(a.getInt(R.styleable.ActionBar_displayOptions, 0)); + + final int customNavId = a.getResourceId( + R.styleable.ActionBar_customNavigationLayout, 0); + if (customNavId != 0) { + setCustomView(LayoutInflater.from(mToolbar.getContext()).inflate(customNavId, + mToolbar, false)); + setDisplayOptions(mDisplayOpts | ActionBar.DISPLAY_SHOW_CUSTOM); + } + + final int height = a.getLayoutDimension(R.styleable.ActionBar_height, 0); + if (height > 0) { + final ViewGroup.LayoutParams lp = mToolbar.getLayoutParams(); + lp.height = height; + mToolbar.setLayoutParams(lp); + } + + final int contentInsetStart = a.getDimensionPixelOffset( + R.styleable.ActionBar_contentInsetStart, -1); + final int contentInsetEnd = a.getDimensionPixelOffset( + R.styleable.ActionBar_contentInsetEnd, -1); + if (contentInsetStart >= 0 || contentInsetEnd >= 0) { + mToolbar.setContentInsetsRelative(Math.max(contentInsetStart, 0), + Math.max(contentInsetEnd, 0)); + } + + final int titleTextStyle = a.getResourceId(R.styleable.ActionBar_titleTextStyle, 0); + if (titleTextStyle != 0) { + mToolbar.setTitleTextAppearance(mToolbar.getContext(), titleTextStyle); + } + + final int subtitleTextStyle = a.getResourceId( + R.styleable.ActionBar_subtitleTextStyle, 0); + if (subtitleTextStyle != 0) { + mToolbar.setSubtitleTextAppearance(mToolbar.getContext(), subtitleTextStyle); + } + + final int popupTheme = a.getResourceId(R.styleable.ActionBar_popupTheme, 0); + if (popupTheme != 0) { + mToolbar.setPopupTheme(popupTheme); + } + + a.recycle(); + // Keep the TintManager in case we need it later + mTintManager = a.getTintManager(); + } else { + mDisplayOpts = detectDisplayOptions(); + // Create a TintManager in case we need it later + mTintManager = new TintManager(toolbar.getContext()); + } + + setDefaultNavigationContentDescription(defaultNavigationContentDescription); + mHomeDescription = mToolbar.getNavigationContentDescription(); + + setDefaultNavigationIcon(mTintManager.getDrawable(defaultNavigationIcon)); + + mToolbar.setNavigationOnClickListener(new View.OnClickListener() { + final ActionMenuItem mNavItem = new ActionMenuItem(mToolbar.getContext(), + 0, android.R.id.home, 0, 0, mTitle); + @Override + public void onClick(View v) { + if (mWindowCallback != null && mMenuPrepared) { + mWindowCallback.onMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, mNavItem); + } + } + }); + } + + /** + * Sets the default content description for the navigation button. + *

      + * It changes the current content description if and only if the provided resource id is + * different than the current default resource id and the current content description is empty. + * + * @param defaultNavigationContentDescription The resource id for the default content + * description + */ + @Override + public void setDefaultNavigationContentDescription(int defaultNavigationContentDescription) { + if (defaultNavigationContentDescription == mDefaultNavigationContentDescription) { + return; + } + mDefaultNavigationContentDescription = defaultNavigationContentDescription; + if (TextUtils.isEmpty(mToolbar.getNavigationContentDescription())) { + setNavigationContentDescription(mDefaultNavigationContentDescription); + } + } + + @Override + public void setDefaultNavigationIcon(Drawable defaultNavigationIcon) { + if (mDefaultNavigationIcon != defaultNavigationIcon) { + mDefaultNavigationIcon = defaultNavigationIcon; + updateNavigationIcon(); + } + } + + private int detectDisplayOptions() { + int opts = ActionBar.DISPLAY_SHOW_TITLE | ActionBar.DISPLAY_SHOW_HOME | + ActionBar.DISPLAY_USE_LOGO; + if (mToolbar.getNavigationIcon() != null) { + opts |= ActionBar.DISPLAY_HOME_AS_UP; + } + return opts; + } + + @Override + public ViewGroup getViewGroup() { + return mToolbar; + } + + @Override + public Context getContext() { + return mToolbar.getContext(); + } + + @Override + public boolean isSplit() { + return false; + } + + @Override + public boolean hasExpandedActionView() { + return mToolbar.hasExpandedActionView(); + } + + @Override + public void collapseActionView() { + mToolbar.collapseActionView(); + } + + @Override + public void setWindowCallback(Window.Callback cb) { + mWindowCallback = cb; + } + + @Override + public void setWindowTitle(CharSequence title) { + // "Real" title always trumps window title. + if (!mTitleSet) { + setTitleInt(title); + } + } + + @Override + public CharSequence getTitle() { + return mToolbar.getTitle(); + } + + @Override + public void setTitle(CharSequence title) { + mTitleSet = true; + setTitleInt(title); + } + + private void setTitleInt(CharSequence title) { + mTitle = title; + if ((mDisplayOpts & ActionBar.DISPLAY_SHOW_TITLE) != 0) { + mToolbar.setTitle(title); + } + } + + @Override + public CharSequence getSubtitle() { + return mToolbar.getSubtitle(); + } + + @Override + public void setSubtitle(CharSequence subtitle) { + mSubtitle = subtitle; + if ((mDisplayOpts & ActionBar.DISPLAY_SHOW_TITLE) != 0) { + mToolbar.setSubtitle(subtitle); + } + } + + @Override + public void initProgress() { + Log.i(TAG, "Progress display unsupported"); + } + + @Override + public void initIndeterminateProgress() { + Log.i(TAG, "Progress display unsupported"); + } + + @Override + public boolean canSplit() { + return false; + } + + @Override + public void setSplitView(ViewGroup splitView) { + } + + @Override + public void setSplitToolbar(boolean split) { + if (split) { + throw new UnsupportedOperationException("Cannot split an android.widget.Toolbar"); + } + } + + @Override + public void setSplitWhenNarrow(boolean splitWhenNarrow) { + // Ignore. + } + + @Override + public boolean hasIcon() { + return mIcon != null; + } + + @Override + public boolean hasLogo() { + return mLogo != null; + } + + @Override + public void setIcon(int resId) { + setIcon(resId != 0 ? mTintManager.getDrawable(resId) : null); + } + + @Override + public void setIcon(Drawable d) { + mIcon = d; + updateToolbarLogo(); + } + + @Override + public void setLogo(int resId) { + setLogo(resId != 0 ? mTintManager.getDrawable(resId) : null); + } + + @Override + public void setLogo(Drawable d) { + mLogo = d; + updateToolbarLogo(); + } + + private void updateToolbarLogo() { + Drawable logo = null; + if ((mDisplayOpts & ActionBar.DISPLAY_SHOW_HOME) != 0) { + if ((mDisplayOpts & ActionBar.DISPLAY_USE_LOGO) != 0) { + logo = mLogo != null ? mLogo : mIcon; + } else { + logo = mIcon; + } + } + mToolbar.setLogo(logo); + } + + @Override + public boolean canShowOverflowMenu() { + return mToolbar.canShowOverflowMenu(); + } + + @Override + public boolean isOverflowMenuShowing() { + return mToolbar.isOverflowMenuShowing(); + } + + @Override + public boolean isOverflowMenuShowPending() { + return mToolbar.isOverflowMenuShowPending(); + } + + @Override + public boolean showOverflowMenu() { + return mToolbar.showOverflowMenu(); + } + + @Override + public boolean hideOverflowMenu() { + return mToolbar.hideOverflowMenu(); + } + + @Override + public void setMenuPrepared() { + mMenuPrepared = true; + } + + @Override + public void setMenu(Menu menu, MenuPresenter.Callback cb) { + if (mActionMenuPresenter == null) { + mActionMenuPresenter = new ActionMenuPresenter(mToolbar.getContext()); + mActionMenuPresenter.setId(R.id.action_menu_presenter); + } + mActionMenuPresenter.setCallback(cb); + mToolbar.setMenu((MenuBuilder) menu, mActionMenuPresenter); + } + + @Override + public void dismissPopupMenus() { + mToolbar.dismissPopupMenus(); + } + + @Override + public int getDisplayOptions() { + return mDisplayOpts; + } + + @Override + public void setDisplayOptions(int newOpts) { + final int oldOpts = mDisplayOpts; + final int changed = oldOpts ^ newOpts; + mDisplayOpts = newOpts; + if (changed != 0) { + if ((changed & ActionBar.DISPLAY_HOME_AS_UP) != 0) { + if ((newOpts & ActionBar.DISPLAY_HOME_AS_UP) != 0) { + updateNavigationIcon(); + updateHomeAccessibility(); + } else { + mToolbar.setNavigationIcon(null); + } + } + + if ((changed & AFFECTS_LOGO_MASK) != 0) { + updateToolbarLogo(); + } + + if ((changed & ActionBar.DISPLAY_SHOW_TITLE) != 0) { + if ((newOpts & ActionBar.DISPLAY_SHOW_TITLE) != 0) { + mToolbar.setTitle(mTitle); + mToolbar.setSubtitle(mSubtitle); + } else { + mToolbar.setTitle(null); + mToolbar.setSubtitle(null); + } + } + + if ((changed & ActionBar.DISPLAY_SHOW_CUSTOM) != 0 && mCustomView != null) { + if ((newOpts & ActionBar.DISPLAY_SHOW_CUSTOM) != 0) { + mToolbar.addView(mCustomView); + } else { + mToolbar.removeView(mCustomView); + } + } + } + } + + @Override + public void setEmbeddedTabView(ScrollingTabContainerView tabView) { + if (mTabView != null && mTabView.getParent() == mToolbar) { + mToolbar.removeView(mTabView); + } + mTabView = tabView; + if (tabView != null && mNavigationMode == ActionBar.NAVIGATION_MODE_TABS) { + mToolbar.addView(mTabView, 0); + Toolbar.LayoutParams lp = (Toolbar.LayoutParams) mTabView.getLayoutParams(); + lp.width = ViewGroup.LayoutParams.WRAP_CONTENT; + lp.height = ViewGroup.LayoutParams.WRAP_CONTENT; + lp.gravity = Gravity.START | Gravity.BOTTOM; + tabView.setAllowCollapse(true); + } + } + + @Override + public boolean hasEmbeddedTabs() { + return mTabView != null; + } + + @Override + public boolean isTitleTruncated() { + return mToolbar.isTitleTruncated(); + } + + @Override + public void setCollapsible(boolean collapsible) { + mToolbar.setCollapsible(collapsible); + } + + @Override + public void setHomeButtonEnabled(boolean enable) { + // Ignore + } + + @Override + public int getNavigationMode() { + return mNavigationMode; + } + + @Override + public void setNavigationMode(int mode) { + final int oldMode = mNavigationMode; + if (mode != oldMode) { + switch (oldMode) { + case ActionBar.NAVIGATION_MODE_LIST: + if (mSpinner != null && mSpinner.getParent() == mToolbar) { + mToolbar.removeView(mSpinner); + } + break; + case ActionBar.NAVIGATION_MODE_TABS: + if (mTabView != null && mTabView.getParent() == mToolbar) { + mToolbar.removeView(mTabView); + } + break; + } + + mNavigationMode = mode; + + switch (mode) { + case ActionBar.NAVIGATION_MODE_STANDARD: + break; + case ActionBar.NAVIGATION_MODE_LIST: + ensureSpinner(); + mToolbar.addView(mSpinner, 0); + break; + case ActionBar.NAVIGATION_MODE_TABS: + if (mTabView != null) { + mToolbar.addView(mTabView, 0); + Toolbar.LayoutParams lp = (Toolbar.LayoutParams) mTabView.getLayoutParams(); + lp.width = ViewGroup.LayoutParams.WRAP_CONTENT; + lp.height = ViewGroup.LayoutParams.WRAP_CONTENT; + lp.gravity = Gravity.START | Gravity.BOTTOM; + } + break; + default: + throw new IllegalArgumentException("Invalid navigation mode " + mode); + } + } + } + + private void ensureSpinner() { + if (mSpinner == null) { + mSpinner = new SpinnerCompat(getContext(), null, R.attr.actionDropDownStyle); + Toolbar.LayoutParams lp = new Toolbar.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.START | Gravity.CENTER_VERTICAL); + mSpinner.setLayoutParams(lp); + } + } + + @Override + public void setDropdownParams(SpinnerAdapter adapter, + AdapterViewCompat.OnItemSelectedListener listener) { + ensureSpinner(); + mSpinner.setAdapter(adapter); + mSpinner.setOnItemSelectedListener(listener); + } + + @Override + public void setDropdownSelectedPosition(int position) { + if (mSpinner == null) { + throw new IllegalStateException( + "Can't set dropdown selected position without an adapter"); + } + mSpinner.setSelection(position); + } + + @Override + public int getDropdownSelectedPosition() { + return mSpinner != null ? mSpinner.getSelectedItemPosition() : 0; + } + + @Override + public int getDropdownItemCount() { + return mSpinner != null ? mSpinner.getCount() : 0; + } + + @Override + public void setCustomView(View view) { + if (mCustomView != null && (mDisplayOpts & ActionBar.DISPLAY_SHOW_CUSTOM) != 0) { + mToolbar.removeView(mCustomView); + } + mCustomView = view; + if (view != null && (mDisplayOpts & ActionBar.DISPLAY_SHOW_CUSTOM) != 0) { + mToolbar.addView(mCustomView); + } + } + + @Override + public View getCustomView() { + return mCustomView; + } + + @Override + public void animateToVisibility(int visibility) { + if (visibility == View.GONE) { + ViewCompat.animate(mToolbar).alpha(0) + .setListener(new ViewPropertyAnimatorListenerAdapter() { + private boolean mCanceled = false; + @Override + public void onAnimationEnd(View view) { + if (!mCanceled) { + mToolbar.setVisibility(View.GONE); + } + } + + @Override + public void onAnimationCancel(View view) { + mCanceled = true; + } + }); + } else if (visibility == View.VISIBLE) { + ViewCompat.animate(mToolbar).alpha(1) + .setListener(new ViewPropertyAnimatorListenerAdapter() { + @Override + public void onAnimationStart(View view) { + mToolbar.setVisibility(View.VISIBLE); + } + }); + } + } + + @Override + public void setNavigationIcon(Drawable icon) { + mNavIcon = icon; + updateNavigationIcon(); + } + + @Override + public void setNavigationIcon(int resId) { + setNavigationIcon(resId != 0 + ? mTintManager.getDrawable(resId) + : null); + } + + @Override + public void setNavigationContentDescription(CharSequence description) { + mHomeDescription = description; + updateHomeAccessibility(); + } + + @Override + public void setNavigationContentDescription(int resId) { + setNavigationContentDescription(resId == 0 ? null : getContext().getString(resId)); + } + + private void updateHomeAccessibility() { + if ((mDisplayOpts & ActionBar.DISPLAY_HOME_AS_UP) != 0) { + if (TextUtils.isEmpty(mHomeDescription)) { + mToolbar.setNavigationContentDescription(mDefaultNavigationContentDescription); + } else { + mToolbar.setNavigationContentDescription(mHomeDescription); + } + } + } + + private void updateNavigationIcon() { + if ((mDisplayOpts & ActionBar.DISPLAY_HOME_AS_UP) != 0) { + mToolbar.setNavigationIcon(mNavIcon != null ? mNavIcon : mDefaultNavigationIcon); + } + } + + @Override + public void saveHierarchyState(SparseArray toolbarStates) { + mToolbar.saveHierarchyState(toolbarStates); + } + + @Override + public void restoreHierarchyState(SparseArray toolbarStates) { + mToolbar.restoreHierarchyState(toolbarStates); + } + + @Override + public void setBackgroundDrawable(Drawable d) { + //noinspection deprecation + mToolbar.setBackgroundDrawable(d); + } + + @Override + public int getHeight() { + return mToolbar.getHeight(); + } + + @Override + public void setVisibility(int visible) { + mToolbar.setVisibility(visible); + } + + @Override + public int getVisibility() { + return mToolbar.getVisibility(); + } + + @Override + public void setMenuCallbacks(MenuPresenter.Callback actionMenuPresenterCallback, + MenuBuilder.Callback menuBuilderCallback) { + mToolbar.setMenuCallbacks(actionMenuPresenterCallback, menuBuilderCallback); + } + + @Override + public Menu getMenu() { + return mToolbar.getMenu(); + } + + @Override + public int getPopupTheme() { + return mToolbar.getPopupTheme(); + } + +} \ No newline at end of file diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ViewStubCompat.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ViewStubCompat.java new file mode 100644 index 0000000000..10873a7294 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ViewStubCompat.java @@ -0,0 +1,262 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.support.v7.appcompat.R; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewParent; + + +import java.lang.ref.WeakReference; + +/** + * Backport of {@link android.view.ViewStub} so that we can set the + * {@link android.view.LayoutInflater} on devices before Jelly Bean. + * + * @hide + */ +public final class ViewStubCompat extends View { + private int mLayoutResource = 0; + private int mInflatedId; + + private WeakReference mInflatedViewRef; + + private LayoutInflater mInflater; + private OnInflateListener mInflateListener; + + public ViewStubCompat(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public ViewStubCompat(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ViewStubCompat, + defStyle, 0); + + mInflatedId = a.getResourceId(R.styleable.ViewStubCompat_android_inflatedId, NO_ID); + mLayoutResource = a.getResourceId(R.styleable.ViewStubCompat_android_layout, 0); + + setId(a.getResourceId(R.styleable.ViewStubCompat_android_id, NO_ID)); + a.recycle(); + + setVisibility(GONE); + setWillNotDraw(true); + } + + /** + * Returns the id taken by the inflated view. If the inflated id is + * {@link View#NO_ID}, the inflated view keeps its original id. + * + * @return A positive integer used to identify the inflated view or + * {@link #NO_ID} if the inflated view should keep its id. + * + * @see #setInflatedId(int) + * @attr ref android.R.styleable#ViewStub_inflatedId + */ + public int getInflatedId() { + return mInflatedId; + } + + /** + * Defines the id taken by the inflated view. If the inflated id is + * {@link View#NO_ID}, the inflated view keeps its original id. + * + * @param inflatedId A positive integer used to identify the inflated view or + * {@link #NO_ID} if the inflated view should keep its id. + * + * @see #getInflatedId() + * @attr ref android.R.styleable#ViewStub_inflatedId + */ + public void setInflatedId(int inflatedId) { + mInflatedId = inflatedId; + } + + /** + * Returns the layout resource that will be used by {@link #setVisibility(int)} or + * {@link #inflate()} to replace this StubbedView + * in its parent by another view. + * + * @return The layout resource identifier used to inflate the new View. + * + * @see #setLayoutResource(int) + * @see #setVisibility(int) + * @see #inflate() + * @attr ref android.R.styleable#ViewStub_layout + */ + public int getLayoutResource() { + return mLayoutResource; + } + + /** + * Specifies the layout resource to inflate when this StubbedView becomes visible or invisible + * or when {@link #inflate()} is invoked. The View created by inflating the layout resource is + * used to replace this StubbedView in its parent. + * + * @param layoutResource A valid layout resource identifier (different from 0.) + * + * @see #getLayoutResource() + * @see #setVisibility(int) + * @see #inflate() + * @attr ref android.R.styleable#ViewStub_layout + */ + public void setLayoutResource(int layoutResource) { + mLayoutResource = layoutResource; + } + + /** + * Set {@link LayoutInflater} to use in {@link #inflate()}, or {@code null} + * to use the default. + */ + public void setLayoutInflater(LayoutInflater inflater) { + mInflater = inflater; + } + + /** + * Get current {@link LayoutInflater} used in {@link #inflate()}. + */ + public LayoutInflater getLayoutInflater() { + return mInflater; + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + setMeasuredDimension(0, 0); + } + + @Override + public void draw(Canvas canvas) { + } + + @Override + protected void dispatchDraw(Canvas canvas) { + } + + /** + * When visibility is set to {@link #VISIBLE} or {@link #INVISIBLE}, + * {@link #inflate()} is invoked and this StubbedView is replaced in its parent + * by the inflated layout resource. After that calls to this function are passed + * through to the inflated view. + * + * @param visibility One of {@link #VISIBLE}, {@link #INVISIBLE}, or {@link #GONE}. + * + * @see #inflate() + */ + @Override + public void setVisibility(int visibility) { + if (mInflatedViewRef != null) { + View view = mInflatedViewRef.get(); + if (view != null) { + view.setVisibility(visibility); + } else { + throw new IllegalStateException("setVisibility called on un-referenced view"); + } + } else { + super.setVisibility(visibility); + if (visibility == VISIBLE || visibility == INVISIBLE) { + inflate(); + } + } + } + + /** + * Inflates the layout resource identified by {@link #getLayoutResource()} + * and replaces this StubbedView in its parent by the inflated layout resource. + * + * @return The inflated layout resource. + * + */ + public View inflate() { + final ViewParent viewParent = getParent(); + + if (viewParent != null && viewParent instanceof ViewGroup) { + if (mLayoutResource != 0) { + final ViewGroup parent = (ViewGroup) viewParent; + final LayoutInflater factory; + if (mInflater != null) { + factory = mInflater; + } else { + factory = LayoutInflater.from(getContext()); + } + final View view = factory.inflate(mLayoutResource, parent, + false); + + if (mInflatedId != NO_ID) { + view.setId(mInflatedId); + } + + final int index = parent.indexOfChild(this); + parent.removeViewInLayout(this); + + final ViewGroup.LayoutParams layoutParams = getLayoutParams(); + if (layoutParams != null) { + parent.addView(view, index, layoutParams); + } else { + parent.addView(view, index); + } + + mInflatedViewRef = new WeakReference(view); + + if (mInflateListener != null) { + mInflateListener.onInflate(this, view); + } + + return view; + } else { + throw new IllegalArgumentException("ViewStub must have a valid layoutResource"); + } + } else { + throw new IllegalStateException("ViewStub must have a non-null ViewGroup viewParent"); + } + } + + /** + * Specifies the inflate listener to be notified after this ViewStub successfully + * inflated its layout resource. + * + * @param inflateListener The OnInflateListener to notify of successful inflation. + * + * @see android.view.ViewStub.OnInflateListener + */ + public void setOnInflateListener(OnInflateListener inflateListener) { + mInflateListener = inflateListener; + } + + /** + * Listener used to receive a notification after a ViewStub has successfully + * inflated its layout resource. + * + * @see android.view.ViewStub#setOnInflateListener(android.view.ViewStub.OnInflateListener) + */ + public static interface OnInflateListener { + /** + * Invoked after a ViewStub successfully inflated its layout resource. + * This method is invoked after the inflated view was added to the + * hierarchy but before the layout pass. + * + * @param stub The ViewStub that initiated the inflation. + * @param inflated The inflated View. + */ + void onInflate(ViewStubCompat stub, View inflated); + } +} \ No newline at end of file diff --git a/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ViewUtils.java b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ViewUtils.java new file mode 100644 index 0000000000..98e55d55f3 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/internal/widget/ViewUtils.java @@ -0,0 +1,140 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.internal.widget; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Rect; +import android.os.Build; +import android.support.v4.view.ViewCompat; +import android.support.v7.appcompat.R; +import android.support.v7.internal.view.ContextThemeWrapper; +import android.util.AttributeSet; +import android.util.Log; +import android.view.View; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +/** + * @hide + */ +public class ViewUtils { + private static final String TAG = "ViewUtils"; + + private static Method sComputeFitSystemWindowsMethod; + + static { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { + try { + sComputeFitSystemWindowsMethod = View.class.getDeclaredMethod( + "computeFitSystemWindows", Rect.class, Rect.class); + if (!sComputeFitSystemWindowsMethod.isAccessible()) { + sComputeFitSystemWindowsMethod.setAccessible(true); + } + } catch (NoSuchMethodException e) { + Log.d(TAG, "Could not find method computeFitSystemWindows. Oh well."); + } + } + } + + private ViewUtils() {} + + public static boolean isLayoutRtl(View view) { + return ViewCompat.getLayoutDirection(view) == ViewCompat.LAYOUT_DIRECTION_RTL; + } + + /** + * Merge two states as returned by {@link ViewCompat#getMeasuredState(android.view.View)} ()}. + * @param curState The current state as returned from a view or the result + * of combining multiple views. + * @param newState The new view state to combine. + * @return Returns a new integer reflecting the combination of the two + * states. + */ + public static int combineMeasuredStates(int curState, int newState) { + return curState | newState; + } + + /** + * Allow calling the hidden method {@code computeFitSystemWindows(Rect, Rect)} through + * reflection on {@code view}. + */ + public static void computeFitSystemWindows(View view, Rect inoutInsets, Rect outLocalInsets) { + if (sComputeFitSystemWindowsMethod != null) { + try { + sComputeFitSystemWindowsMethod.invoke(view, inoutInsets, outLocalInsets); + } catch (Exception e) { + Log.d(TAG, "Could not invoke computeFitSystemWindows", e); + } + } + } + + /** + * Allow calling the hidden method {@code makeOptionalFitsSystem()} through reflection on + * {@code view}. + */ + public static void makeOptionalFitsSystemWindows(View view) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + try { + // We need to use getMethod() for makeOptionalFitsSystemWindows since both View + // and ViewGroup implement the method + Method method = view.getClass().getMethod("makeOptionalFitsSystemWindows"); + if (!method.isAccessible()) { + method.setAccessible(true); + } + method.invoke(view); + } catch (NoSuchMethodException e) { + Log.d(TAG, "Could not find method makeOptionalFitsSystemWindows. Oh well..."); + } catch (InvocationTargetException e) { + Log.d(TAG, "Could not invoke makeOptionalFitsSystemWindows", e); + } catch (IllegalAccessException e) { + Log.d(TAG, "Could not invoke makeOptionalFitsSystemWindows", e); + } + } + } + + /** + * Allows us to emulate the {@code android:theme} attribute for devices before L. + */ + public static Context themifyContext(Context context, AttributeSet attrs, + boolean useAndroidTheme, boolean useAppTheme) { + final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.View, 0, 0); + int themeId = 0; + if (useAndroidTheme) { + // First try reading android:theme if enabled + themeId = a.getResourceId(R.styleable.View_android_theme, 0); + } + if (useAppTheme && themeId == 0) { + // ...if that didn't work, try reading app:theme (for legacy reasons) if enabled + themeId = a.getResourceId(R.styleable.View_theme, 0); + + if (themeId != 0) { + Log.i(TAG, "app:theme is now deprecated. Please move to using android:theme instead."); + } + } + a.recycle(); + + if (themeId != 0 && (!(context instanceof ContextThemeWrapper) + || ((ContextThemeWrapper) context).getThemeResId() != themeId)) { + // If the context isn't a ContextThemeWrapperCompat, or it is but does not have + // the same theme as we need, wrap it in a new wrapper + context = new ContextThemeWrapper(context, themeId); + } + return context; + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/view/ActionMode.java b/eclipse-compile/appcompat/src/android/support/v7/view/ActionMode.java new file mode 100644 index 0000000000..ff9cd495f4 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/view/ActionMode.java @@ -0,0 +1,279 @@ +/* + * 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 android.support.v7.view; + +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; + +/** + * Represents a contextual mode of the user interface. Action modes can be used to provide + * alternative interaction modes and replace parts of the normal UI until finished. + * Examples of good action modes include text selection and contextual actions. + *

      + * + *

      Developer Guides

      + *

      For information about how to provide contextual actions with {@code ActionMode}, + * read the Menus + * developer guide.

      + * + *
      + */ +public abstract class ActionMode { + + private Object mTag; + private boolean mTitleOptionalHint; + + /** + * 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 whether or not the title/subtitle display for this action mode + * is optional. + * + *

      In many cases the supplied title for an action mode is merely + * meant to add context and is not strictly required for the action + * mode to be useful. If the title is optional, the system may choose + * to hide the title entirely rather than truncate it due to a lack + * of available space.

      + * + *

      Note that this is merely a hint; the underlying implementation + * may choose to ignore this setting under some circumstances.

      + * + * @param titleOptional true if the title only presents optional information. + */ + public void setTitleOptionalHint(boolean titleOptional) { + mTitleOptionalHint = titleOptional; + } + + /** + * @return true if this action mode has been given a hint to consider the + * title/subtitle display to be optional. + * + * @see #setTitleOptionalHint(boolean) + * @see #isTitleOptional() + */ + public boolean getTitleOptionalHint() { + return mTitleOptionalHint; + } + + /** + * @return true if this action mode considers the title and subtitle fields + * as optional. Optional titles may not be displayed to the user. + */ + public boolean isTitleOptional() { + return false; + } + + /** + * 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 android.support.v7.app.AppCompatDelegate#startSupportActionMode(Callback)} (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); + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/view/CollapsibleActionView.java b/eclipse-compile/appcompat/src/android/support/v7/view/CollapsibleActionView.java new file mode 100644 index 0000000000..3f01c5cb84 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/view/CollapsibleActionView.java @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.view; + +import android.support.v4.view.MenuItemCompat.OnActionExpandListener; + +/** + * When a {@link android.view.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 android.support.v4.view.MenuItemCompat} 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 + * android.support.v4.view.MenuItemCompat#expandActionView(android.view.MenuItem)}. + */ + public void onActionViewExpanded(); + + /** + * Called when this view is collapsed as an action view. See {@link + * android.support.v4.view.MenuItemCompat#collapseActionView(android.view.MenuItem)}. + */ + public void onActionViewCollapsed(); +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/widget/ActionMenuPresenter.java b/eclipse-compile/appcompat/src/android/support/v7/widget/ActionMenuPresenter.java new file mode 100644 index 0000000000..bf167d6471 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/widget/ActionMenuPresenter.java @@ -0,0 +1,769 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.widget; + +import android.content.Context; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.graphics.drawable.Drawable; +import android.os.Parcel; +import android.os.Parcelable; +import android.support.v4.graphics.drawable.DrawableCompat; +import android.support.v4.view.ActionProvider; +import android.support.v4.view.GravityCompat; +import android.support.v7.appcompat.R; +import android.support.v7.internal.transition.ActionBarTransition; +import android.support.v7.internal.view.ActionBarPolicy; +import android.support.v7.internal.view.menu.ActionMenuItemView; +import android.support.v7.internal.view.menu.BaseMenuPresenter; +import android.support.v7.internal.view.menu.MenuBuilder; +import android.support.v7.internal.view.menu.MenuItemImpl; +import android.support.v7.internal.view.menu.MenuPopupHelper; +import android.support.v7.internal.view.menu.MenuView; +import android.support.v7.internal.view.menu.SubMenuBuilder; +import android.support.v7.internal.widget.TintImageView; +import android.util.SparseBooleanArray; +import android.view.MenuItem; +import android.view.SoundEffectConstants; +import android.view.View; +import android.view.View.MeasureSpec; +import android.view.ViewGroup; + +import java.util.ArrayList; + +/** + * MenuPresenter for building action menus as seen in the action bar and action modes. + * + * @hide + */ +public class ActionMenuPresenter extends BaseMenuPresenter + implements ActionProvider.SubUiVisibilityListener { + + 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; + private ActionMenuPopupCallback mPopupCallback; + + final PopupPresenterCallback mPopupPresenterCallback = new PopupPresenterCallback(); + int mOpenSubMenuId; + + public ActionMenuPresenter(Context context) { + super(context, R.layout.abc_action_menu_layout, R.layout.abc_action_menu_item_layout); + } + + @Override + public void initForMenu(Context context, MenuBuilder menu) { + super.initForMenu(context, menu); + + final Resources res = context.getResources(); + + final ActionBarPolicy abp = ActionBarPolicy.get(context); + if (!mReserveOverflowSet) { + mReserveOverflow = abp.showsOverflowMenuButton(); + } + + if (!mWidthLimitSet) { + mWidthLimit = abp.getEmbeddedMenuWidthLimit(); + } + + // Measure for initial configuration + if (!mMaxItemsSet) { + mMaxItems = abp.getMaxActionButtons(); + } + + 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 void onConfigurationChanged(Configuration newConfig) { + if (!mMaxItemsSet) { + mMaxItems = mContext.getResources().getInteger( + R.integer.abc_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(final MenuItemImpl item, View convertView, ViewGroup parent) { + View actionView = item.getActionView(); + if (actionView == null || item.hasCollapsibleActionView()) { + 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; + final ActionMenuItemView actionItemView = (ActionMenuItemView) itemView; + actionItemView.setItemInvoker(menuView); + + if (mPopupCallback == null) { + mPopupCallback = new ActionMenuPopupCallback(); + } + actionItemView.setPopupCallback(mPopupCallback); + } + + @Override + public boolean shouldIncludeItem(int childIndex, MenuItemImpl item) { + return item.isActionButton(); + } + + @Override + public void updateMenuView(boolean cleared) { + final ViewGroup menuViewParent = (ViewGroup) ((View) mMenuView).getParent(); + if (menuViewParent != null) { + ActionBarTransition.beginDelayedTransition(menuViewParent); + } + super.updateMenuView(cleared); + + ((View) mMenuView).requestLayout(); + + 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).getSupportActionProvider(); + 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(); + } + + public boolean isOverflowMenuShowPending() { + return mPostedOpenRunnable != null || isOverflowMenuShowing(); + } + + /** + * @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); + } else { + // Neither requires nor requests an action button. + item.setIsActionButton(false); + } + } + 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); + } + } + + public void setMenuView(ActionMenuView menuView) { + mMenuView = menuView; + menuView.initialize(mMenu); + } + + 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); + } + + 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 TintImageView implements ActionMenuView.ActionMenuChildView { + private final float[] mTempPts = new float[2]; + + public OverflowMenuButton(Context context) { + super(context, null, R.attr.actionOverflowButtonStyle); + + setClickable(true); + setFocusable(true); + setVisibility(VISIBLE); + setEnabled(true); + + setOnTouchListener(new ListPopupWindow.ForwardingListener(this) { + @Override + public ListPopupWindow getPopup() { + if (mOverflowPopup == null) { + return null; + } + + return mOverflowPopup.getPopup(); + } + + @Override + public boolean onForwardingStarted() { + showOverflowMenu(); + return true; + } + + @Override + public boolean onForwardingStopped() { + // Displaying the popup occurs asynchronously, so wait for + // the runnable to finish before deciding whether to stop + // forwarding. + if (mPostedOpenRunnable != null) { + return false; + } + + hideOverflowMenu(); + return true; + } + }); + } + + @Override + public boolean performClick() { + if (super.performClick()) { + return true; + } + + playSoundEffect(SoundEffectConstants.CLICK); + showOverflowMenu(); + return true; + } + + @Override + public boolean needsDividerBefore() { + return false; + } + + @Override + public boolean needsDividerAfter() { + return false; + } + + @Override + protected boolean setFrame(int l, int t, int r, int b) { + final boolean changed = super.setFrame(l, t, r, b); + + // Set up the hotspot bounds to be centered on the image. + final Drawable d = getDrawable(); + final Drawable bg = getBackground(); + if (d != null && bg != null) { + final int width = getWidth(); + final int height = getHeight(); + final int halfEdge = Math.max(width, height) / 2; + final int offsetX = getPaddingLeft() - getPaddingRight(); + final int offsetY = getPaddingTop() - getPaddingBottom(); + final int centerX = (width + offsetX) / 2; + final int centerY = (height + offsetY) / 2; + DrawableCompat.setHotspotBounds(bg, centerX - halfEdge, centerY - halfEdge, + centerX + halfEdge, centerY + halfEdge); + } + + return changed; + } + } + + private class OverflowPopup extends MenuPopupHelper { + + public OverflowPopup(Context context, MenuBuilder menu, View anchorView, + boolean overflowOnly) { + super(context, menu, anchorView, overflowOnly, R.attr.actionOverflowMenuStyle); + setGravity(GravityCompat.END); + setCallback(mPopupPresenterCallback); + } + + @Override + public void onDismiss() { + super.onDismiss(); + mMenu.close(); + mOverflowPopup = null; + } + } + + private class ActionButtonSubmenu extends MenuPopupHelper { + private SubMenuBuilder mSubMenu; + + public ActionButtonSubmenu(Context context, SubMenuBuilder subMenu) { + super(context, subMenu, null, false, + R.attr.actionOverflowMenuStyle); + 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 Callback { + + @Override + public boolean onOpenSubMenu(MenuBuilder subMenu) { + if (subMenu == null) return false; + + mOpenSubMenuId = ((SubMenuBuilder) subMenu).getItem().getItemId(); + final Callback cb = getCallback(); + return cb != null ? cb.onOpenSubMenu(subMenu) : false; + } + + @Override + public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { + if (menu instanceof SubMenuBuilder) { + ((SubMenuBuilder) menu).getRootMenu().close(false); + } + final Callback cb = getCallback(); + if (cb != null) { + cb.onCloseMenu(menu, allMenusAreClosing); + } + } + } + + 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; + } + } + + private class ActionMenuPopupCallback extends ActionMenuItemView.PopupCallback { + @Override + public ListPopupWindow getPopup() { + return mActionButtonPopup != null ? mActionButtonPopup.getPopup() : null; + } + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/widget/ActionMenuView.java b/eclipse-compile/appcompat/src/android/support/v7/widget/ActionMenuView.java new file mode 100644 index 0000000000..b7c982181b --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/widget/ActionMenuView.java @@ -0,0 +1,811 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package android.support.v7.widget; + +import android.content.Context; +import android.content.res.Configuration; +import android.os.Build; +import android.support.v7.internal.view.menu.ActionMenuItemView; +import android.support.v7.internal.view.menu.MenuBuilder; +import android.support.v7.internal.view.menu.MenuItemImpl; +import android.support.v7.internal.view.menu.MenuPresenter; +import android.support.v7.internal.view.menu.MenuView; +import android.support.v7.internal.widget.ViewUtils; +import android.util.AttributeSet; +import android.view.ContextThemeWrapper; +import android.view.Gravity; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewDebug; +import android.view.ViewGroup; +import android.view.accessibility.AccessibilityEvent; + +/** + * ActionMenuView is a presentation of a series of menu options as a View. It provides + * several top level options as action buttons while spilling remaining options over as + * items in an overflow menu. This allows applications to present packs of actions inline with + * specific or repeating content. + */ +public class ActionMenuView extends LinearLayoutCompat implements MenuBuilder.ItemInvoker, + MenuView { + + private static final String TAG = "ActionMenuView"; + + static final int MIN_CELL_SIZE = 56; // dips + static final int GENERATED_ITEM_PADDING = 4; // dips + + private MenuBuilder mMenu; + + private Context mContext; + + /** Context against which to inflate popup menus. */ + private Context mPopupContext; + + /** Theme resource against which to inflate popup menus. */ + private int mPopupTheme; + + private boolean mReserveOverflow; + private ActionMenuPresenter mPresenter; + private MenuPresenter.Callback mActionMenuPresenterCallback; + private MenuBuilder.Callback mMenuBuilderCallback; + private boolean mFormatItems; + private int mFormatItemsWidth; + private int mMinCellSize; + private int mGeneratedItemPadding; + + private OnMenuItemClickListener mOnMenuItemClickListener; + + public ActionMenuView(Context context) { + this(context, null); + } + + public ActionMenuView(Context context, AttributeSet attrs) { + super(context, attrs); + mContext = context; + setBaselineAligned(false); + final float density = context.getResources().getDisplayMetrics().density; + mMinCellSize = (int) (MIN_CELL_SIZE * density); + mGeneratedItemPadding = (int) (GENERATED_ITEM_PADDING * density); + mPopupContext = context; + mPopupTheme = 0; + } + + /** + * Specifies the theme to use when inflating popup menus. By default, uses + * the same theme as the action menu view itself. + * + * @param resId theme used to inflate popup menus + * @see #getPopupTheme() + */ + public void setPopupTheme(int resId) { + if (mPopupTheme != resId) { + mPopupTheme = resId; + if (resId == 0) { + mPopupContext = mContext; + } else { + mPopupContext = new ContextThemeWrapper(mContext, resId); + } + } + } + + /** + * @return resource identifier of the theme used to inflate popup menus, or + * 0 if menus are inflated against the action menu view theme + * @see #setPopupTheme(int) + */ + public int getPopupTheme() { + return mPopupTheme; + } + + /** + * @param presenter Menu presenter used to display popup menu + * @hide + */ + public void setPresenter(ActionMenuPresenter presenter) { + mPresenter = presenter; + mPresenter.setMenuView(this); + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + if (Build.VERSION.SDK_INT >= 8) { + super.onConfigurationChanged(newConfig); + } + + if (mPresenter != null) { + mPresenter.updateMenuView(false); + + if (mPresenter.isOverflowMenuShowing()) { + mPresenter.hideOverflowMenu(); + mPresenter.showOverflowMenu(); + } + } + } + + public void setOnMenuItemClickListener(OnMenuItemClickListener listener) { + mOnMenuItemClickListener = listener; + } + + @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.getSize(widthMeasureSpec); + if (mFormatItems && mMenu != null && widthSize != mFormatItemsWidth) { + mFormatItemsWidth = widthSize; + mMenu.onItemsChanged(true); + } + + final int childCount = getChildCount(); + if (mFormatItems && childCount > 0) { + onMeasureExactFormat(widthMeasureSpec, heightMeasureSpec); + } else { + // Previous measurement at exact format may have set margins - reset them. + for (int i = 0; i < childCount; i++) { + final View child = getChildAt(i); + final LayoutParams lp = (LayoutParams) child.getLayoutParams(); + lp.leftMargin = lp.rightMargin = 0; + } + 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(); + + final int itemHeightSpec = getChildMeasureSpec(heightMeasureSpec, heightPadding, + ViewGroup.LayoutParams.WRAP_CONTENT); + + 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, + itemHeightSpec, 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) { + 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), + itemHeightSpec); + } + } + + if (heightMode != MeasureSpec.EXACTLY) { + heightSize = maxChildHeight; + } + + setMeasuredDimension(widthSize, heightSize); + } + + /** + * 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); + + final ActionMenuItemView itemView = child instanceof ActionMenuItemView ? + (ActionMenuItemView) child : null; + final boolean hasText = itemView != null && itemView.hasText(); + + int cellsUsed = 0; + if (cellsRemaining > 0 && (!hasText || cellsRemaining >= 2)) { + 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++; + if (hasText && cellsUsed < 2) cellsUsed = 2; + } + + final boolean expandable = !lp.isOverflowButton && 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 = (bottom - top) / 2; + final int dividerWidth = getDividerWidth(); + int overflowWidth = 0; + int nonOverflowWidth = 0; + int nonOverflowCount = 0; + int widthRemaining = right - left - getPaddingRight() - getPaddingLeft(); + boolean hasOverflow = false; + final boolean isLayoutRtl = ViewUtils.isLayoutRtl(this); + 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 (hasSupportDividerBeforeChildAt(i)) { + overflowWidth += dividerWidth; + } + int height = v.getMeasuredHeight(); + int r; + int l; + if (isLayoutRtl) { + l = getPaddingLeft() + p.leftMargin; + r = l + overflowWidth; + } else { + r = getWidth() - getPaddingRight() - p.rightMargin; + 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; + nonOverflowWidth += size; + widthRemaining -= size; + if (hasSupportDividerBeforeChildAt(i)) { + 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); + + if (isLayoutRtl) { + int startRight = getWidth() - getPaddingRight(); + 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; + } + + startRight -= lp.rightMargin; + int width = v.getMeasuredWidth(); + int height = v.getMeasuredHeight(); + int t = midVertical - height / 2; + v.layout(startRight - width, t, startRight, t + height); + startRight -= width + lp.leftMargin + spacerSize; + } + } else { + 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(); + dismissPopupMenus(); + } + + /** @hide */ + public boolean isOverflowReserved() { + return mReserveOverflow; + } + + /** @hide */ + 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 != null) { + final LayoutParams result = p instanceof LayoutParams + ? new LayoutParams((LayoutParams) p) + : new 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; + } + + /** @hide */ + public LayoutParams generateOverflowButtonLayoutParams() { + LayoutParams result = generateDefaultLayoutParams(); + result.isOverflowButton = true; + return result; + } + + /** @hide */ + public boolean invokeItem(MenuItemImpl item) { + return mMenu.performItemAction(item, 0); + } + + /** @hide */ + public int getWindowAnimations() { + return 0; + } + + /** @hide */ + public void initialize(MenuBuilder menu) { + mMenu = menu; + } + + /** + * Returns the Menu object that this ActionMenuView is currently presenting. + * + *

      Applications should use this method to obtain the ActionMenuView's Menu object + * and inflate or add content to it as necessary.

      + * + * @return the Menu presented by this view + */ + public Menu getMenu() { + if (mMenu == null) { + final Context context = getContext(); + mMenu = new MenuBuilder(context); + mMenu.setCallback(new MenuBuilderCallback()); + mPresenter = new ActionMenuPresenter(context); + mPresenter.setReserveOverflow(true); + mPresenter.setCallback(mActionMenuPresenterCallback != null + ? mActionMenuPresenterCallback : new ActionMenuPresenterCallback()); + mMenu.addMenuPresenter(mPresenter, mPopupContext); + mPresenter.setMenuView(this); + } + + return mMenu; + } + + /** + * Must be called before the first call to getMenu() + * @hide + */ + public void setMenuCallbacks(MenuPresenter.Callback pcb, MenuBuilder.Callback mcb) { + mActionMenuPresenterCallback = pcb; + mMenuBuilderCallback = mcb; + } + + /** + * Returns the current menu or null if one has not yet been configured. + * @hide Internal use only for action bar integration + */ + public MenuBuilder peekMenu() { + return mMenu; + } + + /** + * Show the overflow items from the associated menu. + * + * @return true if the menu was able to be shown, false otherwise + */ + public boolean showOverflowMenu() { + return mPresenter != null && mPresenter.showOverflowMenu(); + } + + /** + * Hide the overflow items from the associated menu. + * + * @return true if the menu was able to be hidden, false otherwise + */ + public boolean hideOverflowMenu() { + return mPresenter != null && mPresenter.hideOverflowMenu(); + } + + /** + * Check whether the overflow menu is currently showing. This may not reflect + * a pending show operation in progress. + * + * @return true if the overflow menu is currently showing + */ + public boolean isOverflowMenuShowing() { + return mPresenter != null && mPresenter.isOverflowMenuShowing(); + } + + /** @hide */ + public boolean isOverflowMenuShowPending() { + return mPresenter != null && mPresenter.isOverflowMenuShowPending(); + } + + /** + * Dismiss any popups associated with this menu view. + */ + public void dismissPopupMenus() { + if (mPresenter != null) { + mPresenter.dismissPopupMenus(); + } + } + + /** + * @hide Private LinearLayout (superclass) API. Un-hide if LinearLayout API is made public. + */ + protected boolean hasSupportDividerBeforeChildAt(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; + } + + /** @hide */ + public void setExpandedActionViewsExclusive(boolean exclusive) { + mPresenter.setExpandedActionViewsExclusive(exclusive); + } + + /** + * Interface responsible for receiving menu item click events if the items themselves + * do not have individual item click listeners. + */ + public interface OnMenuItemClickListener { + /** + * This method will be invoked when a menu item is clicked if the item itself did + * not already handle the event. + * + * @param item {@link MenuItem} that was clicked + * @return true if the event was handled, false otherwise. + */ + public boolean onMenuItemClick(MenuItem item); + } + + private class MenuBuilderCallback implements MenuBuilder.Callback { + @Override + public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) { + return mOnMenuItemClickListener != null && + mOnMenuItemClickListener.onMenuItemClick(item); + } + + @Override + public void onMenuModeChange(MenuBuilder menu) { + if (mMenuBuilderCallback != null) { + mMenuBuilderCallback.onMenuModeChange(menu); + } + } + } + + private class ActionMenuPresenterCallback implements ActionMenuPresenter.Callback { + @Override + public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { + } + + @Override + public boolean onOpenSubMenu(MenuBuilder subMenu) { + return false; + } + } + + /** @hide */ + public interface ActionMenuChildView { + public boolean needsDividerBefore(); + public boolean needsDividerAfter(); + } + + public static class LayoutParams extends LinearLayoutCompat.LayoutParams { + + @ViewDebug.ExportedProperty() + public boolean isOverflowButton; + + @ViewDebug.ExportedProperty() + public int cellsUsed; + + @ViewDebug.ExportedProperty() + public int extraPixels; + + @ViewDebug.ExportedProperty() + public boolean expandable; + + @ViewDebug.ExportedProperty() + public boolean preventEdgeOffset; + + boolean expanded; + + public LayoutParams(Context c, AttributeSet attrs) { + super(c, attrs); + } + + public LayoutParams(ViewGroup.LayoutParams other) { + super(other); + } + + public LayoutParams(LayoutParams other) { + super((ViewGroup.LayoutParams) other); + isOverflowButton = other.isOverflowButton; + } + + public LayoutParams(int width, int height) { + super(width, height); + isOverflowButton = false; + } + + LayoutParams(int width, int height, boolean isOverflowButton) { + super(width, height); + this.isOverflowButton = isOverflowButton; + } + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/widget/LinearLayoutCompat.java b/eclipse-compile/appcompat/src/android/support/v7/widget/LinearLayoutCompat.java new file mode 100644 index 0000000000..b89115c0aa --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/widget/LinearLayoutCompat.java @@ -0,0 +1,1837 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.widget; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.support.annotation.IntDef; +import android.support.v4.view.GravityCompat; +import android.support.v4.view.ViewCompat; +import android.support.v7.appcompat.R; +import android.support.v7.internal.widget.TintTypedArray; +import android.support.v7.internal.widget.ViewUtils; +import android.util.AttributeSet; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.view.accessibility.AccessibilityEvent; +import android.view.accessibility.AccessibilityNodeInfo; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + + +/** + * A Layout that arranges its children in a single column or a single row. The direction of + * the row can be set by calling {@link #setOrientation(int) setOrientation()}. + * You can also specify gravity, which specifies the alignment of all the child elements by + * calling {@link #setGravity(int) setGravity()} or specify that specific children + * grow to fill up any remaining space in the layout by setting the weight member of + * {@link LinearLayoutCompat.LayoutParams LinearLayoutCompat.LayoutParams}. + * The default orientation is horizontal. + * + *

      See the Linear Layout + * guide.

      + * + *

      + * Also see {@link LinearLayoutCompat.LayoutParams} for layout attributes

      + */ +public class LinearLayoutCompat extends ViewGroup { + /** @hide */ + @IntDef({HORIZONTAL, VERTICAL}) + @Retention(RetentionPolicy.SOURCE) + public @interface OrientationMode {} + + public static final int HORIZONTAL = 0; + public static final int VERTICAL = 1; + + /** @hide */ + @IntDef(flag = true, + value = { + SHOW_DIVIDER_NONE, + SHOW_DIVIDER_BEGINNING, + SHOW_DIVIDER_MIDDLE, + SHOW_DIVIDER_END + }) + @Retention(RetentionPolicy.SOURCE) + public @interface DividerMode {} + + /** + * 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; + + /** + * Whether the children of this layout are baseline aligned. Only applicable + * if {@link #mOrientation} is horizontal. + */ + private boolean mBaselineAligned = true; + + /** + * If this layout is part of another layout that is baseline aligned, + * use the child at this index as the baseline. + * + * Note: this is orthogonal to {@link #mBaselineAligned}, which is concerned + * with whether the children of this layout are baseline aligned. + */ + private int mBaselineAlignedChildIndex = -1; + + /** + * The additional offset to the child's baseline. + * We'll calculate the baseline of this layout as we measure vertically; for + * horizontal linear layouts, the offset of 0 is appropriate. + */ + private int mBaselineChildTop = 0; + + private int mOrientation; + + private int mGravity = GravityCompat.START | Gravity.TOP; + + private int mTotalLength; + + private float mWeightSum; + + private boolean mUseLargestChild; + + private int[] mMaxAscent; + private int[] mMaxDescent; + + private static final int VERTICAL_GRAVITY_COUNT = 4; + + private static final int INDEX_CENTER_VERTICAL = 0; + private static final int INDEX_TOP = 1; + private static final int INDEX_BOTTOM = 2; + private static final int INDEX_FILL = 3; + + private Drawable mDivider; + private int mDividerWidth; + private int mDividerHeight; + private int mShowDividers; + private int mDividerPadding; + + public LinearLayoutCompat(Context context) { + this(context, null); + } + + public LinearLayoutCompat(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public LinearLayoutCompat(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + final TintTypedArray a = TintTypedArray.obtainStyledAttributes(context, attrs, + R.styleable.LinearLayoutCompat, defStyleAttr, 0); + + int index = a.getInt(R.styleable.LinearLayoutCompat_android_orientation, -1); + if (index >= 0) { + setOrientation(index); + } + + index = a.getInt(R.styleable.LinearLayoutCompat_android_gravity, -1); + if (index >= 0) { + setGravity(index); + } + + boolean baselineAligned = a.getBoolean(R.styleable.LinearLayoutCompat_android_baselineAligned, true); + if (!baselineAligned) { + setBaselineAligned(baselineAligned); + } + + mWeightSum = a.getFloat(R.styleable.LinearLayoutCompat_android_weightSum, -1.0f); + + mBaselineAlignedChildIndex = + a.getInt(R.styleable.LinearLayoutCompat_android_baselineAlignedChildIndex, -1); + + mUseLargestChild = a.getBoolean(R.styleable.LinearLayoutCompat_measureWithLargestChild, false); + + setDividerDrawable(a.getDrawable(R.styleable.LinearLayoutCompat_divider)); + mShowDividers = a.getInt(R.styleable.LinearLayoutCompat_showDividers, SHOW_DIVIDER_NONE); + mDividerPadding = a.getDimensionPixelSize(R.styleable.LinearLayoutCompat_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(@DividerMode int showDividers) { + if (showDividers != mShowDividers) { + requestLayout(); + } + mShowDividers = showDividers; + } + + @Override + public boolean shouldDelayChildPressedState() { + return false; + } + + /** + * @return A flag set indicating how dividers should be shown around items. + * @see #setShowDividers(int) + */ + @DividerMode + public int getShowDividers() { + return mShowDividers; + } + + /** + * @return the divider Drawable that will divide each item. + * + * @see #setDividerDrawable(Drawable) + */ + public Drawable getDividerDrawable() { + return mDivider; + } + + /** + * Set a drawable to be used as a divider between items. + * + * @param divider Drawable that will divide each item. + * + * @see #setShowDividers(int) + */ + public void setDividerDrawable(Drawable divider) { + if (divider == mDivider) { + return; + } + mDivider = divider; + if (divider != null) { + mDividerWidth = divider.getIntrinsicWidth(); + mDividerHeight = divider.getIntrinsicHeight(); + } else { + mDividerWidth = 0; + mDividerHeight = 0; + } + setWillNotDraw(divider == null); + requestLayout(); + } + + /** + * Set padding displayed on both ends of dividers. + * + * @param padding Padding value in pixels that will be applied to each end + * + * @see #setShowDividers(int) + * @see #setDividerDrawable(Drawable) + * @see #getDividerPadding() + */ + public void setDividerPadding(int padding) { + mDividerPadding = padding; + } + + /** + * Get the padding size used to inset dividers in pixels + * + * @see #setShowDividers(int) + * @see #setDividerDrawable(Drawable) + * @see #setDividerPadding(int) + */ + public int getDividerPadding() { + return mDividerPadding; + } + + /** + * Get the width of the current divider drawable. + * + * @hide Used internally by framework. + */ + public int getDividerWidth() { + return mDividerWidth; + } + + @Override + protected void onDraw(Canvas canvas) { + if (mDivider == null) { + return; + } + + if (mOrientation == VERTICAL) { + drawDividersVertical(canvas); + } else { + drawDividersHorizontal(canvas); + } + } + + 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 drawDividersHorizontal(Canvas canvas) { + final int count = getVirtualChildCount(); + final boolean isLayoutRtl = ViewUtils.isLayoutRtl(this); + 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 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); + } + + /** + *

      Indicates whether widgets contained within this layout are aligned + * on their baseline or not.

      + * + * @return true when widgets are baseline-aligned, false otherwise + */ + public boolean isBaselineAligned() { + return mBaselineAligned; + } + + /** + *

      Defines whether widgets contained in this layout are + * baseline-aligned or not.

      + * + * @param baselineAligned true to align widgets on their baseline, + * false otherwise + */ + public void setBaselineAligned(boolean baselineAligned) { + mBaselineAligned = baselineAligned; + } + + /** + * 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. + */ + 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. + */ + public void setMeasureWithLargestChildEnabled(boolean enabled) { + mUseLargestChild = enabled; + } + + @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) { + // this is just the default case, safe to return -1 + return -1; + } + // the user picked an index that points to something that doesn't + // know how to calculate its baseline. + throw new RuntimeException("mBaselineAlignedChildIndex of LinearLayout " + + "points to a View that doesn't know how to get its baseline."); + } + + // TODO: This should try to take into account the virtual offsets + // (See getNextLocationOffset and getLocationOffset) + // We should add to childTop: + // sum([getNextLocationOffset(getChildAt(i)) / i < mBaselineAlignedChildIndex]) + // and also add: + // getLocationOffset(child) + 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; + } + } + } + + LinearLayoutCompat.LayoutParams lp = (LinearLayoutCompat.LayoutParams) child.getLayoutParams(); + return childTop + lp.topMargin + childBaseline; + } + + /** + * @return The index of the child that will be used if this layout is + * part of a larger layout that is baseline aligned, or -1 if none has + * been set. + */ + public int getBaselineAlignedChildIndex() { + return mBaselineAlignedChildIndex; + } + + /** + * @param i The index of the child that will be used if this layout is + * part of a larger layout that is baseline aligned. + */ + public void setBaselineAlignedChildIndex(int i) { + if ((i < 0) || (i >= getChildCount())) { + throw new IllegalArgumentException("base aligned child index out " + + "of range (0, " + getChildCount() + ")"); + } + mBaselineAlignedChildIndex = i; + } + + /** + *

      Returns the view at the specified index. This method can be overriden + * to take into account virtual children. Refer to + * {@link android.widget.TableLayout} and {@link android.widget.TableRow} + * for an example.

      + * + * @param index the child's index + * @return the child at the specified index + */ + View getVirtualChildAt(int index) { + return getChildAt(index); + } + + /** + *

      Returns the virtual number of children. This number might be different + * than the actual number of children if the layout can hold virtual + * children. Refer to + * {@link android.widget.TableLayout} and {@link android.widget.TableRow} + * for an example.

      + * + * @return the virtual number of children + */ + int getVirtualChildCount() { + return getChildCount(); + } + + /** + * Returns the desired weights sum. + * + * @return A number greater than 0.0f if the weight sum is defined, or + * a number lower than or equals to 0.0f if not weight sum is + * to be used. + */ + public float getWeightSum() { + return mWeightSum; + } + + /** + * Defines the desired weights sum. If unspecified the weights sum is computed + * at layout time by adding the layout_weight of each child. + * + * This can be used for instance to give a single child 50% of the total + * available space by giving it a layout_weight of 0.5 and setting the + * weightSum to 1.0. + * + * @param weightSum a number greater than 0.0f, or a number lower than or equals + * to 0.0f if the weight sum should be computed from the children's + * layout_weight + */ + public void setWeightSum(float weightSum) { + mWeightSum = Math.max(0.0f, weightSum); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + if (mOrientation == VERTICAL) { + measureVertical(widthMeasureSpec, heightMeasureSpec); + } else { + measureHorizontal(widthMeasureSpec, heightMeasureSpec); + } + } + + /** + * 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; + } + + /** + * Measures the children when the orientation of this LinearLayout is set + * to {@link #VERTICAL}. + * + * @param widthMeasureSpec Horizontal space requirements as imposed by the parent. + * @param heightMeasureSpec Vertical space requirements as imposed by the parent. + * + * @see #getOrientation() + * @see #setOrientation(int) + * @see #onMeasure(int, int) + */ + 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; + boolean skippedMeasure = false; + + final int baselineChildIndex = mBaselineAlignedChildIndex; + final boolean useLargestChild = mUseLargestChild; + + int largestChildHeight = Integer.MIN_VALUE; + + // See how tall everyone is. Also remember max width. + 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; + } + + LinearLayoutCompat.LayoutParams lp = (LinearLayoutCompat.LayoutParams) child.getLayoutParams(); + + totalWeight += lp.weight; + + if (heightMode == MeasureSpec.EXACTLY && lp.height == 0 && lp.weight > 0) { + // Optimization: don't bother measuring children who are going to use + // leftover space. These views will get measured again down below if + // there is any leftover space. + final int totalLength = mTotalLength; + mTotalLength = Math.max(totalLength, totalLength + lp.topMargin + lp.bottomMargin); + skippedMeasure = true; + } else { + int oldHeight = Integer.MIN_VALUE; + + if (lp.height == 0 && lp.weight > 0) { + // heightMode is either UNSPECIFIED or AT_MOST, and this + // child wanted to stretch to fill available space. + // Translate that to WRAP_CONTENT so that it does not end up + // with a height of 0 + oldHeight = 0; + lp.height = LayoutParams.WRAP_CONTENT; + } + + // Determine how big this child would like to be. If this or + // previous children have given a weight, then we allow it to + // use all available space (and we will shrink things later + // if needed). + 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 applicable, compute the additional offset to the child's baseline + * we'll need later when asked {@link #getBaseline}. + */ + if ((baselineChildIndex >= 0) && (baselineChildIndex == i + 1)) { + mBaselineChildTop = mTotalLength; + } + + // if we are trying to use a child index for our baseline, the above + // book keeping only works if there are no children above it with + // weight. fail fast to aid the developer. + 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 == LayoutParams.MATCH_PARENT) { + // The width of the linear layout will scale, and at least one + // child said it wanted to match our width. Set a flag + // indicating that we need to remeasure at least that view when + // we know our width. + matchWidth = true; + matchWidthLocally = true; + } + + final int margin = lp.leftMargin + lp.rightMargin; + final int measuredWidth = child.getMeasuredWidth() + margin; + maxWidth = Math.max(maxWidth, measuredWidth); + childState = ViewUtils.combineMeasuredStates(childState, + ViewCompat.getMeasuredState(child)); + + allFillParent = allFillParent && lp.width == LayoutParams.MATCH_PARENT; + if (lp.weight > 0) { + /* + * Widths of weighted Views are bogus if we end up + * remeasuring, so keep them separate. + */ + 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 LinearLayoutCompat.LayoutParams lp = (LinearLayoutCompat.LayoutParams) + child.getLayoutParams(); + // Account for negative margins + final int totalLength = mTotalLength; + mTotalLength = Math.max(totalLength, totalLength + largestChildHeight + + lp.topMargin + lp.bottomMargin + getNextLocationOffset(child)); + } + } + + // Add in our padding + mTotalLength += getPaddingTop() + getPaddingBottom(); + + int heightSize = mTotalLength; + + // Check against our minimum height + heightSize = Math.max(heightSize, getSuggestedMinimumHeight()); + + // Reconcile our calculated size with the heightMeasureSpec + int heightSizeAndState = ViewCompat.resolveSizeAndState(heightSize, heightMeasureSpec, 0); + heightSize = heightSizeAndState & ViewCompat.MEASURED_SIZE_MASK; + + // Either expand children with weight to take up available space or + // shrink them if they extend beyond our current bounds. If we skipped + // measurement on any children, we need to measure them now. + int delta = heightSize - mTotalLength; + if (skippedMeasure || 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; + } + + LinearLayoutCompat.LayoutParams lp = (LinearLayoutCompat.LayoutParams) child.getLayoutParams(); + + float childExtra = lp.weight; + if (childExtra > 0) { + // Child said it could absorb extra space -- give him his share + int share = (int) (childExtra * delta / weightSum); + weightSum -= childExtra; + delta -= share; + + final int childWidthMeasureSpec = getChildMeasureSpec(widthMeasureSpec, + getPaddingLeft() + getPaddingRight() + + lp.leftMargin + lp.rightMargin, lp.width); + + // TODO: Use a field like lp.isMeasured to figure out if this + // child has been previously measured + if ((lp.height != 0) || (heightMode != MeasureSpec.EXACTLY)) { + // child was measured once already above... + // base new measurement on stored values + int childHeight = child.getMeasuredHeight() + share; + if (childHeight < 0) { + childHeight = 0; + } + + child.measure(childWidthMeasureSpec, + MeasureSpec.makeMeasureSpec(childHeight, MeasureSpec.EXACTLY)); + } else { + // child was skipped in the loop above. + // Measure for this first time here + child.measure(childWidthMeasureSpec, + MeasureSpec.makeMeasureSpec(share > 0 ? share : 0, + MeasureSpec.EXACTLY)); + } + + // Child may now not fit in vertical dimension. + childState = ViewUtils.combineMeasuredStates(childState, + ViewCompat.getMeasuredState(child) & (ViewCompat.MEASURED_STATE_MASK + >> ViewCompat.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 == LayoutParams.MATCH_PARENT; + + alternativeMaxWidth = Math.max(alternativeMaxWidth, + matchWidthLocally ? margin : measuredWidth); + + allFillParent = allFillParent && lp.width == LayoutParams.MATCH_PARENT; + + final int totalLength = mTotalLength; + mTotalLength = Math.max(totalLength, totalLength + child.getMeasuredHeight() + + lp.topMargin + lp.bottomMargin + getNextLocationOffset(child)); + } + + // Add in our padding + mTotalLength += getPaddingTop() + getPaddingBottom(); + // TODO: Should we recompute the heightSpec based on the new total length? + } else { + alternativeMaxWidth = Math.max(alternativeMaxWidth, + weightedMaxWidth); + + + // We have no limit, so make all weighted views as tall as the largest child. + // Children will have already been measured once. + 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 LinearLayoutCompat.LayoutParams lp = + (LinearLayoutCompat.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(); + + // Check against our minimum width + maxWidth = Math.max(maxWidth, getSuggestedMinimumWidth()); + + setMeasuredDimension(ViewCompat.resolveSizeAndState(maxWidth, widthMeasureSpec, childState), + heightSizeAndState); + + if (matchWidth) { + forceUniformWidth(count, heightMeasureSpec); + } + } + + private void forceUniformWidth(int count, int heightMeasureSpec) { + // Pretend that the linear layout has an exact size. + int uniformMeasureSpec = MeasureSpec.makeMeasureSpec(getMeasuredWidth(), + MeasureSpec.EXACTLY); + for (int i = 0; i< count; ++i) { + final View child = getVirtualChildAt(i); + if (child.getVisibility() != GONE) { + LinearLayoutCompat.LayoutParams lp = ((LinearLayoutCompat.LayoutParams)child.getLayoutParams()); + + if (lp.width == LayoutParams.MATCH_PARENT) { + // Temporarily force children to reuse their old measured height + // FIXME: this may not be right for something like wrapping text? + int oldHeight = lp.height; + lp.height = child.getMeasuredHeight(); + + // Remeasue with new dimensions + measureChildWithMargins(child, uniformMeasureSpec, 0, heightMeasureSpec, 0); + lp.height = oldHeight; + } + } + } + } + + /** + * Measures the children when the orientation of this LinearLayout is set + * to {@link #HORIZONTAL}. + * + * @param widthMeasureSpec Horizontal space requirements as imposed by the parent. + * @param heightMeasureSpec Vertical space requirements as imposed by the parent. + * + * @see #getOrientation() + * @see #setOrientation(int) + * @see #onMeasure(int, int) + */ + 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; + boolean skippedMeasure = 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; + + // See how wide everyone is. Also remember max height. + 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 LinearLayoutCompat.LayoutParams lp = (LinearLayoutCompat.LayoutParams) + child.getLayoutParams(); + + totalWeight += lp.weight; + + if (widthMode == MeasureSpec.EXACTLY && lp.width == 0 && lp.weight > 0) { + // Optimization: don't bother measuring children who are going to use + // leftover space. These views will get measured again down below if + // there is any leftover space. + if (isExactly) { + mTotalLength += lp.leftMargin + lp.rightMargin; + } else { + final int totalLength = mTotalLength; + mTotalLength = Math.max(totalLength, totalLength + + lp.leftMargin + lp.rightMargin); + } + + // Baseline alignment requires to measure widgets to obtain the + // baseline offset (in particular for TextViews). The following + // defeats the optimization mentioned above. Allow the child to + // use as much space as it wants because we can shrink things + // later (and re-measure). + if (baselineAligned) { + final int freeSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); + child.measure(freeSpec, freeSpec); + } else { + skippedMeasure = true; + } + } else { + int oldWidth = Integer.MIN_VALUE; + + if (lp.width == 0 && lp.weight > 0) { + // widthMode is either UNSPECIFIED or AT_MOST, and this + // child + // wanted to stretch to fill available space. Translate that to + // WRAP_CONTENT so that it does not end up with a width of 0 + oldWidth = 0; + lp.width = LayoutParams.WRAP_CONTENT; + } + + // Determine how big this child would like to be. If this or + // previous children have given a weight, then we allow it to + // use all available space (and we will shrink things later + // if needed). + 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 == LayoutParams.MATCH_PARENT) { + // The height of the linear layout will scale, and at least one + // child said it wanted to match our height. Set a flag indicating that + // we need to remeasure at least that view when we know our height. + matchHeight = true; + matchHeightLocally = true; + } + + final int margin = lp.topMargin + lp.bottomMargin; + final int childHeight = child.getMeasuredHeight() + margin; + childState = ViewUtils.combineMeasuredStates(childState, + ViewCompat.getMeasuredState(child)); + + if (baselineAligned) { + final int childBaseline = child.getBaseline(); + if (childBaseline != -1) { + // Translates the child's vertical gravity into an index + // in the range 0..VERTICAL_GRAVITY_COUNT + 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 == LayoutParams.MATCH_PARENT; + if (lp.weight > 0) { + /* + * Heights of weighted Views are bogus if we end up + * remeasuring, so keep them separate. + */ + 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; + } + + // Check mMaxAscent[INDEX_TOP] first because it maps to Gravity.TOP, + // the most common case + 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 LinearLayoutCompat.LayoutParams lp = (LinearLayoutCompat.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)); + } + } + } + + // Add in our padding + mTotalLength += getPaddingLeft() + getPaddingRight(); + + int widthSize = mTotalLength; + + // Check against our minimum width + widthSize = Math.max(widthSize, getSuggestedMinimumWidth()); + + // Reconcile our calculated size with the widthMeasureSpec + int widthSizeAndState = ViewCompat.resolveSizeAndState(widthSize, widthMeasureSpec, 0); + widthSize = widthSizeAndState & ViewCompat.MEASURED_SIZE_MASK; + + // Either expand children with weight to take up available space or + // shrink them if they extend beyond our current bounds. If we skipped + // measurement on any children, we need to measure them now. + int delta = widthSize - mTotalLength; + if (skippedMeasure || 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 LinearLayoutCompat.LayoutParams lp = + (LinearLayoutCompat.LayoutParams) child.getLayoutParams(); + + float childExtra = lp.weight; + if (childExtra > 0) { + // Child said it could absorb extra space -- give him his share + int share = (int) (childExtra * delta / weightSum); + weightSum -= childExtra; + delta -= share; + + final int childHeightMeasureSpec = getChildMeasureSpec( + heightMeasureSpec, + getPaddingTop() + getPaddingBottom() + lp.topMargin + lp.bottomMargin, + lp.height); + + // TODO: Use a field like lp.isMeasured to figure out if this + // child has been previously measured + if ((lp.width != 0) || (widthMode != MeasureSpec.EXACTLY)) { + // child was measured once already above ... base new measurement + // on stored values + int childWidth = child.getMeasuredWidth() + share; + if (childWidth < 0) { + childWidth = 0; + } + + child.measure( + MeasureSpec.makeMeasureSpec(childWidth, MeasureSpec.EXACTLY), + childHeightMeasureSpec); + } else { + // child was skipped in the loop above. Measure for this first time here + child.measure(MeasureSpec.makeMeasureSpec( + share > 0 ? share : 0, MeasureSpec.EXACTLY), + childHeightMeasureSpec); + } + + // Child may now not fit in horizontal dimension. + childState = ViewUtils.combineMeasuredStates(childState, + ViewCompat.getMeasuredState(child) & ViewCompat.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 == 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 == LayoutParams.MATCH_PARENT; + + if (baselineAligned) { + final int childBaseline = child.getBaseline(); + if (childBaseline != -1) { + // Translates the child's vertical gravity into an index in the range 0..2 + 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); + } + } + } + + // Add in our padding + mTotalLength += getPaddingLeft() + getPaddingRight(); + // TODO: Should we update widthSize with the new total length? + + // Check mMaxAscent[INDEX_TOP] first because it maps to Gravity.TOP, + // the most common case + 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); + + // We have no limit, so make all weighted views as wide as the largest child. + // Children will have already been measured once. + 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 LinearLayoutCompat.LayoutParams lp = + (LinearLayoutCompat.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(); + + // Check against our minimum height + maxHeight = Math.max(maxHeight, getSuggestedMinimumHeight()); + + setMeasuredDimension(widthSizeAndState | (childState&ViewCompat.MEASURED_STATE_MASK), + ViewCompat.resolveSizeAndState(maxHeight, heightMeasureSpec, + (childState<Returns the number of children to skip after measuring/laying out + * the specified child.

      + * + * @param child the child after which we want to skip children + * @param index the index of the child after which we want to skip children + * @return the number of children to skip, 0 by default + */ + int getChildrenSkipCount(View child, int index) { + return 0; + } + + /** + *

      Returns the size (width or height) that should be occupied by a null + * child.

      + * + * @param childIndex the index of the null child + * @return the width or height of the child depending on the orientation + */ + int measureNullChild(int childIndex) { + return 0; + } + + /** + *

      Measure the child according to the parent's measure specs. This + * method should be overriden by subclasses to force the sizing of + * children. This method is called by {@link #measureVertical(int, int)} and + * {@link #measureHorizontal(int, int)}.

      + * + * @param child the child to measure + * @param childIndex the index of the child in this view + * @param widthMeasureSpec horizontal space requirements as imposed by the parent + * @param totalWidth extra space that has been used up by the parent horizontally + * @param heightMeasureSpec vertical space requirements as imposed by the parent + * @param totalHeight extra space that has been used up by the parent vertically + */ + void measureChildBeforeLayout(View child, int childIndex, + int widthMeasureSpec, int totalWidth, int heightMeasureSpec, + int totalHeight) { + measureChildWithMargins(child, widthMeasureSpec, totalWidth, + heightMeasureSpec, totalHeight); + } + + /** + *

      Return the location offset of the specified child. This can be used + * by subclasses to change the location of a given widget.

      + * + * @param child the child for which to obtain the location offset + * @return the location offset in pixels + */ + int getLocationOffset(View child) { + return 0; + } + + /** + *

      Return the size offset of the next sibling of the specified child. + * This can be used by subclasses to change the location of the widget + * following child.

      + * + * @param child the child whose next sibling will be moved + * @return the location offset of the next child in pixels + */ + int getNextLocationOffset(View child) { + return 0; + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + if (mOrientation == VERTICAL) { + layoutVertical(l, t, r, b); + } else { + layoutHorizontal(l, t, r, b); + } + } + + /** + * Position the children during a layout pass if the orientation of this + * LinearLayout is set to {@link #VERTICAL}. + * + * @see #getOrientation() + * @see #setOrientation(int) + * @see #onLayout(boolean, int, int, int, int) + * @param left + * @param top + * @param right + * @param bottom + */ + void layoutVertical(int left, int top, int right, int bottom) { + final int paddingLeft = getPaddingLeft(); + + int childTop; + int childLeft; + + // Where right end of child should go + final int width = right - left; + int childRight = width - getPaddingRight(); + + // Space available for child + int childSpace = width - paddingLeft - getPaddingRight(); + + final int count = getVirtualChildCount(); + + final int majorGravity = mGravity & Gravity.VERTICAL_GRAVITY_MASK; + final int minorGravity = mGravity & GravityCompat.RELATIVE_HORIZONTAL_GRAVITY_MASK; + + switch (majorGravity) { + case Gravity.BOTTOM: + // mTotalLength contains the padding already + childTop = getPaddingTop() + bottom - top - mTotalLength; + break; + + // mTotalLength contains the padding already + case Gravity.CENTER_VERTICAL: + childTop = getPaddingTop() + (bottom - top - 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 LinearLayoutCompat.LayoutParams lp = + (LinearLayoutCompat.LayoutParams) child.getLayoutParams(); + + int gravity = lp.gravity; + if (gravity < 0) { + gravity = minorGravity; + } + final int layoutDirection = ViewCompat.getLayoutDirection(this); + final int absoluteGravity = GravityCompat.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); + } + } + } + + /** + * Position the children during a layout pass if the orientation of this + * LinearLayout is set to {@link #HORIZONTAL}. + * + * @see #getOrientation() + * @see #setOrientation(int) + * @see #onLayout(boolean, int, int, int, int) + * @param left + * @param top + * @param right + * @param bottom + */ + void layoutHorizontal(int left, int top, int right, int bottom) { + final boolean isLayoutRtl = ViewUtils.isLayoutRtl(this); + final int paddingTop = getPaddingTop(); + + int childTop; + int childLeft; + + // Where bottom of child should go + final int height = bottom - top; + int childBottom = height - getPaddingBottom(); + + // Space available for child + int childSpace = height - paddingTop - getPaddingBottom(); + + final int count = getVirtualChildCount(); + + final int majorGravity = mGravity & GravityCompat.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 = ViewCompat.getLayoutDirection(this); + switch (GravityCompat.getAbsoluteGravity(majorGravity, layoutDirection)) { + case Gravity.RIGHT: + // mTotalLength contains the padding already + childLeft = getPaddingLeft() + right - left - mTotalLength; + break; + + case Gravity.CENTER_HORIZONTAL: + // mTotalLength contains the padding already + childLeft = getPaddingLeft() + (right - left - mTotalLength) / 2; + break; + + case Gravity.LEFT: + default: + childLeft = getPaddingLeft(); + break; + } + + int start = 0; + int dir = 1; + //In case of RTL, start drawing from the last child. + 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 LinearLayoutCompat.LayoutParams lp = + (LinearLayoutCompat.LayoutParams) child.getLayoutParams(); + + if (baselineAligned && lp.height != 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: + // Removed support for baseline alignment when layout_gravity or + // gravity == center_vertical. See bug #1038483. + // Keep the code around if we need to re-enable this feature + // if (childBaseline != -1) { + // // Align baselines vertically only if the child is smaller than us + // if (childSpace - childHeight > 0) { + // childTop = paddingTop + (childSpace / 2) - childBaseline; + // } else { + // childTop = paddingTop + (childSpace - childHeight) / 2; + // } + // } else { + 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); + } + } + } + + private void setChildFrame(View child, int left, int top, int width, int height) { + child.layout(left, top, left + width, top + height); + } + + /** + * Should the layout be a column or a row. + * @param orientation Pass {@link #HORIZONTAL} or {@link #VERTICAL}. Default + * value is {@link #HORIZONTAL}. + */ + public void setOrientation(@OrientationMode int orientation) { + if (mOrientation != orientation) { + mOrientation = orientation; + requestLayout(); + } + } + + /** + * Returns the current orientation. + * + * @return either {@link #HORIZONTAL} or {@link #VERTICAL} + */ + @OrientationMode + public int getOrientation() { + return mOrientation; + } + + /** + * Describes how the child views are positioned. Defaults to GRAVITY_TOP. If + * this layout has a VERTICAL orientation, this controls where all the child + * views are placed if there is extra vertical space. If this layout has a + * HORIZONTAL orientation, this controls the alignment of the children. + * + * @param gravity See {@link android.view.Gravity} + */ + public void setGravity(int gravity) { + if (mGravity != gravity) { + if ((gravity & GravityCompat.RELATIVE_HORIZONTAL_GRAVITY_MASK) == 0) { + gravity |= GravityCompat.START; + } + + if ((gravity & Gravity.VERTICAL_GRAVITY_MASK) == 0) { + gravity |= Gravity.TOP; + } + + mGravity = gravity; + requestLayout(); + } + } + + public void setHorizontalGravity(int horizontalGravity) { + final int gravity = horizontalGravity & GravityCompat.RELATIVE_HORIZONTAL_GRAVITY_MASK; + if ((mGravity & GravityCompat.RELATIVE_HORIZONTAL_GRAVITY_MASK) != gravity) { + mGravity = (mGravity & ~GravityCompat.RELATIVE_HORIZONTAL_GRAVITY_MASK) | gravity; + requestLayout(); + } + } + + 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 LayoutParams generateLayoutParams(AttributeSet attrs) { + return new LinearLayoutCompat.LayoutParams(getContext(), attrs); + } + + /** + * Returns a set of layout parameters with a width of + * {@link android.view.ViewGroup.LayoutParams#MATCH_PARENT} + * and a height of {@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT} + * when the layout's orientation is {@link #VERTICAL}. When the orientation is + * {@link #HORIZONTAL}, the width is set to {@link LayoutParams#WRAP_CONTENT} + * and the height to {@link LayoutParams#WRAP_CONTENT}. + */ + @Override + protected LayoutParams generateDefaultLayoutParams() { + if (mOrientation == HORIZONTAL) { + return new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); + } else if (mOrientation == VERTICAL) { + return new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); + } + return null; + } + + @Override + protected LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) { + return new LayoutParams(p); + } + + + // Override to allow type-checking of LayoutParams. + @Override + protected boolean checkLayoutParams(ViewGroup.LayoutParams p) { + return p instanceof LinearLayoutCompat.LayoutParams; + } + + public void onInitializeAccessibilityEvent(AccessibilityEvent event) { + if (Build.VERSION.SDK_INT >= 14) { + super.onInitializeAccessibilityEvent(event); + event.setClassName(LinearLayoutCompat.class.getName()); + } + } + + public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { + if (Build.VERSION.SDK_INT >= 14) { + super.onInitializeAccessibilityNodeInfo(info); + info.setClassName(LinearLayoutCompat.class.getName()); + } + } + + /** + * Per-child layout information associated with ViewLinearLayout. + */ + public static class LayoutParams extends ViewGroup.MarginLayoutParams { + /** + * Indicates how much of the extra space in the LinearLayout will be + * allocated to the view associated with these LayoutParams. Specify + * 0 if the view should not be stretched. Otherwise the extra pixels + * will be pro-rated among all views whose weight is greater than 0. + */ + public float weight; + + /** + * Gravity for the view associated with these LayoutParams. + * + * @see android.view.Gravity + */ + public int gravity = -1; + + /** + * {@inheritDoc} + */ + public LayoutParams(Context c, AttributeSet attrs) { + super(c, attrs); + TypedArray a = + c.obtainStyledAttributes(attrs, R.styleable.LinearLayoutCompat_Layout); + + weight = a.getFloat(R.styleable.LinearLayoutCompat_Layout_android_layout_weight, 0); + gravity = a.getInt(R.styleable.LinearLayoutCompat_Layout_android_layout_gravity, -1); + + a.recycle(); + } + + /** + * {@inheritDoc} + */ + public LayoutParams(int width, int height) { + super(width, height); + weight = 0; + } + + /** + * Creates a new set of layout parameters with the specified width, height + * and weight. + * + * @param width the width, either {@link #MATCH_PARENT}, + * {@link #WRAP_CONTENT} or a fixed size in pixels + * @param height the height, either {@link #MATCH_PARENT}, + * {@link #WRAP_CONTENT} or a fixed size in pixels + * @param weight the weight + */ + public LayoutParams(int width, int height, float weight) { + super(width, height); + this.weight = weight; + } + + /** + * {@inheritDoc} + */ + public LayoutParams(ViewGroup.LayoutParams p) { + super(p); + } + + /** + * {@inheritDoc} + */ + public LayoutParams(ViewGroup.MarginLayoutParams source) { + super(source); + } + + /** + * Copy constructor. Clones the width, height, margin values, weight, + * and gravity of the source. + * + * @param source The layout params to copy from. + */ + public LayoutParams(LayoutParams source) { + super(source); + + this.weight = source.weight; + this.gravity = source.gravity; + } + } +} diff --git a/eclipse-compile/appcompat/src/android/support/v7/widget/ListPopupWindow.java b/eclipse-compile/appcompat/src/android/support/v7/widget/ListPopupWindow.java new file mode 100644 index 0000000000..0d2bcb8720 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/widget/ListPopupWindow.java @@ -0,0 +1,1780 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.widget; + +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; +import android.os.Handler; +import android.os.SystemClock; +import android.support.v4.text.TextUtilsCompat; +import android.support.v4.view.MotionEventCompat; +import android.support.v4.view.ViewPropertyAnimatorCompat; +import android.support.v4.widget.ListViewAutoScrollHelper; +import android.support.v4.widget.PopupWindowCompat; +import android.support.v7.appcompat.R; +import android.support.v7.internal.widget.AppCompatPopupWindow; +import android.support.v7.internal.widget.ListViewCompat; +import android.util.AttributeSet; +import android.util.Log; +import android.view.Gravity; +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.ViewConfiguration; +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; + +import java.lang.reflect.Method; +import java.util.Locale; + +/** + * Static library support version of the framework's {@link android.widget.ListPopupWindow}. + * Used to write apps that run on platforms prior to Android L. When running + * on Android L or above, this implementation is still used; it does not try + * to switch to the framework's implementation. See the framework SDK + * documentation for a class overview. + * + * @see android.widget.ListPopupWindow + */ +public class ListPopupWindow { + private static final String TAG = "ListPopupWindow"; + private static final boolean DEBUG = false; + + /** + * 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 static Method sClipToWindowEnabledMethod; + + static { + try { + sClipToWindowEnabledMethod = PopupWindow.class.getDeclaredMethod( + "setClipToScreenEnabled", boolean.class); + } catch (NoSuchMethodException e) { + Log.i(TAG, "Could not find method setClipToScreenEnabled() on PopupWindow. Oh well."); + } + } + + 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 mDropDownGravity = Gravity.NO_GRAVITY; + + private boolean mDropDownAlwaysVisible = false; + private boolean mForceIgnoreOutsideTouch = false; + 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 Runnable mShowDropDownRunnable; + + private Handler mHandler = new Handler(); + + private Rect mTempRect = new Rect(); + + private boolean mModal; + + private int mLayoutDirection; + + /** + * The provided prompt view should appear above list content. + * + * @see #setPromptPosition(int) + * @see #getPromptPosition() + * @see #setPromptView(View) + */ + public static final int POSITION_PROMPT_ABOVE = 0; + + /** + * The provided prompt view should appear below list content. + * + * @see #setPromptPosition(int) + * @see #getPromptPosition() + * @see #setPromptView(View) + */ + public static final int POSITION_PROMPT_BELOW = 1; + + /** + * Alias for {@link ViewGroup.LayoutParams#MATCH_PARENT}. + * If used to specify a popup width, the popup will match the width of the anchor view. + * If used to specify a popup height, the popup will fill available space. + */ + public static final int MATCH_PARENT = ViewGroup.LayoutParams.MATCH_PARENT; + + /** + * Alias for {@link ViewGroup.LayoutParams#WRAP_CONTENT}. + * If used to specify a popup width, the popup will use the width of its content. + */ + public static final int WRAP_CONTENT = ViewGroup.LayoutParams.WRAP_CONTENT; + + /** + * Mode for {@link #setInputMethodMode(int)}: the requirements for the + * input method should be based on the focusability of the popup. That is + * if it is focusable than it needs to work with the input method, else + * it doesn't. + */ + public static final int INPUT_METHOD_FROM_FOCUSABLE = PopupWindow.INPUT_METHOD_FROM_FOCUSABLE; + + /** + * Mode for {@link #setInputMethodMode(int)}: this popup always needs to + * work with an input method, regardless of whether it is focusable. This + * means that it will always be displayed so that the user can also operate + * the input method while it is shown. + */ + public static final int INPUT_METHOD_NEEDED = PopupWindow.INPUT_METHOD_NEEDED; + + /** + * Mode for {@link #setInputMethodMode(int)}: this popup never needs to + * work with an input method, regardless of whether it is focusable. This + * means that it will always be displayed to use as much space on the + * screen as needed, regardless of whether this covers the input method. + */ + public static final int INPUT_METHOD_NOT_NEEDED = PopupWindow.INPUT_METHOD_NOT_NEEDED; + + /** + * Create a new, empty popup window capable of displaying items from a ListAdapter. + * Backgrounds should be set using {@link #setBackgroundDrawable(Drawable)}. + * + * @param context Context used for contained views. + */ + public ListPopupWindow(Context context) { + this(context, null, R.attr.listPopupWindowStyle); + } + + /** + * Create a new, empty popup window capable of displaying items from a ListAdapter. + * Backgrounds should be set using {@link #setBackgroundDrawable(Drawable)}. + * + * @param context Context used for contained views. + * @param attrs Attributes from inflating parent views used to style the popup. + */ + public ListPopupWindow(Context context, AttributeSet attrs) { + this(context, attrs, R.attr.listPopupWindowStyle); + } + + /** + * Create a new, empty popup window capable of displaying items from a ListAdapter. + * Backgrounds should be set using {@link #setBackgroundDrawable(Drawable)}. + * + * @param context Context used for contained views. + * @param attrs Attributes from inflating parent views used to style the popup. + * @param defStyleAttr Default style attribute to use for popup content. + */ + public ListPopupWindow(Context context, AttributeSet attrs, int defStyleAttr) { + this(context, attrs, defStyleAttr, 0); + } + + /** + * Create a new, empty popup window capable of displaying items from a ListAdapter. + * Backgrounds should be set using {@link #setBackgroundDrawable(Drawable)}. + * + * @param context Context used for contained views. + * @param attrs Attributes from inflating parent views used to style the popup. + * @param defStyleAttr Style attribute to read for default styling of popup content. + * @param defStyleRes Style resource ID to use for default styling of popup content. + */ + public ListPopupWindow(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + mContext = context; + + final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ListPopupWindow, + defStyleAttr, defStyleRes); + mDropDownHorizontalOffset = a.getDimensionPixelOffset( + R.styleable.ListPopupWindow_android_dropDownHorizontalOffset, 0); + mDropDownVerticalOffset = a.getDimensionPixelOffset( + R.styleable.ListPopupWindow_android_dropDownVerticalOffset, 0); + if (mDropDownVerticalOffset != 0) { + mDropDownVerticalOffsetSet = true; + } + a.recycle(); + + mPopup = new AppCompatPopupWindow(context, attrs, defStyleAttr); + mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED); + + // Set the default layout direction to match the default locale one + final Locale locale = mContext.getResources().getConfiguration().locale; + mLayoutDirection = TextUtilsCompat.getLayoutDirectionFromLocale(locale); + } + + /** + * Sets the adapter that provides the data and the views to represent the data + * in this popup window. + * + * @param adapter The adapter to use to create this window's content. + */ + 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); + } + } + + /** + * Set where the optional prompt view should appear. The default is + * {@link #POSITION_PROMPT_ABOVE}. + * + * @param position A position constant declaring where the prompt should be displayed. + * + * @see #POSITION_PROMPT_ABOVE + * @see #POSITION_PROMPT_BELOW + */ + public void setPromptPosition(int position) { + mPromptPosition = position; + } + + /** + * @return Where the optional prompt view should appear. + * + * @see #POSITION_PROMPT_ABOVE + * @see #POSITION_PROMPT_BELOW + */ + public int getPromptPosition() { + return mPromptPosition; + } + + /** + * Set whether this window should be modal when shown. + * + *

      If a popup window is modal, it will receive all touch and key input. + * If the user touches outside the popup window's content area the popup window + * will be dismissed. + * + * @param modal {@code true} if the popup window should be modal, {@code false} otherwise. + */ + public void setModal(boolean modal) { + mModal = modal; + mPopup.setFocusable(modal); + } + + /** + * Returns whether the popup window will be modal when shown. + * + * @return {@code true} if the popup window will be modal, {@code false} otherwise. + */ + public boolean isModal() { + return mModal; + } + + /** + * Forces outside touches to be ignored. Normally if {@link #isDropDownAlwaysVisible()} is + * false, we allow outside touch to dismiss the dropdown. If this is set to true, then we + * ignore outside touch even when the drop down is not set to always visible. + * + * @hide Used only by AutoCompleteTextView to handle some internal special cases. + */ + public void setForceIgnoreOutsideTouch(boolean forceIgnoreOutsideTouch) { + mForceIgnoreOutsideTouch = forceIgnoreOutsideTouch; + } + + /** + * Sets whether the drop-down should remain visible under certain conditions. + * + * The drop-down will occupy the entire screen below {@link #getAnchorView} regardless + * of the size or content of the list. {@link #getBackground()} will fill any space + * that is not used by the list. + * + * @param dropDownAlwaysVisible Whether to keep the drop-down visible. + * + * @hide Only used by AutoCompleteTextView under special conditions. + */ + public void setDropDownAlwaysVisible(boolean dropDownAlwaysVisible) { + mDropDownAlwaysVisible = dropDownAlwaysVisible; + } + + /** + * @return Whether the drop-down is visible under special conditions. + * + * @hide Only used by AutoCompleteTextView under special conditions. + */ + public boolean isDropDownAlwaysVisible() { + return mDropDownAlwaysVisible; + } + + /** + * Sets the operating mode for the soft input area. + * + * @param mode The desired mode, see + * {@link android.view.WindowManager.LayoutParams#softInputMode} + * for the full list + * + * @see android.view.WindowManager.LayoutParams#softInputMode + * @see #getSoftInputMode() + */ + public void setSoftInputMode(int mode) { + mPopup.setSoftInputMode(mode); + } + + /** + * Returns the current value in {@link #setSoftInputMode(int)}. + * + * @see #setSoftInputMode(int) + * @see android.view.WindowManager.LayoutParams#softInputMode + */ + public int getSoftInputMode() { + return mPopup.getSoftInputMode(); + } + + /** + * Sets a drawable to use as the list item selector. + * + * @param selector List selector drawable to use in the popup. + */ + public void setListSelector(Drawable selector) { + mDropDownListHighlight = selector; + } + + /** + * @return The background drawable for the popup window. + */ + public Drawable getBackground() { + return mPopup.getBackground(); + } + + /** + * Sets a drawable to be the background for the popup window. + * + * @param d A drawable to set as the background. + */ + public void setBackgroundDrawable(Drawable d) { + mPopup.setBackgroundDrawable(d); + } + + /** + * Set an animation style to use when the popup window is shown or dismissed. + * + * @param animationStyle Animation style to use. + */ + public void setAnimationStyle(int animationStyle) { + mPopup.setAnimationStyle(animationStyle); + } + + /** + * Returns the animation style that will be used when the popup window is shown or dismissed. + * + * @return Animation style that will be used. + */ + public int getAnimationStyle() { + return mPopup.getAnimationStyle(); + } + + /** + * Returns the view that will be used to anchor this popup. + * + * @return The popup's anchor view + */ + public View getAnchorView() { + return mDropDownAnchorView; + } + + /** + * Sets the popup's anchor view. This popup will always be positioned relative to the anchor + * view when shown. + * + * @param anchor The view to use as an anchor. + */ + public void setAnchorView(View anchor) { + mDropDownAnchorView = anchor; + } + + /** + * @return The horizontal offset of the popup from its anchor in pixels. + */ + public int getHorizontalOffset() { + return mDropDownHorizontalOffset; + } + + /** + * Set the horizontal offset of this popup from its anchor view in pixels. + * + * @param offset The horizontal offset of the popup from its anchor. + */ + public void setHorizontalOffset(int offset) { + mDropDownHorizontalOffset = offset; + } + + /** + * @return The vertical offset of the popup from its anchor in pixels. + */ + public int getVerticalOffset() { + if (!mDropDownVerticalOffsetSet) { + return 0; + } + return mDropDownVerticalOffset; + } + + /** + * Set the vertical offset of this popup from its anchor view in pixels. + * + * @param offset The vertical offset of the popup from its anchor. + */ + public void setVerticalOffset(int offset) { + mDropDownVerticalOffset = offset; + mDropDownVerticalOffsetSet = true; + } + + /** + * Set the gravity of the dropdown list. This is commonly used to + * set gravity to START or END for alignment with the anchor. + * + * @param gravity Gravity value to use + */ + public void setDropDownGravity(int gravity) { + mDropDownGravity = gravity; + } + + /** + * @return The width of the popup window in pixels. + */ + public int getWidth() { + return mDropDownWidth; + } + + /** + * Sets the width of the popup window in pixels. Can also be {@link #MATCH_PARENT} + * or {@link #WRAP_CONTENT}. + * + * @param width Width of the popup window. + */ + public void setWidth(int width) { + mDropDownWidth = width; + } + + /** + * Sets the width of the popup window by the size of its content. The final width may be + * larger to accommodate styled window dressing. + * + * @param width Desired width of content in pixels. + */ + public void setContentWidth(int width) { + Drawable popupBackground = mPopup.getBackground(); + if (popupBackground != null) { + popupBackground.getPadding(mTempRect); + mDropDownWidth = mTempRect.left + mTempRect.right + width; + } else { + setWidth(width); + } + } + + /** + * @return The height of the popup window in pixels. + */ + public int getHeight() { + return mDropDownHeight; + } + + /** + * Sets the height of the popup window in pixels. Can also be {@link #MATCH_PARENT}. + * + * @param height Height of the popup window. + */ + public void setHeight(int height) { + mDropDownHeight = height; + } + + /** + * Sets a listener to receive events when a list item is clicked. + * + * @param clickListener Listener to register + * + * @see ListView#setOnItemClickListener(android.widget.AdapterView.OnItemClickListener) + */ + public void setOnItemClickListener(AdapterView.OnItemClickListener clickListener) { + mItemClickListener = clickListener; + } + + /** + * Sets a listener to receive events when a list item is selected. + * + * @param selectedListener Listener to register. + * + * @see ListView#setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener) + */ + public void setOnItemSelectedListener(AdapterView.OnItemSelectedListener selectedListener) { + mItemSelectedListener = selectedListener; + } + + /** + * Set a view to act as a user prompt for this popup window. Where the prompt view will appear + * is controlled by {@link #setPromptPosition(int)}. + * + * @param prompt View to use as an informational prompt. + */ + public void setPromptView(View prompt) { + boolean showing = isShowing(); + if (showing) { + removePromptView(); + } + mPromptView = prompt; + if (showing) { + show(); + } + } + + /** + * Post a {@link #show()} call to the UI thread. + */ + public void postShow() { + mHandler.post(mShowDropDownRunnable); + } + + /** + * Show the popup list. If the list is already showing, this method + * will recalculate the popup's size and position. + */ + public void show() { + int height = buildDropDown(); + + int widthSpec = 0; + int heightSpec = 0; + + boolean noInputMethod = isInputMethodNotNeeded(); + + 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 = getAnchorView().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(!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); + setPopupClipToScreenEnabled(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(!mForceIgnoreOutsideTouch && !mDropDownAlwaysVisible); + mPopup.setTouchInterceptor(mTouchInterceptor); + PopupWindowCompat.showAsDropDown(mPopup, getAnchorView(), mDropDownHorizontalOffset, + mDropDownVerticalOffset, mDropDownGravity); + mDropDownList.setSelection(ListView.INVALID_POSITION); + + if (!mModal || mDropDownList.isInTouchMode()) { + clearListSelection(); + } + if (!mModal) { + mHandler.post(mHideSelector); + } + } + } + + /** + * Dismiss the popup window. + */ + public void dismiss() { + mPopup.dismiss(); + removePromptView(); + mPopup.setContentView(null); + mDropDownList = null; + mHandler.removeCallbacks(mResizePopupRunnable); + } + + /** + * Set a listener to receive a callback when the popup is dismissed. + * + * @param listener Listener that will be notified when the popup is dismissed. + */ + public void setOnDismissListener(PopupWindow.OnDismissListener listener) { + mPopup.setOnDismissListener(listener); + } + + private void removePromptView() { + if (mPromptView != null) { + final ViewParent parent = mPromptView.getParent(); + if (parent instanceof ViewGroup) { + final ViewGroup group = (ViewGroup) parent; + group.removeView(mPromptView); + } + } + } + + /** + * Control how the popup operates with an input method: one of + * {@link #INPUT_METHOD_FROM_FOCUSABLE}, {@link #INPUT_METHOD_NEEDED}, + * or {@link #INPUT_METHOD_NOT_NEEDED}. + * + *

      If the popup is showing, calling this method will take effect only + * the next time the popup is shown or through a manual call to the {@link #show()} + * method.

      + * + * @see #getInputMethodMode() + * @see #show() + */ + public void setInputMethodMode(int mode) { + mPopup.setInputMethodMode(mode); + } + + /** + * Return the current value in {@link #setInputMethodMode(int)}. + * + * @see #setInputMethodMode(int) + */ + public int getInputMethodMode() { + return mPopup.getInputMethodMode(); + } + + /** + * 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 (Build.VERSION.SDK_INT >= 11) { + if (list.getChoiceMode() != ListView.CHOICE_MODE_NONE) { + list.setItemChecked(position, true); + } + } + } + } + + /** + * Clear any current list selection. + * Only valid when {@link #isShowing()} == {@code true}. + */ + public void clearListSelection() { + final DropDownListView list = mDropDownList; + if (list != null) { + // WARNING: Please read the comment where mListSelectionHidden is declared + list.mListSelectionHidden = true; + //list.hideSelector(); + list.requestLayout(); + } + } + + /** + * @return {@code true} if the popup is currently showing, {@code false} otherwise. + */ + public boolean isShowing() { + return mPopup.isShowing(); + } + + /** + * @return {@code true} if this popup is configured to assume the user does not need + * to interact with the IME while it is showing, {@code false} otherwise. + */ + public boolean isInputMethodNotNeeded() { + return mPopup.getInputMethodMode() == INPUT_METHOD_NOT_NEEDED; + } + + /** + * Perform an item click operation on the specified list adapter position. + * + * @param position Adapter position for performing the click + * @return true if the click action could be performed, false if not. + * (e.g. if the popup was not showing, this method would 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; + } + + /** + * @return The currently selected item or null if the popup is not showing. + */ + public Object getSelectedItem() { + if (!isShowing()) { + return null; + } + return mDropDownList.getSelectedItem(); + } + + /** + * @return The position of the currently selected item or {@link ListView#INVALID_POSITION} + * if {@link #isShowing()} == {@code false}. + * + * @see ListView#getSelectedItemPosition() + */ + public int getSelectedItemPosition() { + if (!isShowing()) { + return ListView.INVALID_POSITION; + } + return mDropDownList.getSelectedItemPosition(); + } + + /** + * @return The ID of the currently selected item or {@link ListView#INVALID_ROW_ID} + * if {@link #isShowing()} == {@code false}. + * + * @see ListView#getSelectedItemId() + */ + public long getSelectedItemId() { + if (!isShowing()) { + return ListView.INVALID_ROW_ID; + } + return mDropDownList.getSelectedItemId(); + } + + /** + * @return The View for the currently selected item or null if + * {@link #isShowing()} == {@code false}. + * + * @see ListView#getSelectedView() + */ + public View getSelectedView() { + if (!isShowing()) { + return null; + } + return mDropDownList.getSelectedView(); + } + + /** + * @return The {@link ListView} displayed within the popup window. + * Only valid when {@link #isShowing()} == {@code true}. + */ + public ListView getListView() { + return mDropDownList; + } + + /** + * The maximum number of list items that can be visible and still have + * the list expand when touched. + * + * @param max Max number of items that can be visible and still allow the list to expand. + */ + void setListItemExpandMax(int max) { + mListItemExpandMaximum = max; + } + + /** + * Filter key down events. By forwarding key down events to this function, + * views using non-modal ListPopupWindow can have it handle key selection of items. + * + * @param keyCode keyCode param passed to the host view's onKeyDown + * @param event event param passed to the host view's onKeyDown + * @return true if the event was handled, false if it was ignored. + * + * @see #setModal(boolean) + */ + public boolean onKeyDown(int keyCode, KeyEvent event) { + // when the drop down is shown, we drive it directly + if (isShowing()) { + // the key events are forwarded to the list in the drop down view + // note that ListView handles space but we don't want that to happen + // also if selection is not currently in the drop down, then don't + // let center or enter presses go there since that would cause it + // to select one of its items + if (keyCode != KeyEvent.KEYCODE_SPACE + && (mDropDownList.getSelectedItemPosition() >= 0 + || !isConfirmKey(keyCode))) { + int curIndex = mDropDownList.getSelectedItemPosition(); + boolean consumed; + + final boolean below = !mPopup.isAboveAnchor(); + + final ListAdapter adapter = mAdapter; + + boolean allEnabled; + int firstItem = Integer.MAX_VALUE; + int lastItem = Integer.MIN_VALUE; + + if (adapter != null) { + allEnabled = adapter.areAllItemsEnabled(); + 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)) { + // When the selection is at the top, we block the key + // event to prevent focus from moving. + clearListSelection(); + mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED); + show(); + return true; + } else { + // WARNING: Please read the comment where mListSelectionHidden + // is declared + mDropDownList.mListSelectionHidden = false; + } + + consumed = mDropDownList.onKeyDown(keyCode, event); + if (DEBUG) Log.v(TAG, "Key down: code=" + keyCode + " list consumed=" + consumed); + + if (consumed) { + // If it handled the key event, then the user is + // navigating in the list, so we should put it in front. + mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NOT_NEEDED); + // Here's a little trick we need to do to make sure that + // the list view is actually showing its focus indicator, + // by ensuring it has focus and getting its window out + // of touch mode. + mDropDownList.requestFocusFromTouch(); + show(); + + switch (keyCode) { + // avoid passing the focus from the text view to the + // next component + 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) { + // when the selection is at the bottom, we block the + // event to avoid going to the next focusable widget + if (curIndex == lastItem) { + return true; + } + } else if (!below && keyCode == KeyEvent.KEYCODE_DPAD_UP && + curIndex == firstItem) { + return true; + } + } + } + } + + return false; + } + + /** + * Filter key down events. By forwarding key up events to this function, + * views using non-modal ListPopupWindow can have it handle key selection of items. + * + * @param keyCode keyCode param passed to the host view's onKeyUp + * @param event event param passed to the host view's onKeyUp + * @return true if the event was handled, false if it was ignored. + * + * @see #setModal(boolean) + */ + public boolean onKeyUp(int keyCode, KeyEvent event) { + if (isShowing() && mDropDownList.getSelectedItemPosition() >= 0) { + boolean consumed = mDropDownList.onKeyUp(keyCode, event); + if (consumed && isConfirmKey(keyCode)) { + // if the list accepts the key events and the key event was a click, the text view + // gets the selected item from the drop down as its content + dismiss(); + } + return consumed; + } + return false; + } + + /** + * Filter pre-IME key events. By forwarding {@link View#onKeyPreIme(int, KeyEvent)} + * events to this function, views using ListPopupWindow can have it dismiss the popup + * when the back key is pressed. + * + * @param keyCode keyCode param passed to the host view's onKeyPreIme + * @param event event param passed to the host view's onKeyPreIme + * @return true if the event was handled, false if it was ignored. + * + * @see #setModal(boolean) + */ + public boolean onKeyPreIme(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK && isShowing()) { + // special case for the back key, we do not even try to send it + // to the drop down list but instead, consume it immediately + 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; + } + + /** + * Returns an {@link OnTouchListener} that can be added to the source view + * to implement drag-to-open behavior. Generally, the source view should be + * the same view that was passed to {@link #setAnchorView}. + *

      + * When the listener is set on a view, touching that view and dragging + * outside of its bounds will open the popup window. Lifting will select the + * currently touched list item. + *

      + * Example usage: + *

      +     * ListPopupWindow myPopup = new ListPopupWindow(context);
      +     * myPopup.setAnchor(myAnchor);
      +     * OnTouchListener dragListener = myPopup.createDragToOpenListener(myAnchor);
      +     * myAnchor.setOnTouchListener(dragListener);
      +     * 
      + * + * @param src the view on which the resulting listener will be set + * @return a touch listener that controls drag-to-open behavior + */ + public OnTouchListener createDragToOpenListener(View src) { + return new ForwardingListener(src) { + @Override + public ListPopupWindow getPopup() { + return ListPopupWindow.this; + } + }; + } + + /** + *

      Builds the popup window's content and returns the height the popup + * should have. Returns -1 when the content already exists.

      + * + * @return the content's height or -1 if content already exists + */ + private int buildDropDown() { + ViewGroup dropDownView; + int otherHeights = 0; + + if (mDropDownList == null) { + Context context = mContext; + + /** + * This Runnable exists for the sole purpose of checking if the view layout has got + * completed and if so call showDropDown to display the drop down. This is used to show + * the drop down as soon as possible after user opens up the search dialog, without + * waiting for the normal UI pipeline to do it's job which is slower than this method. + */ + mShowDropDownRunnable = new Runnable() { + public void run() { + // View layout should be all done before displaying the drop down. + 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() { + 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 a 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: + Log.e(TAG, "Invalid hint position " + mPromptPosition); + 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; + } + } else { + mTempRect.setEmpty(); + } + + // Max height available on the screen for a popup. + boolean ignoreBottomDecorations = + mPopup.getInputMethodMode() == PopupWindow.INPUT_METHOD_NOT_NEEDED; + final int maxHeight = mPopup.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 = mDropDownList.measureHeightOfChildrenCompat(childWidthSpec, + 0, DropDownListView.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; + } + + /** + * Abstract class that forwards touch events to a {@link ListPopupWindow}. + * + * @hide + */ + public static abstract class ForwardingListener implements View.OnTouchListener { + /** Scaled touch slop, used for detecting movement outside bounds. */ + private final float mScaledTouchSlop; + + /** Timeout before disallowing intercept on the source's parent. */ + private final int mTapTimeout; + /** Timeout before accepting a long-press to start forwarding. */ + private final int mLongPressTimeout; + + /** Source view from which events are forwarded. */ + private final View mSrc; + + /** Runnable used to prevent conflicts with scrolling parents. */ + private Runnable mDisallowIntercept; + /** Runnable used to trigger forwarding on long-press. */ + private Runnable mTriggerLongPress; + + /** Whether this listener is currently forwarding touch events. */ + private boolean mForwarding; + /** + * Whether forwarding was initiated by a long-press. If so, we won't + * force the window to dismiss when the touch stream ends. + */ + private boolean mWasLongPress; + + /** The id of the first pointer down in the current event stream. */ + private int mActivePointerId; + + /** + * Temporary Matrix instance + */ + private final int[] mTmpLocation = new int[2]; + + public ForwardingListener(View src) { + mSrc = src; + mScaledTouchSlop = ViewConfiguration.get(src.getContext()).getScaledTouchSlop(); + mTapTimeout = ViewConfiguration.getTapTimeout(); + // Use a medium-press timeout. Halfway between tap and long-press. + mLongPressTimeout = (mTapTimeout + ViewConfiguration.getLongPressTimeout()) / 2; + } + + /** + * Returns the popup to which this listener is forwarding events. + *

      + * Override this to return the correct popup. If the popup is displayed + * asynchronously, you may also need to override + * {@link #onForwardingStopped} to prevent premature cancelation of + * forwarding. + * + * @return the popup to which this listener is forwarding events + */ + public abstract ListPopupWindow getPopup(); + + @Override + public boolean onTouch(View v, MotionEvent event) { + final boolean wasForwarding = mForwarding; + final boolean forwarding; + if (wasForwarding) { + if (mWasLongPress) { + // If we started forwarding as a result of a long-press, + // just silently stop forwarding events so that the window + // stays open. + forwarding = onTouchForwarded(event); + } else { + forwarding = onTouchForwarded(event) || !onForwardingStopped(); + } + } else { + forwarding = onTouchObserved(event) && onForwardingStarted(); + + if (forwarding) { + // Make sure we cancel any ongoing source event stream. + final long now = SystemClock.uptimeMillis(); + final MotionEvent e = MotionEvent.obtain(now, now, MotionEvent.ACTION_CANCEL, + 0.0f, 0.0f, 0); + mSrc.onTouchEvent(e); + e.recycle(); + } + } + + mForwarding = forwarding; + return forwarding || wasForwarding; + } + + /** + * Called when forwarding would like to start.

      By default, this will show the popup + * returned by {@link #getPopup()}. It may be overridden to perform another action, like + * clicking the source view or preparing the popup before showing it. + * + * @return true to start forwarding, false otherwise + */ + protected boolean onForwardingStarted() { + final ListPopupWindow popup = getPopup(); + if (popup != null && !popup.isShowing()) { + popup.show(); + } + return true; + } + + /** + * Called when forwarding would like to stop.

      By default, this will dismiss the popup + * returned by {@link #getPopup()}. It may be overridden to perform some other action. + * + * @return true to stop forwarding, false otherwise + */ + protected boolean onForwardingStopped() { + final ListPopupWindow popup = getPopup(); + if (popup != null && popup.isShowing()) { + popup.dismiss(); + } + return true; + } + + /** + * Observes motion events and determines when to start forwarding. + * + * @param srcEvent motion event in source view coordinates + * @return true to start forwarding motion events, false otherwise + */ + private boolean onTouchObserved(MotionEvent srcEvent) { + final View src = mSrc; + if (!src.isEnabled()) { + return false; + } + + final int actionMasked = MotionEventCompat.getActionMasked(srcEvent); + switch (actionMasked) { + case MotionEvent.ACTION_DOWN: + mActivePointerId = srcEvent.getPointerId(0); + mWasLongPress = false; + + if (mDisallowIntercept == null) { + mDisallowIntercept = new DisallowIntercept(); + } + src.postDelayed(mDisallowIntercept, mTapTimeout); + if (mTriggerLongPress == null) { + mTriggerLongPress = new TriggerLongPress(); + } + src.postDelayed(mTriggerLongPress, mLongPressTimeout); + break; + case MotionEvent.ACTION_MOVE: + final int activePointerIndex = srcEvent.findPointerIndex(mActivePointerId); + if (activePointerIndex >= 0) { + final float x = srcEvent.getX(activePointerIndex); + final float y = srcEvent.getY(activePointerIndex); + if (!pointInView(src, x, y, mScaledTouchSlop)) { + clearCallbacks(); + + // Don't let the parent intercept our events. + src.getParent().requestDisallowInterceptTouchEvent(true); + return true; + } + } + break; + case MotionEvent.ACTION_CANCEL: + case MotionEvent.ACTION_UP: + clearCallbacks(); + break; + } + + return false; + } + + private void clearCallbacks() { + if (mTriggerLongPress != null) { + mSrc.removeCallbacks(mTriggerLongPress); + } + + if (mDisallowIntercept != null) { + mSrc.removeCallbacks(mDisallowIntercept); + } + } + + private void onLongPress() { + clearCallbacks(); + + final View src = mSrc; + if (!src.isEnabled() || src.isLongClickable()) { + // Ignore long-press if the view is disabled or has its own + // handler. + return; + } + + if (!onForwardingStarted()) { + return; + } + + // Don't let the parent intercept our events. + src.getParent().requestDisallowInterceptTouchEvent(true); + + // Make sure we cancel any ongoing source event stream. + final long now = SystemClock.uptimeMillis(); + final MotionEvent e = MotionEvent.obtain(now, now, MotionEvent.ACTION_CANCEL, 0, 0, 0); + src.onTouchEvent(e); + e.recycle(); + + mForwarding = true; + mWasLongPress = true; + } + + /** + * Handled forwarded motion events and determines when to stop forwarding. + * + * @param srcEvent motion event in source view coordinates + * @return true to continue forwarding motion events, false to cancel + */ + private boolean onTouchForwarded(MotionEvent srcEvent) { + final View src = mSrc; + final ListPopupWindow popup = getPopup(); + if (popup == null || !popup.isShowing()) { + return false; + } + + final DropDownListView dst = popup.mDropDownList; + if (dst == null || !dst.isShown()) { + return false; + } + + // Convert event to destination-local coordinates. + final MotionEvent dstEvent = MotionEvent.obtainNoHistory(srcEvent); + toGlobalMotionEvent(src, dstEvent); + toLocalMotionEvent(dst, dstEvent); + + // Forward converted event to destination view, then recycle it. + final boolean handled = dst.onForwardedEvent(dstEvent, mActivePointerId); + dstEvent.recycle(); + + // Always cancel forwarding when the touch stream ends. + final int action = MotionEventCompat.getActionMasked(srcEvent); + final boolean keepForwarding = action != MotionEvent.ACTION_UP + && action != MotionEvent.ACTION_CANCEL; + + return handled && keepForwarding; + } + + private static boolean pointInView(View view, float localX, float localY, float slop) { + return localX >= -slop && localY >= -slop && + localX < ((view.getRight() - view.getLeft()) + slop) && + localY < ((view.getBottom() - view.getTop()) + slop); + } + + /** + * Emulates View.toLocalMotionEvent(). This implementation does not handle transformations + * (scaleX, scaleY, etc). + */ + private boolean toLocalMotionEvent(View view, MotionEvent event) { + final int[] loc = mTmpLocation; + view.getLocationOnScreen(loc); + event.offsetLocation(-loc[0], -loc[1]); + return true; + } + + /** + * Emulates View.toGlobalMotionEvent(). This implementation does not handle transformations + * (scaleX, scaleY, etc). + */ + private boolean toGlobalMotionEvent(View view, MotionEvent event) { + final int[] loc = mTmpLocation; + view.getLocationOnScreen(loc); + event.offsetLocation(loc[0], loc[1]); + return true; + } + + private class DisallowIntercept implements Runnable { + @Override + public void run() { + final ViewParent parent = mSrc.getParent(); + parent.requestDisallowInterceptTouchEvent(true); + } + } + + private class TriggerLongPress implements Runnable { + @Override + public void run() { + onLongPress(); + } + } + } + + /** + *

      Wrapper class for a ListView. This wrapper can hijack the focus to + * make sure the list uses the appropriate drawables and states when + * displayed on screen within a drop down. The focus is never actually + * passed to the drop down in this mode; the list only looks focused.

      + */ + private static class DropDownListView extends ListViewCompat { + + /* + * 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; + + /** + * True if this wrapper should fake focus. + */ + private boolean mHijackFocus; + + /** Whether to force drawing of the pressed state selector. */ + private boolean mDrawsInPressedState; + + /** Current drag-to-open click animation, if any. */ + private ViewPropertyAnimatorCompat mClickAnimation; + + /** Helper for drag-to-open auto scrolling. */ + private ListViewAutoScrollHelper mScrollHelper; + + /** + *

      Creates a new list view wrapper.

      + * + * @param context this view's context + */ + public DropDownListView(Context context, boolean hijackFocus) { + super(context, null, R.attr.dropDownListViewStyle); + mHijackFocus = hijackFocus; + setCacheColorHint(0); // Transparent, since the background drawable could be anything. + } + + /** + * Handles forwarded events. + * + * @param activePointerId id of the pointer that activated forwarding + * @return whether the event was handled + */ + public boolean onForwardedEvent(MotionEvent event, int activePointerId) { + boolean handledEvent = true; + boolean clearPressedItem = false; + + final int actionMasked = MotionEventCompat.getActionMasked(event); + switch (actionMasked) { + case MotionEvent.ACTION_CANCEL: + handledEvent = false; + break; + case MotionEvent.ACTION_UP: + handledEvent = false; + // $FALL-THROUGH$ + case MotionEvent.ACTION_MOVE: + final int activeIndex = event.findPointerIndex(activePointerId); + if (activeIndex < 0) { + handledEvent = false; + break; + } + + final int x = (int) event.getX(activeIndex); + final int y = (int) event.getY(activeIndex); + final int position = pointToPosition(x, y); + if (position == INVALID_POSITION) { + clearPressedItem = true; + break; + } + + final View child = getChildAt(position - getFirstVisiblePosition()); + setPressedItem(child, position, x, y); + handledEvent = true; + + if (actionMasked == MotionEvent.ACTION_UP) { + clickPressedItem(child, position); + } + break; + } + + // Failure to handle the event cancels forwarding. + if (!handledEvent || clearPressedItem) { + clearPressedItem(); + } + + // Manage automatic scrolling. + if (handledEvent) { + if (mScrollHelper == null) { + mScrollHelper = new ListViewAutoScrollHelper(this); + } + mScrollHelper.setEnabled(true); + mScrollHelper.onTouch(this, event); + } else if (mScrollHelper != null) { + mScrollHelper.setEnabled(false); + } + + return handledEvent; + } + + /** + * Starts an alpha animation on the selector. When the animation ends, + * the list performs a click on the item. + */ + private void clickPressedItem(final View child, final int position) { + final long id = getItemIdAtPosition(position); + performItemClick(child, position, id); + } + + private void clearPressedItem() { + mDrawsInPressedState = false; + setPressed(false); + // This will call through to updateSelectorState() + drawableStateChanged(); + + if (mClickAnimation != null) { + mClickAnimation.cancel(); + mClickAnimation = null; + } + } + + private void setPressedItem(View child, int position, float x, float y) { + mDrawsInPressedState = true; + + // Ordering is essential. First update the pressed state and layout + // the children. This will ensure the selector actually gets drawn. + setPressed(true); + layoutChildren(); + + // Ensure that keyboard focus starts from the last touched position. + setSelection(position); + positionSelectorLikeTouchCompat(position, child, x, y); + + // This needs some explanation. We need to disable the selector for this next call + // due to the way that ListViewCompat works. Otherwise both ListView and ListViewCompat + // will draw the selector and bad things happen. + setSelectorEnabled(false); + + // Refresh the drawable state to reflect the new pressed state, + // which will also update the selector state. + refreshDrawableState(); + } + + @Override + protected boolean touchModeDrawsInPressedStateCompat() { + return mDrawsInPressedState || super.touchModeDrawsInPressedStateCompat(); + } + + @Override + public boolean isInTouchMode() { + // WARNING: Please read the comment where mListSelectionHidden is declared + return (mHijackFocus && mListSelectionHidden) || super.isInTouchMode(); + } + + /** + *

      Returns the focus state in the drop down.

      + * + * @return true always if hijacking focus + */ + @Override + public boolean hasWindowFocus() { + return mHijackFocus || super.hasWindowFocus(); + } + + /** + *

      Returns the focus state in the drop down.

      + * + * @return true always if hijacking focus + */ + @Override + public boolean isFocused() { + return mHijackFocus || super.isFocused(); + } + + /** + *

      Returns the focus state in the drop down.

      + * + * @return true always if hijacking focus + */ + @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(); + } + } + } + + private static boolean isConfirmKey(int keyCode) { + return keyCode == KeyEvent.KEYCODE_ENTER || keyCode == KeyEvent.KEYCODE_DPAD_CENTER; + } + + private void setPopupClipToScreenEnabled(boolean clip) { + if (sClipToWindowEnabledMethod != null) { + try { + sClipToWindowEnabledMethod.invoke(mPopup, clip); + } catch (Exception e) { + Log.i(TAG, "Could not call setClipToScreenEnabled() on PopupWindow. Oh well."); + } + } + } + +} \ No newline at end of file diff --git a/eclipse-compile/appcompat/src/android/support/v7/widget/PopupMenu.java b/eclipse-compile/appcompat/src/android/support/v7/widget/PopupMenu.java new file mode 100644 index 0000000000..5b7d333bdc --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/widget/PopupMenu.java @@ -0,0 +1,282 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.widget; + + +import android.content.Context; +import android.support.annotation.MenuRes; +import android.support.v7.appcompat.R; +import android.support.v7.internal.view.SupportMenuInflater; +import android.support.v7.internal.view.menu.MenuBuilder; +import android.support.v7.internal.view.menu.MenuPopupHelper; +import android.support.v7.internal.view.menu.MenuPresenter; +import android.support.v7.internal.view.menu.SubMenuBuilder; +import android.view.Gravity; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; + +/** + * Static library support version of the framework's {@link android.widget.PopupMenu}. + * Used to write apps that run on platforms prior to Android 3.0. When running + * on Android 3.0 or above, this implementation is still used; it does not try + * to switch to the framework's implementation. See the framework SDK + * documentation for a class overview. + */ +public class PopupMenu implements MenuBuilder.Callback, MenuPresenter.Callback { + private Context mContext; + private MenuBuilder mMenu; + private View mAnchor; + private MenuPopupHelper mPopup; + private OnMenuItemClickListener mMenuItemClickListener; + private OnDismissListener mDismissListener; + private View.OnTouchListener mDragListener; + + /** + * Callback interface used to notify the application that the menu has closed. + */ + public interface OnDismissListener { + /** + * Called when the associated menu has been dismissed. + * + * @param menu The PopupMenu that was dismissed. + */ + public void onDismiss(PopupMenu menu); + } + + /** + * Construct a new PopupMenu. + * + * @param context Context for the PopupMenu. + * @param anchor Anchor view for this popup. The popup will appear below the anchor if there + * is room, or above it if there is not. + */ + public PopupMenu(Context context, View anchor) { + this(context, anchor, Gravity.NO_GRAVITY); + } + + /** + * Constructor to create a new popup menu with an anchor view and alignment + * gravity. + * + * @param context Context the popup menu is running in, through which it + * can access the current theme, resources, etc. + * @param anchor Anchor view for this popup. The popup will appear below + * the anchor if there is room, or above it if there is not. + * @param gravity The {@link Gravity} value for aligning the popup with its + * anchor. + */ + public PopupMenu(Context context, View anchor, int gravity) { + this(context, anchor, gravity, R.attr.popupMenuStyle, 0); + } + + /** + * Constructor a create a new popup menu with a specific style. + * + * @param context Context the popup menu is running in, through which it + * can access the current theme, resources, etc. + * @param anchor Anchor view for this popup. The popup will appear below + * the anchor if there is room, or above it if there is not. + * @param gravity The {@link Gravity} value for aligning the popup with its + * anchor. + * @param popupStyleAttr An attribute in the current theme that contains a + * reference to a style resource that supplies default values for + * the popup window. Can be 0 to not look for defaults. + * @param popupStyleRes A resource identifier of a style resource that + * supplies default values for the popup window, used only if + * popupStyleAttr is 0 or can not be found in the theme. Can be 0 + * to not look for defaults. + */ + public PopupMenu(Context context, View anchor, int gravity, int popupStyleAttr, + int popupStyleRes) { + mContext = context; + mMenu = new MenuBuilder(context); + mMenu.setCallback(this); + mAnchor = anchor; + mPopup = new MenuPopupHelper(context, mMenu, anchor, false, popupStyleAttr, popupStyleRes); + mPopup.setGravity(gravity); + mPopup.setCallback(this); + } + + /** + * Returns an {@link android.view.View.OnTouchListener} that can be added to the anchor view + * to implement drag-to-open behavior. + *

      + * When the listener is set on a view, touching that view and dragging + * outside of its bounds will open the popup window. Lifting will select the + * currently touched list item. + *

      + * Example usage: + *

      +     * PopupMenu myPopup = new PopupMenu(context, myAnchor);
      +     * myAnchor.setOnTouchListener(myPopup.getDragToOpenListener());
      +     * 
      + * + * @return a touch listener that controls drag-to-open behavior + */ + public View.OnTouchListener getDragToOpenListener() { + if (mDragListener == null) { + mDragListener = new ListPopupWindow.ForwardingListener(mAnchor) { + @Override + protected boolean onForwardingStarted() { + show(); + return true; + } + + @Override + protected boolean onForwardingStopped() { + dismiss(); + return true; + } + + @Override + public ListPopupWindow getPopup() { + // This will be null until show() is called. + return mPopup.getPopup(); + } + }; + } + + return mDragListener; + } + + /** + * @return the {@link Menu} associated with this popup. Populate the returned Menu with + * items before calling {@link #show()}. + * + * @see #show() + * @see #getMenuInflater() + */ + public Menu getMenu() { + return mMenu; + } + + /** + * @return a {@link MenuInflater} that can be used to inflate menu items from XML into the + * menu returned by {@link #getMenu()}. + * + * @see #getMenu() + */ + public MenuInflater getMenuInflater() { + return new SupportMenuInflater(mContext); + } + + /** + * Inflate a menu resource into this PopupMenu. This is equivalent to calling + * popupMenu.getMenuInflater().inflate(menuRes, popupMenu.getMenu()). + * @param menuRes Menu resource to inflate + */ + public void inflate(@MenuRes int menuRes) { + getMenuInflater().inflate(menuRes, mMenu); + } + + /** + * Show the menu popup anchored to the view specified during construction. + * @see #dismiss() + */ + public void show() { + mPopup.show(); + } + + /** + * Dismiss the menu popup. + * @see #show() + */ + public void dismiss() { + mPopup.dismiss(); + } + + /** + * Set a listener that will be notified when the user selects an item from the menu. + * + * @param listener Listener to notify + */ + public void setOnMenuItemClickListener(OnMenuItemClickListener listener) { + mMenuItemClickListener = listener; + } + + /** + * Set a listener that will be notified when this menu is dismissed. + * + * @param listener Listener to notify + */ + public void setOnDismissListener(OnDismissListener listener) { + mDismissListener = listener; + } + + /** + * @hide + */ + public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) { + if (mMenuItemClickListener != null) { + return mMenuItemClickListener.onMenuItemClick(item); + } + return false; + } + + /** + * @hide + */ + public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { + if (mDismissListener != null) { + mDismissListener.onDismiss(this); + } + } + + /** + * @hide + */ + public boolean onOpenSubMenu(MenuBuilder subMenu) { + if (subMenu == null) return false; + + if (!subMenu.hasVisibleItems()) { + return true; + } + + // Current menu will be dismissed by the normal helper, submenu will be shown in its place. + new MenuPopupHelper(mContext, subMenu, mAnchor).show(); + return true; + } + + /** + * @hide + */ + public void onCloseSubMenu(SubMenuBuilder menu) { + } + + /** + * @hide + */ + public void onMenuModeChange(MenuBuilder menu) { + } + + /** + * Interface responsible for receiving menu item click events if the items themselves + * do not have individual item click listeners. + */ + public interface OnMenuItemClickListener { + /** + * This method will be invoked when a menu item is clicked if the item itself did + * not already handle the event. + * + * @param item {@link MenuItem} that was clicked + * @return true if the event was handled, false otherwise. + */ + public boolean onMenuItemClick(MenuItem item); + } +} \ No newline at end of file diff --git a/eclipse-compile/appcompat/src/android/support/v7/widget/SearchView.java b/eclipse-compile/appcompat/src/android/support/v7/widget/SearchView.java new file mode 100644 index 0000000000..2eb8778cbc --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/widget/SearchView.java @@ -0,0 +1,1820 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.widget; + +import android.annotation.TargetApi; +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.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.support.v7.appcompat.R; +import android.support.v7.internal.widget.TintAutoCompleteTextView; +import android.support.v7.internal.widget.TintManager; +import android.support.v7.internal.widget.TintTypedArray; +import android.support.v7.internal.widget.ViewUtils; +import android.support.v7.view.CollapsibleActionView; +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.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewTreeObserver; +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.ListView; +import android.widget.TextView; +import android.widget.TextView.OnEditorActionListener; + +import java.lang.reflect.Method; +import java.util.WeakHashMap; + +import static android.support.v7.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. + * + *

      Note: This class is included in the support library for compatibility + * with API level 7 and higher. If you're developing your app for API level 11 and higher + * only, you should instead use the framework {@link android.widget.SearchView} class.

      + * + *

      + * When the SearchView is used in an {@link android.support.v7.app.ActionBar} + * as an action view, it's collapsed by default, so you must provide an icon for the action. + *

      + *

      + * If you want the search field to always be visible, then call + * {@link #setIconifiedByDefault(boolean) setIconifiedByDefault(false)}. + *

      + * + *
      + *

      Developer Guides

      + *

      For information about using {@code SearchView}, read the + * Search API guide. + * Additional information about action views is also available in the <Action Bar API guide

      + *
      + * + * @see android.support.v4.view.MenuItemCompat#SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW + */ +public class SearchView extends LinearLayoutCompat implements CollapsibleActionView { + + private static final boolean DBG = false; + private static final String LOG_TAG = "SearchView"; + + private static final boolean IS_AT_LEAST_FROYO = Build.VERSION.SDK_INT >= 8; + + /** + * Private constant for removing the microphone in the keyboard. + */ + private static final String IME_OPTION_NO_MICROPHONE = "nm"; + + private final SearchAutoComplete mSearchSrcTextView; + private final View mSearchEditFrame; + private final View mSearchPlate; + private final View mSubmitArea; + private final ImageView mSearchButton; + private final ImageView mGoButton; + private final ImageView mCloseButton; + private final ImageView mVoiceButton; + private final View mDropDownAnchor; + + /** Icon optionally displayed when the SearchView is collapsed. */ + private final ImageView mCollapsedIcon; + + /** Drawable used as an EditText hint. */ + private final Drawable mSearchHintIcon; + + // Resources used by SuggestionsAdapter to display suggestions. + private final int mSuggestionRowLayout; + private final int mSuggestionCommitIconResId; + + // Intents used for voice searching. + private final Intent mVoiceWebSearchIntent; + private final Intent mVoiceAppSearchIntent; + + 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 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; + + private final TintManager mTintManager; + + static final AutoCompleteTextViewReflector HIDDEN_METHOD_INVOKER = new AutoCompleteTextViewReflector(); + + /* + * 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) { + HIDDEN_METHOD_INVOKER.showSoftInputUnchecked(imm, SearchView.this, 0); + } + } + }; + + private final 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); + } + } + }; + + // 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) { + this(context, attrs, R.attr.searchViewStyle); + } + + public SearchView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + final TintTypedArray a = TintTypedArray.obtainStyledAttributes(context, + attrs, R.styleable.SearchView, defStyleAttr, 0); + // Keep the TintManager in case we need it later + mTintManager = a.getTintManager(); + + final LayoutInflater inflater = LayoutInflater.from(context); + final int layoutResId = a.getResourceId( + R.styleable.SearchView_layout, R.layout.abc_search_view); + inflater.inflate(layoutResId, this, true); + + mSearchSrcTextView = (SearchAutoComplete) findViewById(R.id.search_src_text); + mSearchSrcTextView.setSearchView(this); + + mSearchEditFrame = findViewById(R.id.search_edit_frame); + mSearchPlate = findViewById(R.id.search_plate); + mSubmitArea = findViewById(R.id.submit_area); + mSearchButton = (ImageView) findViewById(R.id.search_button); + mGoButton = (ImageView) findViewById(R.id.search_go_btn); + mCloseButton = (ImageView) findViewById(R.id.search_close_btn); + mVoiceButton = (ImageView) findViewById(R.id.search_voice_btn); + mCollapsedIcon = (ImageView) findViewById(R.id.search_mag_icon); + + // Set up icons and backgrounds. + mSearchPlate.setBackgroundDrawable(a.getDrawable(R.styleable.SearchView_queryBackground)); + mSubmitArea.setBackgroundDrawable(a.getDrawable(R.styleable.SearchView_submitBackground)); + mSearchButton.setImageDrawable(a.getDrawable(R.styleable.SearchView_searchIcon)); + mGoButton.setImageDrawable(a.getDrawable(R.styleable.SearchView_goIcon)); + mCloseButton.setImageDrawable(a.getDrawable(R.styleable.SearchView_closeIcon)); + mVoiceButton.setImageDrawable(a.getDrawable(R.styleable.SearchView_voiceIcon)); + mCollapsedIcon.setImageDrawable(a.getDrawable(R.styleable.SearchView_searchIcon)); + + mSearchHintIcon = a.getDrawable(R.styleable.SearchView_searchHintIcon); + + // Extract dropdown layout resource IDs for later use. + mSuggestionRowLayout = a.getResourceId(R.styleable.SearchView_suggestionRowLayout, + R.layout.abc_search_dropdown_item_icons_2line); + mSuggestionCommitIconResId = a.getResourceId(R.styleable.SearchView_commitIcon, 0); + + mSearchButton.setOnClickListener(mOnClickListener); + mCloseButton.setOnClickListener(mOnClickListener); + mGoButton.setOnClickListener(mOnClickListener); + mVoiceButton.setOnClickListener(mOnClickListener); + mSearchSrcTextView.setOnClickListener(mOnClickListener); + + mSearchSrcTextView.addTextChangedListener(mTextWatcher); + mSearchSrcTextView.setOnEditorActionListener(mOnEditorActionListener); + mSearchSrcTextView.setOnItemClickListener(mOnItemClickListener); + mSearchSrcTextView.setOnItemSelectedListener(mOnItemSelectedListener); + mSearchSrcTextView.setOnKeyListener(mTextKeyListener); + + // Inform any listener of focus changes + mSearchSrcTextView.setOnFocusChangeListener(new OnFocusChangeListener() { + + public void onFocusChange(View v, boolean hasFocus) { + if (mOnQueryTextFocusChangeListener != null) { + mOnQueryTextFocusChangeListener.onFocusChange(SearchView.this, hasFocus); + } + } + }); + setIconifiedByDefault(a.getBoolean(R.styleable.SearchView_iconifiedByDefault, true)); + + final int maxWidth = a.getDimensionPixelSize(R.styleable.SearchView_android_maxWidth, -1); + if (maxWidth != -1) { + setMaxWidth(maxWidth); + } + + final CharSequence queryHint = a.getText(R.styleable.SearchView_queryHint); + if (!TextUtils.isEmpty(queryHint)) { + setQueryHint(queryHint); + } + + final int imeOptions = a.getInt(R.styleable.SearchView_android_imeOptions, -1); + if (imeOptions != -1) { + setImeOptions(imeOptions); + } + + final int inputType = a.getInt(R.styleable.SearchView_android_inputType, -1); + if (inputType != -1) { + setInputType(inputType); + } + + boolean focusable = true; + focusable = a.getBoolean(R.styleable.SearchView_android_focusable, focusable); + setFocusable(focusable); + + a.recycle(); + + // 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(mSearchSrcTextView.getDropDownAnchor()); + if (mDropDownAnchor != null) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + addOnLayoutChangeListenerToDropDownAnchorSDK11(); + } else { + addOnLayoutChangeListenerToDropDownAnchorBase(); + } + } + + updateViewsVisibility(mIconifiedByDefault); + updateQueryHint(); + } + + @TargetApi(Build.VERSION_CODES.HONEYCOMB) + private void addOnLayoutChangeListenerToDropDownAnchorSDK11() { + mDropDownAnchor.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { + @Override + public void onLayoutChange(View v, int left, int top, int right, int bottom, + int oldLeft, int oldTop, int oldRight, int oldBottom) { + adjustDropDownSizeAndPosition(); + } + }); + } + + private void addOnLayoutChangeListenerToDropDownAnchorBase() { + mDropDownAnchor.getViewTreeObserver() + .addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + adjustDropDownSizeAndPosition(); + } + }); + } + + int getSuggestionRowLayout() { + return mSuggestionRowLayout; + } + + int getSuggestionCommitIconResId() { + return mSuggestionCommitIconResId; + } + + /** + * 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) { + if (IS_AT_LEAST_FROYO) { + updateSearchAutoComplete(); + } + updateQueryHint(); + } + // Cache the voice search capability + mVoiceButtonEnabled = IS_AT_LEAST_FROYO && 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 + mSearchSrcTextView.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 + */ + public void setImeOptions(int imeOptions) { + mSearchSrcTextView.setImeOptions(imeOptions); + } + + /** + * Returns the IME options set on the query text field. + * @return the ime options + * @see TextView#setImeOptions(int) + */ + public int getImeOptions() { + return mSearchSrcTextView.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 + */ + public void setInputType(int inputType) { + mSearchSrcTextView.setInputType(inputType); + } + + /** + * Returns the input type set on the query text field. + * @return the input type + */ + public int getInputType() { + return mSearchSrcTextView.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 = mSearchSrcTextView.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(); + mSearchSrcTextView.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 mSearchSrcTextView.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) { + mSearchSrcTextView.setText(query); + if (query != null) { + mSearchSrcTextView.setSelection(mSearchSrcTextView.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 + */ + 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. + */ + public CharSequence getQueryHint() { + if (mQueryHint != null) { + return mQueryHint; + } else if (IS_AT_LEAST_FROYO && 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 + */ + public void setIconifiedByDefault(boolean iconified) { + if (mIconifiedByDefault == iconified) return; + mIconifiedByDefault = iconified; + updateViewsVisibility(iconified); + updateQueryHint(); + } + + /** + * Returns the default iconified state of the search field. + * @return + */ + 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; + + mSearchSrcTextView.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 + */ + 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 + */ + 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.abc_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(mSearchSrcTextView.getText()); + + mSearchButton.setVisibility(visCollapsed); + updateSubmitButton(hasText); + mSearchEditFrame.setVisibility(collapsed ? GONE : VISIBLE); + mCollapsedIcon.setVisibility(mIconifiedByDefault ? GONE : VISIBLE); + updateCloseButton(); + updateVoiceButton(!hasText); + updateSubmitArea(); + } + + @TargetApi(Build.VERSION_CODES.FROYO) + 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; + } + mGoButton.setVisibility(visibility); + } + + private void updateSubmitArea() { + int visibility = GONE; + if (isSubmitAreaEnabled() + && (mGoButton.getVisibility() == VISIBLE + || mVoiceButton.getVisibility() == VISIBLE)) { + visibility = VISIBLE; + } + mSubmitArea.setVisibility(visibility); + } + + private void updateCloseButton() { + final boolean hasText = !TextUtils.isEmpty(mSearchSrcTextView.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); + final Drawable closeButtonImg = mCloseButton.getDrawable(); + if (closeButtonImg != null){ + closeButtonImg.setState(hasText ? ENABLED_STATE_SET : EMPTY_STATE_SET); + } + } + + private void postUpdateFocusedState() { + post(mUpdateDrawableStateRunnable); + } + + private void updateFocusedState() { + final boolean focused = mSearchSrcTextView.hasFocus(); + final int[] stateSet = focused ? FOCUSED_STATE_SET : EMPTY_STATE_SET; + final Drawable searchPlateBg = mSearchPlate.getBackground(); + if (searchPlateBg != null) { + searchPlateBg.setState(stateSet); + } + final Drawable submitAreaBg = mSubmitArea.getBackground(); + if (submitAreaBg != null) { + submitAreaBg.setState(stateSet); + } + 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 == mGoButton) { + onSubmitQuery(); + } else if (v == mVoiceButton) { + onVoiceClicked(); + } else if (v == mSearchSrcTextView) { + forceSuggestionQuery(); + } + } + }; + + /** + * 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: " + + mSearchSrcTextView.getListSelection()); + } + + // If a suggestion is selected, handle enter, search key, and action keys + // as presses on the selected suggestion + if (mSearchSrcTextView.isPopupShowing() + && mSearchSrcTextView.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 (!mSearchSrcTextView.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, mSearchSrcTextView.getText() + .toString()); + return true; + } + } + } + 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 = mSearchSrcTextView.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 : mSearchSrcTextView + .length(); + mSearchSrcTextView.setSelection(selPoint); + mSearchSrcTextView.setListSelection(0); + mSearchSrcTextView.clearListSelection(); + HIDDEN_METHOD_INVOKER.ensureImeVisible(mSearchSrcTextView, true); + + return true; + } + + // Next, check for an "up and out" move + if (keyCode == KeyEvent.KEYCODE_DPAD_UP && 0 == mSearchSrcTextView.getListSelection()) { + // TODO: restoreUserQuery(); + // let ACTV complete the move + return false; + } + } + return false; + } + + private CharSequence getDecoratedHint(CharSequence hintText) { + // If the field is always expanded or we don't have a search hint icon, + // then don't add the search icon to the hint. + if (!mIconifiedByDefault || mSearchHintIcon == null) { + return hintText; + } + + final int textSize = (int) (mSearchSrcTextView.getTextSize() * 1.25); + mSearchHintIcon.setBounds(0, 0, textSize, textSize); + + final SpannableStringBuilder ssb = new SpannableStringBuilder(" "); + ssb.setSpan(new ImageSpan(mSearchHintIcon), 1, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + ssb.append(hintText); + return ssb; + } + + private void updateQueryHint() { + if (mQueryHint != null) { + mSearchSrcTextView.setHint(getDecoratedHint(mQueryHint)); + } else if (IS_AT_LEAST_FROYO && mSearchable != null) { + CharSequence hint = null; + int hintId = mSearchable.getHintId(); + if (hintId != 0) { + hint = getContext().getString(hintId); + } + if (hint != null) { + mSearchSrcTextView.setHint(getDecoratedHint(hint)); + } + } else { + mSearchSrcTextView.setHint(getDecoratedHint("")); + } + } + + /** + * Updates the auto-complete text view. + */ + @TargetApi(Build.VERSION_CODES.FROYO) + private void updateSearchAutoComplete() { + mSearchSrcTextView.setThreshold(mSearchable.getSuggestThreshold()); + mSearchSrcTextView.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; + } + } + mSearchSrcTextView.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); + mSearchSrcTextView.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; + mGoButton.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 = mSearchSrcTextView.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 = mSearchSrcTextView.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() { + mSearchSrcTextView.dismissDropDown(); + } + + private void onCloseClicked() { + CharSequence text = mSearchSrcTextView.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 { + mSearchSrcTextView.setText(""); + mSearchSrcTextView.requestFocus(); + setImeVisibility(true); + } + + } + + private void onSearchClicked() { + updateViewsVisibility(false); + mSearchSrcTextView.requestFocus(); + setImeVisibility(true); + if (mOnSearchClickListener != null) { + mOnSearchClickListener.onClick(this); + } + } + + @TargetApi(Build.VERSION_CODES.FROYO) + 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 (mSearchSrcTextView.hasFocus()) { + forceSuggestionQuery(); + } + } + + @Override + public void onWindowFocusChanged(boolean hasWindowFocus) { + super.onWindowFocusChanged(hasWindowFocus); + + postUpdateFocusedState(); + } + + /** + * {@inheritDoc} + */ + @Override + public void onActionViewCollapsed() { + setQuery("", false); + clearFocus(); + updateViewsVisibility(true); + mSearchSrcTextView.setImeOptions(mCollapsedImeOptions); + mExpandedInActionView = false; + } + + /** + * {@inheritDoc} + */ + @Override + public void onActionViewExpanded() { + if (mExpandedInActionView) return; + + mExpandedInActionView = true; + mCollapsedImeOptions = mSearchSrcTextView.getImeOptions(); + mSearchSrcTextView.setImeOptions(mCollapsedImeOptions | EditorInfo.IME_FLAG_NO_FULLSCREEN); + mSearchSrcTextView.setText(""); + setIconified(false); + } + + + private void adjustDropDownSizeAndPosition() { + if (mDropDownAnchor.getWidth() > 1) { + Resources res = getContext().getResources(); + int anchorPadding = mSearchPlate.getPaddingLeft(); + Rect dropDownPadding = new Rect(); + final boolean isLayoutRtl = ViewUtils.isLayoutRtl(this); + int iconOffset = mIconifiedByDefault + ? res.getDimensionPixelSize(R.dimen.abc_dropdownitem_icon_width) + + res.getDimensionPixelSize(R.dimen.abc_dropdownitem_text_padding_left) + : 0; + mSearchSrcTextView.getDropDownBackground().getPadding(dropDownPadding); + int offset; + if (isLayoutRtl) { + offset = - dropDownPadding.left; + } else { + offset = anchorPadding - (dropDownPadding.left + iconOffset); + } + mSearchSrcTextView.setDropDownHorizontalOffset(offset); + final int width = mDropDownAnchor.getWidth() + dropDownPadding.left + + dropDownPadding.right + iconOffset - anchorPadding; + mSearchSrcTextView.setDropDownWidth(width); + } + } + + 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 = mSearchSrcTextView.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) { + mSearchSrcTextView.setText(query); + // Move the cursor to the end + mSearchSrcTextView.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); + } + if (IS_AT_LEAST_FROYO) { + intent.setComponent(mSearchable.getSearchActivity()); + } + return intent; + } + + /** + * Create and return an Intent that can launch the voice search activity for web search. + */ + @TargetApi(Build.VERSION_CODES.FROYO) + 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 + */ + @TargetApi(Build.VERSION_CODES.FROYO) + 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(); + if (mAppSearchData != null) { + queryExtras.putParcelable(SearchManager.APP_DATA, mAppSearchData); + } + + // 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; + + if (Build.VERSION.SDK_INT >= 8) { + 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 && Build.VERSION.SDK_INT >= 8) { + 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 (IS_AT_LEAST_FROYO && 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() { + HIDDEN_METHOD_INVOKER.doBeforeTextChanged(mSearchSrcTextView); + HIDDEN_METHOD_INVOKER.doAfterTextChanged(mSearchSrcTextView); + } + + 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 TintAutoCompleteTextView { + + private int mThreshold; + private SearchView mSearchView; + + public SearchAutoComplete(Context context) { + this(context, null); + } + + public SearchAutoComplete(Context context, AttributeSet attrs) { + this(context, attrs, android.R.attr.autoCompleteTextViewStyle); + } + + 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())) { + HIDDEN_METHOD_INVOKER.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 class AutoCompleteTextViewReflector { + private Method doBeforeTextChanged, doAfterTextChanged; + private Method ensureImeVisible; + private Method showSoftInputUnchecked; + + AutoCompleteTextViewReflector() { + try { + doBeforeTextChanged = AutoCompleteTextView.class + .getDeclaredMethod("doBeforeTextChanged"); + doBeforeTextChanged.setAccessible(true); + } catch (NoSuchMethodException e) { + // Ah well. + } + try { + doAfterTextChanged = AutoCompleteTextView.class + .getDeclaredMethod("doAfterTextChanged"); + doAfterTextChanged.setAccessible(true); + } catch (NoSuchMethodException e) { + // Ah well. + } + try { + ensureImeVisible = AutoCompleteTextView.class + .getMethod("ensureImeVisible", boolean.class); + ensureImeVisible.setAccessible(true); + } catch (NoSuchMethodException e) { + // Ah well. + } + try { + showSoftInputUnchecked = InputMethodManager.class.getMethod( + "showSoftInputUnchecked", int.class, ResultReceiver.class); + showSoftInputUnchecked.setAccessible(true); + } catch (NoSuchMethodException e) { + // Ah well. + } + } + + void doBeforeTextChanged(AutoCompleteTextView view) { + if (doBeforeTextChanged != null) { + try { + doBeforeTextChanged.invoke(view); + } catch (Exception e) { + } + } + } + + void doAfterTextChanged(AutoCompleteTextView view) { + if (doAfterTextChanged != null) { + try { + doAfterTextChanged.invoke(view); + } catch (Exception e) { + } + } + } + + void ensureImeVisible(AutoCompleteTextView view, boolean visible) { + if (ensureImeVisible != null) { + try { + ensureImeVisible.invoke(view, visible); + } catch (Exception e) { + } + } + } + + void showSoftInputUnchecked(InputMethodManager imm, View view, int flags) { + if (showSoftInputUnchecked != null) { + try { + showSoftInputUnchecked.invoke(imm, flags, null); + return; + } catch (Exception e) { + } + } + + // Hidden method failed, call public version instead + imm.showSoftInput(view, flags); + } + } +} \ No newline at end of file diff --git a/eclipse-compile/appcompat/src/android/support/v7/widget/ShareActionProvider.java b/eclipse-compile/appcompat/src/android/support/v7/widget/ShareActionProvider.java new file mode 100644 index 0000000000..173e5fc6b5 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/widget/ShareActionProvider.java @@ -0,0 +1,376 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.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.os.Build; +import android.support.v4.view.ActionProvider; +import android.support.v7.appcompat.R; +import android.support.v7.internal.widget.ActivityChooserModel; +import android.support.v7.internal.widget.ActivityChooserView; +import android.support.v7.internal.widget.TintManager; +import android.util.TypedValue; +import android.view.Menu; +import android.view.MenuItem; +import android.view.MenuItem.OnMenuItemClickListener; +import android.view.SubMenu; +import android.view.View; +import android.support.v7.internal.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. + * + *

      Note: This class is included in the support library for compatibility + * with API level 7 and higher. If you're developing your app for API level 14 and higher + * only, you should instead use the framework {@link android.widget.ShareActionProvider} + * class.

      + * + *

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

      + *
      
      + *  // In {@link android.app.Activity#onCreateOptionsMenu 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) MenuItemCompat.getActionProvider(menuItem);
      + *      // Set history different from the default before getting the action
      + *      // view since a call to {@link android.support.v4.view.MenuItemCompat#getActionView(android.view.MenuItem) MenuItemCompat.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. + *

      + * + *
      + *

      Developer Guides

      + * + *

      For information about how to use {@link ShareActionProvider}, see the + * Action Bar API guide.

      + *
      + * + * @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 perform some action before the sharing is + * actually performed. + *

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

      + *

      + * Note: You should not handle the + * intent here. This callback aims to notify the client that a + * sharing is being performed, so the client can update the UI + * if necessary. + *

      + * + * @param source The source of the notification. + * @param intent The intent for launching the chosen share target. + * @return The return result is ignored. Always return false for consistency. + */ + 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. + ActivityChooserView activityChooserView = new ActivityChooserView(mContext); + if (!activityChooserView.isInEditMode()) { + ActivityChooserModel dataModel = ActivityChooserModel.get(mContext, mShareHistoryFileName); + activityChooserView.setActivityChooserModel(dataModel); + } + + // Lookup and set the expand action icon. + TypedValue outTypedValue = new TypedValue(); + mContext.getTheme().resolveAttribute(R.attr.actionModeShareDrawable, outTypedValue, true); + Drawable drawable = TintManager.getDrawable(mContext, outTypedValue.resourceId); + activityChooserView.setExpandActivityOverflowButtonDrawable(drawable); + activityChooserView.setProvider(this); + + // Set content description. + activityChooserView.setDefaultActionButtonContentDescription( + R.string.abc_shareactionprovider_share_with_application); + activityChooserView.setExpandActivityOverflowButtonContentDescription( + R.string.abc_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.abc_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. Therefore, if you want to + * use different history files for sharing specific types of content, every time + * you change the history file {@link #setShareHistoryFileName(String)} you must + * call {@link android.app.Activity#invalidateOptionsMenu()} to recreate the + * action view. You should not call + * {@link android.app.Activity#invalidateOptionsMenu()} from + * {@link android.app.Activity#onCreateOptionsMenu(Menu)}." + *

      + * + * private void doShare(Intent intent) { + * if (IMAGE.equals(intent.getMimeType())) { + * mShareActionProvider.setHistoryFileName(SHARE_IMAGE_HISTORY_FILE_NAME); + * } else if (TEXT.equals(intent.getMimeType())) { + * mShareActionProvider.setHistoryFileName(SHARE_TEXT_HISTORY_FILE_NAME); + * } + * mShareActionProvider.setIntent(intent); + * invalidateOptionsMenu(); + * } + * + * + * @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) { + if (shareIntent != null) { + final String action = shareIntent.getAction(); + if (Intent.ACTION_SEND.equals(action) || Intent.ACTION_SEND_MULTIPLE.equals(action)) { + updateIntent(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) { + final String action = launchIntent.getAction(); + if (Intent.ACTION_SEND.equals(action) || + Intent.ACTION_SEND_MULTIPLE.equals(action)) { + updateIntent(launchIntent); + } + 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 ShareActivityChooserModelPolicy(); + } + ActivityChooserModel dataModel = ActivityChooserModel.get(mContext, mShareHistoryFileName); + dataModel.setOnChooseActivityListener(mOnChooseActivityListener); + } + + /** + * Policy that delegates to the {@link OnShareTargetSelectedListener}, if such. + */ + private class ShareActivityChooserModelPolicy implements OnChooseActivityListener { + @Override + public boolean onChooseActivity(ActivityChooserModel host, Intent intent) { + if (mOnShareTargetSelectedListener != null) { + mOnShareTargetSelectedListener.onShareTargetSelected( + ShareActionProvider.this, intent); + } + return false; + } + } + + private void updateIntent(Intent intent) { + if (Build.VERSION.SDK_INT >= 21) { + // If we're on Lollipop, we can open the intent as a document + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT | + Intent.FLAG_ACTIVITY_MULTIPLE_TASK); + } else { + // Else, we will use the old CLEAR_WHEN_TASK_RESET flag + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); + } + } +} \ No newline at end of file diff --git a/eclipse-compile/appcompat/src/android/support/v7/widget/SuggestionsAdapter.java b/eclipse-compile/appcompat/src/android/support/v7/widget/SuggestionsAdapter.java new file mode 100644 index 0000000000..6251e0e31a --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/widget/SuggestionsAdapter.java @@ -0,0 +1,756 @@ +package android.support.v7.widget; + +/* + * Copyright (C) 2013 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. + */ + +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.content.ContextCompat; +import android.support.v4.widget.ResourceCursorAdapter; +import android.support.v7.appcompat.R; +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 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.in {@link SearchView}. + * @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 final SearchManager mSearchManager; + private final SearchView mSearchView; + private final SearchableInfo mSearchable; + private final Context mProviderContext; + private final WeakHashMap mOutsideDrawablesCache; + private final int mCommitIconResId; + 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; + + public SuggestionsAdapter(Context context, SearchView searchView, SearchableInfo searchable, + WeakHashMap outsideDrawablesCache) { + super(context, searchView.getSuggestionRowLayout(), null /* no initial cursor */, + true /* auto-requery */); + mSearchManager = (SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE); + mSearchView = searchView; + mSearchable = searchable; + mCommitIconResId = searchView.getSuggestionCommitIconResId(); + + // set up provider resources (gives us icons, etc.) + mProviderContext = context; + + mOutsideDrawablesCache = outsideDrawablesCache; + } + + /** + * 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 refine 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; + } + try { + cursor = getSearchManagerSuggestions(mSearchable, 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 + return 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(); + + 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)) { + return; + } + // If cursor is null or is done, stop the spinner + } + + /** + * 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) { + final View v = super.newView(context, cursor, parent); + v.setTag(new ChildViewCache(v)); + + // Set up icon. + final ImageView iconRefine = (ImageView) v.findViewById(R.id.edit_query); + iconRefine.setImageResource(mCommitIconResId); + 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; + } + + if (mSearchable.shouldRewriteQueryFromData()) { + String data = getColumnString(cursor, SearchManager.SUGGEST_COLUMN_INTENT_DATA); + if (data != null) { + return data; + } + } + + if (mSearchable.shouldRewriteQueryFromText()) { + String text1 = getColumnString(cursor, SearchManager.SUGGEST_COLUMN_TEXT_1); + if (text1 != null) { + return text1; + } + } + + 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 = ContextCompat.getDrawable(mProviderContext, 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 getDrawableFromResourceUri(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; + } + } + + + + 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) { + // Check the component that gave us the suggestion + Drawable drawable = getActivityIconWithCache(mSearchable.getSearchActivity()); + if (drawable != null) { + return drawable; + } + + // 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; + } + } + + /** + * Import of hidden method: ContentResolver.getResourceId(Uri). + * Modified to return a drawable, rather than a hidden type. + */ + Drawable getDrawableFromResourceUri(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); + } + + /** + * Import of hidden method: SearchManager.getSuggestions(SearchableInfo, String, int). + */ + Cursor getSearchManagerSuggestions(SearchableInfo searchable, String query, int limit) { + if (searchable == null) { + return null; + } + + String authority = searchable.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 = searchable.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 = searchable.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); + } +} \ No newline at end of file diff --git a/eclipse-compile/appcompat/src/android/support/v7/widget/SwitchCompat.java b/eclipse-compile/appcompat/src/android/support/v7/widget/SwitchCompat.java new file mode 100644 index 0000000000..9c53920e2c --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/widget/SwitchCompat.java @@ -0,0 +1,1151 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.widget; + +import android.annotation.TargetApi; +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.Region; +import android.graphics.Typeface; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.support.v4.graphics.drawable.DrawableCompat; +import android.support.v4.view.MotionEventCompat; +import android.support.v4.view.ViewCompat; +import android.support.v7.appcompat.R; +import android.support.v7.internal.text.AllCapsTransformationMethod; +import android.support.v7.internal.widget.DrawableUtils; +import android.support.v7.internal.widget.TintManager; +import android.support.v7.internal.widget.TintTypedArray; +import android.support.v7.internal.widget.ViewUtils; +import android.text.Layout; +import android.text.StaticLayout; +import android.text.TextPaint; +import android.text.TextUtils; +import android.text.method.TransformationMethod; +import android.util.AttributeSet; +import android.view.Gravity; +import android.view.MotionEvent; +import android.view.SoundEffectConstants; +import android.view.VelocityTracker; +import android.view.ViewConfiguration; +import android.view.accessibility.AccessibilityEvent; +import android.view.accessibility.AccessibilityNodeInfo; +import android.view.animation.Animation; +import android.view.animation.Transformation; +import android.widget.CompoundButton; + +/** + * SwitchCompat is a version of the Switch widget which on devices back to API v7. It does not + * make any attempt to use the platform provided widget on those devices which it is available + * normally. + *

      + * A Switch is a two-state toggle switch widget that can select between two + * options. The user may drag the "thumb" back and forth to choose the selected option, + * or simply tap to toggle as if it were a checkbox. The {@link #setText(CharSequence) text} + * property controls the text displayed in the label for the switch, whereas the + * {@link #setTextOff(CharSequence) off} and {@link #setTextOn(CharSequence) on} text + * controls the text on the thumb. Similarly, the + * {@link #setTextAppearance(android.content.Context, int) textAppearance} and the related + * setTypeface() methods control the typeface and style of label text, whereas the + * {@link #setSwitchTextAppearance(android.content.Context, int) switchTextAppearance} and + * the related seSwitchTypeface() methods control that of the thumb. + */ +public class SwitchCompat extends CompoundButton { + private static final int THUMB_ANIMATION_DURATION = 250; + + private static final int TOUCH_MODE_IDLE = 0; + private static final int TOUCH_MODE_DOWN = 1; + private static final int TOUCH_MODE_DRAGGING = 2; + + // We force the accessibility events to have a class name of Switch, since screen readers + // already know how to handle their events + private static final String ACCESSIBILITY_EVENT_CLASS_NAME = "android.widget.Switch"; + + // Enum for the "typeface" XML parameter. + private static final int SANS = 1; + private static final int SERIF = 2; + private static final int MONOSPACE = 3; + + private Drawable mThumbDrawable; + private Drawable mTrackDrawable; + private int mThumbTextPadding; + private int mSwitchMinWidth; + private int mSwitchPadding; + private boolean mSplitTrack; + private CharSequence mTextOn; + private CharSequence mTextOff; + private boolean mShowText; + + private int mTouchMode; + private int mTouchSlop; + private float mTouchX; + private float mTouchY; + private VelocityTracker mVelocityTracker = VelocityTracker.obtain(); + private int mMinFlingVelocity; + + private float mThumbPosition; + + /** + * Width required to draw the switch track and thumb. Includes padding and + * optical bounds for both the track and thumb. + */ + private int mSwitchWidth; + + /** + * Height required to draw the switch track and thumb. Includes padding and + * optical bounds for both the track and thumb. + */ + private int mSwitchHeight; + + /** + * Width of the thumb's content region. Does not include padding or + * optical bounds. + */ + private int mThumbWidth; + + /** Left bound for drawing the switch track and thumb. */ + private int mSwitchLeft; + + /** Top bound for drawing the switch track and thumb. */ + private int mSwitchTop; + + /** Right bound for drawing the switch track and thumb. */ + private int mSwitchRight; + + /** Bottom bound for drawing the switch track and thumb. */ + private int mSwitchBottom; + + private TextPaint mTextPaint; + private ColorStateList mTextColors; + private Layout mOnLayout; + private Layout mOffLayout; + private TransformationMethod mSwitchTransformationMethod; + private Animation mPositionAnimator; + + @SuppressWarnings("hiding") + private final Rect mTempRect = new Rect(); + + private final TintManager mTintManager; + + private static final int[] CHECKED_STATE_SET = { + android.R.attr.state_checked + }; + + /** + * Construct a new Switch with default styling. + * + * @param context The Context that will determine this widget's theming. + */ + public SwitchCompat(Context context) { + this(context, null); + } + + /** + * Construct a new Switch with default styling, overriding specific style + * attributes as requested. + * + * @param context The Context that will determine this widget's theming. + * @param attrs Specification of attributes that should deviate from default styling. + */ + public SwitchCompat(Context context, AttributeSet attrs) { + this(context, attrs, R.attr.switchStyle); + } + + /** + * Construct a new Switch with a default style determined by the given theme attribute, + * overriding specific style attributes as requested. + * + * @param context The Context that will determine this widget's theming. + * @param attrs Specification of attributes that should deviate from the default styling. + * @param defStyleAttr An attribute in the current theme that contains a + * reference to a style resource that supplies default values for + * the view. Can be 0 to not look for defaults. + */ + public SwitchCompat(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + mTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); + + final Resources res = getResources(); + mTextPaint.density = res.getDisplayMetrics().density; + + final TintTypedArray a = TintTypedArray.obtainStyledAttributes(context, + attrs, R.styleable.SwitchCompat, defStyleAttr, 0); + mThumbDrawable = a.getDrawable(R.styleable.SwitchCompat_android_thumb); + if (mThumbDrawable != null) { + mThumbDrawable.setCallback(this); + } + mTrackDrawable = a.getDrawable(R.styleable.SwitchCompat_track); + if (mTrackDrawable != null) { + mTrackDrawable.setCallback(this); + } + mTextOn = a.getText(R.styleable.SwitchCompat_android_textOn); + mTextOff = a.getText(R.styleable.SwitchCompat_android_textOff); + mShowText = a.getBoolean(R.styleable.SwitchCompat_showText, true); + mThumbTextPadding = a.getDimensionPixelSize( + R.styleable.SwitchCompat_thumbTextPadding, 0); + mSwitchMinWidth = a.getDimensionPixelSize( + R.styleable.SwitchCompat_switchMinWidth, 0); + mSwitchPadding = a.getDimensionPixelSize( + R.styleable.SwitchCompat_switchPadding, 0); + mSplitTrack = a.getBoolean(R.styleable.SwitchCompat_splitTrack, false); + + final int appearance = a.getResourceId( + R.styleable.SwitchCompat_switchTextAppearance, 0); + if (appearance != 0) { + setSwitchTextAppearance(context, appearance); + } + + mTintManager = a.getTintManager(); + + a.recycle(); + + final ViewConfiguration config = ViewConfiguration.get(context); + mTouchSlop = config.getScaledTouchSlop(); + mMinFlingVelocity = config.getScaledMinimumFlingVelocity(); + + // Refresh display with current params + refreshDrawableState(); + setChecked(isChecked()); + } + + /** + * Sets the switch text color, size, style, hint color, and highlight color + * from the specified TextAppearance resource. + */ + 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 { + // If no color set in TextAppearance, default to the view's textColor + 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_textAllCaps, false); + if (allCaps) { + mSwitchTransformationMethod = new AllCapsTransformationMethod(getContext()); + } else { + mSwitchTransformationMethod = null; + } + + appearance.recycle(); + } + + 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); + } + + /** + * Sets the typeface and style in which the text should be displayed on the + * switch, and turns on the fake bold and italic bits in the Paint if the + * Typeface that you provided does not have all the bits in the + * style that you specified. + */ + 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); + // now compute what (if any) algorithmic styling is needed + 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); + } + } + + /** + * Sets the typeface in which the text should be displayed on the switch. + * Note that not all Typeface families actually have bold and italic + * variants, so you may need to use + * {@link #setSwitchTypeface(Typeface, int)} to get the appearance + * that you actually want. + */ + public void setSwitchTypeface(Typeface tf) { + if (mTextPaint.getTypeface() != tf) { + mTextPaint.setTypeface(tf); + + requestLayout(); + invalidate(); + } + } + + /** + * Set the amount of horizontal padding between the switch and the associated text. + * + * @param pixels Amount of padding in pixels + */ + public void setSwitchPadding(int pixels) { + mSwitchPadding = pixels; + requestLayout(); + } + + /** + * Get the amount of horizontal padding between the switch and the associated text. + * + * @return Amount of padding in pixels + */ + public int getSwitchPadding() { + return mSwitchPadding; + } + + /** + * Set the minimum width of the switch in pixels. The switch's width will be the maximum + * of this value and its measured width as determined by the switch drawables and text used. + * + * @param pixels Minimum width of the switch in pixels + */ + public void setSwitchMinWidth(int pixels) { + mSwitchMinWidth = pixels; + requestLayout(); + } + + /** + * Get the minimum width of the switch in pixels. The switch's width will be the maximum + * of this value and its measured width as determined by the switch drawables and text used. + * + * @return Minimum width of the switch in pixels + */ + public int getSwitchMinWidth() { + return mSwitchMinWidth; + } + + /** + * Set the horizontal padding around the text drawn on the switch itself. + * + * @param pixels Horizontal padding for switch thumb text in pixels + */ + public void setThumbTextPadding(int pixels) { + mThumbTextPadding = pixels; + requestLayout(); + } + + /** + * Get the horizontal padding around the text drawn on the switch itself. + * + * @return Horizontal padding for switch thumb text in pixels + */ + public int getThumbTextPadding() { + return mThumbTextPadding; + } + + /** + * Set the drawable used for the track that the switch slides within. + * + * @param track Track drawable + */ + public void setTrackDrawable(Drawable track) { + mTrackDrawable = track; + requestLayout(); + } + + /** + * Set the drawable used for the track that the switch slides within. + * + * @param resId Resource ID of a track drawable + */ + public void setTrackResource(int resId) { + setTrackDrawable(mTintManager.getDrawable(resId)); + } + + /** + * Get the drawable used for the track that the switch slides within. + * + * @return Track drawable + */ + public Drawable getTrackDrawable() { + return mTrackDrawable; + } + + /** + * Set the drawable used for the switch "thumb" - the piece that the user + * can physically touch and drag along the track. + * + * @param thumb Thumb drawable + */ + public void setThumbDrawable(Drawable thumb) { + mThumbDrawable = thumb; + requestLayout(); + } + + /** + * Set the drawable used for the switch "thumb" - the piece that the user + * can physically touch and drag along the track. + * + * @param resId Resource ID of a thumb drawable + */ + public void setThumbResource(int resId) { + setThumbDrawable(mTintManager.getDrawable(resId)); + } + + /** + * Get the drawable used for the switch "thumb" - the piece that the user + * can physically touch and drag along the track. + * + * @return Thumb drawable + */ + public Drawable getThumbDrawable() { + return mThumbDrawable; + } + + /** + * Specifies whether the track should be split by the thumb. When true, + * the thumb's optical bounds will be clipped out of the track drawable, + * then the thumb will be drawn into the resulting gap. + * + * @param splitTrack Whether the track should be split by the thumb + */ + public void setSplitTrack(boolean splitTrack) { + mSplitTrack = splitTrack; + invalidate(); + } + + /** + * Returns whether the track should be split by the thumb. + */ + public boolean getSplitTrack() { + return mSplitTrack; + } + + /** + * Returns the text displayed when the button is in the checked state. + */ + public CharSequence getTextOn() { + return mTextOn; + } + + /** + * Sets the text displayed when the button is in the checked state. + */ + public void setTextOn(CharSequence textOn) { + mTextOn = textOn; + requestLayout(); + } + + /** + * Returns the text displayed when the button is not in the checked state. + */ + public CharSequence getTextOff() { + return mTextOff; + } + + /** + * Sets the text displayed when the button is not in the checked state. + */ + public void setTextOff(CharSequence textOff) { + mTextOff = textOff; + requestLayout(); + } + + /** + * Sets whether the on/off text should be displayed. + * + * @param showText {@code true} to display on/off text + */ + public void setShowText(boolean showText) { + if (mShowText != showText) { + mShowText = showText; + requestLayout(); + } + } + + /** + * @return whether the on/off text should be displayed + */ + public boolean getShowText() { + return mShowText; + } + + @Override + public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + if (mShowText) { + if (mOnLayout == null) { + mOnLayout = makeLayout(mTextOn); + } + + if (mOffLayout == null) { + mOffLayout = makeLayout(mTextOff); + } + } + + final Rect padding = mTempRect; + final int thumbWidth; + final int thumbHeight; + if (mThumbDrawable != null) { + // Cached thumb width does not include padding. + mThumbDrawable.getPadding(padding); + thumbWidth = mThumbDrawable.getIntrinsicWidth() - padding.left - padding.right; + thumbHeight = mThumbDrawable.getIntrinsicHeight(); + } else { + thumbWidth = 0; + thumbHeight = 0; + } + + final int maxTextWidth; + if (mShowText) { + maxTextWidth = Math.max(mOnLayout.getWidth(), mOffLayout.getWidth()) + + mThumbTextPadding * 2; + } else { + maxTextWidth = 0; + } + + mThumbWidth = Math.max(maxTextWidth, thumbWidth); + + final int trackHeight; + if (mTrackDrawable != null) { + mTrackDrawable.getPadding(padding); + trackHeight = mTrackDrawable.getIntrinsicHeight(); + } else { + padding.setEmpty(); + trackHeight = 0; + } + + // Adjust left and right padding to ensure there's enough room for the + // thumb's padding (when present). + int paddingLeft = padding.left; + int paddingRight = padding.right; + if (mThumbDrawable != null) { + final Rect inset = DrawableUtils.getOpticalBounds(mThumbDrawable); + paddingLeft = Math.max(paddingLeft, inset.left); + paddingRight = Math.max(paddingRight, inset.right); + } + + final int switchWidth = Math.max(mSwitchMinWidth, + 2 * mThumbWidth + paddingLeft + paddingRight); + final int switchHeight = Math.max(trackHeight, thumbHeight); + mSwitchWidth = switchWidth; + mSwitchHeight = switchHeight; + + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + + final int measuredHeight = getMeasuredHeight(); + if (measuredHeight < switchHeight) { + setMeasuredDimension(ViewCompat.getMeasuredWidthAndState(this), switchHeight); + } + } + + @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) + @Override + public void onPopulateAccessibilityEvent(AccessibilityEvent event) { + super.onPopulateAccessibilityEvent(event); + + final CharSequence text = isChecked() ? mTextOn : mTextOff; + if (text != null) { + event.getText().add(text); + } + } + + private Layout makeLayout(CharSequence text) { + final CharSequence transformed = (mSwitchTransformationMethod != null) + ? mSwitchTransformationMethod.getTransformation(text, this) + : text; + + return new StaticLayout(transformed, mTextPaint, + transformed != null ? + (int) Math.ceil(Layout.getDesiredWidth(transformed, mTextPaint)) : 0, + Layout.Alignment.ALIGN_NORMAL, 1.f, 0, true); + } + + /** + * @return true if (x, y) is within the target area of the switch thumb + */ + private boolean hitThumb(float x, float y) { + if (mThumbDrawable == null) { + return false; + } + + // Relies on mTempRect, MUST be called first! + final int thumbOffset = getThumbOffset(); + + mThumbDrawable.getPadding(mTempRect); + final int thumbTop = mSwitchTop - mTouchSlop; + final int thumbLeft = mSwitchLeft + thumbOffset - 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; + } + + @Override + public boolean onTouchEvent(MotionEvent ev) { + mVelocityTracker.addMovement(ev); + final int action = MotionEventCompat.getActionMasked(ev); + switch (action) { + 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; + } + break; + } + + case MotionEvent.ACTION_MOVE: { + switch (mTouchMode) { + case TOUCH_MODE_IDLE: + // Didn't target the thumb, treat normally. + 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 int thumbScrollRange = getThumbScrollRange(); + final float thumbScrollOffset = x - mTouchX; + float dPos; + if (thumbScrollRange != 0) { + dPos = thumbScrollOffset / thumbScrollRange; + } else { + // If the thumb scroll range is empty, just use the + // movement direction to snap on or off. + dPos = thumbScrollOffset > 0 ? 1 : -1; + } + if (ViewUtils.isLayoutRtl(this)) { + dPos = -dPos; + } + final float newPos = constrain(mThumbPosition + dPos, 0, 1); + if (newPos != mThumbPosition) { + mTouchX = x; + setThumbPosition(newPos); + } + return true; + } + } + break; + } + + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: { + if (mTouchMode == TOUCH_MODE_DRAGGING) { + stopDrag(ev); + // Allow super class to handle pressed state, etc. + super.onTouchEvent(ev); + return true; + } + mTouchMode = TOUCH_MODE_IDLE; + mVelocityTracker.clear(); + break; + } + } + + return super.onTouchEvent(ev); + } + + private void cancelSuperTouch(MotionEvent ev) { + MotionEvent cancel = MotionEvent.obtain(ev); + cancel.setAction(MotionEvent.ACTION_CANCEL); + super.onTouchEvent(cancel); + cancel.recycle(); + } + + /** + * Called from onTouchEvent to end a drag operation. + * + * @param ev Event that triggered the end of drag mode - ACTION_UP or ACTION_CANCEL + */ + private void stopDrag(MotionEvent ev) { + mTouchMode = TOUCH_MODE_IDLE; + + // Commit the change if the event is up and not canceled and the switch + // has not been disabled during the drag. + final boolean commitChange = ev.getAction() == MotionEvent.ACTION_UP && isEnabled(); + final boolean oldState = isChecked(); + final boolean newState; + if (commitChange) { + mVelocityTracker.computeCurrentVelocity(1000); + final float xvel = mVelocityTracker.getXVelocity(); + if (Math.abs(xvel) > mMinFlingVelocity) { + newState = ViewUtils.isLayoutRtl(this) ? (xvel < 0) : (xvel > 0); + } else { + newState = getTargetCheckedState(); + } + } else { + newState = oldState; + } + + if (newState != oldState) { + playSoundEffect(SoundEffectConstants.CLICK); + setChecked(newState); + } + cancelSuperTouch(ev); + } + + private void animateThumbToCheckedState(boolean newCheckedState) { + final float startPosition = mThumbPosition; + final float targetPosition = newCheckedState ? 1 : 0; + final float diff = targetPosition - startPosition; + + mPositionAnimator = new Animation() { + @Override + protected void applyTransformation(float interpolatedTime, Transformation t) { + setThumbPosition(startPosition + (diff * interpolatedTime)); + } + }; + mPositionAnimator.setDuration(THUMB_ANIMATION_DURATION); + startAnimation(mPositionAnimator); + } + + private void cancelPositionAnimator() { + if (mPositionAnimator != null) { + clearAnimation(); + mPositionAnimator = null; + } + } + + private boolean getTargetCheckedState() { + return mThumbPosition > 0.5f; + } + + /** + * Sets the thumb position as a decimal value between 0 (off) and 1 (on). + * + * @param position new position between [0,1] + */ + private void setThumbPosition(float position) { + mThumbPosition = position; + invalidate(); + } + + @Override + public void toggle() { + setChecked(!isChecked()); + } + + @Override + public void setChecked(boolean checked) { + super.setChecked(checked); + + // Calling the super method may result in setChecked() getting called + // recursively with a different value, so load the REAL value... + checked = isChecked(); + + if (getWindowToken() != null && ViewCompat.isLaidOut(this)) { + animateThumbToCheckedState(checked); + } else { + // Immediately move the thumb to the new position. + cancelPositionAnimator(); + setThumbPosition(checked ? 1 : 0); + } + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); + + int opticalInsetLeft = 0; + int opticalInsetRight = 0; + if (mThumbDrawable != null) { + final Rect trackPadding = mTempRect; + if (mTrackDrawable != null) { + mTrackDrawable.getPadding(trackPadding); + } else { + trackPadding.setEmpty(); + } + + final Rect insets = DrawableUtils.getOpticalBounds(mThumbDrawable); + opticalInsetLeft = Math.max(0, insets.left - trackPadding.left); + opticalInsetRight = Math.max(0, insets.right - trackPadding.right); + } + + final int switchRight; + final int switchLeft; + if (ViewUtils.isLayoutRtl(this)) { + switchLeft = getPaddingLeft() + opticalInsetLeft; + switchRight = switchLeft + mSwitchWidth - opticalInsetLeft - opticalInsetRight; + } else { + switchRight = getWidth() - getPaddingRight() - opticalInsetRight; + switchLeft = switchRight - mSwitchWidth + opticalInsetLeft + opticalInsetRight; + } + + final int switchTop; + final int switchBottom; + 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 draw(Canvas c) { + final Rect padding = mTempRect; + final int switchLeft = mSwitchLeft; + final int switchTop = mSwitchTop; + final int switchRight = mSwitchRight; + final int switchBottom = mSwitchBottom; + + int thumbInitialLeft = switchLeft + getThumbOffset(); + + final Rect thumbInsets; + if (mThumbDrawable != null) { + thumbInsets = DrawableUtils.getOpticalBounds(mThumbDrawable); + } else { + thumbInsets = DrawableUtils.INSETS_NONE; + } + + // Layout the track. + if (mTrackDrawable != null) { + mTrackDrawable.getPadding(padding); + + // Adjust thumb position for track padding. + thumbInitialLeft += padding.left; + + // If necessary, offset by the optical insets of the thumb asset. + int trackLeft = switchLeft; + int trackTop = switchTop; + int trackRight = switchRight; + int trackBottom = switchBottom; + if (thumbInsets != null && !thumbInsets.isEmpty()) { + if (thumbInsets.left > padding.left) { + trackLeft += thumbInsets.left - padding.left; + } + if (thumbInsets.top > padding.top) { + trackTop += thumbInsets.top - padding.top; + } + if (thumbInsets.right > padding.right) { + trackRight -= thumbInsets.right - padding.right; + } + if (thumbInsets.bottom > padding.bottom) { + trackBottom -= thumbInsets.bottom - padding.bottom; + } + } + mTrackDrawable.setBounds(trackLeft, trackTop, trackRight, trackBottom); + } + + // Layout the thumb. + if (mThumbDrawable != null) { + mThumbDrawable.getPadding(padding); + + final int thumbLeft = thumbInitialLeft - padding.left; + final int thumbRight = thumbInitialLeft + mThumbWidth + padding.right; + mThumbDrawable.setBounds(thumbLeft, switchTop, thumbRight, switchBottom); + + final Drawable background = getBackground(); + if (background != null) { + DrawableCompat.setHotspotBounds(background, thumbLeft, switchTop, + thumbRight, switchBottom); + } + } + + // Draw the background. + super.draw(c); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + + final Rect padding = mTempRect; + final Drawable trackDrawable = mTrackDrawable; + if (trackDrawable != null) { + trackDrawable.getPadding(padding); + } else { + padding.setEmpty(); + } + + final int switchTop = mSwitchTop; + final int switchBottom = mSwitchBottom; + final int switchInnerTop = switchTop + padding.top; + final int switchInnerBottom = switchBottom - padding.bottom; + + final Drawable thumbDrawable = mThumbDrawable; + if (trackDrawable != null) { + if (mSplitTrack && thumbDrawable != null) { + final Rect insets = DrawableUtils.getOpticalBounds(thumbDrawable); + thumbDrawable.copyBounds(padding); + padding.left += insets.left; + padding.right -= insets.right; + + final int saveCount = canvas.save(); + canvas.clipRect(padding, Region.Op.DIFFERENCE); + trackDrawable.draw(canvas); + canvas.restoreToCount(saveCount); + } else { + trackDrawable.draw(canvas); + } + } + + final int saveCount = canvas.save(); + + if (thumbDrawable != null) { + thumbDrawable.draw(canvas); + } + + final Layout switchText = getTargetCheckedState() ? mOnLayout : mOffLayout; + if (switchText != null) { + final int drawableState[] = getDrawableState(); + if (mTextColors != null) { + mTextPaint.setColor(mTextColors.getColorForState(drawableState, 0)); + } + mTextPaint.drawableState = drawableState; + + final int cX; + if (thumbDrawable != null) { + final Rect bounds = thumbDrawable.getBounds(); + cX = bounds.left + bounds.right; + } else { + cX = getWidth(); + } + + final int left = cX / 2 - switchText.getWidth() / 2; + final int top = (switchInnerTop + switchInnerBottom) / 2 - switchText.getHeight() / 2; + canvas.translate(left, top); + switchText.draw(canvas); + } + + canvas.restoreToCount(saveCount); + } + + @Override + public int getCompoundPaddingLeft() { + if (!ViewUtils.isLayoutRtl(this)) { + return super.getCompoundPaddingLeft(); + } + int padding = super.getCompoundPaddingLeft() + mSwitchWidth; + if (!TextUtils.isEmpty(getText())) { + padding += mSwitchPadding; + } + return padding; + } + + @Override + public int getCompoundPaddingRight() { + if (ViewUtils.isLayoutRtl(this)) { + return super.getCompoundPaddingRight(); + } + int padding = super.getCompoundPaddingRight() + mSwitchWidth; + if (!TextUtils.isEmpty(getText())) { + padding += mSwitchPadding; + } + return padding; + } + + /** + * Translates thumb position to offset according to current RTL setting and + * thumb scroll range. Accounts for both track and thumb padding. + * + * @return thumb offset + */ + private int getThumbOffset() { + final float thumbPosition; + if (ViewUtils.isLayoutRtl(this)) { + thumbPosition = 1 - mThumbPosition; + } else { + thumbPosition = mThumbPosition; + } + return (int) (thumbPosition * getThumbScrollRange() + 0.5f); + } + + private int getThumbScrollRange() { + if (mTrackDrawable != null) { + final Rect padding = mTempRect; + mTrackDrawable.getPadding(padding); + + final Rect insets; + if (mThumbDrawable != null) { + insets = DrawableUtils.getOpticalBounds(mThumbDrawable); + } else { + insets = DrawableUtils.INSETS_NONE; + } + + return mSwitchWidth - mThumbWidth - padding.left - padding.right + - insets.left - insets.right; + } else { + return 0; + } + } + + @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 drawableStateChanged() { + super.drawableStateChanged(); + + final int[] myDrawableState = getDrawableState(); + + if (mThumbDrawable != null) { + mThumbDrawable.setState(myDrawableState); + } + + if (mTrackDrawable != null) { + mTrackDrawable.setState(myDrawableState); + } + + invalidate(); + } + + @Override + public void drawableHotspotChanged(float x, float y) { + if (Build.VERSION.SDK_INT >= 21) { + super.drawableHotspotChanged(x, y); + } + + if (mThumbDrawable != null) { + DrawableCompat.setHotspot(mThumbDrawable, x, y); + } + + if (mTrackDrawable != null) { + DrawableCompat.setHotspot(mTrackDrawable, x, y); + } + } + + @Override + protected boolean verifyDrawable(Drawable who) { + return super.verifyDrawable(who) || who == mThumbDrawable || who == mTrackDrawable; + } + + @Override + public void jumpDrawablesToCurrentState() { + if (Build.VERSION.SDK_INT >= 11) { + super.jumpDrawablesToCurrentState(); + + if (mThumbDrawable != null) { + mThumbDrawable.jumpToCurrentState(); + } + + if (mTrackDrawable != null) { + mTrackDrawable.jumpToCurrentState(); + } + + if (mPositionAnimator != null && !mPositionAnimator.hasEnded()) { + clearAnimation(); + mPositionAnimator = null; + } + } + } + + @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) + @Override + public void onInitializeAccessibilityEvent(AccessibilityEvent event) { + super.onInitializeAccessibilityEvent(event); + event.setClassName(ACCESSIBILITY_EVENT_CLASS_NAME); + } + + @Override + public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { + if (Build.VERSION.SDK_INT >= 14) { + super.onInitializeAccessibilityNodeInfo(info); + info.setClassName(ACCESSIBILITY_EVENT_CLASS_NAME); + 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); + } + } + } + } + + /** + * Taken from android.util.MathUtils + */ + private static float constrain(float amount, float low, float high) { + return amount < low ? low : (amount > high ? high : amount); + } +} \ No newline at end of file diff --git a/eclipse-compile/appcompat/src/android/support/v7/widget/Toolbar.java b/eclipse-compile/appcompat/src/android/support/v7/widget/Toolbar.java new file mode 100644 index 0000000000..fd7b328e61 --- /dev/null +++ b/eclipse-compile/appcompat/src/android/support/v7/widget/Toolbar.java @@ -0,0 +1,2028 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.widget; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.os.Parcel; +import android.os.Parcelable; +import android.support.annotation.Nullable; +import android.support.v4.view.GravityCompat; +import android.support.v4.view.MarginLayoutParamsCompat; +import android.support.v4.view.MenuItemCompat; +import android.support.v4.view.MotionEventCompat; +import android.support.v4.view.ViewCompat; +import android.support.v7.app.ActionBar; +import android.support.v7.appcompat.R; +import android.support.v7.internal.view.SupportMenuInflater; +import android.support.v7.internal.view.menu.MenuBuilder; +import android.support.v7.internal.view.menu.MenuItemImpl; +import android.support.v7.internal.view.menu.MenuPresenter; +import android.support.v7.internal.view.menu.MenuView; +import android.support.v7.internal.view.menu.SubMenuBuilder; +import android.support.v7.internal.widget.DecorToolbar; +import android.support.v7.internal.widget.RtlSpacingHelper; +import android.support.v7.internal.widget.TintManager; +import android.support.v7.internal.widget.TintTypedArray; +import android.support.v7.internal.widget.ToolbarWidgetWrapper; +import android.support.v7.internal.widget.ViewUtils; +import android.support.v7.view.CollapsibleActionView; +import android.text.Layout; +import android.text.TextUtils; +import android.util.AttributeSet; +import android.view.ContextThemeWrapper; +import android.view.Gravity; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageButton; +import android.widget.ImageView; +import android.widget.TextView; + +import java.util.ArrayList; +import java.util.List; + +/** + * A standard toolbar for use within application content. + * + *

      A Toolbar is a generalization of {@link ActionBar action bars} for use + * within application layouts. While an action bar is traditionally part of an + * {@link android.app.Activity Activity's} opaque window decor controlled by the framework, + * a Toolbar may be placed at any arbitrary level of nesting within a view hierarchy. + * An application may choose to designate a Toolbar as the action bar for an Activity + * using the {@link android.support.v7.app.AppCompatActivity#setSupportActionBar(Toolbar) + * setSupportActionBar()} method.

      + * + *

      Toolbar supports a more focused feature set than ActionBar. From start to end, a toolbar + * may contain a combination of the following optional elements: + * + *

        + *
      • A navigation button. This may be an Up arrow, navigation menu toggle, close, + * collapse, done or another glyph of the app's choosing. This button should always be used + * to access other navigational destinations within the container of the Toolbar and + * its signified content or otherwise leave the current context signified by the Toolbar.
      • + *
      • A branded logo image. This may extend to the height of the bar and can be + * arbitrarily wide.
      • + *
      • A title and subtitle. The title should be a signpost for the Toolbar's current + * position in the navigation hierarchy and the content contained there. The subtitle, + * if present should indicate any extended information about the current content. + * If an app uses a logo image it should strongly consider omitting a title and subtitle.
      • + *
      • One or more custom views. The application may add arbitrary child views + * to the Toolbar. They will appear at this position within the layout. If a child view's + * {@link LayoutParams} indicates a {@link Gravity} value of + * {@link Gravity#CENTER_HORIZONTAL CENTER_HORIZONTAL} the view will attempt to center + * within the available space remaining in the Toolbar after all other elements have been + * measured.
      • + *
      • An {@link ActionMenuView action menu}. The menu of actions will pin to the + * end of the Toolbar offering a few + * + * frequent, important or typical actions along with an optional overflow menu for + * additional actions.
      • + *
      + *

      + * + *

      In modern Android UIs developers should lean more on a visually distinct color scheme for + * toolbars than on their application icon. The use of application icon plus title as a standard + * layout is discouraged on API 21 devices and newer.

      + */ +public class Toolbar extends ViewGroup { + private static final String TAG = "Toolbar"; + + private ActionMenuView mMenuView; + private TextView mTitleTextView; + private TextView mSubtitleTextView; + private ImageButton mNavButtonView; + private ImageView mLogoView; + + private Drawable mCollapseIcon; + private CharSequence mCollapseDescription; + private ImageButton mCollapseButtonView; + View mExpandedActionView; + + /** Context against which to inflate popup menus. */ + private Context mPopupContext; + + /** Theme resource against which to inflate popup menus. */ + private int mPopupTheme; + + private int mTitleTextAppearance; + private int mSubtitleTextAppearance; + + private int mButtonGravity; + + private int mMaxButtonHeight; + + private int mTitleMarginStart; + private int mTitleMarginEnd; + private int mTitleMarginTop; + private int mTitleMarginBottom; + + private final RtlSpacingHelper mContentInsets = new RtlSpacingHelper(); + + private int mGravity = GravityCompat.START | Gravity.CENTER_VERTICAL; + + private CharSequence mTitleText; + private CharSequence mSubtitleText; + + private int mTitleTextColor; + private int mSubtitleTextColor; + + private boolean mEatingTouch; + private boolean mEatingHover; + + // Clear me after use. + private final ArrayList mTempViews = new ArrayList(); + + private final int[] mTempMargins = new int[2]; + + private OnMenuItemClickListener mOnMenuItemClickListener; + + private final ActionMenuView.OnMenuItemClickListener mMenuViewItemClickListener = + new ActionMenuView.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + if (mOnMenuItemClickListener != null) { + return mOnMenuItemClickListener.onMenuItemClick(item); + } + return false; + } + }; + + private ToolbarWidgetWrapper mWrapper; + private ActionMenuPresenter mOuterActionMenuPresenter; + private ExpandedActionViewMenuPresenter mExpandedMenuPresenter; + private MenuPresenter.Callback mActionMenuPresenterCallback; + private MenuBuilder.Callback mMenuBuilderCallback; + + private boolean mCollapsible; + private int mMinHeight; + + private final Runnable mShowOverflowMenuRunnable = new Runnable() { + @Override public void run() { + showOverflowMenu(); + } + }; + + private final TintManager mTintManager; + + public Toolbar(Context context) { + this(context, null); + } + + public Toolbar(Context context, AttributeSet attrs) { + this(context, attrs, R.attr.toolbarStyle); + } + + public Toolbar(Context context, AttributeSet attrs, int defStyleAttr) { + // We manually themify the context here so that we don't break apps which only + // use app:theme when running on >= Lollipop + super(ViewUtils.themifyContext(context, attrs, false, true), attrs, defStyleAttr); + + // Need to use getContext() here so that we use the themed context + final TintTypedArray a = TintTypedArray.obtainStyledAttributes(getContext(), attrs, + R.styleable.Toolbar, defStyleAttr, 0); + + mTitleTextAppearance = a.getResourceId(R.styleable.Toolbar_titleTextAppearance, 0); + mSubtitleTextAppearance = a.getResourceId(R.styleable.Toolbar_subtitleTextAppearance, 0); + mGravity = a.getInteger(R.styleable.Toolbar_android_gravity, mGravity); + mButtonGravity = Gravity.TOP; + mTitleMarginStart = mTitleMarginEnd = mTitleMarginTop = mTitleMarginBottom = + a.getDimensionPixelOffset(R.styleable.Toolbar_titleMargins, 0); + + final int marginStart = a.getDimensionPixelOffset(R.styleable.Toolbar_titleMarginStart, -1); + if (marginStart >= 0) { + mTitleMarginStart = marginStart; + } + + final int marginEnd = a.getDimensionPixelOffset(R.styleable.Toolbar_titleMarginEnd, -1); + if (marginEnd >= 0) { + mTitleMarginEnd = marginEnd; + } + + final int marginTop = a.getDimensionPixelOffset(R.styleable.Toolbar_titleMarginTop, -1); + if (marginTop >= 0) { + mTitleMarginTop = marginTop; + } + + final int marginBottom = a.getDimensionPixelOffset(R.styleable.Toolbar_titleMarginBottom, + -1); + if (marginBottom >= 0) { + mTitleMarginBottom = marginBottom; + } + + mMaxButtonHeight = a.getDimensionPixelSize(R.styleable.Toolbar_maxButtonHeight, -1); + + final int contentInsetStart = + a.getDimensionPixelOffset(R.styleable.Toolbar_contentInsetStart, + RtlSpacingHelper.UNDEFINED); + final int contentInsetEnd = + a.getDimensionPixelOffset(R.styleable.Toolbar_contentInsetEnd, + RtlSpacingHelper.UNDEFINED); + final int contentInsetLeft = + a.getDimensionPixelSize(R.styleable.Toolbar_contentInsetLeft, 0); + final int contentInsetRight = + a.getDimensionPixelSize(R.styleable.Toolbar_contentInsetRight, 0); + + mContentInsets.setAbsolute(contentInsetLeft, contentInsetRight); + + if (contentInsetStart != RtlSpacingHelper.UNDEFINED || + contentInsetEnd != RtlSpacingHelper.UNDEFINED) { + mContentInsets.setRelative(contentInsetStart, contentInsetEnd); + } + + mCollapseIcon = a.getDrawable(R.styleable.Toolbar_collapseIcon); + mCollapseDescription = a.getText(R.styleable.Toolbar_collapseContentDescription); + + final CharSequence title = a.getText(R.styleable.Toolbar_title); + if (!TextUtils.isEmpty(title)) { + setTitle(title); + } + + final CharSequence subtitle = a.getText(R.styleable.Toolbar_subtitle); + if (!TextUtils.isEmpty(subtitle)) { + setSubtitle(subtitle); + } + // Set the default context, since setPopupTheme() may be a no-op. + mPopupContext = getContext(); + setPopupTheme(a.getResourceId(R.styleable.Toolbar_popupTheme, 0)); + + final Drawable navIcon = a.getDrawable(R.styleable.Toolbar_navigationIcon); + if (navIcon != null) { + setNavigationIcon(navIcon); + } + final CharSequence navDesc = a.getText(R.styleable.Toolbar_navigationContentDescription); + if (!TextUtils.isEmpty(navDesc)) { + setNavigationContentDescription(navDesc); + } + + // This is read for devices running pre-v16 + mMinHeight = a.getDimensionPixelSize(R.styleable.Toolbar_android_minHeight, 0); + + a.recycle(); + + // Keep the TintManager in case we need it later + mTintManager = a.getTintManager(); + } + + /** + * Specifies the theme to use when inflating popup menus. By default, uses + * the same theme as the toolbar itself. + * + * @param resId theme used to inflate popup menus + * @see #getPopupTheme() + */ + public void setPopupTheme(int resId) { + if (mPopupTheme != resId) { + mPopupTheme = resId; + if (resId == 0) { + mPopupContext = getContext(); + } else { + mPopupContext = new ContextThemeWrapper(getContext(), resId); + } + } + } + + /** + * @return resource identifier of the theme used to inflate popup menus, or + * 0 if menus are inflated against the toolbar theme + * @see #setPopupTheme(int) + */ + public int getPopupTheme() { + return mPopupTheme; + } + + public void onRtlPropertiesChanged(int layoutDirection) { + if (Build.VERSION.SDK_INT >= 17) { + super.onRtlPropertiesChanged(layoutDirection); + } + mContentInsets.setDirection(layoutDirection == ViewCompat.LAYOUT_DIRECTION_RTL); + } + + /** + * Set a logo drawable from a resource id. + * + *

      This drawable should generally take the place of title text. The logo cannot be + * clicked. Apps using a logo should also supply a description using + * {@link #setLogoDescription(int)}.

      + * + * @param resId ID of a drawable resource + */ + public void setLogo(int resId) { + setLogo(mTintManager.getDrawable(resId)); + } + + /** @hide */ + public boolean canShowOverflowMenu() { + return getVisibility() == VISIBLE && mMenuView != null && mMenuView.isOverflowReserved(); + } + + /** + * Check whether the overflow menu is currently showing. This may not reflect + * a pending show operation in progress. + * + * @return true if the overflow menu is currently showing + */ + public boolean isOverflowMenuShowing() { + return mMenuView != null && mMenuView.isOverflowMenuShowing(); + } + + /** @hide */ + public boolean isOverflowMenuShowPending() { + return mMenuView != null && mMenuView.isOverflowMenuShowPending(); + } + + /** + * Show the overflow items from the associated menu. + * + * @return true if the menu was able to be shown, false otherwise + */ + public boolean showOverflowMenu() { + return mMenuView != null && mMenuView.showOverflowMenu(); + } + + /** + * Hide the overflow items from the associated menu. + * + * @return true if the menu was able to be hidden, false otherwise + */ + public boolean hideOverflowMenu() { + return mMenuView != null && mMenuView.hideOverflowMenu(); + } + + /** @hide */ + public void setMenu(MenuBuilder menu, ActionMenuPresenter outerPresenter) { + if (menu == null && mMenuView == null) { + return; + } + + ensureMenuView(); + final MenuBuilder oldMenu = mMenuView.peekMenu(); + if (oldMenu == menu) { + return; + } + + if (oldMenu != null) { + oldMenu.removeMenuPresenter(mOuterActionMenuPresenter); + oldMenu.removeMenuPresenter(mExpandedMenuPresenter); + } + + if (mExpandedMenuPresenter == null) { + mExpandedMenuPresenter = new ExpandedActionViewMenuPresenter(); + } + + outerPresenter.setExpandedActionViewsExclusive(true); + if (menu != null) { + menu.addMenuPresenter(outerPresenter, mPopupContext); + menu.addMenuPresenter(mExpandedMenuPresenter, mPopupContext); + } else { + outerPresenter.initForMenu(mPopupContext, null); + mExpandedMenuPresenter.initForMenu(mPopupContext, null); + outerPresenter.updateMenuView(true); + mExpandedMenuPresenter.updateMenuView(true); + } + mMenuView.setPopupTheme(mPopupTheme); + mMenuView.setPresenter(outerPresenter); + mOuterActionMenuPresenter = outerPresenter; + } + + /** + * Dismiss all currently showing popup menus, including overflow or submenus. + */ + public void dismissPopupMenus() { + if (mMenuView != null) { + mMenuView.dismissPopupMenus(); + } + } + + /** @hide */ + public boolean isTitleTruncated() { + if (mTitleTextView == null) { + return false; + } + + final Layout titleLayout = mTitleTextView.getLayout(); + if (titleLayout == null) { + return false; + } + + final int lineCount = titleLayout.getLineCount(); + for (int i = 0; i < lineCount; i++) { + if (titleLayout.getEllipsisCount(i) > 0) { + return true; + } + } + return false; + } + + /** + * Set a logo drawable. + * + *

      This drawable should generally take the place of title text. The logo cannot be + * clicked. Apps using a logo should also supply a description using + * {@link #setLogoDescription(int)}.

      + * + * @param drawable Drawable to use as a logo + */ + public void setLogo(Drawable drawable) { + if (drawable != null) { + ensureLogoView(); + if (mLogoView.getParent() == null) { + addSystemView(mLogoView); + updateChildVisibilityForExpandedActionView(mLogoView); + } + } else if (mLogoView != null && mLogoView.getParent() != null) { + removeView(mLogoView); + } + if (mLogoView != null) { + mLogoView.setImageDrawable(drawable); + } + } + + /** + * Return the current logo drawable. + * + * @return The current logo drawable + * @see #setLogo(int) + * @see #setLogo(android.graphics.drawable.Drawable) + */ + public Drawable getLogo() { + return mLogoView != null ? mLogoView.getDrawable() : null; + } + + /** + * Set a description of the toolbar's logo. + * + *

      This description will be used for accessibility or other similar descriptions + * of the UI.

      + * + * @param resId String resource id + */ + public void setLogoDescription(int resId) { + setLogoDescription(getContext().getText(resId)); + } + + /** + * Set a description of the toolbar's logo. + * + *

      This description will be used for accessibility or other similar descriptions + * of the UI.

      + * + * @param description Description to set + */ + public void setLogoDescription(CharSequence description) { + if (!TextUtils.isEmpty(description)) { + ensureLogoView(); + } + if (mLogoView != null) { + mLogoView.setContentDescription(description); + } + } + + /** + * Return the description of the toolbar's logo. + * + * @return A description of the logo + */ + public CharSequence getLogoDescription() { + return mLogoView != null ? mLogoView.getContentDescription() : null; + } + + private void ensureLogoView() { + if (mLogoView == null) { + mLogoView = new ImageView(getContext()); + } + } + + /** + * Check whether this Toolbar is currently hosting an expanded action view. + * + *

      An action view may be expanded either directly from the + * {@link android.view.MenuItem MenuItem} it belongs to or by user action. If the Toolbar + * has an expanded action view it can be collapsed using the {@link #collapseActionView()} + * method.

      + * + * @return true if the Toolbar has an expanded action view + */ + public boolean hasExpandedActionView() { + return mExpandedMenuPresenter != null && + mExpandedMenuPresenter.mCurrentExpandedItem != null; + } + + /** + * Collapse a currently expanded action view. If this Toolbar does not have an + * expanded action view this method has no effect. + * + *

      An action view may be expanded either directly from the + * {@link android.view.MenuItem MenuItem} it belongs to or by user action.

      + * + * @see #hasExpandedActionView() + */ + public void collapseActionView() { + final MenuItemImpl item = mExpandedMenuPresenter == null ? null : + mExpandedMenuPresenter.mCurrentExpandedItem; + if (item != null) { + item.collapseActionView(); + } + } + + /** + * Returns the title of this toolbar. + * + * @return The current title. + */ + public CharSequence getTitle() { + return mTitleText; + } + + /** + * Set the title of this toolbar. + * + *

      A title should be used as the anchor for a section of content. It should + * describe or name the content being viewed.

      + * + * @param resId Resource ID of a string to set as the title + */ + public void setTitle(int resId) { + setTitle(getContext().getText(resId)); + } + + /** + * Set the title of this toolbar. + * + *

      A title should be used as the anchor for a section of content. It should + * describe or name the content being viewed.

      + * + * @param title Title to set + */ + public void setTitle(CharSequence title) { + if (!TextUtils.isEmpty(title)) { + if (mTitleTextView == null) { + final Context context = getContext(); + mTitleTextView = new TextView(context); + mTitleTextView.setSingleLine(); + mTitleTextView.setEllipsize(TextUtils.TruncateAt.END); + if (mTitleTextAppearance != 0) { + mTitleTextView.setTextAppearance(context, mTitleTextAppearance); + } + if (mTitleTextColor != 0) { + mTitleTextView.setTextColor(mTitleTextColor); + } + } + if (mTitleTextView.getParent() == null) { + addSystemView(mTitleTextView); + updateChildVisibilityForExpandedActionView(mTitleTextView); + } + } else if (mTitleTextView != null && mTitleTextView.getParent() != null) { + removeView(mTitleTextView); + } + if (mTitleTextView != null) { + mTitleTextView.setText(title); + } + mTitleText = title; + } + + /** + * Return the subtitle of this toolbar. + * + * @return The current subtitle + */ + public CharSequence getSubtitle() { + return mSubtitleText; + } + + /** + * Set the subtitle of this toolbar. + * + *

      Subtitles should express extended information about the current content.

      + * + * @param resId String resource ID + */ + public void setSubtitle(int resId) { + setSubtitle(getContext().getText(resId)); + } + + /** + * Set the subtitle of this toolbar. + * + *

      Subtitles should express extended information about the current content.

      + * + * @param subtitle Subtitle to set + */ + public void setSubtitle(CharSequence subtitle) { + if (!TextUtils.isEmpty(subtitle)) { + if (mSubtitleTextView == null) { + final Context context = getContext(); + mSubtitleTextView = new TextView(context); + mSubtitleTextView.setSingleLine(); + mSubtitleTextView.setEllipsize(TextUtils.TruncateAt.END); + if (mSubtitleTextAppearance != 0) { + mSubtitleTextView.setTextAppearance(context, mSubtitleTextAppearance); + } + if (mSubtitleTextColor != 0) { + mSubtitleTextView.setTextColor(mSubtitleTextColor); + } + } + if (mSubtitleTextView.getParent() == null) { + addSystemView(mSubtitleTextView); + updateChildVisibilityForExpandedActionView(mSubtitleTextView); + } + } else if (mSubtitleTextView != null && mSubtitleTextView.getParent() != null) { + removeView(mSubtitleTextView); + } + if (mSubtitleTextView != null) { + mSubtitleTextView.setText(subtitle); + } + mSubtitleText = subtitle; + } + + /** + * Sets the text color, size, style, hint color, and highlight color + * from the specified TextAppearance resource. + */ + public void setTitleTextAppearance(Context context, int resId) { + mTitleTextAppearance = resId; + if (mTitleTextView != null) { + mTitleTextView.setTextAppearance(context, resId); + } + } + + /** + * Sets the text color, size, style, hint color, and highlight color + * from the specified TextAppearance resource. + */ + public void setSubtitleTextAppearance(Context context, int resId) { + mSubtitleTextAppearance = resId; + if (mSubtitleTextView != null) { + mSubtitleTextView.setTextAppearance(context, resId); + } + } + + /** + * Sets the text color of the title, if present. + * + * @param color The new text color in 0xAARRGGBB format + */ + public void setTitleTextColor(int color) { + mTitleTextColor = color; + if (mTitleTextView != null) { + mTitleTextView.setTextColor(color); + } + } + + /** + * Sets the text color of the subtitle, if present. + * + * @param color The new text color in 0xAARRGGBB format + */ + public void setSubtitleTextColor(int color) { + mSubtitleTextColor = color; + if (mSubtitleTextView != null) { + mSubtitleTextView.setTextColor(color); + } + } + + /** + * Retrieve the currently configured content description for the navigation button view. + * This will be used to describe the navigation action to users through mechanisms such + * as screen readers or tooltips. + * + * @return The navigation button's content description + */ + @Nullable + public CharSequence getNavigationContentDescription() { + return mNavButtonView != null ? mNavButtonView.getContentDescription() : null; + } + + /** + * Set a content description for the navigation button if one is present. The content + * description will be read via screen readers or other accessibility systems to explain + * the action of the navigation button. + * + * @param resId Resource ID of a content description string to set, or 0 to + * clear the description + */ + public void setNavigationContentDescription(int resId) { + setNavigationContentDescription(resId != 0 ? getContext().getText(resId) : null); + } + + /** + * Set a content description for the navigation button if one is present. The content + * description will be read via screen readers or other accessibility systems to explain + * the action of the navigation button. + * + * @param description Content description to set, or null to + * clear the content description + */ + public void setNavigationContentDescription(@Nullable CharSequence description) { + if (!TextUtils.isEmpty(description)) { + ensureNavButtonView(); + } + if (mNavButtonView != null) { + mNavButtonView.setContentDescription(description); + } + } + + /** + * Set the icon to use for the toolbar's navigation button. + * + *

      The navigation button appears at the start of the toolbar if present. Setting an icon + * will make the navigation button visible.

      + * + *

      If you use a navigation icon you should also set a description for its action using + * {@link #setNavigationContentDescription(int)}. This is used for accessibility and + * tooltips.

      + * + * @param resId Resource ID of a drawable to set + */ + public void setNavigationIcon(int resId) { + setNavigationIcon(mTintManager.getDrawable(resId)); + } + + /** + * Set the icon to use for the toolbar's navigation button. + * + *

      The navigation button appears at the start of the toolbar if present. Setting an icon + * will make the navigation button visible.

      + * + *

      If you use a navigation icon you should also set a description for its action using + * {@link #setNavigationContentDescription(int)}. This is used for accessibility and + * tooltips.

      + * + * @param icon Drawable to set, may be null to clear the icon + */ + public void setNavigationIcon(@Nullable Drawable icon) { + if (icon != null) { + ensureNavButtonView(); + if (mNavButtonView.getParent() == null) { + addSystemView(mNavButtonView); + updateChildVisibilityForExpandedActionView(mNavButtonView); + } + } else if (mNavButtonView != null && mNavButtonView.getParent() != null) { + removeView(mNavButtonView); + } + if (mNavButtonView != null) { + mNavButtonView.setImageDrawable(icon); + } + } + + /** + * Return the current drawable used as the navigation icon. + * + * @return The navigation icon drawable + */ + @Nullable + public Drawable getNavigationIcon() { + return mNavButtonView != null ? mNavButtonView.getDrawable() : null; + } + + /** + * Set a listener to respond to navigation events. + * + *

      This listener will be called whenever the user clicks the navigation button + * at the start of the toolbar. An icon must be set for the navigation button to appear.

      + * + * @param listener Listener to set + * @see #setNavigationIcon(android.graphics.drawable.Drawable) + */ + public void setNavigationOnClickListener(OnClickListener listener) { + ensureNavButtonView(); + mNavButtonView.setOnClickListener(listener); + } + + /** + * Return the Menu shown in the toolbar. + * + *

      Applications that wish to populate the toolbar's menu can do so from here. To use + * an XML menu resource, use {@link #inflateMenu(int)}.

      + * + * @return The toolbar's Menu + */ + public Menu getMenu() { + ensureMenu(); + return mMenuView.getMenu(); + } + + private void ensureMenu() { + ensureMenuView(); + if (mMenuView.peekMenu() == null) { + // Initialize a new menu for the first time. + final MenuBuilder menu = (MenuBuilder) mMenuView.getMenu(); + if (mExpandedMenuPresenter == null) { + mExpandedMenuPresenter = new ExpandedActionViewMenuPresenter(); + } + mMenuView.setExpandedActionViewsExclusive(true); + menu.addMenuPresenter(mExpandedMenuPresenter, mPopupContext); + } + } + + private void ensureMenuView() { + if (mMenuView == null) { + mMenuView = new ActionMenuView(getContext()); + mMenuView.setPopupTheme(mPopupTheme); + mMenuView.setOnMenuItemClickListener(mMenuViewItemClickListener); + mMenuView.setMenuCallbacks(mActionMenuPresenterCallback, mMenuBuilderCallback); + final LayoutParams lp = generateDefaultLayoutParams(); + lp.gravity = GravityCompat.END | (mButtonGravity & Gravity.VERTICAL_GRAVITY_MASK); + mMenuView.setLayoutParams(lp); + addSystemView(mMenuView); + } + } + + private MenuInflater getMenuInflater() { + return new SupportMenuInflater(getContext()); + } + + /** + * Inflate a menu resource into this toolbar. + * + *

      Inflate an XML menu resource into this toolbar. Existing items in the menu will not + * be modified or removed.

      + * + * @param resId ID of a menu resource to inflate + */ + public void inflateMenu(int resId) { + getMenuInflater().inflate(resId, getMenu()); + } + + /** + * Set a listener to respond to menu item click events. + * + *

      This listener will be invoked whenever a user selects a menu item from + * the action buttons presented at the end of the toolbar or the associated overflow.

      + * + * @param listener Listener to set + */ + public void setOnMenuItemClickListener(OnMenuItemClickListener listener) { + mOnMenuItemClickListener = listener; + } + + /** + * Set the content insets for this toolbar relative to layout direction. + * + *

      The content inset affects the valid area for Toolbar content other than + * the navigation button and menu. Insets define the minimum margin for these components + * and can be used to effectively align Toolbar content along well-known gridlines.

      + * + * @param contentInsetStart Content inset for the toolbar starting edge + * @param contentInsetEnd Content inset for the toolbar ending edge + * + * @see #setContentInsetsAbsolute(int, int) + * @see #getContentInsetStart() + * @see #getContentInsetEnd() + * @see #getContentInsetLeft() + * @see #getContentInsetRight() + */ + public void setContentInsetsRelative(int contentInsetStart, int contentInsetEnd) { + mContentInsets.setRelative(contentInsetStart, contentInsetEnd); + } + + /** + * Get the starting content inset for this toolbar. + * + *

      The content inset affects the valid area for Toolbar content other than + * the navigation button and menu. Insets define the minimum margin for these components + * and can be used to effectively align Toolbar content along well-known gridlines.

      + * + * @return The starting content inset for this toolbar + * + * @see #setContentInsetsRelative(int, int) + * @see #setContentInsetsAbsolute(int, int) + * @see #getContentInsetEnd() + * @see #getContentInsetLeft() + * @see #getContentInsetRight() + */ + public int getContentInsetStart() { + return mContentInsets.getStart(); + } + + /** + * Get the ending content inset for this toolbar. + * + *

      The content inset affects the valid area for Toolbar content other than + * the navigation button and menu. Insets define the minimum margin for these components + * and can be used to effectively align Toolbar content along well-known gridlines.

      + * + * @return The ending content inset for this toolbar + * + * @see #setContentInsetsRelative(int, int) + * @see #setContentInsetsAbsolute(int, int) + * @see #getContentInsetStart() + * @see #getContentInsetLeft() + * @see #getContentInsetRight() + */ + public int getContentInsetEnd() { + return mContentInsets.getEnd(); + } + + /** + * Set the content insets for this toolbar. + * + *

      The content inset affects the valid area for Toolbar content other than + * the navigation button and menu. Insets define the minimum margin for these components + * and can be used to effectively align Toolbar content along well-known gridlines.

      + * + * @param contentInsetLeft Content inset for the toolbar's left edge + * @param contentInsetRight Content inset for the toolbar's right edge + * + * @see #setContentInsetsAbsolute(int, int) + * @see #getContentInsetStart() + * @see #getContentInsetEnd() + * @see #getContentInsetLeft() + * @see #getContentInsetRight() + */ + public void setContentInsetsAbsolute(int contentInsetLeft, int contentInsetRight) { + mContentInsets.setAbsolute(contentInsetLeft, contentInsetRight); + } + + /** + * Get the left content inset for this toolbar. + * + *

      The content inset affects the valid area for Toolbar content other than + * the navigation button and menu. Insets define the minimum margin for these components + * and can be used to effectively align Toolbar content along well-known gridlines.

      + * + * @return The left content inset for this toolbar + * + * @see #setContentInsetsRelative(int, int) + * @see #setContentInsetsAbsolute(int, int) + * @see #getContentInsetStart() + * @see #getContentInsetEnd() + * @see #getContentInsetRight() + */ + public int getContentInsetLeft() { + return mContentInsets.getLeft(); + } + + /** + * Get the right content inset for this toolbar. + * + *

      The content inset affects the valid area for Toolbar content other than + * the navigation button and menu. Insets define the minimum margin for these components + * and can be used to effectively align Toolbar content along well-known gridlines.

      + * + * @return The right content inset for this toolbar + * + * @see #setContentInsetsRelative(int, int) + * @see #setContentInsetsAbsolute(int, int) + * @see #getContentInsetStart() + * @see #getContentInsetEnd() + * @see #getContentInsetLeft() + */ + public int getContentInsetRight() { + return mContentInsets.getRight(); + } + + private void ensureNavButtonView() { + if (mNavButtonView == null) { + mNavButtonView = new ImageButton(getContext(), null, + R.attr.toolbarNavigationButtonStyle); + final LayoutParams lp = generateDefaultLayoutParams(); + lp.gravity = GravityCompat.START | (mButtonGravity & Gravity.VERTICAL_GRAVITY_MASK); + mNavButtonView.setLayoutParams(lp); + } + } + + private void ensureCollapseButtonView() { + if (mCollapseButtonView == null) { + mCollapseButtonView = new ImageButton(getContext(), null, + R.attr.toolbarNavigationButtonStyle); + mCollapseButtonView.setImageDrawable(mCollapseIcon); + mCollapseButtonView.setContentDescription(mCollapseDescription); + final LayoutParams lp = generateDefaultLayoutParams(); + lp.gravity = GravityCompat.START | (mButtonGravity & Gravity.VERTICAL_GRAVITY_MASK); + lp.mViewType = LayoutParams.EXPANDED; + mCollapseButtonView.setLayoutParams(lp); + mCollapseButtonView.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + collapseActionView(); + } + }); + } + } + + private void addSystemView(View v) { + final ViewGroup.LayoutParams vlp = v.getLayoutParams(); + final LayoutParams lp; + if (vlp == null) { + lp = generateDefaultLayoutParams(); + } else if (!checkLayoutParams(vlp)) { + lp = generateLayoutParams(vlp); + } else { + lp = (LayoutParams) vlp; + } + lp.mViewType = LayoutParams.SYSTEM; + addView(v, lp); + } + + @Override + protected Parcelable onSaveInstanceState() { + SavedState state = new SavedState(super.onSaveInstanceState()); + + if (mExpandedMenuPresenter != null && mExpandedMenuPresenter.mCurrentExpandedItem != null) { + state.expandedMenuItemId = mExpandedMenuPresenter.mCurrentExpandedItem.getItemId(); + } + + state.isOverflowOpen = isOverflowMenuShowing(); + return state; + } + + @Override + protected void onRestoreInstanceState(Parcelable state) { + final SavedState ss = (SavedState) state; + super.onRestoreInstanceState(ss.getSuperState()); + + final Menu menu = mMenuView != null ? mMenuView.peekMenu() : null; + if (ss.expandedMenuItemId != 0 && mExpandedMenuPresenter != null && menu != null) { + final MenuItem item = menu.findItem(ss.expandedMenuItemId); + if (item != null) { + MenuItemCompat.expandActionView(item); + } + } + + if (ss.isOverflowOpen) { + postShowOverflowMenu(); + } + } + + private void postShowOverflowMenu() { + removeCallbacks(mShowOverflowMenuRunnable); + post(mShowOverflowMenuRunnable); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + removeCallbacks(mShowOverflowMenuRunnable); + } + + @Override + public boolean onTouchEvent(MotionEvent ev) { + // Toolbars always eat touch events, but should still respect the touch event dispatch + // contract. If the normal View implementation doesn't want the events, we'll just silently + // eat the rest of the gesture without reporting the events to the default implementation + // since that's what it expects. + + final int action = MotionEventCompat.getActionMasked(ev); + if (action == MotionEvent.ACTION_DOWN) { + mEatingTouch = false; + } + + if (!mEatingTouch) { + final boolean handled = super.onTouchEvent(ev); + if (action == MotionEvent.ACTION_DOWN && !handled) { + mEatingTouch = true; + } + } + + if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) { + mEatingTouch = false; + } + + return true; + } + + @Override + public boolean onHoverEvent(MotionEvent ev) { + // Same deal as onTouchEvent() above. Eat all hover events, but still + // respect the touch event dispatch contract. + + final int action = MotionEventCompat.getActionMasked(ev); + if (action == MotionEvent.ACTION_HOVER_ENTER) { + mEatingHover = false; + } + + if (!mEatingHover) { + final boolean handled = super.onHoverEvent(ev); + if (action == MotionEvent.ACTION_HOVER_ENTER && !handled) { + mEatingHover = true; + } + } + + if (action == MotionEvent.ACTION_HOVER_EXIT || action == MotionEvent.ACTION_CANCEL) { + mEatingHover = false; + } + + return true; + } + + private void measureChildConstrained(View child, int parentWidthSpec, int widthUsed, + int parentHeightSpec, int heightUsed, int heightConstraint) { + final MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams(); + + int childWidthSpec = getChildMeasureSpec(parentWidthSpec, + getPaddingLeft() + getPaddingRight() + lp.leftMargin + lp.rightMargin + + widthUsed, lp.width); + int childHeightSpec = getChildMeasureSpec(parentHeightSpec, + getPaddingTop() + getPaddingBottom() + lp.topMargin + lp.bottomMargin + + heightUsed, lp.height); + + final int childHeightMode = MeasureSpec.getMode(childHeightSpec); + if (childHeightMode != MeasureSpec.EXACTLY && heightConstraint >= 0) { + final int size = childHeightMode != MeasureSpec.UNSPECIFIED ? + Math.min(MeasureSpec.getSize(childHeightSpec), heightConstraint) : + heightConstraint; + childHeightSpec = MeasureSpec.makeMeasureSpec(size, MeasureSpec.EXACTLY); + } + child.measure(childWidthSpec, childHeightSpec); + } + + /** + * Returns the width + uncollapsed margins + */ + private int measureChildCollapseMargins(View child, + int parentWidthMeasureSpec, int widthUsed, + int parentHeightMeasureSpec, int heightUsed, int[] collapsingMargins) { + final MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams(); + + final int leftDiff = lp.leftMargin - collapsingMargins[0]; + final int rightDiff = lp.rightMargin - collapsingMargins[1]; + final int leftMargin = Math.max(0, leftDiff); + final int rightMargin = Math.max(0, rightDiff); + final int hMargins = leftMargin + rightMargin; + collapsingMargins[0] = Math.max(0, -leftDiff); + collapsingMargins[1] = Math.max(0, -rightDiff); + + final int childWidthMeasureSpec = getChildMeasureSpec(parentWidthMeasureSpec, + getPaddingLeft() + getPaddingRight() + hMargins + widthUsed, lp.width); + final int childHeightMeasureSpec = getChildMeasureSpec(parentHeightMeasureSpec, + getPaddingTop() + getPaddingBottom() + lp.topMargin + lp.bottomMargin + + heightUsed, lp.height); + + child.measure(childWidthMeasureSpec, childHeightMeasureSpec); + return child.getMeasuredWidth() + hMargins; + } + + /** + * Returns true if the Toolbar is collapsible and has no child views with a measured size > 0. + */ + private boolean shouldCollapse() { + if (!mCollapsible) return false; + + final int childCount = getChildCount(); + for (int i = 0; i < childCount; i++) { + final View child = getChildAt(i); + if (shouldLayout(child) && child.getMeasuredWidth() > 0 && + child.getMeasuredHeight() > 0) { + return false; + } + } + return true; + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int width = 0; + int height = 0; + int childState = 0; + + final int[] collapsingMargins = mTempMargins; + final int marginStartIndex; + final int marginEndIndex; + if (ViewUtils.isLayoutRtl(this)) { + marginStartIndex = 1; + marginEndIndex = 0; + } else { + marginStartIndex = 0; + marginEndIndex = 1; + } + + // System views measure first. + + int navWidth = 0; + if (shouldLayout(mNavButtonView)) { + measureChildConstrained(mNavButtonView, widthMeasureSpec, width, heightMeasureSpec, 0, + mMaxButtonHeight); + navWidth = mNavButtonView.getMeasuredWidth() + getHorizontalMargins(mNavButtonView); + height = Math.max(height, mNavButtonView.getMeasuredHeight() + + getVerticalMargins(mNavButtonView)); + childState = ViewUtils.combineMeasuredStates(childState, + ViewCompat.getMeasuredState(mNavButtonView)); + } + + if (shouldLayout(mCollapseButtonView)) { + measureChildConstrained(mCollapseButtonView, widthMeasureSpec, width, + heightMeasureSpec, 0, mMaxButtonHeight); + navWidth = mCollapseButtonView.getMeasuredWidth() + + getHorizontalMargins(mCollapseButtonView); + height = Math.max(height, mCollapseButtonView.getMeasuredHeight() + + getVerticalMargins(mCollapseButtonView)); + childState = ViewUtils.combineMeasuredStates(childState, + ViewCompat.getMeasuredState(mCollapseButtonView)); + } + + final int contentInsetStart = getContentInsetStart(); + width += Math.max(contentInsetStart, navWidth); + collapsingMargins[marginStartIndex] = Math.max(0, contentInsetStart - navWidth); + + int menuWidth = 0; + if (shouldLayout(mMenuView)) { + measureChildConstrained(mMenuView, widthMeasureSpec, width, heightMeasureSpec, 0, + mMaxButtonHeight); + menuWidth = mMenuView.getMeasuredWidth() + getHorizontalMargins(mMenuView); + height = Math.max(height, mMenuView.getMeasuredHeight() + + getVerticalMargins(mMenuView)); + childState = ViewUtils.combineMeasuredStates(childState, + ViewCompat.getMeasuredState(mMenuView)); + } + + final int contentInsetEnd = getContentInsetEnd(); + width += Math.max(contentInsetEnd, menuWidth); + collapsingMargins[marginEndIndex] = Math.max(0, contentInsetEnd - menuWidth); + + if (shouldLayout(mExpandedActionView)) { + width += measureChildCollapseMargins(mExpandedActionView, widthMeasureSpec, width, + heightMeasureSpec, 0, collapsingMargins); + height = Math.max(height, mExpandedActionView.getMeasuredHeight() + + getVerticalMargins(mExpandedActionView)); + childState = ViewUtils.combineMeasuredStates(childState, + ViewCompat.getMeasuredState(mExpandedActionView)); + } + + if (shouldLayout(mLogoView)) { + width += measureChildCollapseMargins(mLogoView, widthMeasureSpec, width, + heightMeasureSpec, 0, collapsingMargins); + height = Math.max(height, mLogoView.getMeasuredHeight() + + getVerticalMargins(mLogoView)); + childState = ViewUtils.combineMeasuredStates(childState, + ViewCompat.getMeasuredState(mLogoView)); + } + + final int childCount = getChildCount(); + for (int i = 0; i < childCount; i++) { + final View child = getChildAt(i); + final LayoutParams lp = (LayoutParams) child.getLayoutParams(); + if (lp.mViewType != LayoutParams.CUSTOM || !shouldLayout(child)) { + // We already got all system views above. Skip them and GONE views. + continue; + } + + width += measureChildCollapseMargins(child, widthMeasureSpec, width, + heightMeasureSpec, 0, collapsingMargins); + height = Math.max(height, child.getMeasuredHeight() + getVerticalMargins(child)); + childState = ViewUtils.combineMeasuredStates(childState, + ViewCompat.getMeasuredState(child)); + } + + int titleWidth = 0; + int titleHeight = 0; + final int titleVertMargins = mTitleMarginTop + mTitleMarginBottom; + final int titleHorizMargins = mTitleMarginStart + mTitleMarginEnd; + if (shouldLayout(mTitleTextView)) { + titleWidth = measureChildCollapseMargins(mTitleTextView, widthMeasureSpec, + width + titleHorizMargins, heightMeasureSpec, titleVertMargins, + collapsingMargins); + titleWidth = mTitleTextView.getMeasuredWidth() + getHorizontalMargins(mTitleTextView); + titleHeight = mTitleTextView.getMeasuredHeight() + getVerticalMargins(mTitleTextView); + childState = ViewUtils.combineMeasuredStates(childState, + ViewCompat.getMeasuredState(mTitleTextView)); + } + if (shouldLayout(mSubtitleTextView)) { + titleWidth = Math.max(titleWidth, measureChildCollapseMargins(mSubtitleTextView, + widthMeasureSpec, width + titleHorizMargins, + heightMeasureSpec, titleHeight + titleVertMargins, + collapsingMargins)); + titleHeight += mSubtitleTextView.getMeasuredHeight() + + getVerticalMargins(mSubtitleTextView); + childState = ViewUtils.combineMeasuredStates(childState, + ViewCompat.getMeasuredState(mSubtitleTextView)); + } + + width += titleWidth; + height = Math.max(height, titleHeight); + + // Measurement already took padding into account for available space for the children, + // add it in for the final size. + width += getPaddingLeft() + getPaddingRight(); + height += getPaddingTop() + getPaddingBottom(); + + final int measuredWidth = ViewCompat.resolveSizeAndState( + Math.max(width, getSuggestedMinimumWidth()), + widthMeasureSpec, childState & ViewCompat.MEASURED_STATE_MASK); + final int measuredHeight = ViewCompat.resolveSizeAndState( + Math.max(height, getSuggestedMinimumHeight()), + heightMeasureSpec, childState << ViewCompat.MEASURED_HEIGHT_STATE_SHIFT); + + setMeasuredDimension(measuredWidth, shouldCollapse() ? 0 : measuredHeight); + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + final boolean isRtl = ViewCompat.getLayoutDirection(this) == ViewCompat.LAYOUT_DIRECTION_RTL; + final int width = getWidth(); + final int height = getHeight(); + final int paddingLeft = getPaddingLeft(); + final int paddingRight = getPaddingRight(); + final int paddingTop = getPaddingTop(); + final int paddingBottom = getPaddingBottom(); + int left = paddingLeft; + int right = width - paddingRight; + + final int[] collapsingMargins = mTempMargins; + collapsingMargins[0] = collapsingMargins[1] = 0; + + // Align views within the minimum toolbar height, if set. + final int alignmentHeight = getMinimumHeightCompat(); + + if (shouldLayout(mNavButtonView)) { + if (isRtl) { + right = layoutChildRight(mNavButtonView, right, collapsingMargins, + alignmentHeight); + } else { + left = layoutChildLeft(mNavButtonView, left, collapsingMargins, + alignmentHeight); + } + } + + if (shouldLayout(mCollapseButtonView)) { + if (isRtl) { + right = layoutChildRight(mCollapseButtonView, right, collapsingMargins, + alignmentHeight); + } else { + left = layoutChildLeft(mCollapseButtonView, left, collapsingMargins, + alignmentHeight); + } + } + + if (shouldLayout(mMenuView)) { + if (isRtl) { + left = layoutChildLeft(mMenuView, left, collapsingMargins, + alignmentHeight); + } else { + right = layoutChildRight(mMenuView, right, collapsingMargins, + alignmentHeight); + } + } + + collapsingMargins[0] = Math.max(0, getContentInsetLeft() - left); + collapsingMargins[1] = Math.max(0, getContentInsetRight() - (width - paddingRight - right)); + left = Math.max(left, getContentInsetLeft()); + right = Math.min(right, width - paddingRight - getContentInsetRight()); + + if (shouldLayout(mExpandedActionView)) { + if (isRtl) { + right = layoutChildRight(mExpandedActionView, right, collapsingMargins, + alignmentHeight); + } else { + left = layoutChildLeft(mExpandedActionView, left, collapsingMargins, + alignmentHeight); + } + } + + if (shouldLayout(mLogoView)) { + if (isRtl) { + right = layoutChildRight(mLogoView, right, collapsingMargins, + alignmentHeight); + } else { + left = layoutChildLeft(mLogoView, left, collapsingMargins, + alignmentHeight); + } + } + + final boolean layoutTitle = shouldLayout(mTitleTextView); + final boolean layoutSubtitle = shouldLayout(mSubtitleTextView); + int titleHeight = 0; + if (layoutTitle) { + final LayoutParams lp = (LayoutParams) mTitleTextView.getLayoutParams(); + titleHeight += lp.topMargin + mTitleTextView.getMeasuredHeight() + lp.bottomMargin; + } + if (layoutSubtitle) { + final LayoutParams lp = (LayoutParams) mSubtitleTextView.getLayoutParams(); + titleHeight += lp.topMargin + mSubtitleTextView.getMeasuredHeight() + lp.bottomMargin; + } + + if (layoutTitle || layoutSubtitle) { + int titleTop; + final View topChild = layoutTitle ? mTitleTextView : mSubtitleTextView; + final View bottomChild = layoutSubtitle ? mSubtitleTextView : mTitleTextView; + final LayoutParams toplp = (LayoutParams) topChild.getLayoutParams(); + final LayoutParams bottomlp = (LayoutParams) bottomChild.getLayoutParams(); + final boolean titleHasWidth = layoutTitle && mTitleTextView.getMeasuredWidth() > 0 + || layoutSubtitle && mSubtitleTextView.getMeasuredWidth() > 0; + + switch (mGravity & Gravity.VERTICAL_GRAVITY_MASK) { + case Gravity.TOP: + titleTop = getPaddingTop() + toplp.topMargin + mTitleMarginTop; + break; + default: + case Gravity.CENTER_VERTICAL: + final int space = height - paddingTop - paddingBottom; + int spaceAbove = (space - titleHeight) / 2; + if (spaceAbove < toplp.topMargin + mTitleMarginTop) { + spaceAbove = toplp.topMargin + mTitleMarginTop; + } else { + final int spaceBelow = height - paddingBottom - titleHeight - + spaceAbove - paddingTop; + if (spaceBelow < toplp.bottomMargin + mTitleMarginBottom) { + spaceAbove = Math.max(0, spaceAbove - + (bottomlp.bottomMargin + mTitleMarginBottom - spaceBelow)); + } + } + titleTop = paddingTop + spaceAbove; + break; + case Gravity.BOTTOM: + titleTop = height - paddingBottom - bottomlp.bottomMargin - mTitleMarginBottom - + titleHeight; + break; + } + if (isRtl) { + final int rd = (titleHasWidth ? mTitleMarginStart : 0) - collapsingMargins[1]; + right -= Math.max(0, rd); + collapsingMargins[1] = Math.max(0, -rd); + int titleRight = right; + int subtitleRight = right; + + if (layoutTitle) { + final LayoutParams lp = (LayoutParams) mTitleTextView.getLayoutParams(); + final int titleLeft = titleRight - mTitleTextView.getMeasuredWidth(); + final int titleBottom = titleTop + mTitleTextView.getMeasuredHeight(); + mTitleTextView.layout(titleLeft, titleTop, titleRight, titleBottom); + titleRight = titleLeft - mTitleMarginEnd; + titleTop = titleBottom + lp.bottomMargin; + } + if (layoutSubtitle) { + final LayoutParams lp = (LayoutParams) mSubtitleTextView.getLayoutParams(); + titleTop += lp.topMargin; + final int subtitleLeft = subtitleRight - mSubtitleTextView.getMeasuredWidth(); + final int subtitleBottom = titleTop + mSubtitleTextView.getMeasuredHeight(); + mSubtitleTextView.layout(subtitleLeft, titleTop, subtitleRight, subtitleBottom); + subtitleRight = subtitleRight - mTitleMarginEnd; + titleTop = subtitleBottom + lp.bottomMargin; + } + if (titleHasWidth) { + right = Math.min(titleRight, subtitleRight); + } + } else { + final int ld = (titleHasWidth ? mTitleMarginStart : 0) - collapsingMargins[0]; + left += Math.max(0, ld); + collapsingMargins[0] = Math.max(0, -ld); + int titleLeft = left; + int subtitleLeft = left; + + if (layoutTitle) { + final LayoutParams lp = (LayoutParams) mTitleTextView.getLayoutParams(); + final int titleRight = titleLeft + mTitleTextView.getMeasuredWidth(); + final int titleBottom = titleTop + mTitleTextView.getMeasuredHeight(); + mTitleTextView.layout(titleLeft, titleTop, titleRight, titleBottom); + titleLeft = titleRight + mTitleMarginEnd; + titleTop = titleBottom + lp.bottomMargin; + } + if (layoutSubtitle) { + final LayoutParams lp = (LayoutParams) mSubtitleTextView.getLayoutParams(); + titleTop += lp.topMargin; + final int subtitleRight = subtitleLeft + mSubtitleTextView.getMeasuredWidth(); + final int subtitleBottom = titleTop + mSubtitleTextView.getMeasuredHeight(); + mSubtitleTextView.layout(subtitleLeft, titleTop, subtitleRight, subtitleBottom); + subtitleLeft = subtitleRight + mTitleMarginEnd; + titleTop = subtitleBottom + lp.bottomMargin; + } + if (titleHasWidth) { + left = Math.max(titleLeft, subtitleLeft); + } + } + } + + // Get all remaining children sorted for layout. This is all prepared + // such that absolute layout direction can be used below. + + addCustomViewsWithGravity(mTempViews, Gravity.LEFT); + final int leftViewsCount = mTempViews.size(); + for (int i = 0; i < leftViewsCount; i++) { + left = layoutChildLeft(mTempViews.get(i), left, collapsingMargins, + alignmentHeight); + } + + addCustomViewsWithGravity(mTempViews, Gravity.RIGHT); + final int rightViewsCount = mTempViews.size(); + for (int i = 0; i < rightViewsCount; i++) { + right = layoutChildRight(mTempViews.get(i), right, collapsingMargins, + alignmentHeight); + } + + // Centered views try to center with respect to the whole bar, but views pinned + // to the left or right can push the mass of centered views to one side or the other. + addCustomViewsWithGravity(mTempViews, Gravity.CENTER_HORIZONTAL); + final int centerViewsWidth = getViewListMeasuredWidth(mTempViews, collapsingMargins); + final int parentCenter = paddingLeft + (width - paddingLeft - paddingRight) / 2; + final int halfCenterViewsWidth = centerViewsWidth / 2; + int centerLeft = parentCenter - halfCenterViewsWidth; + final int centerRight = centerLeft + centerViewsWidth; + if (centerLeft < left) { + centerLeft = left; + } else if (centerRight > right) { + centerLeft -= centerRight - right; + } + + final int centerViewsCount = mTempViews.size(); + for (int i = 0; i < centerViewsCount; i++) { + centerLeft = layoutChildLeft(mTempViews.get(i), centerLeft, collapsingMargins, + alignmentHeight); + } + + mTempViews.clear(); + } + + private int getViewListMeasuredWidth(List views, int[] collapsingMargins) { + int collapseLeft = collapsingMargins[0]; + int collapseRight = collapsingMargins[1]; + int width = 0; + final int count = views.size(); + for (int i = 0; i < count; i++) { + final View v = views.get(i); + final LayoutParams lp = (LayoutParams) v.getLayoutParams(); + final int l = lp.leftMargin - collapseLeft; + final int r = lp.rightMargin - collapseRight; + final int leftMargin = Math.max(0, l); + final int rightMargin = Math.max(0, r); + collapseLeft = Math.max(0, -l); + collapseRight = Math.max(0, -r); + width += leftMargin + v.getMeasuredWidth() + rightMargin; + } + return width; + } + + private int layoutChildLeft(View child, int left, int[] collapsingMargins, + int alignmentHeight) { + final LayoutParams lp = (LayoutParams) child.getLayoutParams(); + final int l = lp.leftMargin - collapsingMargins[0]; + left += Math.max(0, l); + collapsingMargins[0] = Math.max(0, -l); + final int top = getChildTop(child, alignmentHeight); + final int childWidth = child.getMeasuredWidth(); + child.layout(left, top, left + childWidth, top + child.getMeasuredHeight()); + left += childWidth + lp.rightMargin; + return left; + } + + private int layoutChildRight(View child, int right, int[] collapsingMargins, + int alignmentHeight) { + final LayoutParams lp = (LayoutParams) child.getLayoutParams(); + final int r = lp.rightMargin - collapsingMargins[1]; + right -= Math.max(0, r); + collapsingMargins[1] = Math.max(0, -r); + final int top = getChildTop(child, alignmentHeight); + final int childWidth = child.getMeasuredWidth(); + child.layout(right - childWidth, top, right, top + child.getMeasuredHeight()); + right -= childWidth + lp.leftMargin; + return right; + } + + private int getChildTop(View child, int alignmentHeight) { + final LayoutParams lp = (LayoutParams) child.getLayoutParams(); + final int childHeight = child.getMeasuredHeight(); + final int alignmentOffset = alignmentHeight > 0 ? (childHeight - alignmentHeight) / 2 : 0; + switch (getChildVerticalGravity(lp.gravity)) { + case Gravity.TOP: + return getPaddingTop() - alignmentOffset; + + case Gravity.BOTTOM: + return getHeight() - getPaddingBottom() - childHeight + - lp.bottomMargin - alignmentOffset; + + default: + case Gravity.CENTER_VERTICAL: + final int paddingTop = getPaddingTop(); + final int paddingBottom = getPaddingBottom(); + final int height = getHeight(); + final int space = height - paddingTop - paddingBottom; + int spaceAbove = (space - childHeight) / 2; + if (spaceAbove < lp.topMargin) { + spaceAbove = lp.topMargin; + } else { + final int spaceBelow = height - paddingBottom - childHeight - + spaceAbove - paddingTop; + if (spaceBelow < lp.bottomMargin) { + spaceAbove = Math.max(0, spaceAbove - (lp.bottomMargin - spaceBelow)); + } + } + return paddingTop + spaceAbove; + } + } + + private int getChildVerticalGravity(int gravity) { + final int vgrav = gravity & Gravity.VERTICAL_GRAVITY_MASK; + switch (vgrav) { + case Gravity.TOP: + case Gravity.BOTTOM: + case Gravity.CENTER_VERTICAL: + return vgrav; + default: + return mGravity & Gravity.VERTICAL_GRAVITY_MASK; + } + } + + /** + * Prepare a list of non-SYSTEM child views. If the layout direction is RTL + * this will be in reverse child order. + * + * @param views List to populate. It will be cleared before use. + * @param gravity Horizontal gravity to match against + */ + private void addCustomViewsWithGravity(List views, int gravity) { + final boolean isRtl = ViewCompat.getLayoutDirection(this) == ViewCompat.LAYOUT_DIRECTION_RTL; + final int childCount = getChildCount(); + final int absGrav = GravityCompat.getAbsoluteGravity(gravity, + ViewCompat.getLayoutDirection(this)); + + views.clear(); + + if (isRtl) { + for (int i = childCount - 1; i >= 0; i--) { + final View child = getChildAt(i); + final LayoutParams lp = (LayoutParams) child.getLayoutParams(); + if (lp.mViewType == LayoutParams.CUSTOM && shouldLayout(child) && + getChildHorizontalGravity(lp.gravity) == absGrav) { + views.add(child); + } + } + } else { + for (int i = 0; i < childCount; i++) { + final View child = getChildAt(i); + final LayoutParams lp = (LayoutParams) child.getLayoutParams(); + if (lp.mViewType == LayoutParams.CUSTOM && shouldLayout(child) && + getChildHorizontalGravity(lp.gravity) == absGrav) { + views.add(child); + } + } + } + } + + private int getChildHorizontalGravity(int gravity) { + final int ld = ViewCompat.getLayoutDirection(this); + final int absGrav = GravityCompat.getAbsoluteGravity(gravity, ld); + final int hGrav = absGrav & Gravity.HORIZONTAL_GRAVITY_MASK; + switch (hGrav) { + case Gravity.LEFT: + case Gravity.RIGHT: + case Gravity.CENTER_HORIZONTAL: + return hGrav; + default: + return ld == ViewCompat.LAYOUT_DIRECTION_RTL ? Gravity.RIGHT : Gravity.LEFT; + } + } + + private boolean shouldLayout(View view) { + return view != null && view.getParent() == this && view.getVisibility() != GONE; + } + + private int getHorizontalMargins(View v) { + final MarginLayoutParams mlp = (MarginLayoutParams) v.getLayoutParams(); + return MarginLayoutParamsCompat.getMarginStart(mlp) + + MarginLayoutParamsCompat.getMarginEnd(mlp); + } + + private int getVerticalMargins(View v) { + final MarginLayoutParams mlp = (MarginLayoutParams) v.getLayoutParams(); + return mlp.topMargin + mlp.bottomMargin; + } + + @Override + public LayoutParams generateLayoutParams(AttributeSet attrs) { + return new LayoutParams(getContext(), attrs); + } + + @Override + protected LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) { + if (p instanceof LayoutParams) { + return new LayoutParams((LayoutParams) p); + } else if (p instanceof ActionBar.LayoutParams) { + return new LayoutParams((ActionBar.LayoutParams) p); + } else if (p instanceof MarginLayoutParams) { + return new LayoutParams((MarginLayoutParams) p); + } else { + return new LayoutParams(p); + } + } + + @Override + protected LayoutParams generateDefaultLayoutParams() { + return new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); + } + + @Override + protected boolean checkLayoutParams(ViewGroup.LayoutParams p) { + return super.checkLayoutParams(p) && p instanceof LayoutParams; + } + + private static boolean isCustomView(View child) { + return ((LayoutParams) child.getLayoutParams()).mViewType == LayoutParams.CUSTOM; + } + + /** @hide */ + public DecorToolbar getWrapper() { + if (mWrapper == null) { + mWrapper = new ToolbarWidgetWrapper(this, true); + } + return mWrapper; + } + + private void setChildVisibilityForExpandedActionView(boolean expand) { + final int childCount = getChildCount(); + for (int i = 0; i < childCount; i++) { + final View child = getChildAt(i); + final LayoutParams lp = (LayoutParams) child.getLayoutParams(); + if (lp.mViewType != LayoutParams.EXPANDED && child != mMenuView) { + child.setVisibility(expand ? GONE : VISIBLE); + } + } + } + + private void updateChildVisibilityForExpandedActionView(View child) { + final LayoutParams lp = (LayoutParams) child.getLayoutParams(); + if (lp.mViewType != LayoutParams.EXPANDED && child != mMenuView) { + child.setVisibility(mExpandedActionView != null ? GONE : VISIBLE); + } + } + + /** + * Force the toolbar to collapse to zero-height during measurement if + * it could be considered "empty" (no visible elements with nonzero measured size) + * @hide + */ + public void setCollapsible(boolean collapsible) { + mCollapsible = collapsible; + requestLayout(); + } + + /** + * Must be called before the menu is accessed + * @hide + */ + public void setMenuCallbacks(MenuPresenter.Callback pcb, MenuBuilder.Callback mcb) { + mActionMenuPresenterCallback = pcb; + mMenuBuilderCallback = mcb; + } + + @Override + public void setMinimumHeight(int minHeight) { + // Update our locally kept value + mMinHeight = minHeight; + + super.setMinimumHeight(minHeight); + } + + private int getMinimumHeightCompat() { + if (Build.VERSION.SDK_INT >= 16) { + // If we're running on API 16 or newer, use the platform method + return ViewCompat.getMinimumHeight(this); + } else { + // Else we'll use our locally kept value + return mMinHeight; + } + } + + /** + * Interface responsible for receiving menu item click events if the items themselves + * do not have individual item click listeners. + */ + public interface OnMenuItemClickListener { + /** + * This method will be invoked when a menu item is clicked if the item itself did + * not already handle the event. + * + * @param item {@link MenuItem} that was clicked + * @return true if the event was handled, false otherwise. + */ + public boolean onMenuItemClick(MenuItem item); + } + + /** + * Layout information for child views of Toolbars. + * + *

      Toolbar.LayoutParams extends ActionBar.LayoutParams for compatibility with existing + * ActionBar API. See + * {@link android.support.v7.app.AppCompatActivity#setSupportActionBar(Toolbar) + * ActionBarActivity.setActionBar} + * for more info on how to use a Toolbar as your Activity's ActionBar.

      + */ + public static class LayoutParams extends ActionBar.LayoutParams { + static final int CUSTOM = 0; + static final int SYSTEM = 1; + static final int EXPANDED = 2; + + int mViewType = CUSTOM; + + public LayoutParams(Context c, AttributeSet attrs) { + super(c, attrs); + } + + public LayoutParams(int width, int height) { + super(width, height); + this.gravity = Gravity.CENTER_VERTICAL | GravityCompat.START; + } + + public LayoutParams(int width, int height, int gravity) { + super(width, height); + this.gravity = gravity; + } + + public LayoutParams(int gravity) { + this(WRAP_CONTENT, MATCH_PARENT, gravity); + } + + public LayoutParams(LayoutParams source) { + super(source); + + mViewType = source.mViewType; + } + + public LayoutParams(ActionBar.LayoutParams source) { + super(source); + } + + public LayoutParams(MarginLayoutParams source) { + super(source); + // ActionBar.LayoutParams doesn't have a MarginLayoutParams constructor. + // Fake it here and copy over the relevant data. + copyMarginsFromCompat(source); + } + + public LayoutParams(ViewGroup.LayoutParams source) { + super(source); + } + + void copyMarginsFromCompat(MarginLayoutParams source) { + this.leftMargin = source.leftMargin; + this.topMargin = source.topMargin; + this.rightMargin = source.rightMargin; + this.bottomMargin = source.bottomMargin; + } + } + + static class SavedState extends BaseSavedState { + public int expandedMenuItemId; + public boolean isOverflowOpen; + + public SavedState(Parcel source) { + super(source); + expandedMenuItemId = source.readInt(); + isOverflowOpen = source.readInt() != 0; + } + + public SavedState(Parcelable superState) { + super(superState); + } + + @Override + public void writeToParcel(Parcel out, int flags) { + super.writeToParcel(out, flags); + out.writeInt(expandedMenuItemId); + out.writeInt(isOverflowOpen ? 1 : 0); + } + + public static final Creator CREATOR = new Creator() { + + @Override + public SavedState createFromParcel(Parcel source) { + return new SavedState(source); + } + + @Override + public SavedState[] newArray(int size) { + return new SavedState[size]; + } + }; + } + + 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) { + ensureCollapseButtonView(); + if (mCollapseButtonView.getParent() != Toolbar.this) { + addView(mCollapseButtonView); + } + mExpandedActionView = item.getActionView(); + mCurrentExpandedItem = item; + if (mExpandedActionView.getParent() != Toolbar.this) { + final LayoutParams lp = generateDefaultLayoutParams(); + lp.gravity = GravityCompat.START | (mButtonGravity & Gravity.VERTICAL_GRAVITY_MASK); + lp.mViewType = LayoutParams.EXPANDED; + mExpandedActionView.setLayoutParams(lp); + addView(mExpandedActionView); + } + + setChildVisibilityForExpandedActionView(true); + 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(mCollapseButtonView); + mExpandedActionView = null; + + setChildVisibilityForExpandedActionView(false); + 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) { + } + } + +}

      Mq0V&cgT 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 diff --git a/OsmAnd/src/net/osmand/plus/Version.java b/OsmAnd/src/net/osmand/plus/Version.java index 2d709ee3cf..77e17b4aaf 100644 --- a/OsmAnd/src/net/osmand/plus/Version.java +++ b/OsmAnd/src/net/osmand/plus/Version.java @@ -96,8 +96,7 @@ public class Version { } public static boolean isDeveloperVersion(OsmandApplication ctx){ - return "osmand~".equalsIgnoreCase(getAppName(ctx)) || "osmand~f".equalsIgnoreCase(getAppName(ctx)) ; - + return getAppName(ctx).contains("~"); } public static String getVersionForTracker(OsmandApplication ctx) { diff --git a/android/support/v7/app/ActionBar.java b/android/support/v7/app/ActionBar.java new file mode 100644 index 0000000000..d48dd31772 --- /dev/null +++ b/android/support/v7/app/ActionBar.java @@ -0,0 +1,1358 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v7.app; + +import android.content.Context; +import android.content.res.Configuration; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.support.annotation.DrawableRes; +import android.support.annotation.IntDef; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.annotation.StringRes; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentTransaction; +import android.support.v4.view.GravityCompat; +import android.support.v7.appcompat.R; +import android.support.v7.view.ActionMode; +import android.util.AttributeSet; +import android.view.Gravity; +import android.view.KeyEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.widget.SpinnerAdapter; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * A primary toolbar within the activity that may display the activity title, application-level + * navigation affordances, and other interactive items. + * + *

  • %mY*QmAlQf7P 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