From 175254e652c4aef157df6e62378df8296d08b0a5 Mon Sep 17 00:00:00 2001 From: Sebastian Kaspari Date: Fri, 13 Mar 2015 17:03:56 +0100 Subject: [PATCH] Modify project to build using gradle. --- .gitignore | 7 + app/.gitignore | 1 + app/build.gradle | 29 + app/proguard-rules.pro | 17 + .../src/main}/AndroidManifest.xml | 0 .../main/java}/org/jibble/pircbot/Colors.java | 0 .../java}/org/jibble/pircbot/DccChat.java | 0 .../org/jibble/pircbot/DccFileTransfer.java | 0 .../java}/org/jibble/pircbot/DccManager.java | 0 .../java}/org/jibble/pircbot/IdentServer.java | 0 .../java}/org/jibble/pircbot/InputThread.java | 0 .../org/jibble/pircbot/IrcException.java | 0 .../pircbot/NickAlreadyInUseException.java | 0 .../org/jibble/pircbot/OutputThread.java | 0 .../java}/org/jibble/pircbot/PircBot.java | 0 .../main/java}/org/jibble/pircbot/Queue.java | 0 .../org/jibble/pircbot/ReplyConstants.java | 0 .../main/java}/org/jibble/pircbot/User.java | 0 .../src/main/java}/org/yaaic/Yaaic.java | 0 .../org/yaaic/activity/AboutActivity.java | 0 .../org/yaaic/activity/AddAliasActivity.java | 0 .../yaaic/activity/AddChannelActivity.java | 0 .../yaaic/activity/AddCommandsActivity.java | 0 .../org/yaaic/activity/AddServerActivity.java | 0 .../activity/AuthenticationActivity.java | 0 .../yaaic/activity/ConversationActivity.java | 0 .../org/yaaic/activity/JoinActivity.java | 0 .../org/yaaic/activity/MessageActivity.java | 0 .../org/yaaic/activity/ServersActivity.java | 0 .../org/yaaic/activity/SettingsActivity.java | 0 .../org/yaaic/activity/UserActivity.java | 0 .../org/yaaic/activity/UsersActivity.java | 0 .../adapter/ConversationPagerAdapter.java | 0 .../org/yaaic/adapter/MessageListAdapter.java | 0 .../org/yaaic/adapter/ServerListAdapter.java | 0 .../yaaic/adapter/UserActionListAdapter.java | 0 .../org/yaaic/adapter/ViewPagerAdapter.java | 0 .../java}/org/yaaic/command/BaseHandler.java | 0 .../org/yaaic/command/CommandParser.java | 0 .../yaaic/command/handler/AMsgHandler.java | 0 .../yaaic/command/handler/AwayHandler.java | 0 .../yaaic/command/handler/BackHandler.java | 0 .../yaaic/command/handler/CloseHandler.java | 0 .../org/yaaic/command/handler/DCCHandler.java | 0 .../yaaic/command/handler/DeopHandler.java | 0 .../yaaic/command/handler/DevoiceHandler.java | 0 .../yaaic/command/handler/EchoHandler.java | 0 .../yaaic/command/handler/HelpHandler.java | 0 .../yaaic/command/handler/JoinHandler.java | 0 .../yaaic/command/handler/KickHandler.java | 0 .../org/yaaic/command/handler/MeHandler.java | 0 .../yaaic/command/handler/ModeHandler.java | 0 .../org/yaaic/command/handler/MsgHandler.java | 0 .../yaaic/command/handler/NamesHandler.java | 0 .../yaaic/command/handler/NickHandler.java | 0 .../yaaic/command/handler/NoticeHandler.java | 0 .../org/yaaic/command/handler/OpHandler.java | 0 .../yaaic/command/handler/PartHandler.java | 0 .../yaaic/command/handler/QueryHandler.java | 0 .../yaaic/command/handler/QuitHandler.java | 0 .../org/yaaic/command/handler/RawHandler.java | 0 .../yaaic/command/handler/TopicHandler.java | 0 .../yaaic/command/handler/VoiceHandler.java | 0 .../yaaic/command/handler/WhoisHandler.java | 0 .../java}/org/yaaic/db/AliasConstants.java | 0 .../java}/org/yaaic/db/ChannelConstants.java | 0 .../java}/org/yaaic/db/CommandConstants.java | 0 .../src/main/java}/org/yaaic/db/Database.java | 0 .../java}/org/yaaic/db/IdentityConstants.java | 0 .../java}/org/yaaic/db/ServerConstants.java | 0 .../org/yaaic/exception/CommandException.java | 0 .../yaaic/exception/ValidationException.java | 0 .../indicator/ConversationIndicator.java | 0 .../indicator/ConversationStateProvider.java | 0 .../ConversationTitlePageIndicator.java | 0 .../main/java}/org/yaaic/irc/IRCBinder.java | 0 .../java}/org/yaaic/irc/IRCConnection.java | 0 .../main/java}/org/yaaic/irc/IRCService.java | 0 .../yaaic/listener/ConversationListener.java | 0 .../ConversationSelectedListener.java | 0 .../yaaic/listener/MessageClickListener.java | 0 .../org/yaaic/listener/ServerListener.java | 0 .../yaaic/listener/SpeechClickListener.java | 0 .../java}/org/yaaic/model/Authentication.java | 0 .../main/java}/org/yaaic/model/Broadcast.java | 0 .../main/java}/org/yaaic/model/Channel.java | 0 .../java}/org/yaaic/model/Conversation.java | 0 .../src/main/java}/org/yaaic/model/Extra.java | 0 .../main/java}/org/yaaic/model/Identity.java | 0 .../main/java}/org/yaaic/model/Message.java | 0 .../src/main/java}/org/yaaic/model/Query.java | 0 .../java}/org/yaaic/model/Scrollback.java | 0 .../main/java}/org/yaaic/model/Server.java | 0 .../java}/org/yaaic/model/ServerInfo.java | 0 .../main/java}/org/yaaic/model/Settings.java | 0 .../main/java}/org/yaaic/model/Status.java | 0 .../src/main/java}/org/yaaic/model/User.java | 0 .../yaaic/receiver/ConversationReceiver.java | 0 .../org/yaaic/receiver/ReconnectReceiver.java | 0 .../org/yaaic/receiver/ServerReceiver.java | 0 .../org/yaaic/ssl/NaiveTrustManager.java | 0 .../main/java}/org/yaaic/tools/Base64.java | 0 .../java}/org/yaaic/utils/DisplayUtils.java | 0 .../java}/org/yaaic/utils/MircColors.java | 0 .../main/java}/org/yaaic/utils/Smilies.java | 0 .../java}/org/yaaic/view/MessageListView.java | 0 .../main}/res/drawable-hdpi/actionbar_add.png | Bin .../res/drawable-hdpi/actionbar_save.png | Bin .../res/drawable-hdpi/actionbar_settings.png | Bin .../res/drawable-hdpi/actionbar_users.png | Bin .../src/main}/res/drawable-hdpi/icon.png | Bin .../textfield_activated_holo_dark.9.png | Bin .../textfield_default_holo_dark.9.png | Bin ...textfield_disabled_focused_holo_dark.9.png | Bin .../textfield_disabled_holo_dark.9.png | Bin .../textfield_focused_holo_dark.9.png | Bin .../main}/res/drawable-ldpi/actionbar_add.png | Bin .../res/drawable-ldpi/actionbar_save.png | Bin .../res/drawable-ldpi/actionbar_settings.png | Bin .../res/drawable-ldpi/actionbar_users.png | Bin .../src/main}/res/drawable-ldpi/icon.png | Bin .../src/main}/res/drawable-mdpi/action.png | Bin .../main}/res/drawable-mdpi/action_ban.png | Bin .../main}/res/drawable-mdpi/action_blank.png | Bin .../main}/res/drawable-mdpi/action_deop.png | Bin .../res/drawable-mdpi/action_devoice.png | Bin .../main}/res/drawable-mdpi/action_kick.png | Bin .../src/main}/res/drawable-mdpi/action_op.png | Bin .../main}/res/drawable-mdpi/action_query.png | Bin .../main}/res/drawable-mdpi/action_reply.png | Bin .../main}/res/drawable-mdpi/action_voice.png | Bin .../main}/res/drawable-mdpi/actionbar_add.png | Bin .../res/drawable-mdpi/actionbar_save.png | Bin .../res/drawable-mdpi/actionbar_settings.png | Bin .../res/drawable-mdpi/actionbar_users.png | Bin .../main}/res/drawable-mdpi/background.png | Bin .../src/main}/res/drawable-mdpi/connected.png | Bin .../main}/res/drawable-mdpi/connecting.png | Bin .../main}/res/drawable-mdpi/disconnected.png | Bin .../src/main}/res/drawable-mdpi/error.png | Bin .../src/main}/res/drawable-mdpi/icon.png | Bin .../src/main}/res/drawable-mdpi/info.png | Bin .../src/main}/res/drawable-mdpi/join.png | Bin .../main}/res/drawable-mdpi/menu_users.png | Bin .../src/main}/res/drawable-mdpi/op.png | Bin .../src/main}/res/drawable-mdpi/part.png | Bin .../src/main}/res/drawable-mdpi/quit.png | Bin .../main}/res/drawable-mdpi/smiley_cool.png | Bin .../main}/res/drawable-mdpi/smiley_cry.png | Bin .../res/drawable-mdpi/smiley_embarassed.png | Bin .../drawable-mdpi/smiley_foot_in_mouth.png | Bin .../main}/res/drawable-mdpi/smiley_frown.png | Bin .../res/drawable-mdpi/smiley_innocent.png | Bin .../main}/res/drawable-mdpi/smiley_kiss.png | Bin .../res/drawable-mdpi/smiley_laughing.png | Bin .../res/drawable-mdpi/smiley_money_mouth.png | Bin .../main}/res/drawable-mdpi/smiley_sealed.png | Bin .../main}/res/drawable-mdpi/smiley_smile.png | Bin .../res/drawable-mdpi/smiley_surprised.png | Bin .../res/drawable-mdpi/smiley_tongue_out.png | Bin .../res/drawable-mdpi/smiley_undecided.png | Bin .../main}/res/drawable-mdpi/smiley_wink.png | Bin .../main}/res/drawable-mdpi/smiley_wtf.png | Bin .../main}/res/drawable-mdpi/smiley_yell.png | Bin .../textfield_activated_holo_dark.9.png | Bin .../textfield_default_holo_dark.9.png | Bin ...textfield_disabled_focused_holo_dark.9.png | Bin .../textfield_disabled_holo_dark.9.png | Bin .../textfield_focused_holo_dark.9.png | Bin .../main}/res/drawable-mdpi/unknown_image.png | Bin .../src/main}/res/drawable-mdpi/user.png | Bin .../main}/res/drawable-mdpi/user_title.png | Bin .../src/main}/res/drawable-mdpi/voice.png | Bin .../src/main}/res/drawable-mdpi/warning.png | Bin .../res/drawable-xhdpi/actionbar_add.png | Bin .../res/drawable-xhdpi/actionbar_save.png | Bin .../res/drawable-xhdpi/actionbar_settings.png | Bin .../res/drawable-xhdpi/actionbar_users.png | Bin .../textfield_activated_holo_dark.9.png | Bin .../textfield_default_holo_dark.9.png | Bin ...textfield_disabled_focused_holo_dark.9.png | Bin .../textfield_disabled_holo_dark.9.png | Bin .../textfield_focused_holo_dark.9.png | Bin .../res/drawable/conversation_background.xml | 0 .../res/drawable/edit_text_holo_dark.xml | 0 .../src/main}/res/layout/about.xml | 0 .../src/main}/res/layout/actionitem.xml | 0 .../src/main}/res/layout/addserveritem.xml | 0 .../src/main}/res/layout/aliasadd.xml | 0 .../src/main}/res/layout/aliasitem.xml | 0 .../src/main}/res/layout/authentication.xml | 0 .../src/main}/res/layout/channeladd.xml | 0 .../src/main}/res/layout/channeldialog.xml | 0 .../src/main}/res/layout/channelitem.xml | 0 .../src/main}/res/layout/commandadd.xml | 0 .../src/main}/res/layout/commanditem.xml | 0 .../src/main}/res/layout/conversations.xml | 0 .../src/main}/res/layout/join.xml | 0 .../src/main}/res/layout/message.xml | 0 .../src/main}/res/layout/serveradd.xml | 0 .../src/main}/res/layout/serveritem.xml | 0 .../src/main}/res/layout/servers.xml | 0 .../src/main}/res/layout/user.xml | 0 .../src/main}/res/layout/useritem.xml | 0 .../src/main}/res/layout/users.xml | 0 .../src/main}/res/menu/addserver.xml | 0 .../src/main}/res/menu/conversations.xml | 0 .../src/main}/res/menu/servers.xml | 0 .../src/main}/res/values-af/market.xml | 0 .../src/main}/res/values-af/strings.xml | 0 .../src/main}/res/values-da/market.xml | 0 .../src/main}/res/values-da/strings.xml | 0 .../src/main}/res/values-de/market.xml | 0 .../src/main}/res/values-de/strings.xml | 0 .../src/main}/res/values-es/market.xml | 0 .../src/main}/res/values-es/strings.xml | 0 .../src/main}/res/values-fi/market.xml | 0 .../src/main}/res/values-fi/strings.xml | 0 .../src/main}/res/values-fr/market.xml | 0 .../src/main}/res/values-fr/strings.xml | 0 .../src/main}/res/values-it/market.xml | 0 .../src/main}/res/values-it/strings.xml | 0 .../src/main}/res/values-ja/market.xml | 0 .../src/main}/res/values-ja/strings.xml | 0 .../src/main}/res/values-lv/market.xml | 0 .../src/main}/res/values-lv/strings.xml | 0 .../src/main}/res/values-ru/market.xml | 0 .../src/main}/res/values-ru/strings.xml | 0 .../src/main}/res/values-tr/market.xml | 0 .../src/main}/res/values-tr/strings.xml | 0 .../src/main}/res/values-zh/market.xml | 0 .../src/main}/res/values-zh/strings.xml | 0 .../src/main}/res/values/application.xml | 0 .../src/main}/res/values/arrays.xml | 0 .../src/main}/res/values/charsets.xml | 0 .../src/main}/res/values/market.xml | 0 .../src/main}/res/values/settings.xml | 0 .../src/main}/res/values/strings.xml | 0 .../src/main}/res/values/styles.xml | 0 .../src/main}/res/xml/preferences.xml | 0 application/.classpath | 8 - application/.project | 33 - application/libs/android-support-v4.jar | Bin 385685 -> 0 bytes application/pom.xml | 92 - application/project.properties | 13 - build.gradle | 21 + gradle.properties | 18 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 49896 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 164 ++ gradlew.bat | 90 + libs/ActionBarSherlock/.classpath | 8 - libs/ActionBarSherlock/.project | 33 - libs/ActionBarSherlock/AndroidManifest.xml | 6 - libs/ActionBarSherlock/README.md | 15 - .../libs/android-support-v4.jar | Bin 385685 -> 0 bytes libs/ActionBarSherlock/pom.xml | 148 -- libs/ActionBarSherlock/project.properties | 12 - ...s__primary_text_disable_only_holo_dark.xml | 20 - ...__primary_text_disable_only_holo_light.xml | 21 - .../res/color/abs__primary_text_holo_dark.xml | 24 - .../color/abs__primary_text_holo_light.xml | 26 - .../abs__ab_bottom_solid_dark_holo.9.png | Bin 144 -> 0 bytes .../abs__ab_bottom_solid_inverse_holo.9.png | Bin 138 -> 0 bytes .../abs__ab_bottom_solid_light_holo.9.png | Bin 144 -> 0 bytes ...abs__ab_bottom_transparent_dark_holo.9.png | Bin 135 -> 0 bytes ...bs__ab_bottom_transparent_light_holo.9.png | Bin 134 -> 0 bytes .../abs__ab_share_pack_holo_dark.9.png | Bin 2863 -> 0 bytes .../abs__ab_share_pack_holo_light.9.png | Bin 2859 -> 0 bytes .../abs__ab_solid_dark_holo.9.png | Bin 146 -> 0 bytes .../abs__ab_solid_light_holo.9.png | Bin 145 -> 0 bytes .../abs__ab_solid_shadow_holo.9.png | Bin 192 -> 0 bytes .../abs__ab_stacked_solid_dark_holo.9.png | Bin 146 -> 0 bytes .../abs__ab_stacked_solid_light_holo.9.png | Bin 146 -> 0 bytes ...bs__ab_stacked_transparent_dark_holo.9.png | Bin 139 -> 0 bytes ...s__ab_stacked_transparent_light_holo.9.png | Bin 133 -> 0 bytes .../abs__ab_transparent_dark_holo.9.png | Bin 155 -> 0 bytes .../abs__ab_transparent_light_holo.9.png | Bin 145 -> 0 bytes .../abs__btn_cab_done_default_holo_dark.9.png | Bin 104 -> 0 bytes ...abs__btn_cab_done_default_holo_light.9.png | Bin 102 -> 0 bytes .../abs__btn_cab_done_focused_holo_dark.9.png | Bin 112 -> 0 bytes ...abs__btn_cab_done_focused_holo_light.9.png | Bin 108 -> 0 bytes .../abs__btn_cab_done_pressed_holo_dark.9.png | Bin 110 -> 0 bytes ...abs__btn_cab_done_pressed_holo_light.9.png | Bin 108 -> 0 bytes ...abs__cab_background_bottom_holo_dark.9.png | Bin 149 -> 0 bytes ...bs__cab_background_bottom_holo_light.9.png | Bin 145 -> 0 bytes .../abs__cab_background_top_holo_dark.9.png | Bin 147 -> 0 bytes .../abs__cab_background_top_holo_light.9.png | Bin 147 -> 0 bytes .../abs__dialog_full_holo_dark.9.png | Bin 1414 -> 0 bytes .../abs__dialog_full_holo_light.9.png | Bin 1537 -> 0 bytes .../abs__ic_ab_back_holo_dark.png | Bin 602 -> 0 bytes .../abs__ic_ab_back_holo_light.png | Bin 546 -> 0 bytes .../abs__ic_cab_done_holo_dark.png | Bin 713 -> 0 bytes .../abs__ic_cab_done_holo_light.png | Bin 737 -> 0 bytes .../drawable-hdpi/abs__ic_clear_disabled.png | Bin 1774 -> 0 bytes .../drawable-hdpi/abs__ic_clear_normal.png | Bin 1945 -> 0 bytes ...c_clear_search_api_disabled_holo_light.png | Bin 1504 -> 0 bytes .../abs__ic_clear_search_api_holo_light.png | Bin 1540 -> 0 bytes .../res/drawable-hdpi/abs__ic_go.png | Bin 1415 -> 0 bytes .../abs__ic_go_search_api_holo_light.png | Bin 1252 -> 0 bytes ..._ic_menu_moreoverflow_normal_holo_dark.png | Bin 144 -> 0 bytes ...ic_menu_moreoverflow_normal_holo_light.png | Bin 148 -> 0 bytes .../abs__ic_menu_share_holo_dark.png | Bin 467 -> 0 bytes .../abs__ic_menu_share_holo_light.png | Bin 505 -> 0 bytes .../res/drawable-hdpi/abs__ic_search.png | Bin 2280 -> 0 bytes .../abs__ic_search_api_holo_light.png | Bin 2271 -> 0 bytes .../drawable-hdpi/abs__ic_voice_search.png | Bin 2070 -> 0 bytes .../abs__ic_voice_search_api_holo_light.png | Bin 1833 -> 0 bytes .../abs__list_activated_holo.9.png | Bin 154 -> 0 bytes .../abs__list_divider_holo_dark.9.png | Bin 78 -> 0 bytes .../abs__list_divider_holo_light.9.png | Bin 76 -> 0 bytes .../abs__list_focused_holo.9.png | Bin 159 -> 0 bytes .../abs__list_longpressed_holo.9.png | Bin 154 -> 0 bytes .../abs__list_pressed_holo_dark.9.png | Bin 159 -> 0 bytes .../abs__list_pressed_holo_light.9.png | Bin 159 -> 0 bytes ...bs__list_selector_disabled_holo_dark.9.png | Bin 189 -> 0 bytes ...s__list_selector_disabled_holo_light.9.png | Bin 189 -> 0 bytes .../abs__menu_dropdown_panel_holo_dark.9.png | Bin 922 -> 0 bytes .../abs__menu_dropdown_panel_holo_light.9.png | Bin 1061 -> 0 bytes .../abs__progress_bg_holo_dark.9.png | Bin 178 -> 0 bytes .../abs__progress_bg_holo_light.9.png | Bin 174 -> 0 bytes .../abs__progress_primary_holo_dark.9.png | Bin 917 -> 0 bytes .../abs__progress_primary_holo_light.9.png | Bin 917 -> 0 bytes .../abs__progress_secondary_holo_dark.9.png | Bin 188 -> 0 bytes .../abs__progress_secondary_holo_light.9.png | Bin 188 -> 0 bytes .../abs__spinner_48_inner_holo.png | Bin 2081 -> 0 bytes .../abs__spinner_48_outer_holo.png | Bin 1811 -> 0 bytes .../abs__spinner_ab_default_holo_dark.9.png | Bin 311 -> 0 bytes .../abs__spinner_ab_default_holo_light.9.png | Bin 312 -> 0 bytes .../abs__spinner_ab_disabled_holo_dark.9.png | Bin 306 -> 0 bytes .../abs__spinner_ab_disabled_holo_light.9.png | Bin 306 -> 0 bytes .../abs__spinner_ab_focused_holo_dark.9.png | Bin 524 -> 0 bytes .../abs__spinner_ab_focused_holo_light.9.png | Bin 523 -> 0 bytes .../abs__spinner_ab_pressed_holo_dark.9.png | Bin 464 -> 0 bytes .../abs__spinner_ab_pressed_holo_light.9.png | Bin 458 -> 0 bytes .../abs__tab_selected_focused_holo.9.png | Bin 147 -> 0 bytes .../abs__tab_selected_holo.9.png | Bin 148 -> 0 bytes .../abs__tab_selected_pressed_holo.9.png | Bin 147 -> 0 bytes .../abs__tab_unselected_pressed_holo.9.png | Bin 145 -> 0 bytes ...__textfield_search_default_holo_dark.9.png | Bin 110 -> 0 bytes ..._textfield_search_default_holo_light.9.png | Bin 105 -> 0 bytes ...field_search_right_default_holo_dark.9.png | Bin 108 -> 0 bytes ...ield_search_right_default_holo_light.9.png | Bin 103 -> 0 bytes ...ield_search_right_selected_holo_dark.9.png | Bin 114 -> 0 bytes ...eld_search_right_selected_holo_light.9.png | Bin 111 -> 0 bytes ..._textfield_search_selected_holo_dark.9.png | Bin 114 -> 0 bytes ...textfield_search_selected_holo_light.9.png | Bin 112 -> 0 bytes .../abs__ab_bottom_solid_dark_holo.9.png | Bin 134 -> 0 bytes .../abs__ab_bottom_solid_inverse_holo.9.png | Bin 129 -> 0 bytes .../abs__ab_bottom_solid_light_holo.9.png | Bin 134 -> 0 bytes ...abs__ab_bottom_transparent_dark_holo.9.png | Bin 123 -> 0 bytes ...bs__ab_bottom_transparent_light_holo.9.png | Bin 123 -> 0 bytes .../abs__ab_share_pack_holo_dark.9.png | Bin 2849 -> 0 bytes .../abs__ab_share_pack_holo_light.9.png | Bin 191 -> 0 bytes .../abs__ab_solid_dark_holo.9.png | Bin 133 -> 0 bytes .../abs__ab_solid_light_holo.9.png | Bin 133 -> 0 bytes .../abs__ab_solid_shadow_holo.9.png | Bin 168 -> 0 bytes .../abs__ab_stacked_solid_dark_holo.9.png | Bin 134 -> 0 bytes .../abs__ab_stacked_solid_light_holo.9.png | Bin 133 -> 0 bytes ...bs__ab_stacked_transparent_dark_holo.9.png | Bin 127 -> 0 bytes ...s__ab_stacked_transparent_light_holo.9.png | Bin 123 -> 0 bytes .../abs__ab_transparent_dark_holo.9.png | Bin 139 -> 0 bytes .../abs__ab_transparent_light_holo.9.png | Bin 133 -> 0 bytes .../abs__btn_cab_done_default_holo_dark.9.png | Bin 101 -> 0 bytes ...abs__btn_cab_done_default_holo_light.9.png | Bin 99 -> 0 bytes .../abs__btn_cab_done_focused_holo_dark.9.png | Bin 109 -> 0 bytes ...abs__btn_cab_done_focused_holo_light.9.png | Bin 105 -> 0 bytes .../abs__btn_cab_done_pressed_holo_dark.9.png | Bin 107 -> 0 bytes ...abs__btn_cab_done_pressed_holo_light.9.png | Bin 105 -> 0 bytes ...abs__cab_background_bottom_holo_dark.9.png | Bin 127 -> 0 bytes ...bs__cab_background_bottom_holo_light.9.png | Bin 124 -> 0 bytes .../abs__cab_background_top_holo_dark.9.png | Bin 130 -> 0 bytes .../abs__cab_background_top_holo_light.9.png | Bin 128 -> 0 bytes .../abs__dialog_full_holo_dark.9.png | Bin 882 -> 0 bytes .../abs__dialog_full_holo_light.9.png | Bin 1003 -> 0 bytes .../abs__ic_ab_back_holo_dark.png | Bin 466 -> 0 bytes .../abs__ic_ab_back_holo_light.png | Bin 438 -> 0 bytes .../abs__ic_cab_done_holo_dark.png | Bin 566 -> 0 bytes .../abs__ic_cab_done_holo_light.png | Bin 552 -> 0 bytes .../drawable-mdpi/abs__ic_clear_disabled.png | Bin 1775 -> 0 bytes .../drawable-mdpi/abs__ic_clear_normal.png | Bin 1869 -> 0 bytes ...c_clear_search_api_disabled_holo_light.png | Bin 740 -> 0 bytes .../abs__ic_clear_search_api_holo_light.png | Bin 743 -> 0 bytes .../res/drawable-mdpi/abs__ic_go.png | Bin 1538 -> 0 bytes .../abs__ic_go_search_api_holo_light.png | Bin 570 -> 0 bytes ..._ic_menu_moreoverflow_normal_holo_dark.png | Bin 122 -> 0 bytes ...ic_menu_moreoverflow_normal_holo_light.png | Bin 131 -> 0 bytes .../abs__ic_menu_share_holo_dark.png | Bin 332 -> 0 bytes .../abs__ic_menu_share_holo_light.png | Bin 355 -> 0 bytes .../res/drawable-mdpi/abs__ic_search.png | Bin 2280 -> 0 bytes .../abs__ic_search_api_holo_light.png | Bin 1541 -> 0 bytes .../drawable-mdpi/abs__ic_voice_search.png | Bin 1937 -> 0 bytes .../abs__ic_voice_search_api_holo_light.png | Bin 794 -> 0 bytes .../abs__list_activated_holo.9.png | Bin 151 -> 0 bytes .../abs__list_divider_holo_dark.9.png | Bin 78 -> 0 bytes .../abs__list_divider_holo_light.9.png | Bin 76 -> 0 bytes .../abs__list_focused_holo.9.png | Bin 158 -> 0 bytes .../abs__list_longpressed_holo.9.png | Bin 151 -> 0 bytes .../abs__list_pressed_holo_dark.9.png | Bin 158 -> 0 bytes .../abs__list_pressed_holo_light.9.png | Bin 158 -> 0 bytes ...bs__list_selector_disabled_holo_dark.9.png | Bin 172 -> 0 bytes ...s__list_selector_disabled_holo_light.9.png | Bin 171 -> 0 bytes .../abs__menu_dropdown_panel_holo_dark.9.png | Bin 651 -> 0 bytes .../abs__menu_dropdown_panel_holo_light.9.png | Bin 720 -> 0 bytes .../abs__progress_bg_holo_dark.9.png | Bin 165 -> 0 bytes .../abs__progress_bg_holo_light.9.png | Bin 159 -> 0 bytes .../abs__progress_primary_holo_dark.9.png | Bin 572 -> 0 bytes .../abs__progress_primary_holo_light.9.png | Bin 572 -> 0 bytes .../abs__progress_secondary_holo_dark.9.png | Bin 170 -> 0 bytes .../abs__progress_secondary_holo_light.9.png | Bin 170 -> 0 bytes .../abs__spinner_48_inner_holo.png | Bin 1336 -> 0 bytes .../abs__spinner_48_outer_holo.png | Bin 1165 -> 0 bytes .../abs__spinner_ab_default_holo_dark.9.png | Bin 254 -> 0 bytes .../abs__spinner_ab_default_holo_light.9.png | Bin 255 -> 0 bytes .../abs__spinner_ab_disabled_holo_dark.9.png | Bin 249 -> 0 bytes .../abs__spinner_ab_disabled_holo_light.9.png | Bin 249 -> 0 bytes .../abs__spinner_ab_focused_holo_dark.9.png | Bin 417 -> 0 bytes .../abs__spinner_ab_focused_holo_light.9.png | Bin 424 -> 0 bytes .../abs__spinner_ab_pressed_holo_dark.9.png | Bin 370 -> 0 bytes .../abs__spinner_ab_pressed_holo_light.9.png | Bin 370 -> 0 bytes .../abs__tab_selected_focused_holo.9.png | Bin 148 -> 0 bytes .../abs__tab_selected_holo.9.png | Bin 151 -> 0 bytes .../abs__tab_selected_pressed_holo.9.png | Bin 150 -> 0 bytes .../abs__tab_unselected_pressed_holo.9.png | Bin 155 -> 0 bytes ...__textfield_search_default_holo_dark.9.png | Bin 106 -> 0 bytes ..._textfield_search_default_holo_light.9.png | Bin 100 -> 0 bytes ...field_search_right_default_holo_dark.9.png | Bin 105 -> 0 bytes ...ield_search_right_default_holo_light.9.png | Bin 98 -> 0 bytes ...ield_search_right_selected_holo_dark.9.png | Bin 107 -> 0 bytes ...eld_search_right_selected_holo_light.9.png | Bin 107 -> 0 bytes ..._textfield_search_selected_holo_dark.9.png | Bin 109 -> 0 bytes ...textfield_search_selected_holo_light.9.png | Bin 109 -> 0 bytes .../abs__progress_medium_holo.xml | 34 - .../abs__ab_bottom_solid_dark_holo.9.png | Bin 165 -> 0 bytes .../abs__ab_bottom_solid_inverse_holo.9.png | Bin 157 -> 0 bytes .../abs__ab_bottom_solid_light_holo.9.png | Bin 166 -> 0 bytes ...abs__ab_bottom_transparent_dark_holo.9.png | Bin 153 -> 0 bytes ...bs__ab_bottom_transparent_light_holo.9.png | Bin 152 -> 0 bytes .../abs__ab_share_pack_holo_dark.9.png | Bin 2878 -> 0 bytes .../abs__ab_share_pack_holo_light.9.png | Bin 2873 -> 0 bytes .../abs__ab_solid_dark_holo.9.png | Bin 163 -> 0 bytes .../abs__ab_solid_light_holo.9.png | Bin 163 -> 0 bytes .../abs__ab_solid_shadow_holo.9.png | Bin 290 -> 0 bytes .../abs__ab_stacked_solid_dark_holo.9.png | Bin 163 -> 0 bytes .../abs__ab_stacked_solid_light_holo.9.png | Bin 163 -> 0 bytes ...bs__ab_stacked_transparent_dark_holo.9.png | Bin 158 -> 0 bytes ...s__ab_stacked_transparent_light_holo.9.png | Bin 152 -> 0 bytes .../abs__ab_transparent_dark_holo.9.png | Bin 171 -> 0 bytes .../abs__ab_transparent_light_holo.9.png | Bin 160 -> 0 bytes .../abs__btn_cab_done_default_holo_dark.9.png | Bin 109 -> 0 bytes ...abs__btn_cab_done_default_holo_light.9.png | Bin 108 -> 0 bytes .../abs__btn_cab_done_focused_holo_dark.9.png | Bin 112 -> 0 bytes ...abs__btn_cab_done_focused_holo_light.9.png | Bin 113 -> 0 bytes .../abs__btn_cab_done_pressed_holo_dark.9.png | Bin 115 -> 0 bytes ...abs__btn_cab_done_pressed_holo_light.9.png | Bin 113 -> 0 bytes ...abs__cab_background_bottom_holo_dark.9.png | Bin 166 -> 0 bytes ...bs__cab_background_bottom_holo_light.9.png | Bin 161 -> 0 bytes .../abs__cab_background_top_holo_dark.9.png | Bin 174 -> 0 bytes .../abs__cab_background_top_holo_light.9.png | Bin 161 -> 0 bytes .../abs__dialog_full_holo_dark.9.png | Bin 2159 -> 0 bytes .../abs__dialog_full_holo_light.9.png | Bin 2302 -> 0 bytes .../abs__ic_ab_back_holo_dark.png | Bin 741 -> 0 bytes .../abs__ic_ab_back_holo_light.png | Bin 661 -> 0 bytes .../abs__ic_cab_done_holo_dark.png | Bin 970 -> 0 bytes .../abs__ic_cab_done_holo_light.png | Bin 915 -> 0 bytes .../drawable-xhdpi/abs__ic_clear_disabled.png | Bin 2531 -> 0 bytes ...c_clear_search_api_disabled_holo_light.png | Bin 1315 -> 0 bytes .../abs__ic_clear_search_api_holo_light.png | Bin 1447 -> 0 bytes .../res/drawable-xhdpi/abs__ic_go.png | Bin 1983 -> 0 bytes .../abs__ic_go_search_api_holo_light.png | Bin 836 -> 0 bytes ..._ic_menu_moreoverflow_normal_holo_dark.png | Bin 167 -> 0 bytes ...ic_menu_moreoverflow_normal_holo_light.png | Bin 184 -> 0 bytes .../abs__ic_menu_share_holo_dark.png | Bin 699 -> 0 bytes .../abs__ic_menu_share_holo_light.png | Bin 935 -> 0 bytes .../res/drawable-xhdpi/abs__ic_search.png | Bin 3784 -> 0 bytes .../abs__ic_search_api_holo_light.png | Bin 3037 -> 0 bytes .../drawable-xhdpi/abs__ic_voice_search.png | Bin 3053 -> 0 bytes .../abs__ic_voice_search_api_holo_light.png | Bin 1414 -> 0 bytes .../abs__list_activated_holo.9.png | Bin 158 -> 0 bytes .../abs__list_divider_holo_dark.9.png | Bin 83 -> 0 bytes .../abs__list_divider_holo_light.9.png | Bin 83 -> 0 bytes .../abs__list_focused_holo.9.png | Bin 163 -> 0 bytes .../abs__list_longpressed_holo.9.png | Bin 158 -> 0 bytes .../abs__list_pressed_holo_dark.9.png | Bin 163 -> 0 bytes .../abs__list_pressed_holo_light.9.png | Bin 163 -> 0 bytes ...bs__list_selector_disabled_holo_dark.9.png | Bin 190 -> 0 bytes ...s__list_selector_disabled_holo_light.9.png | Bin 188 -> 0 bytes .../abs__menu_dropdown_panel_holo_dark.9.png | Bin 1362 -> 0 bytes .../abs__menu_dropdown_panel_holo_light.9.png | Bin 1551 -> 0 bytes .../abs__progress_bg_holo_dark.9.png | Bin 174 -> 0 bytes .../abs__progress_bg_holo_light.9.png | Bin 172 -> 0 bytes .../abs__progress_primary_holo_dark.9.png | Bin 1309 -> 0 bytes .../abs__progress_primary_holo_light.9.png | Bin 1309 -> 0 bytes .../abs__progress_secondary_holo_dark.9.png | Bin 184 -> 0 bytes .../abs__progress_secondary_holo_light.9.png | Bin 184 -> 0 bytes .../abs__spinner_48_inner_holo.png | Bin 2769 -> 0 bytes .../abs__spinner_48_outer_holo.png | Bin 2432 -> 0 bytes .../abs__spinner_ab_default_holo_dark.9.png | Bin 395 -> 0 bytes .../abs__spinner_ab_default_holo_light.9.png | Bin 394 -> 0 bytes .../abs__spinner_ab_disabled_holo_dark.9.png | Bin 381 -> 0 bytes .../abs__spinner_ab_disabled_holo_light.9.png | Bin 381 -> 0 bytes .../abs__spinner_ab_focused_holo_dark.9.png | Bin 680 -> 0 bytes .../abs__spinner_ab_focused_holo_light.9.png | Bin 671 -> 0 bytes .../abs__spinner_ab_pressed_holo_dark.9.png | Bin 609 -> 0 bytes .../abs__spinner_ab_pressed_holo_light.9.png | Bin 602 -> 0 bytes .../abs__tab_selected_focused_holo.9.png | Bin 147 -> 0 bytes .../abs__tab_selected_holo.9.png | Bin 153 -> 0 bytes .../abs__tab_selected_pressed_holo.9.png | Bin 147 -> 0 bytes .../abs__tab_unselected_pressed_holo.9.png | Bin 149 -> 0 bytes ...__textfield_search_default_holo_dark.9.png | Bin 126 -> 0 bytes ..._textfield_search_default_holo_light.9.png | Bin 126 -> 0 bytes ...field_search_right_default_holo_dark.9.png | Bin 125 -> 0 bytes ...ield_search_right_default_holo_light.9.png | Bin 127 -> 0 bytes ...ield_search_right_selected_holo_dark.9.png | Bin 128 -> 0 bytes ...eld_search_right_selected_holo_light.9.png | Bin 128 -> 0 bytes ..._textfield_search_selected_holo_dark.9.png | Bin 114 -> 0 bytes ...textfield_search_selected_holo_light.9.png | Bin 126 -> 0 bytes .../abs__activated_background_holo_dark.xml | 20 - .../abs__activated_background_holo_light.xml | 20 - .../drawable/abs__btn_cab_done_holo_dark.xml | 24 - .../drawable/abs__btn_cab_done_holo_light.xml | 24 - .../res/drawable/abs__ic_clear.xml | 22 - .../res/drawable/abs__ic_clear_holo_light.xml | 22 - .../abs__ic_menu_moreoverflow_holo_dark.xml | 18 - .../abs__ic_menu_moreoverflow_holo_light.xml | 18 - .../abs__item_background_holo_dark.xml | 26 - .../abs__item_background_holo_light.xml | 26 - ...lector_background_transition_holo_dark.xml | 20 - ...ector_background_transition_holo_light.xml | 20 - .../drawable/abs__list_selector_holo_dark.xml | 27 - .../abs__list_selector_holo_light.xml | 28 - .../abs__progress_horizontal_holo_dark.xml | 32 - .../abs__progress_horizontal_holo_light.xml | 32 - .../drawable/abs__progress_medium_holo.xml | 34 - .../drawable/abs__search_dropdown_dark.xml | 22 - .../drawable/abs__search_dropdown_light.xml | 22 - .../drawable/abs__spinner_ab_holo_dark.xml | 25 - .../drawable/abs__spinner_ab_holo_light.xml | 25 - .../drawable/abs__tab_indicator_ab_holo.xml | 34 - .../abs__textfield_searchview_holo_dark.xml | 22 - .../abs__textfield_searchview_holo_light.xml | 22 - ...__textfield_searchview_right_holo_dark.xml | 22 - ..._textfield_searchview_right_holo_light.xml | 22 - .../abs__action_mode_close_item.xml | 40 - .../sherlock_spinner_dropdown_item.xml | 26 - .../res/layout-v14/sherlock_spinner_item.xml | 26 - .../layout-xlarge/abs__screen_action_bar.xml | 50 - .../abs__screen_action_bar_overlay.xml | 49 - .../res/layout/abs__action_bar_home.xml | 38 - .../res/layout/abs__action_bar_tab.xml | 7 - .../layout/abs__action_bar_tab_bar_view.xml | 6 - .../res/layout/abs__action_bar_title_item.xml | 50 - .../layout/abs__action_menu_item_layout.xml | 56 - .../res/layout/abs__action_menu_layout.xml | 23 - .../res/layout/abs__action_mode_bar.xml | 24 - .../layout/abs__action_mode_close_item.xml | 31 - .../res/layout/abs__activity_chooser_view.xml | 70 - .../abs__activity_chooser_view_list_item.xml | 53 - .../res/layout/abs__dialog_title_holo.xml | 46 - .../layout/abs__list_menu_item_checkbox.xml | 26 - .../res/layout/abs__list_menu_item_icon.xml | 28 - .../res/layout/abs__list_menu_item_layout.xml | 59 - .../res/layout/abs__list_menu_item_radio.xml | 24 - .../layout/abs__popup_menu_item_layout.xml | 60 - .../res/layout/abs__screen_action_bar.xml | 57 - .../layout/abs__screen_action_bar_overlay.xml | 59 - .../res/layout/abs__screen_simple.xml | 38 - ...abs__screen_simple_overlay_action_mode.xml | 38 - .../abs__search_dropdown_item_icons_2line.xml | 89 - .../res/layout/abs__search_view.xml | 159 -- .../res/layout/abs__simple_dropdown_hint.xml | 29 - .../layout/sherlock_spinner_dropdown_item.xml | 26 - .../res/layout/sherlock_spinner_item.xml | 26 - .../res/values-land/abs__dimens.xml | 33 - .../abs__dimens.xml | 33 - .../abs__dimens.xml | 33 - .../abs__dimens.xml | 33 - .../abs__dimens.xml | 36 - .../res/values-large/abs__dimens.xml | 29 - .../res/values-sw600dp/abs__bools.xml | 19 - .../res/values-sw600dp/abs__dimens.xml | 38 - .../res/values-v11/abs__themes.xml | 12 - .../res/values-v14/abs__styles.xml | 123 -- .../res/values-v14/abs__themes.xml | 34 - .../res/values-w360dp/abs__dimens.xml | 22 - .../res/values-w480dp/abs__bools.xml | 22 - .../res/values-w480dp/abs__config.xml | 29 - .../res/values-w500dp/abs__dimens.xml | 22 - .../res/values-w600dp/abs__dimens.xml | 22 - .../res/values-xlarge/abs__dimens.xml | 45 - .../res/values/abs__attrs.xml | 432 ---- .../res/values/abs__bools.xml | 22 - .../res/values/abs__colors.xml | 27 - .../res/values/abs__config.xml | 43 - .../res/values/abs__dimens.xml | 67 - .../ActionBarSherlock/res/values/abs__ids.xml | 26 - .../res/values/abs__strings.xml | 53 - .../res/values/abs__styles.xml | 412 ---- .../res/values/abs__themes.xml | 239 --- .../src/android/support/v4/app/Watson.java | 144 -- .../actionbarsherlock/ActionBarSherlock.java | 794 -------- .../com/actionbarsherlock/app/ActionBar.java | 956 --------- .../app/SherlockActivity.java | 270 --- .../app/SherlockDialogFragment.java | 68 - .../app/SherlockExpandableListActivity.java | 259 --- .../app/SherlockFragment.java | 68 - .../app/SherlockFragmentActivity.java | 303 --- .../app/SherlockListActivity.java | 270 --- .../app/SherlockListFragment.java | 68 - .../app/SherlockPreferenceActivity.java | 270 --- .../internal/ActionBarSherlockCompat.java | 1203 ----------- .../internal/ActionBarSherlockNative.java | 336 --- .../internal/ResourcesCompat.java | 95 - .../internal/app/ActionBarImpl.java | 1026 ---------- .../internal/app/ActionBarWrapper.java | 468 ----- .../nineoldandroids/animation/Animator.java | 278 --- .../animation/AnimatorListenerAdapter.java | 54 - .../animation/AnimatorSet.java | 1111 ---------- .../animation/FloatEvaluator.java | 42 - .../animation/FloatKeyframeSet.java | 136 -- .../animation/IntEvaluator.java | 42 - .../animation/IntKeyframeSet.java | 135 -- .../nineoldandroids/animation/Keyframe.java | 361 ---- .../animation/KeyframeSet.java | 227 --- .../animation/ObjectAnimator.java | 491 ----- .../animation/PropertyValuesHolder.java | 1012 --------- .../animation/TypeEvaluator.java | 44 - .../animation/ValueAnimator.java | 1265 ------------ .../nineoldandroids/view/NineViewGroup.java | 79 - .../view/animation/AnimatorProxy.java | 212 -- .../widget/NineFrameLayout.java | 57 - .../widget/NineHorizontalScrollView.java | 41 - .../widget/NineLinearLayout.java | 57 - .../internal/view/ActionProviderWrapper.java | 40 - .../internal/view/StandaloneActionMode.java | 148 -- .../view/View_HasStateListenerSupport.java | 6 - .../View_OnAttachStateChangeListener.java | 8 - .../internal/view/menu/ActionMenu.java | 264 --- .../internal/view/menu/ActionMenuItem.java | 278 --- .../view/menu/ActionMenuItemView.java | 295 --- .../view/menu/ActionMenuPresenter.java | 714 ------- .../internal/view/menu/ActionMenuView.java | 575 ------ .../internal/view/menu/BaseMenuPresenter.java | 231 --- .../internal/view/menu/ListMenuItemView.java | 278 --- .../internal/view/menu/MenuBuilder.java | 1335 ------------ .../internal/view/menu/MenuItemImpl.java | 647 ------ .../internal/view/menu/MenuItemWrapper.java | 310 --- .../internal/view/menu/MenuPopupHelper.java | 376 ---- .../internal/view/menu/MenuPresenter.java | 148 -- .../internal/view/menu/MenuView.java | 120 -- .../internal/view/menu/MenuWrapper.java | 185 -- .../internal/view/menu/SubMenuBuilder.java | 134 -- .../internal/view/menu/SubMenuWrapper.java | 72 - .../internal/widget/AbsActionBarView.java | 291 --- .../internal/widget/ActionBarContainer.java | 258 --- .../internal/widget/ActionBarContextView.java | 518 ----- .../internal/widget/ActionBarView.java | 1548 -------------- .../internal/widget/CapitalizingButton.java | 40 - .../internal/widget/CapitalizingTextView.java | 50 - .../widget/CollapsibleActionViewWrapper.java | 30 - .../widget/FakeDialogPhoneWindow.java | 64 - .../internal/widget/IcsAbsSpinner.java | 479 ----- .../internal/widget/IcsAdapterView.java | 1160 ----------- .../internal/widget/IcsColorDrawable.java | 41 - .../internal/widget/IcsLinearLayout.java | 410 ---- .../internal/widget/IcsListPopupWindow.java | 644 ------ .../internal/widget/IcsProgressBar.java | 1193 ----------- .../internal/widget/IcsSpinner.java | 703 ------- .../internal/widget/IcsView.java | 21 - .../widget/ScrollingTabContainerView.java | 546 ----- .../actionbarsherlock/view/ActionMode.java | 224 -- .../view/ActionProvider.java | 170 -- .../view/CollapsibleActionView.java | 39 - .../src/com/actionbarsherlock/view/Menu.java | 447 ---- .../actionbarsherlock/view/MenuInflater.java | 495 ----- .../com/actionbarsherlock/view/MenuItem.java | 598 ------ .../com/actionbarsherlock/view/SubMenu.java | 110 - .../com/actionbarsherlock/view/Window.java | 65 - .../widget/ActivityChooserModel.java | 1104 ---------- .../widget/ActivityChooserView.java | 827 -------- .../actionbarsherlock/widget/SearchView.java | 1811 ----------------- .../widget/ShareActionProvider.java | 316 --- .../widget/SuggestionsAdapter.java | 733 ------- libs/ViewPagerIndicator/.classpath | 8 - libs/ViewPagerIndicator/.project | 33 - libs/ViewPagerIndicator/AndroidManifest.xml | 9 - .../libs/android-support-v4.jar | Bin 385685 -> 0 bytes libs/ViewPagerIndicator/pom.xml | 59 - libs/ViewPagerIndicator/project.properties | 12 - .../res/color/vpi__dark_theme.xml | 24 - .../res/color/vpi__light_theme.xml | 26 - .../vpi__tab_selected_focused_holo.9.png | Bin 147 -> 0 bytes .../vpi__tab_selected_holo.9.png | Bin 148 -> 0 bytes .../vpi__tab_selected_pressed_holo.9.png | Bin 147 -> 0 bytes .../vpi__tab_unselected_focused_holo.9.png | Bin 146 -> 0 bytes .../vpi__tab_unselected_holo.9.png | Bin 153 -> 0 bytes .../vpi__tab_unselected_pressed_holo.9.png | Bin 145 -> 0 bytes .../vpi__tab_selected_focused_holo.9.png | Bin 148 -> 0 bytes .../vpi__tab_selected_holo.9.png | Bin 151 -> 0 bytes .../vpi__tab_selected_pressed_holo.9.png | Bin 150 -> 0 bytes .../vpi__tab_unselected_focused_holo.9.png | Bin 150 -> 0 bytes .../vpi__tab_unselected_holo.9.png | Bin 157 -> 0 bytes .../vpi__tab_unselected_pressed_holo.9.png | Bin 155 -> 0 bytes .../vpi__tab_selected_focused_holo.9.png | Bin 147 -> 0 bytes .../vpi__tab_selected_holo.9.png | Bin 153 -> 0 bytes .../vpi__tab_selected_pressed_holo.9.png | Bin 147 -> 0 bytes .../vpi__tab_unselected_focused_holo.9.png | Bin 148 -> 0 bytes .../vpi__tab_unselected_holo.9.png | Bin 166 -> 0 bytes .../vpi__tab_unselected_pressed_holo.9.png | Bin 149 -> 0 bytes .../res/drawable/vpi__tab_indicator.xml | 34 - .../res/values/vpi__attrs.xml | 114 -- .../res/values/vpi__colors.xml | 26 - .../res/values/vpi__defaults.xml | 52 - .../res/values/vpi__styles.xml | 41 - .../CirclePageIndicator.java | 546 ----- .../viewpagerindicator/LinePageIndicator.java | 439 ---- .../com/viewpagerindicator/PageIndicator.java | 63 - .../viewpagerindicator/TabPageIndicator.java | 270 --- .../TitlePageIndicator.java | 805 -------- .../UnderlinePageIndicator.java | 391 ---- settings.gradle | 1 + test/.classpath | 10 - test/.project | 34 - test/AndroidManifest.xml | 21 - test/libs/robotium-solo-3.5.1.jar | Bin 58332 -> 0 bytes test/pom.xml | 119 -- test/project.properties | 11 - test/res/drawable/icon.png | Bin 2574 -> 0 bytes test/res/layout/main.xml | 12 - test/res/values/strings.xml | 5 - test/src/org/yaaic/test/AllTests.java | 43 - test/src/org/yaaic/test/model/AllTests.java | 48 - .../org/yaaic/test/model/BroadcastTest.java | 65 - .../src/org/yaaic/test/model/ChannelTest.java | 68 - .../org/yaaic/test/model/IdentityTest.java | 68 - .../src/org/yaaic/test/model/MessageTest.java | 73 - test/src/org/yaaic/test/model/QueryTest.java | 52 - .../org/yaaic/test/model/ScrollbackTest.java | 84 - .../org/yaaic/test/model/ServerInfoTest.java | 52 - test/src/org/yaaic/test/model/ServerTest.java | 177 -- .../src/org/yaaic/test/receiver/AllTests.java | 41 - .../receiver/ConversationReceiverTest.java | 113 - .../src/org/yaaic/test/scenario/AllTests.java | 41 - .../yaaic/test/scenario/ChannelScenarios.java | 97 - .../test/scenario/ConnectionScenarios.java | 101 - .../yaaic/test/scenario/ScenarioHelper.java | 174 -- .../test/scenario/ServerListScenarios.java | 131 -- tools/check_languages.rb | 108 - 748 files changed, 354 insertions(+), 42382 deletions(-) create mode 100644 app/.gitignore create mode 100644 app/build.gradle create mode 100644 app/proguard-rules.pro rename {application => app/src/main}/AndroidManifest.xml (100%) rename {application/src => app/src/main/java}/org/jibble/pircbot/Colors.java (100%) rename {application/src => app/src/main/java}/org/jibble/pircbot/DccChat.java (100%) rename {application/src => app/src/main/java}/org/jibble/pircbot/DccFileTransfer.java (100%) rename {application/src => app/src/main/java}/org/jibble/pircbot/DccManager.java (100%) rename {application/src => app/src/main/java}/org/jibble/pircbot/IdentServer.java (100%) rename {application/src => app/src/main/java}/org/jibble/pircbot/InputThread.java (100%) rename {application/src => app/src/main/java}/org/jibble/pircbot/IrcException.java (100%) rename {application/src => app/src/main/java}/org/jibble/pircbot/NickAlreadyInUseException.java (100%) rename {application/src => app/src/main/java}/org/jibble/pircbot/OutputThread.java (100%) rename {application/src => app/src/main/java}/org/jibble/pircbot/PircBot.java (100%) rename {application/src => app/src/main/java}/org/jibble/pircbot/Queue.java (100%) rename {application/src => app/src/main/java}/org/jibble/pircbot/ReplyConstants.java (100%) rename {application/src => app/src/main/java}/org/jibble/pircbot/User.java (100%) rename {application/src => app/src/main/java}/org/yaaic/Yaaic.java (100%) rename {application/src => app/src/main/java}/org/yaaic/activity/AboutActivity.java (100%) rename {application/src => app/src/main/java}/org/yaaic/activity/AddAliasActivity.java (100%) rename {application/src => app/src/main/java}/org/yaaic/activity/AddChannelActivity.java (100%) rename {application/src => app/src/main/java}/org/yaaic/activity/AddCommandsActivity.java (100%) rename {application/src => app/src/main/java}/org/yaaic/activity/AddServerActivity.java (100%) rename {application/src => app/src/main/java}/org/yaaic/activity/AuthenticationActivity.java (100%) rename {application/src => app/src/main/java}/org/yaaic/activity/ConversationActivity.java (100%) rename {application/src => app/src/main/java}/org/yaaic/activity/JoinActivity.java (100%) rename {application/src => app/src/main/java}/org/yaaic/activity/MessageActivity.java (100%) rename {application/src => app/src/main/java}/org/yaaic/activity/ServersActivity.java (100%) rename {application/src => app/src/main/java}/org/yaaic/activity/SettingsActivity.java (100%) rename {application/src => app/src/main/java}/org/yaaic/activity/UserActivity.java (100%) rename {application/src => app/src/main/java}/org/yaaic/activity/UsersActivity.java (100%) rename {application/src => app/src/main/java}/org/yaaic/adapter/ConversationPagerAdapter.java (100%) rename {application/src => app/src/main/java}/org/yaaic/adapter/MessageListAdapter.java (100%) rename {application/src => app/src/main/java}/org/yaaic/adapter/ServerListAdapter.java (100%) rename {application/src => app/src/main/java}/org/yaaic/adapter/UserActionListAdapter.java (100%) rename {application/src => app/src/main/java}/org/yaaic/adapter/ViewPagerAdapter.java (100%) rename {application/src => app/src/main/java}/org/yaaic/command/BaseHandler.java (100%) rename {application/src => app/src/main/java}/org/yaaic/command/CommandParser.java (100%) rename {application/src => app/src/main/java}/org/yaaic/command/handler/AMsgHandler.java (100%) rename {application/src => app/src/main/java}/org/yaaic/command/handler/AwayHandler.java (100%) rename {application/src => app/src/main/java}/org/yaaic/command/handler/BackHandler.java (100%) rename {application/src => app/src/main/java}/org/yaaic/command/handler/CloseHandler.java (100%) rename {application/src => app/src/main/java}/org/yaaic/command/handler/DCCHandler.java (100%) rename {application/src => app/src/main/java}/org/yaaic/command/handler/DeopHandler.java (100%) rename {application/src => app/src/main/java}/org/yaaic/command/handler/DevoiceHandler.java (100%) rename {application/src => app/src/main/java}/org/yaaic/command/handler/EchoHandler.java (100%) rename {application/src => app/src/main/java}/org/yaaic/command/handler/HelpHandler.java (100%) rename {application/src => app/src/main/java}/org/yaaic/command/handler/JoinHandler.java (100%) rename {application/src => app/src/main/java}/org/yaaic/command/handler/KickHandler.java (100%) rename {application/src => app/src/main/java}/org/yaaic/command/handler/MeHandler.java (100%) rename {application/src => app/src/main/java}/org/yaaic/command/handler/ModeHandler.java (100%) rename {application/src => app/src/main/java}/org/yaaic/command/handler/MsgHandler.java (100%) rename {application/src => app/src/main/java}/org/yaaic/command/handler/NamesHandler.java (100%) rename {application/src => app/src/main/java}/org/yaaic/command/handler/NickHandler.java (100%) rename {application/src => app/src/main/java}/org/yaaic/command/handler/NoticeHandler.java (100%) rename {application/src => app/src/main/java}/org/yaaic/command/handler/OpHandler.java (100%) rename {application/src => app/src/main/java}/org/yaaic/command/handler/PartHandler.java (100%) rename {application/src => app/src/main/java}/org/yaaic/command/handler/QueryHandler.java (100%) rename {application/src => app/src/main/java}/org/yaaic/command/handler/QuitHandler.java (100%) rename {application/src => app/src/main/java}/org/yaaic/command/handler/RawHandler.java (100%) rename {application/src => app/src/main/java}/org/yaaic/command/handler/TopicHandler.java (100%) rename {application/src => app/src/main/java}/org/yaaic/command/handler/VoiceHandler.java (100%) rename {application/src => app/src/main/java}/org/yaaic/command/handler/WhoisHandler.java (100%) rename {application/src => app/src/main/java}/org/yaaic/db/AliasConstants.java (100%) rename {application/src => app/src/main/java}/org/yaaic/db/ChannelConstants.java (100%) rename {application/src => app/src/main/java}/org/yaaic/db/CommandConstants.java (100%) rename {application/src => app/src/main/java}/org/yaaic/db/Database.java (100%) rename {application/src => app/src/main/java}/org/yaaic/db/IdentityConstants.java (100%) rename {application/src => app/src/main/java}/org/yaaic/db/ServerConstants.java (100%) rename {application/src => app/src/main/java}/org/yaaic/exception/CommandException.java (100%) rename {application/src => app/src/main/java}/org/yaaic/exception/ValidationException.java (100%) rename {application/src => app/src/main/java}/org/yaaic/indicator/ConversationIndicator.java (100%) rename {application/src => app/src/main/java}/org/yaaic/indicator/ConversationStateProvider.java (100%) rename {application/src => app/src/main/java}/org/yaaic/indicator/ConversationTitlePageIndicator.java (100%) rename {application/src => app/src/main/java}/org/yaaic/irc/IRCBinder.java (100%) rename {application/src => app/src/main/java}/org/yaaic/irc/IRCConnection.java (100%) rename {application/src => app/src/main/java}/org/yaaic/irc/IRCService.java (100%) rename {application/src => app/src/main/java}/org/yaaic/listener/ConversationListener.java (100%) rename {application/src => app/src/main/java}/org/yaaic/listener/ConversationSelectedListener.java (100%) rename {application/src => app/src/main/java}/org/yaaic/listener/MessageClickListener.java (100%) rename {application/src => app/src/main/java}/org/yaaic/listener/ServerListener.java (100%) rename {application/src => app/src/main/java}/org/yaaic/listener/SpeechClickListener.java (100%) rename {application/src => app/src/main/java}/org/yaaic/model/Authentication.java (100%) rename {application/src => app/src/main/java}/org/yaaic/model/Broadcast.java (100%) rename {application/src => app/src/main/java}/org/yaaic/model/Channel.java (100%) rename {application/src => app/src/main/java}/org/yaaic/model/Conversation.java (100%) rename {application/src => app/src/main/java}/org/yaaic/model/Extra.java (100%) rename {application/src => app/src/main/java}/org/yaaic/model/Identity.java (100%) rename {application/src => app/src/main/java}/org/yaaic/model/Message.java (100%) rename {application/src => app/src/main/java}/org/yaaic/model/Query.java (100%) rename {application/src => app/src/main/java}/org/yaaic/model/Scrollback.java (100%) rename {application/src => app/src/main/java}/org/yaaic/model/Server.java (100%) rename {application/src => app/src/main/java}/org/yaaic/model/ServerInfo.java (100%) rename {application/src => app/src/main/java}/org/yaaic/model/Settings.java (100%) rename {application/src => app/src/main/java}/org/yaaic/model/Status.java (100%) rename {application/src => app/src/main/java}/org/yaaic/model/User.java (100%) rename {application/src => app/src/main/java}/org/yaaic/receiver/ConversationReceiver.java (100%) rename {application/src => app/src/main/java}/org/yaaic/receiver/ReconnectReceiver.java (100%) rename {application/src => app/src/main/java}/org/yaaic/receiver/ServerReceiver.java (100%) rename {application/src => app/src/main/java}/org/yaaic/ssl/NaiveTrustManager.java (100%) rename {application/src => app/src/main/java}/org/yaaic/tools/Base64.java (100%) rename {application/src => app/src/main/java}/org/yaaic/utils/DisplayUtils.java (100%) rename {application/src => app/src/main/java}/org/yaaic/utils/MircColors.java (100%) rename {application/src => app/src/main/java}/org/yaaic/utils/Smilies.java (100%) rename {application/src => app/src/main/java}/org/yaaic/view/MessageListView.java (100%) rename {application => app/src/main}/res/drawable-hdpi/actionbar_add.png (100%) rename {application => app/src/main}/res/drawable-hdpi/actionbar_save.png (100%) rename {application => app/src/main}/res/drawable-hdpi/actionbar_settings.png (100%) rename {application => app/src/main}/res/drawable-hdpi/actionbar_users.png (100%) rename {application => app/src/main}/res/drawable-hdpi/icon.png (100%) rename {application => app/src/main}/res/drawable-hdpi/textfield_activated_holo_dark.9.png (100%) rename {application => app/src/main}/res/drawable-hdpi/textfield_default_holo_dark.9.png (100%) rename {application => app/src/main}/res/drawable-hdpi/textfield_disabled_focused_holo_dark.9.png (100%) rename {application => app/src/main}/res/drawable-hdpi/textfield_disabled_holo_dark.9.png (100%) rename {application => app/src/main}/res/drawable-hdpi/textfield_focused_holo_dark.9.png (100%) rename {application => app/src/main}/res/drawable-ldpi/actionbar_add.png (100%) rename {application => app/src/main}/res/drawable-ldpi/actionbar_save.png (100%) rename {application => app/src/main}/res/drawable-ldpi/actionbar_settings.png (100%) rename {application => app/src/main}/res/drawable-ldpi/actionbar_users.png (100%) rename {application => app/src/main}/res/drawable-ldpi/icon.png (100%) rename {application => app/src/main}/res/drawable-mdpi/action.png (100%) rename {application => app/src/main}/res/drawable-mdpi/action_ban.png (100%) rename {application => app/src/main}/res/drawable-mdpi/action_blank.png (100%) rename {application => app/src/main}/res/drawable-mdpi/action_deop.png (100%) rename {application => app/src/main}/res/drawable-mdpi/action_devoice.png (100%) rename {application => app/src/main}/res/drawable-mdpi/action_kick.png (100%) rename {application => app/src/main}/res/drawable-mdpi/action_op.png (100%) rename {application => app/src/main}/res/drawable-mdpi/action_query.png (100%) rename {application => app/src/main}/res/drawable-mdpi/action_reply.png (100%) rename {application => app/src/main}/res/drawable-mdpi/action_voice.png (100%) rename {application => app/src/main}/res/drawable-mdpi/actionbar_add.png (100%) rename {application => app/src/main}/res/drawable-mdpi/actionbar_save.png (100%) rename {application => app/src/main}/res/drawable-mdpi/actionbar_settings.png (100%) rename {application => app/src/main}/res/drawable-mdpi/actionbar_users.png (100%) rename {application => app/src/main}/res/drawable-mdpi/background.png (100%) rename {application => app/src/main}/res/drawable-mdpi/connected.png (100%) rename {application => app/src/main}/res/drawable-mdpi/connecting.png (100%) rename {application => app/src/main}/res/drawable-mdpi/disconnected.png (100%) rename {application => app/src/main}/res/drawable-mdpi/error.png (100%) rename {application => app/src/main}/res/drawable-mdpi/icon.png (100%) rename {application => app/src/main}/res/drawable-mdpi/info.png (100%) rename {application => app/src/main}/res/drawable-mdpi/join.png (100%) rename {application => app/src/main}/res/drawable-mdpi/menu_users.png (100%) rename {application => app/src/main}/res/drawable-mdpi/op.png (100%) rename {application => app/src/main}/res/drawable-mdpi/part.png (100%) rename {application => app/src/main}/res/drawable-mdpi/quit.png (100%) rename {application => app/src/main}/res/drawable-mdpi/smiley_cool.png (100%) rename {application => app/src/main}/res/drawable-mdpi/smiley_cry.png (100%) rename {application => app/src/main}/res/drawable-mdpi/smiley_embarassed.png (100%) rename {application => app/src/main}/res/drawable-mdpi/smiley_foot_in_mouth.png (100%) rename {application => app/src/main}/res/drawable-mdpi/smiley_frown.png (100%) rename {application => app/src/main}/res/drawable-mdpi/smiley_innocent.png (100%) rename {application => app/src/main}/res/drawable-mdpi/smiley_kiss.png (100%) rename {application => app/src/main}/res/drawable-mdpi/smiley_laughing.png (100%) rename {application => app/src/main}/res/drawable-mdpi/smiley_money_mouth.png (100%) rename {application => app/src/main}/res/drawable-mdpi/smiley_sealed.png (100%) rename {application => app/src/main}/res/drawable-mdpi/smiley_smile.png (100%) rename {application => app/src/main}/res/drawable-mdpi/smiley_surprised.png (100%) rename {application => app/src/main}/res/drawable-mdpi/smiley_tongue_out.png (100%) rename {application => app/src/main}/res/drawable-mdpi/smiley_undecided.png (100%) rename {application => app/src/main}/res/drawable-mdpi/smiley_wink.png (100%) rename {application => app/src/main}/res/drawable-mdpi/smiley_wtf.png (100%) rename {application => app/src/main}/res/drawable-mdpi/smiley_yell.png (100%) rename {application => app/src/main}/res/drawable-mdpi/textfield_activated_holo_dark.9.png (100%) rename {application => app/src/main}/res/drawable-mdpi/textfield_default_holo_dark.9.png (100%) rename {application => app/src/main}/res/drawable-mdpi/textfield_disabled_focused_holo_dark.9.png (100%) rename {application => app/src/main}/res/drawable-mdpi/textfield_disabled_holo_dark.9.png (100%) rename {application => app/src/main}/res/drawable-mdpi/textfield_focused_holo_dark.9.png (100%) rename {application => app/src/main}/res/drawable-mdpi/unknown_image.png (100%) rename {application => app/src/main}/res/drawable-mdpi/user.png (100%) rename {application => app/src/main}/res/drawable-mdpi/user_title.png (100%) rename {application => app/src/main}/res/drawable-mdpi/voice.png (100%) rename {application => app/src/main}/res/drawable-mdpi/warning.png (100%) rename {application => app/src/main}/res/drawable-xhdpi/actionbar_add.png (100%) rename {application => app/src/main}/res/drawable-xhdpi/actionbar_save.png (100%) rename {application => app/src/main}/res/drawable-xhdpi/actionbar_settings.png (100%) rename {application => app/src/main}/res/drawable-xhdpi/actionbar_users.png (100%) rename {application => app/src/main}/res/drawable-xhdpi/textfield_activated_holo_dark.9.png (100%) rename {application => app/src/main}/res/drawable-xhdpi/textfield_default_holo_dark.9.png (100%) rename {application => app/src/main}/res/drawable-xhdpi/textfield_disabled_focused_holo_dark.9.png (100%) rename {application => app/src/main}/res/drawable-xhdpi/textfield_disabled_holo_dark.9.png (100%) rename {application => app/src/main}/res/drawable-xhdpi/textfield_focused_holo_dark.9.png (100%) rename {application => app/src/main}/res/drawable/conversation_background.xml (100%) rename {application => app/src/main}/res/drawable/edit_text_holo_dark.xml (100%) rename {application => app/src/main}/res/layout/about.xml (100%) rename {application => app/src/main}/res/layout/actionitem.xml (100%) rename {application => app/src/main}/res/layout/addserveritem.xml (100%) rename {application => app/src/main}/res/layout/aliasadd.xml (100%) rename {application => app/src/main}/res/layout/aliasitem.xml (100%) rename {application => app/src/main}/res/layout/authentication.xml (100%) rename {application => app/src/main}/res/layout/channeladd.xml (100%) rename {application => app/src/main}/res/layout/channeldialog.xml (100%) rename {application => app/src/main}/res/layout/channelitem.xml (100%) rename {application => app/src/main}/res/layout/commandadd.xml (100%) rename {application => app/src/main}/res/layout/commanditem.xml (100%) rename {application => app/src/main}/res/layout/conversations.xml (100%) rename {application => app/src/main}/res/layout/join.xml (100%) rename {application => app/src/main}/res/layout/message.xml (100%) rename {application => app/src/main}/res/layout/serveradd.xml (100%) rename {application => app/src/main}/res/layout/serveritem.xml (100%) rename {application => app/src/main}/res/layout/servers.xml (100%) rename {application => app/src/main}/res/layout/user.xml (100%) rename {application => app/src/main}/res/layout/useritem.xml (100%) rename {application => app/src/main}/res/layout/users.xml (100%) rename {application => app/src/main}/res/menu/addserver.xml (100%) rename {application => app/src/main}/res/menu/conversations.xml (100%) rename {application => app/src/main}/res/menu/servers.xml (100%) rename {application => app/src/main}/res/values-af/market.xml (100%) rename {application => app/src/main}/res/values-af/strings.xml (100%) rename {application => app/src/main}/res/values-da/market.xml (100%) rename {application => app/src/main}/res/values-da/strings.xml (100%) rename {application => app/src/main}/res/values-de/market.xml (100%) rename {application => app/src/main}/res/values-de/strings.xml (100%) rename {application => app/src/main}/res/values-es/market.xml (100%) rename {application => app/src/main}/res/values-es/strings.xml (100%) rename {application => app/src/main}/res/values-fi/market.xml (100%) rename {application => app/src/main}/res/values-fi/strings.xml (100%) rename {application => app/src/main}/res/values-fr/market.xml (100%) rename {application => app/src/main}/res/values-fr/strings.xml (100%) rename {application => app/src/main}/res/values-it/market.xml (100%) rename {application => app/src/main}/res/values-it/strings.xml (100%) rename {application => app/src/main}/res/values-ja/market.xml (100%) rename {application => app/src/main}/res/values-ja/strings.xml (100%) rename {application => app/src/main}/res/values-lv/market.xml (100%) rename {application => app/src/main}/res/values-lv/strings.xml (100%) rename {application => app/src/main}/res/values-ru/market.xml (100%) rename {application => app/src/main}/res/values-ru/strings.xml (100%) rename {application => app/src/main}/res/values-tr/market.xml (100%) rename {application => app/src/main}/res/values-tr/strings.xml (100%) rename {application => app/src/main}/res/values-zh/market.xml (100%) rename {application => app/src/main}/res/values-zh/strings.xml (100%) rename {application => app/src/main}/res/values/application.xml (100%) rename {application => app/src/main}/res/values/arrays.xml (100%) rename {application => app/src/main}/res/values/charsets.xml (100%) rename {application => app/src/main}/res/values/market.xml (100%) rename {application => app/src/main}/res/values/settings.xml (100%) rename {application => app/src/main}/res/values/strings.xml (100%) rename {application => app/src/main}/res/values/styles.xml (100%) rename {application => app/src/main}/res/xml/preferences.xml (100%) delete mode 100644 application/.classpath delete mode 100644 application/.project delete mode 100644 application/libs/android-support-v4.jar delete mode 100644 application/pom.xml delete mode 100644 application/project.properties create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat delete mode 100644 libs/ActionBarSherlock/.classpath delete mode 100644 libs/ActionBarSherlock/.project delete mode 100644 libs/ActionBarSherlock/AndroidManifest.xml delete mode 100644 libs/ActionBarSherlock/README.md delete mode 100644 libs/ActionBarSherlock/libs/android-support-v4.jar delete mode 100644 libs/ActionBarSherlock/pom.xml delete mode 100644 libs/ActionBarSherlock/project.properties delete mode 100644 libs/ActionBarSherlock/res/color/abs__primary_text_disable_only_holo_dark.xml delete mode 100644 libs/ActionBarSherlock/res/color/abs__primary_text_disable_only_holo_light.xml delete mode 100644 libs/ActionBarSherlock/res/color/abs__primary_text_holo_dark.xml delete mode 100644 libs/ActionBarSherlock/res/color/abs__primary_text_holo_light.xml delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_bottom_solid_dark_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_bottom_solid_inverse_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_bottom_solid_light_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_bottom_transparent_dark_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_bottom_transparent_light_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_share_pack_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_share_pack_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_solid_dark_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_solid_light_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_solid_shadow_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_stacked_solid_dark_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_stacked_solid_light_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_stacked_transparent_dark_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_stacked_transparent_light_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_transparent_dark_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_transparent_light_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__btn_cab_done_default_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__btn_cab_done_default_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__btn_cab_done_focused_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__btn_cab_done_focused_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__btn_cab_done_pressed_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__btn_cab_done_pressed_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__cab_background_bottom_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__cab_background_bottom_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__cab_background_top_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__cab_background_top_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__dialog_full_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__dialog_full_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_ab_back_holo_dark.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_ab_back_holo_light.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_cab_done_holo_dark.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_cab_done_holo_light.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_clear_disabled.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_clear_normal.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_clear_search_api_disabled_holo_light.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_clear_search_api_holo_light.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_go.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_go_search_api_holo_light.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_menu_moreoverflow_normal_holo_light.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_menu_share_holo_dark.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_menu_share_holo_light.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_search.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_search_api_holo_light.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_voice_search.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_voice_search_api_holo_light.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__list_activated_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__list_divider_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__list_divider_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__list_focused_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__list_longpressed_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__list_pressed_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__list_pressed_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__list_selector_disabled_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__list_selector_disabled_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__menu_dropdown_panel_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__menu_dropdown_panel_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__progress_bg_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__progress_bg_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__progress_primary_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__progress_primary_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__progress_secondary_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__progress_secondary_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_48_inner_holo.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_48_outer_holo.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_default_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_default_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_disabled_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_disabled_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_focused_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_focused_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_pressed_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_pressed_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__tab_selected_focused_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__tab_selected_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__tab_selected_pressed_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__tab_unselected_pressed_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__textfield_search_default_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__textfield_search_default_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__textfield_search_right_default_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__textfield_search_right_default_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__textfield_search_right_selected_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__textfield_search_right_selected_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__textfield_search_selected_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-hdpi/abs__textfield_search_selected_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_bottom_solid_dark_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_bottom_solid_inverse_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_bottom_solid_light_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_bottom_transparent_dark_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_bottom_transparent_light_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_share_pack_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_share_pack_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_solid_dark_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_solid_light_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_solid_shadow_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_stacked_solid_dark_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_stacked_solid_light_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_stacked_transparent_dark_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_stacked_transparent_light_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_transparent_dark_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_transparent_light_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__btn_cab_done_default_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__btn_cab_done_default_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__btn_cab_done_focused_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__btn_cab_done_focused_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__btn_cab_done_pressed_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__btn_cab_done_pressed_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__cab_background_bottom_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__cab_background_bottom_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__cab_background_top_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__cab_background_top_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__dialog_full_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__dialog_full_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_ab_back_holo_dark.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_ab_back_holo_light.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_cab_done_holo_dark.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_cab_done_holo_light.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_clear_disabled.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_clear_normal.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_clear_search_api_disabled_holo_light.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_clear_search_api_holo_light.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_go.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_go_search_api_holo_light.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_menu_moreoverflow_normal_holo_light.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_menu_share_holo_dark.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_menu_share_holo_light.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_search.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_search_api_holo_light.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_voice_search.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_voice_search_api_holo_light.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__list_activated_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__list_divider_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__list_divider_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__list_focused_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__list_longpressed_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__list_pressed_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__list_pressed_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__list_selector_disabled_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__list_selector_disabled_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__menu_dropdown_panel_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__menu_dropdown_panel_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__progress_bg_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__progress_bg_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__progress_primary_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__progress_primary_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__progress_secondary_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__progress_secondary_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__spinner_48_inner_holo.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__spinner_48_outer_holo.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__spinner_ab_default_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__spinner_ab_default_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__spinner_ab_disabled_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__spinner_ab_disabled_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__spinner_ab_focused_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__spinner_ab_focused_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__spinner_ab_pressed_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__spinner_ab_pressed_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__tab_selected_focused_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__tab_selected_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__tab_selected_pressed_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__tab_unselected_pressed_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_default_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_default_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_right_default_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_right_default_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_right_selected_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_right_selected_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_selected_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_selected_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-v11/abs__progress_medium_holo.xml delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_bottom_solid_dark_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_bottom_solid_inverse_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_bottom_solid_light_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_bottom_transparent_dark_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_bottom_transparent_light_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_share_pack_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_share_pack_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_solid_dark_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_solid_light_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_solid_shadow_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_stacked_solid_dark_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_stacked_solid_light_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_stacked_transparent_dark_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_stacked_transparent_light_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_transparent_dark_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_transparent_light_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__btn_cab_done_default_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__btn_cab_done_default_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__btn_cab_done_focused_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__btn_cab_done_focused_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__btn_cab_done_pressed_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__btn_cab_done_pressed_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__cab_background_bottom_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__cab_background_bottom_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__cab_background_top_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__cab_background_top_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__dialog_full_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__dialog_full_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_ab_back_holo_dark.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_ab_back_holo_light.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_cab_done_holo_dark.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_cab_done_holo_light.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_clear_disabled.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_clear_search_api_disabled_holo_light.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_clear_search_api_holo_light.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_go.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_go_search_api_holo_light.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_menu_moreoverflow_normal_holo_light.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_menu_share_holo_dark.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_menu_share_holo_light.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_search.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_search_api_holo_light.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_voice_search.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_voice_search_api_holo_light.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__list_activated_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__list_divider_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__list_divider_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__list_focused_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__list_longpressed_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__list_pressed_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__list_pressed_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__list_selector_disabled_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__list_selector_disabled_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__menu_dropdown_panel_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__menu_dropdown_panel_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__progress_bg_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__progress_bg_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__progress_primary_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__progress_primary_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__progress_secondary_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__progress_secondary_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_48_inner_holo.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_48_outer_holo.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_default_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_default_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_disabled_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_disabled_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_focused_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_focused_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_pressed_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_pressed_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__tab_selected_focused_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__tab_selected_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__tab_selected_pressed_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__tab_unselected_pressed_holo.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__textfield_search_default_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__textfield_search_default_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__textfield_search_right_default_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__textfield_search_right_default_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__textfield_search_right_selected_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__textfield_search_right_selected_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__textfield_search_selected_holo_dark.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable-xhdpi/abs__textfield_search_selected_holo_light.9.png delete mode 100644 libs/ActionBarSherlock/res/drawable/abs__activated_background_holo_dark.xml delete mode 100644 libs/ActionBarSherlock/res/drawable/abs__activated_background_holo_light.xml delete mode 100644 libs/ActionBarSherlock/res/drawable/abs__btn_cab_done_holo_dark.xml delete mode 100644 libs/ActionBarSherlock/res/drawable/abs__btn_cab_done_holo_light.xml delete mode 100644 libs/ActionBarSherlock/res/drawable/abs__ic_clear.xml delete mode 100644 libs/ActionBarSherlock/res/drawable/abs__ic_clear_holo_light.xml delete mode 100644 libs/ActionBarSherlock/res/drawable/abs__ic_menu_moreoverflow_holo_dark.xml delete mode 100644 libs/ActionBarSherlock/res/drawable/abs__ic_menu_moreoverflow_holo_light.xml delete mode 100644 libs/ActionBarSherlock/res/drawable/abs__item_background_holo_dark.xml delete mode 100644 libs/ActionBarSherlock/res/drawable/abs__item_background_holo_light.xml delete mode 100644 libs/ActionBarSherlock/res/drawable/abs__list_selector_background_transition_holo_dark.xml delete mode 100644 libs/ActionBarSherlock/res/drawable/abs__list_selector_background_transition_holo_light.xml delete mode 100644 libs/ActionBarSherlock/res/drawable/abs__list_selector_holo_dark.xml delete mode 100644 libs/ActionBarSherlock/res/drawable/abs__list_selector_holo_light.xml delete mode 100644 libs/ActionBarSherlock/res/drawable/abs__progress_horizontal_holo_dark.xml delete mode 100644 libs/ActionBarSherlock/res/drawable/abs__progress_horizontal_holo_light.xml delete mode 100644 libs/ActionBarSherlock/res/drawable/abs__progress_medium_holo.xml delete mode 100644 libs/ActionBarSherlock/res/drawable/abs__search_dropdown_dark.xml delete mode 100644 libs/ActionBarSherlock/res/drawable/abs__search_dropdown_light.xml delete mode 100644 libs/ActionBarSherlock/res/drawable/abs__spinner_ab_holo_dark.xml delete mode 100644 libs/ActionBarSherlock/res/drawable/abs__spinner_ab_holo_light.xml delete mode 100644 libs/ActionBarSherlock/res/drawable/abs__tab_indicator_ab_holo.xml delete mode 100644 libs/ActionBarSherlock/res/drawable/abs__textfield_searchview_holo_dark.xml delete mode 100644 libs/ActionBarSherlock/res/drawable/abs__textfield_searchview_holo_light.xml delete mode 100644 libs/ActionBarSherlock/res/drawable/abs__textfield_searchview_right_holo_dark.xml delete mode 100644 libs/ActionBarSherlock/res/drawable/abs__textfield_searchview_right_holo_light.xml delete mode 100644 libs/ActionBarSherlock/res/layout-large/abs__action_mode_close_item.xml delete mode 100644 libs/ActionBarSherlock/res/layout-v14/sherlock_spinner_dropdown_item.xml delete mode 100644 libs/ActionBarSherlock/res/layout-v14/sherlock_spinner_item.xml delete mode 100644 libs/ActionBarSherlock/res/layout-xlarge/abs__screen_action_bar.xml delete mode 100644 libs/ActionBarSherlock/res/layout-xlarge/abs__screen_action_bar_overlay.xml delete mode 100644 libs/ActionBarSherlock/res/layout/abs__action_bar_home.xml delete mode 100644 libs/ActionBarSherlock/res/layout/abs__action_bar_tab.xml delete mode 100644 libs/ActionBarSherlock/res/layout/abs__action_bar_tab_bar_view.xml delete mode 100644 libs/ActionBarSherlock/res/layout/abs__action_bar_title_item.xml delete mode 100644 libs/ActionBarSherlock/res/layout/abs__action_menu_item_layout.xml delete mode 100644 libs/ActionBarSherlock/res/layout/abs__action_menu_layout.xml delete mode 100644 libs/ActionBarSherlock/res/layout/abs__action_mode_bar.xml delete mode 100644 libs/ActionBarSherlock/res/layout/abs__action_mode_close_item.xml delete mode 100644 libs/ActionBarSherlock/res/layout/abs__activity_chooser_view.xml delete mode 100644 libs/ActionBarSherlock/res/layout/abs__activity_chooser_view_list_item.xml delete mode 100644 libs/ActionBarSherlock/res/layout/abs__dialog_title_holo.xml delete mode 100644 libs/ActionBarSherlock/res/layout/abs__list_menu_item_checkbox.xml delete mode 100644 libs/ActionBarSherlock/res/layout/abs__list_menu_item_icon.xml delete mode 100644 libs/ActionBarSherlock/res/layout/abs__list_menu_item_layout.xml delete mode 100644 libs/ActionBarSherlock/res/layout/abs__list_menu_item_radio.xml delete mode 100644 libs/ActionBarSherlock/res/layout/abs__popup_menu_item_layout.xml delete mode 100644 libs/ActionBarSherlock/res/layout/abs__screen_action_bar.xml delete mode 100644 libs/ActionBarSherlock/res/layout/abs__screen_action_bar_overlay.xml delete mode 100644 libs/ActionBarSherlock/res/layout/abs__screen_simple.xml delete mode 100644 libs/ActionBarSherlock/res/layout/abs__screen_simple_overlay_action_mode.xml delete mode 100644 libs/ActionBarSherlock/res/layout/abs__search_dropdown_item_icons_2line.xml delete mode 100644 libs/ActionBarSherlock/res/layout/abs__search_view.xml delete mode 100644 libs/ActionBarSherlock/res/layout/abs__simple_dropdown_hint.xml delete mode 100644 libs/ActionBarSherlock/res/layout/sherlock_spinner_dropdown_item.xml delete mode 100644 libs/ActionBarSherlock/res/layout/sherlock_spinner_item.xml delete mode 100644 libs/ActionBarSherlock/res/values-land/abs__dimens.xml delete mode 100644 libs/ActionBarSherlock/res/values-large-hdpi-1024x600/abs__dimens.xml delete mode 100644 libs/ActionBarSherlock/res/values-large-land-hdpi-1024x600/abs__dimens.xml delete mode 100644 libs/ActionBarSherlock/res/values-large-land-mdpi-1024x600/abs__dimens.xml delete mode 100644 libs/ActionBarSherlock/res/values-large-mdpi-1024x600/abs__dimens.xml delete mode 100644 libs/ActionBarSherlock/res/values-large/abs__dimens.xml delete mode 100644 libs/ActionBarSherlock/res/values-sw600dp/abs__bools.xml delete mode 100644 libs/ActionBarSherlock/res/values-sw600dp/abs__dimens.xml delete mode 100644 libs/ActionBarSherlock/res/values-v11/abs__themes.xml delete mode 100644 libs/ActionBarSherlock/res/values-v14/abs__styles.xml delete mode 100644 libs/ActionBarSherlock/res/values-v14/abs__themes.xml delete mode 100644 libs/ActionBarSherlock/res/values-w360dp/abs__dimens.xml delete mode 100644 libs/ActionBarSherlock/res/values-w480dp/abs__bools.xml delete mode 100644 libs/ActionBarSherlock/res/values-w480dp/abs__config.xml delete mode 100644 libs/ActionBarSherlock/res/values-w500dp/abs__dimens.xml delete mode 100644 libs/ActionBarSherlock/res/values-w600dp/abs__dimens.xml delete mode 100644 libs/ActionBarSherlock/res/values-xlarge/abs__dimens.xml delete mode 100644 libs/ActionBarSherlock/res/values/abs__attrs.xml delete mode 100644 libs/ActionBarSherlock/res/values/abs__bools.xml delete mode 100644 libs/ActionBarSherlock/res/values/abs__colors.xml delete mode 100644 libs/ActionBarSherlock/res/values/abs__config.xml delete mode 100644 libs/ActionBarSherlock/res/values/abs__dimens.xml delete mode 100644 libs/ActionBarSherlock/res/values/abs__ids.xml delete mode 100644 libs/ActionBarSherlock/res/values/abs__strings.xml delete mode 100644 libs/ActionBarSherlock/res/values/abs__styles.xml delete mode 100644 libs/ActionBarSherlock/res/values/abs__themes.xml delete mode 100644 libs/ActionBarSherlock/src/android/support/v4/app/Watson.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/ActionBarSherlock.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/app/ActionBar.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockActivity.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockDialogFragment.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockExpandableListActivity.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockFragment.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockFragmentActivity.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockListActivity.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockListFragment.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockPreferenceActivity.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/ActionBarSherlockCompat.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/ActionBarSherlockNative.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/ResourcesCompat.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/app/ActionBarImpl.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/app/ActionBarWrapper.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/Animator.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorListenerAdapter.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorSet.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatEvaluator.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatKeyframeSet.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntEvaluator.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntKeyframeSet.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/Keyframe.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/KeyframeSet.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/ObjectAnimator.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/PropertyValuesHolder.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/TypeEvaluator.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/ValueAnimator.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/view/NineViewGroup.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/view/animation/AnimatorProxy.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineFrameLayout.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineHorizontalScrollView.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineLinearLayout.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/ActionProviderWrapper.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/StandaloneActionMode.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/View_HasStateListenerSupport.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/View_OnAttachStateChangeListener.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenu.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenuItem.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenuItemView.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenuPresenter.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenuView.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/BaseMenuPresenter.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/ListMenuItemView.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuBuilder.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuItemImpl.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuItemWrapper.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuPopupHelper.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuPresenter.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuView.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuWrapper.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/SubMenuBuilder.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/SubMenuWrapper.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/AbsActionBarView.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/ActionBarContainer.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/ActionBarContextView.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/ActionBarView.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/CapitalizingButton.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/CapitalizingTextView.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/CollapsibleActionViewWrapper.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/FakeDialogPhoneWindow.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsAbsSpinner.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsAdapterView.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsColorDrawable.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsLinearLayout.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsListPopupWindow.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsProgressBar.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsSpinner.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsView.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/ScrollingTabContainerView.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/view/ActionMode.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/view/ActionProvider.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/view/CollapsibleActionView.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/view/Menu.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/view/MenuInflater.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/view/MenuItem.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/view/SubMenu.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/view/Window.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/widget/ActivityChooserModel.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/widget/ActivityChooserView.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/widget/SearchView.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/widget/ShareActionProvider.java delete mode 100644 libs/ActionBarSherlock/src/com/actionbarsherlock/widget/SuggestionsAdapter.java delete mode 100644 libs/ViewPagerIndicator/.classpath delete mode 100644 libs/ViewPagerIndicator/.project delete mode 100644 libs/ViewPagerIndicator/AndroidManifest.xml delete mode 100644 libs/ViewPagerIndicator/libs/android-support-v4.jar delete mode 100644 libs/ViewPagerIndicator/pom.xml delete mode 100644 libs/ViewPagerIndicator/project.properties delete mode 100644 libs/ViewPagerIndicator/res/color/vpi__dark_theme.xml delete mode 100644 libs/ViewPagerIndicator/res/color/vpi__light_theme.xml delete mode 100644 libs/ViewPagerIndicator/res/drawable-hdpi/vpi__tab_selected_focused_holo.9.png delete mode 100644 libs/ViewPagerIndicator/res/drawable-hdpi/vpi__tab_selected_holo.9.png delete mode 100644 libs/ViewPagerIndicator/res/drawable-hdpi/vpi__tab_selected_pressed_holo.9.png delete mode 100644 libs/ViewPagerIndicator/res/drawable-hdpi/vpi__tab_unselected_focused_holo.9.png delete mode 100644 libs/ViewPagerIndicator/res/drawable-hdpi/vpi__tab_unselected_holo.9.png delete mode 100644 libs/ViewPagerIndicator/res/drawable-hdpi/vpi__tab_unselected_pressed_holo.9.png delete mode 100644 libs/ViewPagerIndicator/res/drawable-mdpi/vpi__tab_selected_focused_holo.9.png delete mode 100644 libs/ViewPagerIndicator/res/drawable-mdpi/vpi__tab_selected_holo.9.png delete mode 100644 libs/ViewPagerIndicator/res/drawable-mdpi/vpi__tab_selected_pressed_holo.9.png delete mode 100644 libs/ViewPagerIndicator/res/drawable-mdpi/vpi__tab_unselected_focused_holo.9.png delete mode 100644 libs/ViewPagerIndicator/res/drawable-mdpi/vpi__tab_unselected_holo.9.png delete mode 100644 libs/ViewPagerIndicator/res/drawable-mdpi/vpi__tab_unselected_pressed_holo.9.png delete mode 100644 libs/ViewPagerIndicator/res/drawable-xhdpi/vpi__tab_selected_focused_holo.9.png delete mode 100644 libs/ViewPagerIndicator/res/drawable-xhdpi/vpi__tab_selected_holo.9.png delete mode 100644 libs/ViewPagerIndicator/res/drawable-xhdpi/vpi__tab_selected_pressed_holo.9.png delete mode 100644 libs/ViewPagerIndicator/res/drawable-xhdpi/vpi__tab_unselected_focused_holo.9.png delete mode 100644 libs/ViewPagerIndicator/res/drawable-xhdpi/vpi__tab_unselected_holo.9.png delete mode 100644 libs/ViewPagerIndicator/res/drawable-xhdpi/vpi__tab_unselected_pressed_holo.9.png delete mode 100644 libs/ViewPagerIndicator/res/drawable/vpi__tab_indicator.xml delete mode 100644 libs/ViewPagerIndicator/res/values/vpi__attrs.xml delete mode 100644 libs/ViewPagerIndicator/res/values/vpi__colors.xml delete mode 100644 libs/ViewPagerIndicator/res/values/vpi__defaults.xml delete mode 100644 libs/ViewPagerIndicator/res/values/vpi__styles.xml delete mode 100644 libs/ViewPagerIndicator/src/com/viewpagerindicator/CirclePageIndicator.java delete mode 100644 libs/ViewPagerIndicator/src/com/viewpagerindicator/LinePageIndicator.java delete mode 100644 libs/ViewPagerIndicator/src/com/viewpagerindicator/PageIndicator.java delete mode 100644 libs/ViewPagerIndicator/src/com/viewpagerindicator/TabPageIndicator.java delete mode 100644 libs/ViewPagerIndicator/src/com/viewpagerindicator/TitlePageIndicator.java delete mode 100644 libs/ViewPagerIndicator/src/com/viewpagerindicator/UnderlinePageIndicator.java create mode 100644 settings.gradle delete mode 100644 test/.classpath delete mode 100644 test/.project delete mode 100644 test/AndroidManifest.xml delete mode 100644 test/libs/robotium-solo-3.5.1.jar delete mode 100644 test/pom.xml delete mode 100644 test/project.properties delete mode 100644 test/res/drawable/icon.png delete mode 100644 test/res/layout/main.xml delete mode 100644 test/res/values/strings.xml delete mode 100644 test/src/org/yaaic/test/AllTests.java delete mode 100644 test/src/org/yaaic/test/model/AllTests.java delete mode 100644 test/src/org/yaaic/test/model/BroadcastTest.java delete mode 100644 test/src/org/yaaic/test/model/ChannelTest.java delete mode 100644 test/src/org/yaaic/test/model/IdentityTest.java delete mode 100644 test/src/org/yaaic/test/model/MessageTest.java delete mode 100644 test/src/org/yaaic/test/model/QueryTest.java delete mode 100644 test/src/org/yaaic/test/model/ScrollbackTest.java delete mode 100644 test/src/org/yaaic/test/model/ServerInfoTest.java delete mode 100644 test/src/org/yaaic/test/model/ServerTest.java delete mode 100644 test/src/org/yaaic/test/receiver/AllTests.java delete mode 100644 test/src/org/yaaic/test/receiver/ConversationReceiverTest.java delete mode 100644 test/src/org/yaaic/test/scenario/AllTests.java delete mode 100644 test/src/org/yaaic/test/scenario/ChannelScenarios.java delete mode 100644 test/src/org/yaaic/test/scenario/ConnectionScenarios.java delete mode 100644 test/src/org/yaaic/test/scenario/ScenarioHelper.java delete mode 100644 test/src/org/yaaic/test/scenario/ServerListScenarios.java delete mode 100755 tools/check_languages.rb diff --git a/.gitignore b/.gitignore index 736cd18..c32e33d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,12 @@ # Git Ignore for Yaaic +# Android Studio & Gradle +*.iml +build/ +.gradle/ +.idea/ + + # Compiled and generated files bin/ gen/ diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..858a3a3 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,29 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 21 + buildToolsVersion "21.1.1" + + defaultConfig { + applicationId "org.yaaic" + minSdkVersion 21 + targetSdkVersion 21 + versionCode 1 + versionName "2.0" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + + compile 'com.actionbarsherlock:actionbarsherlock:4.4.0@aar' + compile 'com.android.support:support-v4:18.0.+' + + compile 'com.viewpagerindicator:library:2.4.1@aar' +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..ca8f1ec --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /Applications/Android-SDK/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/application/AndroidManifest.xml b/app/src/main/AndroidManifest.xml similarity index 100% rename from application/AndroidManifest.xml rename to app/src/main/AndroidManifest.xml diff --git a/application/src/org/jibble/pircbot/Colors.java b/app/src/main/java/org/jibble/pircbot/Colors.java similarity index 100% rename from application/src/org/jibble/pircbot/Colors.java rename to app/src/main/java/org/jibble/pircbot/Colors.java diff --git a/application/src/org/jibble/pircbot/DccChat.java b/app/src/main/java/org/jibble/pircbot/DccChat.java similarity index 100% rename from application/src/org/jibble/pircbot/DccChat.java rename to app/src/main/java/org/jibble/pircbot/DccChat.java diff --git a/application/src/org/jibble/pircbot/DccFileTransfer.java b/app/src/main/java/org/jibble/pircbot/DccFileTransfer.java similarity index 100% rename from application/src/org/jibble/pircbot/DccFileTransfer.java rename to app/src/main/java/org/jibble/pircbot/DccFileTransfer.java diff --git a/application/src/org/jibble/pircbot/DccManager.java b/app/src/main/java/org/jibble/pircbot/DccManager.java similarity index 100% rename from application/src/org/jibble/pircbot/DccManager.java rename to app/src/main/java/org/jibble/pircbot/DccManager.java diff --git a/application/src/org/jibble/pircbot/IdentServer.java b/app/src/main/java/org/jibble/pircbot/IdentServer.java similarity index 100% rename from application/src/org/jibble/pircbot/IdentServer.java rename to app/src/main/java/org/jibble/pircbot/IdentServer.java diff --git a/application/src/org/jibble/pircbot/InputThread.java b/app/src/main/java/org/jibble/pircbot/InputThread.java similarity index 100% rename from application/src/org/jibble/pircbot/InputThread.java rename to app/src/main/java/org/jibble/pircbot/InputThread.java diff --git a/application/src/org/jibble/pircbot/IrcException.java b/app/src/main/java/org/jibble/pircbot/IrcException.java similarity index 100% rename from application/src/org/jibble/pircbot/IrcException.java rename to app/src/main/java/org/jibble/pircbot/IrcException.java diff --git a/application/src/org/jibble/pircbot/NickAlreadyInUseException.java b/app/src/main/java/org/jibble/pircbot/NickAlreadyInUseException.java similarity index 100% rename from application/src/org/jibble/pircbot/NickAlreadyInUseException.java rename to app/src/main/java/org/jibble/pircbot/NickAlreadyInUseException.java diff --git a/application/src/org/jibble/pircbot/OutputThread.java b/app/src/main/java/org/jibble/pircbot/OutputThread.java similarity index 100% rename from application/src/org/jibble/pircbot/OutputThread.java rename to app/src/main/java/org/jibble/pircbot/OutputThread.java diff --git a/application/src/org/jibble/pircbot/PircBot.java b/app/src/main/java/org/jibble/pircbot/PircBot.java similarity index 100% rename from application/src/org/jibble/pircbot/PircBot.java rename to app/src/main/java/org/jibble/pircbot/PircBot.java diff --git a/application/src/org/jibble/pircbot/Queue.java b/app/src/main/java/org/jibble/pircbot/Queue.java similarity index 100% rename from application/src/org/jibble/pircbot/Queue.java rename to app/src/main/java/org/jibble/pircbot/Queue.java diff --git a/application/src/org/jibble/pircbot/ReplyConstants.java b/app/src/main/java/org/jibble/pircbot/ReplyConstants.java similarity index 100% rename from application/src/org/jibble/pircbot/ReplyConstants.java rename to app/src/main/java/org/jibble/pircbot/ReplyConstants.java diff --git a/application/src/org/jibble/pircbot/User.java b/app/src/main/java/org/jibble/pircbot/User.java similarity index 100% rename from application/src/org/jibble/pircbot/User.java rename to app/src/main/java/org/jibble/pircbot/User.java diff --git a/application/src/org/yaaic/Yaaic.java b/app/src/main/java/org/yaaic/Yaaic.java similarity index 100% rename from application/src/org/yaaic/Yaaic.java rename to app/src/main/java/org/yaaic/Yaaic.java diff --git a/application/src/org/yaaic/activity/AboutActivity.java b/app/src/main/java/org/yaaic/activity/AboutActivity.java similarity index 100% rename from application/src/org/yaaic/activity/AboutActivity.java rename to app/src/main/java/org/yaaic/activity/AboutActivity.java diff --git a/application/src/org/yaaic/activity/AddAliasActivity.java b/app/src/main/java/org/yaaic/activity/AddAliasActivity.java similarity index 100% rename from application/src/org/yaaic/activity/AddAliasActivity.java rename to app/src/main/java/org/yaaic/activity/AddAliasActivity.java diff --git a/application/src/org/yaaic/activity/AddChannelActivity.java b/app/src/main/java/org/yaaic/activity/AddChannelActivity.java similarity index 100% rename from application/src/org/yaaic/activity/AddChannelActivity.java rename to app/src/main/java/org/yaaic/activity/AddChannelActivity.java diff --git a/application/src/org/yaaic/activity/AddCommandsActivity.java b/app/src/main/java/org/yaaic/activity/AddCommandsActivity.java similarity index 100% rename from application/src/org/yaaic/activity/AddCommandsActivity.java rename to app/src/main/java/org/yaaic/activity/AddCommandsActivity.java diff --git a/application/src/org/yaaic/activity/AddServerActivity.java b/app/src/main/java/org/yaaic/activity/AddServerActivity.java similarity index 100% rename from application/src/org/yaaic/activity/AddServerActivity.java rename to app/src/main/java/org/yaaic/activity/AddServerActivity.java diff --git a/application/src/org/yaaic/activity/AuthenticationActivity.java b/app/src/main/java/org/yaaic/activity/AuthenticationActivity.java similarity index 100% rename from application/src/org/yaaic/activity/AuthenticationActivity.java rename to app/src/main/java/org/yaaic/activity/AuthenticationActivity.java diff --git a/application/src/org/yaaic/activity/ConversationActivity.java b/app/src/main/java/org/yaaic/activity/ConversationActivity.java similarity index 100% rename from application/src/org/yaaic/activity/ConversationActivity.java rename to app/src/main/java/org/yaaic/activity/ConversationActivity.java diff --git a/application/src/org/yaaic/activity/JoinActivity.java b/app/src/main/java/org/yaaic/activity/JoinActivity.java similarity index 100% rename from application/src/org/yaaic/activity/JoinActivity.java rename to app/src/main/java/org/yaaic/activity/JoinActivity.java diff --git a/application/src/org/yaaic/activity/MessageActivity.java b/app/src/main/java/org/yaaic/activity/MessageActivity.java similarity index 100% rename from application/src/org/yaaic/activity/MessageActivity.java rename to app/src/main/java/org/yaaic/activity/MessageActivity.java diff --git a/application/src/org/yaaic/activity/ServersActivity.java b/app/src/main/java/org/yaaic/activity/ServersActivity.java similarity index 100% rename from application/src/org/yaaic/activity/ServersActivity.java rename to app/src/main/java/org/yaaic/activity/ServersActivity.java diff --git a/application/src/org/yaaic/activity/SettingsActivity.java b/app/src/main/java/org/yaaic/activity/SettingsActivity.java similarity index 100% rename from application/src/org/yaaic/activity/SettingsActivity.java rename to app/src/main/java/org/yaaic/activity/SettingsActivity.java diff --git a/application/src/org/yaaic/activity/UserActivity.java b/app/src/main/java/org/yaaic/activity/UserActivity.java similarity index 100% rename from application/src/org/yaaic/activity/UserActivity.java rename to app/src/main/java/org/yaaic/activity/UserActivity.java diff --git a/application/src/org/yaaic/activity/UsersActivity.java b/app/src/main/java/org/yaaic/activity/UsersActivity.java similarity index 100% rename from application/src/org/yaaic/activity/UsersActivity.java rename to app/src/main/java/org/yaaic/activity/UsersActivity.java diff --git a/application/src/org/yaaic/adapter/ConversationPagerAdapter.java b/app/src/main/java/org/yaaic/adapter/ConversationPagerAdapter.java similarity index 100% rename from application/src/org/yaaic/adapter/ConversationPagerAdapter.java rename to app/src/main/java/org/yaaic/adapter/ConversationPagerAdapter.java diff --git a/application/src/org/yaaic/adapter/MessageListAdapter.java b/app/src/main/java/org/yaaic/adapter/MessageListAdapter.java similarity index 100% rename from application/src/org/yaaic/adapter/MessageListAdapter.java rename to app/src/main/java/org/yaaic/adapter/MessageListAdapter.java diff --git a/application/src/org/yaaic/adapter/ServerListAdapter.java b/app/src/main/java/org/yaaic/adapter/ServerListAdapter.java similarity index 100% rename from application/src/org/yaaic/adapter/ServerListAdapter.java rename to app/src/main/java/org/yaaic/adapter/ServerListAdapter.java diff --git a/application/src/org/yaaic/adapter/UserActionListAdapter.java b/app/src/main/java/org/yaaic/adapter/UserActionListAdapter.java similarity index 100% rename from application/src/org/yaaic/adapter/UserActionListAdapter.java rename to app/src/main/java/org/yaaic/adapter/UserActionListAdapter.java diff --git a/application/src/org/yaaic/adapter/ViewPagerAdapter.java b/app/src/main/java/org/yaaic/adapter/ViewPagerAdapter.java similarity index 100% rename from application/src/org/yaaic/adapter/ViewPagerAdapter.java rename to app/src/main/java/org/yaaic/adapter/ViewPagerAdapter.java diff --git a/application/src/org/yaaic/command/BaseHandler.java b/app/src/main/java/org/yaaic/command/BaseHandler.java similarity index 100% rename from application/src/org/yaaic/command/BaseHandler.java rename to app/src/main/java/org/yaaic/command/BaseHandler.java diff --git a/application/src/org/yaaic/command/CommandParser.java b/app/src/main/java/org/yaaic/command/CommandParser.java similarity index 100% rename from application/src/org/yaaic/command/CommandParser.java rename to app/src/main/java/org/yaaic/command/CommandParser.java diff --git a/application/src/org/yaaic/command/handler/AMsgHandler.java b/app/src/main/java/org/yaaic/command/handler/AMsgHandler.java similarity index 100% rename from application/src/org/yaaic/command/handler/AMsgHandler.java rename to app/src/main/java/org/yaaic/command/handler/AMsgHandler.java diff --git a/application/src/org/yaaic/command/handler/AwayHandler.java b/app/src/main/java/org/yaaic/command/handler/AwayHandler.java similarity index 100% rename from application/src/org/yaaic/command/handler/AwayHandler.java rename to app/src/main/java/org/yaaic/command/handler/AwayHandler.java diff --git a/application/src/org/yaaic/command/handler/BackHandler.java b/app/src/main/java/org/yaaic/command/handler/BackHandler.java similarity index 100% rename from application/src/org/yaaic/command/handler/BackHandler.java rename to app/src/main/java/org/yaaic/command/handler/BackHandler.java diff --git a/application/src/org/yaaic/command/handler/CloseHandler.java b/app/src/main/java/org/yaaic/command/handler/CloseHandler.java similarity index 100% rename from application/src/org/yaaic/command/handler/CloseHandler.java rename to app/src/main/java/org/yaaic/command/handler/CloseHandler.java diff --git a/application/src/org/yaaic/command/handler/DCCHandler.java b/app/src/main/java/org/yaaic/command/handler/DCCHandler.java similarity index 100% rename from application/src/org/yaaic/command/handler/DCCHandler.java rename to app/src/main/java/org/yaaic/command/handler/DCCHandler.java diff --git a/application/src/org/yaaic/command/handler/DeopHandler.java b/app/src/main/java/org/yaaic/command/handler/DeopHandler.java similarity index 100% rename from application/src/org/yaaic/command/handler/DeopHandler.java rename to app/src/main/java/org/yaaic/command/handler/DeopHandler.java diff --git a/application/src/org/yaaic/command/handler/DevoiceHandler.java b/app/src/main/java/org/yaaic/command/handler/DevoiceHandler.java similarity index 100% rename from application/src/org/yaaic/command/handler/DevoiceHandler.java rename to app/src/main/java/org/yaaic/command/handler/DevoiceHandler.java diff --git a/application/src/org/yaaic/command/handler/EchoHandler.java b/app/src/main/java/org/yaaic/command/handler/EchoHandler.java similarity index 100% rename from application/src/org/yaaic/command/handler/EchoHandler.java rename to app/src/main/java/org/yaaic/command/handler/EchoHandler.java diff --git a/application/src/org/yaaic/command/handler/HelpHandler.java b/app/src/main/java/org/yaaic/command/handler/HelpHandler.java similarity index 100% rename from application/src/org/yaaic/command/handler/HelpHandler.java rename to app/src/main/java/org/yaaic/command/handler/HelpHandler.java diff --git a/application/src/org/yaaic/command/handler/JoinHandler.java b/app/src/main/java/org/yaaic/command/handler/JoinHandler.java similarity index 100% rename from application/src/org/yaaic/command/handler/JoinHandler.java rename to app/src/main/java/org/yaaic/command/handler/JoinHandler.java diff --git a/application/src/org/yaaic/command/handler/KickHandler.java b/app/src/main/java/org/yaaic/command/handler/KickHandler.java similarity index 100% rename from application/src/org/yaaic/command/handler/KickHandler.java rename to app/src/main/java/org/yaaic/command/handler/KickHandler.java diff --git a/application/src/org/yaaic/command/handler/MeHandler.java b/app/src/main/java/org/yaaic/command/handler/MeHandler.java similarity index 100% rename from application/src/org/yaaic/command/handler/MeHandler.java rename to app/src/main/java/org/yaaic/command/handler/MeHandler.java diff --git a/application/src/org/yaaic/command/handler/ModeHandler.java b/app/src/main/java/org/yaaic/command/handler/ModeHandler.java similarity index 100% rename from application/src/org/yaaic/command/handler/ModeHandler.java rename to app/src/main/java/org/yaaic/command/handler/ModeHandler.java diff --git a/application/src/org/yaaic/command/handler/MsgHandler.java b/app/src/main/java/org/yaaic/command/handler/MsgHandler.java similarity index 100% rename from application/src/org/yaaic/command/handler/MsgHandler.java rename to app/src/main/java/org/yaaic/command/handler/MsgHandler.java diff --git a/application/src/org/yaaic/command/handler/NamesHandler.java b/app/src/main/java/org/yaaic/command/handler/NamesHandler.java similarity index 100% rename from application/src/org/yaaic/command/handler/NamesHandler.java rename to app/src/main/java/org/yaaic/command/handler/NamesHandler.java diff --git a/application/src/org/yaaic/command/handler/NickHandler.java b/app/src/main/java/org/yaaic/command/handler/NickHandler.java similarity index 100% rename from application/src/org/yaaic/command/handler/NickHandler.java rename to app/src/main/java/org/yaaic/command/handler/NickHandler.java diff --git a/application/src/org/yaaic/command/handler/NoticeHandler.java b/app/src/main/java/org/yaaic/command/handler/NoticeHandler.java similarity index 100% rename from application/src/org/yaaic/command/handler/NoticeHandler.java rename to app/src/main/java/org/yaaic/command/handler/NoticeHandler.java diff --git a/application/src/org/yaaic/command/handler/OpHandler.java b/app/src/main/java/org/yaaic/command/handler/OpHandler.java similarity index 100% rename from application/src/org/yaaic/command/handler/OpHandler.java rename to app/src/main/java/org/yaaic/command/handler/OpHandler.java diff --git a/application/src/org/yaaic/command/handler/PartHandler.java b/app/src/main/java/org/yaaic/command/handler/PartHandler.java similarity index 100% rename from application/src/org/yaaic/command/handler/PartHandler.java rename to app/src/main/java/org/yaaic/command/handler/PartHandler.java diff --git a/application/src/org/yaaic/command/handler/QueryHandler.java b/app/src/main/java/org/yaaic/command/handler/QueryHandler.java similarity index 100% rename from application/src/org/yaaic/command/handler/QueryHandler.java rename to app/src/main/java/org/yaaic/command/handler/QueryHandler.java diff --git a/application/src/org/yaaic/command/handler/QuitHandler.java b/app/src/main/java/org/yaaic/command/handler/QuitHandler.java similarity index 100% rename from application/src/org/yaaic/command/handler/QuitHandler.java rename to app/src/main/java/org/yaaic/command/handler/QuitHandler.java diff --git a/application/src/org/yaaic/command/handler/RawHandler.java b/app/src/main/java/org/yaaic/command/handler/RawHandler.java similarity index 100% rename from application/src/org/yaaic/command/handler/RawHandler.java rename to app/src/main/java/org/yaaic/command/handler/RawHandler.java diff --git a/application/src/org/yaaic/command/handler/TopicHandler.java b/app/src/main/java/org/yaaic/command/handler/TopicHandler.java similarity index 100% rename from application/src/org/yaaic/command/handler/TopicHandler.java rename to app/src/main/java/org/yaaic/command/handler/TopicHandler.java diff --git a/application/src/org/yaaic/command/handler/VoiceHandler.java b/app/src/main/java/org/yaaic/command/handler/VoiceHandler.java similarity index 100% rename from application/src/org/yaaic/command/handler/VoiceHandler.java rename to app/src/main/java/org/yaaic/command/handler/VoiceHandler.java diff --git a/application/src/org/yaaic/command/handler/WhoisHandler.java b/app/src/main/java/org/yaaic/command/handler/WhoisHandler.java similarity index 100% rename from application/src/org/yaaic/command/handler/WhoisHandler.java rename to app/src/main/java/org/yaaic/command/handler/WhoisHandler.java diff --git a/application/src/org/yaaic/db/AliasConstants.java b/app/src/main/java/org/yaaic/db/AliasConstants.java similarity index 100% rename from application/src/org/yaaic/db/AliasConstants.java rename to app/src/main/java/org/yaaic/db/AliasConstants.java diff --git a/application/src/org/yaaic/db/ChannelConstants.java b/app/src/main/java/org/yaaic/db/ChannelConstants.java similarity index 100% rename from application/src/org/yaaic/db/ChannelConstants.java rename to app/src/main/java/org/yaaic/db/ChannelConstants.java diff --git a/application/src/org/yaaic/db/CommandConstants.java b/app/src/main/java/org/yaaic/db/CommandConstants.java similarity index 100% rename from application/src/org/yaaic/db/CommandConstants.java rename to app/src/main/java/org/yaaic/db/CommandConstants.java diff --git a/application/src/org/yaaic/db/Database.java b/app/src/main/java/org/yaaic/db/Database.java similarity index 100% rename from application/src/org/yaaic/db/Database.java rename to app/src/main/java/org/yaaic/db/Database.java diff --git a/application/src/org/yaaic/db/IdentityConstants.java b/app/src/main/java/org/yaaic/db/IdentityConstants.java similarity index 100% rename from application/src/org/yaaic/db/IdentityConstants.java rename to app/src/main/java/org/yaaic/db/IdentityConstants.java diff --git a/application/src/org/yaaic/db/ServerConstants.java b/app/src/main/java/org/yaaic/db/ServerConstants.java similarity index 100% rename from application/src/org/yaaic/db/ServerConstants.java rename to app/src/main/java/org/yaaic/db/ServerConstants.java diff --git a/application/src/org/yaaic/exception/CommandException.java b/app/src/main/java/org/yaaic/exception/CommandException.java similarity index 100% rename from application/src/org/yaaic/exception/CommandException.java rename to app/src/main/java/org/yaaic/exception/CommandException.java diff --git a/application/src/org/yaaic/exception/ValidationException.java b/app/src/main/java/org/yaaic/exception/ValidationException.java similarity index 100% rename from application/src/org/yaaic/exception/ValidationException.java rename to app/src/main/java/org/yaaic/exception/ValidationException.java diff --git a/application/src/org/yaaic/indicator/ConversationIndicator.java b/app/src/main/java/org/yaaic/indicator/ConversationIndicator.java similarity index 100% rename from application/src/org/yaaic/indicator/ConversationIndicator.java rename to app/src/main/java/org/yaaic/indicator/ConversationIndicator.java diff --git a/application/src/org/yaaic/indicator/ConversationStateProvider.java b/app/src/main/java/org/yaaic/indicator/ConversationStateProvider.java similarity index 100% rename from application/src/org/yaaic/indicator/ConversationStateProvider.java rename to app/src/main/java/org/yaaic/indicator/ConversationStateProvider.java diff --git a/application/src/org/yaaic/indicator/ConversationTitlePageIndicator.java b/app/src/main/java/org/yaaic/indicator/ConversationTitlePageIndicator.java similarity index 100% rename from application/src/org/yaaic/indicator/ConversationTitlePageIndicator.java rename to app/src/main/java/org/yaaic/indicator/ConversationTitlePageIndicator.java diff --git a/application/src/org/yaaic/irc/IRCBinder.java b/app/src/main/java/org/yaaic/irc/IRCBinder.java similarity index 100% rename from application/src/org/yaaic/irc/IRCBinder.java rename to app/src/main/java/org/yaaic/irc/IRCBinder.java diff --git a/application/src/org/yaaic/irc/IRCConnection.java b/app/src/main/java/org/yaaic/irc/IRCConnection.java similarity index 100% rename from application/src/org/yaaic/irc/IRCConnection.java rename to app/src/main/java/org/yaaic/irc/IRCConnection.java diff --git a/application/src/org/yaaic/irc/IRCService.java b/app/src/main/java/org/yaaic/irc/IRCService.java similarity index 100% rename from application/src/org/yaaic/irc/IRCService.java rename to app/src/main/java/org/yaaic/irc/IRCService.java diff --git a/application/src/org/yaaic/listener/ConversationListener.java b/app/src/main/java/org/yaaic/listener/ConversationListener.java similarity index 100% rename from application/src/org/yaaic/listener/ConversationListener.java rename to app/src/main/java/org/yaaic/listener/ConversationListener.java diff --git a/application/src/org/yaaic/listener/ConversationSelectedListener.java b/app/src/main/java/org/yaaic/listener/ConversationSelectedListener.java similarity index 100% rename from application/src/org/yaaic/listener/ConversationSelectedListener.java rename to app/src/main/java/org/yaaic/listener/ConversationSelectedListener.java diff --git a/application/src/org/yaaic/listener/MessageClickListener.java b/app/src/main/java/org/yaaic/listener/MessageClickListener.java similarity index 100% rename from application/src/org/yaaic/listener/MessageClickListener.java rename to app/src/main/java/org/yaaic/listener/MessageClickListener.java diff --git a/application/src/org/yaaic/listener/ServerListener.java b/app/src/main/java/org/yaaic/listener/ServerListener.java similarity index 100% rename from application/src/org/yaaic/listener/ServerListener.java rename to app/src/main/java/org/yaaic/listener/ServerListener.java diff --git a/application/src/org/yaaic/listener/SpeechClickListener.java b/app/src/main/java/org/yaaic/listener/SpeechClickListener.java similarity index 100% rename from application/src/org/yaaic/listener/SpeechClickListener.java rename to app/src/main/java/org/yaaic/listener/SpeechClickListener.java diff --git a/application/src/org/yaaic/model/Authentication.java b/app/src/main/java/org/yaaic/model/Authentication.java similarity index 100% rename from application/src/org/yaaic/model/Authentication.java rename to app/src/main/java/org/yaaic/model/Authentication.java diff --git a/application/src/org/yaaic/model/Broadcast.java b/app/src/main/java/org/yaaic/model/Broadcast.java similarity index 100% rename from application/src/org/yaaic/model/Broadcast.java rename to app/src/main/java/org/yaaic/model/Broadcast.java diff --git a/application/src/org/yaaic/model/Channel.java b/app/src/main/java/org/yaaic/model/Channel.java similarity index 100% rename from application/src/org/yaaic/model/Channel.java rename to app/src/main/java/org/yaaic/model/Channel.java diff --git a/application/src/org/yaaic/model/Conversation.java b/app/src/main/java/org/yaaic/model/Conversation.java similarity index 100% rename from application/src/org/yaaic/model/Conversation.java rename to app/src/main/java/org/yaaic/model/Conversation.java diff --git a/application/src/org/yaaic/model/Extra.java b/app/src/main/java/org/yaaic/model/Extra.java similarity index 100% rename from application/src/org/yaaic/model/Extra.java rename to app/src/main/java/org/yaaic/model/Extra.java diff --git a/application/src/org/yaaic/model/Identity.java b/app/src/main/java/org/yaaic/model/Identity.java similarity index 100% rename from application/src/org/yaaic/model/Identity.java rename to app/src/main/java/org/yaaic/model/Identity.java diff --git a/application/src/org/yaaic/model/Message.java b/app/src/main/java/org/yaaic/model/Message.java similarity index 100% rename from application/src/org/yaaic/model/Message.java rename to app/src/main/java/org/yaaic/model/Message.java diff --git a/application/src/org/yaaic/model/Query.java b/app/src/main/java/org/yaaic/model/Query.java similarity index 100% rename from application/src/org/yaaic/model/Query.java rename to app/src/main/java/org/yaaic/model/Query.java diff --git a/application/src/org/yaaic/model/Scrollback.java b/app/src/main/java/org/yaaic/model/Scrollback.java similarity index 100% rename from application/src/org/yaaic/model/Scrollback.java rename to app/src/main/java/org/yaaic/model/Scrollback.java diff --git a/application/src/org/yaaic/model/Server.java b/app/src/main/java/org/yaaic/model/Server.java similarity index 100% rename from application/src/org/yaaic/model/Server.java rename to app/src/main/java/org/yaaic/model/Server.java diff --git a/application/src/org/yaaic/model/ServerInfo.java b/app/src/main/java/org/yaaic/model/ServerInfo.java similarity index 100% rename from application/src/org/yaaic/model/ServerInfo.java rename to app/src/main/java/org/yaaic/model/ServerInfo.java diff --git a/application/src/org/yaaic/model/Settings.java b/app/src/main/java/org/yaaic/model/Settings.java similarity index 100% rename from application/src/org/yaaic/model/Settings.java rename to app/src/main/java/org/yaaic/model/Settings.java diff --git a/application/src/org/yaaic/model/Status.java b/app/src/main/java/org/yaaic/model/Status.java similarity index 100% rename from application/src/org/yaaic/model/Status.java rename to app/src/main/java/org/yaaic/model/Status.java diff --git a/application/src/org/yaaic/model/User.java b/app/src/main/java/org/yaaic/model/User.java similarity index 100% rename from application/src/org/yaaic/model/User.java rename to app/src/main/java/org/yaaic/model/User.java diff --git a/application/src/org/yaaic/receiver/ConversationReceiver.java b/app/src/main/java/org/yaaic/receiver/ConversationReceiver.java similarity index 100% rename from application/src/org/yaaic/receiver/ConversationReceiver.java rename to app/src/main/java/org/yaaic/receiver/ConversationReceiver.java diff --git a/application/src/org/yaaic/receiver/ReconnectReceiver.java b/app/src/main/java/org/yaaic/receiver/ReconnectReceiver.java similarity index 100% rename from application/src/org/yaaic/receiver/ReconnectReceiver.java rename to app/src/main/java/org/yaaic/receiver/ReconnectReceiver.java diff --git a/application/src/org/yaaic/receiver/ServerReceiver.java b/app/src/main/java/org/yaaic/receiver/ServerReceiver.java similarity index 100% rename from application/src/org/yaaic/receiver/ServerReceiver.java rename to app/src/main/java/org/yaaic/receiver/ServerReceiver.java diff --git a/application/src/org/yaaic/ssl/NaiveTrustManager.java b/app/src/main/java/org/yaaic/ssl/NaiveTrustManager.java similarity index 100% rename from application/src/org/yaaic/ssl/NaiveTrustManager.java rename to app/src/main/java/org/yaaic/ssl/NaiveTrustManager.java diff --git a/application/src/org/yaaic/tools/Base64.java b/app/src/main/java/org/yaaic/tools/Base64.java similarity index 100% rename from application/src/org/yaaic/tools/Base64.java rename to app/src/main/java/org/yaaic/tools/Base64.java diff --git a/application/src/org/yaaic/utils/DisplayUtils.java b/app/src/main/java/org/yaaic/utils/DisplayUtils.java similarity index 100% rename from application/src/org/yaaic/utils/DisplayUtils.java rename to app/src/main/java/org/yaaic/utils/DisplayUtils.java diff --git a/application/src/org/yaaic/utils/MircColors.java b/app/src/main/java/org/yaaic/utils/MircColors.java similarity index 100% rename from application/src/org/yaaic/utils/MircColors.java rename to app/src/main/java/org/yaaic/utils/MircColors.java diff --git a/application/src/org/yaaic/utils/Smilies.java b/app/src/main/java/org/yaaic/utils/Smilies.java similarity index 100% rename from application/src/org/yaaic/utils/Smilies.java rename to app/src/main/java/org/yaaic/utils/Smilies.java diff --git a/application/src/org/yaaic/view/MessageListView.java b/app/src/main/java/org/yaaic/view/MessageListView.java similarity index 100% rename from application/src/org/yaaic/view/MessageListView.java rename to app/src/main/java/org/yaaic/view/MessageListView.java diff --git a/application/res/drawable-hdpi/actionbar_add.png b/app/src/main/res/drawable-hdpi/actionbar_add.png similarity index 100% rename from application/res/drawable-hdpi/actionbar_add.png rename to app/src/main/res/drawable-hdpi/actionbar_add.png diff --git a/application/res/drawable-hdpi/actionbar_save.png b/app/src/main/res/drawable-hdpi/actionbar_save.png similarity index 100% rename from application/res/drawable-hdpi/actionbar_save.png rename to app/src/main/res/drawable-hdpi/actionbar_save.png diff --git a/application/res/drawable-hdpi/actionbar_settings.png b/app/src/main/res/drawable-hdpi/actionbar_settings.png similarity index 100% rename from application/res/drawable-hdpi/actionbar_settings.png rename to app/src/main/res/drawable-hdpi/actionbar_settings.png diff --git a/application/res/drawable-hdpi/actionbar_users.png b/app/src/main/res/drawable-hdpi/actionbar_users.png similarity index 100% rename from application/res/drawable-hdpi/actionbar_users.png rename to app/src/main/res/drawable-hdpi/actionbar_users.png diff --git a/application/res/drawable-hdpi/icon.png b/app/src/main/res/drawable-hdpi/icon.png similarity index 100% rename from application/res/drawable-hdpi/icon.png rename to app/src/main/res/drawable-hdpi/icon.png diff --git a/application/res/drawable-hdpi/textfield_activated_holo_dark.9.png b/app/src/main/res/drawable-hdpi/textfield_activated_holo_dark.9.png similarity index 100% rename from application/res/drawable-hdpi/textfield_activated_holo_dark.9.png rename to app/src/main/res/drawable-hdpi/textfield_activated_holo_dark.9.png diff --git a/application/res/drawable-hdpi/textfield_default_holo_dark.9.png b/app/src/main/res/drawable-hdpi/textfield_default_holo_dark.9.png similarity index 100% rename from application/res/drawable-hdpi/textfield_default_holo_dark.9.png rename to app/src/main/res/drawable-hdpi/textfield_default_holo_dark.9.png diff --git a/application/res/drawable-hdpi/textfield_disabled_focused_holo_dark.9.png b/app/src/main/res/drawable-hdpi/textfield_disabled_focused_holo_dark.9.png similarity index 100% rename from application/res/drawable-hdpi/textfield_disabled_focused_holo_dark.9.png rename to app/src/main/res/drawable-hdpi/textfield_disabled_focused_holo_dark.9.png diff --git a/application/res/drawable-hdpi/textfield_disabled_holo_dark.9.png b/app/src/main/res/drawable-hdpi/textfield_disabled_holo_dark.9.png similarity index 100% rename from application/res/drawable-hdpi/textfield_disabled_holo_dark.9.png rename to app/src/main/res/drawable-hdpi/textfield_disabled_holo_dark.9.png diff --git a/application/res/drawable-hdpi/textfield_focused_holo_dark.9.png b/app/src/main/res/drawable-hdpi/textfield_focused_holo_dark.9.png similarity index 100% rename from application/res/drawable-hdpi/textfield_focused_holo_dark.9.png rename to app/src/main/res/drawable-hdpi/textfield_focused_holo_dark.9.png diff --git a/application/res/drawable-ldpi/actionbar_add.png b/app/src/main/res/drawable-ldpi/actionbar_add.png similarity index 100% rename from application/res/drawable-ldpi/actionbar_add.png rename to app/src/main/res/drawable-ldpi/actionbar_add.png diff --git a/application/res/drawable-ldpi/actionbar_save.png b/app/src/main/res/drawable-ldpi/actionbar_save.png similarity index 100% rename from application/res/drawable-ldpi/actionbar_save.png rename to app/src/main/res/drawable-ldpi/actionbar_save.png diff --git a/application/res/drawable-ldpi/actionbar_settings.png b/app/src/main/res/drawable-ldpi/actionbar_settings.png similarity index 100% rename from application/res/drawable-ldpi/actionbar_settings.png rename to app/src/main/res/drawable-ldpi/actionbar_settings.png diff --git a/application/res/drawable-ldpi/actionbar_users.png b/app/src/main/res/drawable-ldpi/actionbar_users.png similarity index 100% rename from application/res/drawable-ldpi/actionbar_users.png rename to app/src/main/res/drawable-ldpi/actionbar_users.png diff --git a/application/res/drawable-ldpi/icon.png b/app/src/main/res/drawable-ldpi/icon.png similarity index 100% rename from application/res/drawable-ldpi/icon.png rename to app/src/main/res/drawable-ldpi/icon.png diff --git a/application/res/drawable-mdpi/action.png b/app/src/main/res/drawable-mdpi/action.png similarity index 100% rename from application/res/drawable-mdpi/action.png rename to app/src/main/res/drawable-mdpi/action.png diff --git a/application/res/drawable-mdpi/action_ban.png b/app/src/main/res/drawable-mdpi/action_ban.png similarity index 100% rename from application/res/drawable-mdpi/action_ban.png rename to app/src/main/res/drawable-mdpi/action_ban.png diff --git a/application/res/drawable-mdpi/action_blank.png b/app/src/main/res/drawable-mdpi/action_blank.png similarity index 100% rename from application/res/drawable-mdpi/action_blank.png rename to app/src/main/res/drawable-mdpi/action_blank.png diff --git a/application/res/drawable-mdpi/action_deop.png b/app/src/main/res/drawable-mdpi/action_deop.png similarity index 100% rename from application/res/drawable-mdpi/action_deop.png rename to app/src/main/res/drawable-mdpi/action_deop.png diff --git a/application/res/drawable-mdpi/action_devoice.png b/app/src/main/res/drawable-mdpi/action_devoice.png similarity index 100% rename from application/res/drawable-mdpi/action_devoice.png rename to app/src/main/res/drawable-mdpi/action_devoice.png diff --git a/application/res/drawable-mdpi/action_kick.png b/app/src/main/res/drawable-mdpi/action_kick.png similarity index 100% rename from application/res/drawable-mdpi/action_kick.png rename to app/src/main/res/drawable-mdpi/action_kick.png diff --git a/application/res/drawable-mdpi/action_op.png b/app/src/main/res/drawable-mdpi/action_op.png similarity index 100% rename from application/res/drawable-mdpi/action_op.png rename to app/src/main/res/drawable-mdpi/action_op.png diff --git a/application/res/drawable-mdpi/action_query.png b/app/src/main/res/drawable-mdpi/action_query.png similarity index 100% rename from application/res/drawable-mdpi/action_query.png rename to app/src/main/res/drawable-mdpi/action_query.png diff --git a/application/res/drawable-mdpi/action_reply.png b/app/src/main/res/drawable-mdpi/action_reply.png similarity index 100% rename from application/res/drawable-mdpi/action_reply.png rename to app/src/main/res/drawable-mdpi/action_reply.png diff --git a/application/res/drawable-mdpi/action_voice.png b/app/src/main/res/drawable-mdpi/action_voice.png similarity index 100% rename from application/res/drawable-mdpi/action_voice.png rename to app/src/main/res/drawable-mdpi/action_voice.png diff --git a/application/res/drawable-mdpi/actionbar_add.png b/app/src/main/res/drawable-mdpi/actionbar_add.png similarity index 100% rename from application/res/drawable-mdpi/actionbar_add.png rename to app/src/main/res/drawable-mdpi/actionbar_add.png diff --git a/application/res/drawable-mdpi/actionbar_save.png b/app/src/main/res/drawable-mdpi/actionbar_save.png similarity index 100% rename from application/res/drawable-mdpi/actionbar_save.png rename to app/src/main/res/drawable-mdpi/actionbar_save.png diff --git a/application/res/drawable-mdpi/actionbar_settings.png b/app/src/main/res/drawable-mdpi/actionbar_settings.png similarity index 100% rename from application/res/drawable-mdpi/actionbar_settings.png rename to app/src/main/res/drawable-mdpi/actionbar_settings.png diff --git a/application/res/drawable-mdpi/actionbar_users.png b/app/src/main/res/drawable-mdpi/actionbar_users.png similarity index 100% rename from application/res/drawable-mdpi/actionbar_users.png rename to app/src/main/res/drawable-mdpi/actionbar_users.png diff --git a/application/res/drawable-mdpi/background.png b/app/src/main/res/drawable-mdpi/background.png similarity index 100% rename from application/res/drawable-mdpi/background.png rename to app/src/main/res/drawable-mdpi/background.png diff --git a/application/res/drawable-mdpi/connected.png b/app/src/main/res/drawable-mdpi/connected.png similarity index 100% rename from application/res/drawable-mdpi/connected.png rename to app/src/main/res/drawable-mdpi/connected.png diff --git a/application/res/drawable-mdpi/connecting.png b/app/src/main/res/drawable-mdpi/connecting.png similarity index 100% rename from application/res/drawable-mdpi/connecting.png rename to app/src/main/res/drawable-mdpi/connecting.png diff --git a/application/res/drawable-mdpi/disconnected.png b/app/src/main/res/drawable-mdpi/disconnected.png similarity index 100% rename from application/res/drawable-mdpi/disconnected.png rename to app/src/main/res/drawable-mdpi/disconnected.png diff --git a/application/res/drawable-mdpi/error.png b/app/src/main/res/drawable-mdpi/error.png similarity index 100% rename from application/res/drawable-mdpi/error.png rename to app/src/main/res/drawable-mdpi/error.png diff --git a/application/res/drawable-mdpi/icon.png b/app/src/main/res/drawable-mdpi/icon.png similarity index 100% rename from application/res/drawable-mdpi/icon.png rename to app/src/main/res/drawable-mdpi/icon.png diff --git a/application/res/drawable-mdpi/info.png b/app/src/main/res/drawable-mdpi/info.png similarity index 100% rename from application/res/drawable-mdpi/info.png rename to app/src/main/res/drawable-mdpi/info.png diff --git a/application/res/drawable-mdpi/join.png b/app/src/main/res/drawable-mdpi/join.png similarity index 100% rename from application/res/drawable-mdpi/join.png rename to app/src/main/res/drawable-mdpi/join.png diff --git a/application/res/drawable-mdpi/menu_users.png b/app/src/main/res/drawable-mdpi/menu_users.png similarity index 100% rename from application/res/drawable-mdpi/menu_users.png rename to app/src/main/res/drawable-mdpi/menu_users.png diff --git a/application/res/drawable-mdpi/op.png b/app/src/main/res/drawable-mdpi/op.png similarity index 100% rename from application/res/drawable-mdpi/op.png rename to app/src/main/res/drawable-mdpi/op.png diff --git a/application/res/drawable-mdpi/part.png b/app/src/main/res/drawable-mdpi/part.png similarity index 100% rename from application/res/drawable-mdpi/part.png rename to app/src/main/res/drawable-mdpi/part.png diff --git a/application/res/drawable-mdpi/quit.png b/app/src/main/res/drawable-mdpi/quit.png similarity index 100% rename from application/res/drawable-mdpi/quit.png rename to app/src/main/res/drawable-mdpi/quit.png diff --git a/application/res/drawable-mdpi/smiley_cool.png b/app/src/main/res/drawable-mdpi/smiley_cool.png similarity index 100% rename from application/res/drawable-mdpi/smiley_cool.png rename to app/src/main/res/drawable-mdpi/smiley_cool.png diff --git a/application/res/drawable-mdpi/smiley_cry.png b/app/src/main/res/drawable-mdpi/smiley_cry.png similarity index 100% rename from application/res/drawable-mdpi/smiley_cry.png rename to app/src/main/res/drawable-mdpi/smiley_cry.png diff --git a/application/res/drawable-mdpi/smiley_embarassed.png b/app/src/main/res/drawable-mdpi/smiley_embarassed.png similarity index 100% rename from application/res/drawable-mdpi/smiley_embarassed.png rename to app/src/main/res/drawable-mdpi/smiley_embarassed.png diff --git a/application/res/drawable-mdpi/smiley_foot_in_mouth.png b/app/src/main/res/drawable-mdpi/smiley_foot_in_mouth.png similarity index 100% rename from application/res/drawable-mdpi/smiley_foot_in_mouth.png rename to app/src/main/res/drawable-mdpi/smiley_foot_in_mouth.png diff --git a/application/res/drawable-mdpi/smiley_frown.png b/app/src/main/res/drawable-mdpi/smiley_frown.png similarity index 100% rename from application/res/drawable-mdpi/smiley_frown.png rename to app/src/main/res/drawable-mdpi/smiley_frown.png diff --git a/application/res/drawable-mdpi/smiley_innocent.png b/app/src/main/res/drawable-mdpi/smiley_innocent.png similarity index 100% rename from application/res/drawable-mdpi/smiley_innocent.png rename to app/src/main/res/drawable-mdpi/smiley_innocent.png diff --git a/application/res/drawable-mdpi/smiley_kiss.png b/app/src/main/res/drawable-mdpi/smiley_kiss.png similarity index 100% rename from application/res/drawable-mdpi/smiley_kiss.png rename to app/src/main/res/drawable-mdpi/smiley_kiss.png diff --git a/application/res/drawable-mdpi/smiley_laughing.png b/app/src/main/res/drawable-mdpi/smiley_laughing.png similarity index 100% rename from application/res/drawable-mdpi/smiley_laughing.png rename to app/src/main/res/drawable-mdpi/smiley_laughing.png diff --git a/application/res/drawable-mdpi/smiley_money_mouth.png b/app/src/main/res/drawable-mdpi/smiley_money_mouth.png similarity index 100% rename from application/res/drawable-mdpi/smiley_money_mouth.png rename to app/src/main/res/drawable-mdpi/smiley_money_mouth.png diff --git a/application/res/drawable-mdpi/smiley_sealed.png b/app/src/main/res/drawable-mdpi/smiley_sealed.png similarity index 100% rename from application/res/drawable-mdpi/smiley_sealed.png rename to app/src/main/res/drawable-mdpi/smiley_sealed.png diff --git a/application/res/drawable-mdpi/smiley_smile.png b/app/src/main/res/drawable-mdpi/smiley_smile.png similarity index 100% rename from application/res/drawable-mdpi/smiley_smile.png rename to app/src/main/res/drawable-mdpi/smiley_smile.png diff --git a/application/res/drawable-mdpi/smiley_surprised.png b/app/src/main/res/drawable-mdpi/smiley_surprised.png similarity index 100% rename from application/res/drawable-mdpi/smiley_surprised.png rename to app/src/main/res/drawable-mdpi/smiley_surprised.png diff --git a/application/res/drawable-mdpi/smiley_tongue_out.png b/app/src/main/res/drawable-mdpi/smiley_tongue_out.png similarity index 100% rename from application/res/drawable-mdpi/smiley_tongue_out.png rename to app/src/main/res/drawable-mdpi/smiley_tongue_out.png diff --git a/application/res/drawable-mdpi/smiley_undecided.png b/app/src/main/res/drawable-mdpi/smiley_undecided.png similarity index 100% rename from application/res/drawable-mdpi/smiley_undecided.png rename to app/src/main/res/drawable-mdpi/smiley_undecided.png diff --git a/application/res/drawable-mdpi/smiley_wink.png b/app/src/main/res/drawable-mdpi/smiley_wink.png similarity index 100% rename from application/res/drawable-mdpi/smiley_wink.png rename to app/src/main/res/drawable-mdpi/smiley_wink.png diff --git a/application/res/drawable-mdpi/smiley_wtf.png b/app/src/main/res/drawable-mdpi/smiley_wtf.png similarity index 100% rename from application/res/drawable-mdpi/smiley_wtf.png rename to app/src/main/res/drawable-mdpi/smiley_wtf.png diff --git a/application/res/drawable-mdpi/smiley_yell.png b/app/src/main/res/drawable-mdpi/smiley_yell.png similarity index 100% rename from application/res/drawable-mdpi/smiley_yell.png rename to app/src/main/res/drawable-mdpi/smiley_yell.png diff --git a/application/res/drawable-mdpi/textfield_activated_holo_dark.9.png b/app/src/main/res/drawable-mdpi/textfield_activated_holo_dark.9.png similarity index 100% rename from application/res/drawable-mdpi/textfield_activated_holo_dark.9.png rename to app/src/main/res/drawable-mdpi/textfield_activated_holo_dark.9.png diff --git a/application/res/drawable-mdpi/textfield_default_holo_dark.9.png b/app/src/main/res/drawable-mdpi/textfield_default_holo_dark.9.png similarity index 100% rename from application/res/drawable-mdpi/textfield_default_holo_dark.9.png rename to app/src/main/res/drawable-mdpi/textfield_default_holo_dark.9.png diff --git a/application/res/drawable-mdpi/textfield_disabled_focused_holo_dark.9.png b/app/src/main/res/drawable-mdpi/textfield_disabled_focused_holo_dark.9.png similarity index 100% rename from application/res/drawable-mdpi/textfield_disabled_focused_holo_dark.9.png rename to app/src/main/res/drawable-mdpi/textfield_disabled_focused_holo_dark.9.png diff --git a/application/res/drawable-mdpi/textfield_disabled_holo_dark.9.png b/app/src/main/res/drawable-mdpi/textfield_disabled_holo_dark.9.png similarity index 100% rename from application/res/drawable-mdpi/textfield_disabled_holo_dark.9.png rename to app/src/main/res/drawable-mdpi/textfield_disabled_holo_dark.9.png diff --git a/application/res/drawable-mdpi/textfield_focused_holo_dark.9.png b/app/src/main/res/drawable-mdpi/textfield_focused_holo_dark.9.png similarity index 100% rename from application/res/drawable-mdpi/textfield_focused_holo_dark.9.png rename to app/src/main/res/drawable-mdpi/textfield_focused_holo_dark.9.png diff --git a/application/res/drawable-mdpi/unknown_image.png b/app/src/main/res/drawable-mdpi/unknown_image.png similarity index 100% rename from application/res/drawable-mdpi/unknown_image.png rename to app/src/main/res/drawable-mdpi/unknown_image.png diff --git a/application/res/drawable-mdpi/user.png b/app/src/main/res/drawable-mdpi/user.png similarity index 100% rename from application/res/drawable-mdpi/user.png rename to app/src/main/res/drawable-mdpi/user.png diff --git a/application/res/drawable-mdpi/user_title.png b/app/src/main/res/drawable-mdpi/user_title.png similarity index 100% rename from application/res/drawable-mdpi/user_title.png rename to app/src/main/res/drawable-mdpi/user_title.png diff --git a/application/res/drawable-mdpi/voice.png b/app/src/main/res/drawable-mdpi/voice.png similarity index 100% rename from application/res/drawable-mdpi/voice.png rename to app/src/main/res/drawable-mdpi/voice.png diff --git a/application/res/drawable-mdpi/warning.png b/app/src/main/res/drawable-mdpi/warning.png similarity index 100% rename from application/res/drawable-mdpi/warning.png rename to app/src/main/res/drawable-mdpi/warning.png diff --git a/application/res/drawable-xhdpi/actionbar_add.png b/app/src/main/res/drawable-xhdpi/actionbar_add.png similarity index 100% rename from application/res/drawable-xhdpi/actionbar_add.png rename to app/src/main/res/drawable-xhdpi/actionbar_add.png diff --git a/application/res/drawable-xhdpi/actionbar_save.png b/app/src/main/res/drawable-xhdpi/actionbar_save.png similarity index 100% rename from application/res/drawable-xhdpi/actionbar_save.png rename to app/src/main/res/drawable-xhdpi/actionbar_save.png diff --git a/application/res/drawable-xhdpi/actionbar_settings.png b/app/src/main/res/drawable-xhdpi/actionbar_settings.png similarity index 100% rename from application/res/drawable-xhdpi/actionbar_settings.png rename to app/src/main/res/drawable-xhdpi/actionbar_settings.png diff --git a/application/res/drawable-xhdpi/actionbar_users.png b/app/src/main/res/drawable-xhdpi/actionbar_users.png similarity index 100% rename from application/res/drawable-xhdpi/actionbar_users.png rename to app/src/main/res/drawable-xhdpi/actionbar_users.png diff --git a/application/res/drawable-xhdpi/textfield_activated_holo_dark.9.png b/app/src/main/res/drawable-xhdpi/textfield_activated_holo_dark.9.png similarity index 100% rename from application/res/drawable-xhdpi/textfield_activated_holo_dark.9.png rename to app/src/main/res/drawable-xhdpi/textfield_activated_holo_dark.9.png diff --git a/application/res/drawable-xhdpi/textfield_default_holo_dark.9.png b/app/src/main/res/drawable-xhdpi/textfield_default_holo_dark.9.png similarity index 100% rename from application/res/drawable-xhdpi/textfield_default_holo_dark.9.png rename to app/src/main/res/drawable-xhdpi/textfield_default_holo_dark.9.png diff --git a/application/res/drawable-xhdpi/textfield_disabled_focused_holo_dark.9.png b/app/src/main/res/drawable-xhdpi/textfield_disabled_focused_holo_dark.9.png similarity index 100% rename from application/res/drawable-xhdpi/textfield_disabled_focused_holo_dark.9.png rename to app/src/main/res/drawable-xhdpi/textfield_disabled_focused_holo_dark.9.png diff --git a/application/res/drawable-xhdpi/textfield_disabled_holo_dark.9.png b/app/src/main/res/drawable-xhdpi/textfield_disabled_holo_dark.9.png similarity index 100% rename from application/res/drawable-xhdpi/textfield_disabled_holo_dark.9.png rename to app/src/main/res/drawable-xhdpi/textfield_disabled_holo_dark.9.png diff --git a/application/res/drawable-xhdpi/textfield_focused_holo_dark.9.png b/app/src/main/res/drawable-xhdpi/textfield_focused_holo_dark.9.png similarity index 100% rename from application/res/drawable-xhdpi/textfield_focused_holo_dark.9.png rename to app/src/main/res/drawable-xhdpi/textfield_focused_holo_dark.9.png diff --git a/application/res/drawable/conversation_background.xml b/app/src/main/res/drawable/conversation_background.xml similarity index 100% rename from application/res/drawable/conversation_background.xml rename to app/src/main/res/drawable/conversation_background.xml diff --git a/application/res/drawable/edit_text_holo_dark.xml b/app/src/main/res/drawable/edit_text_holo_dark.xml similarity index 100% rename from application/res/drawable/edit_text_holo_dark.xml rename to app/src/main/res/drawable/edit_text_holo_dark.xml diff --git a/application/res/layout/about.xml b/app/src/main/res/layout/about.xml similarity index 100% rename from application/res/layout/about.xml rename to app/src/main/res/layout/about.xml diff --git a/application/res/layout/actionitem.xml b/app/src/main/res/layout/actionitem.xml similarity index 100% rename from application/res/layout/actionitem.xml rename to app/src/main/res/layout/actionitem.xml diff --git a/application/res/layout/addserveritem.xml b/app/src/main/res/layout/addserveritem.xml similarity index 100% rename from application/res/layout/addserveritem.xml rename to app/src/main/res/layout/addserveritem.xml diff --git a/application/res/layout/aliasadd.xml b/app/src/main/res/layout/aliasadd.xml similarity index 100% rename from application/res/layout/aliasadd.xml rename to app/src/main/res/layout/aliasadd.xml diff --git a/application/res/layout/aliasitem.xml b/app/src/main/res/layout/aliasitem.xml similarity index 100% rename from application/res/layout/aliasitem.xml rename to app/src/main/res/layout/aliasitem.xml diff --git a/application/res/layout/authentication.xml b/app/src/main/res/layout/authentication.xml similarity index 100% rename from application/res/layout/authentication.xml rename to app/src/main/res/layout/authentication.xml diff --git a/application/res/layout/channeladd.xml b/app/src/main/res/layout/channeladd.xml similarity index 100% rename from application/res/layout/channeladd.xml rename to app/src/main/res/layout/channeladd.xml diff --git a/application/res/layout/channeldialog.xml b/app/src/main/res/layout/channeldialog.xml similarity index 100% rename from application/res/layout/channeldialog.xml rename to app/src/main/res/layout/channeldialog.xml diff --git a/application/res/layout/channelitem.xml b/app/src/main/res/layout/channelitem.xml similarity index 100% rename from application/res/layout/channelitem.xml rename to app/src/main/res/layout/channelitem.xml diff --git a/application/res/layout/commandadd.xml b/app/src/main/res/layout/commandadd.xml similarity index 100% rename from application/res/layout/commandadd.xml rename to app/src/main/res/layout/commandadd.xml diff --git a/application/res/layout/commanditem.xml b/app/src/main/res/layout/commanditem.xml similarity index 100% rename from application/res/layout/commanditem.xml rename to app/src/main/res/layout/commanditem.xml diff --git a/application/res/layout/conversations.xml b/app/src/main/res/layout/conversations.xml similarity index 100% rename from application/res/layout/conversations.xml rename to app/src/main/res/layout/conversations.xml diff --git a/application/res/layout/join.xml b/app/src/main/res/layout/join.xml similarity index 100% rename from application/res/layout/join.xml rename to app/src/main/res/layout/join.xml diff --git a/application/res/layout/message.xml b/app/src/main/res/layout/message.xml similarity index 100% rename from application/res/layout/message.xml rename to app/src/main/res/layout/message.xml diff --git a/application/res/layout/serveradd.xml b/app/src/main/res/layout/serveradd.xml similarity index 100% rename from application/res/layout/serveradd.xml rename to app/src/main/res/layout/serveradd.xml diff --git a/application/res/layout/serveritem.xml b/app/src/main/res/layout/serveritem.xml similarity index 100% rename from application/res/layout/serveritem.xml rename to app/src/main/res/layout/serveritem.xml diff --git a/application/res/layout/servers.xml b/app/src/main/res/layout/servers.xml similarity index 100% rename from application/res/layout/servers.xml rename to app/src/main/res/layout/servers.xml diff --git a/application/res/layout/user.xml b/app/src/main/res/layout/user.xml similarity index 100% rename from application/res/layout/user.xml rename to app/src/main/res/layout/user.xml diff --git a/application/res/layout/useritem.xml b/app/src/main/res/layout/useritem.xml similarity index 100% rename from application/res/layout/useritem.xml rename to app/src/main/res/layout/useritem.xml diff --git a/application/res/layout/users.xml b/app/src/main/res/layout/users.xml similarity index 100% rename from application/res/layout/users.xml rename to app/src/main/res/layout/users.xml diff --git a/application/res/menu/addserver.xml b/app/src/main/res/menu/addserver.xml similarity index 100% rename from application/res/menu/addserver.xml rename to app/src/main/res/menu/addserver.xml diff --git a/application/res/menu/conversations.xml b/app/src/main/res/menu/conversations.xml similarity index 100% rename from application/res/menu/conversations.xml rename to app/src/main/res/menu/conversations.xml diff --git a/application/res/menu/servers.xml b/app/src/main/res/menu/servers.xml similarity index 100% rename from application/res/menu/servers.xml rename to app/src/main/res/menu/servers.xml diff --git a/application/res/values-af/market.xml b/app/src/main/res/values-af/market.xml similarity index 100% rename from application/res/values-af/market.xml rename to app/src/main/res/values-af/market.xml diff --git a/application/res/values-af/strings.xml b/app/src/main/res/values-af/strings.xml similarity index 100% rename from application/res/values-af/strings.xml rename to app/src/main/res/values-af/strings.xml diff --git a/application/res/values-da/market.xml b/app/src/main/res/values-da/market.xml similarity index 100% rename from application/res/values-da/market.xml rename to app/src/main/res/values-da/market.xml diff --git a/application/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml similarity index 100% rename from application/res/values-da/strings.xml rename to app/src/main/res/values-da/strings.xml diff --git a/application/res/values-de/market.xml b/app/src/main/res/values-de/market.xml similarity index 100% rename from application/res/values-de/market.xml rename to app/src/main/res/values-de/market.xml diff --git a/application/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml similarity index 100% rename from application/res/values-de/strings.xml rename to app/src/main/res/values-de/strings.xml diff --git a/application/res/values-es/market.xml b/app/src/main/res/values-es/market.xml similarity index 100% rename from application/res/values-es/market.xml rename to app/src/main/res/values-es/market.xml diff --git a/application/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml similarity index 100% rename from application/res/values-es/strings.xml rename to app/src/main/res/values-es/strings.xml diff --git a/application/res/values-fi/market.xml b/app/src/main/res/values-fi/market.xml similarity index 100% rename from application/res/values-fi/market.xml rename to app/src/main/res/values-fi/market.xml diff --git a/application/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml similarity index 100% rename from application/res/values-fi/strings.xml rename to app/src/main/res/values-fi/strings.xml diff --git a/application/res/values-fr/market.xml b/app/src/main/res/values-fr/market.xml similarity index 100% rename from application/res/values-fr/market.xml rename to app/src/main/res/values-fr/market.xml diff --git a/application/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml similarity index 100% rename from application/res/values-fr/strings.xml rename to app/src/main/res/values-fr/strings.xml diff --git a/application/res/values-it/market.xml b/app/src/main/res/values-it/market.xml similarity index 100% rename from application/res/values-it/market.xml rename to app/src/main/res/values-it/market.xml diff --git a/application/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml similarity index 100% rename from application/res/values-it/strings.xml rename to app/src/main/res/values-it/strings.xml diff --git a/application/res/values-ja/market.xml b/app/src/main/res/values-ja/market.xml similarity index 100% rename from application/res/values-ja/market.xml rename to app/src/main/res/values-ja/market.xml diff --git a/application/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml similarity index 100% rename from application/res/values-ja/strings.xml rename to app/src/main/res/values-ja/strings.xml diff --git a/application/res/values-lv/market.xml b/app/src/main/res/values-lv/market.xml similarity index 100% rename from application/res/values-lv/market.xml rename to app/src/main/res/values-lv/market.xml diff --git a/application/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml similarity index 100% rename from application/res/values-lv/strings.xml rename to app/src/main/res/values-lv/strings.xml diff --git a/application/res/values-ru/market.xml b/app/src/main/res/values-ru/market.xml similarity index 100% rename from application/res/values-ru/market.xml rename to app/src/main/res/values-ru/market.xml diff --git a/application/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml similarity index 100% rename from application/res/values-ru/strings.xml rename to app/src/main/res/values-ru/strings.xml diff --git a/application/res/values-tr/market.xml b/app/src/main/res/values-tr/market.xml similarity index 100% rename from application/res/values-tr/market.xml rename to app/src/main/res/values-tr/market.xml diff --git a/application/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml similarity index 100% rename from application/res/values-tr/strings.xml rename to app/src/main/res/values-tr/strings.xml diff --git a/application/res/values-zh/market.xml b/app/src/main/res/values-zh/market.xml similarity index 100% rename from application/res/values-zh/market.xml rename to app/src/main/res/values-zh/market.xml diff --git a/application/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml similarity index 100% rename from application/res/values-zh/strings.xml rename to app/src/main/res/values-zh/strings.xml diff --git a/application/res/values/application.xml b/app/src/main/res/values/application.xml similarity index 100% rename from application/res/values/application.xml rename to app/src/main/res/values/application.xml diff --git a/application/res/values/arrays.xml b/app/src/main/res/values/arrays.xml similarity index 100% rename from application/res/values/arrays.xml rename to app/src/main/res/values/arrays.xml diff --git a/application/res/values/charsets.xml b/app/src/main/res/values/charsets.xml similarity index 100% rename from application/res/values/charsets.xml rename to app/src/main/res/values/charsets.xml diff --git a/application/res/values/market.xml b/app/src/main/res/values/market.xml similarity index 100% rename from application/res/values/market.xml rename to app/src/main/res/values/market.xml diff --git a/application/res/values/settings.xml b/app/src/main/res/values/settings.xml similarity index 100% rename from application/res/values/settings.xml rename to app/src/main/res/values/settings.xml diff --git a/application/res/values/strings.xml b/app/src/main/res/values/strings.xml similarity index 100% rename from application/res/values/strings.xml rename to app/src/main/res/values/strings.xml diff --git a/application/res/values/styles.xml b/app/src/main/res/values/styles.xml similarity index 100% rename from application/res/values/styles.xml rename to app/src/main/res/values/styles.xml diff --git a/application/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml similarity index 100% rename from application/res/xml/preferences.xml rename to app/src/main/res/xml/preferences.xml diff --git a/application/.classpath b/application/.classpath deleted file mode 100644 index 4160c21..0000000 --- a/application/.classpath +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/application/.project b/application/.project deleted file mode 100644 index 61b7c14..0000000 --- a/application/.project +++ /dev/null @@ -1,33 +0,0 @@ - - - Yaaic - - - - - - com.android.ide.eclipse.adt.ResourceManagerBuilder - - - - - com.android.ide.eclipse.adt.PreCompilerBuilder - - - - - org.eclipse.jdt.core.javabuilder - - - - - com.android.ide.eclipse.adt.ApkBuilder - - - - - - com.android.ide.eclipse.adt.AndroidNature - org.eclipse.jdt.core.javanature - - diff --git a/application/libs/android-support-v4.jar b/application/libs/android-support-v4.jar deleted file mode 100644 index 6080877d4ade158f24ad7ccd9a10db2ac9060b47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 385685 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

6HPQhY&mkuc_8%Q=4KIb)@wP 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

6HPQhY&mkuc_8%Q=4KIb)@wP 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%0A03X%h@VcJLH+gJm3sMzG=X1S%0K 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 - - - 4.0.0 - - actionbarsherlock - ActionBarSherlock - apklib - - - com.actionbarsherlock - parent - 4.2.0 - ../pom.xml - - - - - com.google.android - android - provided - - - com.google.android - support-v4 - - - - junit - junit - test - - - - - src - test - - - - com.jayway.maven.plugins.android.generation2 - android-maven-plugin - true - - ignored - - - - - org.apache.maven.plugins - maven-javadoc-plugin - - true - - - - - com.google.code.maven-replacer-plugin - maven-replacer-plugin - 1.4.0 - - - process-sources - - replace - - - - - false - target/generated-sources/r/com/actionbarsherlock/R.java - target/generated-sources/r/com/actionbarsherlock/R.java - false - static final int - static int - - - - - org.apache.maven.plugins - maven-checkstyle-plugin - - ../checkstyle.xml - - - - verify - - checkstyle - - - - - - - org.codehaus.mojo - build-helper-maven-plugin - 1.7 - - - package - - attach-artifact - - - - - jar - ${project.build.directory}/${project.build.finalName}.jar - - - - - - - - - - - - - org.eclipse.m2e - lifecycle-mapping - 1.0.0 - - - - - - com.google.code.maven-replacer-plugin - maven-replacer-plugin - [1.4.0,) - - replace - - - - - - - - - - - - - - diff --git a/libs/ActionBarSherlock/project.properties b/libs/ActionBarSherlock/project.properties deleted file mode 100644 index 5ca7d62..0000000 --- a/libs/ActionBarSherlock/project.properties +++ /dev/null @@ -1,12 +0,0 @@ -# This file is automatically generated by Android Tools. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file must be checked in Version Control Systems. -# -# To customize properties used by the Ant build system use, -# "ant.properties", and override values to adapt the script to your -# project structure. - -android.library=true -# Project target. -target=android-14 diff --git a/libs/ActionBarSherlock/res/color/abs__primary_text_disable_only_holo_dark.xml b/libs/ActionBarSherlock/res/color/abs__primary_text_disable_only_holo_dark.xml deleted file mode 100644 index ea7459a..0000000 --- a/libs/ActionBarSherlock/res/color/abs__primary_text_disable_only_holo_dark.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/libs/ActionBarSherlock/res/color/abs__primary_text_disable_only_holo_light.xml b/libs/ActionBarSherlock/res/color/abs__primary_text_disable_only_holo_light.xml deleted file mode 100644 index 0edb33b..0000000 --- a/libs/ActionBarSherlock/res/color/abs__primary_text_disable_only_holo_light.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - diff --git a/libs/ActionBarSherlock/res/color/abs__primary_text_holo_dark.xml b/libs/ActionBarSherlock/res/color/abs__primary_text_holo_dark.xml deleted file mode 100644 index 2bcfd0b..0000000 --- a/libs/ActionBarSherlock/res/color/abs__primary_text_holo_dark.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - diff --git a/libs/ActionBarSherlock/res/color/abs__primary_text_holo_light.xml b/libs/ActionBarSherlock/res/color/abs__primary_text_holo_light.xml deleted file mode 100644 index 198384f..0000000 --- a/libs/ActionBarSherlock/res/color/abs__primary_text_holo_light.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_bottom_solid_dark_holo.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_bottom_solid_dark_holo.9.png deleted file mode 100644 index 769463b369a5185ba2d2fdf26abf058086ebcd08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFY^S!aZFaLn02py|Iz^fCC51!MDwC ze!c%VXGhEQ)_dJsezHtpNMD|7Dac@a*_ZJyulFV2w{5C|YCbaz5)ZX-3ak0tIJ#lm tp_aeGY*)k&iW*FhzahTiJD1r}=BlLiI{(TJ=>e@^@O1TaS?83{1OUpzopr0A6)2vH$=8 diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_bottom_solid_light_holo.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_bottom_solid_light_holo.9.png deleted file mode 100644 index 73050476e77aa798919b829a5566973e231f9d49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFY^S!aZFaLn02py|Iz^fCC51!MFRR zxpqaJ>-4UOe6iPKwm$=BLD{Wo!i)yScSSDT-Jo*!N?wFe;-MB!VKtu_20%tEPqwzt q4f{lgTEQ5`;-9UxjMeKCf^DQ_uhd?;-Btm#g2B_(&t;ucLK6V6dokDm diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_bottom_transparent_dark_holo.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_bottom_transparent_dark_holo.9.png deleted file mode 100644 index 712a551ece87b2544433ac982382a087e7f1731d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFY^S{5)M8Ln02py}Xf^L4oIp!}}xu zHrx6hVG;aws8xB@i!KMDZA_cCWy>wsRQS4KRST!En$HY_#6vK~{lt8cLjun}a%VT6 c)z9eScC>M27UGHi05qAw)78&qol`;+0QSr+Bme*a diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_bottom_transparent_light_holo.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_bottom_transparent_light_holo.9.png deleted file mode 100644 index bf3b9438b16543294498ba27e51d4e878c8ead5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFY^Sd_7$pLn02py}Xh4fCCS+;oB*H z(}QQZt5vXQMa=PTZk@YrXXvE3+ofW5$)(cU#3WF_jrSY!c@8l>`*HAE!gKCvr?`99 W=bm|#aNiDSFoUP7pUXO@geCw#94y)Z diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_share_pack_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_share_pack_holo_dark.9.png deleted file mode 100644 index 81b87b86c959a98c478177270c979763831ebf66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2863 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 N002ovPDHLkV1kHdRS^IH diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_share_pack_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_share_pack_holo_light.9.png deleted file mode 100644 index 8fc83e22efde5509c563c97a836d869d05ff5dc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2859 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 JPDHLkV1neRPs;!R diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_solid_dark_holo.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_solid_dark_holo.9.png deleted file mode 100644 index cbbaec588ec98bbc8a518a9ab5a9c469482341ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFY^SB0XIkLn02py}Xe3KmgB?fcJu8 z^Zp*+-L#E6MBZg;W9F9wttxZ4PHc?!oG~+pYe(tbxxSpjYCbaz5)ZY&8G8*Bq7ylO npZ&2~Yqrog$!|3Wm+fFU5UE)t_U_Fapd}2Ru6{1-oD!M-^V;Vpy{TG>rs2jRbt|WpWjh#Ji#?9Gi^wblTEgJz>gTe~DWM4fZg4bX diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_stacked_transparent_dark_holo.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_stacked_transparent_dark_holo.9.png deleted file mode 100644 index 1e39572224b24a81ed4d73923280ba2724dbaf6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFY^Sf;?RuLn02py|Iy(L4oIp!})_Q zZ}wlfoYKNk`|wbZR*CB+2cd0Do4#G+S+1#YsD)El&1Z%|BAjt`!_S2)TNKYc{m-!5 f_v_(jT(cfAPEEXE)c4^Y$T|j3S3j3^P6 diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_stacked_transparent_light_holo.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_stacked_transparent_light_holo.9.png deleted file mode 100644 index a16db853e94af78c0739d9b89b578e2a8021c856..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFY^Sd^}woLn02py|j?`fP(zopr08IHUH2?qr diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_transparent_dark_holo.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_transparent_dark_holo.9.png deleted file mode 100644 index 0eff695d82911a73874d871f3a7b23b71dd8ab44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFY^Sl001;Ln02py?l}LfC5j;!{`N< zEvnsL$t-6rWU%$psDGg1|4DLDj`q~RzPqNgR|nl=*Rt6dx_ol~p-I||JQ4;82O1ce y*`SQyBHQ|!3>bf({j~je;Zla%ZD->HG+$+yO5M3zoXrBXjlt8^&t;ucLK6T4R5w)s diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_transparent_light_holo.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_transparent_light_holo.9.png deleted file mode 100644 index 219b170fa67aa2ef8e0b11ebff90c1629ba7e97a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFY^SB0OCjLn02py?l|AL4l*?;q8?- zrB_<6lUu~-<@8GYocm9fskyGHQx2!G9uAwU_k&&MlS%_4GaHYDLBatTBRp}nY76HL mkjg^D5fnx&0glSHJj>3%>1Jqp^q#PeS;bnL@oAJ;NJ=s*Cb_P#ZKbLh* G2~7YBfgFPX diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__btn_cab_done_pressed_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__btn_cab_done_pressed_holo_dark.9.png deleted file mode 100644 index 66adffed632f0f6267afe6dc2f518adb6a83ca4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^EI_Qo!3HFq_#{<Lb diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__cab_background_bottom_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__cab_background_bottom_holo_dark.9.png deleted file mode 100644 index 1d836f65a1fffea301e9cf36770b21b48b3b8132..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFY^SVmw_OLn02py|R(B!9jra;>r_8 z?%b*io|Yn;UGT9};ZTu}!9}%xc^%IgtXD4oJ@0X-F7B%4f|j+c$=0hv54CU#tNF|@ sNQ5wMgi8eI0r?xYZ}@0_Yf6jsMX$B_pXOhT0oudh>FVdQ&MBb@0DzD;x&QzG diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__cab_background_bottom_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__cab_background_bottom_holo_light.9.png deleted file mode 100644 index 5818666d4e64b93da73bc3d6dc2764bcb500359c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFY^SB0OCjLn02py|R(>fCCT9!M7)Q zv diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__cab_background_top_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__cab_background_top_holo_dark.9.png deleted file mode 100644 index 564fb34b4308750b6922f320e9e114b080ecd538..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFY^SqC8z3Ln02py}XdO!9jra;!2L@ z<=I|~`ucZlc5hPnsi>TGwM)Is^N?0TPy5{UQpwgqqAoKG5)ZX-3ak0R7;B{1mWZ}( p*lxaUe)ue*Z}vC-G%ee~_}P|!&DqTD7lF1gc)I$ztaD0e0st(KG%NrB diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__cab_background_top_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__cab_background_top_holo_light.9.png deleted file mode 100644 index ae21b760fb1ebecac3389164251b0fa14f580f5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFY^SqC8z3Ln02py>gKAfB^?4dC zy{Qwe+I<(;Zrk3}qFy7o$Hqotreyxi(D>i`gF-*@tj&^T;Xws!Omj@dZ?l#4Y_?*} ivA^-x{8q}NM@;fbHo20HF^oW47(8A5T-G@yGywny6)bE3 diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__dialog_full_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__dialog_full_holo_dark.9.png deleted file mode 100644 index 79e56f522b2837bd9f579b28f037ad5eafaaee8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1414 zcmV;11$p|3P)cSnqT^=WQ7*OFqW%ysfqGq3fLYCng$eebY1E zq0h)!qMt>^T{!1KLrdv5=!(bMwnfb7mMF4BgVA@!3k##^X|etG%o8VLfn)&kp1$5* zAHx|3EF9@?)w)=}!OothSF(h}LSVs2n}u~V8rR2gA&m?6GFm9LT5i!5ovh2$`aOLf zDMwpCv(UIN+s(qhT71rU;E=VYR%2(wIy9)U9BqNMU?EvKj~0!zxmxOREjkZzh+iq_n}2*GaEP(@ILD!5 zWBguqUH^M`clY;tz5a@wsI&tR0g7j89WEv$&WS`s3jmAj>+65+@9$R+4-crSDsl+t zoXD~ai^by4tE;Qe>-G9CHN@f2j4rXz#$jzQA^^+B$H$Mix3`1-5a+ZsO@p#5Q53}= z0G4QnFC7vyL_!;@%<@Jv>_k)mSUx>Hz18n=PE3d}%kYsC@*I)N0NNv^lI%s;wg9j! z%knLLgEIoQ+bysY63^&#(^_eOc(NT6QxTdoZI(#S<~ro`ne!tS(gH7T&zUX-UZRk7 zy|5!F77`FowzZg?X(M)KAw}<4SRP51e8qZ>m)V;$Z3?tS#CiaZ^hhEi?U_=yRh(%c zcGk9kwMUBGYjYt@pHyCSltyExNUHHFevMy@-l#r~QEjQ;(4?Q~r4samHh{FF{bU7StYxgeBAZQ`6E7N`VLYGS_ z;oj>aHT`D+d1$*FJhVBd!G+`uf(ywR1Q(Js2reXN5G)~C&xiARXWFDHmGF81Z6U>K z;#g%)oXa8RP+ENtZO$MZBP0)Pm&4Jv?h_KbHF>VdnKo?a-t;CVB(9^gh389`0#_~3 z>r7%ovdX{d8amFjk%uF>Vp~*9sp-GKg_vAO(?{&AZLdjA|Mdo3?oA8H>)1>mc|==# zB~EQxV&cD40$n%8&w#s-rjOWJ+ddiIQXYxR!^y#)tE&3)24CJ80l~J_MCXPu>Ml3AI+9BHcJ4%0r(Kw z@2dYHj4#nGKH!fqjRVUuh**Aw_CvMrs{b>Lm!YwzO4di>6N@*}Phg5Tw&B1fy2S@v zNaMh=r`Sx3>1SxA8q+hl==5I;NtblfC(XkF^KkH7ZKuDGcq0~@mC!ryi=K7WXgde? zOwz>rq{P&!A!(hIr~D!&pe-W#G7`?LQYh|`P7hzs(O!weT#2|xih3m$l64(P7wFd8 z$(YnkvI-Blh{l8EAha{kf+|%%mTX6hk;YCcRo{6`6g>|oKBz>Tb24JLyVyI4p!izS z!8wv9b%$RIiIZ@y?B&nGjRPyvaF~-xlb-U|=!P~^8?n&FNw@wIvQA!p;xDy1AK0dR zu~CaAl^btMM>A?9->NQ&|AnVmzdt!!WF>xutSl`;$84s2a_=ari#ecl- zo|KSyJXTD=1$2JI1Ql!6el7Y8-dCZ-i%gs^mMBu<;eLzP8a;YIXA&Hxi>7JtAFa#2 UvCQ(L;{X5v07*qoM6N<$g1g$KMgRZ+ diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__dialog_full_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__dialog_full_holo_light.9.png deleted file mode 100644 index e029f210b9a81ed4765d31e90b6e49dc8aa37bed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1537 zcmV+c2LAbpP)P*hY@RCILOyI+)4*Y%ioMH6eaT8-v42qXrI z0|4iGEk=d4Xm52^#H?WUz%bBygG}I|;L!cJM*+u%I9T*&&%x@0sx#0Qk0mTmeRX1h$MIxNMY&% zsz{Hz01C^N@8p~dFgXbIRub%{CUOKKzAQ3rfl0r3M&j^DZL~BnC0R+zNTfH*0>l>% z6xe!^4oO*vg0sbY%(i4Znw@-;nUbs&1zN~PIe02zy)Qcz&8uA?+OU=`?e2Zs5}uJN0M*6C#a{)YX?>^k&iO8v%U{pV&i+9YXUL@sAe1fQs10%V6ikBo z^7Qod_s{$xhgN}Tci-i5`3pX{;N4;1Au(Bm7x@)z#1I9LmdL~RrF4uC5rsHs>tE+w zbjvJ)LKv+{MYbuBrU=TBLj=6Xm=@t7;baF+QjNr0K02$09MPPz_Q^dZ5CLh8#Oov4 z0!TsP8|Jz<^->fRi@r;w5OrSCkw6L?N(J|#V;?nA78HxV{Q97DD=gWeOHxKs4U)p3 zSoD>;waz;geHn?ahed6Tq%7rduPgn zV$nDE$&ajtWS5-`4=n>hvFJNE&bxxNGnt2!k)T-g9UO0!_0BFb6cm%bLuC>qYeBK* zyN@VHxuTkNE#cFa@PaJz!! z*)p0eo;YjAyoc}Lcn`@)ql2XA#Le!l%y)3C`#|D`qk*LC#Leoh&{v9irz@IDt(4j|E-ey3YJCdAoj z17Q35`nvale)TKB+I=4%AAxk%w!OMGAf++t+Mb@Cemp-vW4j&J%V|A%#TR&cd&9%S z1Mctdf1tZ-6W>Id5JKwGXhvG!+}wOSKR^Gos;Zyq!S}5X*>+05G4|7V9G{hQ?!VjH z+iw8YkTX)YMrymYx~{`?w$U_yh$q-O1#m*zu<(hQDx}lJ70s)V5Io{ZN7v2rMwVC7 zhTm_2@1*&pTK&uP8_~o&lye*5+om^+1{h zqafFH?O0X{OUO1M^YAPb=F`bd6<0LB=s!LE=ilN39Gach?DYt$CL6UhXTc;$2zpT2dqqQrIZWT*_yH->_|IcgE|Y&S_AJ4lX{3 zlIkT6RWeyS^JtZ1q^3@yK=Cm?J&*-y*C;dpYgTSF&bztX%>V7a(kL+ra#JUT-|=or zs-McUNbE?uO3e#!@v#wf-Fu%ryG^`~69lNs`%MmnTRbrM$471B$+eE{K4hK$mCQ9h-Z$E`tJc<=E)8`p?U8s&`700000NkvXXu0mjfb2aWW diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_ab_back_holo_dark.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_ab_back_holo_dark.png deleted file mode 100644 index 897a1c11a06923f0ee630a3ec44b40118c1fa4d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 602 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1rX+877l!}s{b%+Ad7K3vkswhI zFm^kcZ3hx8D{xE)(qO#|6+TOsF)%PDdAc};Se)*?;+-wxD8l++z18QgepiI9o*=R4AA9|r|3}>uTm;M6YILUxmVi!uBjgaN)~;(wEWpmNk!cW z(d%Z<{E>P~YK!lT=8FgRsYuTJwQ$0$u+I~@?rdLb^6_f+5jpHV#tRQqPS1ijb30F2_W#pYUFO#_XV=?h zOHP?#2^DqDa diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_ab_back_holo_light.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_ab_back_holo_light.png deleted file mode 100644 index 0c89f71407e8d51f92ff6a10b1ae40ec902aa04e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 546 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1rX+877l!}s{b%+Ad7K3vkswhI zFm^kcZ3hx8D{xE)(qO#|6+TOsF)%P{dAc};Se%}E<)W9gqsXz3_j5LNPFu1pO1DK} z+N#=yeg8w_ofMzAMJao1SUGXl-8U7Joy@GYEX@zknfd?wSxaLcYqyHhr&soQ-EO{p zw!~UfNcQJK)l+|B(yvWaZRmKvsC8=g<+E=!6%t;!XnxPxBUZuOVKlwt*0FipR-Y02 zmCh$xWIQ?dubRMH%k4r1TjlOEFztJ(`Lu4f+1J+&0<|T}CPeP?x_?Pcpm5>hNwa5M zzkQR1sjpY$)<2WmGuJ)*zvffcmaNUK`~10Vr~dw8eVc_z%*|+OqxE^sCGQ0OTrOO6 z<>J@Zf0Ym33CMeTp!xW+<7NU=B(%1ExnpuV-^$?oQTEn-hjMN&=46?A$U{|X$JUzr zjr;q)=$3Bvc`c`@@Ze;4?7{TSRWGgUnXHd<-`o)9JVUa&78r!8C9V-ADTyViR>?)F zK#IZ0z|c_Fz+BhBFvQT<%Fw{d$P~!6GB7Z{-*6d4LvDUbW?Cg~4NgrK`9KYlARB`7 r(@M${i&7aJQ}UBi6+Ckj(^G>|6H_V+Po~-c6)||a`njxgN@xNAF&x-_ diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_cab_done_holo_dark.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_cab_done_holo_dark.png deleted file mode 100644 index d8662e3f0fdae62cdee68c184a30fa9e421dc338..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 713 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}a}trX+877l!}s{b%+Ad7K3vk;OpT z1B~5HX4`=T%L*LRfizez!?|}o;S3Cn7d>4ZLn02pop#z!+EApeUwz>goe2TrwSq2J zirU3kvaXhOUTIG}?do{Paly7dd_m%&JI?q_-onB2%KO8{j^-Q>wzNlYp6R5&dH;Rm z|KbvtPbZZ7*R_9QUBqkhp({MdL+G`PeiKVkcC&4Y!{nAd6Z!S-oqj3U!mzMkIqyf? zf)_G(nEp@p{`aZ-I!9g5h7aq1927O&FPT&GvG@NuQA5$TGve!iOqW^IxiY{>!{pzO z!{3V<)Sk6$zkBfg;!caFvF0E2Z#WAV9{aHQL)vPusEmizHw=GVH2J}B^#kKc_ZNxM zzDF#RGe0;TaIo&I-m~b0*sP8To$2@Yde+QKc8kg_`XHU5q@;HFk@ug+O{X5aZ~nk~ zjknIKwfM~0Z^b864VUMM@zwGAdYt)v<(Nz4IlImB@8#qJ%zn(A@Z29bd}4MpKn$sTM506307QmPCTFYr(@#O zpZ-(V%YE!?30QE(DXivDMdI0PFM+AKOT1>hnX-6tX;O6(d#2d)iSBZ_kN7m7WzTRr zzEA`h)2bz|5hW>!C8<`)MX5lF!N|bSP}jgh*T6i)(9Fuf$jaCl$hI;t2>JhQGm3`X z{FKbJN)!#IR;K1a1kqq?mJtlpAPKS|I6tkVJh3R1!7(L2DOJHUH!(dmC^a#qvhZZ8 Q4Nwt-r>mdKI;Vst0K3d3fB*mh diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_cab_done_holo_light.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_cab_done_holo_light.png deleted file mode 100644 index ed03f620f8ef9e969d0471ab76329038e25c9f0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 737 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}a}trX+877l!}s{b%+Ad7K3vk;OpT z1B~5HX4`=T%L*LRfizez!?|}o;S3CnFFjoxLn02py%z6(IY8q0$M=`{k_{&Q=;t<2 zt8!*r>&D`|W2$+>pS=eAb}M##+^cbdA4dCLPr0$oL~Mm8Bn#4$+9@L$(#*Pp%fW0&@t4F~+Q4$6OeIrG`|nG22@uVa-C zJ=H0n)NABBE9V2ZrDh$}Ob?>#U7^{{%b z^;_|*S@)*|RLscvyw85$_Y2}8p?L-UY)vO;|NFUQJ(sNEA?BESpVrme#d7mboB7l} z-Tl+e|M{(6F|!lpnSU$jtXi?CXvKcs<;$n_y<4FKOaZDTt`Q|Ei6yC4$wjF^iowXh z&`{UFLf61N#L&#jz{twj7|6CVFbMhoZ8M67-29Zxv`Q2WrdForKm^fXYnBlV)F276 tAviy+q&%@GmBBG3KPgqgGdD3kH7GSPrLyp3str&PgQu&X%Q~loCIB{EJ2wCT diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_clear_disabled.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_clear_disabled.png deleted file mode 100644 index d97c342d53690e6d286efbe5f37562747a49b96d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1774 zcmVU8P*7-ZbZ>KLZ*U+lnSp_Ufq@}0xwybFAi#%#fq@|}KQEO56)-X|e7nZL z$iTqBa9P*U#mSX{G{Bl%P*lRez;J+pfx##xwK$o9f#C}S14DXwNkIt%17i#W1A|CX zc0maP17iUL1A|C*NRTrF17iyV0~1e4YDEbH0|SF|enDkXW_m`6f}y3QrGjHhep0GJ zaAk2xYHqQDXI^rCQ9*uDVo7QW0|Nup4h9AW240u^5(W3f%sd4n162kpgNVo|1qcff zJ_s=cNG>fZg9jx8g8+j9g8_pBLjXe}Lp{R+hNBE`7{wV~7)u#fFy3PlV+vxLz;uCG zm^qSpA@ds+OO_6nTdaDlt*rOhEZL^9ePa)2-_4=K(Z%tFGm-NGmm}8}ZcXk5JW@PU zd4+f<@d@)yL(o<5icqT158+-B6_LH7;i6x}CW#w~Uy-Pgl#@Irl`kzV zeL|*8R$ca%T%Wv){2zs_iiJvgN^h0dsuZZ2sQy$tsNSU!s;Q*;LF<6_B%M@UD?LHI zSNcZ`78uqV#TeU~$eS{ozBIdFzSClfs*^S+dw;4dus<{M;#|MXC)T}S9v!D zcV!QCPhBq)ZyO(X-(bH4|NMaZz==UigLj2o41F2S6d@OB6%`R(5i>J(Puzn9wnW{e zu;hl6HK{k#IWjCVGqdJqU(99Cv(K+6*i`tgSi2;vbXD1#3jNBGs$DgVwO(~o>mN4i zHPtkqZIx>)Y(Ls5-Br|mx>vQYvH$Kwn@O`L|D75??eGkZnfg$5<;Xeg_o%+-I&+-3%01W^SH2RkDT>t<8AY({UO#lFTB>(_`g8%^e z{{R4h=>PzAFaQARU;qF*m;eA5Z<1fdMgRZyw(kRs!-6#o(LP%Wr3O<1=S3ZFo9z$bj(u70=3}tI#6DWj&F;Ob99q4>t z7t_JEGi|0s7bcyiT{LI@zd7fguOSTo_Tn%A3;+W_$om&@e+U59{C2xK>{t*000Isi zc-XLE_dt-QB?k*OY(G1$>uu7@#B2;ALf{;yd>Fer3 zxz>Q~gZLw#9*+Wwy1biLp*!&n>VXAqU0c|%HDJZ1jZ6!oDKES7+VWmrg9gjr1HUt9 z$&h=(yP22-u6mx^E9uZ+0pKCX;bJ-&1r%+uT+pDpXT$;nS`cq%Mnv${vs}4kKnFnO zP;ojL1*vOGZSwsAS`q0H5q$MLS1wr~GAT|cBOrBcX}?{*UqB~HsT)hjem%$S zQCYe=d4(eMUA?{!rJtE>6>2uC>s{nMUVQiovq!7(tSuZUVsBCpu612n+{HyeG&{C3 zg%Qx;Ym2+tg`4}D-D9)knmeH3*ac5hx88#8rcKL0fWiC005AajcYxmm08)I=nXx}} QjQ{`u07*qoM6N<$g6k0wDF6Tf diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_clear_normal.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_clear_normal.png deleted file mode 100644 index 33ad8d4b891b14d934e470b2222571ea859c77a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1945 zcmV;K2WI$*P)U8P*7-ZbZ>KLZ*U+lnSp_Ufq@}0xwybFAi#%#fq@|}KQEO56)-X|e7nZL z$iTqBa9P*U#mSX{G{Bl%P*lRez;J+pfx##xwK$o9f#C}S14DXwNkIt%17i#W1A|CX zc0maP17iUL1A|C*NRTrF17iyV0~1e4YDEbH0|SF|enDkXW_m`6f}y3QrGjHhep0GJ zaAk2xYHqQDXI^rCQ9*uDVo7QW0|Nup4h9AW240u^5(W3f%sd4n162kpgNVo|1qcff zJ_s=cNG>fZg9jx8g8+j9g8_pBLjXe}Lp{R+hNBE`7{wV~7)u#fFy3PlV+vxLz;uCG zm^qSpA@ds+OO_6nTdaDlt*rOhEZL^9ePa)2-_4=K(Z%tFGm-NGmm}8}ZcXk5JW@PU zd4+f<@d@)yL(o<5icqT158+-B6_LH7;i6x}CW#w~Uy-Pgl#@Irl`kzV zeL|*8R$ca%T%Wv){2zs_iiJvgN^h0dsuZZ2sQy$tsNSU!s;Q*;LF<6_B%M@UD?LHI zSNcZ`78uqV#TeU~$eS{ozBIdFzSClfs*^S+dw;4dus<{M;#|MXC)T}S9v!D zcV!QCPhBq)ZyO(X-(bH4|NMaZz==UigLj2o41F2S6d@OB6%`R(5i>J(Puzn9wnW{e zu;hl6HK{k#IWjCVGqdJqU(99Cv(K+6*i`tgSi2;vbXD1#3jNBGs$DgVwO(~o>mN4i zHPtkqZIx>)Y(Ls5-Br|mx>vQYvH$Kwn@O`L|D75??eGkZnfg$5<;Xeg_o%+-I&+-3%01W^SH2RkDT>t<8AY({UO#lFTB>(_`g8%^e z{{R4h=>PzAFaQARU;qF*m;eA5Z<1fdMgRZ<`$>NYxmjX{xd; z@m&{rFo*<6ia-&%?9S}Yj1NoMU6_?!qi=gB^D?>lzI)G{bI*)0`G1E*K~NAB1j^1w z0>tKJZeH2PwwY!w0t6BY3JN+p33SuQLYI(HkdcX#K*!j*7|BwgVB_Kabv%L#JBpC9 z;EQnJ<+1&B?8Szh`#X@?^XlV2b_Y-K5FTsACcc7-srF!J%cFRa5f;nX88so}^!n$z zoaNXjzHYk7GONT$qz7ti^`5C0{0Fct&sMz04AGszwAz7*v3&RHh^`S091pfpv3(b5 z_*4F8KwG3jHT04 zL)Y{;8%;+;M^cIuK77Jo4_dVE!}GH&5hG!l3Z``(DA*|D!7J6TwaW^Q$!{BPvBY1f zfE_QM@bQ{@gcj@j`1~x3tfQh^)q%AjL($PLWE_*Djkj1Kg2074d~6f{Nje^K7u;94 zsJv3$@rsafhDHP55kG-dHIPmFAA9=;s{MWcddV( zJFI2mtpvLr*Csj|Q8r$mAN(8x6+<_AKkZ*4LX3DO{@?b4Jsi2Lc%zUffeHejlb9+rq0PNT9OD z;u|vq-{=}^jSayj%5h_}ZkgGdzKgPOi{A&T+VkZWUN=qCxUcB??b4_oXFbpmY{r8l zAAy7`+*;!URqf8e1DIx-VoXo49%u+2!egDT);TPBON$juHQN2v;6f%oLvg2T=HjTH zV68;SR?~`g%UoVKaQk-bqv^ppmWX8HlM0b+kmj2@1ok$Lvua%nR#_xaD8_}Gdqhyt zw&OGA*(k-%DiJgiJLg#o1Tr!L6T|w0FfHFCBm_osWr=J^mg5%t6~${t-Jw00000NkvXXu0mjfxs7-r diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_clear_search_api_disabled_holo_light.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_clear_search_api_disabled_holo_light.png deleted file mode 100644 index 3edbd740858acce452a65675b594d87cd85c4cde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1504 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%xRe+5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8nflaTYtD^x(vzwcwbv89=@ zo12R>knQRQ)9aa6T#}fVoC>oy6KF3~uNhvwR?bDKi6!|(A^G_^uoMuGkzbNuoRMFk z;2dnK;G3A7nFr#7q6gwzm(-%nveXo}qWoM1aQIqfVzJ-F(A>z`+0Dqw5#euVHw$9} zR|{85phuLTdQ->=Gku_A^g)RODY3wWfGH5fgeQF<2cCIS^ME;~2$(fE*e!Y)7?=b+ zT^vIyZoLURops1T#P^YM)`G6?uC=+kf7_B4{*@J9^x)duU6<$Tu^imLQtVB+#DuWI zKp&sr#e2ikRF+h_7hGg6C3|* z?e*8ufgcND|MEKid{9C;-~RZ9Bc^sP~EP3ND_zG5Dxwk6j&$wE~4;Qc*`ssan{ zzn`9=dZ&RsirvSfCP;`whUHEmQ}f9$MSB`#rfaa*Eq?H{s4_-JY+eJUGP9%1oq zJCJw4f2WB2si`MZ$~H#$*nP`3S@opI(pSE?i0N0@>$2Vb7oL|#u)gB_!dQ1$La5q` zDeOVQ4#QJ|EiB?JGJhRxA5Ld^&RpYp@TAicHpRs4(vR3C88QC9{5(weR))#4lPN-s z1=7=NbKU$Nr0Hgbao(RTxaH2IZ#(aDrMoH3_0umA{h;I6BI6;^&o0#XM(`ImzsjuT zTnrQ3)U=jJbp=fS?83{ F1OTcH9Pt1E diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_clear_search_api_holo_light.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_clear_search_api_holo_light.png deleted file mode 100644 index 90db01b5bcf1246d6a94e83930cac63c93a6cf83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1540 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 diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png deleted file mode 100644 index 2abc45809c62513224e9d695542cb8dd8e8087b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezt=sPZ!6KjC*gdALL|E;9+*q=6m<7 zlueVX_4IZHnJ0qE#_rG0T(kiyWMEjjhCTn?qu5pu`=4q}27?c$C=-xvpo(CHaDZeV Zn6Yoz!5==w*?y}vd$@?2>|OKBsl;8 diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_menu_moreoverflow_normal_holo_light.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_menu_moreoverflow_normal_holo_light.png deleted file mode 100644 index bb6aef1d069a14a7fc1cea9780c919c61679e4fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpUtXipc%kc@k8uWjUIP~c#3xZ62X z=G4p^oaPsfxfS0Jish)R3f(&WG9yqa14Evg(y_dGGlfCy2iXqR3?>_SEs{VyhV?DH iJ0OaDc|iOR772{!kNsXaOPT8&i0|p@=d#Wzp$Py$I4IEo diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_menu_share_holo_dark.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_menu_share_holo_dark.png deleted file mode 100644 index 6f747c8f065940a8844587c682fb3c9443ad1ca2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 467 zcmV;^0WAKBP)SO)@i{}u0qYYqHziBfu2L*;{L?D;GxhmUqDjP ziMkTn=nm+BxmDP>FsP2fGnnz3AAnfGAiD%ptMDlguG*u-2|uL;kN%Xenfoz6Wm9neQuJ_f08buH`WL4SA>8mzG9{4uwy+$BT^9a|eO3@D0j4;gS>^u3i8D002ov JPDHLkV1mHE(I@}_ diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_menu_share_holo_light.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_menu_share_holo_light.png deleted file mode 100644 index 682b2fdec4cdcffe042a0eaba5574fcb553c6fab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 505 zcmVavhwv6%LZS|`6cHU3BI+s;(j}rxR}U>ALI;t;n}mlvh$!J-yZtua#I%j$ zOwQ&T8Q}wUMSkBn``+6%%Cao-nJ5SZfglhBcnTy*QWjP42;RUuXn|w-Gn@r3!4%9C z+;SJ#1s`+53r;u-JS+&G)8Q=eVjwW)EYS5?U=Q?t+(O%+X%L*ae6USp(Wf44I z{VTBf*DdH$;99e18zd%PPify*mOc4h3DgW)zaXzPJFd#ED}jzd@IKXer+vefz{o(L zSH{%(p8{RZ0^V<-*kS}|(%8UCAfi$^)3kopWmIldEo%J}dR~)`A1WGIol7IL;ao9F zT=*mq(WtgX@b^ z8v#5LPB(Y&Y|7|Y_!S68aXULj{?8IYV8q3&)vLrKUM8>{H5i+*H zkR-|$|R2*FfgciX9yK?;QuX#eqD|IovDbqdkR3e&?h;^O1G<)AHE%=VX) zAdqoXq`4s%2;{~C0wti(VgG8DV;zQipvLr>8Nuu3J|@fzC?Pn;(B0Z2$}|mMOeT}@ zZdYQ^RYrmCf1CTQ8D_yu^_6vr)v1{}ol;VM{icMDCQ&815)%T3JBf@H=ocUsx%n zJFIZgJID218z>DQRd%G!e*f!UHHr#G~u4^{*?KBR1a9(UgdwUCY z0N?ya!P21!5iYyGR=<_2?Bjxnf^O2gR)g=%%)N>(KO+75BgnrceouFrp}3VaIGj+w zwLt4?-zZ+mUHN{)1$>vEA-}OYQS>1;i@^W^ya2!Y)M2>#@dI%~p)CL)3JL&m2>`Iq zVDbt8gu(!TehUB)1pojJ$Z_d6WoB7jubLqNM#}w>F6PA*h_Vj`fRlp9U;&7QkYh6} z(9n~~68|FQci|HNI5BCCG{m3=$a#)_7@IT644iWCw-2KsQ3;kRYGgG`rBEI#nXS+A z-nc+%B1SM0R-#u?0hP&FPT;>NX_%P?hgg_gv`QC2%boBtHY&DNEv1Z{inN+o7UU&6~i6<@dDg@JfyZA zYYx+`gmaQz`KhmCK>`p*=#ih%ugw-Hso)F*NW>=M4c^v*LZjsr<%=hVT#flNo|-X@}#9er^0l84-{G`HDNMNzVWRl8caxci}W? zc0!?Gy@R{maX7Ejy=Wq@(@!~8(Psga1{<5D z(FKaex5510aojhOAqv&ccU0G`r}SP}xP6Mh|JfV%jcV*O-x8{S&;`%E-#%tx6}nZR z1c741ezikraQ!+eJJ^1Aeccm$-6B!t4f|nM%v7bMlWS!LpHJrZ6dm59q0S?ZF2y8=Q^-~&?1fzm&QwFJU6ATw$c`QT*f}qMc??#hST5e zxQkPhjP#qGiaKgzP|%tu=%>BCK5z-H-a(-N>e+VwJjD5gsQS*YAIrKo18uKi>CXsU zeAhr@2VZr~d^+{qL#Dp0azS&`-=zTTtOZv;dZ$~|%FEgLT!~MIsl%29Hp60Z+HY^7 zfgybsr8wt-*S<*>3Nmk=Hv%NUi5Hv+Je`(&hxE38qm@=h}CxYHB<_YKzwV*m;-gtIoI8pfRa+PV;bk|F;MAR5rU6MKLY;P6SK^ zz#4=epgT#wlNB;NZ)KQk&RpNA?XxC=I8Bs7tkDWoDBv$rq@ZB1OpuC3q5@IY zigTzB09cEq(Q%qMUKmTLkdXuy9gilc<`Ny zCfyhR-l;fV1jtdSP>@c7h(gE<0=-}oOrNEDVbvQD5R!z73-lUd?=r>)jRqJO#Z zNo{p>mJ%gLqH4uTl@P0k*nJ#~p>jz zi*PVGfIE&2ma8=axey(z_0*yiytx#l)cR++hp;4$M3MI&iqJunv zP%5|VE#-M1ErP0~nW%`XQpmt}`DIBzVIP4R6b^?=S?vE;+#Ieq6$@sHNsIu*M*s62Ic z^Pl>EKUz_j)LZ`iwIF5n)&{{W3is;w?X#zF`QO;q?p^QZF7i4h%7AAU`B&YO+`m_X z+ZQoiuxuXeTe(lx!D>qmlU;Uh9J&4Ix3-~|$9kS-o-v*-aveV2HsaG~&TiiMV8opD zqrqS(o!;Rz_;X!d@vl_}4)BZlldttZi8tqUfi^Fjb_9Cs{7yrI)mDl4`HNbo(yIyk zR_-3NW_Pvyn2&3rZ8^^;!rMC4`(rwrNL#-4!`TwdPolrN9?nX<%U*J|^ZwJ$!;+9f zW3g4rXgm;f&PF#4GR=A@%E@6wjf^O6=zY4gO_M6Z#5TCw%~NV38(WrpC&$MR6fN7I z)KV_NnZo*~+Vwqrc=1cu23i?to3JLYaG~~o!k@;GB4(~2^g?4DKfKLpVddqwg@uJn zQ!mp*u}dq5OL_+NP^Q(ow-vNJUhs^%IWuO2J$n53w+SZwcFCQ76UU>yonbEv-BWH} z+u&uspzRxdGqECYPkTjrditW1gVRbJvaPSuz-gP$nFvN>&YXeP@XFc)qSmp`c=;xB z)rfA6&9^_~%!_&ylslRpD6rpiTTV7AP56qiiOW20+2s@RTlXC{hy2v}w40MjT98#Y zuawtu&Q&C+v<)i^QeUwXIs6}dg!>p;emnVp(TzBOH(`JHwS9w zXS?T39!yHg{e?r?LVo>r^r9iQsUdRsv*pL)0RLY;-{}5uptAw(T5c}h4Fk4h)=+c8xn=p-A`WZN6jGzfto=!a%BTM z#7auzZuf& zZlOQsX^bog-mo$7`Ar{>sesunRk^dJBs)B!9~P0Exfz+=_^o zf0R5J$v*B7tn`_=$R~yG4NGGREUS7WHSwc_l%iFeY2{T$KIA@~qOwYHD z4)KeAdg0W1apUZi?4YgxYKLyn>GbAJ5Ua3kxFMq>Au%TN-UfChk{h#ouahCdkwzr$ zU&-HNC^-=uo!$TWg&oxL(w31;H>2N_;J>izWt~}(Y#lfI(5=`#;j5p&x_Pr$Kd(f% z;QQKLwMUK+>kbZNd)PVZyUw3Kx?@Lr9W{5B|3BRbE>0c|vpwono>GbTstHSEsc3swE4bD1A)%p_Bu~$JyP+eE$>&{NT+#)0#IFhpfC+4G zabFNKr(*rBole9W7%)y1C&uBHSgq@tM*j~UkFLpCQ+8z&^;y@eTw;iRx-JdL+gdaK zi;3)eZ@)Q~6uKo2;YAT}+q`BPie0{L+Mqoe+;%o)xY&Pal0qsy=g4Gs^lIWA9yCTp zwePfV*IoqJh2>S^>U{R0*NJ!hO5@VlQwrEIF=Asq|CAG(fD4K~Jm_Awt*Hn1_!5o@ zQ7Z^y{*2!jeCN4qefQ+OgJZvM+;w;C^^>_g_6fpB$JP2PYT>A9by`bd#_GusaHwe` U7U8P*7-ZbZ>KLZ*U+lnSp_Ufq@}0xwybFAi#%#fq@|}KQEO56)-X|e7nZL z$iTqBa9P*U#mSX{G{Bl%P*lRez;J+pfx##xwK$o9f#C}S14DXwNkIt%17i#W1A|CX zc0maP17iUL1A|C*NRTrF17iyV0~1e4YDEbH0|SF|enDkXW_m`6f}y3QrGjHhep0GJ zaAk2xYHqQDXI^rCQ9*uDVo7QW0|Nup4h9AW240u^5(W3f%sd4n162kpgNVo|1qcff zJ_s=cNG>fZg9jx8g8+j9g8_pBLjXe}Lp{R+hNBE`7{wV~7)u#fFy3PlV+vxLz;uCG zm^qSpA@ds+OO_6nTdaDlt*rOhEZL^9ePa)2-_4=K(Z%tFGm-NGmm}8}ZcXk5JW@PU zd4+f<@d@)yL(o<5icqT158+-B6_LH7;i6x}CW#w~Uy-Pgl#@Irl`kzV zeL|*8R$ca%T%Wv){2zs_iiJvgN^h0dsuZZ2sQy$tsNSU!s;Q*;LF<6_B%M@UD?LHI zSNcZ`78uqV#TeU~$eS{ozBIdFzSClfs*^S+dw;4dus<{M;#|MXC)T}S9v!D zcV!QCPhBq)ZyO(X-(bH4|NMaZz==UigLj2o41F2S6d@OB6%`R(5i>J(Puzn9wnW{e zu;hl6HK{k#IWjCVGqdJqU(99Cv(K+6*i`tgSi2;vbXD1#3jNBGs$DgVwO(~o>mN4i zHPtkqZIx>)Y(Ls5-Br|mx>vQYvH$Kwn@O`L|D75??eGkZnfg$5<;Xeg_o%+-I&+-3%01W^SH2RkDT>t<8AY({UO#lFTB>(_`g8%^e z{{R4h=>PzAFaQARU;qF*m;eA5Z<1fdMgRZ=cu7P-RCwCFnA>j@RUF4Z=geihyS;3? z71AOGFG#DU30{%Z5HE=uVvLcHSPc&*yb&M$3w$8aXCE|bATjb_5Y!L@i4PJiBoKuP zk|-&GLMd#vEo^6Z=W>n@JCuTRrtLzV^Y)uFzwi0ozh{JIc^^ATD3U}Hi9`SjO@!t@ zXVZ%Xxbq_+5ZE}lI9NbLfKNb()><@U!5v2zNF1`XQoum~8lPz@)Chz^-y;A5hde9$ z3SSQmZp;-CmFvGB-~Q``87A@Y7XlDEJq7}Y9KFN6pYOFQg3;=@?|9IQ9}^saN4C{snH0mua$Bys5YYE!<5p0^Z!u5-`Jbl@zcVKD&i zy1sDJgsJF0?2plYg(E@>m6E}~DC<(#@V3Vf{iHDQw zB8N6|D9X%|I2)v)1KD(++IsH&H`meVn0E=!*qVI0R72ss-~JYr)i)ykT(#A;4nf4+Lyj6@+`s_=!6RV z<+p6)bXpYBvnZOrVI24kvQn*-Nxf;BEl`BaJbU<~-l3jCc4ZepXP2}9Zr=23Q1weQ z$1m?1XT}`j^j2ZvlBb<4HWCo?)HIkzNR1h0sW;Oqh^xTC#*Tj@i1;Gj_?@5#2?^pP z)y-UEMZDx3SDioRbv)|lCibEM?&l+ySwH^{0ChDg1T(_k<^TWy07*qoM6N<$f;y$E AsQ>@~ diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_voice_search_api_holo_light.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_voice_search_api_holo_light.png deleted file mode 100644 index 3481c982862cd524654e200187445a774446567f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1833 zcmbVNX;2eq7~YUb1P`!K89?kB6p2E1Hz5g$1PR%s1`Ngo6*2bY*3mT(eCwGjDt30z@ADk&)ul!ycbSpXq2nas~26ecnniH=emg*g*#j@Uj16nB_N zi=DC%Hqg(A)tr+Y(ebG%LzlQPJO*&###LsqLlu9w;l%7DLh{2@p8E^+tOq!T_lW zAkrjQDugA;2orvi3RR;rF{(mPu~6K{@h+@VEmI|-Ny!?GN`oM%Mu|v7GKol|K~;>b z*7RYuHV1{-On9GN3uBkTDuptM`n_1Wio`LBAhQXgsILR`g#<-73JE)?GKxVRX0q7) zdw+ReMT_F3WiD>kkc1U{nP0i(9rjT~DpaX7!gS@^xK)~D5v)#TJVPYB*I4ua$r;2r z1NocdKh4s2#B`uveAD{O=FRZnHfCZ-W;Dvr_J%MMH(iS=vz?dnp7r*Q|0OM8=!_4l zs;ZL3zhAiUWdL6Q-YyURf{oFuq)uPWZD82qEi67Cysi1BvmZvMgw)Irq>e&MQ~pM`Lu=nbBxwasjL&Tsbadl%z!58�PUR2s z;--Gn6L-Y44d%`7eX(hACTrQSaf!p)CX^44OWKiL4CvZ6umi8K5;zZ2#*ykw_khy5-2;-x4w&2R z09{9x#xx})BvjJ}TI2cLeM%Juon}o2C0ni%oPP$#W_j{v7Fn&)Y4-+12-XAz2ixMp zdk-dG3-j7Z^7|(bZX9v*jq7?`Wn~?YeZGM=J3B9(I(X1G#M{BXSmw#wPX}s^Mx$a& zd* zptYy_ughebWX6!_=*!|<*LPvVhwlqoZlfEYtjvv>6wjfX3p_g?JMFdJ!co__^o#We zw=b#O^i`T}%SWdnY zptrVi4hONM1>8N+Q_^*Hw7fWo0bv~uaDGTec^ju?7ft7iw};GWFmT;t zmqkFIFYh$^o^;LBh6ZkJNGZ)@ubCQlP9ArdMLX{p^!g2)d{G45wZD$82#Akx7wY?a zz21Agb)mdb(PM7iyy?!^d2(dCvbWL2&n$1d$2oqkM7b5PX3wkWY%R=ajlH#S8mQ3! ge6yDA3jkPwzzE(HQ|OAY)&8HCR-J`5r{^yG7imhbuK)l5 diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__list_activated_holo.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__list_activated_holo.9.png deleted file mode 100644 index 4ea7afa00e2bfe057472ed5a196080fc80ad7383..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1|(OmDOUqhEX7WqAsj$Z!;#Vf2?p zbb>IW`N`93fr2)kE{-7*QBRJJkl{&7FVVepxUS$Rt1LT2VAvn7lLLt0oo!v4%( tpjG6n=4tr&fORvYRP%q%M>EqU82;Q9of*be(FHVz!PC{xWt~$(699PnDoy|Z diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__list_divider_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__list_divider_holo_dark.9.png deleted file mode 100644 index 986ab0b9746301f2dd9401829da09e00995621b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78 zcmeAS@N?(olHy`uVBq!ia0vp^%plCc1|-8Yw(bW~qMj~}Asp9}6B-)+^BAxRtXRm= az`@Yw&#rLZUbzUUfWgz%&t;ucLK6T(%Mo}0 diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__list_divider_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__list_divider_holo_light.9.png deleted file mode 100644 index 0279e17a123f8cbb3c7e3a9ce5c5af8e693b6977..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76 zcmeAS@N?(olHy`uVBq!ia0vp^%plCc1|-8Yw(bW~!k#XUAsp9}6B-)+^LX%RmN2q0 Ycy4A9FVZ~13zTN?boFyt=akR{01+Y(GXMYp diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__list_focused_holo.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__list_focused_holo.9.png deleted file mode 100644 index 516f5c7399c853d112a31d1e17c8c7f17180f9bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1|(OmDOUqhEX7WqAsj$Z!;#Vf2?p zbb>IW`N`93fr5^nE{-7*QpO1)z4*}Q$iB}R!lH3 diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__list_longpressed_holo.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__list_longpressed_holo.9.png deleted file mode 100644 index 4ea7afa00e2bfe057472ed5a196080fc80ad7383..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1|(OmDOUqhEX7WqAsj$Z!;#Vf2?p zbb>IW`N`93fr2)kE{-7*QBRJJkl{&7FVVepxUS$Rt1LT2VAvn7lLLt0oo!v4%( tpjG6n=4tr&fORvYRP%q%M>EqU82;Q9of*be(FHVz!PC{xWt~$(699PnDoy|Z diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__list_pressed_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__list_pressed_holo_dark.9.png deleted file mode 100644 index 5654cd69429fd0a3502a05b5f827bffab89cc7e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1|(OmDOUqhEX7WqAsj$Z!;#Vf2?p zbb>IW`N`93fr5^nE{-7*QD_LZ%D`aoRl?HIGCc%n7=x#)pUXO@geCyJM=ZAh diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__list_pressed_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__list_pressed_holo_light.9.png deleted file mode 100644 index 5654cd69429fd0a3502a05b5f827bffab89cc7e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1|(OmDOUqhEX7WqAsj$Z!;#Vf2?p zbb>IW`N`93fr5^nE{-7*QD_LZ%D`aoRl?HIGCc%n7=x#)pUXO@geCyJM=ZAh diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__list_selector_disabled_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__list_selector_disabled_holo_dark.9.png deleted file mode 100644 index f6fd30dcdc9c39c836e509486854f9da03486892..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^;y~=k!3HF){@Qy1DVAa<&kznEsNqQI0P;BtJR*x3 z7`Qt@n9=;?>9s(?cuyC{kcif|*A4j^95`Gq9-KV8B6o6ra`I!Z80pW;7d5zZGhRBg zm{FnhT6Xzih3ZMUGkfBc^kAT_eS7{3zPQ8d#DAm9s(?cuyC{kcif|*Eb3_81S$-+V)J@yPBVWyvqG&GeYz~KYxJdw0eeyIoHJnOEfn# R{sUUY;OXk;vd$@?2>|r{LWckV diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__menu_dropdown_panel_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__menu_dropdown_panel_holo_dark.9.png deleted file mode 100644 index 4d3d208578c61662986fdc16bd15c69759b48d6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 922 zcmV;L17-Y)P)!ytdud6iMT7O&4bD*mP3eKws)UN7D2k#e z%DbYt@4NEYnkjlINEK7=*RV3zwml#Px9r!q%}Y$QM*NqHEZ-wscn^ zf4p9=Kg#ZZAKY%YZvc!aCbL}F6eGxtBSzy=smEUmc6C{?q1YCQrid~5o$!73+BeU$Ee{DI^Yo4#-o87 zao*xiE9Z<+s}ttlWw19HGlEA1nW09+*~|#}a;CkeJh%bU1g9CP5h0^O2}4Hs%y=Lc z5q!OY8j*^uk~rBBK?ljmh#jL84Ev;rDo>_H#K|6e%Mo=CgLzw$rI$Y4Z-kUy6U47Z zMI2w^tmuV~pH%tJq!^(yWY-hbFl2;G2g)+VPqud2Sicc+jL>MvBTKK;HbN#jlrS<8 zl+;FqdPULzJ~Kh_!?j8>!xs^*nQAm$#290~ue;BBnY1w&wMw4#m(pwEDZd_oY1{Ux z>$>N)H(eWD*FCpw`-IsDKF28-6~1bz!JGs-W6Z&R1n>#KR{&q8us99Q}8ID#(NJr3oa@N-D4Rc$qhA--bT2} z_Wpf@Z`4749}#V+fwWJz^oyZKO1~J&exY-1*Kg?D$hu!fixvAiNfpmG;mo&f5BSEA wlE;@gYed_N;JFm#Y)Zw{1W}kQU9GkF3xsHEK4Myn7XSbN07*qoM6N<$g18=|djJ3c diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__menu_dropdown_panel_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__menu_dropdown_panel_holo_light.9.png deleted file mode 100644 index 924a99d173082ba58ca7527822359f228bb14dec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1061 zcmV+=1ls$FP)#d)-&;4-At916hopygyW1WQa|lkCWZ4-q&QLYwjy>%Jd>?UvK6*fy zdt!`Ep~K-gOUxeEG;B7TCA&L&Y`5FR`f3tF5S^VH!lJsKJqkfK0&PN7nPcRS?`4Ev z7V~vPKouy~L@5%v*=&-(hy0cgM*ETwjWz&8F3NVhH7#V4$3+kVgi2lPw-adOTXm|2 z;f`P0rx+seIw-H@dwPaOx@-q(hY$i2BS4u1XM~+%LI5%mN(D;0XOsl63U@~43e6EU z5mrW96C~;L2O}H%p$jmGc5)7LM&^oyAacV=14{s_wp`K^YIpyDFEM02mXk3OSEw-p zdORS~SGTvf|Cjl{`o#71_3u-2KzcK(ZU7La5JAil5&>9olp#5yVJhG_L?OnQ2x7(v zIfg2+Q2z$cZ7gkJK~)>%8)`3CJSNBlBGKwWz;6QnLDPCN+(q9 zAJ*09wM4d_hZLYxWa z2;mvCbu@F-B1H21)loz{?U-+?@nqk8kw`Vm31QkJFg_V%{OMfZr8mlq(-<|uJGVoHpVClAlh&-bsduQ(hI zi(GsU`1tt1hf_X{d`3<68b|S{tXYwd2YXzXl8Izg4y^21 zp<@H92ON{kB3P1HizBE$;EP~xzks74y{^`3Ur7(FmPO0@t2+WXW`VN|Gc9|AJ43ds z=_5ZJGT6$YN8bIa6HYZ^jFIn`&>W#9La9l$?6@3`ET&WsUkjFK0@?|yO)(6`*1l_s~_L1z$~& z@jZM)qqe)$B+Pe}79nG2sji9uR0#8Z){~%#a(p4yPG;@1CipK8G=YCTO^$u*mj`Me f=rGa5Ym5<}3Pv>t$oVA_00000NkvXXu0mjf+qu}} diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__progress_bg_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__progress_bg_holo_dark.9.png deleted file mode 100644 index 310c368e7a68479307866c479d1e4eefcf5db311..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^96&6^!3HF|1ZAax6icy_X9x!n)NrJ90QsB+9+AZi z4BVX{%xHe{^je@`h^LEVh{nXLlN`Ak3Qu?vqkba5WyT9CKZ;N%wBhP~?hKK2LK3q{Q@b8ror6q0>Kp=4vJYD@<);T3K0RYm>I5PkM diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__progress_bg_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__progress_bg_holo_light.9.png deleted file mode 100644 index 70cb7fc7e0bcfb850d4b365f1bccb5b743913e21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^96&6^!3HF|1ZAax6icy_X9x!n)NrJ90QsB+9+AZi z4BVX{%xHe{^je@`fTxRNh{nXLlN`Ak40u@7AASF0zb~yy)74d)-}Q|XM+&=H%L1l~ z70X`DZ5Q8J;=>T6aJiv_zhUdQx9rw$B!4Wi^!v;8!uD-LM?h!CZ3$B@rZO?tz^Iy& QK(iSCDOJO>Ym5d24oA2hD9A9kkZ#C-ocYxQulY$%dG^s1`jD zWrBMf{hI5z?Ps6d&cAMwxpu9tAQSLC;sV+l?CI!atlqGv_K~X}S&7D6#irA$G%zcr zGa^}SvXODrvrsWB#ZkB-c}-Y}>Q0!#L#9IQCX$ZI#7DnF9fJ8(R=8iR{NJvIR3GfdBS0fGXvSYugM@B@Fy~s_l`Jy)|ccqHxmVzApHz{x4N{y z#Xj0V$LH=@zsWY)$4Z)6--edG^VYGh&b$}$F3XeLt5=Uu0`p37@FaypB&t$KuAm9R zq*|yt7WOdr(m%g{dU1bs0-qy(nh~3JDc<<|K^(;cR4G!8UrKd|p;N zi5zZftW#Kk#vM}fdS+hLQ#;Dq?H?_`8P1nhqmR=j>Au${MMR)hh&5HCA z?cjx6pHV1ZFFx`ra1m|YMALE$u3RAxZp(6Eus@DJwzn!G7Cw2Mm%K&AN5Ia`DuuPd r`dvHM#yxB2nYDo;0!e2cs)*3P7gB8$K+RT%00000NkvXXu0mjfr&_ZI diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__progress_primary_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__progress_primary_holo_light.9.png deleted file mode 100644 index 1c269205e874bc6addc308efe5be4fb7c5da0edc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 917 zcmV;G18V$CDOJO>Ym5d24oA2hD9A9kkZ#C-ocYxQulY$%dG^s1`jD zWrBMf{hI5z?Ps6d&cAMwxpu9tAQSLC;sV+l?CI!atlqGv_K~X}S&7D6#irA$G%zcr zGa^}SvXODrvrsWB#ZkB-c}-Y}>Q0!#L#9IQCX$ZI#7DnF9fJ8(R=8iR{NJvIR3GfdBS0fGXvSYugM@B@Fy~s_l`Jy)|ccqHxmVzApHz{x4N{y z#Xj0V$LH=@zsWY)$4Z)6--edG^VYGh&b$}$F3XeLt5=Uu0`p37@FaypB&t$KuAm9R zq*|yt7WOdr(m%g{dU1bs0-qy(nh~3JDc<<|K^(;cR4G!8UrKd|p;N zi5zZftW#Kk#vM}fdS+hLQ#;Dq?H?_`8P1nhqmR=j>Au${MMR)hh&5HCA z?cjx6pHV1ZFFx`ra1m|YMALE$u3RAxZp(6Eus@DJwzn!G7Cw2Mm%K&AN5Ia`DuuPd r`dvHM#yxB2nYDo;0!e2cs)*3P7gB8$K+RT%00000NkvXXu0mjfr&_ZI diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__progress_secondary_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__progress_secondary_holo_dark.9.png deleted file mode 100644 index 40d0d1645cbf05e30bf092ace45403281da7f318..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^96&6^!3HF|1ZAax6icy_X9x!n)NrJ90QsB+9+AZi z4BVX{%xHe{^je@`oTrOph{nXLlMZq=7znVWA2oV&$ZSjW?F|h7ziq5jS#e}ezd(V) z{M(JTeF@SBrcbxn{QE=WZYK^04VRD=846z*9&b9ovtVvpnl(eT%D#{N!SzC3^S3#* f<|u1MCr7h0-;i__`(soEw28sf)z4*}Q$iB}%FaDT diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__progress_secondary_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__progress_secondary_holo_light.9.png deleted file mode 100644 index 40d0d1645cbf05e30bf092ace45403281da7f318..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^96&6^!3HF|1ZAax6icy_X9x!n)NrJ90QsB+9+AZi z4BVX{%xHe{^je@`oTrOph{nXLlMZq=7znVWA2oV&$ZSjW?F|h7ziq5jS#e}ezd(V) z{M(JTeF@SBrcbxn{QE=WZYK^04VRD=846z*9&b9ovtVvpnl(eT%D#{N!SzC3^S3#* f<|u1MCr7h0-;i__`(soEw28sf)z4*}Q$iB}%FaDT diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_48_inner_holo.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_48_inner_holo.png deleted file mode 100644 index c8358e9cefce502030416e05dc8faff139b886b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2081 zcmV++2;TRJP)YIdx5%v}IY-E={))x>B}kD^;1aO=v<01PBB|;(|LQ1lm?k zLWq;Nn-CY=ae0(~!^>I`t6s zs-B%JpquWw-vVT&b%#DKYKZiAR|9AYVtSC>+D1~E4^t2*_YE}4C7t2scS_b&i9ji7 zBYSvMwdlT0Go+O!I1;=rq$n|BisnJx=53v0;@hqm(7l)*=4rJMo!clNrP~Z@m{E-} z^JZ{ZNHx@{flX?mQSo``X|C|5u79fpM_&?X60Kt|A5rbxJ7+XZpRQ<_6xsZ!_#wo! zj#h1_U5!M-Io2>ob>UEYg+LRijsxnVI$Sub8=TigMynU~iXTIjns`*ZXjCM8l?je< z^3e1OfW}cB&*(9#LY#4(p+|S(CFYo)RH;RK=~N=zD5YZ@e|b@)#etF>)Z-yez@UzD zxn@bF&zGN~8oIPk4dfy-rEX5Ww8$EZ0F70%U;9F1W%-Z($&Ga-Maup1vncKQ7_DKl zn9!@7d$FjFqs1PKM)U|Dr6$Db)oTnV%fNxx{Okxr+DM%Qs^$R=K0p5VBBLXP|Go*uWAqrP!s#9EjG3Y5H)_%&0w$xIP8)2<gS?toB)4w_5VP~5v52jeNf?a@l%z&Ft# z7nB8|dUgD~fFBhAa+9}!Fnz66uJJUZMq$&Z-=x+YQJfJpw%hO;S zbE}u#&MHNeP>Upl#AP)>l0hdeKfNO4(#tQm-Akeu&02@RbFR7XY>6_k1%f(YAT(#fsAW zCKBlg4QBOIpq?mn>zJh1X=9x9hp4F}kQ(@481j?!sz3o)0BA?xOCB;{@vwLHR_qA* zZA`n>5_V~?==zrnj46C`9p$WNjB&zGc+-W7;QUT(*KSn_p>ds2!NyfVppL*7{NFHR zx3J%}=U0sLd(^D`)P?PxcXaJb1;-WXet3d^dmIcA@AOk%p(p(THF8j!=km|#V)bYd zpicX$PljfTc@O)})|@FD=Z~mC2i2imPj;N6y7k2(V~h2N*p=p#-z6}HxcB*hYkSJV z`IFSdb9yY-P}dA6b@>ZL?=z9&3we?^d^OD4aqs1Mx13&f#Qiy{cDn?wohTPSPjL-WpW1m}O&Ju5YPHyotYlm=9`GcY zrwYvY8;-f&ZSM33oCpsge2-Ip%afm3V!sl6q6gM{kN3J3%|Xrhwg)`uVUIiGY!FzE zIO3Qa-0aQX;)a}NjB&uQ|K;9KmvHqg(MeCoc*sw<&DEj$2|GyBp7MmJgBi=!jyvfZ z$6Ymtf^mwAKHp@Hd-~&L-Nsi~>l_hPjymE9wjDU*%(E+7 za!uA`P2O+vKSpg~;?JJlUH||9C3HntbYx+4WjbSWWnpw>05UK!F)c7SEiyAyF*Z6g zGdeOeEigAaFfi_TCsF_a03~!qSaf7zbY(hiZ)9m^c>ppnF)=MLI4v?WR53O>Gc!6e zGc7PTIxsMwC7)_* diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_48_outer_holo.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_48_outer_holo.png deleted file mode 100644 index f62f74bb38e8818fd970b7ec1f7862e543cc9d07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1811 zcmV+u2kiKXP)Q(x@RlU0R z*6*F+o^#JDHf2*b#j2Gf_PMBSbuGRn) zDJUkGcinCw!4`)d@_D~EMJnC5dvGXBz z^GjW6Gg4BPB{MBwxqQWN<0fP#?6J=Sj@WNJ!AH@8Kl`>9L$xnJF(@mqT0WPnt1qF1 z=Fx+;deGw@bGK5OQ+L*P{Upq+6DX1yGQbK>T~%EkI?XGa@}$o>ppa%>^8?Sie*2l7 zfHK3%D>%7|N++0Avr7*8vd@}G^Jo0fcfyUHfnsLZ&jU?a6Rn7I58e-AIzUHA66jy!AvGyBgcAIA_8&ya%2-o5w@+x^Frq z7x5uqjDu?ciVPZ-34&-=b^T>U$i3owu8N|PCmm@W9a)>Z@0e@OLVt>;Q1iTBsK`Y- zJ#Dm0pva)1q@Sv}wFUZZ<(6Yki*muoJ=kjDtmVDYq#tH=k$<|@5vTpkf+%-~CzQJb zDj5=FGBxvks&SW*YJTnCqA2*7ySf013>jGQpITpe;Jn|eigLRhZQhTXHIx~a$pm$C z{nZbIsz13R7nL1tHd-@KF*$Um(og?cC1;!x<)VYeI|B_UB@HdgHw5UWlj@?}cDp+O zMal|-j9w2i9i`?Cb8^v;J)JZZ3@FG_LfsGv{MVdZZorO4w{8Y134%<%0TH$=m)%OW z_@u(SziK>nET6ihG`KOcU?%zJh~m2+ycN)r5;qQq+h%%Xy;f)Ejn0a3UnsuS^+vZqWP#0th z#x}@k!|oI0qU+rNRV>J4GUFR$v|a9z%jMoM-5IE6CMAy{ll?bZ%p5f-7cDwzt|L%b z^86*Y-fp1pM3X+OAj(~JqWJ*PYCpbZCY5MgZSAj)V(>vz$zUg(ZywPKsOqx1Or~s4 ztCPVxWShrQgx&N<^IZW2u9-7hOofKj5BzxpoW= zdO}GqH|+&2+j}j6LUh@cv}2FCzaLvtWZ?^TwHb8;v&L-C`+P^-e$fT!yBz5Da{oL7hj@h;h3%R$P7X_J;dmT2? z8&V8*_<~22M7c%3b3D}BjlNwczv7fZds1ebGU8;svesTmESU0X4=BlHYF_eOt8iaY zL0I~yq8N;M$m4dU73%)xM=srNe&@#dxWo1;CZw8+{^f0pouFbc zV#*`lZz%0)HGlQf<_c&{Ktx7;z}?CzodgvZopY&OUp7)Q;eaFVO?})iuy4L9j zyLs2K^qSz1EvYP7>Ws{|~_-QddT;IiL%she&}m+lY?b~t3u zik_CPT+O0+6?K`iA!CLOr{nnY$OW(ay)*42s|TRe$lC9I+YPJ$b-IG8H~q!myML>= zroa>ruDyrb zV`&jHgSNQCgmI$=lu=hRYuXKOo3_xM&-4jsmA;l<3@^Ph&(-?zXM#=Hludb0$^QZH zs3&Vcm*{c;001R)MObuXVRU6WV{&C-bY%cCFflPLFgPtTGgL7)Ix{mmGBYhOH##sd z?sz9s0000bbVXQnWMOn=I&E)cX=Zr$HaasiIx;gYFgH3dFrOu# z?f?J)8FWQhbW?9;ba!ELWdK2BZ(?O2No`?gWm08fWO;GPWjp`?002ovPDHLkV1l}_ BPJaLZ diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_default_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_default_holo_dark.9.png deleted file mode 100644 index eb28ff9a5516c15667fa8fafbc22d608d1f77a06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 311 zcmeAS@N?(olHy`uVBq!ia0vp^%0O(y!3HF+1t+BgDVAa<&kznEsNqQI0P;BtJR*x3 z7`Qt@n9=;?>9s(?o1QL?ArY-_Z*Jr|WFXM+FkX}IYI~tj_}8!bFJ^a4j((ibs-&WN zGIsXEx)Wtn`lnsEAmpSFI79ccn9RKAsn<`<tk;t}o>yjV{qp%WbL{dki&M)*dw`x~@O1TaS?83{1OTcY Bcf0@q diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_default_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_default_holo_light.9.png deleted file mode 100644 index d281adb553af892f758407b846bf31810b9d776b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 312 zcmeAS@N?(olHy`uVBq!ia0vp^%0O(y!3HF+1t+BgDVAa<&kznEsNqQI0P;BtJR*x3 z7`Qt@n9=;?>9s(?Tb?eCArY-_Z*Jr|WFXM+FkX}IYP%rckLbO*zpbz{y7bYSIrPClD)2Hc3qcaC*%7oYhKR%+5DyWbJ~oU4#{OKNlluqE0VJm zR?Ud&kaA;Q)O4{aB-unUR3g{I@EB82%f_aZWF5r`AFqi`v@HN~5*v&Qo>cRA$gv99 zHaapFv&*%1#4~?bwda`9)~}vNKHF@K`t|cGZ}Xb{RR4x!PC{xWt~$(69DLj BcXj{( diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_disabled_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_disabled_holo_dark.9.png deleted file mode 100644 index b2985860907ac324b509b76731e8ef9e01bcef39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 306 zcmeAS@N?(olHy`uVBq!ia0vp^%0O(y!3HF+1t+BgDVAa<&kznEsNqQI0P;BtJR*x3 z7`Qt@n9=;?>9s(?E1oWnArY-_Z#r@{8;G<#%>2r*^uo7)-)HXL@_O1Ny%Iq#{YfeF z(mvLmIJH1t&`=}DOJmBWhqv04yB582t6X;JXNKdwfEg3JZl{PztUeIIdQ8h8YDr!LqoiBzejNy&kDcJs%rP689)vmGI{X_;^jtl6gm^<0^v)GdFRa+YOJx z7F>vKtz@b&Rr+MtRJ_Cdn)*bIu9V&{pI@`*?C`z(Yf|Vzp#K;=UHx3vIVCg!08ssU A5dZ)H diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_disabled_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_disabled_holo_light.9.png deleted file mode 100644 index 4215396dd4e51fea9239323d313b72fde0ba86d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 306 zcmeAS@N?(olHy`uVBq!ia0vp^%0O(y!3HF+1t+BgDVAa<&kznEsNqQI0P;BtJR*x3 z7`Qt@n9=;?>9s(?E1oWnArY-_Z#r@{8;G<#%>2r*^ujlV;{V25Ur(E)S0c!zKPhEi z+Q+&RrxwTy8fpZ2X-wJl@K&30*P>T$mCG*u%y7IHFk@oZ?G!PI)dwP2k7*f%?N0KT z=P~Pe`QZt37-AUDv?qm~sFi(Y>bsQr3FCw4S+92))lbOG-Y30G>`_~0 diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_focused_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_focused_holo_dark.9.png deleted file mode 100644 index a280eabf59b5eb69fa2a84280402b63d5e1bb8f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 524 zcmeAS@N?(olHy`uVBq!ia0vp^%0O(y!3HF+1t+BgDVAa<&kznEsNqQI0P;BtJR*x3 z7`Qt@n9=;?>9q_DjO#pI977^n-`=$MKI|ZI{A2#4tV=npb9cQAXy4X!_bwM}{Q4K( z1sl8bnxc=22fURRmTQmkS`l-5N%{4LzmAq3{WkJ?oSyR(lyW*m>cW(jDj1r7drC_% z+Ahf4U7%?EfVHA#U$%eE)HUhV{* zGqMRv58QeS1t+_UJh{!Nwtjop`q`x&KXzE!mvvsrOU)9V|3+xFYu0w7ttSN+pN66C zV4oMA@AG&3wK%+`$wcPZ<#Ux2T-c9-*heq_yZUm|{V%D1UlxhJm0zYfUETgVr;hpA zt-Fj|Jsx=O$lYh^6WL+vBibSA6WURD#!g`Ij9SHG25Jg!2FnzxlYN}N9h%V=a_mM! z$e|leQ;yweap>IrEpmd};fhV2Zrn5uN|m^)*v*dyQIi{G2ej@g`j zy#1roz10ezmNeBYwbLI^0W9{MT&2dcxOa)`zb@?O?Gu2 z*S413TzCHUdV}>`f)DaiKP_4HkL&Y-WAl>F%y}d1AGY65et#XKh5dqWo7Y|}14bu< Mr>mdKI;Vst0N8Ej(f|Me diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_focused_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_focused_holo_light.9.png deleted file mode 100644 index f8d619b4d47ab5b104d6b1042c27fb16a3beca47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 523 zcmV+m0`&cfP)C3<00004b3#c}2nYxW zdK`GU$CA-E+tg1FUj3CV1Ez}l7r{NB_YWZ zgb+-Kh;2qAgunr)owSNT9jE|#(}iQ{0=K~F)j_f4%AIwfW*LI4SCjSena$3zhl@?`-N)f>fC&00iU>|7tSL}YGdG832Z z7Ry93w=$W@5~IozqskJa$`YfBUCf~8@-tLEe(Yg7ZJ&$d5^vAJVlkbz&)H#>=1rCU z=lI*@D9QucAy4<)W_$YF0~q6}sI5vC!>ie*fX@E1>5KTAKqegRE>ywO`Fw(I}^ N002ovPDHLkV1grX;W+>R diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_pressed_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_pressed_holo_dark.9.png deleted file mode 100644 index 955a2f34061ae8ac853050da355f89409fa0a784..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 464 zcmV;>0WbcEP)C3<00004b3#c}2nYxW zd0`Pl=$b2!s#>@tS z$Y#JV#)+K6SU+tW#+_RkXYzpRi_e9eTN!5>F{(z4su81V#Hi{OLkTB`etUYuM1<4( zFh4)_STHCiBAh-(+2ze7j|0M$*V@)G5^^0JhFHh^fzV_7Tf?-4Si|T*tYCB@#xY$W zMloF>#xN!zMlhxzoiQdMoiL^$+87%UEsQNlYm7|@05m?}iO1-}bYl(D3Ue3c7gw}A zD?zp;CtICi-;5NDtN#ybjCs$)&yQmArGt<$4!&l7(HXO5p7J23`oDJvMC3<00004b3#c}2nYxW zdPRE!~6H3V|7LaeL+kwzxO}{DvWjdA^uWhB*Ox4MVbeVt$Spwgkx< z!VkuXjKgSuY)h6Hw=%|LL;AyKLdLC(F?ASO9Y$7%k=0>jHH%rr7Kwb5&>UvDaCo}j z=j+357qeVAJX{{~a_138(!I8ROa__X7ee%7enXtUzOE0mAw(ah0z?m{B1Ao=21G5U zCPW=Z0YnW(5u`pwA*3EgF{C<11Ed;86J&FYMhHOp8-||_vny?o%`ne52fWVraQiWC zKdv-wupMF9(yd;3%<<_PN8|TOh%C!a80|#$F{54SO;q)d{~Z)(nS?QFWpYf|szS`q zFpt2hCCEz5&mZk`@i_(t4MLWruXxh=CcXUn1{k8P{&E{)e*gdg07*qoM6N<$f@(ay AcmMzZ diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__tab_selected_focused_holo.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__tab_selected_focused_holo.9.png deleted file mode 100644 index 673e3bf10d60cc54b6dfef2fcda24575073adf61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1i!3HFsuehcLq*#ibJVQ8upoSx*1IXtr@Q5sC zVBqcqVMgJWBc+iXw=G=Ra=)z4*}Q$iB}l;b6k diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__tab_selected_holo.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__tab_selected_holo.9.png deleted file mode 100644 index d57df98b501944b4ba63623766c396b5bccc29ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1i!3HFsuehcLq*#ibJVQ8upoSx*1IXtr@Q5sC zVBqcqVMg}h~fd(*my85}Sb4q9e0H>EG$N&HU diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__tab_unselected_pressed_holo.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__tab_unselected_pressed_holo.9.png deleted file mode 100644 index aadc6f87b21d7d5139f3bfe860f4c289f75d241f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1c!3HD^Kbl$tDVAa<&kznEsNqQI0P;BtJR*x3 z7`Qt@n9=;?>9s&XV^0^y5RRG22KRnVX>4qKXwM^^Uwi5RN2-aD!@msM(PItf+&Xuw+O+F;e0P1D%boFyt=akR{ E0I7Z;-v9sr diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__textfield_search_right_default_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__textfield_search_right_default_holo_dark.9.png deleted file mode 100644 index 4be4af5fab3a09cce65144c747f24c6ade600359..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~k!3HF)wbmE`DPvC;#}JM4$v^)8w`Z37Am6po z+v)2g(?$k`c>N1yj{}(xupO|Bb9m#eWaid)`oBujjyMLj^RWk-B)8T8wKI6S`njxg HN@xNA1NtG- diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__textfield_search_right_default_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__textfield_search_right_default_holo_light.9.png deleted file mode 100644 index e72193f5921ec091dcbdb7a6da540c6ae62a0abf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 103 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~k!3HF)wbmE`DLqdY#}JM4$v^)8w`Z37Am6po z+v)2g(?*5`F8a+MS1=|pKR7U*C#OeuU+2*R28QEj<(b@LKCA=kWbkzLb6Mw<&;$Tx C%ODE? diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__textfield_search_right_selected_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__textfield_search_right_selected_holo_dark.9.png deleted file mode 100644 index 8f20b9d2673d84e22fe4f92da5c6fba5524bd7c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~k!3HF)wbmE`DN9cm#}JM4$v^)8w`Z37Am6po z+v)2g(?$k`;P+>Y&mX9;kTm#w#$Mr{KU16J0f(K87k2#dS899B%AjFfa`@;vsXm|~ N44$rjF6*2UngAGyC2#-$ diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__textfield_search_right_selected_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__textfield_search_right_selected_holo_light.9.png deleted file mode 100644 index 04f657e1db10e9694c00a2d0240c4dd96a062c37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~k!3HF)wbmE`DKk$O#}JM4$q6$m+Zg$O@E^Uw z81lZJ?Gxk7s`Po4Y{w3tY?zt;Z*oT>n?b-q29KD3>Vk*AGBMnIke8aaIU*2f0)wZk KpUXO@geCxD+9O{8 diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__textfield_search_selected_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__textfield_search_selected_holo_dark.9.png deleted file mode 100644 index 99309ef6d3e32a2d3303400aa061e0508a70f758..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~k!3HF)wbmE`DN9cm#}JM4$v^)8w`Z37Am6po z+v)2g(?*7dS92?$NlFNF3%qKd&uD!9kGjy}NRLj&jF%7WCrYdnXQ&Wp*=?oVF$ZV} NgQu&X%Q~loCII6IBdP!Z diff --git a/libs/ActionBarSherlock/res/drawable-hdpi/abs__textfield_search_selected_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-hdpi/abs__textfield_search_selected_holo_light.9.png deleted file mode 100644 index 9bde7fbdce15a1c2873eb0779ffc0617fd9b15c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~k!3HF)wbmE`DRWO3#}JM4$q6$m+Zg$O@E^Uw z81lZJ?bE^f8J_14%!p_Ru>Zp|qw<;kM2WLbT|5rH?EgED6zpZtm|hnx*$^-bXas|& LtDnm{r-UW|n`=evwJLPDoBk{4*AEnmdKI;Vst0H2gA*Z=?k diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_bottom_solid_light_holo.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_bottom_solid_light_holo.9.png deleted file mode 100644 index 0706c8af658bde9602634950dfe3d5fa5886163f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%zMd|QAs)xyUfsxfz<`JK;_Z5A z-Y@ApO*&r-OgQM+#9X>wkYiu(tId138dhyGKCm}H$eLN@qysZ=3D*)nlM7YC@0xyy hn}nCMmBhQI$CPR`ipOiMnG7_T!PC{xWt~$(698&aE5rZ* diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_bottom_transparent_dark_holo.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_bottom_transparent_dark_holo.9.png deleted file mode 100644 index d814d02d31183b8f00f475a05c124004983d9eff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%PM$7~As)w*fBgS%&%9EC|%_%783w8jlt8^&t;ucLK6TeKPwmj diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_bottom_transparent_light_holo.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_bottom_transparent_light_holo.9.png deleted file mode 100644 index b139c8e49168e4404df0a46b30a4b30e90c1ccff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%PM$7~As)w*fBgS%&%9ECY>s_{MVWOZ(=mjBT1_sGr W&p6(H%v1uJ#^CAd=d#Wzp$P!PC@9VV diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_share_pack_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_share_pack_holo_dark.9.png deleted file mode 100644 index 738cb38d072137cb68723c576a801e3f3471bd3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2849 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 diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_share_pack_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_share_pack_holo_light.9.png deleted file mode 100644 index 2ed75a767a87ac573cb7306686035f2100459fb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^Qa~)n!3HFaZu8v$Qfx`y?k)`fL2$v|<&%LToCO|{ z#S9GG!XV7ZFl&wkP>{XE)7O>#4jVIz7XKNB(EC6kA5Ry@5Rc=@2?~6F)PwUxdYTwn zdMu8}YM6Xys1i$1bTr(^uv&TM3(=CrV!crU$Q6V-%Qg7n#gTe~DWM4fl0G)# diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_solid_dark_holo.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_solid_dark_holo.9.png deleted file mode 100644 index 743d00b6cd7e446c7badca9dd11d1579404569cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%KAtX)As)xyUQ!e~V8Fq8aW6aH z`M>?!MSK0VJ5DH+1)MRKpSquM-S5BdOIN+&sn~jE%jQNlsf-1UY_}X6mMgq#dKVMx ha^q%Y#@a>3az|3`-r6;1y%^A322WQ%mvv4FO#tkfF|q&v diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_solid_light_holo.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_solid_light_holo.9.png deleted file mode 100644 index 17c1fb921f9b7b46aaeefe7afb8302874fb0abd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%KAtX)As)xyURua|z<`JK;_Z5y z;?s*`91mY+Vs~LvSAIRQ|I~ek>wo_(4hk(}+Y^;`>!t%UugL`m=C=w5f(6PQ%h%~C hy?JA^CG4Uk|5eN5b2qlEYyz6g;OXk;vd$@?2>`YpFM0p~ diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_solid_shadow_holo.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_solid_shadow_holo.9.png deleted file mode 100644 index ddfc8e3d5c4131f2460254f183938477fc5a0679..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rhed`}n05R21qr&#kfCPg`@kT=WR_nY-)l@u)2m z9YjR(TNrC5J8zlf@MOx-MX#^q?zd~tP;1Ok`WbQLQ#YGy{=Yfu7pEGW;JmVaai5Cr S@!LSF89ZJ6T-G@yGywoUXh2*5 diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_stacked_solid_dark_holo.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_stacked_solid_dark_holo.9.png deleted file mode 100644 index 007a4b239244212339b817f8de9474a4dc34fde0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%zMd|QAs)xyURua|z<`JK;_L&H z*gyPBj&nSGnTg$nOT)YjBQU;+O3-o%)BNS9GKrK90(RDcPwA0 ir}XBH&6co>lKfV`a~Jh`>I4G~X7F_Nb6Mw<&;$VSc`p(G diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_stacked_solid_light_holo.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_stacked_solid_light_holo.9.png deleted file mode 100644 index ad6e1a4d9f3c81e20676f979a53cea2084ce903d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%KAtX)As)xyUQ!e~V8Fq8aqs`F z7bNtyi1zwxcbrft3piseKXpIjy5E1@m#%ulQ?d2Tmd%Z9QW*;x*={*DELV8f^e!gW h<;Km*jJ1o5{)rFFF7K diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_stacked_transparent_dark_holo.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_stacked_transparent_dark_holo.9.png deleted file mode 100644 index 0ad6c888b4c7e436e7d7c78432dbfdaecc95a7ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%Zk{fVAs)w*fBgS%&%9ECxB?U?=uVx Y$^4u51wHGE0Gi0)>FVdQ&MBb@0N@ZURR910 diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_stacked_transparent_light_holo.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_stacked_transparent_light_holo.9.png deleted file mode 100644 index 19b50abcb536602cf2cd36d5a19805464988bd20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%PM$7~As)w*fBgS%&%9ECmdKI;Vst03^XH%m4rY diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__btn_cab_done_default_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__btn_cab_done_default_holo_dark.9.png deleted file mode 100644 index 5461b9c00fd3fc513aa4465682e70e87cca36a6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^EI_Ql!3HEv&)kdyQaYY4jv*T7lQS|h5*V8PD@dJb zGfWV2j%0YY@&Et-(u-Ft=sZxsVYp-gbGr;f^5z}?TUWk$0o2Ff>FVdQ&MBb@07WJt A3jhEB diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__btn_cab_done_default_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__btn_cab_done_default_holo_light.9.png deleted file mode 100644 index 5dc6f804aea8ca344275ac6eb497b6bfe0f117f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99 zcmeAS@N?(olHy`uVBq!ia0vp^EI_Ql!3HEv&)kdyQd*uajv*T7lQS|h5*V8PD@dJb xGfWV2j%0Xds4&4P&{4SYp+J&{BRiiZ!)425)ejdW>;mdy@O1TaS?83{1ORBM8sz{0 diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__btn_cab_done_focused_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__btn_cab_done_focused_holo_dark.9.png deleted file mode 100644 index a70b53c59af769e3c98973ad9718670ce27259ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109 zcmeAS@N?(olHy`uVBq!ia0vp^EI_Ql!3HEv&)kdyQYM}*jv*T7lYjjGZ_h07hy7xL zS%<;BUsuG{45zRSgeB^>bP0l+XkK D`1l&; diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__btn_cab_done_pressed_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__btn_cab_done_pressed_holo_dark.9.png deleted file mode 100644 index 85d7aadd4dfb619883f68f1cc63e629698b5dab5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 107 zcmeAS@N?(olHy`uVBq!ia0vp^EI_Ql!3HEv&)kdyQbwLGjv*T7lQS|h5*V8PD@dJT z6Fe3@|6GeFPb#ATqtK84|Mweqan0i3X%}$jvMQLwz#trO`SaWQ^{znO44$rjF6*2U FngE5o9^U`} diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__btn_cab_done_pressed_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__btn_cab_done_pressed_holo_light.9.png deleted file mode 100644 index f7b01e012f895bfe2c4241e1d48771fc372b35cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^EI_Ql!3HEv&)kdyQU;zbjv*T7lQS|h5*V8PD@dJT z6Fe3@|6GeFPb#ATqY%TTAPubyB?B2J9?cgAJee4pt{u!zH{AaisF%Uh)z4*}Q$iB} D0X-aq diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__cab_background_bottom_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__cab_background_bottom_holo_dark.9.png deleted file mode 100644 index d8f1c8bd54f4f091e79389603095c99cf825cb6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%Zk{fVAs)w*Gcqy~4zxBtu(zuW zGMHg-@7EW5UBeRx4_{GYv)%pQnG{Mujhr&UNqv-pZ`Il{xB Xs2c0@Tz2whppguou6{1-oD!Md5lfPH{+~ zs&ZK!$GJ#`+OXn)bEl7O^s7vMLr%~_eO6@BP#xDsWzJIxbKZ~=QHwoEqiCN;6|k~9&?6VGu8wVeg}kjlqBUkXd|o%rApJ7Xx?SmelE6^*`N?mP%?P7H@yM z@176Te{31>^aeVqCP$2D`iM8b&G*loT1#z02OAN3)TGUD#xbYXQgqexFre>@9yw_< zoN>t9>xRrEIA?_IE1YrUo=P<2hNadJXB=4rbb%a&IXb5^sO2P4AoU2`8OJ_N3+RuU z?3bPMlGWJT{|mv5xDeck3qc!^Tkv+yM^@uWqQKxnw{tZ6G_7EN(=@mR#5tHjEptZL zT?o!N^e&F18P*7EfGlP>S;He0o_$19Sz!q7up>N&hdzT z+KgUQr1}UkLQL4KR;yolWSqh_YPX?lMz7!1&pz~~fd%z~_Z{#V_yT+aKE`}mgO%s( z*Zy2en({y`_&;C`{0061zkwyNiuqzpAev$qeWYoU3d{J#NzC8IACaX$H=;%xu?3!~ z#a`2j|4di>P9KpnLiZ0Fl^vDJdHW{hJgNDYHbk!VsHwq51hhtobGl;RmY>GHkg{)E zesWUhFRGl6)Eh$fMU__)%@X*lTj%8LuWk+fh;ux9b*`$4|A#h$uKO0E`Tzg`07*qo IM6N<$f=1Pyg8%>k diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__dialog_full_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__dialog_full_holo_light.9.png deleted file mode 100644 index f18050ea589eaa31233bc08e4f8a4e361747bc94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1003 zcmV%vbFc60S)hq5aquQtN zO>~Q-PMt}eDy?tfo9G5^U3x~HVu{=o-l^#5`3AXbFq#7CZ= zx~R)Z%-PngELWXE=jG+4wH{HY%RHtL$z+_dj#xsD@Y&isDVlJd1j7%A; z{S3ob2!NCVl}{yrl8B^V**9f-6IC==^T()w$-W%VAY54pg(^F>UjitZxrB-eCn8Lf zB*stQ-rl}17K`6RG#lbS(&{_eIc1V`#=6_}di{5~T>e4x!ZPZXM|a{QRmt`XV*pbC z)5T)(D?{j2cRHWXf1>hHw<=z1GC@s9Ro2lk0Wc$?r`}K3Qx5<^GzKt(+iwt@SwZ#Y z1K3Z>bSEt!roEr8rydA`NJoVD>nPSV+2(05UE>4T005_GAOuI89vS#iG4B18N9tN{ z^Z@tNBTj+gCOB47*w+ z+2Hb~>!f2H1$Hq!D=_Sb+i%D|qnZ-1^bbIwX<}v&QHjdz0&e>kOOQ$(hHgzP5DjJz z0f>y6M3En>w55Wi4nf3bKUf4p>o0~xvY>6}4YBjHqH^B)8ba{Lja`ks{5OurR;$m< ZjQ=n8%sUGgc=rGR002ovPDHLkV1nUn!$<%C diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_ab_back_holo_dark.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_ab_back_holo_dark.png deleted file mode 100644 index df2d3d158e201f4b5bc8f478bfe194c819c762d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 466 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6n3BBRT^Rni_n+Ah2>S z4={E+nQaFWEGuwK2hw1@3^B*n9tLu5dAc};Xq+#-xYx_sQH13|{`71Pj-*6Uoi`#n zE(U8IKgsQz<^Rb4R70ym$22iPZttV^?_#_6n&0#=x|;ZH&dfx!jETDzs(0U>)g_uQmUhGGNWo+VotE}_5b3Zj`hnf_E}Q2 zkoV^c&!VIWreR+T-g@7!2<2C~cxLXYh02~hOPyXw&7V2OC7#SEE>Kd5q8W@Hc8e16}SQ(iDxmE@S#`ha8qiD#@ zPsvQH#I3=p$s!-9K@wy`aDG}zd16s2gJVj5QmTSyZen_BP-2>S z4={E+nQaFWEGuwK2hw1@3^B*n9tLvudAc};Xq?Zzc+iX4P{i%w`)y*!lC}nMxxP5m z`ipDd|3l#c1q-`17wzs7jap-@cWTC&8}(D4%&X3GaM#!SkY4?Tswdc+PM~^5?gXjDEJr|A(9^w&s1cyzt=Kg=58+)D;SHpB%sRSHFHUToUy>RV`*x3 zp=*`d7Z@F1xvAFw#q#fW_g_%cHx(CZDFFIJwZt`|BqgyV)hf9t6-Y4{85kPs8kp-E z7={=cTNxTy8JPmPRt5&f_Zu#wXvob^$xN%nt--0uA|I$h5@bVgep*R+Vo@rCV@iHf fs)A>3VtQ&&YGO)d;mK4RpdtoOS3j3^P6 diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_cab_done_holo_dark.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_cab_done_holo_dark.png deleted file mode 100644 index a17b6a78920848c37a67246a76749b4cc1425a15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 566 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UOiAAEE)4(M`_JqL@;D1TB8!2v z2N=7Z%(epwmK8Xr18D^?ZvQoBE&~Ijou`Xqh{y4_R~-EgIfxwlm><>K$vu5h!wc4! z9iP>XtrZVs65@3e-rKIN%Hh(x{ewWxt1j(s|L*kJ zSoUnickXv5=i7?TNH`^EJfpg4#&4;Y0qR0+drTg2JXGfUq3}Rr;{P9f_n*&gD7KkW z&D4IqLivGGRq&kmAH6(eA0`F~7S8rex88HAVS=03cY~80?cpzkFa4S5A6;t}xJ7Q# z9-saRVPfVT##U33AAO3A+Ypl|_94?@cK)tT4*8AF;-^j1iVm!a-M-<=iX&Itr@TnW zJpXO;4EOj9!Ar}#BHVL6_dHGGELXBQqN>Q8)gj~`k@s=>rw|ur?|x;upO5s^{asBY zKb@S=&SWDRsQzHyR;N3i0@8Cfnf~0l`P3PA4VeH(Ut{H!I{}l<<aB zB5gMTgH*M|HKHUXu_VC#5QQ<|d}62BjvZR2H60 RwE-$(@O1TaS?83{1OW6u*u?+< diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_cab_done_holo_light.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_cab_done_holo_light.png deleted file mode 100644 index b28b3b54f4c81d482f797f31936cbd4013c093b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 552 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 diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_clear_normal.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_clear_normal.png deleted file mode 100644 index 86944a879b986d941e6567d78fbac16c87ae9244..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1869 zcmbVNc~H}M6fTFTAW9JhxeNgj51OPWje@pKfI5QEBA|d$+W@sTscjVKdVuS?9w2h9 zu!^p(ipSu+I*za)qKMZh4tTpGiYF)@D~E`is<``y;~$%us6_Qf>3EP7d8-+ zSuC3rZA?5JA2A(OQ+kfdV#CSM8yGZ;HF-*gL8aCaG%$}y)sn&B%ahe0pw$F}ae@dq z!XP8kwBcqWp)^OvsLeXHSOZQ80VZdl41u1YRX~P*0ck=rg27L`C^NTgLm=?Ugw_Rv zpPh=2hyrAkkpKi7I8Y4>VL*s*5FTG75={iSFakp`7ecs!hzR9zQ5XikJRqZH)TE#a zEcA;OvkC^&Xxe~6PXctnG=pit3hET2u2VQ z9~N<8VGzQE&zE61CKg~a1QT!t{T$!IN?{zwL_!$n$z%wEg-T!nU&6;R9*)6ME??M> zm6Ik~MXHH@T`i;g87m0=E*6y;2^CElV<>7te+5LPQ8Z;rqYQvdDF7l=YAtD5TdwDG zv>0L3E+#agMoJHS$}g(@hCVJsqzKOFTO4KL4hj`=LnW957mEdaK`0OWg4O(=oI#8; zkfk{OQ!M>kOa)q|UrV1^d~F_rWID#kv<4`i7|nFtQaL7x$+*=PcRNxkacMnTzT(!p zfRg6DJ1Y_~Z$G;tw~$ix*L@nh0_gy+q{K6=O-)U1ZBL7fiw9T#wcP7iz?I7*wg8n!aY@L* z%F1466IZ9xDGw&8Ca%%8-9N%k=5}B-gNg) zDs^~|+ru7gAfdUoeO*+YE(gj=-VB=VaaeB5#xy?WU;B+3~rnji3!zw~u|NB5xDgMA*Ab}CoKR1b4{ zl>=_SIAEWB^HRqqsb8t5;#}&X_CmjxL@oZX6x`u-Nm{2|`y?pbN5T8(*$@T`ZH%+J z9q+wi#oajjm>l)vpmE_mr&lY%70+^a$7TKT;qFtqhuwA!$jh%>ho3F4%BgGKv%2K0 z$HF4;&SJ>7KIHm~u<^wO_8Z;3y_c~N@r~v)LwjwHt(kkY;`G=_K|x(kncTb+Ti2eM z7yH!X-5fzxm)r79(!ZaTJ+c?A_7b`^xjVa7S5;ayZg6q=sKBA)LhBfI?7p4HG-EdX zGM##G-t1BC0PE-nz1YH|+GW>beOJO<&x4C?Y3_ohAr4Hb&I{K{y07O> zYq)siMdY38b0^FH-T7Vnp?+Dwy~?6uy>H4FYTQ}9{^zjW>fFu1k;Wnu$QYKv+~3MD zkL9@kLKD%Thtmq5^yY3(U$KE}2<_4f7b{3i<6pkgb<{dv;FI&fmd#{QXNuR<0GE-t|?<-_xFWf6rQD zvp1?(m;K#mK7kAc23PhCb9_I|Uwpe=_~P7`{<9hKeqT15)CmrGep&{}lJt6uiX0l6LDtGM?vvS&HSN)*I> zeOGt*EnBDP@;N{6y`LG()$~n&=KfpyvX&R-FPte;1xy60C9V-ADTyViR>?)FK#IZ0 zz|c_Fz)aW3GQ`l_%D~9V#8}q=$S`=EA9fW*LvDUbW?Cg~4U>%CWdb!wf@}!RPb(=; nEJ|f?Ovz75Rq)JBOiv9;O-!jQJeg_(RK(!v>gTe~DWM4f-EB1! diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_clear_search_api_holo_light.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_clear_search_api_holo_light.png deleted file mode 100644 index 15b86cbb21eb3bfb82d36aa9ce750906297a9225..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 743 zcmeAS@N?(olHy`uVBq!ia0vp^q9Dw{0wkH`a%F)OQ-Tee`#-|*CiUbcIg;ND=p zYvDSd^|6iLOdqf$Xmz|*HxtvIt|l!1HU7>O^~bA&&;Fj*b;Hx}3d6&UEnVN=_&rrS zyUca-tl4jMo@$nFEpTFXzIjD+{<)ibKgss#-rp9f6_EGh??g@(2S&3=!i$ftp1=NR ze5Ls1tv8DvCnWJd(z*Zhh{1dQ0Dw1}N=Vgur< zo}V(7G@F#*B=UQaz!7tS(%x&E*VO)~n0V|`)7|K^f!Elpcvl1$gq+H{_D)QEMqY%8 z_vf1aTF*LU_FtRc+)-?b!3?Ao)T}9E5o1c=IR*74~B%^nkKn;>08-nxG qO3D+9QW+dm@{>{(JaZG%Q-e|yQz{EjrrH1%F?hQAxvXq8M>Z zk&z^%c%@bRQ#)+nOe){kHaX!!Ue%|-vcG@vo7s2MJqBDZfk5<_)|-ZFZPj9NlZ$EDG$w6h z^v#+%T(e!=j16si)bzU4HWV6_^stND&E;|5`nfYv$?gux?t!>a1t>hEvKg8)f3B--`qJ5Vc+(!(3AIVr zEf|cmkv%DM(IHdcJ}Sgr>#(5~Tn4TISAy%nrQvE?Laps69ZLLT!~WS0QV)l|q?Zr( z+%hOrq1e~am)EDre9b1+$FL^?hsoiT)~9EmS!B=eNVF1PP(kFFm`ljix)2F8;hG8d=#8;jP)h%8u`(ez=ZN9^bNjAY1@m$qMwqc*3 zT<9Z^7q-4S8p!6dM-010M=(>rk1eytHi>R-cR}tW4SUbF89%`nk>dMSnMgg-f@tvLl z8zJ1Aj<77hi)&@}=LO_3nTIUJfhLK?)MTgjijKG^e1tcvx@U?wd-4zBd{w~Rm8u&) z61IEoor<-v>QlY};sLy%=GMYsYZW#7TiibW&xJ?UJ`JsgWSk4`n=4tN;yWe=Mb9;n zrw!^kvCo<)%-&D;l)PgTvU~Z|j|VKn#)IlF_j=`rkH?YbC)&niUyM-$#5;BRtd~Vt zvDwmlW4up^P2AqKxmr=aNvNMq0%A$n_A&Ybf8s&n?eE2(zp1N=^sXKmlORRu-MwkG zqSrlb4;RY>`GT2~ewsriQ0>5-Cr@@n4LZ4_+db%Z)RR$pECx zV&kKm<~rTWsF|5CovUxbAuX%rMqUY#bK_3MXl`zRlnnCM)JOk#@Q|`yZle2b!xrs+ z?}@SMBoaxAn*F`n4c~I!tWN%NL;nce-(Ln9T2XV@wz0+fUe{x3EWBVphWolE&ZMpy zk=t+u)*ULX*vshr>?xS>+y1VFi$&0ZQQaET*YU40s&SgZh;!v@8ZAA*DJJ>D=a=0< zFKXQ=k&~NZZGoK2o`n~+R8w?*R>uuBc#s$EF{m0(={u8TU3kQEm9SfChYCn7J#=g4 z(PaFJU1FFZJS#?cN?VCdd62LmX1(Q&iCokv9@0&`0c7bz75vdTSAVg)Dte++U_U8a z)M|^@vmd{xiq;M1c-`XC1_k!;*hJ-2+0wh;$&M)lJC}axPr((&K~D-GVw^}ZK>;xo z8*&r{B7jDjnH@k`96(zW%`9zDXdCl`2T+hey^ru3{!bx1A}HkS<^L~SLob9t1%PwH KV``51)Bgpr>#?r@ diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_go_search_api_holo_light.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_go_search_api_holo_light.png deleted file mode 100644 index 8518498eb6c93e3d4f9f5c806362bf3117b17852..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 570 zcmeAS@N?(olHy`uVBq!ia0vp^q9Dw{0wkH`a%F)OQf4-y`wRCHWT>4=v6Z~W)^Ex~}&Cks#3Ph?YL zYs=^PA1JbT)~OR;KkxqfX5VYCuTH8yF+BVMK5jv$P8>M!p?~7X|K_(-ZNE?1#j0+Y zX}rfdsOO!o8=KoP`};Z1zsHB36rFKS#YJJm49Wj>o1-q)hN%bb=nB|jWMKUFU(#;% zzNwwTK`8{^tVraaWCe_M$vxef5w0QpFdP-veDuD zxhegZ|L;vckoBsbjg4*D|NoLZ`&-4e?`K!s|My<3S%8^2?NH;i6Q(?qt2KRNl&_PX0wV*1 z5qGtn%`^R9z@Swvag8WRNi0dVN-jzTQVd20hK9NZX1Yd}A%^Bw21ZsU#<~VThQZ_f zu&XEx;QVw%w1wevX{81fiqT9$oZHH(4a215zM2{s3I28IOo7eJ#J d>KPlRN5&o6d@ywr|9haR44$rjF6*2UngC}HDAND{ diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_menu_share_holo_dark.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_menu_share_holo_dark.png deleted file mode 100644 index 6bf21e307ed392bf00fe80b162a6ce9115e62c84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 332 zcmV-S0ki&zP)h$s=>Sb2o({EW84x$2Sq@4Qvb1mj$j~;VIQBr2GX>%-APxay9!he7 z8W7h*gD?q**@0LXh%12j6cFzN;xHg)rA0Yl3bh0|IM)O5QD`2|BGz~0I$#-|1SL$5 zlJGbV2jtPKD8?58g7k0zp)`;V#9XwljI@z*K`Om-0V(CcdbDyt4~XM{*o)XuqGd@4 zDx{8=fp<=lEG6&%R0000-rS^s>8d@5ni2hppU0iV;YH8gwNa0%) z{Cz&}Jx|SbT`f+uL?986Pnf0|l@f5k0jz*^zeXXD13Pe$Xi*7R9^s5FmB7$P;6x!% z=kMH0V6IZ20v0@I38qpwTN6bU0_>(U;T<=GYX-1E8)QG}f-;!!681nE=wJ-aU=KPV z^-i_I3K%>@EawIsd5_!T)2R?x1}rE&N|%HcIQa;SqE5+gRv=Fy@M;YVKt`niqbhVk zpSlae%z=$G2Wp@TnqrmWnuKgf72^IDIDhdq{E7X5-;T%%62M`q*b}mOv3|8DyoG;R z;O#l^2#-VHDcnmy=|6xRPAT9SP9@+QP9YE&4z7Z?SGPkvc&h*a002ovPDHLkV1j;z BjTis` diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_search.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_search.png deleted file mode 100644 index 4be72f108ba1a4f36da5c3a59b1ed08ddcf7cb8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2280 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 diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_activated_holo.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_activated_holo.9.png deleted file mode 100644 index 3bf8e03623c94b68d31963ffe7e59c72c3dcc059..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqEX7WqAsj$Z!;#Vf4nJ zaCd?*qxs3xYk`86o-U3d5>t~CW>mH@a{g&g;s7!l1y4Byva-KaJLVIiI)OpBYodjS ofJx&-C1HsL_x|*Yp0_#7zz}{&aC*>dO_0?Lp00i_>zopr00f~Zw*UYD diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_divider_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_divider_holo_dark.9.png deleted file mode 100644 index 986ab0b9746301f2dd9401829da09e00995621b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78 zcmeAS@N?(olHy`uVBq!ia0vp^%plCc1|-8Yw(bW~qMj~}Asp9}6B-)+^BAxRtXRm= az`@Yw&#rLZUbzUUfWgz%&t;ucLK6T(%Mo}0 diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_divider_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_divider_holo_light.9.png deleted file mode 100644 index 0279e17a123f8cbb3c7e3a9ce5c5af8e693b6977..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76 zcmeAS@N?(olHy`uVBq!ia0vp^%plCc1|-8Yw(bW~!k#XUAsp9}6B-)+^LX%RmN2q0 Ycy4A9FVZ~13zTN?boFyt=akR{01+Y(GXMYp diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_focused_holo.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_focused_holo.9.png deleted file mode 100644 index 7c0599e3a6fcce1d9b22e47bfdb63afb1d3d9c02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqEX7WqAsj$Z!;#Vf4nJ zaCd?*qxs3xYk`6eo-U3d5>t~6?){p=$oZ!|i46oEul1LdSjZF4rt@IU_AhE`IYK8I wIB$ByaB<8!;4zVtCm{dd@wVRWcBu>u-xEd5&snyt0Gh?%>FVdQ&MBb@09FhvcK`qY diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_longpressed_holo.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_longpressed_holo.9.png deleted file mode 100644 index 3bf8e03623c94b68d31963ffe7e59c72c3dcc059..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqEX7WqAsj$Z!;#Vf4nJ zaCd?*qxs3xYk`86o-U3d5>t~CW>mH@a{g&g;s7!l1y4Byva-KaJLVIiI)OpBYodjS ofJx&-C1HsL_x|*Yp0_#7zz}{&aC*>dO_0?Lp00i_>zopr00f~Zw*UYD diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_pressed_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_pressed_holo_dark.9.png deleted file mode 100644 index 6e77525d2dbbc1673145d60d775602c85264330d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqEX7WqAsj$Z!;#Vf4nJ zaCd?*qxs3xYk`6eo-U3d5>t~6?){p=$oZ!|i46oEul1LdSlBa@C*nY4{!0_J9HA2p woHspUxHx7V@R-QS6OjM!cw6swyHo~-e~lvMp^1B@1I=RaboFyt=akR{0Ay(_r~m)} diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_pressed_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_pressed_holo_light.9.png deleted file mode 100644 index 6e77525d2dbbc1673145d60d775602c85264330d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqEX7WqAsj$Z!;#Vf4nJ zaCd?*qxs3xYk`6eo-U3d5>t~6?){p=$oZ!|i46oEul1LdSlBa@C*nY4{!0_J9HA2p woHspUxHx7V@R-QS6OjM!cw6swyHo~-e~lvMp^1B@1I=RaboFyt=akR{0Ay(_r~m)} diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_selector_disabled_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_selector_disabled_holo_dark.9.png deleted file mode 100644 index 92da2f0dd3711a2ceb843768cafd6b91a2807b43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^{6MVD!3HFkzrK_Oq*#ibJVQ8upoSx*1IXtr@Q5sC zVBqcqVMg#;uvX%d>fBtxy+SfFGJhTv9Z9>9n%%Tr7{oI+Q@DMao9hQt@O?p#8;eZd15IY| MboFyt=akR{068-?^#A|> diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_selector_disabled_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_selector_disabled_holo_light.9.png deleted file mode 100644 index 42cb6463e4c28c6aeffa315c4fc869867dbb6b7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^{6MVD!3HFkzrK_Oq*#ibJVQ8upoSx*1IXtr@Q5sC zVBqcqVMg@oJyIHz9Y|%SiynA|kd)58s-{92FmHki*;@KxND!%;H%=F4ZU(n;yg$GVRgBd(s L{an^LB{Ts54)-;@ diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__menu_dropdown_panel_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__menu_dropdown_panel_holo_dark.9.png deleted file mode 100644 index 460ec46eb0786706610e21ac9097de489cedfc33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 651 zcmV;60(AX}P)!1&^00004b3#c}2nYxW zdZ_-Wf*5)VugS&t+23J}V*z%DOHb#W|`Z#l>;cJ*L_P;jGoKD8nX4Z`xH*Q>s zTvTl`b;%gqS1znaOc|u@tz3t7=|UK<9Hr>BJ|D1%4AOYzE>c>YASL1(e+Y^`_iG?7 z1UL~EK(|`0e*W#*UXt~C{TfUweyI5sSBLVgO?u)p&e9+4(C=i^T1GuQJ|j^LdEE0 zfZFjzm@Nd117_`XxKDqSoJXh_wG-}tW_yHE!!B|TSvyio<6k9eTgoG9O0aTdZJ81x zmbul8Z%fpkT#Wc{ND1L@No&VX#iPVF7hx`c0JdkE;3e2%ZBQYi%Oe#dj=&z+_I>|? zOJi$dCv)FoZJG3n&>Qp|;vSo*JOkf=A5uR{`;uV-QwsX>Ho!a31HXV*se5TxFFA=4 zo=3!%#5;D2+DO|6R;c8b^-B2j{s4XhZw!t1m&l3O!HmBwHn=!)kb6yF?kI1MVX*Vu z<6hz)DH{^YBPWDzO$|0isCW3@P>L98oO;C$E5=4jGEPjLS?XZ=13IvJLaC?O;nLn? z=e?6_T^b`&$N3sK+o1N3^-DyB&=+_N>geY)_rHdJwBJ%s{^4(_WBZ5MLQM53U4RfX laXn(LVYMe-Njr@(d;;;gyUim^Wn%yU002ovPDHLkV1m`SB-{W1 diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__menu_dropdown_panel_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__menu_dropdown_panel_holo_light.9.png deleted file mode 100644 index e84adf2d41604323cdad8b15e7034b6137e02425..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 720 zcmV;>0x$iEP)!1&^00004b3#c}2nYxW zd09!jyup9SJyH%;E_KZI5Ed^B*iNJmRSj zBG=jNc2B+cMg+dzb=~X>SwfDye{PH^oqQ4$1^~*55|NVv2=ckIR8XoEqC|oOgc2g; zEPA&fNb-^8#Mr1#v(VQn5UdVR@QAWs>EP1 zTHM9Zaim5tPqqk+y4R~ii**RWgPIHWkr2Q-rv~$oD_;OFg!*vQOJ?oR%RhjSvm}}N zU}~@)A@q_TOphE%y@J$^Y;2GXG*T-_?U?-%UNYKi5n>WcgjmBq)+~pV5UB*Fc4!_E zr<_OV^tE=(@|l_%K9#lBPBbeU!!Q72CYl{ozqWE(s>}kg*Xy-fB`%jskbX;(+jyxw zA`k(lb8|^3?6_RfL_?Is~gyeh`O%xX?U(f4nJ zaCd?*qxs3xYk`99o-U3d5>wYsbmTgqz{8?`Dg4L(`abqnuZs;wTVv8ZBg|GX^f4xE z5ck=nld$UVv7H|oR+P30etdkz&;0SSW2^3}yn7y4rozh{Dy3k((DE(NNCr<=KbLh* G2~7afj5MhL diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__progress_bg_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__progress_bg_holo_light.9.png deleted file mode 100644 index 4bb22f0e10e621ef31f16100b3f682a09565c65d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159 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 RY6Dcn;OXk;vd$@?2>^cl_{IPL diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__spinner_ab_default_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__spinner_ab_default_holo_dark.9.png deleted file mode 100644 index 29aff4d43f71a025f464587ead52aff2ecae6a58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^59s(?1)eUBAs(G?r*GssWFX)$e`(35Y8e@;SI4XCdOETn3puLX+U@Np z`{}{9$F@!!Tb4}GnD8m&^|D{1rP|_tuSV&+Z=MCoD&l+{? zpGeMToA<;$LF?@fW~rUl3#RU765DB+Fm*PQ+)k?pQ&%&Ye!A+gR)$OeeXHaR#_cxq xcQACD7BHRDw&oXmu9s(?g`O^sAs(G?r*GssWFX)$e`(35d_EZ~i&w|H<&_`ZD(+MedV5zj zu-#_I+lqbxCf!wDY`(!qq|2YPZ`s2sD|KqW({JG~4*WL+Cpx;A`7$XPF&b}JE9dda zdDh0P2cC5-%kKDDBus2)4y)97FmX3?+)izQiL;plcWMSG#q&-%rTF<%+zn>y2h*Mj yizj?!^E*(P`ureMOz-ZiFXWg1cX%y7!FpSm=AYI1UI{?QGI+ZBxvX9s(?*`6+rAs(G?r#o^TG7xZ`zf?Wo$i4qI|8=SuS_>z)W_YPj?%Q>u zIp@ANM{x}Zqe@#*i-Jc_;!9;KcT)!P=e8Z65pgErb%iKSkCNb@A?yTt$n@r z2c`IHF%KKu<@hR|E_CSLV|hUMOZy3b87rAYm)KaVUb9s(?*`6+rAs(G?r#o^TG7xZ`zf?Wo$i2t+|9e$2v=&Zo&G1s6+_&pQ zbIyHljz-QjH&*S{-J;(gu&3N>@$LMyenNedpai4+B)&;SOq0|eu$bkReVyxuhm-Z9>GFCF_99MaBsxVXw=u8GrS3j3^P6KmrqN>Fc^oQq;b>Mt0(a$ z!tgX@A7RK4{kGy^A3#w21maN-UfpV|U0)B)Mu)Zk(%$xiP)OBD#retJ&sicWsshEL!WHUI0Z}S=i2Rqw=-{<_oUlU4$I1(Vt^KG}@Sd2k4!kUV zp9d;G14UN$xn@Z2Tv!X1WCiPlZi?T5Wo`s>dMMw4?2=HB&MqLoAdzh3Gg0e200000 LNkvXXu0mjf#CNP@ diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__spinner_ab_focused_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__spinner_ab_focused_holo_light.9.png deleted file mode 100644 index 6536ee63329bb47bec2bf2384aa494923cc2773a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 424 zcmV;Z0ayNsP)Km%mHHKmbPH_0G1~QE(|Z z3L*$mIy*=P@!u2&!BHHFf;fuc0uio1*2@YRBct9{0AyU2}iGVkcWw7UUPW(q{Hz&m;6;CQrhm;h30w)z2(`W_Vv zws(S3@Pah`KM=_o2%_3&n+}O86bq(Ag>`_N^4m7drC>+{^&N;72|01L0Qm!AONf3s S@;8qF0000Km%VDkFce0=d)+vOWKIG} zhpvGvb*AhYN}o4m@H1o!d4o*tRBGZMkUCTWmkL{wB~SUlAntIEgw4Gc(!&*+NcHqe zdbonr;tjwaz@#r!B?pk5-j_#K1)p#z)*b-3QShBfQxGf+4==MNa*z{HXhG0C1P_4~ zh;-k(7eP#tUz1`!Wij$Dh)MD;xve&Fv5GXEp_kweUysY@i1cm8S?~wm($ky-rf?^L z4cuB_3%3%uz>Nj2a3et6#z@uGqTe`wK1>2-pyo{<@B~f=x)vOqS_S8F z{BbGcPm`Srko*>0TM51dS0?bbgq{a9*ucpHu=A!M^DM~~^Y@aViMI>L4{MrZFUa%^ Q4*&oF07*qoM6N<$f+pdR_W%F@ diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__spinner_ab_pressed_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__spinner_ab_pressed_holo_light.9.png deleted file mode 100644 index 6de0ba8841d25f20f12e14002ecc4c9ec6a7b2f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 370 zcmV-&0ge8NP)Kmp@CxKpa3{epU;uAYD{w zoy1-2XXsG+d5c4J(@pInLg`pK=_I6J(k2d`5V?BE{Yj@j2pl)OcgK;0qd#7akgCKEJ@PeExDlrpx^Tf8?8gJ#K-Da<_nm z+&*9_w+lGPs|OtA)dC)JfQDKAb-?t#>nbk~ygr<>n4NOeOiNA8R)UE3F)|0PZr-`P z{wS3Lh~%_Rw1t=h$DO2-+|>0Ilo0LghZEP}j*Edw;7F{TKbM3p1iOHI0}cLp61dt? QIsgCw07*qoM6N<$f;wQ9<^TWy diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__tab_selected_focused_holo.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__tab_selected_focused_holo.9.png deleted file mode 100644 index c9972e74bb4fc7416960e238afd47b1ac363e316..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^EI`b~!3HEJ|NhSh5-4`^4B-HR8jh3>AfL0qBeIx* zfx8og8O=|gUJDd7^K@|x;h4Gh+(zC520Y9MizoD2>~^~(JZa^V pUoEkkaeSh9w)TUlKa6vZ+qJ0**((%Vy8umK@O1TaS?83{1OR&wE2RJc diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__tab_selected_holo.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__tab_selected_holo.9.png deleted file mode 100644 index 587337caf74f9ba3d32ba1c7cc8fb8b0b5ba245b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^EI`b~!3HEJ|NhSh5-4`^4B-HR8jh3>AfL0qBeIx* zfx8og8O=|gUJDeo^mK6y;h4Gh+(zC53JlB#xw8$}k`45e4cLk;e3y7!_%!uv(Z^d6 t0#9x~Qa^f(Id{#0H&;LIP<)f9-+fKc+F|3Yl|VxnJYD@<);T3K0RZ_tFJ}M% diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__tab_selected_pressed_holo.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__tab_selected_pressed_holo.9.png deleted file mode 100644 index 155c4fc753ed43185b31df3bea2af1ea5b3e7482..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^EI`b~!3HEJ|NhSh5-4`^4B-HR8jh3>AfL0qBeIx* zfx8og8O=|gUJDeo@N{tu;h33haPQZY#>U2n_RP$O>mRT6my}r88lS< uMnfl1c4A|rBX^f%!~&s(1*$LFm>5oL2|PB@cz*+E5QC?ypUXO@geCw>u`ROz diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_default_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_default_holo_dark.9.png deleted file mode 100644 index 081657ee7b828a74287d65d2f4644af9c7b55816..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 106 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CO!3HF4Hmy+sQih%`jv*44lYjjGZ_jMS*7QH1 z$Cu9~IqOiSz?8?{Eo||(vKg$oJDqvb4v1Q5NJR27d@z6V;avVV1E6LGPgg&ebxsLQ E0ED?8Qvd(} diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_default_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_default_holo_light.9.png deleted file mode 100644 index 3f312b465189caa47a7f8e4bc53c3222521e0bb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 100 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CO!3HF4Hmy+sQrey_jv*44lYjjGZ_jMS*7QH1 y$CppZQKez^S5>Et`mrVp3OWu(*tYT>W@HfhtG!C@Uj!>q8-u5-pUXO@geCyVL>!s` diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_right_default_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_right_default_holo_dark.9.png deleted file mode 100644 index b086fae8738227fc0b4f05171ded25ec1503e49d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CO!3HF4Hmy+sQU;zbjv*44lYjjGZ_jMS*7QH1 z$Cu9~IqOiSz{ak|8`Hl@9XRLoNT6Brf-|eO+cr*y`8p4HWnZ4T3DnEr>FVdQ&MBb@ E0JhyB4*&oF diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_right_default_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_right_default_holo_light.9.png deleted file mode 100644 index 73c336a77a9c908532b5b39098c22a878e0e87bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CO!3HF4Hmy+sQktGFjv*44lYjjGZ_jMS*7QH1 w$CppZQANR3w^={dWI;j4L5+C_+aEG8Z2O~g(C$e@C{PoFr>mdKI;Vst0EP1$iU0rr diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_right_selected_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_right_selected_holo_dark.9.png deleted file mode 100644 index 726e0ff427cd175c9c3607e25352bd696a3152c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 107 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CO!3HF4Hmy+sQbwLGjv*44lYjjGZ_jMS*7QH1 z$CppT@G}o{phONwVb}j=LshAN!kv;Qt~79nzL7Xt$zT{YC1>l7eH(zf89ZJ6T-G@y GGywpjU?4sK diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_right_selected_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_right_selected_holo_light.9.png deleted file mode 100644 index 726e0ff427cd175c9c3607e25352bd696a3152c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 107 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CO!3HF4Hmy+sQbwLGjv*44lYjjGZ_jMS*7QH1 z$CppT@G}o{phONwVb}j=LshAN!kv;Qt~79nzL7Xt$zT{YC1>l7eH(zf89ZJ6T-G@y GGywpjU?4sK diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_selected_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_selected_holo_dark.9.png deleted file mode 100644 index 1767c169eef03f3370b0f8e40f531dd481a9b82d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CO!3HF4Hmy+sQYM}*jv*44lYjjGZ_jMS*7QH1 z$CppT@G}o{phONw%V+tnLd~`l!OqNzXB@V%srV-z^vGhE?K{(iZ(fQrP(OpGtDnm{ Hr-UW|vZo$& diff --git a/libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_selected_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_selected_holo_light.9.png deleted file mode 100644 index 1767c169eef03f3370b0f8e40f531dd481a9b82d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CO!3HF4Hmy+sQYM}*jv*44lYjjGZ_jMS*7QH1 z$CppT@G}o{phONw%V+tnLd~`l!OqNzXB@V%srV-z^vGhE?K{(iZ(fQrP(OpGtDnm{ Hr-UW|vZo$& diff --git a/libs/ActionBarSherlock/res/drawable-v11/abs__progress_medium_holo.xml b/libs/ActionBarSherlock/res/drawable-v11/abs__progress_medium_holo.xml deleted file mode 100644 index 6bcbdb8..0000000 --- a/libs/ActionBarSherlock/res/drawable-v11/abs__progress_medium_holo.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_bottom_solid_dark_holo.9.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_bottom_solid_dark_holo.9.png deleted file mode 100644 index 575334699663b221b5a2b3251572a7c7a23ddb4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nET98VX=kc@k8Z|>$jV8FrZ@U7ta z-*T0WQ@><>I%v71J%hiqt0P@2{q!E)%~9Ermd_VC*s;IdoBnhS>rHk6>|lcSgpVF9 tjEp}SQ%vGx1w)$%c)I$ztaD0e0sua~Gttc^?peW`&R>iA3bc>G)78&qol`;+04`QPF8}}l diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_bottom_solid_light_holo.9.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_bottom_solid_light_holo.9.png deleted file mode 100644 index 8155fe840532e1d0fc25450729892ea73c4e007a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nETTu&Frkc@k8Z|>$jV8FrZ@J;?q zbcL8uwC8*^`8m#29p5Ib=%`p$wC&7oqt#odO)b{rdQv>$UUk^Hs0pFVdQ&MBb@0G6aYR{#J2 diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_bottom_transparent_light_holo.9.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_bottom_transparent_light_holo.9.png deleted file mode 100644 index fa4d76af93de31de153c6a7d41c05496bb14d2c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nETcuyC{kc@k8Z*AmdP~c#3C@cDZ z^MXtGfey<_%m2nWx~HUtq@RtOD!V+x#J|ag^QD{sZZM%<(R`m!o+Hzd-iC%RO>bP0l+XkKAqp+G diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_share_pack_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_share_pack_holo_dark.9.png deleted file mode 100644 index 9a70a5d1e3ad43f632287aff78d86289259099db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2878 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 Xx&sG-cNbs*00000NkvXXu0mjfHD**$ diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_solid_dark_holo.9.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_solid_dark_holo.9.png deleted file mode 100644 index 6622cbad34409b2e09f69e305455482ee107baa6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nETEKe85kc@k8FK-lVFc4sN{QB_B z&fog}EEk$2&*T)$|Ch61%h`96?xa8O-xitu^~t0=vn)PNZ(|U lO#br3!H&B!tiEU`L+e4N?emv^?*rP(;OXk;vd$@?2>`X4Gjad` diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_solid_light_holo.9.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_solid_light_holo.9.png deleted file mode 100644 index c4272978338a232aa445ed5190abab61afcedb16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nETEKe85kc@k8FK^^+Fc4rl_yt@$W?82D^ReIqPjo#d{bLmpkiN+x lnf&F6gB^EeSbfn>hW*nwPPt#_849$O!PC{xWt~$(697sdG9dr} diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_solid_shadow_holo.9.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_solid_shadow_holo.9.png deleted file mode 100644 index d0df29d8b3fef9f71cda9b7a0975c68dcfb05685..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 290 zcmV+-0p0$IP)(^RAa&-b-qmfdL= zKY^DZ_=R_1v^+>Y{!mW=MF!v|2#Q>Q>z_&4i6T94j-Y4q`P>I~g?cE`S~^QhBCU5$ z-8a`dJ38hrt)qwm8XJx0+%VAuW=z7Jg@`1pBAUrf#Ef=wZl|UqH7RO)u1OwK(@xK~ zuV&5*5lN0GQV~igR!o15*n1TfDTP6ilQ72>QBJOyK^2jQYHlAzlrUMuFCtAA$s$=K oi)4{qME3aCu~lSF#Q4a(0o}otDK%H_Q2+n{07*qoM6N<$f*T@rc>n+a diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_stacked_solid_dark_holo.9.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_stacked_solid_dark_holo.9.png deleted file mode 100644 index a0d9c1b957ea4a6ce62abd120668610d0cb2bd96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nETEKe85kc@k8FK^^+Fc4rlxca~( z?t=fRa*SINS}wBuewp3mefy2x$=b4i8MC*B`RkorJG1!P69>HDUX#kpcm>9d6MZKb ky7}`x**qcrtNL{AY0h>p*ZiBQ0JN3C)78&qol`;+0O3wK)&Kwi diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_stacked_solid_light_holo.9.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_stacked_solid_light_holo.9.png deleted file mode 100644 index d36f99fecf223779432fb843b823c04d739f05cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nETEKe85kc@k8FK-lVFc4sN{Ca;{ zvU;8e%Y`P%GdTtG|K%*$a`xS%JL%8+w?$@ueKP6JEX#C%J{El7iLS?_f2=|R(l=Qo klfOK1u;Z=_t1sHgP`H~Vw5GX>6KE@gr>mdKI;Vst03NU~l>h($ diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_stacked_transparent_dark_holo.9.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_stacked_transparent_dark_holo.9.png deleted file mode 100644 index 5ad475dc3f478734be31bc5763ff494e5f120914..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nETR8JSjkc@k8Z!P3yFyvu&IDfHo z*MFzV3!h#&I<8{wJG6*7%`^0A*`zgvpO3}4Jy+2bzzZhGPxw0F1DlG16;n~mnRAu= eo1*Vq{$#i=98+;OAz%&ALIzJ)KbLh*2~7aXVK40f diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_stacked_transparent_light_holo.9.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_stacked_transparent_light_holo.9.png deleted file mode 100644 index 6ade5eeb37d8388813cee512f8adaad0f6c15397..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nETcuyC{kc@k8FE8XhU?9M9Fk3-& z>Hkf73eN%?4n{M7dy#!$d2ZSCCv)eTUt5@6!ODmi{A7$QW>Hb7V|gN6#Q)yLqkTHN Y-hRf#&+ODnfL1Yhy85}Sb4q9e0PNo==Kufz diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_transparent_dark_holo.9.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_transparent_dark_holo.9.png deleted file mode 100644 index 719b9234df6fefc32c628a212141681df3414d85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nETB2O2`kc@k8Z(Za)puoZEAojv! z?q20mzFS+?F-&~oGw)ovvN+_p>pJvXn6S<7W@Fox#)9&t;ucLK6T;ku_WZ diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_transparent_light_holo.9.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_transparent_light_holo.9.png deleted file mode 100644 index 6da264db26b5debc433e570e454f7ad596d3609c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nETbWaz@kc@k8Z*Aml2;gwNxP9_w z>q*543$-17oYd6QwPclDxvFIP6Y06uZ3-`2R5T~}Ha6e^YubHkRDB$o9=Xj@xc>Lb i$;LIUf5PjFDj6>?G+3v-_OK(+N(N6?KbLh*2~7a3Fg*4E diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__btn_cab_done_default_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__btn_cab_done_default_holo_dark.9.png deleted file mode 100644 index 7ef2db75e273c3a4fa34a867d43714d47b67dfd9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109 zcmeAS@N?(olHy`uVBq!ia0vp^tUzqR!3HEvyN#v+DHBf@#}JFt$r%|L2@FmD6{OlE zCs-P=E^ay;FECBu-~a#X*$!!Fy;QT1l2!H>nDyu1;UEQuS2t(=%(&d{0o2dn>FVdQ I&MBb@0Ph$gIRF3v diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__btn_cab_done_default_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__btn_cab_done_default_holo_light.9.png deleted file mode 100644 index 2283b4c01f31c24c241101989a028a28e662ff2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^tUzqR!3HEvyN#v+DPvC;#}JFt$r%|L2@FmD6{OlE zCs-P=E^ay;FECA@!GWvmzw+t@{SPuqdTbmsKKbP0l+XkKVJ9JJ diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__btn_cab_done_focused_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__btn_cab_done_focused_holo_light.9.png deleted file mode 100644 index 3c909b51306d684dc9fc4deb674ab1e1feb7004e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 113 zcmeAS@N?(olHy`uVBq!ia0vp^tUzqR!3HEvyN#xSIG!$!Ar_~TGcqy~7@GboNVOeo z`FL&lz5>PtO@Rj=>T@VLG&w|ZbqQ*{RI`whRrVK{_2=K=E+vL!&S{*=@1z8QW-xfV L`njxgN@xNAaNr>U diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__btn_cab_done_pressed_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__btn_cab_done_pressed_holo_dark.9.png deleted file mode 100644 index 131d1030c9d5b447ef62fc8e336d9d3950ff7519..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^tUzqR!3HEvyN#v+DJxGG#}JFt$r%|L2@FmD6{Ok@ zwtT#{-1s4r1MA|Z!|?(x4J`lv|6k8`NJHzTnuV0CvcJHrKmQJQDKT8Re5&^Sxg#LM O7(8A5T-G@yGywoD=q9NE diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__btn_cab_done_pressed_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__btn_cab_done_pressed_holo_light.9.png deleted file mode 100644 index 3e7dcdfdbaf66d51a90633e6f601bfe71b0c5069..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 113 zcmeAS@N?(olHy`uVBq!ia0vp^tUzqR!3HEvyN#xSIG!$!Ar_~TGcqy~7@GboNVOeo z`FL%)@k1sD*2PVS;{{wASQ@v8h$x3#@+~m2a+{}M^7C)Is4GMKie-X3Pa7xz&0z3! L^>bP0l+XkKapWP} diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__cab_background_bottom_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__cab_background_bottom_holo_dark.9.png deleted file mode 100644 index 0bd09806f5c85ad3a33ec80c2a526e9dba34d1f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nETTu&Frkc@k8uN>rTFyLXm;P>R{ z?#-o|?nQl9Ua&YVWQl+9{Kh9CkJo#*NAA>4+xPwD`<&mEu1}vZI664|W68WNxRjX* q7uY2C$wZnF2qKv(-xu6mlE@I5@4DcHNa}B(#SEUVelF{r5}E+w(lnv~ diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__cab_background_bottom_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__cab_background_bottom_holo_light.9.png deleted file mode 100644 index 43ed26d4784aa508b93551bdb0359b959bd2c91b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nET3{Mxwkc@k8uUzCjV8Fq8;LR1* z*j37dP53cYgnN@8iE~W|ez(m3TTj;06C0 vR9@;$usQD^o~Q2-Eg&#Ke!|DE+S9qyz8u@<_Da1C=l}*!S3j3^P6YLYC-!V(AVEFG+v!>way|q9)89ZJ6T-G@yGywpFG&bP? diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__dialog_full_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__dialog_full_holo_dark.9.png deleted file mode 100644 index f4970ad1c3278235157ac72f71fc98f159fdc439..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2159 zcmV-#2$1)QP)7pj*K04R=GS>IExgb+dqA%qY@2qDDdSi?}MdX75WMJ|ri_~yampZf~b zyDwJPzURp0aERFLx!K0Z6`{S(+b^7Rq0fZm(kDLm@P!|`&m~8kF)y`OQ+*6SLgj(n*c6WFZ`T<6tC6A%w8 z+L+Kg_>sWYRhaz=AtQLA^@LuUvKr4zS(=h&ATdHMd1uOv+V9M9YYe+zz%fKlM3B!~ zyq*EP{ZyC9dltDoQc<8ZrM^eE_Hte#g^dKR2>{;+o?xX#_XJ<6fcSW3 z(2+n3e1qrFpfvl1x~?#Fy4|E$M6lRgKuT?d8dD>b&VB465lv_ms575+OWy%#u@k+N zI%?Q+K~hGrT_7#|a=gF%@ZrOc@87@w`1bAFU(2$bW3Gd+|4`xmgT=9~$+>Rd`_AEe z?tAPdzh~^4zVA1WkB@)c-QE59<;$19v5OvFA}vv41E1cCHa5&@4N;9-`R?7jpWeKA z^Yg>QL%m+FvDt*4cRX_bt0?zBkB(K>DX%%#=N+5R(_-8y- zVb>j!?$Wbc5y%%}IfCs9*+@_USOKV3tJQDczI|KW-rgqvI6{s^UDwxjUH<~$ckEhw z$wzfwA%@V6dv=Zxn=8;sa(#b)ziOIh-@k{Dz1VCvD9chBW?(0HZ$3-*gQG?|lNRhy zsce!AuP~V46@dEg?(QVrAwo2L-=l3?V9=qSyONQk&Kv_~&Lf1nMm8E$0BV|mEX9~d zNP}Lf5}1xu21h4T$+9&-HQuut%PRmY8i6duXoOerBY}OxLGlJ5BU$zc%^yh8OvsW{ z7(^}+!OmYLNsSuWi7|-^5)oDyq5>gHA{u-eOKk`#f#=$OmM4_(@m{kC%_W5DAmmhR z=d>`52C;YCwuB;r{%j}Ebe_P7K+b^`h8A8*tydWpwYtuV2y(IKDEl%UBLZ0(i3V1m zfUn~Tp;05RlF3Ax+6Y;a8pF(Tjoo`iqE#Ca+!sAl5kbmO&cKL3&H*nkK%{gluy`-t zg(lV{G7z#PI)C*NX293=me{C~cPz9KvLxQ9W=NZ^Ugspsp|?>vp+=TQM}wGdXLXG{ zVi`Ci0$G}v=(F^hV}w+)Oe2t`iJ2g)`#yKX$5zN3ft&-L4rl3d-=WWF22RL{IarUJ z10V#?jlh->hk8-+(B={{f_KC0$_Y6UbF}H| z)iXk95=}<}9Szz&zBnPrq{TEU=*R&0y55rN8c7*TmhI~1gq#|$ON79_OO5CMyD7gV z9}@irgLxzpwBV#1S)NvH5*4HjnIZdKqfiE}-PZx=`o6zC@DCwmFGlT6G>P~~(uABG zK}Q3f7d(yIx@nqEUDtg*;O`-1HeJ_!ZJOp2fHih{)cJyq3PN^{5b9^?iHmLcxw*Od zt7)3gecv~S{b_{c(f57RG|lImo14Ed?FxBAs6Zqt*x!B;W5{pK*JF7#9(y&G-;L+K zAIl#wtZ4Xp+<&dElXaOZRbPeOuW5VVgIpFOP7$z(T3Yv~vHW)|AI5VJTZ64^6BEBSg#y zGM}I)%~}j17KiFDEnOcuUt#E@>0HCEcF3*~0j6Ce`xZm1O5Ih`IeuTN+ty1RWW4eh`~TOU@&BM)3MkQgMM@bdYm8B8c#1 z#@ViWE78D40!D<(#Tx`hXJ-KSDrqoae31hLi8 z$z>DjeP}^jBk1AK*j$2rhW(rzJ{2JYJMmiAitr^tE-^SXloO=ZTOgN*_a2ZHvyBd7 z1l@JghOv{s(P7lwc?A9CfSo}^z#H{B))n$biD&`>gkS9e;$0Z5~J8tXRDNuF002ovPDHLkV1mNB_TK;i diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__dialog_full_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__dialog_full_holo_light.9.png deleted file mode 100644 index 172fc3b5e3caf3357e706be2a1f0d91f357c8e5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2302 zcmV2ok^m97efLZMJ76bgmHN3TVPgynL1iZF^o zv0AMLkI|bD5@Z+S7;_RWD$X2Q#-Gi>; z=tN2`078B~PH0>efZ`B@1i||(&~g>qMGRTwTrQXXbnj39hPAQB*)bIg_=HbA_WGzO zR;yL=j9HSDjSEl*;KYv!A@o|O_=;IUA}l9+ObGitX|Dzg#M7mV*iktr2nZlVbl%^^ zH53Ym36TIhGR!|u7{3PC~!L=Y2z z32ZT8B;zY)i(nCqF!62X25hwu6@!!-aVKznAwf{$S4ay%(<6lhDJ|l}=KVE%xD;tO zjxokGV%Vil6ww-?fi&aiwtz1TI;KLw!36;9iSC?$w}w5ZTIo^H5hBZ^Apum+pFjWp*|TRqUSD7TX^iIhX;RaeQQ zE(9uq^MWzvYwRam(2Co38gn;jAmP?U& z&MGvUhjxmcRMYbSg3kR zZt4g}LPgLEq&hYm(J$si0u;4;IwvxY6?fp6l#|X8fH;pmq-q5ISi1H|(Ge;Lg>w@fkyi)P5d7;2~0$MDQ@!DE$`cg61AQt41xJiqTo9Dlsio7bTA}sD9BZvH#!%wZ zmJ%ND@1^DnZ%X(Ld?$$A6k0J~NE59ixD&!XX{j@~=b>7mwKZvxCyp*B)cAo?C*Y0% z?1kZeY?X^e-9W)XxdpU^5OahW`IAUpYa}@W?W5#&t4q8l2swcYLBS!VH7P;dBP@_? zQAk2?GdMjs_n0oBI`TV#(4X2ifxe2hDg*@upKxQ&K(mtAk|`HJPz)_1HaAZ&&GHf7 zsz6IO?f{EsSe^=LZJ-DtRGZRNi3)(P24xANDG)6Gj(#dNGOP_9D0K*+?F8HR`Nj#&1(CYoj<+oYNw{1t4Y0L^ri-RBp`1VD6hPVuR0IkNiMUb`EeV02O|F6c zauGd$;Lv5&C{!~b&}Udb7lOKhLPE$D=wt2>b>Q`^nt&r(EH@_=La)06a5Fwnfw+Sp z&{C)%=8X_pC077s0o1}imRwSiS1dcYq8ac~BtElCsZ+`Ul=zAmLOFfPAwvBY@Kn$$ zk{zOiq+$R>LAX{rQ>;#)$VHAb@IJ99w*HlMq6mNtA~I*7`@~Y7+@e^8prDZQ`Pk}@ zSYXq1DD{)3Sw!SFBRAo~AvKngUU3Lg#cu0$<^+@bU0;P_H1st~XDv}F6a(QX9$Rbi YKbh+rFQXz7g8%>k07*qoM6N<$g2q=E^8f$< diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_ab_back_holo_dark.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_ab_back_holo_dark.png deleted file mode 100644 index 8ded62fb7b6a27a86f7b532c9a2b5a4ae999d34c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 741 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UOiAAEE)4(M`_JqL@;D1TB8!2v z2N=7Z%(epwmK8Xr18D^?ZvQoBE&~JOTTd6q5Rc^#N8xy%NgI}`eR{7o3SVw~oLF?DlhO#(rS&-V`^Q!s%)gPgzJD$(6 zlPX(2b^RHIj&o60rR$>g!|G>TRxtl*e|^4a{T&6ax|r;1#_KA};b_owfAXfrk8RFR$o&QDy{Vn>#x#sulW#~7Jq)- z)TH!~FS$Xsf0AE4joN$h`JQ|K8Rwjx@86b-rgDVb@NxHUL6S>yvXNP=t#&QB{TPb^Ah ka7@WhN>%X8O-xS>N=;0uEIgTN160J|>FVdQ&MBb@0GkggF#rGn diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_ab_back_holo_light.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_ab_back_holo_light.png deleted file mode 100644 index 517e9f72d0c8d28a22360ad5d73476c25fd4db33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 661 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UOiAAEE)4(M`_JqL@;D1TB8!2v z2N=7Z%(epwmK8Xr18D^?ZvQoBE&~JOTu&Fr5Rcj%_$5Ae=jmr`i z3DvOQxBn=~BCIDR#iS^(^w0Zu6&JUPm!vIx7~`u}yzledo5s8M7#uS86ZssvI8sdD z&xg3?2M7HpA7}46mr}+fqP5gidGgVwQ1_}WN$aob&9(OVStj}6Xj_!ShugM~J~IZM zU$@KD($sJ1b4JGMs?Xp43SH*aH+p$-+40a@k*+<>G~DD-|-{tS&vG^x*%GGq=j0Y+3zJN#Vil?OA~@ zukBM`R53;FYi;h*X6Nv`Uq9z3iuI~5j`7&H`BAcUqjcZh^7x-d8^2$_pe40Fq;EPa z%hqE7x*0h;3a++#0KFc4?e_Zv*^k$mEo1DpzWsL9`(v*67M^+IpR-MVa>nHwC6*2c zw&pTkoOQ_aoMO7bofkh1@}JI}ZKA~9;BBq7`S!))DS4@K0yY}FSDK>kZ?)HK*JGG& z7n!~MQ}4z!!HZux9M^8s)pB{g?A$cwGrvCg`RlIwI(LVEXW4OK`|IMz?e(5Emfz@% z$^^!kYKdz^NlIc#s#S7PDv)9@GB7mMH89sTFbpv?wlXxZGBO2ntqcr|?>AgV(U6;; zl9^VCTZ2=RMLtl2B*=!~{Irtt#G+IN$CUh}R0Yr6#Prml)Wnp^!jq{sKt&9mu6{1- HoD!MOjfK$EgnR$;T z=N`Kp(hSrM@CU%evd=bf=-4w^bQmnuhmUH-jd<6WZ; zHl4_>Rk2U@t}L_t|AiwlQ891B3C|YS1B^O3M@oxo5*z)LB91b?+QOQX_r0yH)YX2= zvK_aW4}ZVF|MIp0)1X?{@CS{e_APBtKk;H~nV$PVB{N8HV+L1tOj6 z``KDz%d4l`HAyHPxAByb%b6xG^S8m<-YfXS7v>b+zlZNGcwheZcvv-P0dQ7=MviH9v^t)=yc559VF`j43j z_pMt2oAX|`goy_Fm~UMa9d%t_^^2qU)cXl;U0e%IRZSM> z>7Ksk_VioOmKv*1mN|c~ELg&~mMikt+LpAdYoES)QG3#uo404uV`0ytJ&!XS^rKz< zU6j9{ob*(;{k73gyQmwdmG2d+82l2_J(5-Z=Epp_^THpe+eb5HIvzUo?fW(va5{7P zd0GD0trC|9zjsRjleub%YeY#(Vo9o1a#1RfVlXl=G}JY)&^0g*F*LI>FtRc>2C}UT z3_|{Y+l-q7HAsSN2+mI{DNig)WpGT%PfAtr%uP&B Z4N6T+sVqF1Y6Dcn;OXk;vd$@?2>?&0tquSH diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_cab_done_holo_light.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_cab_done_holo_light.png deleted file mode 100644 index bb19810bc2062509e4e4968099a359ad73818728..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 915 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;OpT z1B~5HX4`=T%L*LRfwTh{zxw0jNgl<&3j(^ zeD(x}!be9sh1LD$__>xwFX-mty1-MRJ?GVgBPRYo&#phmts!D?ltV3&FI%+a$=z1Z zV;YHl1iMSDgJ+|>#46F---v^ z=n46F|IdfFb=)S0I4Coo@!g}n4Nex)S*)#RZPN@k9D49tzo1o|L;8h-cSg(aGrNAg7qQ^lmAJNnY2BwD zmg$yB$_Kc(9`bFT@$ln4rdg7D8~IZ-f3I60`0mq%qw5167@Xn!BqR{_Lfuy~aYE2x zQ4_Q6{SU<2c z;lT8&TH+c}l9E`GYL#4+3Zxi}3=9o*4J>pG%tH*#tPG5-jE#Y8D+7a&|KB#FXvob^ z$xN$6(O_z2Y7RsY4Yp<(!9Wd?ARB`7(@M${i&7aJQ}UBi6+Ckj(^G>|6H_V+Po~-c P6)||a`njxgN@xNAiwS~- diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_clear_disabled.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_clear_disabled.png deleted file mode 100644 index e35c5f05efdaecd358f87fbaae543f8e5d5d0331..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2531 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 WVgEmns=9(>1^{ytE8}V-6#hTCp0D=+ diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_clear_search_api_disabled_holo_light.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_clear_search_api_disabled_holo_light.png deleted file mode 100644 index 7fd7aeb2a63980f5c7459b96ae175b875f27add3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1315 zcmeAS@N?(olHy`uVBq!ia0vp^+91rq0wlddc6tLTrX+877l!}s{b%+Ad7K3vk;OpT z1B~5HX4`=T%L*LRfizez1K-K5QyCaov^`xMLp+YZo#ve{ohs5cKmXZmZ>G$w-JO@O z_$Dncy|l#DX=;KaYmSzf&V&g+I5)gx(wb5qs1h)7!mfsR25uDCBNMaEYi!b%Lx%#0Z>6%}_Ke;bM=$-hufo^&&725YD$vGBuUKV?<1 zW5r*8XXtLO5$#WZeo|;mb85TEyq_Keb3$U;>HYFK{YX}hy1N)ld|`iZ8c+f zaW}0jS<%V*aZgCBwd%4 z`mTTDHix9d^392b?Js?F`)aOklAwYhQ$?F@yb$ytH>J_Jb{Z~vrG;$w0s zy7gpFZTnjBVEMK z?u*UK{&)=cU7rs=ddas!yNA5%MN;fAeO3GpiZ3y(^OR`LtKE&RYG` z%T6M0Q((r64h>88-;=&fKXORn&)Y9<7j0ADM4op#Evb9DEVE3OxuAOMwTp8T79Bpj z^46Bw7ia(6t$e=h^6Gq+^)tU-Y>!_fu&_#YcJ0QCjvJ3m`|4emd(8LrvxuLIduy^w zKRn;Ob&-9_RrP6hYo5j|+EK9n+eN__H(s3nbj~C7+}RUuX{m{weGosZ*S#`Yezasg(E; z?-{fhY+_DS&eu;5`_fikR9#fupz-tEU2!F+6F=1F&8oh6DP7e>i}j<0lm5=$VtqvCS7PaJ&waLQ0xVeA<2r9FV_>h2sIGsVSbJsf1ID=TJ5=|I z&X8~@c`+{`NhyHi(Rj}}j=t-itc?USbMMp?m=EB?(?e-29Zxv`X9>CKeyCDB6UQN6rr@v)_sLiS3~Qp ztEzq2)O|!<>xiRNElR1gi&m6P`)xn$hne5Zy#N2rd-GvpEU{+CMPx+)0Kjn+5^l}o zg&!d#$jfNkdNdFGu4pqj;P63GZxgQ*_CY#Oc|`sUQ?}=CKZgE3#v~qpdI6&Bx^w_Q zunGk?wncWWW;l7-UI#@tQM0)~HL81;)HPu;pVQ0pgJQPrfpMpp=aU0}M<~a{2nw%n zU`-fLR8Od%K$J#9U{=UTI40i8@}fD@+Oa6N|E1RI6sbQ)pL!RfOePt0E*?-w>vc`F zFLoR~H8O{D0Fhbf&d=`-+1DWWi~EgA3{w%CBurf@x&z#)AS%CTjBJ;NXfEz(-q*!r&D zRZs9Vt%N#~h`fZ2dF&WAUxzdNEE zLcQ7z)<&U)d{TxG*7ZfZU%dui_e8AOG#Zu1*(e!@&OEmtgjVAmsh>Px!}hna+U*4u z-(P@*kBOd~_&ckM8!+$m47a*D-IZ(wJ}aDF{e;O>YW!u636JA2%GNI#9Kc(nk+Ttf zZ5oR_VO!WXDMZ#m`6;XjkCv`_D6eahzuUOoqFaafSiYTac<;TmC>LuaHD30rCoEXh zD5R1Oih#JsO2+Mq%9NFu7{5RCprvtcFS~~}?Jc*n#%9=R+B~=%4@*03!EPJP0MrnJ8N%7FfRW&1jKLlO`E6 z2Nzeo&ri0;XG#nsf-QzGDH@1K!SO+oQz;nwgfHIg%HhTbyKTOO$NB{~co(lFCB3>E zA&~-M`}RVuy48f;Y-C?8l|c;|{QHGA&~=s7pAt2h>u zaS=yuntEie>)yAC_-npL!3zTFzOgLKZ}$=3sW+~_Ul7!!J>-L1jXDCh?L;zNtpzrIp_ZRL}JEMXYA5@jiafE19#aIkmj zpOVnI=5TB*VZwzSHn(G2*x&nZOKW`I9?Av!cNOvbi#$Fwg7v#&)Ar=Xmc9st_ZL_3 z{@58B!k$KOp%D%6encJsnot-_4XUH2sc#F@HGpawXltoKc?EQiVmJC91DQf_cccHm zAysqDoo4|5*kD6(qXoG55dp>oiYrkGMRp+(t%)uKx-Xk($P)oj2rRtP1Q-4<4m6z) diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_go.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_go.png deleted file mode 100644 index 1e2dcfa02057f16f9f89e31fada93991c4eb9ab6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1983 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 diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png deleted file mode 100644 index a92fb1d4af622cfad770d7c494121719a7896e61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=d7dtgAr-gYUQ-leFyLX@@b&p` z%gbN)&SLHDYV<0q^J4_6fq?|&@*V6j4#NRakTDF}Z~@#RP$drMna{J{ZM0wU(H|t@ M>FVdQ&MBb@0L8N*<^TWy diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_menu_moreoverflow_normal_holo_light.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_menu_moreoverflow_normal_holo_light.png deleted file mode 100644 index 930ca8d95e8bee5a1240fba645d9dab919abd734..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=^`0({Ar-gYUf;;epuoZ6aJO@& z%&D0-IKvGL&8p&qV;O7KuliPO1yl(K>(rHwor_8Hg9|Y9Gj8!^hz0Vk4~QZ}ABcvv nF)(akj$uTI?LshtEWgbR4Rf6*RPme*0Ev6L`njxgN@xNAEX^ml diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_menu_share_holo_dark.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_menu_share_holo_dark.png deleted file mode 100644 index 45a0f1da0d01b7c0ba53830285c67d629bd0774a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 699 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU~2MoaSW-r^>)^McjrWjeSoS8SCOEBs|%|?VJ7D=T9Yz_dLJ8 zJ9zK=&-=vhubx}{vF6<8-!m`2Et8%6G=f2_fi-~)r;kY>>MAgRkm@i7CT&PKJ^T(I*&Av>d6O5U0r~;hkX|;LrY6t%e!5sze0;lgN zzhmA1v9d1mdTWRDgJXqP4j5dhQr@DSSRpJN-*(9Bjp4$N@%tt%vt{r<#9TCmVT&q5 zPY_dpf5x8W&TrHi1EzgwuzL61gP~v}`*h7_ev9YX^%66WzmeOz)Rwd1sPzfWyZX+; ziqW^(w(Z~haJj|{8OsISSA~|G@%CQ8Y_d#7=yl$KAFm&t%#H|W$kcQ2;yBguIO76W zkG?He)AQ@KipLqRU6Nb%FPk$;xS@jW=|$x{C80dl?QT)`*~FQi^@N=fie6YGbN2D| z=`W4NG-chmgqp9bsxquQQuyVroI59@gwb7QnV5NMi~&p85J-Uv+l!N+#T%5W;<7yr4}f9Ow$JGA?da_{7}kE@t}@ET5LG{B2CIDTQC8`Twj U_qmZcFi|piy85}Sb4q9e0Mf@O?f?J) diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_menu_share_holo_light.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_menu_share_holo_light.png deleted file mode 100644 index 528e554abe239137182dd9069d1fa4ba02a109a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 935 zcmV;Y16cftP)=+L@6RIMT%_@p^A^X5UDRjLANf13Pq%);A`Pd+=!;23pXx; zAif`nPef)@LW&ftmV!!=U?`shr5Kn0)zPywg_Q~)Xf6@UsrA5Be7{a=6EByPs``206cpncnr4<@!q@mA~gUzaA3%HTX+%kDFHYT5Qf!vm`Me|1djAs_x*GR z&!z%kGhWI$<|3X<1;9qUl5@-=4yFR&S{y_@$C%@oE<1op+>aXzjC~!)$_ii$_F+%K z@y9V;#ya3q+!Mu4ce-D|$M^yJarJ;X=I|E&DieT9a7UE58@rw_;mfG%mg3n4+>X7G zDINV8W$>{wd4UPs8tHyn<_K%Vx4t-F{HB0#CbHyT8aIH=*w&T4zhI%?@Yvw4$UHw9 zfiH|AwZ;Wt3m(R<9MXfe~y?7+&yyx)=z7N}~%m5B!YmPaWaH#7@Q+5E; zIqP##(=Vn1;7AlEd2}e2K@tF-TcIq?su`V~Rw@AYX?JP!=ya5wR`qE`V>4fQR+^F$GWKC7sT4IxUFgD9>&BxJs0#D$E0dq8B&$(De03B_O{zBGgT!>|}k{a55 z!O~xj?u?9>EHL(EoJ!?lWDg$AX}pf&%~Sx?@v3~6qvvqAx*Saezy`dwo-+WR!8JMF zpTip|0k{c|kLwhu)oQ!f;y+34?@=W6(zkfKXdO_i)poDN4CtH&58$o=8{em4rdmY+ zbb?>20J>f0o#8w;#fEn(4AdV*y+C*HYaPJI-C#EObp@bT@IwJeLH&YX7XStYpFDt- zf=?R2Fu^AaVA$Z31du2AoO(cqH+@Lz(5e*i5O+3-*HCUO7(002ov JPDHLkV1h8vxv&5L diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_search.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_search.png deleted file mode 100644 index 998f91be9c4dff50a3ac354a3810a2afe39fe32b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3784 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 Z$DPpsU&xgE;c;3340Mc9_1aGO{{Rgi%2xmY diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_search_api_holo_light.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_search_api_holo_light.png deleted file mode 100644 index a4cdf1c7927896d70e6b9f6af2eaa64b1bb41707..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3037 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 S!l#~*4goMWSah`&G3sAAl9aOm diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__list_activated_holo.9.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__list_activated_holo.9.png deleted file mode 100644 index eda10e6123e1e1383c4617228ec0c96680d60dc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xamSQK*5Dp-y;YjHK@;M7UB8wRq zxI00Z(fs7;wLn1!PZ!4!jfu$#Gb-B{xqtMx1s*(O%+nLV7IxRdaaX6Iu&3070|zpW ye6d-ZyJWwc+pgOl@x443T>9p%`1p8cx&%YrImy|zOvgZGF?hQAxvX30u5yFboFyt=akR{ E00Z(eO#lD@ diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__list_longpressed_holo.9.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__list_longpressed_holo.9.png deleted file mode 100644 index eda10e6123e1e1383c4617228ec0c96680d60dc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xamSQK*5Dp-y;YjHK@;M7UB8wRq zxI00Z(fs7;wLn1!PZ!4!jfu$#Gb-B{xqtMx1s*(O%+nLV7IxRdaaX6Iu&3070|zpW ye6d-ZyJWwc+pgOl@x443T>9p%`1p8cx&%YrImy|zOvgZGF?hQAxvX diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__list_pressed_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__list_pressed_holo_light.9.png deleted file mode 100644 index e4b33935a3aa4f1af3fa9e9e199b5c47d43f4b74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xamSQK*5Dp-y;YjHK@;M7UB8wRq zxI00Z(fs7;wLn2vPZ!4!jfu$y_kK-b diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__list_selector_disabled_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__list_selector_disabled_holo_dark.9.png deleted file mode 100644 index 88726b69160589c8545759440e8d4e69dc984c67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^azGr$!3HF6SgS1tQk(@Ik;M!Q+?^oIXnykaTA*No zr;B4qM&sKXhJ1$tcw7#es=J@sd2yMiyW@jyg@u(=2qh%>1r1WJE1Ls*cJ{|veUO|(2?8OR-p?Vt(<)KXNk*dJ1<_`!jRpab6RMK;Rk47fDU#NEX#7yk4(~&Fr}L7DZp)K} zK)DDZgb+dqA%qY@2q7)3S*px^wsY!a9l?~jW2$HoDfOAoDc4?$q=mJH$Q@HesW|pH zEqI5t5pt#=^`ykNb$bDA+g_!6r>E#0Ebxb)V~E)@66{HSu%o+0#^7QK=<56_<*0g z4?VWXMFRkJB8s~XX6q}?LEeWW=Ef--P!X+fp` zQ#hbt=1@CWv@?Vrj0n$wG-wfB>s2&!$QdDJ0ulZgw-cuRiR{Y>^Hj3K6cvDZyr8vA z8lxp5*y$r9!v6G_XAF7`2PhmT)XW;J_(x39;8bKfgMu`e! zU+jWXwIOOF0-q>8C*JQsY~7_bBCuA z|Ap1-2&vJi9g(t&*dI@qVtrbEm_q)8uxlUymW^N&DQrSTF2REQdw9B(B*Fk-L?96w zfdFVX0=tCgq*<4>5rKwy4p!?>V+1b~mqyqhPm^M8N}pNlWK7Aa(;L|rtB1{dT%;u; z=)dm(?jeLfE6zhUB!2hW01y9MdY)1v=ujhBx3b+Xm&>Pd9KV)clx)K|j$bdA%O^}( zPFj=H`w_B~E-2}`eIdjBd_I2}hT(GvVW{|jkQIawhG7^!pU>wnc#H_%SRreOrJP6k z#f!~#`~_1^!^gPqw^)9R`+vop3DslHn(o!PiI0dTt@|45Za=)m1`%IwEW{fV$LVaF zE9RVsAMaWMjZlg;f(R_4iy{7r`=s=`3SdP<&^M)TPHqgUw5?z25;3$902*NlyMU*S zpa+j$RH$BIEX`7~H`b|A%pl=Pj|o!QHv-L&MvImjnCmfv9y@5Gq|A_|G$L4MNvqdg zg%(@J38}FG4N!(%uhEggMhM*%9HY#I^l zO-Wr$p$z~$ref=30GgqO)XJdORd}!BEq>NeB8p9{v^kJo2|NxCQwf^HCpGf6X;Wp4 zg!hgmb$FtdtQ>ASMriqL^@|$FBEhNWjw@zMktp~+Gzo9nO1w>OhBUKE#}ER(1L)vD UI+1b(O8@`>07*qoM6N<$f~tseq5uE@ diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__menu_dropdown_panel_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__menu_dropdown_panel_holo_light.9.png deleted file mode 100644 index 93066c8403ddaac9b19571152ef499620bcc0e02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1551 zcmV+q2JrcbP)ZMyJc+a5x+ehm5NR9U3;9%`Hyz-(tJnPJWK72_ZxFO$7HJ!wl=MA(TM` z5z;&LLlB#EA&f^$3`&>pe6X)LdJ&`vfROKm-xd+jMbSqLMZ|438|}{L$EEgM9M^%w zHa{i`W4qmEM~t#0eOdu-0W1NOh@<%YUknyuBI#0I?3#!O*zRI&T@|+kOaOda%IhNv zM;99T5trXGZJ+ZJPec%b)$c$hhFbzf1btKUoQ@WxJHBtqt%Djjh@==IkkXLZmr_R= zETUs(|D2YHL30h7B}jQ1@s(0WN*y++$>%9Px0_7;Q^61da}ymGVa5oGC6I`(Se|An zXj@SBzbdSFK)Um(Fw#d8Mr2~>phE(63xW_TA*G~C`G7107k~`S4FDISDe;mJcscGO zI_^QW2+SjBmZ1U=9v>gytZ(L+77q^(-%!w_2qCD0PZix`L1IaO$h(b>d0@F@G3Eaa zi55W^GL}q#AgNiNjxa=>FZdR(r+ zxE>NCSff^sd0^fBMHn)m#E-cU=7+{dF-K!9f{S1|kOWYSoDj6e26s~&lfViRc^MJj z^>Y9iF9eSfmVwbcxJ7UPa3MH8F;)otZ%)TN7|p{_AvpQV#UO5SLMWM?>!O$+C0vaD z8(N!X1GsBg3ar^sKmkXku0dO*!9}nfXnYiL)Hg=pYKs73(^zvc9aG}t;{#B5>C;Y2 z2$?l`wfXukgc)%>9s%7AsDyH^rRNDOAHyeHMgYzG`@1jfJOi4h!RzZQK)65|cOA0& z28%R3H(uBEzOL&YU%_z=>~=fscDp^gsmfTk*1@j+TejVzGC zpG{n`bp4r^(iKT*Io^&x%OHc_WZd_EkhCG`k)*sFZ|A&V23>!#)HToxrIRJ-1q1Q~ z3qHxB_z~+bgihSWK3otqlC9O%9BoMC(eAot5j0oOB3|pwbjUE4*ONZd@_Kxq z*B8(0XhE_FfV`ZZwcn~gXn8&5;sQ&h03_lPHzc@QD2L`A0DB!p$qE$r97Hn6cmgfM z$;^GEI@&qEx+o;VEJ0ZAK#dKOL6F|xU|IwgE6|`&x_D{{k^myy5)6fQcS{yR>LIlD zb0eL(UISu`k;Dp-=L_3_9uII4xG36?ZZ5uUxd1Up2yq&z=dNHjN&oIh<{D_CLJUbUG4w?002ovPDHLkV1n`$ Bwt@fv diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__progress_bg_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__progress_bg_holo_dark.9.png deleted file mode 100644 index 345f5d3067c1b5a2b13f7234238468e8083e75e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^Ahr?*8<0#p>+uXou@pObhHwBu4M$1`kk47*5n0T@ zz}*SLjOHg#uLTMQc)B=-SoFS~;>gutz{8S$H2ll||1$b2>+ab^8r zChoU9-sVBr1cr+EHAcpdxgPN?*fw!WN@w!F_di=AUe22-xp-2_jNr43yl#?i1$i|o QK(iS+uXou@pObhHwBu4M$1`kk47*5n0T@ zz}*SLjOHg#uLTPFdAc};SoFS~;>gutz{8S$^!?BO&wHlFT~V_1=)TZ8!I{mdT_A)Z zztl5%UbEjFE&+!7%~#Kq{9)d)y{;#I@4EEH*bSem)2!T7Pp)1*OL*gdvC7^*b6)~Y OX7F_Nb6Mw<&;$Uil{z^9 diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__progress_primary_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__progress_primary_holo_dark.9.png deleted file mode 100644 index c6c3f1ec248835c16ee8a8f9d253769ea4196468..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1309 zcmV+&1>*XNP)>2T29Hys?P&Vm zZA9*OOSNlf`Pu!y*8AUEO|D+e=9Pi3BR)agfw#}SukU>S5_JQH{fFX7qt#y26-7>F z^lg#%AL~){ay($Vl%dNK|ns=8F95J5u4IuT)_iO}FO5AO!x2YA-ev{((MiCMb95Z27y1N{d~<$0ZOiAzT-4$^Y~d8=D&GctVLiOE-HZCX=>916 zaB}eD93BUF6!cN|FY@&i`W7!}IIL?H*U-;b(9ZeC>T4fo-D~%;%Al$SM;o1{CK^c@ zLsL?U%;F5uW`mKV6p@jG8Wm~81rvcAg~E0r38^#=q@={j6{7*N{-mRal zZyi757l1u@+(UUVUpKQfbx4*^AEZ`NBGTk&djR!;W=;+8vR!2ZvkZUiF_Uw;@^@UHY_tFNo|bZ|HqK}~Z_0kB z>1@!nFOf~^{KOi&lvG5Os4i`3m5LaZ>S{(}C2cS_3u25qx+GSC0x^F*mC<6C%zjX} z`(@Gi@=yT|C0D;bu>bAn+W30Hh5ZfH4VVpRc=$wP71`a_ciV~TTQkNXRQHQat7toU zZx*3Z?Q~QYQO|ZUR_Tl#qXtzIiPWWo(#}&aV(i6KuEST$lYVRUVscgaEz?@VCh+@z zYdAdahv=OS&fP(?9$16?`l0%F3gfnP`B71?hw4@2e4pjZouU=>X|R*`N-YD-DJj}uU$#5 zV>X}RzD~bXHhFf?KK=4JTCWrMiS*`U`G2n9l*Y@cp7B$uQwuKJNIF$*XNP)>2T29Hys?P&Vm zZA9*OOSNlf`Pu!y*8AUEO|D+e=9Pi3BR)agfw#}SukU>S5_JQH{fFX7qt#y26-7>F z^lg#%AL~){ay($Vl%dNK|ns=8F95J5u4IuT)_iO}FO5AO!x2YA-ev{((MiCMb95Z27y1N{d~<$0ZOiAzT-4$^Y~d8=D&GctVLiOE-HZCX=>916 zaB}eD93BUF6!cN|FY@&i`W7!}IIL?H*U-;b(9ZeC>T4fo-D~%;%Al$SM;o1{CK^c@ zLsL?U%;F5uW`mKV6p@jG8Wm~81rvcAg~E0r38^#=q@={j6{7*N{-mRal zZyi757l1u@+(UUVUpKQfbx4*^AEZ`NBGTk&djR!;W=;+8vR!2ZvkZUiF_Uw;@^@UHY_tFNo|bZ|HqK}~Z_0kB z>1@!nFOf~^{KOi&lvG5Os4i`3m5LaZ>S{(}C2cS_3u25qx+GSC0x^F*mC<6C%zjX} z`(@Gi@=yT|C0D;bu>bAn+W30Hh5ZfH4VVpRc=$wP71`a_ciV~TTQkNXRQHQat7toU zZx*3Z?Q~QYQO|ZUR_Tl#qXtzIiPWWo(#}&aV(i6KuEST$lYVRUVscgaEz?@VCh+@z zYdAdahv=OS&fP(?9$16?`l0%F3gfnP`B71?hw4@2e4pjZouU=>X|R*`N-YD-DJj}uU$#5 zV>X}RzD~bXHhFf?KK=4JTCWrMiS*`U`G2n9l*Y@cp7B$uQwuKJNIF$+uXou@pObhHwBu4M$1`kk47*5n0T@ zz}*SLjOHg#uLTN5dAc};So9|U`2XLYnVI=;y-5$#f-D2o4GsT&Tr`prfMCHsr=)`p zy9zZlQWAk&gL|Kjh|gcN+0MxMkn!S`=@A+#%ic(Om>d23|9^ht#EF9It^fc3f1ZP3 Y!dJ=4-o~HPfwnMsy85}Sb4q9e06h#o+yDRo diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__progress_secondary_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__progress_secondary_holo_light.9.png deleted file mode 100644 index 205b66e2cdef686c5ed6369b14e64b38d0182984..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^Ahr?*8<0#p>+uXou@pObhHwBu4M$1`kk47*5n0T@ zz}*SLjOHg#uLTN5dAc};So9|U`2XLYnVI=;y-5$#f-D2o4GsT&Tr`prfMCHsr=)`p zy9zZlQWAk&gL|Kjh|gcN+0MxMkn!S`=@A+#%ic(Om>d23|9^ht#EF9It^fc3f1ZP3 Y!dJ=4-o~HPfwnMsy85}Sb4q9e06h#o+yDRo diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_48_inner_holo.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_48_inner_holo.png deleted file mode 100644 index 19517c4b0aee1010c7041a76089fdfdbfa495e80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2769 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 diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_default_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_default_holo_dark.9.png deleted file mode 100644 index d8929fcd1864e92c78f24d34bb07ac0304bf5ebe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 395 zcmV;60d)R}P)%)khMb;v@5Yo)-?A$vWI3J{&4Tqm)VM&;#i3-!rXQ;}}A|kSK_xLoQ9!D=| zrQuRX_jo!D&!*woG(4MzXVdU(8lG)+!_Dl;%pOYTRyEwrUVwMtwRCnh!_9059DxJy zTsprAUsT~zdJlX8e>K+(FMd_}2<&RF8#?@^bn(8vHtbfpl-_eLJ!>=!D!!z&OE12( zv`a1CqqIva-mA1rDc-ZR3oqWgvUXO(tc zif5K~i;HKMc8iLSDD9eyk1Fk&iksP%L8V=5@ekmQ^NVfO%k2z5z^Qbob@&(X-FR)u p3HS~A?&0(Ut%!)oJooy?_kZokYAURbJh}h?002ovPDHLkV1n7-uz&yn diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_default_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_default_holo_light.9.png deleted file mode 100644 index 9174c4e4bc984a89e1ed643bc66b1569466ef52b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 394 zcmV;50d@X~P)pS_@$ zhD#gW|+S$zvH?tjZ06u}I z+WCj@MGelS_rM46*K*DD;uob4z^?VWsl%^ISMTdf({7b>={={?i$=qw;%iE~^x|tv zyVT+%O1re;qe{D!;v-AD@ZzIOyU^khrCnI@sM0Q^cw}ieym)kJH?(+0X*aBRR%th+ zcxGw0x_EYJx2pJz(yqJstkSNlxS72&skG}Y{tg(Y7u%+n+Xa4rW9?Ay@Gs!I^V*st o@Ei2q)9D9V5fPDPZuO7v|4Ms3SH1lZVgLXD07*qoM6N<$f(F>P&Hw-a diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_disabled_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_disabled_holo_dark.9.png deleted file mode 100644 index 3015d307088f12d52a9e99ff4575fd2153127e5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 381 zcmV-@0fPRCP)hG*08Y#N?T!?S64w!;lKvy+*1?>p3RGdlx#190x$dzj&7b^-9QUftoB@I?dG z(l;!l|3;oEFaA*ajtwD8hd-6>9*;+5M`bO2!%}+FXrQS0p3;u)|QJUO}XO$+G;+dssck%4fw5xbU zX__uxRhp)XSC*#P;_m>iSbo@k`^^CW{9xcU{p|2h0AG{O_A~&$L7!btFK9(XM7DX= bKfeD1Etg?&Fp}qT00000NkvXXu0mjfW#pxI diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_disabled_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_disabled_holo_light.9.png deleted file mode 100644 index 126637d1194f1d6609787774fb140818eaa4ba1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 381 zcmV-@0fPRCP)hG*08Y#N?T!?S64w!;lKvy+*1?>p3RGdlx#190x$dzj&7b^-9QUftoB@I?dG z(l;!l|3;oEFaA*ajtwD8hd-6>9*;+5M`bO2!%}+FXrQS0p3;u)|QJUO}XO$+G;+dssck%4fw5xbU zX__uxRhp)XSC*#P;_m>iSbo@k`^^CW{9xcU{p|2h0AG{O_A~&$L7!btFK9(XM7DX= bKfeD1iaRu(IeFS@00000NkvXXu0mjfR7Ip< diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_focused_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_focused_holo_dark.9.png deleted file mode 100644 index d45c7a864d9b36fc5d06ef7650bd22c228e3533e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 680 zcmV;Z0$2TsP)JMg@Fn128fNR{httc z2n-9ae~A~-WYQOAyjJ3`v+tFS>H?h>cjZI44!YCDJ4vU-UH-NFC!H?dNqTY9^x~%J z#ZA+To2C~xO)qX5=ft;__PrJUYC9#q>!rbyQFMFHPb=3hoe|&n)9~p|baWUbMthlMtLL6k^E5&wx9H zfkWKo4DxGy27JSv%4KLW#~I|sPnXY+fCHfNj(}ks%-+uyBgtHbMG(R)| O00009q_DOpcx|jv*P1Z)f>u3p>g<+)ulGcHZsoOUd0`v$ideb3Xs*rv6J! zg}R0?Ejbavstni13%M+(h~#=Y?=G{+sY|c-R?LyC;M~J_EGz53I-4BR z+cU4@A4T%4{LQ{7{nooe_R?;9Ufq56+wp;!Z_W|LdHU^V zuiix!E)rt*mg%eid+||lw)K3kxzR2XQeoHKTo0e>Tz_Z7KF;I+KDl^G6{a%9AKj}v z@Aq1v55LRoZXbD)<16^lF!*Li$^7}+)mu{zFEMCaSs}k;w&aatvA+!FKCV6>P_Fen z(L?roLe!sxPkWei7+T9&rtD<0W7^%ZdcE}hdZyQpKhHVIBAEwFVGN$GelF{r5}E)^ Cjyh@p diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_pressed_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_pressed_holo_dark.9.png deleted file mode 100644 index 2cb34d7f60401a563454c03e266cc5181d9de996..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 609 zcmV-n0-pVeP)%5ec8;(Nh#y0Zthco9&fD+Scz(J_kqCSd>@N)Jrb#iJx@ z@geV)|0U|;Q8J4AW)%0$DDIn4+&81RZ$@$73{E^#CTa6Odr;zqGLyGk)zfLB)26Y5 z5#LU9dOW?JALQjc$4r{WH?GVFg))<)qMW_Ts@W~*Hgkd(m(u%LwVNxGwVfAK{BG$~ zHD4Zg33jP$CptYU%GrKa?RJ%hK*cvHEqE`!X=%Z0aT}!tZ^dnu7Q7Uk{&1!u)wl@^>7cUfAnUfgwQ!D?|Ir3GuneU%oh6!%$L*todw(!xf?LzEVJ7Y|ih z=v92GOd6`R(5v{nqI~u|T|T)5eQi`_Q>fI*QllCl)AthpQf>YCTIE0c%xyxW%x|6C zG>z*e{-?!>T@(EFL|;a6&!||%qb(l4cp2298zt1@mjOk(atXEgIq-{NzY%9xIi5qk vb6%{!-vcjz*7vDBaRYn@J|M2KzWDwRiVUw(_ikNA00000NkvXXu0mjfOP&sp diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_pressed_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_pressed_holo_light.9.png deleted file mode 100644 index 82f752fdc28390f1dae188e66886f9fee783b4f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 602 zcmV-g0;TXoV&|>P?2N3a|H=XkIpb%g2C{mUcD8z%K5!WW71`A3B@}P?c zNzmeTUM-&`=;A@rh-=e`Ytx8p(}-)+h-=e`Yg0e*Nfwct-zMuNo?gfN+FNCOm6(Rs zNBrh8;rK_F^Mfu~8k>e2?@WdCI_7lHVR+IZj_>A~;=j0*zBpPVOJB@8&9C^w(v!^i zcs#`4qjGbZa60I4akN%e8hjOBptPW0e8JL!ZgC5x1-;^yN((y0EtVGC7q?tma9i9# zX~A7_N2LWf#T}Lw>=$=jTCiJOp|oJHxKe4sPI1N3!s5l1OACt?_fT4>Uffe@p<40r zRpP6(P_6jSy?2bx-x9}n#O>6o(Q^BiC^BxWR1^RB?JvEr|0>Nj5k)!eSD9&8HSzXK z2sbij-vth4?P;pL%~0mos(Tg<|DAn;kcS obzts&Y9%t@53qx{hWg?AJqc6disFjI`v3p{07*qoM6N<$f`4nJ zaCd?*qxs3xYk`8Mo-U3d5>t~6?){q5*x2~c-pCBZ5@_=ERFyG diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__tab_selected_holo.9.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__tab_selected_holo.9.png deleted file mode 100644 index e4229f26b2771d884934b80d0056b8dd66d10edd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^Y(Ol;0U|59*B=E^EX7WqAsj$Z!;#Vf4nJ zaCd?*qxs3xYk`8+o-U3d5>t~6?){q5*x2~c-l(n1@K5>ymj5$1a2Oc?!34d7Ck`Aq skg(^gW|wXH-lZoEvTk@AJm}J3sQWAGentL}KF}BjPgg&ebxsLQ0KFYBT>t<8 diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__tab_selected_pressed_holo.9.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__tab_selected_pressed_holo.9.png deleted file mode 100644 index e862cb12154541c150fb2d9bb98872bcff506317..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^Y(Ol;0U|59*B=E^EX7WqAsj$Z!;#Vf4nJ zaCd?*qxs3xYk`8Mo-U3d5>t~6?){q5*x2~c-pCBZ5m8aUV+M1MLNsm8aUV+8udAXlQhooEaFu)>JVsC;_i|1;&qn1z`CMwWxmD@8>XG@5j{z4 Z4Ch(42+t_Fa};PGgQu&X%Q~loCICWDCD8x? diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__textfield_search_right_default_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__textfield_search_right_default_holo_dark.9.png deleted file mode 100644 index 98f4871bb52aa7c60414b62dc102a63025d14b86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^qCm{e!3HEJoIX|yq+C2*978nDC;#~W-=0~Khvol7 z1H)I2CW)>m8aUVm(v1b%el;0fY!m7fYzsPhAkg_?o6!P}0Ord_0t$qVOiDg+P{Wat YL8LkPQkkjERiJqcp00i_>zopr0H|OnC;$Ke diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__textfield_search_right_default_holo_light.9.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__textfield_search_right_default_holo_light.9.png deleted file mode 100644 index 733373ed38d92906a3f639124b60d39cfe3ea469..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^qCm{e!3HEJoIX|yq})7R978nDC;#~W-=0~Khvol7 z1H)I2CW)>m8aUVm(v20J8xM$gbsA4Oq2MIp#mnr@>uNTIF}6W!#;>-fvxg@opE#)D b$jGop@Lc3+&hjll6B#^R{an^LB{Ts5lN~2O diff --git a/libs/ActionBarSherlock/res/drawable-xhdpi/abs__textfield_search_right_selected_holo_dark.9.png b/libs/ActionBarSherlock/res/drawable-xhdpi/abs__textfield_search_right_selected_holo_dark.9.png deleted file mode 100644 index 0c6bb036dbff7c452df0032fac9daaaf3ed36cff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^qCm{e!3HEJoIX|yq})AS978nDC;#~W-=0~Khvol7 z1H)I2CW)>m8aUVm(v9t$CDZ2p!k(eA~|x?WSsfj bIFlKwHfSC=yJ^W9ppguou6{1-oD!Mm8aUVm(v9t$CDZ2p!k(eA~|x?WSsfj bIFlKwHfSC=yJ^W9ppguou6{1-oD!Mm8aUV)4xTaopEyItdE!^$Tn)$h3#7aBEDrH5l{lPKbU~WStl#0CqS)dY aj0`i|)DAxoJGT#LAcLo?pUXO@geCyp{V3}I diff --git a/libs/ActionBarSherlock/res/drawable/abs__activated_background_holo_dark.xml b/libs/ActionBarSherlock/res/drawable/abs__activated_background_holo_dark.xml deleted file mode 100644 index 85c2c02..0000000 --- a/libs/ActionBarSherlock/res/drawable/abs__activated_background_holo_dark.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/libs/ActionBarSherlock/res/drawable/abs__activated_background_holo_light.xml b/libs/ActionBarSherlock/res/drawable/abs__activated_background_holo_light.xml deleted file mode 100644 index 85c2c02..0000000 --- a/libs/ActionBarSherlock/res/drawable/abs__activated_background_holo_light.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/libs/ActionBarSherlock/res/drawable/abs__btn_cab_done_holo_dark.xml b/libs/ActionBarSherlock/res/drawable/abs__btn_cab_done_holo_dark.xml deleted file mode 100644 index cab8962..0000000 --- a/libs/ActionBarSherlock/res/drawable/abs__btn_cab_done_holo_dark.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - diff --git a/libs/ActionBarSherlock/res/drawable/abs__btn_cab_done_holo_light.xml b/libs/ActionBarSherlock/res/drawable/abs__btn_cab_done_holo_light.xml deleted file mode 100644 index 42ba8a0..0000000 --- a/libs/ActionBarSherlock/res/drawable/abs__btn_cab_done_holo_light.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - diff --git a/libs/ActionBarSherlock/res/drawable/abs__ic_clear.xml b/libs/ActionBarSherlock/res/drawable/abs__ic_clear.xml deleted file mode 100644 index a16f4b2..0000000 --- a/libs/ActionBarSherlock/res/drawable/abs__ic_clear.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/libs/ActionBarSherlock/res/drawable/abs__ic_clear_holo_light.xml b/libs/ActionBarSherlock/res/drawable/abs__ic_clear_holo_light.xml deleted file mode 100644 index 256de80..0000000 --- a/libs/ActionBarSherlock/res/drawable/abs__ic_clear_holo_light.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/libs/ActionBarSherlock/res/drawable/abs__ic_menu_moreoverflow_holo_dark.xml b/libs/ActionBarSherlock/res/drawable/abs__ic_menu_moreoverflow_holo_dark.xml deleted file mode 100644 index 2588a49..0000000 --- a/libs/ActionBarSherlock/res/drawable/abs__ic_menu_moreoverflow_holo_dark.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - diff --git a/libs/ActionBarSherlock/res/drawable/abs__ic_menu_moreoverflow_holo_light.xml b/libs/ActionBarSherlock/res/drawable/abs__ic_menu_moreoverflow_holo_light.xml deleted file mode 100644 index e2078c9..0000000 --- a/libs/ActionBarSherlock/res/drawable/abs__ic_menu_moreoverflow_holo_light.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - diff --git a/libs/ActionBarSherlock/res/drawable/abs__item_background_holo_dark.xml b/libs/ActionBarSherlock/res/drawable/abs__item_background_holo_dark.xml deleted file mode 100644 index d99b7a4..0000000 --- a/libs/ActionBarSherlock/res/drawable/abs__item_background_holo_dark.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - diff --git a/libs/ActionBarSherlock/res/drawable/abs__item_background_holo_light.xml b/libs/ActionBarSherlock/res/drawable/abs__item_background_holo_light.xml deleted file mode 100644 index da5fb2e..0000000 --- a/libs/ActionBarSherlock/res/drawable/abs__item_background_holo_light.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - diff --git a/libs/ActionBarSherlock/res/drawable/abs__list_selector_background_transition_holo_dark.xml b/libs/ActionBarSherlock/res/drawable/abs__list_selector_background_transition_holo_dark.xml deleted file mode 100644 index b2ce4f0..0000000 --- a/libs/ActionBarSherlock/res/drawable/abs__list_selector_background_transition_holo_dark.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/libs/ActionBarSherlock/res/drawable/abs__list_selector_background_transition_holo_light.xml b/libs/ActionBarSherlock/res/drawable/abs__list_selector_background_transition_holo_light.xml deleted file mode 100644 index d7e31b1..0000000 --- a/libs/ActionBarSherlock/res/drawable/abs__list_selector_background_transition_holo_light.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/libs/ActionBarSherlock/res/drawable/abs__list_selector_holo_dark.xml b/libs/ActionBarSherlock/res/drawable/abs__list_selector_holo_dark.xml deleted file mode 100644 index 08b8b12..0000000 --- a/libs/ActionBarSherlock/res/drawable/abs__list_selector_holo_dark.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - diff --git a/libs/ActionBarSherlock/res/drawable/abs__list_selector_holo_light.xml b/libs/ActionBarSherlock/res/drawable/abs__list_selector_holo_light.xml deleted file mode 100644 index ada490b..0000000 --- a/libs/ActionBarSherlock/res/drawable/abs__list_selector_holo_light.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/libs/ActionBarSherlock/res/drawable/abs__progress_horizontal_holo_dark.xml b/libs/ActionBarSherlock/res/drawable/abs__progress_horizontal_holo_dark.xml deleted file mode 100644 index bd19140..0000000 --- a/libs/ActionBarSherlock/res/drawable/abs__progress_horizontal_holo_dark.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/libs/ActionBarSherlock/res/drawable/abs__progress_horizontal_holo_light.xml b/libs/ActionBarSherlock/res/drawable/abs__progress_horizontal_holo_light.xml deleted file mode 100644 index 321f07c..0000000 --- a/libs/ActionBarSherlock/res/drawable/abs__progress_horizontal_holo_light.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/libs/ActionBarSherlock/res/drawable/abs__progress_medium_holo.xml b/libs/ActionBarSherlock/res/drawable/abs__progress_medium_holo.xml deleted file mode 100644 index 6d4814f..0000000 --- a/libs/ActionBarSherlock/res/drawable/abs__progress_medium_holo.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - diff --git a/libs/ActionBarSherlock/res/drawable/abs__search_dropdown_dark.xml b/libs/ActionBarSherlock/res/drawable/abs__search_dropdown_dark.xml deleted file mode 100644 index 2628418..0000000 --- a/libs/ActionBarSherlock/res/drawable/abs__search_dropdown_dark.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - diff --git a/libs/ActionBarSherlock/res/drawable/abs__search_dropdown_light.xml b/libs/ActionBarSherlock/res/drawable/abs__search_dropdown_light.xml deleted file mode 100644 index 0d00c58..0000000 --- a/libs/ActionBarSherlock/res/drawable/abs__search_dropdown_light.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - diff --git a/libs/ActionBarSherlock/res/drawable/abs__spinner_ab_holo_dark.xml b/libs/ActionBarSherlock/res/drawable/abs__spinner_ab_holo_dark.xml deleted file mode 100644 index 4af5e22..0000000 --- a/libs/ActionBarSherlock/res/drawable/abs__spinner_ab_holo_dark.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - diff --git a/libs/ActionBarSherlock/res/drawable/abs__spinner_ab_holo_light.xml b/libs/ActionBarSherlock/res/drawable/abs__spinner_ab_holo_light.xml deleted file mode 100644 index b785084..0000000 --- a/libs/ActionBarSherlock/res/drawable/abs__spinner_ab_holo_light.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - diff --git a/libs/ActionBarSherlock/res/drawable/abs__tab_indicator_ab_holo.xml b/libs/ActionBarSherlock/res/drawable/abs__tab_indicator_ab_holo.xml deleted file mode 100644 index d34e208..0000000 --- a/libs/ActionBarSherlock/res/drawable/abs__tab_indicator_ab_holo.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/libs/ActionBarSherlock/res/drawable/abs__textfield_searchview_holo_dark.xml b/libs/ActionBarSherlock/res/drawable/abs__textfield_searchview_holo_dark.xml deleted file mode 100644 index b6d58c0..0000000 --- a/libs/ActionBarSherlock/res/drawable/abs__textfield_searchview_holo_dark.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - diff --git a/libs/ActionBarSherlock/res/drawable/abs__textfield_searchview_holo_light.xml b/libs/ActionBarSherlock/res/drawable/abs__textfield_searchview_holo_light.xml deleted file mode 100644 index 3d6acf8..0000000 --- a/libs/ActionBarSherlock/res/drawable/abs__textfield_searchview_holo_light.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - diff --git a/libs/ActionBarSherlock/res/drawable/abs__textfield_searchview_right_holo_dark.xml b/libs/ActionBarSherlock/res/drawable/abs__textfield_searchview_right_holo_dark.xml deleted file mode 100644 index 05ff4ed..0000000 --- a/libs/ActionBarSherlock/res/drawable/abs__textfield_searchview_right_holo_dark.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - diff --git a/libs/ActionBarSherlock/res/drawable/abs__textfield_searchview_right_holo_light.xml b/libs/ActionBarSherlock/res/drawable/abs__textfield_searchview_right_holo_light.xml deleted file mode 100644 index f6d61e5..0000000 --- a/libs/ActionBarSherlock/res/drawable/abs__textfield_searchview_right_holo_light.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - diff --git a/libs/ActionBarSherlock/res/layout-large/abs__action_mode_close_item.xml b/libs/ActionBarSherlock/res/layout-large/abs__action_mode_close_item.xml deleted file mode 100644 index 8811dad..0000000 --- a/libs/ActionBarSherlock/res/layout-large/abs__action_mode_close_item.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - diff --git a/libs/ActionBarSherlock/res/layout-v14/sherlock_spinner_dropdown_item.xml b/libs/ActionBarSherlock/res/layout-v14/sherlock_spinner_dropdown_item.xml deleted file mode 100644 index 6c183c0..0000000 --- a/libs/ActionBarSherlock/res/layout-v14/sherlock_spinner_dropdown_item.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - diff --git a/libs/ActionBarSherlock/res/layout-v14/sherlock_spinner_item.xml b/libs/ActionBarSherlock/res/layout-v14/sherlock_spinner_item.xml deleted file mode 100644 index 61dc025..0000000 --- a/libs/ActionBarSherlock/res/layout-v14/sherlock_spinner_item.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - diff --git a/libs/ActionBarSherlock/res/layout-xlarge/abs__screen_action_bar.xml b/libs/ActionBarSherlock/res/layout-xlarge/abs__screen_action_bar.xml deleted file mode 100644 index 040df44..0000000 --- a/libs/ActionBarSherlock/res/layout-xlarge/abs__screen_action_bar.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - diff --git a/libs/ActionBarSherlock/res/layout-xlarge/abs__screen_action_bar_overlay.xml b/libs/ActionBarSherlock/res/layout-xlarge/abs__screen_action_bar_overlay.xml deleted file mode 100644 index c64ef14..0000000 --- a/libs/ActionBarSherlock/res/layout-xlarge/abs__screen_action_bar_overlay.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - - - diff --git a/libs/ActionBarSherlock/res/layout/abs__action_bar_home.xml b/libs/ActionBarSherlock/res/layout/abs__action_bar_home.xml deleted file mode 100644 index 5c1e9ec..0000000 --- a/libs/ActionBarSherlock/res/layout/abs__action_bar_home.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - diff --git a/libs/ActionBarSherlock/res/layout/abs__action_bar_tab.xml b/libs/ActionBarSherlock/res/layout/abs__action_bar_tab.xml deleted file mode 100644 index f46f7a0..0000000 --- a/libs/ActionBarSherlock/res/layout/abs__action_bar_tab.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - \ No newline at end of file diff --git a/libs/ActionBarSherlock/res/layout/abs__action_bar_tab_bar_view.xml b/libs/ActionBarSherlock/res/layout/abs__action_bar_tab_bar_view.xml deleted file mode 100644 index 0d51220..0000000 --- a/libs/ActionBarSherlock/res/layout/abs__action_bar_tab_bar_view.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - \ No newline at end of file diff --git a/libs/ActionBarSherlock/res/layout/abs__action_bar_title_item.xml b/libs/ActionBarSherlock/res/layout/abs__action_bar_title_item.xml deleted file mode 100644 index dd69aca..0000000 --- a/libs/ActionBarSherlock/res/layout/abs__action_bar_title_item.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - diff --git a/libs/ActionBarSherlock/res/layout/abs__action_menu_item_layout.xml b/libs/ActionBarSherlock/res/layout/abs__action_menu_item_layout.xml deleted file mode 100644 index 13149fd..0000000 --- a/libs/ActionBarSherlock/res/layout/abs__action_menu_item_layout.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - diff --git a/libs/ActionBarSherlock/res/layout/abs__action_menu_layout.xml b/libs/ActionBarSherlock/res/layout/abs__action_menu_layout.xml deleted file mode 100644 index a6f8e53..0000000 --- a/libs/ActionBarSherlock/res/layout/abs__action_menu_layout.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - diff --git a/libs/ActionBarSherlock/res/layout/abs__action_mode_bar.xml b/libs/ActionBarSherlock/res/layout/abs__action_mode_bar.xml deleted file mode 100644 index 7168dc7..0000000 --- a/libs/ActionBarSherlock/res/layout/abs__action_mode_bar.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - diff --git a/libs/ActionBarSherlock/res/layout/abs__action_mode_close_item.xml b/libs/ActionBarSherlock/res/layout/abs__action_mode_close_item.xml deleted file mode 100644 index 875ec3e..0000000 --- a/libs/ActionBarSherlock/res/layout/abs__action_mode_close_item.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - diff --git a/libs/ActionBarSherlock/res/layout/abs__activity_chooser_view.xml b/libs/ActionBarSherlock/res/layout/abs__activity_chooser_view.xml deleted file mode 100644 index 6a0ac9e..0000000 --- a/libs/ActionBarSherlock/res/layout/abs__activity_chooser_view.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/libs/ActionBarSherlock/res/layout/abs__activity_chooser_view_list_item.xml b/libs/ActionBarSherlock/res/layout/abs__activity_chooser_view_list_item.xml deleted file mode 100644 index b430032..0000000 --- a/libs/ActionBarSherlock/res/layout/abs__activity_chooser_view_list_item.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - diff --git a/libs/ActionBarSherlock/res/layout/abs__dialog_title_holo.xml b/libs/ActionBarSherlock/res/layout/abs__dialog_title_holo.xml deleted file mode 100644 index ab2b0ee..0000000 --- a/libs/ActionBarSherlock/res/layout/abs__dialog_title_holo.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - diff --git a/libs/ActionBarSherlock/res/layout/abs__list_menu_item_checkbox.xml b/libs/ActionBarSherlock/res/layout/abs__list_menu_item_checkbox.xml deleted file mode 100644 index 39aca3a..0000000 --- a/libs/ActionBarSherlock/res/layout/abs__list_menu_item_checkbox.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - diff --git a/libs/ActionBarSherlock/res/layout/abs__list_menu_item_icon.xml b/libs/ActionBarSherlock/res/layout/abs__list_menu_item_icon.xml deleted file mode 100644 index 55ab28a..0000000 --- a/libs/ActionBarSherlock/res/layout/abs__list_menu_item_icon.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - diff --git a/libs/ActionBarSherlock/res/layout/abs__list_menu_item_layout.xml b/libs/ActionBarSherlock/res/layout/abs__list_menu_item_layout.xml deleted file mode 100644 index 147f36f..0000000 --- a/libs/ActionBarSherlock/res/layout/abs__list_menu_item_layout.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/libs/ActionBarSherlock/res/layout/abs__list_menu_item_radio.xml b/libs/ActionBarSherlock/res/layout/abs__list_menu_item_radio.xml deleted file mode 100644 index ff54bbe..0000000 --- a/libs/ActionBarSherlock/res/layout/abs__list_menu_item_radio.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - diff --git a/libs/ActionBarSherlock/res/layout/abs__popup_menu_item_layout.xml b/libs/ActionBarSherlock/res/layout/abs__popup_menu_item_layout.xml deleted file mode 100644 index d42425a..0000000 --- a/libs/ActionBarSherlock/res/layout/abs__popup_menu_item_layout.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/libs/ActionBarSherlock/res/layout/abs__screen_action_bar.xml b/libs/ActionBarSherlock/res/layout/abs__screen_action_bar.xml deleted file mode 100644 index 1fb82fe..0000000 --- a/libs/ActionBarSherlock/res/layout/abs__screen_action_bar.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - - diff --git a/libs/ActionBarSherlock/res/layout/abs__screen_action_bar_overlay.xml b/libs/ActionBarSherlock/res/layout/abs__screen_action_bar_overlay.xml deleted file mode 100644 index 0961ef5..0000000 --- a/libs/ActionBarSherlock/res/layout/abs__screen_action_bar_overlay.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - - - - - - - diff --git a/libs/ActionBarSherlock/res/layout/abs__screen_simple.xml b/libs/ActionBarSherlock/res/layout/abs__screen_simple.xml deleted file mode 100644 index 33e2dea..0000000 --- a/libs/ActionBarSherlock/res/layout/abs__screen_simple.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - diff --git a/libs/ActionBarSherlock/res/layout/abs__screen_simple_overlay_action_mode.xml b/libs/ActionBarSherlock/res/layout/abs__screen_simple_overlay_action_mode.xml deleted file mode 100644 index f8b9fb1..0000000 --- a/libs/ActionBarSherlock/res/layout/abs__screen_simple_overlay_action_mode.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - diff --git a/libs/ActionBarSherlock/res/layout/abs__search_dropdown_item_icons_2line.xml b/libs/ActionBarSherlock/res/layout/abs__search_dropdown_item_icons_2line.xml deleted file mode 100644 index e1d3dc4..0000000 --- a/libs/ActionBarSherlock/res/layout/abs__search_dropdown_item_icons_2line.xml +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/libs/ActionBarSherlock/res/layout/abs__search_view.xml b/libs/ActionBarSherlock/res/layout/abs__search_view.xml deleted file mode 100644 index 6ba3191..0000000 --- a/libs/ActionBarSherlock/res/layout/abs__search_view.xml +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libs/ActionBarSherlock/res/layout/abs__simple_dropdown_hint.xml b/libs/ActionBarSherlock/res/layout/abs__simple_dropdown_hint.xml deleted file mode 100644 index 8fc0eb1..0000000 --- a/libs/ActionBarSherlock/res/layout/abs__simple_dropdown_hint.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - diff --git a/libs/ActionBarSherlock/res/layout/sherlock_spinner_dropdown_item.xml b/libs/ActionBarSherlock/res/layout/sherlock_spinner_dropdown_item.xml deleted file mode 100644 index a6c6252..0000000 --- a/libs/ActionBarSherlock/res/layout/sherlock_spinner_dropdown_item.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - diff --git a/libs/ActionBarSherlock/res/layout/sherlock_spinner_item.xml b/libs/ActionBarSherlock/res/layout/sherlock_spinner_item.xml deleted file mode 100644 index bea7401..0000000 --- a/libs/ActionBarSherlock/res/layout/sherlock_spinner_item.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - diff --git a/libs/ActionBarSherlock/res/values-land/abs__dimens.xml b/libs/ActionBarSherlock/res/values-land/abs__dimens.xml deleted file mode 100644 index 502cc16..0000000 --- a/libs/ActionBarSherlock/res/values-land/abs__dimens.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - 40dip - - 4dip - - 16dp - - 12dp - - -2dp - - 4dip - diff --git a/libs/ActionBarSherlock/res/values-large-hdpi-1024x600/abs__dimens.xml b/libs/ActionBarSherlock/res/values-large-hdpi-1024x600/abs__dimens.xml deleted file mode 100644 index 3312cfa..0000000 --- a/libs/ActionBarSherlock/res/values-large-hdpi-1024x600/abs__dimens.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - 48dip - - 8dip - - 18dp - - 14dp - - -3dp - - 5dip - diff --git a/libs/ActionBarSherlock/res/values-large-land-hdpi-1024x600/abs__dimens.xml b/libs/ActionBarSherlock/res/values-large-land-hdpi-1024x600/abs__dimens.xml deleted file mode 100644 index 502cc16..0000000 --- a/libs/ActionBarSherlock/res/values-large-land-hdpi-1024x600/abs__dimens.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - 40dip - - 4dip - - 16dp - - 12dp - - -2dp - - 4dip - diff --git a/libs/ActionBarSherlock/res/values-large-land-mdpi-1024x600/abs__dimens.xml b/libs/ActionBarSherlock/res/values-large-land-mdpi-1024x600/abs__dimens.xml deleted file mode 100644 index 3312cfa..0000000 --- a/libs/ActionBarSherlock/res/values-large-land-mdpi-1024x600/abs__dimens.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - 48dip - - 8dip - - 18dp - - 14dp - - -3dp - - 5dip - diff --git a/libs/ActionBarSherlock/res/values-large-mdpi-1024x600/abs__dimens.xml b/libs/ActionBarSherlock/res/values-large-mdpi-1024x600/abs__dimens.xml deleted file mode 100644 index 3591033..0000000 --- a/libs/ActionBarSherlock/res/values-large-mdpi-1024x600/abs__dimens.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - 56dip - - 4dip - - 18dp - - 14dp - - -3dp - - 9dip - - - 64dip - diff --git a/libs/ActionBarSherlock/res/values-large/abs__dimens.xml b/libs/ActionBarSherlock/res/values-large/abs__dimens.xml deleted file mode 100644 index 63b12f7..0000000 --- a/libs/ActionBarSherlock/res/values-large/abs__dimens.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - 55% - - 80% - diff --git a/libs/ActionBarSherlock/res/values-sw600dp/abs__bools.xml b/libs/ActionBarSherlock/res/values-sw600dp/abs__bools.xml deleted file mode 100644 index 7a48e15..0000000 --- a/libs/ActionBarSherlock/res/values-sw600dp/abs__bools.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - false - diff --git a/libs/ActionBarSherlock/res/values-sw600dp/abs__dimens.xml b/libs/ActionBarSherlock/res/values-sw600dp/abs__dimens.xml deleted file mode 100644 index f678538..0000000 --- a/libs/ActionBarSherlock/res/values-sw600dp/abs__dimens.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - 56dip - - 4dip - - 18dp - - 14dp - - -3dp - - 9dip - - 5 - - - 64dip - diff --git a/libs/ActionBarSherlock/res/values-v11/abs__themes.xml b/libs/ActionBarSherlock/res/values-v11/abs__themes.xml deleted file mode 100644 index 0347357..0000000 --- a/libs/ActionBarSherlock/res/values-v11/abs__themes.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - diff --git a/libs/ActionBarSherlock/res/values-v14/abs__styles.xml b/libs/ActionBarSherlock/res/values-v14/abs__styles.xml deleted file mode 100644 index 88a60dd..0000000 --- a/libs/ActionBarSherlock/res/values-v14/abs__styles.xml +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libs/ActionBarSherlock/res/values-v14/abs__themes.xml b/libs/ActionBarSherlock/res/values-v14/abs__themes.xml deleted file mode 100644 index 5fac1ab..0000000 --- a/libs/ActionBarSherlock/res/values-v14/abs__themes.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - diff --git a/libs/ActionBarSherlock/res/values-w360dp/abs__dimens.xml b/libs/ActionBarSherlock/res/values-w360dp/abs__dimens.xml deleted file mode 100644 index 6f49d7e..0000000 --- a/libs/ActionBarSherlock/res/values-w360dp/abs__dimens.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - 3 - diff --git a/libs/ActionBarSherlock/res/values-w480dp/abs__bools.xml b/libs/ActionBarSherlock/res/values-w480dp/abs__bools.xml deleted file mode 100644 index 3eaf4ae..0000000 --- a/libs/ActionBarSherlock/res/values-w480dp/abs__bools.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - true - false - diff --git a/libs/ActionBarSherlock/res/values-w480dp/abs__config.xml b/libs/ActionBarSherlock/res/values-w480dp/abs__config.xml deleted file mode 100644 index 88357b0..0000000 --- a/libs/ActionBarSherlock/res/values-w480dp/abs__config.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - true - - diff --git a/libs/ActionBarSherlock/res/values-w500dp/abs__dimens.xml b/libs/ActionBarSherlock/res/values-w500dp/abs__dimens.xml deleted file mode 100644 index 2fd4dee..0000000 --- a/libs/ActionBarSherlock/res/values-w500dp/abs__dimens.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - 4 - diff --git a/libs/ActionBarSherlock/res/values-w600dp/abs__dimens.xml b/libs/ActionBarSherlock/res/values-w600dp/abs__dimens.xml deleted file mode 100644 index b085952..0000000 --- a/libs/ActionBarSherlock/res/values-w600dp/abs__dimens.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - 5 - diff --git a/libs/ActionBarSherlock/res/values-xlarge/abs__dimens.xml b/libs/ActionBarSherlock/res/values-xlarge/abs__dimens.xml deleted file mode 100644 index bfc535d..0000000 --- a/libs/ActionBarSherlock/res/values-xlarge/abs__dimens.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - 56dip - - 4dip - - 18dp - - 14dp - - -3dp - - 9dip - - - 64dip - - - 45% - - 72% - diff --git a/libs/ActionBarSherlock/res/values/abs__attrs.xml b/libs/ActionBarSherlock/res/values/abs__attrs.xml deleted file mode 100644 index 32631ca..0000000 --- a/libs/ActionBarSherlock/res/values/abs__attrs.xml +++ /dev/null @@ -1,432 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libs/ActionBarSherlock/res/values/abs__bools.xml b/libs/ActionBarSherlock/res/values/abs__bools.xml deleted file mode 100644 index 0b43244..0000000 --- a/libs/ActionBarSherlock/res/values/abs__bools.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - false - true - true - - diff --git a/libs/ActionBarSherlock/res/values/abs__colors.xml b/libs/ActionBarSherlock/res/values/abs__colors.xml deleted file mode 100644 index 625c632..0000000 --- a/libs/ActionBarSherlock/res/values/abs__colors.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - #ff000000 - #fff3f3f3 - @color/abs__background_holo_light - @color/abs__background_holo_dark - #ff4c4c4c - #ffb2b2b2 - @color/abs__bright_foreground_holo_light - @color/abs__bright_foreground_holo_dark - #ff33b5e5 - diff --git a/libs/ActionBarSherlock/res/values/abs__config.xml b/libs/ActionBarSherlock/res/values/abs__config.xml deleted file mode 100644 index 4c7b5d4..0000000 --- a/libs/ActionBarSherlock/res/values/abs__config.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - 320dp - - - false - - - true - - - false - - diff --git a/libs/ActionBarSherlock/res/values/abs__dimens.xml b/libs/ActionBarSherlock/res/values/abs__dimens.xml deleted file mode 100644 index 831289e..0000000 --- a/libs/ActionBarSherlock/res/values/abs__dimens.xml +++ /dev/null @@ -1,67 +0,0 @@ - - - - - 48dip - - 8dip - - 18dp - - 14dp - - -3dp - - 5dip - - 2 - - - 56dip - - - 64dip - - - 65% - - 95% - - - - 8dip - - - 8dip - - - 32dip - - - - 160dip - - - 320dip - diff --git a/libs/ActionBarSherlock/res/values/abs__ids.xml b/libs/ActionBarSherlock/res/values/abs__ids.xml deleted file mode 100644 index f9f5604..0000000 --- a/libs/ActionBarSherlock/res/values/abs__ids.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - diff --git a/libs/ActionBarSherlock/res/values/abs__strings.xml b/libs/ActionBarSherlock/res/values/abs__strings.xml deleted file mode 100644 index 06a2a2a..0000000 --- a/libs/ActionBarSherlock/res/values/abs__strings.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - Navigate home - - Navigate up - - More options - - - Done - - - See all... - - Select activity - - Share with... - - Choose an application - - Share with - - Share with %s - - - Search - - Search query - - Clear query - - Submit query - - Voice search - diff --git a/libs/ActionBarSherlock/res/values/abs__styles.xml b/libs/ActionBarSherlock/res/values/abs__styles.xml deleted file mode 100644 index 45a18c1..0000000 --- a/libs/ActionBarSherlock/res/values/abs__styles.xml +++ /dev/null @@ -1,412 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libs/ActionBarSherlock/res/values/abs__themes.xml b/libs/ActionBarSherlock/res/values/abs__themes.xml deleted file mode 100644 index 634fa79..0000000 --- a/libs/ActionBarSherlock/res/values/abs__themes.xml +++ /dev/null @@ -1,239 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/libs/ActionBarSherlock/src/android/support/v4/app/Watson.java b/libs/ActionBarSherlock/src/android/support/v4/app/Watson.java deleted file mode 100644 index d93de4c..0000000 --- a/libs/ActionBarSherlock/src/android/support/v4/app/Watson.java +++ /dev/null @@ -1,144 +0,0 @@ -package android.support.v4.app; - -import android.util.Log; -import android.view.View; -import android.view.Window; -import com.actionbarsherlock.ActionBarSherlock.OnCreatePanelMenuListener; -import com.actionbarsherlock.ActionBarSherlock.OnMenuItemSelectedListener; -import com.actionbarsherlock.ActionBarSherlock.OnPreparePanelListener; -import com.actionbarsherlock.view.Menu; -import com.actionbarsherlock.view.MenuInflater; -import com.actionbarsherlock.view.MenuItem; - -import java.util.ArrayList; - -/** I'm in ur package. Stealing ur variables. */ -public abstract class Watson extends FragmentActivity implements OnCreatePanelMenuListener, OnPreparePanelListener, OnMenuItemSelectedListener { - private static final boolean DEBUG = false; - private static final String TAG = "Watson"; - - /** Fragment interface for menu creation callback. */ - public interface OnCreateOptionsMenuListener { - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater); - } - /** Fragment interface for menu preparation callback. */ - public interface OnPrepareOptionsMenuListener { - public void onPrepareOptionsMenu(Menu menu); - } - /** Fragment interface for menu item selection callback. */ - public interface OnOptionsItemSelectedListener { - public boolean onOptionsItemSelected(MenuItem item); - } - - private ArrayList mCreatedMenus; - - - /////////////////////////////////////////////////////////////////////////// - // Sherlock menu handling - /////////////////////////////////////////////////////////////////////////// - - @Override - public boolean onCreatePanelMenu(int featureId, Menu menu) { - if (DEBUG) Log.d(TAG, "[onCreatePanelMenu] featureId: " + featureId + ", menu: " + menu); - - if (featureId == Window.FEATURE_OPTIONS_PANEL) { - boolean result = onCreateOptionsMenu(menu); - if (DEBUG) Log.d(TAG, "[onCreatePanelMenu] activity create result: " + result); - - MenuInflater inflater = getSupportMenuInflater(); - boolean show = false; - ArrayList newMenus = null; - if (mFragments.mAdded != null) { - for (int i = 0; i < mFragments.mAdded.size(); i++) { - Fragment f = mFragments.mAdded.get(i); - if (f != null && !f.mHidden && f.mHasMenu && f.mMenuVisible && f instanceof OnCreateOptionsMenuListener) { - show = true; - ((OnCreateOptionsMenuListener)f).onCreateOptionsMenu(menu, inflater); - if (newMenus == null) { - newMenus = new ArrayList(); - } - newMenus.add(f); - } - } - } - - if (mCreatedMenus != null) { - for (int i = 0; i < mCreatedMenus.size(); i++) { - Fragment f = mCreatedMenus.get(i); - if (newMenus == null || !newMenus.contains(f)) { - f.onDestroyOptionsMenu(); - } - } - } - - mCreatedMenus = newMenus; - - if (DEBUG) Log.d(TAG, "[onCreatePanelMenu] fragments create result: " + show); - result |= show; - - if (DEBUG) Log.d(TAG, "[onCreatePanelMenu] returning " + result); - return result; - } - return false; - } - - @Override - public boolean onPreparePanel(int featureId, View view, Menu menu) { - if (DEBUG) Log.d(TAG, "[onPreparePanel] featureId: " + featureId + ", view: " + view + " menu: " + menu); - - if (featureId == Window.FEATURE_OPTIONS_PANEL) { - boolean result = onPrepareOptionsMenu(menu); - if (DEBUG) Log.d(TAG, "[onPreparePanel] activity prepare result: " + result); - - boolean show = false; - if (mFragments.mAdded != null) { - for (int i = 0; i < mFragments.mAdded.size(); i++) { - Fragment f = mFragments.mAdded.get(i); - if (f != null && !f.mHidden && f.mHasMenu && f.mMenuVisible && f instanceof OnPrepareOptionsMenuListener) { - show = true; - ((OnPrepareOptionsMenuListener)f).onPrepareOptionsMenu(menu); - } - } - } - - if (DEBUG) Log.d(TAG, "[onPreparePanel] fragments prepare result: " + show); - result |= show; - - result &= menu.hasVisibleItems(); - if (DEBUG) Log.d(TAG, "[onPreparePanel] returning " + result); - return result; - } - return false; - } - - @Override - public boolean onMenuItemSelected(int featureId, MenuItem item) { - if (DEBUG) Log.d(TAG, "[onMenuItemSelected] featureId: " + featureId + ", item: " + item); - - if (featureId == Window.FEATURE_OPTIONS_PANEL) { - if (onOptionsItemSelected(item)) { - return true; - } - - if (mFragments.mAdded != null) { - for (int i = 0; i < mFragments.mAdded.size(); i++) { - Fragment f = mFragments.mAdded.get(i); - if (f != null && !f.mHidden && f.mHasMenu && f.mMenuVisible && f instanceof OnOptionsItemSelectedListener) { - if (((OnOptionsItemSelectedListener)f).onOptionsItemSelected(item)) { - return true; - } - } - } - } - } - return false; - } - - public abstract boolean onCreateOptionsMenu(Menu menu); - - public abstract boolean onPrepareOptionsMenu(Menu menu); - - public abstract boolean onOptionsItemSelected(MenuItem item); - - public abstract MenuInflater getSupportMenuInflater(); -} diff --git a/libs/ActionBarSherlock/src/com/actionbarsherlock/ActionBarSherlock.java b/libs/ActionBarSherlock/src/com/actionbarsherlock/ActionBarSherlock.java deleted file mode 100644 index ab160f8..0000000 --- a/libs/ActionBarSherlock/src/com/actionbarsherlock/ActionBarSherlock.java +++ /dev/null @@ -1,794 +0,0 @@ -package com.actionbarsherlock; - -import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.util.HashMap; -import java.util.Iterator; -import android.app.Activity; -import android.content.Context; -import android.content.res.Configuration; -import android.os.Build; -import android.os.Bundle; -import android.util.DisplayMetrics; -import android.util.Log; -import android.view.KeyEvent; -import android.view.View; -import android.view.ViewGroup; -import android.view.Window; -import com.actionbarsherlock.app.ActionBar; -import com.actionbarsherlock.internal.ActionBarSherlockCompat; -import com.actionbarsherlock.internal.ActionBarSherlockNative; -import com.actionbarsherlock.view.ActionMode; -import com.actionbarsherlock.view.Menu; -import com.actionbarsherlock.view.MenuInflater; -import com.actionbarsherlock.view.MenuItem; - -/** - *

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

- * - *

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- * In order for the progress bar to be shown, the feature must be requested - * via {@link #requestWindowFeature(int)}. - * - * @param secondaryProgress The secondary progress for the progress bar. Valid ranges are from - * 0 to 10000 (both inclusive). - */ - public abstract void setSecondaryProgress(int secondaryProgress); - - /** - * Get a menu inflater instance which supports the newer menu attributes. - * - * @return Menu inflater instance. - */ - public MenuInflater getMenuInflater() { - if (DEBUG) Log.d(TAG, "[getMenuInflater]"); - - // Make sure that action views can get an appropriate theme. - if (mMenuInflater == null) { - if (getActionBar() != null) { - mMenuInflater = new MenuInflater(getThemedContext(), mActivity); - } else { - mMenuInflater = new MenuInflater(mActivity); - } - } - return mMenuInflater; - } - - protected abstract Context getThemedContext(); - - /** - * Start an action mode. - * - * @param callback Callback that will manage lifecycle events for this - * context mode. - * @return The ContextMode that was started, or null if it was canceled. - * @see ActionMode - */ - public abstract ActionMode startActionMode(ActionMode.Callback callback); -} diff --git a/libs/ActionBarSherlock/src/com/actionbarsherlock/app/ActionBar.java b/libs/ActionBarSherlock/src/com/actionbarsherlock/app/ActionBar.java deleted file mode 100644 index 03755be..0000000 --- a/libs/ActionBarSherlock/src/com/actionbarsherlock/app/ActionBar.java +++ /dev/null @@ -1,956 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.actionbarsherlock.app; - -import android.content.Context; -import android.content.res.TypedArray; -import android.graphics.drawable.Drawable; -import android.support.v4.app.FragmentTransaction; -import android.util.AttributeSet; -import android.view.Gravity; -import android.view.View; -import android.view.ViewDebug; -import android.view.ViewGroup; -import android.view.ViewGroup.MarginLayoutParams; -import android.widget.SpinnerAdapter; - -/** - * A window feature at the top of the activity that may display the activity title, navigation - * modes, and other interactive items. - *

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

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

- *

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

- *

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

- */ -public abstract class ActionBar { - /** - * Standard navigation mode. Consists of either a logo or icon - * and title text with an optional subtitle. Clicking any of these elements - * will dispatch onOptionsItemSelected to the host Activity with - * a MenuItem with item ID android.R.id.home. - */ - public static final int NAVIGATION_MODE_STANDARD = android.app.ActionBar.NAVIGATION_MODE_STANDARD; - - /** - * List navigation mode. Instead of static title text this mode - * presents a list menu for navigation within the activity. - * e.g. this might be presented to the user as a dropdown list. - */ - public static final int NAVIGATION_MODE_LIST = android.app.ActionBar.NAVIGATION_MODE_LIST; - - /** - * Tab navigation mode. Instead of static title text this mode - * presents a series of tabs for navigation within the activity. - */ - public static final int NAVIGATION_MODE_TABS = android.app.ActionBar.NAVIGATION_MODE_TABS; - - /** - * Use logo instead of icon if available. This flag will cause appropriate - * navigation modes to use a wider logo in place of the standard icon. - * - * @see #setDisplayOptions(int) - * @see #setDisplayOptions(int, int) - */ - public static final int DISPLAY_USE_LOGO = android.app.ActionBar.DISPLAY_USE_LOGO; - - /** - * Show 'home' elements in this action bar, leaving more space for other - * navigation elements. This includes logo and icon. - * - * @see #setDisplayOptions(int) - * @see #setDisplayOptions(int, int) - */ - public static final int DISPLAY_SHOW_HOME = android.app.ActionBar.DISPLAY_SHOW_HOME; - - /** - * Display the 'home' element such that it appears as an 'up' affordance. - * e.g. show an arrow to the left indicating the action that will be taken. - * - * Set this flag if selecting the 'home' button in the action bar to return - * up by a single level in your UI rather than back to the top level or front page. - * - *

Setting this option will implicitly enable interaction with the home/up - * button. See {@link #setHomeButtonEnabled(boolean)}. - * - * @see #setDisplayOptions(int) - * @see #setDisplayOptions(int, int) - */ - public static final int DISPLAY_HOME_AS_UP = android.app.ActionBar.DISPLAY_HOME_AS_UP; - - /** - * Show the activity title and subtitle, if present. - * - * @see #setTitle(CharSequence) - * @see #setTitle(int) - * @see #setSubtitle(CharSequence) - * @see #setSubtitle(int) - * @see #setDisplayOptions(int) - * @see #setDisplayOptions(int, int) - */ - public static final int DISPLAY_SHOW_TITLE = android.app.ActionBar.DISPLAY_SHOW_TITLE; - - /** - * Show the custom view if one has been set. - * @see #setCustomView(View) - * @see #setDisplayOptions(int) - * @see #setDisplayOptions(int, int) - */ - public static final int DISPLAY_SHOW_CUSTOM = android.app.ActionBar.DISPLAY_SHOW_CUSTOM; - - /** - * Set the action bar into custom navigation mode, supplying a view - * for custom navigation. - * - * Custom navigation views appear between the application icon and - * any action buttons and may use any space available there. Common - * use cases for custom navigation views might include an auto-suggesting - * address bar for a browser or other navigation mechanisms that do not - * translate well to provided navigation modes. - * - * @param view Custom navigation view to place in the ActionBar. - */ - public abstract void setCustomView(View view); - - /** - * Set the action bar into custom navigation mode, supplying a view - * for custom navigation. - * - *

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

- * - *

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

- * - * @param view Custom navigation view to place in the ActionBar. - * @param layoutParams How this custom view should layout in the bar. - * - * @see #setDisplayOptions(int, int) - */ - public abstract void setCustomView(View view, LayoutParams layoutParams); - - /** - * Set the action bar into custom navigation mode, supplying a view - * for custom navigation. - * - *

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

- * - *

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

- * - * @param resId Resource ID of a layout to inflate into the ActionBar. - * - * @see #setDisplayOptions(int, int) - */ - public abstract void setCustomView(int resId); - - /** - * Set the icon to display in the 'home' section of the action bar. - * The action bar will use an icon specified by its style or the - * activity icon by default. - * - * Whether the home section shows an icon or logo is controlled - * by the display option {@link #DISPLAY_USE_LOGO}. - * - * @param resId Resource ID of a drawable to show as an icon. - * - * @see #setDisplayUseLogoEnabled(boolean) - * @see #setDisplayShowHomeEnabled(boolean) - */ - public abstract void setIcon(int resId); - - /** - * Set the icon to display in the 'home' section of the action bar. - * The action bar will use an icon specified by its style or the - * activity icon by default. - * - * Whether the home section shows an icon or logo is controlled - * by the display option {@link #DISPLAY_USE_LOGO}. - * - * @param icon Drawable to show as an icon. - * - * @see #setDisplayUseLogoEnabled(boolean) - * @see #setDisplayShowHomeEnabled(boolean) - */ - public abstract void setIcon(Drawable icon); - - /** - * Set the logo to display in the 'home' section of the action bar. - * The action bar will use a logo specified by its style or the - * activity logo by default. - * - * Whether the home section shows an icon or logo is controlled - * by the display option {@link #DISPLAY_USE_LOGO}. - * - * @param resId Resource ID of a drawable to show as a logo. - * - * @see #setDisplayUseLogoEnabled(boolean) - * @see #setDisplayShowHomeEnabled(boolean) - */ - public abstract void setLogo(int resId); - - /** - * Set the logo to display in the 'home' section of the action bar. - * The action bar will use a logo specified by its style or the - * activity logo by default. - * - * Whether the home section shows an icon or logo is controlled - * by the display option {@link #DISPLAY_USE_LOGO}. - * - * @param logo Drawable to show as a logo. - * - * @see #setDisplayUseLogoEnabled(boolean) - * @see #setDisplayShowHomeEnabled(boolean) - */ - public abstract void setLogo(Drawable logo); - - /** - * Set the adapter and navigation callback for list navigation mode. - * - * The supplied adapter will provide views for the expanded list as well as - * the currently selected item. (These may be displayed differently.) - * - * The supplied OnNavigationListener will alert the application when the user - * changes the current list selection. - * - * @param adapter An adapter that will provide views both to display - * the current navigation selection and populate views - * within the dropdown navigation menu. - * @param callback An OnNavigationListener that will receive events when the user - * selects a navigation item. - */ - public abstract void setListNavigationCallbacks(SpinnerAdapter adapter, - OnNavigationListener callback); - - /** - * Set the selected navigation item in list or tabbed navigation modes. - * - * @param position Position of the item to select. - */ - public abstract void setSelectedNavigationItem(int position); - - /** - * Get the position of the selected navigation item in list or tabbed navigation modes. - * - * @return Position of the selected item. - */ - public abstract int getSelectedNavigationIndex(); - - /** - * Get the number of navigation items present in the current navigation mode. - * - * @return Number of navigation items. - */ - public abstract int getNavigationItemCount(); - - /** - * Set the action bar's title. This will only be displayed if - * {@link #DISPLAY_SHOW_TITLE} is set. - * - * @param title Title to set - * - * @see #setTitle(int) - * @see #setDisplayOptions(int, int) - */ - public abstract void setTitle(CharSequence title); - - /** - * Set the action bar's title. This will only be displayed if - * {@link #DISPLAY_SHOW_TITLE} is set. - * - * @param resId Resource ID of title string to set - * - * @see #setTitle(CharSequence) - * @see #setDisplayOptions(int, int) - */ - public abstract void setTitle(int resId); - - /** - * Set the action bar's subtitle. This will only be displayed if - * {@link #DISPLAY_SHOW_TITLE} is set. Set to null to disable the - * subtitle entirely. - * - * @param subtitle Subtitle to set - * - * @see #setSubtitle(int) - * @see #setDisplayOptions(int, int) - */ - public abstract void setSubtitle(CharSequence subtitle); - - /** - * Set the action bar's subtitle. This will only be displayed if - * {@link #DISPLAY_SHOW_TITLE} is set. - * - * @param resId Resource ID of subtitle string to set - * - * @see #setSubtitle(CharSequence) - * @see #setDisplayOptions(int, int) - */ - public abstract void setSubtitle(int resId); - - /** - * Set display options. This changes all display option bits at once. To change - * a limited subset of display options, see {@link #setDisplayOptions(int, int)}. - * - * @param options A combination of the bits defined by the DISPLAY_ constants - * defined in ActionBar. - */ - public abstract void setDisplayOptions(int options); - - /** - * Set selected display options. Only the options specified by mask will be changed. - * To change all display option bits at once, see {@link #setDisplayOptions(int)}. - * - *

Example: setDisplayOptions(0, DISPLAY_SHOW_HOME) will disable the - * {@link #DISPLAY_SHOW_HOME} option. - * setDisplayOptions(DISPLAY_SHOW_HOME, DISPLAY_SHOW_HOME | DISPLAY_USE_LOGO) - * will enable {@link #DISPLAY_SHOW_HOME} and disable {@link #DISPLAY_USE_LOGO}. - * - * @param options A combination of the bits defined by the DISPLAY_ constants - * defined in ActionBar. - * @param mask A bit mask declaring which display options should be changed. - */ - public abstract void setDisplayOptions(int options, int mask); - - /** - * Set whether to display the activity logo rather than the activity icon. - * A logo is often a wider, more detailed image. - * - *

To set several display options at once, see the setDisplayOptions methods. - * - * @param useLogo true to use the activity logo, false to use the activity icon. - * - * @see #setDisplayOptions(int) - * @see #setDisplayOptions(int, int) - */ - public abstract void setDisplayUseLogoEnabled(boolean useLogo); - - /** - * Set whether to include the application home affordance in the action bar. - * Home is presented as either an activity icon or logo. - * - *

To set several display options at once, see the setDisplayOptions methods. - * - * @param showHome true to show home, false otherwise. - * - * @see #setDisplayOptions(int) - * @see #setDisplayOptions(int, int) - */ - public abstract void setDisplayShowHomeEnabled(boolean showHome); - - /** - * Set whether home should be displayed as an "up" affordance. - * Set this to true if selecting "home" returns up by a single level in your UI - * rather than back to the top level or front page. - * - *

To set several display options at once, see the setDisplayOptions methods. - * - * @param showHomeAsUp true to show the user that selecting home will return one - * level up rather than to the top level of the app. - * - * @see #setDisplayOptions(int) - * @see #setDisplayOptions(int, int) - */ - public abstract void setDisplayHomeAsUpEnabled(boolean showHomeAsUp); - - /** - * Set whether an activity title/subtitle should be displayed. - * - *

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

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

You can enable split action bar with {@link android.R.attr#uiOptions} - * - * @param d Background drawable for the split bar - */ - public void setSplitBackgroundDrawable(Drawable d) { } - - /** - * @return The current custom view. - */ - public abstract View getCustomView(); - - /** - * Returns the current ActionBar title in standard mode. - * Returns null if {@link #getNavigationMode()} would not return - * {@link #NAVIGATION_MODE_STANDARD}. - * - * @return The current ActionBar title or null. - */ - public abstract CharSequence getTitle(); - - /** - * Returns the current ActionBar subtitle in standard mode. - * Returns null if {@link #getNavigationMode()} would not return - * {@link #NAVIGATION_MODE_STANDARD}. - * - * @return The current ActionBar subtitle or null. - */ - public abstract CharSequence getSubtitle(); - - /** - * Returns the current navigation mode. The result will be one of: - *

    - *
  • {@link #NAVIGATION_MODE_STANDARD}
  • - *
  • {@link #NAVIGATION_MODE_LIST}
  • - *
  • {@link #NAVIGATION_MODE_TABS}
  • - *
- * - * @return The current navigation mode. - */ - public abstract int getNavigationMode(); - - /** - * Set the current navigation mode. - * - * @param mode The new mode to set. - * @see #NAVIGATION_MODE_STANDARD - * @see #NAVIGATION_MODE_LIST - * @see #NAVIGATION_MODE_TABS - */ - public abstract void setNavigationMode(int mode); - - /** - * @return The current set of display options. - */ - public abstract int getDisplayOptions(); - - /** - * Create and return a new {@link Tab}. - * This tab will not be included in the action bar until it is added. - * - *

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

- * - * {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentTabs.java - * complete} - * - * @return A new Tab - * - * @see #addTab(Tab) - */ - public abstract Tab newTab(); - - /** - * Add a tab for use in tabbed navigation mode. The tab will be added at the end of the list. - * If this is the first tab to be added it will become the selected tab. - * - * @param tab Tab to add - */ - public abstract void addTab(Tab tab); - - /** - * Add a tab for use in tabbed navigation mode. The tab will be added at the end of the list. - * - * @param tab Tab to add - * @param setSelected True if the added tab should become the selected tab. - */ - public abstract void addTab(Tab tab, boolean setSelected); - - /** - * Add a tab for use in tabbed navigation mode. The tab will be inserted at - * position. If this is the first tab to be added it will become - * the selected tab. - * - * @param tab The tab to add - * @param position The new position of the tab - */ - public abstract void addTab(Tab tab, int position); - - /** - * Add a tab for use in tabbed navigation mode. The tab will be insterted at - * position. - * - * @param tab The tab to add - * @param position The new position of the tab - * @param setSelected True if the added tab should become the selected tab. - */ - public abstract void addTab(Tab tab, int position, boolean setSelected); - - /** - * Remove a tab from the action bar. If the removed tab was selected it will be deselected - * and another tab will be selected if present. - * - * @param tab The tab to remove - */ - public abstract void removeTab(Tab tab); - - /** - * Remove a tab from the action bar. If the removed tab was selected it will be deselected - * and another tab will be selected if present. - * - * @param position Position of the tab to remove - */ - public abstract void removeTabAt(int position); - - /** - * Remove all tabs from the action bar and deselect the current tab. - */ - public abstract void removeAllTabs(); - - /** - * Select the specified tab. If it is not a child of this action bar it will be added. - * - *

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

- * - * @param tab Tab to select - */ - public abstract void selectTab(Tab tab); - - /** - * Returns the currently selected tab if in tabbed navigation mode and there is at least - * one tab present. - * - * @return The currently selected tab or null - */ - public abstract Tab getSelectedTab(); - - /** - * Returns the tab at the specified index. - * - * @param index Index value in the range 0-get - * @return - */ - public abstract Tab getTabAt(int index); - - /** - * Returns the number of tabs currently registered with the action bar. - * @return Tab count - */ - public abstract int getTabCount(); - - /** - * Retrieve the current height of the ActionBar. - * - * @return The ActionBar's height - */ - public abstract int getHeight(); - - /** - * Show the ActionBar if it is not currently showing. - * If the window hosting the ActionBar does not have the feature - * {@link Window#FEATURE_ACTION_BAR_OVERLAY} it will resize application - * content to fit the new space available. - */ - public abstract void show(); - - /** - * Hide the ActionBar if it is currently showing. - * If the window hosting the ActionBar does not have the feature - * {@link Window#FEATURE_ACTION_BAR_OVERLAY} it will resize application - * content to fit the new space available. - */ - public abstract void hide(); - - /** - * @return true if the ActionBar is showing, false otherwise. - */ - public abstract boolean isShowing(); - - /** - * Add a listener that will respond to menu visibility change events. - * - * @param listener The new listener to add - */ - public abstract void addOnMenuVisibilityListener(OnMenuVisibilityListener listener); - - /** - * Remove a menu visibility listener. This listener will no longer receive menu - * visibility change events. - * - * @param listener A listener to remove that was previously added - */ - public abstract void removeOnMenuVisibilityListener(OnMenuVisibilityListener listener); - - /** - * Enable or disable the "home" button in the corner of the action bar. (Note that this - * is the application home/up affordance on the action bar, not the systemwide home - * button.) - * - *

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

Setting the {@link #DISPLAY_HOME_AS_UP} display option will automatically enable - * the home button. - * - * @param enabled true to enable the home button, false to disable the home button. - */ - public void setHomeButtonEnabled(boolean enabled) { } - - /** - * Returns a {@link Context} with an appropriate theme for creating views that - * will appear in the action bar. If you are inflating or instantiating custom views - * that will appear in an action bar, you should use the Context returned by this method. - * (This includes adapters used for list navigation mode.) - * This will ensure that views contrast properly against the action bar. - * - * @return A themed Context for creating views - */ - public Context getThemedContext() { return null; } - - /** - * Listener interface for ActionBar navigation events. - */ - public interface OnNavigationListener { - /** - * This method is called whenever a navigation item in your action bar - * is selected. - * - * @param itemPosition Position of the item clicked. - * @param itemId ID of the item clicked. - * @return True if the event was handled, false otherwise. - */ - public boolean onNavigationItemSelected(int itemPosition, long itemId); - } - - /** - * Listener for receiving events when action bar menus are shown or hidden. - */ - public interface OnMenuVisibilityListener { - /** - * Called when an action bar menu is shown or hidden. Applications may want to use - * this to tune auto-hiding behavior for the action bar or pause/resume video playback, - * gameplay, or other activity within the main content area. - * - * @param isVisible True if an action bar menu is now visible, false if no action bar - * menus are visible. - */ - public void onMenuVisibilityChanged(boolean isVisible); - } - - /** - * A tab in the action bar. - * - *

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

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

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

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

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

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

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

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

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

Notifies the start of the animation.

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

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

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

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

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

Notifies the repetition of the animation.

- * - * @param animation The animation which was repeated. - */ - void onAnimationRepeat(Animator animation); - } -} diff --git a/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorListenerAdapter.java b/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorListenerAdapter.java deleted file mode 100644 index 02ddff4..0000000 --- a/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorListenerAdapter.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.actionbarsherlock.internal.nineoldandroids.animation; - -/** - * This adapter class provides empty implementations of the methods from {@link android.animation.Animator.AnimatorListener}. - * Any custom listener that cares only about a subset of the methods of this listener can - * simply subclass this adapter class instead of implementing the interface directly. - */ -public abstract class AnimatorListenerAdapter implements Animator.AnimatorListener { - - /** - * {@inheritDoc} - */ - @Override - public void onAnimationCancel(Animator animation) { - } - - /** - * {@inheritDoc} - */ - @Override - public void onAnimationEnd(Animator animation) { - } - - /** - * {@inheritDoc} - */ - @Override - public void onAnimationRepeat(Animator animation) { - } - - /** - * {@inheritDoc} - */ - @Override - public void onAnimationStart(Animator animation) { - } - -} diff --git a/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorSet.java b/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorSet.java deleted file mode 100644 index 3231080..0000000 --- a/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorSet.java +++ /dev/null @@ -1,1111 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.actionbarsherlock.internal.nineoldandroids.animation; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; - -import android.view.animation.Interpolator; - -/** - * This class plays a set of {@link Animator} objects in the specified order. Animations - * can be set up to play together, in sequence, or after a specified delay. - * - *

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

- * - *

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

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

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

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

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

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

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

- *

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

- *

- *

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

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

- *

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

- *

- *

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

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

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

- *

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

- */ - public class Builder { - - /** - * This tracks the current node being processed. It is supplied to the play() method - * of AnimatorSet and passed into the constructor of Builder. - */ - private Node mCurrentNode; - - /** - * package-private constructor. Builders are only constructed by AnimatorSet, when the - * play() method is called. - * - * @param anim The animation that is the dependency for the other animations passed into - * the other methods of this Builder object. - */ - Builder(Animator anim) { - mCurrentNode = mNodeMap.get(anim); - if (mCurrentNode == null) { - mCurrentNode = new Node(anim); - mNodeMap.put(anim, mCurrentNode); - mNodes.add(mCurrentNode); - } - } - - /** - * Sets up the given animation to play at the same time as the animation supplied in the - * {@link AnimatorSet#play(Animator)} call that created this Builder object. - * - * @param anim The animation that will play when the animation supplied to the - * {@link AnimatorSet#play(Animator)} method starts. - */ - public Builder with(Animator anim) { - Node node = mNodeMap.get(anim); - if (node == null) { - node = new Node(anim); - mNodeMap.put(anim, node); - mNodes.add(node); - } - Dependency dependency = new Dependency(mCurrentNode, Dependency.WITH); - node.addDependency(dependency); - return this; - } - - /** - * Sets up the given animation to play when the animation supplied in the - * {@link AnimatorSet#play(Animator)} call that created this Builder object - * ends. - * - * @param anim The animation that will play when the animation supplied to the - * {@link AnimatorSet#play(Animator)} method ends. - */ - public Builder before(Animator anim) { - Node node = mNodeMap.get(anim); - if (node == null) { - node = new Node(anim); - mNodeMap.put(anim, node); - mNodes.add(node); - } - Dependency dependency = new Dependency(mCurrentNode, Dependency.AFTER); - node.addDependency(dependency); - return this; - } - - /** - * Sets up the given animation to play when the animation supplied in the - * {@link AnimatorSet#play(Animator)} call that created this Builder object - * to start when the animation supplied in this method call ends. - * - * @param anim The animation whose end will cause the animation supplied to the - * {@link AnimatorSet#play(Animator)} method to play. - */ - public Builder after(Animator anim) { - Node node = mNodeMap.get(anim); - if (node == null) { - node = new Node(anim); - mNodeMap.put(anim, node); - mNodes.add(node); - } - Dependency dependency = new Dependency(node, Dependency.AFTER); - mCurrentNode.addDependency(dependency); - return this; - } - - /** - * Sets up the animation supplied in the - * {@link AnimatorSet#play(Animator)} call that created this Builder object - * to play when the given amount of time elapses. - * - * @param delay The number of milliseconds that should elapse before the - * animation starts. - */ - public Builder after(long delay) { - // setup dummy ValueAnimator just to run the clock - ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f); - anim.setDuration(delay); - after(anim); - return this; - } - - } - -} diff --git a/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatEvaluator.java b/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatEvaluator.java deleted file mode 100644 index e410193..0000000 --- a/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatEvaluator.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.actionbarsherlock.internal.nineoldandroids.animation; - -/** - * This evaluator can be used to perform type interpolation between float values. - */ -public class FloatEvaluator implements TypeEvaluator { - - /** - * This function returns the result of linearly interpolating the start and end values, with - * fraction representing the proportion between the start and end values. The - * calculation is a simple parametric calculation: result = x0 + t * (v1 - v0), - * where x0 is startValue, x1 is endValue, - * and t is fraction. - * - * @param fraction The fraction from the starting to the ending values - * @param startValue The start value; should be of type float or - * Float - * @param endValue The end value; should be of type float or Float - * @return A linear interpolation between the start and end values, given the - * fraction parameter. - */ - public Float evaluate(float fraction, Number startValue, Number endValue) { - float startFloat = startValue.floatValue(); - return startFloat + fraction * (endValue.floatValue() - startFloat); - } -} \ No newline at end of file diff --git a/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatKeyframeSet.java b/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatKeyframeSet.java deleted file mode 100644 index 6d9dafa..0000000 --- a/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatKeyframeSet.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.actionbarsherlock.internal.nineoldandroids.animation; - -import java.util.ArrayList; -import android.view.animation.Interpolator; - -import com.actionbarsherlock.internal.nineoldandroids.animation.Keyframe.FloatKeyframe; - -/** - * This class holds a collection of FloatKeyframe objects and is called by ValueAnimator to calculate - * values between those keyframes for a given animation. The class internal to the animation - * package because it is an implementation detail of how Keyframes are stored and used. - * - *

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

- */ -@SuppressWarnings("unchecked") -class FloatKeyframeSet extends KeyframeSet { - private float firstValue; - private float lastValue; - private float deltaValue; - private boolean firstTime = true; - - public FloatKeyframeSet(FloatKeyframe... keyframes) { - super(keyframes); - } - - @Override - public Object getValue(float fraction) { - return getFloatValue(fraction); - } - - @Override - public FloatKeyframeSet clone() { - ArrayList keyframes = mKeyframes; - int numKeyframes = mKeyframes.size(); - FloatKeyframe[] newKeyframes = new FloatKeyframe[numKeyframes]; - for (int i = 0; i < numKeyframes; ++i) { - newKeyframes[i] = (FloatKeyframe) keyframes.get(i).clone(); - } - FloatKeyframeSet newSet = new FloatKeyframeSet(newKeyframes); - return newSet; - } - - public float getFloatValue(float fraction) { - if (mNumKeyframes == 2) { - if (firstTime) { - firstTime = false; - firstValue = ((FloatKeyframe) mKeyframes.get(0)).getFloatValue(); - lastValue = ((FloatKeyframe) mKeyframes.get(1)).getFloatValue(); - deltaValue = lastValue - firstValue; - } - if (mInterpolator != null) { - fraction = mInterpolator.getInterpolation(fraction); - } - if (mEvaluator == null) { - return firstValue + fraction * deltaValue; - } else { - return ((Number)mEvaluator.evaluate(fraction, firstValue, lastValue)).floatValue(); - } - } - if (fraction <= 0f) { - final FloatKeyframe prevKeyframe = (FloatKeyframe) mKeyframes.get(0); - final FloatKeyframe nextKeyframe = (FloatKeyframe) mKeyframes.get(1); - float prevValue = prevKeyframe.getFloatValue(); - float nextValue = nextKeyframe.getFloatValue(); - float prevFraction = prevKeyframe.getFraction(); - float nextFraction = nextKeyframe.getFraction(); - final /*Time*/Interpolator interpolator = nextKeyframe.getInterpolator(); - if (interpolator != null) { - fraction = interpolator.getInterpolation(fraction); - } - float intervalFraction = (fraction - prevFraction) / (nextFraction - prevFraction); - return mEvaluator == null ? - prevValue + intervalFraction * (nextValue - prevValue) : - ((Number)mEvaluator.evaluate(intervalFraction, prevValue, nextValue)). - floatValue(); - } else if (fraction >= 1f) { - final FloatKeyframe prevKeyframe = (FloatKeyframe) mKeyframes.get(mNumKeyframes - 2); - final FloatKeyframe nextKeyframe = (FloatKeyframe) mKeyframes.get(mNumKeyframes - 1); - float prevValue = prevKeyframe.getFloatValue(); - float nextValue = nextKeyframe.getFloatValue(); - float prevFraction = prevKeyframe.getFraction(); - float nextFraction = nextKeyframe.getFraction(); - final /*Time*/Interpolator interpolator = nextKeyframe.getInterpolator(); - if (interpolator != null) { - fraction = interpolator.getInterpolation(fraction); - } - float intervalFraction = (fraction - prevFraction) / (nextFraction - prevFraction); - return mEvaluator == null ? - prevValue + intervalFraction * (nextValue - prevValue) : - ((Number)mEvaluator.evaluate(intervalFraction, prevValue, nextValue)). - floatValue(); - } - FloatKeyframe prevKeyframe = (FloatKeyframe) mKeyframes.get(0); - for (int i = 1; i < mNumKeyframes; ++i) { - FloatKeyframe nextKeyframe = (FloatKeyframe) mKeyframes.get(i); - if (fraction < nextKeyframe.getFraction()) { - final /*Time*/Interpolator interpolator = nextKeyframe.getInterpolator(); - if (interpolator != null) { - fraction = interpolator.getInterpolation(fraction); - } - float intervalFraction = (fraction - prevKeyframe.getFraction()) / - (nextKeyframe.getFraction() - prevKeyframe.getFraction()); - float prevValue = prevKeyframe.getFloatValue(); - float nextValue = nextKeyframe.getFloatValue(); - return mEvaluator == null ? - prevValue + intervalFraction * (nextValue - prevValue) : - ((Number)mEvaluator.evaluate(intervalFraction, prevValue, nextValue)). - floatValue(); - } - prevKeyframe = nextKeyframe; - } - // shouldn't get here - return ((Number)mKeyframes.get(mNumKeyframes - 1).getValue()).floatValue(); - } - -} - diff --git a/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntEvaluator.java b/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntEvaluator.java deleted file mode 100644 index ed5e79e..0000000 --- a/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntEvaluator.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.actionbarsherlock.internal.nineoldandroids.animation; - -/** - * This evaluator can be used to perform type interpolation between int values. - */ -public class IntEvaluator implements TypeEvaluator { - - /** - * This function returns the result of linearly interpolating the start and end values, with - * fraction representing the proportion between the start and end values. The - * calculation is a simple parametric calculation: result = x0 + t * (v1 - v0), - * where x0 is startValue, x1 is endValue, - * and t is fraction. - * - * @param fraction The fraction from the starting to the ending values - * @param startValue The start value; should be of type int or - * Integer - * @param endValue The end value; should be of type int or Integer - * @return A linear interpolation between the start and end values, given the - * fraction parameter. - */ - public Integer evaluate(float fraction, Integer startValue, Integer endValue) { - int startInt = startValue; - return (int)(startInt + fraction * (endValue - startInt)); - } -} \ No newline at end of file diff --git a/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntKeyframeSet.java b/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntKeyframeSet.java deleted file mode 100644 index e9215e7..0000000 --- a/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntKeyframeSet.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.actionbarsherlock.internal.nineoldandroids.animation; - -import java.util.ArrayList; -import android.view.animation.Interpolator; - -import com.actionbarsherlock.internal.nineoldandroids.animation.Keyframe.IntKeyframe; - -/** - * This class holds a collection of IntKeyframe objects and is called by ValueAnimator to calculate - * values between those keyframes for a given animation. The class internal to the animation - * package because it is an implementation detail of how Keyframes are stored and used. - * - *

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

- */ -@SuppressWarnings("unchecked") -class IntKeyframeSet extends KeyframeSet { - private int firstValue; - private int lastValue; - private int deltaValue; - private boolean firstTime = true; - - public IntKeyframeSet(IntKeyframe... keyframes) { - super(keyframes); - } - - @Override - public Object getValue(float fraction) { - return getIntValue(fraction); - } - - @Override - public IntKeyframeSet clone() { - ArrayList keyframes = mKeyframes; - int numKeyframes = mKeyframes.size(); - IntKeyframe[] newKeyframes = new IntKeyframe[numKeyframes]; - for (int i = 0; i < numKeyframes; ++i) { - newKeyframes[i] = (IntKeyframe) keyframes.get(i).clone(); - } - IntKeyframeSet newSet = new IntKeyframeSet(newKeyframes); - return newSet; - } - - public int getIntValue(float fraction) { - if (mNumKeyframes == 2) { - if (firstTime) { - firstTime = false; - firstValue = ((IntKeyframe) mKeyframes.get(0)).getIntValue(); - lastValue = ((IntKeyframe) mKeyframes.get(1)).getIntValue(); - deltaValue = lastValue - firstValue; - } - if (mInterpolator != null) { - fraction = mInterpolator.getInterpolation(fraction); - } - if (mEvaluator == null) { - return firstValue + (int)(fraction * deltaValue); - } else { - return ((Number)mEvaluator.evaluate(fraction, firstValue, lastValue)).intValue(); - } - } - if (fraction <= 0f) { - final IntKeyframe prevKeyframe = (IntKeyframe) mKeyframes.get(0); - final IntKeyframe nextKeyframe = (IntKeyframe) mKeyframes.get(1); - int prevValue = prevKeyframe.getIntValue(); - int nextValue = nextKeyframe.getIntValue(); - float prevFraction = prevKeyframe.getFraction(); - float nextFraction = nextKeyframe.getFraction(); - final /*Time*/Interpolator interpolator = nextKeyframe.getInterpolator(); - if (interpolator != null) { - fraction = interpolator.getInterpolation(fraction); - } - float intervalFraction = (fraction - prevFraction) / (nextFraction - prevFraction); - return mEvaluator == null ? - prevValue + (int)(intervalFraction * (nextValue - prevValue)) : - ((Number)mEvaluator.evaluate(intervalFraction, prevValue, nextValue)). - intValue(); - } else if (fraction >= 1f) { - final IntKeyframe prevKeyframe = (IntKeyframe) mKeyframes.get(mNumKeyframes - 2); - final IntKeyframe nextKeyframe = (IntKeyframe) mKeyframes.get(mNumKeyframes - 1); - int prevValue = prevKeyframe.getIntValue(); - int nextValue = nextKeyframe.getIntValue(); - float prevFraction = prevKeyframe.getFraction(); - float nextFraction = nextKeyframe.getFraction(); - final /*Time*/Interpolator interpolator = nextKeyframe.getInterpolator(); - if (interpolator != null) { - fraction = interpolator.getInterpolation(fraction); - } - float intervalFraction = (fraction - prevFraction) / (nextFraction - prevFraction); - return mEvaluator == null ? - prevValue + (int)(intervalFraction * (nextValue - prevValue)) : - ((Number)mEvaluator.evaluate(intervalFraction, prevValue, nextValue)).intValue(); - } - IntKeyframe prevKeyframe = (IntKeyframe) mKeyframes.get(0); - for (int i = 1; i < mNumKeyframes; ++i) { - IntKeyframe nextKeyframe = (IntKeyframe) mKeyframes.get(i); - if (fraction < nextKeyframe.getFraction()) { - final /*Time*/Interpolator interpolator = nextKeyframe.getInterpolator(); - if (interpolator != null) { - fraction = interpolator.getInterpolation(fraction); - } - float intervalFraction = (fraction - prevKeyframe.getFraction()) / - (nextKeyframe.getFraction() - prevKeyframe.getFraction()); - int prevValue = prevKeyframe.getIntValue(); - int nextValue = nextKeyframe.getIntValue(); - return mEvaluator == null ? - prevValue + (int)(intervalFraction * (nextValue - prevValue)) : - ((Number)mEvaluator.evaluate(intervalFraction, prevValue, nextValue)). - intValue(); - } - prevKeyframe = nextKeyframe; - } - // shouldn't get here - return ((Number)mKeyframes.get(mNumKeyframes - 1).getValue()).intValue(); - } - -} - diff --git a/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/Keyframe.java b/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/Keyframe.java deleted file mode 100644 index ab76fa7..0000000 --- a/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/Keyframe.java +++ /dev/null @@ -1,361 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.actionbarsherlock.internal.nineoldandroids.animation; - -import android.view.animation.Interpolator; - -/** - * This class holds a time/value pair for an animation. The Keyframe class is used - * by {@link ValueAnimator} to define the values that the animation target will have over the course - * of the animation. As the time proceeds from one keyframe to the other, the value of the - * target object will animate between the value at the previous keyframe and the value at the - * next keyframe. Each keyframe also holds an optional {@link TimeInterpolator} - * object, which defines the time interpolation over the intervalue preceding the keyframe. - * - *

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

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

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

- * - *

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

- * - *

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

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

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

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

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

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

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

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

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

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

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

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

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

- * - *

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

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

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

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

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

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

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

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

- * - *

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

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

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

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

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

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

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

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

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

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

Notifies the occurrence of another frame of the animation.

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

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

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

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

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

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

- *

Developer Guides

- *

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

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

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

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

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

- * - *

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

- * - *

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

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

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

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

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

- * - *

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

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

Other progress bar styles provided by the system include:

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

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

- * - *

XML attributes - *

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

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

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

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

Indicate whether this progress bar is in indeterminate mode.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Start the indeterminate progress animation.

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

Stop the indeterminate progress animation.

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

See the Spinner - * tutorial.

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

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

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

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

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

Creates a new ListAdapter wrapper for the specified adapter.

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

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

Like the tag available to views, this allows applications to associate arbitrary - * data with an ActionMode for later reference. - * - * @return Tag associated with this ActionMode - * - * @see #setTag(Object) - */ - public Object getTag() { - return mTag; - } - - /** - * Set the title of the action mode. This method will have no visible effect if - * a custom view has been set. - * - * @param title Title string to set - * - * @see #setTitle(int) - * @see #setCustomView(View) - */ - public abstract void setTitle(CharSequence title); - - /** - * Set the title of the action mode. This method will have no visible effect if - * a custom view has been set. - * - * @param resId Resource ID of a string to set as the title - * - * @see #setTitle(CharSequence) - * @see #setCustomView(View) - */ - public abstract void setTitle(int resId); - - /** - * Set the subtitle of the action mode. This method will have no visible effect if - * a custom view has been set. - * - * @param subtitle Subtitle string to set - * - * @see #setSubtitle(int) - * @see #setCustomView(View) - */ - public abstract void setSubtitle(CharSequence subtitle); - - /** - * Set the subtitle of the action mode. This method will have no visible effect if - * a custom view has been set. - * - * @param resId Resource ID of a string to set as the subtitle - * - * @see #setSubtitle(CharSequence) - * @see #setCustomView(View) - */ - public abstract void setSubtitle(int resId); - - /** - * Set a custom view for this action mode. The custom view will take the place of - * the title and subtitle. Useful for things like search boxes. - * - * @param view Custom view to use in place of the title/subtitle. - * - * @see #setTitle(CharSequence) - * @see #setSubtitle(CharSequence) - */ - public abstract void setCustomView(View view); - - /** - * Invalidate the action mode and refresh menu content. The mode's - * {@link ActionMode.Callback} will have its - * {@link Callback#onPrepareActionMode(ActionMode, Menu)} method called. - * If it returns true the menu will be scanned for updated content and any relevant changes - * will be reflected to the user. - */ - public abstract void invalidate(); - - /** - * Finish and close this action mode. The action mode's {@link ActionMode.Callback} will - * have its {@link Callback#onDestroyActionMode(ActionMode)} method called. - */ - public abstract void finish(); - - /** - * Returns the menu of actions that this action mode presents. - * @return The action mode's menu. - */ - public abstract Menu getMenu(); - - /** - * Returns the current title of this action mode. - * @return Title text - */ - public abstract CharSequence getTitle(); - - /** - * Returns the current subtitle of this action mode. - * @return Subtitle text - */ - public abstract CharSequence getSubtitle(); - - /** - * Returns the current custom view for this action mode. - * @return The current custom view - */ - public abstract View getCustomView(); - - /** - * Returns a {@link MenuInflater} with the ActionMode's context. - */ - public abstract MenuInflater getMenuInflater(); - - /** - * Returns whether the UI presenting this action mode can take focus or not. - * This is used by internal components within the framework that would otherwise - * present an action mode UI that requires focus, such as an EditText as a custom view. - * - * @return true if the UI used to show this action mode can take focus - * @hide Internal use only - */ - public boolean isUiFocusable() { - return true; - } - - /** - * Callback interface for action modes. Supplied to - * {@link View#startActionMode(Callback)}, a Callback - * configures and handles events raised by a user's interaction with an action mode. - * - *

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

    - *
  • {@link Callback#onCreateActionMode(ActionMode, Menu)} once on initial - * creation
  • - *
  • {@link Callback#onPrepareActionMode(ActionMode, Menu)} after creation - * and any time the {@link ActionMode} is invalidated
  • - *
  • {@link Callback#onActionItemClicked(ActionMode, MenuItem)} any time a - * contextual action button is clicked
  • - *
  • {@link Callback#onDestroyActionMode(ActionMode)} when the action mode - * is closed
  • - *
- */ - public interface Callback { - /** - * Called when action mode is first created. The menu supplied will be used to - * generate action buttons for the action mode. - * - * @param mode ActionMode being created - * @param menu Menu used to populate action buttons - * @return true if the action mode should be created, false if entering this - * mode should be aborted. - */ - public boolean onCreateActionMode(ActionMode mode, Menu menu); - - /** - * Called to refresh an action mode's action menu whenever it is invalidated. - * - * @param mode ActionMode being prepared - * @param menu Menu used to populate action buttons - * @return true if the menu or action mode was updated, false otherwise. - */ - public boolean onPrepareActionMode(ActionMode mode, Menu menu); - - /** - * Called to report a user click on an action button. - * - * @param mode The current ActionMode - * @param item The item that was clicked - * @return true if this callback handled the event, false if the standard MenuItem - * invocation should continue. - */ - public boolean onActionItemClicked(ActionMode mode, MenuItem item); - - /** - * Called when an action mode is about to be exited and destroyed. - * - * @param mode The current ActionMode being destroyed - */ - public void onDestroyActionMode(ActionMode mode); - } -} \ No newline at end of file diff --git a/libs/ActionBarSherlock/src/com/actionbarsherlock/view/ActionProvider.java b/libs/ActionBarSherlock/src/com/actionbarsherlock/view/ActionProvider.java deleted file mode 100644 index ae7cb1f..0000000 --- a/libs/ActionBarSherlock/src/com/actionbarsherlock/view/ActionProvider.java +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.actionbarsherlock.view; - -import android.content.Context; -import android.view.View; - -/** - * This class is a mediator for accomplishing a given task, for example sharing a file. - * It is responsible for creating a view that performs an action that accomplishes the task. - * This class also implements other functions such a performing a default action. - *

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

- *

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

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

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

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

- *

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

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

- *

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

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

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

if {@link #hasSubMenu()} returns true, this method will be called when the - * menu item is selected to prepare the submenu for presentation to the user. Apps - * may use this to create or alter submenu content right before display. - * - * @param subMenu Submenu that will be displayed - */ - public void onPrepareSubMenu(SubMenu subMenu) { - } - - /** - * Notify the system that the visibility of an action view's sub-UI such as - * an anchored popup has changed. This will affect how other system - * visibility notifications occur. - * - * @hide Pending future API approval - */ - public void subUiVisibilityChanged(boolean isVisible) { - if (mSubUiVisibilityListener != null) { - mSubUiVisibilityListener.onSubUiVisibilityChanged(isVisible); - } - } - - /** - * @hide Internal use only - */ - public void setSubUiVisibilityListener(SubUiVisibilityListener listener) { - mSubUiVisibilityListener = listener; - } - - /** - * @hide Internal use only - */ - public interface SubUiVisibilityListener { - public void onSubUiVisibilityChanged(boolean isVisible); - } -} diff --git a/libs/ActionBarSherlock/src/com/actionbarsherlock/view/CollapsibleActionView.java b/libs/ActionBarSherlock/src/com/actionbarsherlock/view/CollapsibleActionView.java deleted file mode 100644 index 43281b0..0000000 --- a/libs/ActionBarSherlock/src/com/actionbarsherlock/view/CollapsibleActionView.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.actionbarsherlock.view; - -/** - * When a {@link View} implements this interface it will receive callbacks - * when expanded or collapsed as an action view alongside the optional, - * app-specified callbacks to {@link OnActionExpandListener}. - * - *

See {@link MenuItem} for more information about action views. - * See {@link android.app.ActionBar} for more information about the action bar. - */ -public interface CollapsibleActionView { - /** - * Called when this view is expanded as an action view. - * See {@link MenuItem#expandActionView()}. - */ - public void onActionViewExpanded(); - - /** - * Called when this view is collapsed as an action view. - * See {@link MenuItem#collapseActionView()}. - */ - public void onActionViewCollapsed(); -} diff --git a/libs/ActionBarSherlock/src/com/actionbarsherlock/view/Menu.java b/libs/ActionBarSherlock/src/com/actionbarsherlock/view/Menu.java deleted file mode 100644 index 951f4cc..0000000 --- a/libs/ActionBarSherlock/src/com/actionbarsherlock/view/Menu.java +++ /dev/null @@ -1,447 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.actionbarsherlock.view; - -import android.content.ComponentName; -import android.content.Intent; -import android.view.KeyEvent; - -/** - * Interface for managing the items in a menu. - *

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

- * Different menu types support different features: - *

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

Developer Guides

- *

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

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

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

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

- * All of the menu items of possible options for the intent will be added - * with the given group and id. You can use the group to control ordering of - * the items in relation to other items in the menu. Normally this function - * will automatically remove any existing items in the menu in the same - * group and place a divider above and below the added items; this behavior - * can be modified with the flags parameter. For each of the - * generated items {@link MenuItem#setIntent} is called to associate the - * appropriate Intent with the item; this means the activity will - * automatically be started for you without having to do anything else. - * - * @param groupId The group identifier that the items should be part of. - * This can also be used to define groups of items for batch state - * changes. Normally use {@link #NONE} if the items should not be in - * a group. - * @param itemId Unique item ID. Use {@link #NONE} if you do not need a - * unique ID. - * @param order The order for the items. Use {@link #NONE} if you do not - * care about the order. See {@link MenuItem#getOrder()}. - * @param caller The current activity component name as defined by - * queryIntentActivityOptions(). - * @param specifics Specific items to place first as defined by - * queryIntentActivityOptions(). - * @param intent Intent describing the kinds of items to populate in the - * list as defined by queryIntentActivityOptions(). - * @param flags Additional options controlling how the items are added. - * @param outSpecificItems Optional array in which to place the menu items - * that were generated for each of the specifics that were - * requested. Entries may be null if no activity was found for that - * specific action. - * @return The number of menu items that were added. - * - * @see #FLAG_APPEND_TO_GROUP - * @see MenuItem#setIntent - * @see android.content.pm.PackageManager#queryIntentActivityOptions - */ - public int addIntentOptions(int groupId, int itemId, int order, - ComponentName caller, Intent[] specifics, - Intent intent, int flags, MenuItem[] outSpecificItems); - - /** - * Remove the item with the given identifier. - * - * @param id The item to be removed. If there is no item with this - * identifier, nothing happens. - */ - public void removeItem(int id); - - /** - * Remove all items in the given group. - * - * @param groupId The group to be removed. If there are no items in this - * group, nothing happens. - */ - public void removeGroup(int groupId); - - /** - * Remove all existing items from the menu, leaving it empty as if it had - * just been created. - */ - public void clear(); - - /** - * Control whether a particular group of items can show a check mark. This - * is similar to calling {@link MenuItem#setCheckable} on all of the menu items - * with the given group identifier, but in addition you can control whether - * this group contains a mutually-exclusive set items. This should be called - * after the items of the group have been added to the menu. - * - * @param group The group of items to operate on. - * @param checkable Set to true to allow a check mark, false to - * disallow. The default is false. - * @param exclusive If set to true, only one item in this group can be - * checked at a time; checking an item will automatically - * uncheck all others in the group. If set to false, each - * item can be checked independently of the others. - * - * @see MenuItem#setCheckable - * @see MenuItem#setChecked - */ - public void setGroupCheckable(int group, boolean checkable, boolean exclusive); - - /** - * Show or hide all menu items that are in the given group. - * - * @param group The group of items to operate on. - * @param visible If true the items are visible, else they are hidden. - * - * @see MenuItem#setVisible - */ - public void setGroupVisible(int group, boolean visible); - - /** - * Enable or disable all menu items that are in the given group. - * - * @param group The group of items to operate on. - * @param enabled If true the items will be enabled, else they will be disabled. - * - * @see MenuItem#setEnabled - */ - public void setGroupEnabled(int group, boolean enabled); - - /** - * Return whether the menu currently has item items that are visible. - * - * @return True if there is one or more item visible, - * else false. - */ - public boolean hasVisibleItems(); - - /** - * Return the menu item with a particular identifier. - * - * @param id The identifier to find. - * - * @return The menu item object, or null if there is no item with - * this identifier. - */ - public MenuItem findItem(int id); - - /** - * Get the number of items in the menu. Note that this will change any - * times items are added or removed from the menu. - * - * @return The item count. - */ - public int size(); - - /** - * Gets the menu item at the given index. - * - * @param index The index of the menu item to return. - * @return The menu item. - * @exception IndexOutOfBoundsException - * when {@code index < 0 || >= size()} - */ - public MenuItem getItem(int index); - - /** - * Closes the menu, if open. - */ - public void close(); - - /** - * Execute the menu item action associated with the given shortcut - * character. - * - * @param keyCode The keycode of the shortcut key. - * @param event Key event message. - * @param flags Additional option flags or 0. - * - * @return If the given shortcut exists and is shown, returns - * true; else returns false. - * - * @see #FLAG_PERFORM_NO_CLOSE - */ - public boolean performShortcut(int keyCode, KeyEvent event, int flags); - - /** - * Is a keypress one of the defined shortcut keys for this window. - * @param keyCode the key code from {@link KeyEvent} to check. - * @param event the {@link KeyEvent} to use to help check. - */ - boolean isShortcutKey(int keyCode, KeyEvent event); - - /** - * Execute the menu item action associated with the given menu identifier. - * - * @param id Identifier associated with the menu item. - * @param flags Additional option flags or 0. - * - * @return If the given identifier exists and is shown, returns - * true; else returns false. - * - * @see #FLAG_PERFORM_NO_CLOSE - */ - public boolean performIdentifierAction(int id, int flags); - - - /** - * Control whether the menu should be running in qwerty mode (alphabetic - * shortcuts) or 12-key mode (numeric shortcuts). - * - * @param isQwerty If true the menu will use alphabetic shortcuts; else it - * will use numeric shortcuts. - */ - public void setQwertyMode(boolean isQwerty); -} - diff --git a/libs/ActionBarSherlock/src/com/actionbarsherlock/view/MenuInflater.java b/libs/ActionBarSherlock/src/com/actionbarsherlock/view/MenuInflater.java deleted file mode 100644 index 5a0f408..0000000 --- a/libs/ActionBarSherlock/src/com/actionbarsherlock/view/MenuInflater.java +++ /dev/null @@ -1,495 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * 2011 Jake Wharton - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.actionbarsherlock.view; - -import java.io.IOException; -import java.lang.reflect.Constructor; -import java.lang.reflect.Method; -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlPullParserException; -import android.content.Context; -import android.content.res.TypedArray; -import android.content.res.XmlResourceParser; -import android.util.AttributeSet; -import android.util.Log; -import android.util.TypedValue; -import android.util.Xml; -import android.view.InflateException; -import android.view.View; - -import com.actionbarsherlock.R; -import com.actionbarsherlock.internal.view.menu.MenuItemImpl; - -/** - * This class is used to instantiate menu XML files into Menu objects. - *

- * For performance reasons, menu inflation relies heavily on pre-processing of - * XML files that is done at build time. Therefore, it is not currently possible - * to use MenuInflater with an XmlPullParser over a plain XML file at runtime; - * it only works with an XmlPullParser returned from a compiled resource (R. - * something file.) - */ -public class MenuInflater { - private static final String LOG_TAG = "MenuInflater"; - - /** Menu tag name in XML. */ - private static final String XML_MENU = "menu"; - - /** Group tag name in XML. */ - private static final String XML_GROUP = "group"; - - /** Item tag name in XML. */ - private static final String XML_ITEM = "item"; - - private static final int NO_ID = 0; - - private static final Class[] ACTION_VIEW_CONSTRUCTOR_SIGNATURE = new Class[] {Context.class}; - - private static final Class[] ACTION_PROVIDER_CONSTRUCTOR_SIGNATURE = ACTION_VIEW_CONSTRUCTOR_SIGNATURE; - - private final Object[] mActionViewConstructorArguments; - - private final Object[] mActionProviderConstructorArguments; - - private Context mContext; - private Object mRealOwner; - - /** - * Constructs a menu inflater. - * - * @see Activity#getMenuInflater() - */ - public MenuInflater(Context context) { - mContext = context; - mRealOwner = context; - mActionViewConstructorArguments = new Object[] {context}; - mActionProviderConstructorArguments = mActionViewConstructorArguments; - } - - /** - * Constructs a menu inflater. - * - * @see Activity#getMenuInflater() - * @hide - */ - public MenuInflater(Context context, Object realOwner) { - mContext = context; - mRealOwner = realOwner; - mActionViewConstructorArguments = new Object[] {context}; - mActionProviderConstructorArguments = mActionViewConstructorArguments; - } - - /** - * Inflate a menu hierarchy from the specified XML resource. Throws - * {@link InflateException} if there is an error. - * - * @param menuRes Resource ID for an XML layout resource to load (e.g., - * R.menu.main_activity) - * @param menu The Menu to inflate into. The items and submenus will be - * added to this Menu. - */ - public void inflate(int menuRes, Menu menu) { - XmlResourceParser parser = null; - try { - parser = mContext.getResources().getLayout(menuRes); - AttributeSet attrs = Xml.asAttributeSet(parser); - - parseMenu(parser, attrs, menu); - } catch (XmlPullParserException e) { - throw new InflateException("Error inflating menu XML", e); - } catch (IOException e) { - throw new InflateException("Error inflating menu XML", e); - } finally { - if (parser != null) parser.close(); - } - } - - /** - * Called internally to fill the given menu. If a sub menu is seen, it will - * call this recursively. - */ - private void parseMenu(XmlPullParser parser, AttributeSet attrs, Menu menu) - throws XmlPullParserException, IOException { - MenuState menuState = new MenuState(menu); - - int eventType = parser.getEventType(); - String tagName; - boolean lookingForEndOfUnknownTag = false; - String unknownTagName = null; - - // This loop will skip to the menu start tag - do { - if (eventType == XmlPullParser.START_TAG) { - tagName = parser.getName(); - if (tagName.equals(XML_MENU)) { - // Go to next tag - eventType = parser.next(); - break; - } - - throw new RuntimeException("Expecting menu, got " + tagName); - } - eventType = parser.next(); - } while (eventType != XmlPullParser.END_DOCUMENT); - - boolean reachedEndOfMenu = false; - while (!reachedEndOfMenu) { - switch (eventType) { - case XmlPullParser.START_TAG: - if (lookingForEndOfUnknownTag) { - break; - } - - tagName = parser.getName(); - if (tagName.equals(XML_GROUP)) { - menuState.readGroup(attrs); - } else if (tagName.equals(XML_ITEM)) { - menuState.readItem(attrs); - } else if (tagName.equals(XML_MENU)) { - // A menu start tag denotes a submenu for an item - SubMenu subMenu = menuState.addSubMenuItem(); - - // Parse the submenu into returned SubMenu - parseMenu(parser, attrs, subMenu); - } else { - lookingForEndOfUnknownTag = true; - unknownTagName = tagName; - } - break; - - case XmlPullParser.END_TAG: - tagName = parser.getName(); - if (lookingForEndOfUnknownTag && tagName.equals(unknownTagName)) { - lookingForEndOfUnknownTag = false; - unknownTagName = null; - } else if (tagName.equals(XML_GROUP)) { - menuState.resetGroup(); - } else if (tagName.equals(XML_ITEM)) { - // Add the item if it hasn't been added (if the item was - // a submenu, it would have been added already) - if (!menuState.hasAddedItem()) { - if (menuState.itemActionProvider != null && - menuState.itemActionProvider.hasSubMenu()) { - menuState.addSubMenuItem(); - } else { - menuState.addItem(); - } - } - } else if (tagName.equals(XML_MENU)) { - reachedEndOfMenu = true; - } - break; - - case XmlPullParser.END_DOCUMENT: - throw new RuntimeException("Unexpected end of document"); - } - - eventType = parser.next(); - } - } - - private static class InflatedOnMenuItemClickListener - implements MenuItem.OnMenuItemClickListener { - private static final Class[] PARAM_TYPES = new Class[] { MenuItem.class }; - - private Object mRealOwner; - private Method mMethod; - - public InflatedOnMenuItemClickListener(Object realOwner, String methodName) { - mRealOwner = realOwner; - Class c = realOwner.getClass(); - try { - mMethod = c.getMethod(methodName, PARAM_TYPES); - } catch (Exception e) { - InflateException ex = new InflateException( - "Couldn't resolve menu item onClick handler " + methodName + - " in class " + c.getName()); - ex.initCause(e); - throw ex; - } - } - - public boolean onMenuItemClick(MenuItem item) { - try { - if (mMethod.getReturnType() == Boolean.TYPE) { - return (Boolean) mMethod.invoke(mRealOwner, item); - } else { - mMethod.invoke(mRealOwner, item); - return true; - } - } catch (Exception e) { - throw new RuntimeException(e); - } - } - } - - /** - * State for the current menu. - *

- * Groups can not be nested unless there is another menu (which will have - * its state class). - */ - private class MenuState { - private Menu menu; - - /* - * Group state is set on items as they are added, allowing an item to - * override its group state. (As opposed to set on items at the group end tag.) - */ - private int groupId; - private int groupCategory; - private int groupOrder; - private int groupCheckable; - private boolean groupVisible; - private boolean groupEnabled; - - private boolean itemAdded; - private int itemId; - private int itemCategoryOrder; - private CharSequence itemTitle; - private CharSequence itemTitleCondensed; - private int itemIconResId; - private char itemAlphabeticShortcut; - private char itemNumericShortcut; - /** - * Sync to attrs.xml enum: - * - 0: none - * - 1: all - * - 2: exclusive - */ - private int itemCheckable; - private boolean itemChecked; - private boolean itemVisible; - private boolean itemEnabled; - - /** - * Sync to attrs.xml enum, values in MenuItem: - * - 0: never - * - 1: ifRoom - * - 2: always - * - -1: Safe sentinel for "no value". - */ - private int itemShowAsAction; - - private int itemActionViewLayout; - private String itemActionViewClassName; - private String itemActionProviderClassName; - - private String itemListenerMethodName; - - private ActionProvider itemActionProvider; - - private static final int defaultGroupId = NO_ID; - private static final int defaultItemId = NO_ID; - private static final int defaultItemCategory = 0; - private static final int defaultItemOrder = 0; - private static final int defaultItemCheckable = 0; - private static final boolean defaultItemChecked = false; - private static final boolean defaultItemVisible = true; - private static final boolean defaultItemEnabled = true; - - public MenuState(final Menu menu) { - this.menu = menu; - - resetGroup(); - } - - public void resetGroup() { - groupId = defaultGroupId; - groupCategory = defaultItemCategory; - groupOrder = defaultItemOrder; - groupCheckable = defaultItemCheckable; - groupVisible = defaultItemVisible; - groupEnabled = defaultItemEnabled; - } - - /** - * Called when the parser is pointing to a group tag. - */ - public void readGroup(AttributeSet attrs) { - TypedArray a = mContext.obtainStyledAttributes(attrs, - R.styleable.SherlockMenuGroup); - - groupId = a.getResourceId(R.styleable.SherlockMenuGroup_android_id, defaultGroupId); - groupCategory = a.getInt(R.styleable.SherlockMenuGroup_android_menuCategory, defaultItemCategory); - groupOrder = a.getInt(R.styleable.SherlockMenuGroup_android_orderInCategory, defaultItemOrder); - groupCheckable = a.getInt(R.styleable.SherlockMenuGroup_android_checkableBehavior, defaultItemCheckable); - groupVisible = a.getBoolean(R.styleable.SherlockMenuGroup_android_visible, defaultItemVisible); - groupEnabled = a.getBoolean(R.styleable.SherlockMenuGroup_android_enabled, defaultItemEnabled); - - a.recycle(); - } - - /** - * Called when the parser is pointing to an item tag. - */ - public void readItem(AttributeSet attrs) { - TypedArray a = mContext.obtainStyledAttributes(attrs, - R.styleable.SherlockMenuItem); - - // Inherit attributes from the group as default value - itemId = a.getResourceId(R.styleable.SherlockMenuItem_android_id, defaultItemId); - final int category = a.getInt(R.styleable.SherlockMenuItem_android_menuCategory, groupCategory); - final int order = a.getInt(R.styleable.SherlockMenuItem_android_orderInCategory, groupOrder); - itemCategoryOrder = (category & Menu.CATEGORY_MASK) | (order & Menu.USER_MASK); - itemTitle = a.getText(R.styleable.SherlockMenuItem_android_title); - itemTitleCondensed = a.getText(R.styleable.SherlockMenuItem_android_titleCondensed); - itemIconResId = a.getResourceId(R.styleable.SherlockMenuItem_android_icon, 0); - itemAlphabeticShortcut = - getShortcut(a.getString(R.styleable.SherlockMenuItem_android_alphabeticShortcut)); - itemNumericShortcut = - getShortcut(a.getString(R.styleable.SherlockMenuItem_android_numericShortcut)); - if (a.hasValue(R.styleable.SherlockMenuItem_android_checkable)) { - // Item has attribute checkable, use it - itemCheckable = a.getBoolean(R.styleable.SherlockMenuItem_android_checkable, false) ? 1 : 0; - } else { - // Item does not have attribute, use the group's (group can have one more state - // for checkable that represents the exclusive checkable) - itemCheckable = groupCheckable; - } - - itemChecked = a.getBoolean(R.styleable.SherlockMenuItem_android_checked, defaultItemChecked); - itemVisible = a.getBoolean(R.styleable.SherlockMenuItem_android_visible, groupVisible); - itemEnabled = a.getBoolean(R.styleable.SherlockMenuItem_android_enabled, groupEnabled); - - TypedValue value = new TypedValue(); - a.getValue(R.styleable.SherlockMenuItem_android_showAsAction, value); - itemShowAsAction = value.type == TypedValue.TYPE_INT_HEX ? value.data : -1; - - itemListenerMethodName = a.getString(R.styleable.SherlockMenuItem_android_onClick); - itemActionViewLayout = a.getResourceId(R.styleable.SherlockMenuItem_android_actionLayout, 0); - - // itemActionViewClassName = a.getString(R.styleable.SherlockMenuItem_android_actionViewClass); - value = new TypedValue(); - a.getValue(R.styleable.SherlockMenuItem_android_actionViewClass, value); - itemActionViewClassName = value.type == TypedValue.TYPE_STRING ? value.string.toString() : null; - - // itemActionProviderClassName = a.getString(R.styleable.SherlockMenuItem_android_actionProviderClass); - value = new TypedValue(); - a.getValue(R.styleable.SherlockMenuItem_android_actionProviderClass, value); - itemActionProviderClassName = value.type == TypedValue.TYPE_STRING ? value.string.toString() : null; - - final boolean hasActionProvider = itemActionProviderClassName != null; - if (hasActionProvider && itemActionViewLayout == 0 && itemActionViewClassName == null) { - itemActionProvider = newInstance(itemActionProviderClassName, - ACTION_PROVIDER_CONSTRUCTOR_SIGNATURE, - mActionProviderConstructorArguments); - } else { - if (hasActionProvider) { - Log.w(LOG_TAG, "Ignoring attribute 'actionProviderClass'." - + " Action view already specified."); - } - itemActionProvider = null; - } - - a.recycle(); - - itemAdded = false; - } - - private char getShortcut(String shortcutString) { - if (shortcutString == null) { - return 0; - } else { - return shortcutString.charAt(0); - } - } - - private void setItem(MenuItem item) { - item.setChecked(itemChecked) - .setVisible(itemVisible) - .setEnabled(itemEnabled) - .setCheckable(itemCheckable >= 1) - .setTitleCondensed(itemTitleCondensed) - .setIcon(itemIconResId) - .setAlphabeticShortcut(itemAlphabeticShortcut) - .setNumericShortcut(itemNumericShortcut); - - if (itemShowAsAction >= 0) { - item.setShowAsAction(itemShowAsAction); - } - - if (itemListenerMethodName != null) { - if (mContext.isRestricted()) { - throw new IllegalStateException("The android:onClick attribute cannot " - + "be used within a restricted context"); - } - item.setOnMenuItemClickListener( - new InflatedOnMenuItemClickListener(mRealOwner, itemListenerMethodName)); - } - - if (itemCheckable >= 2) { - if (item instanceof MenuItemImpl) { - MenuItemImpl impl = (MenuItemImpl) item; - impl.setExclusiveCheckable(true); - } else { - menu.setGroupCheckable(groupId, true, true); - } - } - - boolean actionViewSpecified = false; - if (itemActionViewClassName != null) { - View actionView = (View) newInstance(itemActionViewClassName, - ACTION_VIEW_CONSTRUCTOR_SIGNATURE, mActionViewConstructorArguments); - item.setActionView(actionView); - actionViewSpecified = true; - } - if (itemActionViewLayout > 0) { - if (!actionViewSpecified) { - item.setActionView(itemActionViewLayout); - actionViewSpecified = true; - } else { - Log.w(LOG_TAG, "Ignoring attribute 'itemActionViewLayout'." - + " Action view already specified."); - } - } - if (itemActionProvider != null) { - item.setActionProvider(itemActionProvider); - } - } - - public void addItem() { - itemAdded = true; - setItem(menu.add(groupId, itemId, itemCategoryOrder, itemTitle)); - } - - public SubMenu addSubMenuItem() { - itemAdded = true; - SubMenu subMenu = menu.addSubMenu(groupId, itemId, itemCategoryOrder, itemTitle); - setItem(subMenu.getItem()); - return subMenu; - } - - public boolean hasAddedItem() { - return itemAdded; - } - - @SuppressWarnings("unchecked") - private T newInstance(String className, Class[] constructorSignature, - Object[] arguments) { - try { - Class clazz = mContext.getClassLoader().loadClass(className); - Constructor constructor = clazz.getConstructor(constructorSignature); - return (T) constructor.newInstance(arguments); - } catch (Exception e) { - Log.w(LOG_TAG, "Cannot instantiate class: " + className, e); - } - return null; - } - } -} diff --git a/libs/ActionBarSherlock/src/com/actionbarsherlock/view/MenuItem.java b/libs/ActionBarSherlock/src/com/actionbarsherlock/view/MenuItem.java deleted file mode 100644 index 7fc3aa4..0000000 --- a/libs/ActionBarSherlock/src/com/actionbarsherlock/view/MenuItem.java +++ /dev/null @@ -1,598 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.actionbarsherlock.view; - -import android.content.Intent; -import android.graphics.drawable.Drawable; -import android.view.ContextMenu.ContextMenuInfo; -import android.view.View; - -/** - * Interface for direct access to a previously created menu item. - *

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

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

- *

Developer Guides

- *

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

- *
- */ -public interface MenuItem { - /* - * These should be kept in sync with attrs.xml enum constants for showAsAction - */ - /** Never show this item as a button in an Action Bar. */ - public static final int SHOW_AS_ACTION_NEVER = android.view.MenuItem.SHOW_AS_ACTION_NEVER; - /** Show this item as a button in an Action Bar if the system decides there is room for it. */ - public static final int SHOW_AS_ACTION_IF_ROOM = android.view.MenuItem.SHOW_AS_ACTION_IF_ROOM; - /** - * Always show this item as a button in an Action Bar. - * Use sparingly! If too many items are set to always show in the Action Bar it can - * crowd the Action Bar and degrade the user experience on devices with smaller screens. - * A good rule of thumb is to have no more than 2 items set to always show at a time. - */ - public static final int SHOW_AS_ACTION_ALWAYS = android.view.MenuItem.SHOW_AS_ACTION_ALWAYS; - - /** - * When this item is in the action bar, always show it with a text label even if - * it also has an icon specified. - */ - public static final int SHOW_AS_ACTION_WITH_TEXT = android.view.MenuItem.SHOW_AS_ACTION_WITH_TEXT; - - /** - * This item's action view collapses to a normal menu item. - * When expanded, the action view temporarily takes over - * a larger segment of its container. - */ - public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = android.view.MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW; - - /** - * Interface definition for a callback to be invoked when a menu item is - * clicked. - * - * @see Activity#onContextItemSelected(MenuItem) - * @see Activity#onOptionsItemSelected(MenuItem) - */ - public interface OnMenuItemClickListener { - /** - * Called when a menu item has been invoked. This is the first code - * that is executed; if it returns true, no other callbacks will be - * executed. - * - * @param item The menu item that was invoked. - * - * @return Return true to consume this click and prevent others from - * executing. - */ - public boolean onMenuItemClick(MenuItem item); - } - - /** - * Interface definition for a callback to be invoked when a menu item - * marked with {@link MenuItem#SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW} is - * expanded or collapsed. - * - * @see MenuItem#expandActionView() - * @see MenuItem#collapseActionView() - * @see MenuItem#setShowAsActionFlags(int) - */ - public interface OnActionExpandListener { - /** - * Called when a menu item with {@link MenuItem#SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW} - * is expanded. - * @param item Item that was expanded - * @return true if the item should expand, false if expansion should be suppressed. - */ - public boolean onMenuItemActionExpand(MenuItem item); - - /** - * Called when a menu item with {@link MenuItem#SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW} - * is collapsed. - * @param item Item that was collapsed - * @return true if the item should collapse, false if collapsing should be suppressed. - */ - public boolean onMenuItemActionCollapse(MenuItem item); - } - - /** - * Return the identifier for this menu item. The identifier can not - * be changed after the menu is created. - * - * @return The menu item's identifier. - */ - public int getItemId(); - - /** - * Return the group identifier that this menu item is part of. The group - * identifier can not be changed after the menu is created. - * - * @return The menu item's group identifier. - */ - public int getGroupId(); - - /** - * Return the category and order within the category of this item. This - * item will be shown before all items (within its category) that have - * order greater than this value. - *

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

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

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

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

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

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

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

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

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

Note: This method differs from {@link #setShowAsAction(int)} only in that it - * returns the current MenuItem instance for call chaining. - * - * @param actionEnum How the item should display. One of - * {@link #SHOW_AS_ACTION_ALWAYS}, {@link #SHOW_AS_ACTION_IF_ROOM}, or - * {@link #SHOW_AS_ACTION_NEVER}. SHOW_AS_ACTION_NEVER is the default. - * - * @see android.app.ActionBar - * @see #setActionView(View) - * @return This MenuItem instance for call chaining. - */ - public MenuItem setShowAsActionFlags(int actionEnum); - - /** - * Set an action view for this menu item. An action view will be displayed in place - * of an automatically generated menu item element in the UI when this item is shown - * as an action within a parent. - *

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

- * - * @param view View to use for presenting this item to the user. - * @return This Item so additional setters can be called. - * - * @see #setShowAsAction(int) - */ - public MenuItem setActionView(View view); - - /** - * Set an action view for this menu item. An action view will be displayed in place - * of an automatically generated menu item element in the UI when this item is shown - * as an action within a parent. - *

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

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

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

- * - * @param actionProvider The action provider. - * @return This Item so additional setters can be called. - * - * @see ActionProvider - */ - public MenuItem setActionProvider(ActionProvider actionProvider); - - /** - * Gets the {@link ActionProvider}. - * - * @return The action provider. - * - * @see ActionProvider - * @see #setActionProvider(ActionProvider) - */ - public ActionProvider getActionProvider(); - - /** - * Expand the action view associated with this menu item. - * The menu item must have an action view set, as well as - * the showAsAction flag {@link #SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW}. - * If a listener has been set using {@link #setOnActionExpandListener(OnActionExpandListener)} - * it will have its {@link OnActionExpandListener#onMenuItemActionExpand(MenuItem)} - * method invoked. The listener may return false from this method to prevent expanding - * the action view. - * - * @return true if the action view was expanded, false otherwise. - */ - public boolean expandActionView(); - - /** - * Collapse the action view associated with this menu item. - * The menu item must have an action view set, as well as the showAsAction flag - * {@link #SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW}. If a listener has been set using - * {@link #setOnActionExpandListener(OnActionExpandListener)} it will have its - * {@link OnActionExpandListener#onMenuItemActionCollapse(MenuItem)} method invoked. - * The listener may return false from this method to prevent collapsing the action view. - * - * @return true if the action view was collapsed, false otherwise. - */ - public boolean collapseActionView(); - - /** - * Returns true if this menu item's action view has been expanded. - * - * @return true if the item's action view is expanded, false otherwise. - * - * @see #expandActionView() - * @see #collapseActionView() - * @see #SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW - * @see OnActionExpandListener - */ - public boolean isActionViewExpanded(); - - /** - * Set an {@link OnActionExpandListener} on this menu item to be notified when - * the associated action view is expanded or collapsed. The menu item must - * be configured to expand or collapse its action view using the flag - * {@link #SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW}. - * - * @param listener Listener that will respond to expand/collapse events - * @return This menu item instance for call chaining - */ - public MenuItem setOnActionExpandListener(OnActionExpandListener listener); -} \ No newline at end of file diff --git a/libs/ActionBarSherlock/src/com/actionbarsherlock/view/SubMenu.java b/libs/ActionBarSherlock/src/com/actionbarsherlock/view/SubMenu.java deleted file mode 100644 index 397fd1c..0000000 --- a/libs/ActionBarSherlock/src/com/actionbarsherlock/view/SubMenu.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (C) 2007 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.actionbarsherlock.view; - -import android.graphics.drawable.Drawable; -import android.view.View; - -/** - * Subclass of {@link Menu} for sub menus. - *

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

- *

Developer Guides

- *

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

- *
- */ - -public interface SubMenu extends Menu { - /** - * Sets the submenu header's title to the title given in titleRes - * resource identifier. - * - * @param titleRes The string resource identifier used for the title. - * @return This SubMenu so additional setters can be called. - */ - public SubMenu setHeaderTitle(int titleRes); - - /** - * Sets the submenu header's title to the title given in title. - * - * @param title The character sequence used for the title. - * @return This SubMenu so additional setters can be called. - */ - public SubMenu setHeaderTitle(CharSequence title); - - /** - * Sets the submenu header's icon to the icon given in iconRes - * resource id. - * - * @param iconRes The resource identifier used for the icon. - * @return This SubMenu so additional setters can be called. - */ - public SubMenu setHeaderIcon(int iconRes); - - /** - * Sets the submenu header's icon to the icon given in icon - * {@link Drawable}. - * - * @param icon The {@link Drawable} used for the icon. - * @return This SubMenu so additional setters can be called. - */ - public SubMenu setHeaderIcon(Drawable icon); - - /** - * Sets the header of the submenu to the {@link View} given in - * view. This replaces the header title and icon (and those - * replace this). - * - * @param view The {@link View} used for the header. - * @return This SubMenu so additional setters can be called. - */ - public SubMenu setHeaderView(View view); - - /** - * Clears the header of the submenu. - */ - public void clearHeader(); - - /** - * Change the icon associated with this submenu's item in its parent menu. - * - * @see MenuItem#setIcon(int) - * @param iconRes The new icon (as a resource ID) to be displayed. - * @return This SubMenu so additional setters can be called. - */ - public SubMenu setIcon(int iconRes); - - /** - * Change the icon associated with this submenu's item in its parent menu. - * - * @see MenuItem#setIcon(Drawable) - * @param icon The new icon (as a Drawable) to be displayed. - * @return This SubMenu so additional setters can be called. - */ - public SubMenu setIcon(Drawable icon); - - /** - * Gets the {@link MenuItem} that represents this submenu in the parent - * menu. Use this for setting additional item attributes. - * - * @return The {@link MenuItem} that launches the submenu when invoked. - */ - public MenuItem getItem(); -} diff --git a/libs/ActionBarSherlock/src/com/actionbarsherlock/view/Window.java b/libs/ActionBarSherlock/src/com/actionbarsherlock/view/Window.java deleted file mode 100644 index a340a42..0000000 --- a/libs/ActionBarSherlock/src/com/actionbarsherlock/view/Window.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * Copyright (C) 2011 Jake Wharton - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.actionbarsherlock.view; - -import android.content.Context; - -/** - *

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

- * - *

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

- */ -public abstract class Window extends android.view.Window { - public static final long FEATURE_ACTION_BAR = android.view.Window.FEATURE_ACTION_BAR; - public static final long FEATURE_ACTION_BAR_OVERLAY = android.view.Window.FEATURE_ACTION_BAR_OVERLAY; - public static final long FEATURE_ACTION_MODE_OVERLAY = android.view.Window.FEATURE_ACTION_MODE_OVERLAY; - public static final long FEATURE_NO_TITLE = android.view.Window.FEATURE_NO_TITLE; - public static final long FEATURE_PROGRESS = android.view.Window.FEATURE_PROGRESS; - public static final long FEATURE_INDETERMINATE_PROGRESS = android.view.Window.FEATURE_INDETERMINATE_PROGRESS; - - /** - * Create a new instance for a context. - * - * @param context Context. - */ - private Window(Context context) { - super(context); - } - - - public interface Callback { - /** - * Called when a panel's menu item has been selected by the user. - * - * @param featureId The panel that the menu is in. - * @param item The menu item that was selected. - * - * @return boolean Return true to finish processing of selection, or - * false to perform the normal menu handling (calling its - * Runnable or sending a Message to its target Handler). - */ - public boolean onMenuItemSelected(int featureId, MenuItem item); - } -} diff --git a/libs/ActionBarSherlock/src/com/actionbarsherlock/widget/ActivityChooserModel.java b/libs/ActionBarSherlock/src/com/actionbarsherlock/widget/ActivityChooserModel.java deleted file mode 100644 index d7f110f..0000000 --- a/libs/ActionBarSherlock/src/com/actionbarsherlock/widget/ActivityChooserModel.java +++ /dev/null @@ -1,1104 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.actionbarsherlock.widget; - -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.pm.ResolveInfo; -import android.database.DataSetObservable; -import android.os.Handler; -import android.text.TextUtils; -import android.util.Log; -import android.util.Xml; -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlPullParserException; -import org.xmlpull.v1.XmlSerializer; - -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.Executor; -import java.util.concurrent.Executors; - -/** - *

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

- *

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

- *

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

- *

- *

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

- *

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

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

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

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

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

- * - *

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- *

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

- * - *
- *

Developer Guides

- *

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

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

The default value is true.

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

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

- *

- *

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

- *

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

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

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

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

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

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

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

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

- *

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

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

- * - * @param refineWhat which queries to refine. Possible values are {@link #REFINE_NONE}, - * {@link #REFINE_BY_ENTRY}, and {@link #REFINE_ALL}. - */ - public void setQueryRefinement(int refineWhat) { - mQueryRefinement = refineWhat; - } - - /** - * Returns the current query refinement preference. - * @return value of query refinement preference - */ - public int getQueryRefinement() { - return mQueryRefinement; - } - - /** - * Overridden to always return false, since we cannot be sure that - * suggestion sources return stable IDs. - */ - @Override - public boolean hasStableIds() { - return false; - } - - /** - * Use the search suggestions provider to obtain a live cursor. This will be called - * in a worker thread, so it's OK if the query is slow (e.g. round trip for suggestions). - * The results will be processed in the UI thread and changeCursor() will be called. - */ - @Override - public Cursor runQueryOnBackgroundThread(CharSequence constraint) { - if (DBG) Log.d(LOG_TAG, "runQueryOnBackgroundThread(" + constraint + ")"); - String query = (constraint == null) ? "" : constraint.toString(); - /** - * for in app search we show the progress spinner until the cursor is returned with - * the results. - */ - Cursor cursor = null; - if (mSearchView.getVisibility() != View.VISIBLE - || mSearchView.getWindowVisibility() != View.VISIBLE) { - return null; - } - //mSearchView.getWindow().getDecorView().post(mStartSpinnerRunnable); // TODO: - try { - cursor = getSuggestions(query, QUERY_LIMIT); - // trigger fill window so the spinner stays up until the results are copied over and - // closer to being ready - if (cursor != null) { - cursor.getCount(); - return cursor; - } - } catch (RuntimeException e) { - Log.w(LOG_TAG, "Search suggestions query threw an exception.", e); - } - // If cursor is null or an exception was thrown, stop the spinner and return null. - // changeCursor doesn't get called if cursor is null - // mSearchView.getWindow().getDecorView().post(mStopSpinnerRunnable); // TODO: - return null; - } - - public Cursor getSuggestions(String query, int limit) { - Uri.Builder uriBuilder = new Uri.Builder() - .scheme(ContentResolver.SCHEME_CONTENT) - .query("") // TODO: Remove, workaround for a bug in Uri.writeToParcel() - .fragment(""); // TODO: Remove, workaround for a bug in Uri.writeToParcel() - - // append standard suggestion query path - uriBuilder.appendPath(SearchManager.SUGGEST_URI_PATH_QUERY); - - // inject query, either as selection args or inline - uriBuilder.appendPath(query); - - if (limit > 0) { - uriBuilder.appendQueryParameter(SearchManager.SUGGEST_PARAMETER_LIMIT, String.valueOf(limit)); - } - - Uri uri = uriBuilder.build(); - - // finally, make the query - return mContext.getContentResolver().query(uri, null, null, null, null); - } - - public void close() { - if (DBG) Log.d(LOG_TAG, "close()"); - changeCursor(null); - mClosed = true; - } - - @Override - public void notifyDataSetChanged() { - if (DBG) Log.d(LOG_TAG, "notifyDataSetChanged"); - super.notifyDataSetChanged(); - - // mSearchView.onDataSetChanged(); // TODO: - - updateSpinnerState(getCursor()); - } - - @Override - public void notifyDataSetInvalidated() { - if (DBG) Log.d(LOG_TAG, "notifyDataSetInvalidated"); - super.notifyDataSetInvalidated(); - - updateSpinnerState(getCursor()); - } - - private void updateSpinnerState(Cursor cursor) { - Bundle extras = cursor != null ? cursor.getExtras() : null; - if (DBG) { - Log.d(LOG_TAG, "updateSpinnerState - extra = " - + (extras != null - ? extras.getBoolean(SearchManager.CURSOR_EXTRA_KEY_IN_PROGRESS) - : null)); - } - // Check if the Cursor indicates that the query is not complete and show the spinner - if (extras != null - && extras.getBoolean(SearchManager.CURSOR_EXTRA_KEY_IN_PROGRESS)) { - // mSearchView.getWindow().getDecorView().post(mStartSpinnerRunnable); // TODO: - return; - } - // If cursor is null or is done, stop the spinner - // mSearchView.getWindow().getDecorView().post(mStopSpinnerRunnable); // TODO: - } - - /** - * Cache columns. - */ - @Override - public void changeCursor(Cursor c) { - if (DBG) Log.d(LOG_TAG, "changeCursor(" + c + ")"); - - if (mClosed) { - Log.w(LOG_TAG, "Tried to change cursor after adapter was closed."); - if (c != null) c.close(); - return; - } - - try { - super.changeCursor(c); - - if (c != null) { - mText1Col = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_1); - mText2Col = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_2); - mText2UrlCol = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_2_URL); - mIconName1Col = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_ICON_1); - mIconName2Col = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_ICON_2); - mFlagsCol = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_FLAGS); - } - } catch (Exception e) { - Log.e(LOG_TAG, "error changing cursor and caching columns", e); - } - } - - /** - * Tags the view with cached child view look-ups. - */ - @Override - public View newView(Context context, Cursor cursor, ViewGroup parent) { - View v = super.newView(context, cursor, parent); - v.setTag(new ChildViewCache(v)); - return v; - } - - /** - * Cache of the child views of drop-drown list items, to avoid looking up the children - * each time the contents of a list item are changed. - */ - private final static class ChildViewCache { - public final TextView mText1; - public final TextView mText2; - public final ImageView mIcon1; - public final ImageView mIcon2; - public final ImageView mIconRefine; - - public ChildViewCache(View v) { - mText1 = (TextView) v.findViewById(android.R.id.text1); - mText2 = (TextView) v.findViewById(android.R.id.text2); - mIcon1 = (ImageView) v.findViewById(android.R.id.icon1); - mIcon2 = (ImageView) v.findViewById(android.R.id.icon2); - mIconRefine = (ImageView) v.findViewById(R.id.edit_query); - } - } - - @Override - public void bindView(View view, Context context, Cursor cursor) { - ChildViewCache views = (ChildViewCache) view.getTag(); - - int flags = 0; - if (mFlagsCol != INVALID_INDEX) { - flags = cursor.getInt(mFlagsCol); - } - if (views.mText1 != null) { - String text1 = getStringOrNull(cursor, mText1Col); - setViewText(views.mText1, text1); - } - if (views.mText2 != null) { - // First check TEXT_2_URL - CharSequence text2 = getStringOrNull(cursor, mText2UrlCol); - if (text2 != null) { - text2 = formatUrl(text2); - } else { - text2 = getStringOrNull(cursor, mText2Col); - } - - // If no second line of text is indicated, allow the first line of text - // to be up to two lines if it wants to be. - if (TextUtils.isEmpty(text2)) { - if (views.mText1 != null) { - views.mText1.setSingleLine(false); - views.mText1.setMaxLines(2); - } - } else { - if (views.mText1 != null) { - views.mText1.setSingleLine(true); - views.mText1.setMaxLines(1); - } - } - setViewText(views.mText2, text2); - } - - if (views.mIcon1 != null) { - setViewDrawable(views.mIcon1, getIcon1(cursor), View.INVISIBLE); - } - if (views.mIcon2 != null) { - setViewDrawable(views.mIcon2, getIcon2(cursor), View.GONE); - } - if (mQueryRefinement == REFINE_ALL - || (mQueryRefinement == REFINE_BY_ENTRY - && (flags & SearchManager.FLAG_QUERY_REFINEMENT) != 0)) { - views.mIconRefine.setVisibility(View.VISIBLE); - views.mIconRefine.setTag(views.mText1.getText()); - views.mIconRefine.setOnClickListener(this); - } else { - views.mIconRefine.setVisibility(View.GONE); - } - } - - public void onClick(View v) { - Object tag = v.getTag(); - if (tag instanceof CharSequence) { - mSearchView.onQueryRefine((CharSequence) tag); - } - } - - private CharSequence formatUrl(CharSequence url) { - if (mUrlColor == null) { - // Lazily get the URL color from the current theme. - TypedValue colorValue = new TypedValue(); - mContext.getTheme().resolveAttribute(R.attr.textColorSearchUrl, colorValue, true); - mUrlColor = mContext.getResources().getColorStateList(colorValue.resourceId); - } - - SpannableString text = new SpannableString(url); - text.setSpan(new TextAppearanceSpan(null, 0, 0, mUrlColor, null), - 0, url.length(), - Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); - return text; - } - - private void setViewText(TextView v, CharSequence text) { - // Set the text even if it's null, since we need to clear any previous text. - v.setText(text); - - if (TextUtils.isEmpty(text)) { - v.setVisibility(View.GONE); - } else { - v.setVisibility(View.VISIBLE); - } - } - - private Drawable getIcon1(Cursor cursor) { - if (mIconName1Col == INVALID_INDEX) { - return null; - } - String value = cursor.getString(mIconName1Col); - Drawable drawable = getDrawableFromResourceValue(value); - if (drawable != null) { - return drawable; - } - return getDefaultIcon1(cursor); - } - - private Drawable getIcon2(Cursor cursor) { - if (mIconName2Col == INVALID_INDEX) { - return null; - } - String value = cursor.getString(mIconName2Col); - return getDrawableFromResourceValue(value); - } - - /** - * Sets the drawable in an image view, makes sure the view is only visible if there - * is a drawable. - */ - private void setViewDrawable(ImageView v, Drawable drawable, int nullVisibility) { - // Set the icon even if the drawable is null, since we need to clear any - // previous icon. - v.setImageDrawable(drawable); - - if (drawable == null) { - v.setVisibility(nullVisibility); - } else { - v.setVisibility(View.VISIBLE); - - // This is a hack to get any animated drawables (like a 'working' spinner) - // to animate. You have to setVisible true on an AnimationDrawable to get - // it to start animating, but it must first have been false or else the - // call to setVisible will be ineffective. We need to clear up the story - // about animated drawables in the future, see http://b/1878430. - drawable.setVisible(false, false); - drawable.setVisible(true, false); - } - } - - /** - * Gets the text to show in the query field when a suggestion is selected. - * - * @param cursor The Cursor to read the suggestion data from. The Cursor should already - * be moved to the suggestion that is to be read from. - * @return The text to show, or null if the query should not be - * changed when selecting this suggestion. - */ - @Override - public CharSequence convertToString(Cursor cursor) { - if (cursor == null) { - return null; - } - - String query = getColumnString(cursor, SearchManager.SUGGEST_COLUMN_QUERY); - if (query != null) { - return query; - } - - return null; - } - - /** - * This method is overridden purely to provide a bit of protection against - * flaky content providers. - * - * @see android.widget.ListAdapter#getView(int, View, ViewGroup) - */ - @Override - public View getView(int position, View convertView, ViewGroup parent) { - try { - return super.getView(position, convertView, parent); - } catch (RuntimeException e) { - Log.w(LOG_TAG, "Search suggestions cursor threw exception.", e); - // Put exception string in item title - View v = newView(mContext, mCursor, parent); - if (v != null) { - ChildViewCache views = (ChildViewCache) v.getTag(); - TextView tv = views.mText1; - tv.setText(e.toString()); - } - return v; - } - } - - /** - * Gets a drawable given a value provided by a suggestion provider. - * - * This value could be just the string value of a resource id - * (e.g., "2130837524"), in which case we will try to retrieve a drawable from - * the provider's resources. If the value is not an integer, it is - * treated as a Uri and opened with - * {@link ContentResolver#openOutputStream(android.net.Uri, String)}. - * - * All resources and URIs are read using the suggestion provider's context. - * - * If the string is not formatted as expected, or no drawable can be found for - * the provided value, this method returns null. - * - * @param drawableId a string like "2130837524", - * "android.resource://com.android.alarmclock/2130837524", - * or "content://contacts/photos/253". - * @return a Drawable, or null if none found - */ - private Drawable getDrawableFromResourceValue(String drawableId) { - if (drawableId == null || drawableId.length() == 0 || "0".equals(drawableId)) { - return null; - } - try { - // First, see if it's just an integer - int resourceId = Integer.parseInt(drawableId); - // It's an int, look for it in the cache - String drawableUri = ContentResolver.SCHEME_ANDROID_RESOURCE - + "://" + mProviderContext.getPackageName() + "/" + resourceId; - // Must use URI as cache key, since ints are app-specific - Drawable drawable = checkIconCache(drawableUri); - if (drawable != null) { - return drawable; - } - // Not cached, find it by resource ID - drawable = mProviderContext.getResources().getDrawable(resourceId); - // Stick it in the cache, using the URI as key - storeInIconCache(drawableUri, drawable); - return drawable; - } catch (NumberFormatException nfe) { - // It's not an integer, use it as a URI - Drawable drawable = checkIconCache(drawableId); - if (drawable != null) { - return drawable; - } - Uri uri = Uri.parse(drawableId); - drawable = getDrawable(uri); - storeInIconCache(drawableId, drawable); - return drawable; - } catch (Resources.NotFoundException nfe) { - // It was an integer, but it couldn't be found, bail out - Log.w(LOG_TAG, "Icon resource not found: " + drawableId); - return null; - } - } - - /** - * Gets a drawable by URI, without using the cache. - * - * @return A drawable, or {@code null} if the drawable could not be loaded. - */ - private Drawable getDrawable(Uri uri) { - try { - String scheme = uri.getScheme(); - if (ContentResolver.SCHEME_ANDROID_RESOURCE.equals(scheme)) { - // Load drawables through Resources, to get the source density information - try { - return getTheDrawable(uri); - } catch (Resources.NotFoundException ex) { - throw new FileNotFoundException("Resource does not exist: " + uri); - } - } else { - // Let the ContentResolver handle content and file URIs. - InputStream stream = mProviderContext.getContentResolver().openInputStream(uri); - if (stream == null) { - throw new FileNotFoundException("Failed to open " + uri); - } - try { - return Drawable.createFromStream(stream, null); - } finally { - try { - stream.close(); - } catch (IOException ex) { - Log.e(LOG_TAG, "Error closing icon stream for " + uri, ex); - } - } - } - } catch (FileNotFoundException fnfe) { - Log.w(LOG_TAG, "Icon not found: " + uri + ", " + fnfe.getMessage()); - return null; - } - } - - public Drawable getTheDrawable(Uri uri) throws FileNotFoundException { - String authority = uri.getAuthority(); - Resources r; - if (TextUtils.isEmpty(authority)) { - throw new FileNotFoundException("No authority: " + uri); - } else { - try { - r = mContext.getPackageManager().getResourcesForApplication(authority); - } catch (NameNotFoundException ex) { - throw new FileNotFoundException("No package found for authority: " + uri); - } - } - List path = uri.getPathSegments(); - if (path == null) { - throw new FileNotFoundException("No path: " + uri); - } - int len = path.size(); - int id; - if (len == 1) { - try { - id = Integer.parseInt(path.get(0)); - } catch (NumberFormatException e) { - throw new FileNotFoundException("Single path segment is not a resource ID: " + uri); - } - } else if (len == 2) { - id = r.getIdentifier(path.get(1), path.get(0), authority); - } else { - throw new FileNotFoundException("More than two path segments: " + uri); - } - if (id == 0) { - throw new FileNotFoundException("No resource found for: " + uri); - } - return r.getDrawable(id); - } - - private Drawable checkIconCache(String resourceUri) { - Drawable.ConstantState cached = mOutsideDrawablesCache.get(resourceUri); - if (cached == null) { - return null; - } - if (DBG) Log.d(LOG_TAG, "Found icon in cache: " + resourceUri); - return cached.newDrawable(); - } - - private void storeInIconCache(String resourceUri, Drawable drawable) { - if (drawable != null) { - mOutsideDrawablesCache.put(resourceUri, drawable.getConstantState()); - } - } - - /** - * Gets the left-hand side icon that will be used for the current suggestion - * if the suggestion contains an icon column but no icon or a broken icon. - * - * @param cursor A cursor positioned at the current suggestion. - * @return A non-null drawable. - */ - private Drawable getDefaultIcon1(Cursor cursor) { - // Fall back to a default icon - return mContext.getPackageManager().getDefaultActivityIcon(); - } - - /** - * Gets the activity or application icon for an activity. - * Uses the local icon cache for fast repeated lookups. - * - * @param component Name of an activity. - * @return A drawable, or {@code null} if neither the activity nor the application - * has an icon set. - */ - private Drawable getActivityIconWithCache(ComponentName component) { - // First check the icon cache - String componentIconKey = component.flattenToShortString(); - // Using containsKey() since we also store null values. - if (mOutsideDrawablesCache.containsKey(componentIconKey)) { - Drawable.ConstantState cached = mOutsideDrawablesCache.get(componentIconKey); - return cached == null ? null : cached.newDrawable(mProviderContext.getResources()); - } - // Then try the activity or application icon - Drawable drawable = getActivityIcon(component); - // Stick it in the cache so we don't do this lookup again. - Drawable.ConstantState toCache = drawable == null ? null : drawable.getConstantState(); - mOutsideDrawablesCache.put(componentIconKey, toCache); - return drawable; - } - - /** - * Gets the activity or application icon for an activity. - * - * @param component Name of an activity. - * @return A drawable, or {@code null} if neither the acitivy or the application - * have an icon set. - */ - private Drawable getActivityIcon(ComponentName component) { - PackageManager pm = mContext.getPackageManager(); - final ActivityInfo activityInfo; - try { - activityInfo = pm.getActivityInfo(component, PackageManager.GET_META_DATA); - } catch (NameNotFoundException ex) { - Log.w(LOG_TAG, ex.toString()); - return null; - } - int iconId = activityInfo.getIconResource(); - if (iconId == 0) return null; - String pkg = component.getPackageName(); - Drawable drawable = pm.getDrawable(pkg, iconId, activityInfo.applicationInfo); - if (drawable == null) { - Log.w(LOG_TAG, "Invalid icon resource " + iconId + " for " - + component.flattenToShortString()); - return null; - } - return drawable; - } - - /** - * Gets the value of a string column by name. - * - * @param cursor Cursor to read the value from. - * @param columnName The name of the column to read. - * @return The value of the given column, or null - * if the cursor does not contain the given column. - */ - public static String getColumnString(Cursor cursor, String columnName) { - int col = cursor.getColumnIndex(columnName); - return getStringOrNull(cursor, col); - } - - private static String getStringOrNull(Cursor cursor, int col) { - if (col == INVALID_INDEX) { - return null; - } - try { - return cursor.getString(col); - } catch (Exception e) { - Log.e(LOG_TAG, - "unexpected error retrieving valid column from cursor, " - + "did the remote process die?", e); - return null; - } - } -} diff --git a/libs/ViewPagerIndicator/.classpath b/libs/ViewPagerIndicator/.classpath deleted file mode 100644 index a4763d1..0000000 --- a/libs/ViewPagerIndicator/.classpath +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/libs/ViewPagerIndicator/.project b/libs/ViewPagerIndicator/.project deleted file mode 100644 index 02921eb..0000000 --- a/libs/ViewPagerIndicator/.project +++ /dev/null @@ -1,33 +0,0 @@ - - - ViewPagerIndicator - - - - - - com.android.ide.eclipse.adt.ResourceManagerBuilder - - - - - com.android.ide.eclipse.adt.PreCompilerBuilder - - - - - org.eclipse.jdt.core.javabuilder - - - - - com.android.ide.eclipse.adt.ApkBuilder - - - - - - com.android.ide.eclipse.adt.AndroidNature - org.eclipse.jdt.core.javanature - - diff --git a/libs/ViewPagerIndicator/AndroidManifest.xml b/libs/ViewPagerIndicator/AndroidManifest.xml deleted file mode 100644 index 19e0a5e..0000000 --- a/libs/ViewPagerIndicator/AndroidManifest.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - diff --git a/libs/ViewPagerIndicator/libs/android-support-v4.jar b/libs/ViewPagerIndicator/libs/android-support-v4.jar deleted file mode 100644 index 6080877d4ade158f24ad7ccd9a10db2ac9060b47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 385685 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

6HPQhY&mkuc_8%Q=4KIb)@wP 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%0A03X%h@VcJLH+gJm3sMzG=X1S%0K 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 - - - 4.0.0 - - com.viewpagerindicator - library - Android-ViewPagerIndicator - apklib - - - com.viewpagerindicator - parent - 2.3.1 - ../pom.xml - - - - - com.google.android - android - provided - - - - com.google.android - support-v4 - provided - - - - - src - - - - com.jayway.maven.plugins.android.generation2 - android-maven-plugin - true - - - - org.apache.maven.plugins - maven-checkstyle-plugin - - ../checkstyle.xml - - - - verify - - checkstyle - - - - - - - diff --git a/libs/ViewPagerIndicator/project.properties b/libs/ViewPagerIndicator/project.properties deleted file mode 100644 index 96db742..0000000 --- a/libs/ViewPagerIndicator/project.properties +++ /dev/null @@ -1,12 +0,0 @@ -# This file is automatically generated by Android Tools. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file must be checked in Version Control Systems. -# -# To customize properties used by the Ant build system use, -# "ant.properties", and override values to adapt the script to your -# project structure. - -android.library=true -# Project target. -target=android-4 diff --git a/libs/ViewPagerIndicator/res/color/vpi__dark_theme.xml b/libs/ViewPagerIndicator/res/color/vpi__dark_theme.xml deleted file mode 100644 index 3e7a08f..0000000 --- a/libs/ViewPagerIndicator/res/color/vpi__dark_theme.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - diff --git a/libs/ViewPagerIndicator/res/color/vpi__light_theme.xml b/libs/ViewPagerIndicator/res/color/vpi__light_theme.xml deleted file mode 100644 index f955db7..0000000 --- a/libs/ViewPagerIndicator/res/color/vpi__light_theme.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - diff --git a/libs/ViewPagerIndicator/res/drawable-hdpi/vpi__tab_selected_focused_holo.9.png b/libs/ViewPagerIndicator/res/drawable-hdpi/vpi__tab_selected_focused_holo.9.png deleted file mode 100644 index 673e3bf10d60cc54b6dfef2fcda24575073adf61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1i!3HFsuehcLq*#ibJVQ8upoSx*1IXtr@Q5sC zVBqcqVMgJWBc+iXw=G=Ra=)z4*}Q$iB}l;b6k diff --git a/libs/ViewPagerIndicator/res/drawable-hdpi/vpi__tab_selected_holo.9.png b/libs/ViewPagerIndicator/res/drawable-hdpi/vpi__tab_selected_holo.9.png deleted file mode 100644 index d57df98b501944b4ba63623766c396b5bccc29ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1i!3HFsuehcLq*#ibJVQ8upoSx*1IXtr@Q5sC zVBqcqVMg}h~fd(*my85}Sb4q9e0H>EG$N&HU diff --git a/libs/ViewPagerIndicator/res/drawable-hdpi/vpi__tab_unselected_focused_holo.9.png b/libs/ViewPagerIndicator/res/drawable-hdpi/vpi__tab_unselected_focused_holo.9.png deleted file mode 100644 index 294991d7931432f4ce0615f83594077185b41e53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1c!3HD^Kbl$tDVAa<&kznEsNqQI0P;BtJR*x3 z7`Qt@n9=;?>9s&X6Hgb%5RRG22KRnVX>4qKXwM^^Uwi5RN9qg%hl7#%FO7Y8A{hJ} m-AWwAG-}%xl(FUbF)^t86Xr1Vx%dsJpTX1B&t;ucLK6TtwI;Oy diff --git a/libs/ViewPagerIndicator/res/drawable-hdpi/vpi__tab_unselected_holo.9.png b/libs/ViewPagerIndicator/res/drawable-hdpi/vpi__tab_unselected_holo.9.png deleted file mode 100644 index 19532ab10d4fe414d597ed44ed50c91a3e3b9279..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1c!3HD^Kbl$tDVAa<&kznEsNqQI0P;BtJR*x3 z7`Qt@n9=;?>9s&XYfl%)5RRG2KmPx>XJ%$TT(5HGK*O1ak257UFsy01aiHFf4G12u u^?&$m-q&fz7T&FR9W0_QnO}Q~fkExE@YIkG=lX%hFnGH9xvX9s&XV^0^y5RRG22KRnVX>4qKXwM^^Uwi5RN2-aD!@msM(PItAfL0qBeIx* zfx8og8O=|gUJDd7^K@|x;h4Gh+(zC520Y9MizoD2>~^~(JZa^V pUoEkkaeSh9w)TUlKa6vZ+qJ0**((%Vy8umK@O1TaS?83{1OR&wE2RJc diff --git a/libs/ViewPagerIndicator/res/drawable-mdpi/vpi__tab_selected_holo.9.png b/libs/ViewPagerIndicator/res/drawable-mdpi/vpi__tab_selected_holo.9.png deleted file mode 100644 index 587337caf74f9ba3d32ba1c7cc8fb8b0b5ba245b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^EI`b~!3HEJ|NhSh5-4`^4B-HR8jh3>AfL0qBeIx* zfx8og8O=|gUJDeo^mK6y;h4Gh+(zC53JlB#xw8$}k`45e4cLk;e3y7!_%!uv(Z^d6 t0#9x~Qa^f(Id{#0H&;LIP<)f9-+fKc+F|3Yl|VxnJYD@<);T3K0RZ_tFJ}M% diff --git a/libs/ViewPagerIndicator/res/drawable-mdpi/vpi__tab_selected_pressed_holo.9.png b/libs/ViewPagerIndicator/res/drawable-mdpi/vpi__tab_selected_pressed_holo.9.png deleted file mode 100644 index 155c4fc753ed43185b31df3bea2af1ea5b3e7482..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^EI`b~!3HEJ|NhSh5-4`^4B-HR8jh3>AfL0qBeIx* zfx8og8O=|gUJDeo@N{tu;h33haPQZY#>U2n_RP$O>mRT6my}r8=UW!n`aACInYB!EW!u3$ rIYDzn*o$v%D|qmWd&mA1`&tG?86nH1GYjqj&0z3!^>bP0l+XkKX|61& diff --git a/libs/ViewPagerIndicator/res/drawable-mdpi/vpi__tab_unselected_holo.9.png b/libs/ViewPagerIndicator/res/drawable-mdpi/vpi__tab_unselected_holo.9.png deleted file mode 100644 index a2dbf42b74f7fafb6d8a057306a9c021867d035c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^EI`c0!3HFsSlX9@1d5$JLpXq-h9ji|$mcBZh%9Dc z;O+!rM)Q-W*8&CYJzX3_IA$jQ`2XLYnVI=;y+&GsLz;ns!JqUb2WA}}9-f|K(evAk wfFg6gPD@K@^jg!TZFujONZyK%*Ov1zxbO?iIdA+_5oi>Hr>mdKI;Vst04D7$hX4Qo diff --git a/libs/ViewPagerIndicator/res/drawable-mdpi/vpi__tab_unselected_pressed_holo.9.png b/libs/ViewPagerIndicator/res/drawable-mdpi/vpi__tab_unselected_pressed_holo.9.png deleted file mode 100644 index b1223fe3c407e072bb22d6f534397bf3254939fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^EI`c0!3HFsSlX9@1d5$JLpXq-h9ji|$mcBZh%9Dc z;O+!rM)Q-W*8&A?JzX3_IA$gr-1{}9v9a-?Ju~y+`p0YiB_$U2xUsRZwQat4>8lS< uMnfl1c4A|rBX^f%!~&s(1*$LFm>5oL2|PB@cz*+E5QC?ypUXO@geCw>u`ROz diff --git a/libs/ViewPagerIndicator/res/drawable-xhdpi/vpi__tab_selected_focused_holo.9.png b/libs/ViewPagerIndicator/res/drawable-xhdpi/vpi__tab_selected_focused_holo.9.png deleted file mode 100644 index 03cfb0945d97ecd224763eca5c3136e043c13288..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^Y(Ol;0U|59*B=E^EX7WqAsj$Z!;#Vf4nJ zaCd?*qxs3xYk`8Mo-U3d5>t~6?){q5*x2~c-pCBZ5@_=ERFyG diff --git a/libs/ViewPagerIndicator/res/drawable-xhdpi/vpi__tab_selected_holo.9.png b/libs/ViewPagerIndicator/res/drawable-xhdpi/vpi__tab_selected_holo.9.png deleted file mode 100644 index e4229f26b2771d884934b80d0056b8dd66d10edd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^Y(Ol;0U|59*B=E^EX7WqAsj$Z!;#Vf4nJ zaCd?*qxs3xYk`8+o-U3d5>t~6?){q5*x2~c-l(n1@K5>ymj5$1a2Oc?!34d7Ck`Aq skg(^gW|wXH-lZoEvTk@AJm}J3sQWAGentL}KF}BjPgg&ebxsLQ0KFYBT>t<8 diff --git a/libs/ViewPagerIndicator/res/drawable-xhdpi/vpi__tab_selected_pressed_holo.9.png b/libs/ViewPagerIndicator/res/drawable-xhdpi/vpi__tab_selected_pressed_holo.9.png deleted file mode 100644 index e862cb12154541c150fb2d9bb98872bcff506317..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^Y(Ol;0U|59*B=E^EX7WqAsj$Z!;#Vf4nJ zaCd?*qxs3xYk`8Mo-U3d5>t~6?){q5*x2~c-pCBZ5(#$xWo$;KAD39oi<@P`m7(8A5T-G@yGywqAKq?vl diff --git a/libs/ViewPagerIndicator/res/drawable-xhdpi/vpi__tab_unselected_holo.9.png b/libs/ViewPagerIndicator/res/drawable-xhdpi/vpi__tab_unselected_holo.9.png deleted file mode 100644 index 9465173781eaa7fc9ab0e191904f928ad1c0b8f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ#0V1dK=^FznmSQK*5Dp-y;YjHK@;M7UB8wRq zxI00Z(fs7;wLn1+PZ!4!j+x0n{{OdUW@bKIZ*t~9!x;yr|1&pm7#RS;1ieP?Kk11H z2?+-Ger=J9{IX`d2{ZSUyAFF~k44WnGFVV~q2hHg8$(d6=$w>Y|ILABGI+ZBxvX - - - - - - - - - - - - - - - - - - - - diff --git a/libs/ViewPagerIndicator/res/values/vpi__attrs.xml b/libs/ViewPagerIndicator/res/values/vpi__attrs.xml deleted file mode 100644 index 8ff0893..0000000 --- a/libs/ViewPagerIndicator/res/values/vpi__attrs.xml +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libs/ViewPagerIndicator/res/values/vpi__colors.xml b/libs/ViewPagerIndicator/res/values/vpi__colors.xml deleted file mode 100644 index 62ca607..0000000 --- a/libs/ViewPagerIndicator/res/values/vpi__colors.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - #ff000000 - #fff3f3f3 - @color/vpi__background_holo_light - @color/vpi__background_holo_dark - #ff4c4c4c - #ffb2b2b2 - @color/vpi__bright_foreground_holo_light - @color/vpi__bright_foreground_holo_dark - diff --git a/libs/ViewPagerIndicator/res/values/vpi__defaults.xml b/libs/ViewPagerIndicator/res/values/vpi__defaults.xml deleted file mode 100644 index 245ae92..0000000 --- a/libs/ViewPagerIndicator/res/values/vpi__defaults.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - - true - #FFFFFFFF - #00000000 - 0 - 3dp - false - #FFDDDDDD - 1dp - - 12dp - 4dp - 1dp - #FF33B5E5 - #FFBBBBBB - true - - 4dp - #FF33B5E5 - 2dp - 2 - 4dp - 20dp - 7dp - #FFFFFFFF - true - #BBFFFFFF - 15dp - 5dp - 7dp - - true - 300 - 400 - #FF33B5E5 - \ No newline at end of file diff --git a/libs/ViewPagerIndicator/res/values/vpi__styles.xml b/libs/ViewPagerIndicator/res/values/vpi__styles.xml deleted file mode 100644 index c928819..0000000 --- a/libs/ViewPagerIndicator/res/values/vpi__styles.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - diff --git a/libs/ViewPagerIndicator/src/com/viewpagerindicator/CirclePageIndicator.java b/libs/ViewPagerIndicator/src/com/viewpagerindicator/CirclePageIndicator.java deleted file mode 100644 index be3a856..0000000 --- a/libs/ViewPagerIndicator/src/com/viewpagerindicator/CirclePageIndicator.java +++ /dev/null @@ -1,546 +0,0 @@ -/* - * Copyright (C) 2011 Patrik Akerfeldt - * Copyright (C) 2011 Jake Wharton - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.viewpagerindicator; - -import android.content.Context; -import android.content.res.Resources; -import android.content.res.TypedArray; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.Paint.Style; -import android.os.Parcel; -import android.os.Parcelable; -import android.support.v4.view.MotionEventCompat; -import android.support.v4.view.ViewConfigurationCompat; -import android.support.v4.view.ViewPager; -import android.util.AttributeSet; -import android.view.MotionEvent; -import android.view.View; -import android.view.ViewConfiguration; - -import static android.graphics.Paint.ANTI_ALIAS_FLAG; -import static android.widget.LinearLayout.HORIZONTAL; -import static android.widget.LinearLayout.VERTICAL; - -/** - * Draws circles (one for each view). The current view position is filled and - * others are only stroked. - */ -public class CirclePageIndicator extends View implements PageIndicator { - private static final int INVALID_POINTER = -1; - - private float mRadius; - private final Paint mPaintPageFill = new Paint(ANTI_ALIAS_FLAG); - private final Paint mPaintStroke = new Paint(ANTI_ALIAS_FLAG); - private final Paint mPaintFill = new Paint(ANTI_ALIAS_FLAG); - private ViewPager mViewPager; - private ViewPager.OnPageChangeListener mListener; - private int mCurrentPage; - private int mSnapPage; - private float mPageOffset; - private int mScrollState; - private int mOrientation; - private boolean mCentered; - private boolean mSnap; - - private int mTouchSlop; - private float mLastMotionX = -1; - private int mActivePointerId = INVALID_POINTER; - private boolean mIsDragging; - - - public CirclePageIndicator(Context context) { - this(context, null); - } - - public CirclePageIndicator(Context context, AttributeSet attrs) { - this(context, attrs, R.attr.vpiCirclePageIndicatorStyle); - } - - public CirclePageIndicator(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - if (isInEditMode()) return; - - //Load defaults from resources - final Resources res = getResources(); - final int defaultPageColor = res.getColor(R.color.default_circle_indicator_page_color); - final int defaultFillColor = res.getColor(R.color.default_circle_indicator_fill_color); - final int defaultOrientation = res.getInteger(R.integer.default_circle_indicator_orientation); - final int defaultStrokeColor = res.getColor(R.color.default_circle_indicator_stroke_color); - final float defaultStrokeWidth = res.getDimension(R.dimen.default_circle_indicator_stroke_width); - final float defaultRadius = res.getDimension(R.dimen.default_circle_indicator_radius); - final boolean defaultCentered = res.getBoolean(R.bool.default_circle_indicator_centered); - final boolean defaultSnap = res.getBoolean(R.bool.default_circle_indicator_snap); - - //Retrieve styles attributes - TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CirclePageIndicator, defStyle, 0); - - mCentered = a.getBoolean(R.styleable.CirclePageIndicator_centered, defaultCentered); - mOrientation = a.getInt(R.styleable.CirclePageIndicator_android_orientation, defaultOrientation); - mPaintPageFill.setStyle(Style.FILL); - mPaintPageFill.setColor(a.getColor(R.styleable.CirclePageIndicator_pageColor, defaultPageColor)); - mPaintStroke.setStyle(Style.STROKE); - mPaintStroke.setColor(a.getColor(R.styleable.CirclePageIndicator_strokeColor, defaultStrokeColor)); - mPaintStroke.setStrokeWidth(a.getDimension(R.styleable.CirclePageIndicator_strokeWidth, defaultStrokeWidth)); - mPaintFill.setStyle(Style.FILL); - mPaintFill.setColor(a.getColor(R.styleable.CirclePageIndicator_fillColor, defaultFillColor)); - mRadius = a.getDimension(R.styleable.CirclePageIndicator_radius, defaultRadius); - mSnap = a.getBoolean(R.styleable.CirclePageIndicator_snap, defaultSnap); - - a.recycle(); - - final ViewConfiguration configuration = ViewConfiguration.get(context); - mTouchSlop = ViewConfigurationCompat.getScaledPagingTouchSlop(configuration); - } - - - public void setCentered(boolean centered) { - mCentered = centered; - invalidate(); - } - - public boolean isCentered() { - return mCentered; - } - - public void setPageColor(int pageColor) { - mPaintPageFill.setColor(pageColor); - invalidate(); - } - - public int getPageColor() { - return mPaintPageFill.getColor(); - } - - public void setFillColor(int fillColor) { - mPaintFill.setColor(fillColor); - invalidate(); - } - - public int getFillColor() { - return mPaintFill.getColor(); - } - - public void setOrientation(int orientation) { - switch (orientation) { - case HORIZONTAL: - case VERTICAL: - mOrientation = orientation; - requestLayout(); - break; - - default: - throw new IllegalArgumentException("Orientation must be either HORIZONTAL or VERTICAL."); - } - } - - public int getOrientation() { - return mOrientation; - } - - public void setStrokeColor(int strokeColor) { - mPaintStroke.setColor(strokeColor); - invalidate(); - } - - public int getStrokeColor() { - return mPaintStroke.getColor(); - } - - public void setStrokeWidth(float strokeWidth) { - mPaintStroke.setStrokeWidth(strokeWidth); - invalidate(); - } - - public float getStrokeWidth() { - return mPaintStroke.getStrokeWidth(); - } - - public void setRadius(float radius) { - mRadius = radius; - invalidate(); - } - - public float getRadius() { - return mRadius; - } - - public void setSnap(boolean snap) { - mSnap = snap; - invalidate(); - } - - public boolean isSnap() { - return mSnap; - } - - @Override - protected void onDraw(Canvas canvas) { - super.onDraw(canvas); - - if (mViewPager == null) { - return; - } - final int count = mViewPager.getAdapter().getCount(); - if (count == 0) { - return; - } - - if (mCurrentPage >= count) { - setCurrentItem(count - 1); - return; - } - - int longSize; - int longPaddingBefore; - int longPaddingAfter; - int shortPaddingBefore; - if (mOrientation == HORIZONTAL) { - longSize = getWidth(); - longPaddingBefore = getPaddingLeft(); - longPaddingAfter = getPaddingRight(); - shortPaddingBefore = getPaddingTop(); - } else { - longSize = getHeight(); - longPaddingBefore = getPaddingTop(); - longPaddingAfter = getPaddingBottom(); - shortPaddingBefore = getPaddingLeft(); - } - - final float threeRadius = mRadius * 3; - final float shortOffset = shortPaddingBefore + mRadius; - float longOffset = longPaddingBefore + mRadius; - if (mCentered) { - longOffset += ((longSize - longPaddingBefore - longPaddingAfter) / 2.0f) - ((count * threeRadius) / 2.0f); - } - - float dX; - float dY; - - float pageFillRadius = mRadius; - if (mPaintStroke.getStrokeWidth() > 0) { - pageFillRadius -= mPaintStroke.getStrokeWidth() / 2.0f; - } - - //Draw stroked circles - for (int iLoop = 0; iLoop < count; iLoop++) { - float drawLong = longOffset + (iLoop * threeRadius); - if (mOrientation == HORIZONTAL) { - dX = drawLong; - dY = shortOffset; - } else { - dX = shortOffset; - dY = drawLong; - } - // Only paint fill if not completely transparent - if (mPaintPageFill.getAlpha() > 0) { - canvas.drawCircle(dX, dY, pageFillRadius, mPaintPageFill); - } - - // Only paint stroke if a stroke width was non-zero - if (pageFillRadius != mRadius) { - canvas.drawCircle(dX, dY, mRadius, mPaintStroke); - } - } - - //Draw the filled circle according to the current scroll - float cx = (mSnap ? mSnapPage : mCurrentPage) * threeRadius; - if (!mSnap) { - cx += mPageOffset * threeRadius; - } - if (mOrientation == HORIZONTAL) { - dX = longOffset + cx; - dY = shortOffset; - } else { - dX = shortOffset; - dY = longOffset + cx; - } - canvas.drawCircle(dX, dY, mRadius, mPaintFill); - } - - public boolean onTouchEvent(android.view.MotionEvent ev) { - if (super.onTouchEvent(ev)) { - return true; - } - if ((mViewPager == null) || (mViewPager.getAdapter().getCount() == 0)) { - return false; - } - - final int action = ev.getAction(); - - switch (action & MotionEventCompat.ACTION_MASK) { - case MotionEvent.ACTION_DOWN: - mActivePointerId = MotionEventCompat.getPointerId(ev, 0); - mLastMotionX = ev.getX(); - break; - - case MotionEvent.ACTION_MOVE: { - final int activePointerIndex = MotionEventCompat.findPointerIndex(ev, mActivePointerId); - final float x = MotionEventCompat.getX(ev, activePointerIndex); - final float deltaX = x - mLastMotionX; - - if (!mIsDragging) { - if (Math.abs(deltaX) > mTouchSlop) { - mIsDragging = true; - } - } - - if (mIsDragging) { - mLastMotionX = x; - if (mViewPager.isFakeDragging() || mViewPager.beginFakeDrag()) { - mViewPager.fakeDragBy(deltaX); - } - } - - break; - } - - case MotionEvent.ACTION_CANCEL: - case MotionEvent.ACTION_UP: - if (!mIsDragging) { - final int count = mViewPager.getAdapter().getCount(); - final int width = getWidth(); - final float halfWidth = width / 2f; - final float sixthWidth = width / 6f; - - if ((mCurrentPage > 0) && (ev.getX() < halfWidth - sixthWidth)) { - mViewPager.setCurrentItem(mCurrentPage - 1); - return true; - } else if ((mCurrentPage < count - 1) && (ev.getX() > halfWidth + sixthWidth)) { - mViewPager.setCurrentItem(mCurrentPage + 1); - return true; - } - } - - mIsDragging = false; - mActivePointerId = INVALID_POINTER; - if (mViewPager.isFakeDragging()) mViewPager.endFakeDrag(); - break; - - case MotionEventCompat.ACTION_POINTER_DOWN: { - final int index = MotionEventCompat.getActionIndex(ev); - final float x = MotionEventCompat.getX(ev, index); - mLastMotionX = x; - mActivePointerId = MotionEventCompat.getPointerId(ev, index); - break; - } - - case MotionEventCompat.ACTION_POINTER_UP: - final int pointerIndex = MotionEventCompat.getActionIndex(ev); - final int pointerId = MotionEventCompat.getPointerId(ev, pointerIndex); - if (pointerId == mActivePointerId) { - final int newPointerIndex = pointerIndex == 0 ? 1 : 0; - mActivePointerId = MotionEventCompat.getPointerId(ev, newPointerIndex); - } - mLastMotionX = MotionEventCompat.getX(ev, MotionEventCompat.findPointerIndex(ev, mActivePointerId)); - break; - } - - return true; - }; - - @Override - public void setViewPager(ViewPager view) { - if (mViewPager == view) { - return; - } - if (mViewPager != null) { - mViewPager.setOnPageChangeListener(null); - } - if (view.getAdapter() == null) { - throw new IllegalStateException("ViewPager does not have adapter instance."); - } - mViewPager = view; - mViewPager.setOnPageChangeListener(this); - invalidate(); - } - - @Override - public void setViewPager(ViewPager view, int initialPosition) { - setViewPager(view); - setCurrentItem(initialPosition); - } - - @Override - public void setCurrentItem(int item) { - if (mViewPager == null) { - throw new IllegalStateException("ViewPager has not been bound."); - } - mViewPager.setCurrentItem(item); - mCurrentPage = item; - invalidate(); - } - - @Override - public void notifyDataSetChanged() { - invalidate(); - } - - @Override - public void onPageScrollStateChanged(int state) { - mScrollState = state; - - if (mListener != null) { - mListener.onPageScrollStateChanged(state); - } - } - - @Override - public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - mCurrentPage = position; - mPageOffset = positionOffset; - invalidate(); - - if (mListener != null) { - mListener.onPageScrolled(position, positionOffset, positionOffsetPixels); - } - } - - @Override - public void onPageSelected(int position) { - if (mSnap || mScrollState == ViewPager.SCROLL_STATE_IDLE) { - mCurrentPage = position; - mSnapPage = position; - invalidate(); - } - - if (mListener != null) { - mListener.onPageSelected(position); - } - } - - @Override - public void setOnPageChangeListener(ViewPager.OnPageChangeListener listener) { - mListener = listener; - } - - /* - * (non-Javadoc) - * - * @see android.view.View#onMeasure(int, int) - */ - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - if (mOrientation == HORIZONTAL) { - setMeasuredDimension(measureLong(widthMeasureSpec), measureShort(heightMeasureSpec)); - } else { - setMeasuredDimension(measureShort(widthMeasureSpec), measureLong(heightMeasureSpec)); - } - } - - /** - * Determines the width of this view - * - * @param measureSpec - * A measureSpec packed into an int - * @return The width of the view, honoring constraints from measureSpec - */ - private int measureLong(int measureSpec) { - int result = 0; - int specMode = MeasureSpec.getMode(measureSpec); - int specSize = MeasureSpec.getSize(measureSpec); - - if ((specMode == MeasureSpec.EXACTLY) || (mViewPager == null)) { - //We were told how big to be - result = specSize; - } else { - //Calculate the width according the views count - final int count = mViewPager.getAdapter().getCount(); - result = (int)(getPaddingLeft() + getPaddingRight() - + (count * 2 * mRadius) + (count - 1) * mRadius + 1); - //Respect AT_MOST value if that was what is called for by measureSpec - if (specMode == MeasureSpec.AT_MOST) { - result = Math.min(result, specSize); - } - } - return result; - } - - /** - * Determines the height of this view - * - * @param measureSpec - * A measureSpec packed into an int - * @return The height of the view, honoring constraints from measureSpec - */ - private int measureShort(int measureSpec) { - int result = 0; - int specMode = MeasureSpec.getMode(measureSpec); - int specSize = MeasureSpec.getSize(measureSpec); - - if (specMode == MeasureSpec.EXACTLY) { - //We were told how big to be - result = specSize; - } else { - //Measure the height - result = (int)(2 * mRadius + getPaddingTop() + getPaddingBottom() + 1); - //Respect AT_MOST value if that was what is called for by measureSpec - if (specMode == MeasureSpec.AT_MOST) { - result = Math.min(result, specSize); - } - } - return result; - } - - @Override - public void onRestoreInstanceState(Parcelable state) { - SavedState savedState = (SavedState)state; - super.onRestoreInstanceState(savedState.getSuperState()); - mCurrentPage = savedState.currentPage; - mSnapPage = savedState.currentPage; - requestLayout(); - } - - @Override - public Parcelable onSaveInstanceState() { - Parcelable superState = super.onSaveInstanceState(); - SavedState savedState = new SavedState(superState); - savedState.currentPage = mCurrentPage; - return savedState; - } - - static class SavedState extends BaseSavedState { - int currentPage; - - public SavedState(Parcelable superState) { - super(superState); - } - - private SavedState(Parcel in) { - super(in); - currentPage = in.readInt(); - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - super.writeToParcel(dest, flags); - dest.writeInt(currentPage); - } - - public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { - @Override - public SavedState createFromParcel(Parcel in) { - return new SavedState(in); - } - - @Override - public SavedState[] newArray(int size) { - return new SavedState[size]; - } - }; - } -} diff --git a/libs/ViewPagerIndicator/src/com/viewpagerindicator/LinePageIndicator.java b/libs/ViewPagerIndicator/src/com/viewpagerindicator/LinePageIndicator.java deleted file mode 100644 index b3e0862..0000000 --- a/libs/ViewPagerIndicator/src/com/viewpagerindicator/LinePageIndicator.java +++ /dev/null @@ -1,439 +0,0 @@ -/* - * Copyright (C) 2012 Jake Wharton - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.viewpagerindicator; - -import android.content.Context; -import android.content.res.Resources; -import android.content.res.TypedArray; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.os.Parcel; -import android.os.Parcelable; -import android.support.v4.view.MotionEventCompat; -import android.support.v4.view.ViewConfigurationCompat; -import android.support.v4.view.ViewPager; -import android.util.AttributeSet; -import android.util.FloatMath; -import android.view.MotionEvent; -import android.view.View; -import android.view.ViewConfiguration; - -/** - * Draws a line for each page. The current page line is colored differently - * than the unselected page lines. - */ -public class LinePageIndicator extends View implements PageIndicator { - private static final int INVALID_POINTER = -1; - - private final Paint mPaintUnselected = new Paint(Paint.ANTI_ALIAS_FLAG); - private final Paint mPaintSelected = new Paint(Paint.ANTI_ALIAS_FLAG); - private ViewPager mViewPager; - private ViewPager.OnPageChangeListener mListener; - private int mCurrentPage; - private boolean mCentered; - private float mLineWidth; - private float mGapWidth; - - private int mTouchSlop; - private float mLastMotionX = -1; - private int mActivePointerId = INVALID_POINTER; - private boolean mIsDragging; - - - public LinePageIndicator(Context context) { - this(context, null); - } - - public LinePageIndicator(Context context, AttributeSet attrs) { - this(context, attrs, R.attr.vpiLinePageIndicatorStyle); - } - - public LinePageIndicator(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - if (isInEditMode()) return; - - final Resources res = getResources(); - - //Load defaults from resources - final int defaultSelectedColor = res.getColor(R.color.default_line_indicator_selected_color); - final int defaultUnselectedColor = res.getColor(R.color.default_line_indicator_unselected_color); - final float defaultLineWidth = res.getDimension(R.dimen.default_line_indicator_line_width); - final float defaultGapWidth = res.getDimension(R.dimen.default_line_indicator_gap_width); - final float defaultStrokeWidth = res.getDimension(R.dimen.default_line_indicator_stroke_width); - final boolean defaultCentered = res.getBoolean(R.bool.default_line_indicator_centered); - - //Retrieve styles attributes - TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.LinePageIndicator, defStyle, 0); - - mCentered = a.getBoolean(R.styleable.LinePageIndicator_centered, defaultCentered); - mLineWidth = a.getDimension(R.styleable.LinePageIndicator_lineWidth, defaultLineWidth); - mGapWidth = a.getDimension(R.styleable.LinePageIndicator_gapWidth, defaultGapWidth); - setStrokeWidth(a.getDimension(R.styleable.LinePageIndicator_strokeWidth, defaultStrokeWidth)); - mPaintUnselected.setColor(a.getColor(R.styleable.LinePageIndicator_unselectedColor, defaultUnselectedColor)); - mPaintSelected.setColor(a.getColor(R.styleable.LinePageIndicator_selectedColor, defaultSelectedColor)); - - a.recycle(); - - final ViewConfiguration configuration = ViewConfiguration.get(context); - mTouchSlop = ViewConfigurationCompat.getScaledPagingTouchSlop(configuration); - } - - - public void setCentered(boolean centered) { - mCentered = centered; - invalidate(); - } - - public boolean isCentered() { - return mCentered; - } - - public void setUnselectedColor(int unselectedColor) { - mPaintUnselected.setColor(unselectedColor); - invalidate(); - } - - public int getUnselectedColor() { - return mPaintUnselected.getColor(); - } - - public void setSelectedColor(int selectedColor) { - mPaintSelected.setColor(selectedColor); - invalidate(); - } - - public int getSelectedColor() { - return mPaintSelected.getColor(); - } - - public void setLineWidth(float lineWidth) { - mLineWidth = lineWidth; - invalidate(); - } - - public float getLineWidth() { - return mLineWidth; - } - - public void setStrokeWidth(float lineHeight) { - mPaintSelected.setStrokeWidth(lineHeight); - mPaintUnselected.setStrokeWidth(lineHeight); - invalidate(); - } - - public float getStrokeWidth() { - return mPaintSelected.getStrokeWidth(); - } - - public void setGapWidth(float gapWidth) { - mGapWidth = gapWidth; - invalidate(); - } - - public float getGapWidth() { - return mGapWidth; - } - - @Override - protected void onDraw(Canvas canvas) { - super.onDraw(canvas); - - if (mViewPager == null) { - return; - } - final int count = mViewPager.getAdapter().getCount(); - if (count == 0) { - return; - } - - if (mCurrentPage >= count) { - setCurrentItem(count - 1); - return; - } - - final float lineWidthAndGap = mLineWidth + mGapWidth; - final float indicatorWidth = (count * lineWidthAndGap) - mGapWidth; - final float paddingTop = getPaddingTop(); - final float paddingLeft = getPaddingLeft(); - final float paddingRight = getPaddingRight(); - - float verticalOffset = paddingTop + ((getHeight() - paddingTop - getPaddingBottom()) / 2.0f); - float horizontalOffset = paddingLeft; - if (mCentered) { - horizontalOffset += ((getWidth() - paddingLeft - paddingRight) / 2.0f) - (indicatorWidth / 2.0f); - } - - //Draw stroked circles - for (int i = 0; i < count; i++) { - float dx1 = horizontalOffset + (i * lineWidthAndGap); - float dx2 = dx1 + mLineWidth; - canvas.drawLine(dx1, verticalOffset, dx2, verticalOffset, (i == mCurrentPage) ? mPaintSelected : mPaintUnselected); - } - } - - public boolean onTouchEvent(android.view.MotionEvent ev) { - if (super.onTouchEvent(ev)) { - return true; - } - if ((mViewPager == null) || (mViewPager.getAdapter().getCount() == 0)) { - return false; - } - - final int action = ev.getAction(); - - switch (action & MotionEventCompat.ACTION_MASK) { - case MotionEvent.ACTION_DOWN: - mActivePointerId = MotionEventCompat.getPointerId(ev, 0); - mLastMotionX = ev.getX(); - break; - - case MotionEvent.ACTION_MOVE: { - final int activePointerIndex = MotionEventCompat.findPointerIndex(ev, mActivePointerId); - final float x = MotionEventCompat.getX(ev, activePointerIndex); - final float deltaX = x - mLastMotionX; - - if (!mIsDragging) { - if (Math.abs(deltaX) > mTouchSlop) { - mIsDragging = true; - } - } - - if (mIsDragging) { - mLastMotionX = x; - if (mViewPager.isFakeDragging() || mViewPager.beginFakeDrag()) { - mViewPager.fakeDragBy(deltaX); - } - } - - break; - } - - case MotionEvent.ACTION_CANCEL: - case MotionEvent.ACTION_UP: - if (!mIsDragging) { - final int count = mViewPager.getAdapter().getCount(); - final int width = getWidth(); - final float halfWidth = width / 2f; - final float sixthWidth = width / 6f; - - if ((mCurrentPage > 0) && (ev.getX() < halfWidth - sixthWidth)) { - mViewPager.setCurrentItem(mCurrentPage - 1); - return true; - } else if ((mCurrentPage < count - 1) && (ev.getX() > halfWidth + sixthWidth)) { - mViewPager.setCurrentItem(mCurrentPage + 1); - return true; - } - } - - mIsDragging = false; - mActivePointerId = INVALID_POINTER; - if (mViewPager.isFakeDragging()) mViewPager.endFakeDrag(); - break; - - case MotionEventCompat.ACTION_POINTER_DOWN: { - final int index = MotionEventCompat.getActionIndex(ev); - final float x = MotionEventCompat.getX(ev, index); - mLastMotionX = x; - mActivePointerId = MotionEventCompat.getPointerId(ev, index); - break; - } - - case MotionEventCompat.ACTION_POINTER_UP: - final int pointerIndex = MotionEventCompat.getActionIndex(ev); - final int pointerId = MotionEventCompat.getPointerId(ev, pointerIndex); - if (pointerId == mActivePointerId) { - final int newPointerIndex = pointerIndex == 0 ? 1 : 0; - mActivePointerId = MotionEventCompat.getPointerId(ev, newPointerIndex); - } - mLastMotionX = MotionEventCompat.getX(ev, MotionEventCompat.findPointerIndex(ev, mActivePointerId)); - break; - } - - return true; - }; - - @Override - public void setViewPager(ViewPager viewPager) { - if (mViewPager == viewPager) { - return; - } - if (mViewPager != null) { - //Clear us from the old pager. - mViewPager.setOnPageChangeListener(null); - } - if (viewPager.getAdapter() == null) { - throw new IllegalStateException("ViewPager does not have adapter instance."); - } - mViewPager = viewPager; - mViewPager.setOnPageChangeListener(this); - invalidate(); - } - - @Override - public void setViewPager(ViewPager view, int initialPosition) { - setViewPager(view); - setCurrentItem(initialPosition); - } - - @Override - public void setCurrentItem(int item) { - if (mViewPager == null) { - throw new IllegalStateException("ViewPager has not been bound."); - } - mViewPager.setCurrentItem(item); - mCurrentPage = item; - invalidate(); - } - - @Override - public void notifyDataSetChanged() { - invalidate(); - } - - @Override - public void onPageScrollStateChanged(int state) { - if (mListener != null) { - mListener.onPageScrollStateChanged(state); - } - } - - @Override - public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - if (mListener != null) { - mListener.onPageScrolled(position, positionOffset, positionOffsetPixels); - } - } - - @Override - public void onPageSelected(int position) { - mCurrentPage = position; - invalidate(); - - if (mListener != null) { - mListener.onPageSelected(position); - } - } - - @Override - public void setOnPageChangeListener(ViewPager.OnPageChangeListener listener) { - mListener = listener; - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - setMeasuredDimension(measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec)); - } - - /** - * Determines the width of this view - * - * @param measureSpec - * A measureSpec packed into an int - * @return The width of the view, honoring constraints from measureSpec - */ - private int measureWidth(int measureSpec) { - float result = 0; - int specMode = MeasureSpec.getMode(measureSpec); - int specSize = MeasureSpec.getSize(measureSpec); - - if ((specMode == MeasureSpec.EXACTLY) || (mViewPager == null)) { - //We were told how big to be - result = specSize; - } else { - //Calculate the width according the views count - final int count = mViewPager.getAdapter().getCount(); - result = getPaddingLeft() + getPaddingRight() + (count * mLineWidth) + ((count - 1) * mGapWidth); - //Respect AT_MOST value if that was what is called for by measureSpec - if (specMode == MeasureSpec.AT_MOST) { - result = Math.min(result, specSize); - } - } - return (int)FloatMath.ceil(result); - } - - /** - * Determines the height of this view - * - * @param measureSpec - * A measureSpec packed into an int - * @return The height of the view, honoring constraints from measureSpec - */ - private int measureHeight(int measureSpec) { - float result = 0; - int specMode = MeasureSpec.getMode(measureSpec); - int specSize = MeasureSpec.getSize(measureSpec); - - if (specMode == MeasureSpec.EXACTLY) { - //We were told how big to be - result = specSize; - } else { - //Measure the height - result = mPaintSelected.getStrokeWidth() + getPaddingTop() + getPaddingBottom(); - //Respect AT_MOST value if that was what is called for by measureSpec - if (specMode == MeasureSpec.AT_MOST) { - result = Math.min(result, specSize); - } - } - return (int)FloatMath.ceil(result); - } - - @Override - public void onRestoreInstanceState(Parcelable state) { - SavedState savedState = (SavedState)state; - super.onRestoreInstanceState(savedState.getSuperState()); - mCurrentPage = savedState.currentPage; - requestLayout(); - } - - @Override - public Parcelable onSaveInstanceState() { - Parcelable superState = super.onSaveInstanceState(); - SavedState savedState = new SavedState(superState); - savedState.currentPage = mCurrentPage; - return savedState; - } - - static class SavedState extends BaseSavedState { - int currentPage; - - public SavedState(Parcelable superState) { - super(superState); - } - - private SavedState(Parcel in) { - super(in); - currentPage = in.readInt(); - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - super.writeToParcel(dest, flags); - dest.writeInt(currentPage); - } - - public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { - @Override - public SavedState createFromParcel(Parcel in) { - return new SavedState(in); - } - - @Override - public SavedState[] newArray(int size) { - return new SavedState[size]; - } - }; - } -} \ No newline at end of file diff --git a/libs/ViewPagerIndicator/src/com/viewpagerindicator/PageIndicator.java b/libs/ViewPagerIndicator/src/com/viewpagerindicator/PageIndicator.java deleted file mode 100644 index c08c00a..0000000 --- a/libs/ViewPagerIndicator/src/com/viewpagerindicator/PageIndicator.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2011 Patrik Akerfeldt - * Copyright (C) 2011 Jake Wharton - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.viewpagerindicator; - -import android.support.v4.view.ViewPager; - -/** - * A PageIndicator is responsible to show an visual indicator on the total views - * number and the current visible view. - */ -public interface PageIndicator extends ViewPager.OnPageChangeListener { - /** - * Bind the indicator to a ViewPager. - * - * @param view - */ - void setViewPager(ViewPager view); - - /** - * Bind the indicator to a ViewPager. - * - * @param view - * @param initialPosition - */ - void setViewPager(ViewPager view, int initialPosition); - - /** - *

Set the current page of both the ViewPager and indicator.

- * - *

This must be used if you need to set the page before - * the views are drawn on screen (e.g., default start page).

- * - * @param item - */ - void setCurrentItem(int item); - - /** - * Set a page change listener which will receive forwarded events. - * - * @param listener - */ - void setOnPageChangeListener(ViewPager.OnPageChangeListener listener); - - /** - * Notify the indicator that the fragment list has changed. - */ - void notifyDataSetChanged(); -} diff --git a/libs/ViewPagerIndicator/src/com/viewpagerindicator/TabPageIndicator.java b/libs/ViewPagerIndicator/src/com/viewpagerindicator/TabPageIndicator.java deleted file mode 100644 index e6f4ea7..0000000 --- a/libs/ViewPagerIndicator/src/com/viewpagerindicator/TabPageIndicator.java +++ /dev/null @@ -1,270 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * Copyright (C) 2011 Jake Wharton - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.viewpagerindicator; - -import android.content.Context; -import android.support.v4.view.PagerAdapter; -import android.support.v4.view.ViewPager; -import android.support.v4.view.ViewPager.OnPageChangeListener; -import android.util.AttributeSet; -import android.view.View; -import android.view.ViewGroup; -import android.widget.HorizontalScrollView; -import android.widget.LinearLayout; -import android.widget.TextView; - -import static android.view.ViewGroup.LayoutParams.FILL_PARENT; -import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; - -/** - * This widget implements the dynamic action bar tab behavior that can change - * across different configurations or circumstances. - */ -public class TabPageIndicator extends HorizontalScrollView implements PageIndicator { - /** Title text used when no title is provided by the adapter. */ - private static final CharSequence EMPTY_TITLE = ""; - - /** - * Interface for a callback when the selected tab has been reselected. - */ - public interface OnTabReselectedListener { - /** - * Callback when the selected tab has been reselected. - * - * @param position Position of the current center item. - */ - void onTabReselected(int position); - } - - private Runnable mTabSelector; - - private final OnClickListener mTabClickListener = new OnClickListener() { - public void onClick(View view) { - TabView tabView = (TabView)view; - final int oldSelected = mViewPager.getCurrentItem(); - final int newSelected = tabView.getIndex(); - mViewPager.setCurrentItem(newSelected); - if (oldSelected == newSelected && mTabReselectedListener != null) { - mTabReselectedListener.onTabReselected(newSelected); - } - } - }; - - private final LinearLayout mTabLayout; - private ViewPager mViewPager; - private ViewPager.OnPageChangeListener mListener; - - private int mMaxTabWidth; - private int mSelectedTabIndex; - - private OnTabReselectedListener mTabReselectedListener; - - public TabPageIndicator(Context context) { - this(context, null); - } - - public TabPageIndicator(Context context, AttributeSet attrs) { - super(context, attrs); - setHorizontalScrollBarEnabled(false); - - mTabLayout = new LinearLayout(getContext()); - addView(mTabLayout, new ViewGroup.LayoutParams(WRAP_CONTENT, FILL_PARENT)); - } - - public void setOnTabReselectedListener(OnTabReselectedListener listener) { - mTabReselectedListener = listener; - } - - @Override - public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - final int widthMode = MeasureSpec.getMode(widthMeasureSpec); - final boolean lockedExpanded = widthMode == MeasureSpec.EXACTLY; - setFillViewport(lockedExpanded); - - final int childCount = mTabLayout.getChildCount(); - if (childCount > 1 && (widthMode == MeasureSpec.EXACTLY || widthMode == MeasureSpec.AT_MOST)) { - if (childCount > 2) { - mMaxTabWidth = (int)(MeasureSpec.getSize(widthMeasureSpec) * 0.4f); - } else { - mMaxTabWidth = MeasureSpec.getSize(widthMeasureSpec) / 2; - } - } else { - mMaxTabWidth = -1; - } - - 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. - setCurrentItem(mSelectedTabIndex); - } - } - - private 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 void addTab(CharSequence text, int index) { - final TabView tabView = new TabView(getContext()); - tabView.mIndex = index; - tabView.setFocusable(true); - tabView.setOnClickListener(mTabClickListener); - tabView.setText(text); - - mTabLayout.addView(tabView, new LinearLayout.LayoutParams(0, FILL_PARENT, 1)); - } - - @Override - public void onPageScrollStateChanged(int arg0) { - if (mListener != null) { - mListener.onPageScrollStateChanged(arg0); - } - } - - @Override - public void onPageScrolled(int arg0, float arg1, int arg2) { - if (mListener != null) { - mListener.onPageScrolled(arg0, arg1, arg2); - } - } - - @Override - public void onPageSelected(int arg0) { - setCurrentItem(arg0); - if (mListener != null) { - mListener.onPageSelected(arg0); - } - } - - @Override - public void setViewPager(ViewPager view) { - if (mViewPager == view) { - return; - } - if (mViewPager != null) { - mViewPager.setOnPageChangeListener(null); - } - final PagerAdapter adapter = view.getAdapter(); - if (adapter == null) { - throw new IllegalStateException("ViewPager does not have adapter instance."); - } - mViewPager = view; - view.setOnPageChangeListener(this); - notifyDataSetChanged(); - } - - public void notifyDataSetChanged() { - mTabLayout.removeAllViews(); - PagerAdapter adapter = mViewPager.getAdapter(); - final int count = adapter.getCount(); - for (int i = 0; i < count; i++) { - CharSequence title = adapter.getPageTitle(i); - if (title == null) { - title = EMPTY_TITLE; - } - addTab(title, i); - } - if (mSelectedTabIndex > count) { - mSelectedTabIndex = count - 1; - } - setCurrentItem(mSelectedTabIndex); - requestLayout(); - } - - @Override - public void setViewPager(ViewPager view, int initialPosition) { - setViewPager(view); - setCurrentItem(initialPosition); - } - - @Override - public void setCurrentItem(int item) { - if (mViewPager == null) { - throw new IllegalStateException("ViewPager has not been bound."); - } - mSelectedTabIndex = item; - mViewPager.setCurrentItem(item); - - final int tabCount = mTabLayout.getChildCount(); - for (int i = 0; i < tabCount; i++) { - final View child = mTabLayout.getChildAt(i); - final boolean isSelected = (i == item); - child.setSelected(isSelected); - if (isSelected) { - animateToTab(item); - } - } - } - - @Override - public void setOnPageChangeListener(OnPageChangeListener listener) { - mListener = listener; - } - - private class TabView extends TextView { - private int mIndex; - - public TabView(Context context) { - super(context, null, R.attr.vpiTabPageIndicatorStyle); - } - - @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 int getIndex() { - return mIndex; - } - } -} diff --git a/libs/ViewPagerIndicator/src/com/viewpagerindicator/TitlePageIndicator.java b/libs/ViewPagerIndicator/src/com/viewpagerindicator/TitlePageIndicator.java deleted file mode 100644 index d02777f..0000000 --- a/libs/ViewPagerIndicator/src/com/viewpagerindicator/TitlePageIndicator.java +++ /dev/null @@ -1,805 +0,0 @@ -/* - * Copyright (C) 2011 Jake Wharton - * Copyright (C) 2011 Patrik Akerfeldt - * Copyright (C) 2011 Francisco Figueiredo Jr. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.viewpagerindicator; - -import java.util.ArrayList; -import android.content.Context; -import android.content.res.Resources; -import android.content.res.TypedArray; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.Path; -import android.graphics.Rect; -import android.graphics.Typeface; -import android.os.Parcel; -import android.os.Parcelable; -import android.support.v4.view.MotionEventCompat; -import android.support.v4.view.PagerAdapter; -import android.support.v4.view.ViewConfigurationCompat; -import android.support.v4.view.ViewPager; -import android.util.AttributeSet; -import android.view.MotionEvent; -import android.view.View; -import android.view.ViewConfiguration; - -/** - * A TitlePageIndicator is a PageIndicator which displays the title of left view - * (if exist), the title of the current select view (centered) and the title of - * the right view (if exist). When the user scrolls the ViewPager then titles are - * also scrolled. - */ -public class TitlePageIndicator extends View implements PageIndicator { - /** - * Percentage indicating what percentage of the screen width away from - * center should the underline be fully faded. A value of 0.25 means that - * halfway between the center of the screen and an edge. - */ - private static final float SELECTION_FADE_PERCENTAGE = 0.25f; - - /** - * Percentage indicating what percentage of the screen width away from - * center should the selected text bold turn off. A value of 0.05 means - * that 10% between the center and an edge. - */ - private static final float BOLD_FADE_PERCENTAGE = 0.05f; - - /** - * Title text used when no title is provided by the adapter. - */ - private static final String EMPTY_TITLE = ""; - - /** - * Interface for a callback when the center item has been clicked. - */ - public interface OnCenterItemClickListener { - /** - * Callback when the center item has been clicked. - * - * @param position Position of the current center item. - */ - void onCenterItemClick(int position); - } - - public enum IndicatorStyle { - None(0), Triangle(1), Underline(2); - - public final int value; - - private IndicatorStyle(int value) { - this.value = value; - } - - public static IndicatorStyle fromValue(int value) { - for (IndicatorStyle style : IndicatorStyle.values()) { - if (style.value == value) { - return style; - } - } - return null; - } - } - - private ViewPager mViewPager; - private ViewPager.OnPageChangeListener mListener; - private PagerAdapter mPagerAdapter; - private int mCurrentPage = -1; - private float mPageOffset; - private int mScrollState; - private final Paint mPaintText = new Paint(); - private boolean mBoldText; - private int mColorText; - private int mColorSelected; - private Path mPath = new Path(); - private final Rect mBounds = new Rect(); - private final Paint mPaintFooterLine = new Paint(); - private IndicatorStyle mFooterIndicatorStyle; - private final Paint mPaintFooterIndicator = new Paint(); - private float mFooterIndicatorHeight; - private float mFooterIndicatorUnderlinePadding; - private float mFooterPadding; - private float mTitlePadding; - private float mTopPadding; - /** Left and right side padding for not active view titles. */ - private float mClipPadding; - private float mFooterLineHeight; - - private static final int INVALID_POINTER = -1; - - private int mTouchSlop; - private float mLastMotionX = -1; - private int mActivePointerId = INVALID_POINTER; - private boolean mIsDragging; - - private OnCenterItemClickListener mCenterItemClickListener; - - - public TitlePageIndicator(Context context) { - this(context, null); - } - - public TitlePageIndicator(Context context, AttributeSet attrs) { - this(context, attrs, R.attr.vpiTitlePageIndicatorStyle); - } - - public TitlePageIndicator(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - if (isInEditMode()) return; - - //Load defaults from resources - final Resources res = getResources(); - final int defaultFooterColor = res.getColor(R.color.default_title_indicator_footer_color); - final float defaultFooterLineHeight = res.getDimension(R.dimen.default_title_indicator_footer_line_height); - final int defaultFooterIndicatorStyle = res.getInteger(R.integer.default_title_indicator_footer_indicator_style); - final float defaultFooterIndicatorHeight = res.getDimension(R.dimen.default_title_indicator_footer_indicator_height); - final float defaultFooterIndicatorUnderlinePadding = res.getDimension(R.dimen.default_title_indicator_footer_indicator_underline_padding); - final float defaultFooterPadding = res.getDimension(R.dimen.default_title_indicator_footer_padding); - final int defaultSelectedColor = res.getColor(R.color.default_title_indicator_selected_color); - final boolean defaultSelectedBold = res.getBoolean(R.bool.default_title_indicator_selected_bold); - final int defaultTextColor = res.getColor(R.color.default_title_indicator_text_color); - final float defaultTextSize = res.getDimension(R.dimen.default_title_indicator_text_size); - final float defaultTitlePadding = res.getDimension(R.dimen.default_title_indicator_title_padding); - final float defaultClipPadding = res.getDimension(R.dimen.default_title_indicator_clip_padding); - final float defaultTopPadding = res.getDimension(R.dimen.default_title_indicator_top_padding); - - //Retrieve styles attributes - TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TitlePageIndicator, defStyle, 0); - - //Retrieve the colors to be used for this view and apply them. - mFooterLineHeight = a.getDimension(R.styleable.TitlePageIndicator_footerLineHeight, defaultFooterLineHeight); - mFooterIndicatorStyle = IndicatorStyle.fromValue(a.getInteger(R.styleable.TitlePageIndicator_footerIndicatorStyle, defaultFooterIndicatorStyle)); - mFooterIndicatorHeight = a.getDimension(R.styleable.TitlePageIndicator_footerIndicatorHeight, defaultFooterIndicatorHeight); - mFooterIndicatorUnderlinePadding = a.getDimension(R.styleable.TitlePageIndicator_footerIndicatorUnderlinePadding, defaultFooterIndicatorUnderlinePadding); - mFooterPadding = a.getDimension(R.styleable.TitlePageIndicator_footerPadding, defaultFooterPadding); - mTopPadding = a.getDimension(R.styleable.TitlePageIndicator_topPadding, defaultTopPadding); - mTitlePadding = a.getDimension(R.styleable.TitlePageIndicator_titlePadding, defaultTitlePadding); - mClipPadding = a.getDimension(R.styleable.TitlePageIndicator_clipPadding, defaultClipPadding); - mColorSelected = a.getColor(R.styleable.TitlePageIndicator_selectedColor, defaultSelectedColor); - mColorText = a.getColor(R.styleable.TitlePageIndicator_android_textColor, defaultTextColor); - mBoldText = a.getBoolean(R.styleable.TitlePageIndicator_selectedBold, defaultSelectedBold); - - final float textSize = a.getDimension(R.styleable.TitlePageIndicator_android_textSize, defaultTextSize); - final int footerColor = a.getColor(R.styleable.TitlePageIndicator_footerColor, defaultFooterColor); - mPaintText.setTextSize(textSize); - mPaintText.setAntiAlias(true); - mPaintFooterLine.setStyle(Paint.Style.FILL_AND_STROKE); - mPaintFooterLine.setStrokeWidth(mFooterLineHeight); - mPaintFooterLine.setColor(footerColor); - mPaintFooterIndicator.setStyle(Paint.Style.FILL_AND_STROKE); - mPaintFooterIndicator.setColor(footerColor); - - a.recycle(); - - final ViewConfiguration configuration = ViewConfiguration.get(context); - mTouchSlop = ViewConfigurationCompat.getScaledPagingTouchSlop(configuration); - } - - - public int getFooterColor() { - return mPaintFooterLine.getColor(); - } - - public void setFooterColor(int footerColor) { - mPaintFooterLine.setColor(footerColor); - mPaintFooterIndicator.setColor(footerColor); - invalidate(); - } - - public float getFooterLineHeight() { - return mFooterLineHeight; - } - - public void setFooterLineHeight(float footerLineHeight) { - mFooterLineHeight = footerLineHeight; - mPaintFooterLine.setStrokeWidth(mFooterLineHeight); - invalidate(); - } - - public float getFooterIndicatorHeight() { - return mFooterIndicatorHeight; - } - - public void setFooterIndicatorHeight(float footerTriangleHeight) { - mFooterIndicatorHeight = footerTriangleHeight; - invalidate(); - } - - public float getFooterIndicatorPadding() { - return mFooterPadding; - } - - public void setFooterIndicatorPadding(float footerIndicatorPadding) { - mFooterPadding = footerIndicatorPadding; - invalidate(); - } - - public IndicatorStyle getFooterIndicatorStyle() { - return mFooterIndicatorStyle; - } - - public void setFooterIndicatorStyle(IndicatorStyle indicatorStyle) { - mFooterIndicatorStyle = indicatorStyle; - invalidate(); - } - - public int getSelectedColor() { - return mColorSelected; - } - - public void setSelectedColor(int selectedColor) { - mColorSelected = selectedColor; - invalidate(); - } - - public boolean isSelectedBold() { - return mBoldText; - } - - public void setSelectedBold(boolean selectedBold) { - mBoldText = selectedBold; - invalidate(); - } - - public int getTextColor() { - return mColorText; - } - - public void setTextColor(int textColor) { - mPaintText.setColor(textColor); - mColorText = textColor; - invalidate(); - } - - public float getTextSize() { - return mPaintText.getTextSize(); - } - - public void setTextSize(float textSize) { - mPaintText.setTextSize(textSize); - invalidate(); - } - - public float getTitlePadding() { - return this.mTitlePadding; - } - - public void setTitlePadding(float titlePadding) { - mTitlePadding = titlePadding; - invalidate(); - } - - public float getTopPadding() { - return this.mTopPadding; - } - - public void setTopPadding(float topPadding) { - mTopPadding = topPadding; - invalidate(); - } - - public float getClipPadding() { - return this.mClipPadding; - } - - public void setClipPadding(float clipPadding) { - mClipPadding = clipPadding; - invalidate(); - } - - public void setTypeface(Typeface typeface) { - mPaintText.setTypeface(typeface); - invalidate(); - } - - public Typeface getTypeface() { - return mPaintText.getTypeface(); - } - - /* - * (non-Javadoc) - * - * @see android.view.View#onDraw(android.graphics.Canvas) - */ - @Override - protected void onDraw(Canvas canvas) { - super.onDraw(canvas); - - if (mViewPager == null) { - return; - } - final int count = mViewPager.getAdapter().getCount(); - if (count == 0) { - return; - } - - // mCurrentPage is -1 on first start and after orientation changed. If so, retrieve the correct index from viewpager. - if(mCurrentPage == -1 && mViewPager != null) mCurrentPage = mViewPager.getCurrentItem(); - - //Calculate views bounds - ArrayList bounds = calculateAllBounds(mPaintText); - final int boundsSize = bounds.size(); - - //Make sure we're on a page that still exists - if (mCurrentPage >= boundsSize) { - setCurrentItem(boundsSize - 1); - return; - } - - final int countMinusOne = count - 1; - final float halfWidth = getWidth() / 2f; - final int left = getLeft(); - final float leftClip = left + mClipPadding; - final int width = getWidth(); - final int height = getHeight(); - final int right = left + width; - final float rightClip = right - mClipPadding; - - int page = mCurrentPage; - float offsetPercent; - if (mPageOffset <= 0.5) { - offsetPercent = mPageOffset; - } else { - page += 1; - offsetPercent = 1 - mPageOffset; - } - final boolean currentSelected = (offsetPercent <= SELECTION_FADE_PERCENTAGE); - final boolean currentBold = (offsetPercent <= BOLD_FADE_PERCENTAGE); - final float selectedPercent = (SELECTION_FADE_PERCENTAGE - offsetPercent) / SELECTION_FADE_PERCENTAGE; - - //Verify if the current view must be clipped to the screen - Rect curPageBound = bounds.get(mCurrentPage); - float curPageWidth = curPageBound.right - curPageBound.left; - if (curPageBound.left < leftClip) { - //Try to clip to the screen (left side) - clipViewOnTheLeft(curPageBound, curPageWidth, left); - } - if (curPageBound.right > rightClip) { - //Try to clip to the screen (right side) - clipViewOnTheRight(curPageBound, curPageWidth, right); - } - - //Left views starting from the current position - if (mCurrentPage > 0) { - for (int i = mCurrentPage - 1; i >= 0; i--) { - Rect bound = bounds.get(i); - //Is left side is outside the screen - if (bound.left < leftClip) { - int w = bound.right - bound.left; - //Try to clip to the screen (left side) - clipViewOnTheLeft(bound, w, left); - //Except if there's an intersection with the right view - Rect rightBound = bounds.get(i + 1); - //Intersection - if (bound.right + mTitlePadding > rightBound.left) { - bound.left = (int) (rightBound.left - w - mTitlePadding); - bound.right = bound.left + w; - } - } - } - } - //Right views starting from the current position - if (mCurrentPage < countMinusOne) { - for (int i = mCurrentPage + 1 ; i < count; i++) { - Rect bound = bounds.get(i); - //If right side is outside the screen - if (bound.right > rightClip) { - int w = bound.right - bound.left; - //Try to clip to the screen (right side) - clipViewOnTheRight(bound, w, right); - //Except if there's an intersection with the left view - Rect leftBound = bounds.get(i - 1); - //Intersection - if (bound.left - mTitlePadding < leftBound.right) { - bound.left = (int) (leftBound.right + mTitlePadding); - bound.right = bound.left + w; - } - } - } - } - - //Now draw views - int colorTextAlpha = mColorText >>> 24; - for (int i = 0; i < count; i++) { - //Get the title - Rect bound = bounds.get(i); - //Only if one side is visible - if ((bound.left > left && bound.left < right) || (bound.right > left && bound.right < right)) { - final boolean currentPage = (i == page); - final CharSequence pageTitle = getTitle(i); - - //Only set bold if we are within bounds - mPaintText.setFakeBoldText(currentPage && currentBold && mBoldText); - - //Draw text as unselected - mPaintText.setColor(mColorText); - if(currentPage && currentSelected) { - //Fade out/in unselected text as the selected text fades in/out - mPaintText.setAlpha(colorTextAlpha - (int)(colorTextAlpha * selectedPercent)); - } - canvas.drawText(pageTitle, 0, pageTitle.length(), bound.left, bound.bottom + mTopPadding, mPaintText); - - //If we are within the selected bounds draw the selected text - if (currentPage && currentSelected) { - mPaintText.setColor(mColorSelected); - mPaintText.setAlpha((int)((mColorSelected >>> 24) * selectedPercent)); - canvas.drawText(pageTitle, 0, pageTitle.length(), bound.left, bound.bottom + mTopPadding, mPaintText); - } - } - } - - //Draw the footer line - mPath.reset(); - mPath.moveTo(0, height - mFooterLineHeight / 2f); - mPath.lineTo(width, height - mFooterLineHeight / 2f); - mPath.close(); - canvas.drawPath(mPath, mPaintFooterLine); - - switch (mFooterIndicatorStyle) { - case Triangle: - mPath.reset(); - mPath.moveTo(halfWidth, height - mFooterLineHeight - mFooterIndicatorHeight); - mPath.lineTo(halfWidth + mFooterIndicatorHeight, height - mFooterLineHeight); - mPath.lineTo(halfWidth - mFooterIndicatorHeight, height - mFooterLineHeight); - mPath.close(); - canvas.drawPath(mPath, mPaintFooterIndicator); - break; - - case Underline: - if (!currentSelected || page >= boundsSize) { - break; - } - - Rect underlineBounds = bounds.get(page); - mPath.reset(); - mPath.moveTo(underlineBounds.left - mFooterIndicatorUnderlinePadding, height - mFooterLineHeight); - mPath.lineTo(underlineBounds.right + mFooterIndicatorUnderlinePadding, height - mFooterLineHeight); - mPath.lineTo(underlineBounds.right + mFooterIndicatorUnderlinePadding, height - mFooterLineHeight - mFooterIndicatorHeight); - mPath.lineTo(underlineBounds.left - mFooterIndicatorUnderlinePadding, height - mFooterLineHeight - mFooterIndicatorHeight); - mPath.close(); - - mPaintFooterIndicator.setAlpha((int)(0xFF * selectedPercent)); - canvas.drawPath(mPath, mPaintFooterIndicator); - mPaintFooterIndicator.setAlpha(0xFF); - break; - } - } - - public boolean onTouchEvent(android.view.MotionEvent ev) { - if (super.onTouchEvent(ev)) { - return true; - } - if ((mViewPager == null) || (mViewPager.getAdapter().getCount() == 0)) { - return false; - } - - final int action = ev.getAction(); - - switch (action & MotionEventCompat.ACTION_MASK) { - case MotionEvent.ACTION_DOWN: - mActivePointerId = MotionEventCompat.getPointerId(ev, 0); - mLastMotionX = ev.getX(); - break; - - case MotionEvent.ACTION_MOVE: { - final int activePointerIndex = MotionEventCompat.findPointerIndex(ev, mActivePointerId); - final float x = MotionEventCompat.getX(ev, activePointerIndex); - final float deltaX = x - mLastMotionX; - - if (!mIsDragging) { - if (Math.abs(deltaX) > mTouchSlop) { - mIsDragging = true; - } - } - - if (mIsDragging) { - mLastMotionX = x; - if (mViewPager.isFakeDragging() || mViewPager.beginFakeDrag()) { - mViewPager.fakeDragBy(deltaX); - } - } - - break; - } - - case MotionEvent.ACTION_CANCEL: - case MotionEvent.ACTION_UP: - if (!mIsDragging) { - final int count = mViewPager.getAdapter().getCount(); - final int width = getWidth(); - final float halfWidth = width / 2f; - final float sixthWidth = width / 6f; - final float leftThird = halfWidth - sixthWidth; - final float rightThird = halfWidth + sixthWidth; - final float eventX = ev.getX(); - - if (eventX < leftThird) { - if (mCurrentPage > 0) { - mViewPager.setCurrentItem(mCurrentPage - 1); - return true; - } - } else if (eventX > rightThird) { - if (mCurrentPage < count - 1) { - mViewPager.setCurrentItem(mCurrentPage + 1); - return true; - } - } else { - //Middle third - if (mCenterItemClickListener != null) { - mCenterItemClickListener.onCenterItemClick(mCurrentPage); - } - } - } - - mIsDragging = false; - mActivePointerId = INVALID_POINTER; - if (mViewPager.isFakeDragging()) mViewPager.endFakeDrag(); - break; - - case MotionEventCompat.ACTION_POINTER_DOWN: { - final int index = MotionEventCompat.getActionIndex(ev); - final float x = MotionEventCompat.getX(ev, index); - mLastMotionX = x; - mActivePointerId = MotionEventCompat.getPointerId(ev, index); - break; - } - - case MotionEventCompat.ACTION_POINTER_UP: - final int pointerIndex = MotionEventCompat.getActionIndex(ev); - final int pointerId = MotionEventCompat.getPointerId(ev, pointerIndex); - if (pointerId == mActivePointerId) { - final int newPointerIndex = pointerIndex == 0 ? 1 : 0; - mActivePointerId = MotionEventCompat.getPointerId(ev, newPointerIndex); - } - mLastMotionX = MotionEventCompat.getX(ev, MotionEventCompat.findPointerIndex(ev, mActivePointerId)); - break; - } - - return true; - }; - - /** - * Set bounds for the right textView including clip padding. - * - * @param curViewBound - * current bounds. - * @param curViewWidth - * width of the view. - */ - private void clipViewOnTheRight(Rect curViewBound, float curViewWidth, int right) { - curViewBound.right = (int) (right - mClipPadding); - curViewBound.left = (int) (curViewBound.right - curViewWidth); - } - - /** - * Set bounds for the left textView including clip padding. - * - * @param curViewBound - * current bounds. - * @param curViewWidth - * width of the view. - */ - private void clipViewOnTheLeft(Rect curViewBound, float curViewWidth, int left) { - curViewBound.left = (int) (left + mClipPadding); - curViewBound.right = (int) (mClipPadding + curViewWidth); - } - - /** - * Calculate views bounds and scroll them according to the current index - * - * @param paint - * @return - */ - private ArrayList calculateAllBounds(Paint paint) { - ArrayList list = new ArrayList(); - //For each views (If no values then add a fake one) - final int count = mViewPager.getAdapter().getCount(); - final int width = getWidth(); - final int halfWidth = width / 2; - for (int i = 0; i < count; i++) { - Rect bounds = calcBounds(i, paint); - int w = bounds.right - bounds.left; - int h = bounds.bottom - bounds.top; - bounds.left = (int)(halfWidth - (w / 2f) + ((i - mCurrentPage - mPageOffset) * width)); - bounds.right = bounds.left + w; - bounds.top = 0; - bounds.bottom = h; - list.add(bounds); - } - - return list; - } - - /** - * Calculate the bounds for a view's title - * - * @param index - * @param paint - * @return - */ - private Rect calcBounds(int index, Paint paint) { - //Calculate the text bounds - Rect bounds = new Rect(); - CharSequence title = getTitle(index); - bounds.right = (int) paint.measureText(title, 0, title.length()); - bounds.bottom = (int) (paint.descent() - paint.ascent()); - return bounds; - } - - @Override - public void setViewPager(ViewPager view) { - if (mViewPager == view) { - return; - } - if (mViewPager != null) { - mViewPager.setOnPageChangeListener(null); - } - mPagerAdapter = view.getAdapter(); - if (mPagerAdapter == null) { - throw new IllegalStateException("ViewPager does not have adapter instance."); - } - mViewPager = view; - mViewPager.setOnPageChangeListener(this); - invalidate(); - } - - @Override - public void setViewPager(ViewPager view, int initialPosition) { - setViewPager(view); - setCurrentItem(initialPosition); - } - - @Override - public void notifyDataSetChanged() { - invalidate(); - } - - /** - * Set a callback listener for the center item click. - * - * @param listener Callback instance. - */ - public void setOnCenterItemClickListener(OnCenterItemClickListener listener) { - mCenterItemClickListener = listener; - } - - @Override - public void setCurrentItem(int item) { - if (mViewPager == null) { - throw new IllegalStateException("ViewPager has not been bound."); - } - mViewPager.setCurrentItem(item); - mCurrentPage = item; - invalidate(); - } - - @Override - public void onPageScrollStateChanged(int state) { - mScrollState = state; - - if (mListener != null) { - mListener.onPageScrollStateChanged(state); - } - } - - @Override - public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - mCurrentPage = position; - mPageOffset = positionOffset; - invalidate(); - - if (mListener != null) { - mListener.onPageScrolled(position, positionOffset, positionOffsetPixels); - } - } - - @Override - public void onPageSelected(int position) { - if (mScrollState == ViewPager.SCROLL_STATE_IDLE) { - mCurrentPage = position; - invalidate(); - } - - if (mListener != null) { - mListener.onPageSelected(position); - } - } - - @Override - public void setOnPageChangeListener(ViewPager.OnPageChangeListener listener) { - mListener = listener; - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - //Measure our width in whatever mode specified - final int measuredWidth = MeasureSpec.getSize(widthMeasureSpec); - - //Determine our height - float height = 0; - final int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec); - if (heightSpecMode == MeasureSpec.EXACTLY) { - //We were told how big to be - height = MeasureSpec.getSize(heightMeasureSpec); - } else { - //Calculate the text bounds - mBounds.setEmpty(); - mBounds.bottom = (int) (mPaintText.descent() - mPaintText.ascent()); - height = mBounds.bottom - mBounds.top + mFooterLineHeight + mFooterPadding + mTopPadding; - if (mFooterIndicatorStyle != IndicatorStyle.None) { - height += mFooterIndicatorHeight; - } - } - final int measuredHeight = (int)height; - - setMeasuredDimension(measuredWidth, measuredHeight); - } - - @Override - public void onRestoreInstanceState(Parcelable state) { - SavedState savedState = (SavedState)state; - super.onRestoreInstanceState(savedState.getSuperState()); - mCurrentPage = savedState.currentPage; - requestLayout(); - } - - @Override - public Parcelable onSaveInstanceState() { - Parcelable superState = super.onSaveInstanceState(); - SavedState savedState = new SavedState(superState); - savedState.currentPage = mCurrentPage; - return savedState; - } - - static class SavedState extends BaseSavedState { - int currentPage; - - public SavedState(Parcelable superState) { - super(superState); - } - - private SavedState(Parcel in) { - super(in); - currentPage = in.readInt(); - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - super.writeToParcel(dest, flags); - dest.writeInt(currentPage); - } - - public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { - @Override - public SavedState createFromParcel(Parcel in) { - return new SavedState(in); - } - - @Override - public SavedState[] newArray(int size) { - return new SavedState[size]; - } - }; - } - - private CharSequence getTitle(int i) { - CharSequence title = mPagerAdapter.getPageTitle(i); - if (title == null) { - title = EMPTY_TITLE; - } - return title.toString(); - } -} diff --git a/libs/ViewPagerIndicator/src/com/viewpagerindicator/UnderlinePageIndicator.java b/libs/ViewPagerIndicator/src/com/viewpagerindicator/UnderlinePageIndicator.java deleted file mode 100644 index a1a2d9f..0000000 --- a/libs/ViewPagerIndicator/src/com/viewpagerindicator/UnderlinePageIndicator.java +++ /dev/null @@ -1,391 +0,0 @@ -/* - * Copyright (C) 2012 Jake Wharton - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.viewpagerindicator; - -import android.content.Context; -import android.content.res.Resources; -import android.content.res.TypedArray; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.os.Parcel; -import android.os.Parcelable; -import android.support.v4.view.MotionEventCompat; -import android.support.v4.view.ViewConfigurationCompat; -import android.support.v4.view.ViewPager; -import android.util.AttributeSet; -import android.view.MotionEvent; -import android.view.View; -import android.view.ViewConfiguration; - -/** - * Draws a line for each page. The current page line is colored differently - * than the unselected page lines. - */ -public class UnderlinePageIndicator extends View implements PageIndicator { - private static final int INVALID_POINTER = -1; - private static final int FADE_FRAME_MS = 30; - - private final Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); - - private boolean mFades; - private int mFadeDelay; - private int mFadeLength; - private int mFadeBy; - - private ViewPager mViewPager; - private ViewPager.OnPageChangeListener mListener; - private int mScrollState; - private int mCurrentPage; - private float mPositionOffset; - - private int mTouchSlop; - private float mLastMotionX = -1; - private int mActivePointerId = INVALID_POINTER; - private boolean mIsDragging; - - private final Runnable mFadeRunnable = new Runnable() { - @Override public void run() { - final int alpha = Math.max(mPaint.getAlpha() - mFadeBy, 0); - mPaint.setAlpha(alpha); - invalidate(); - if (alpha > 0) { - postDelayed(this, FADE_FRAME_MS); - } - } - }; - - public UnderlinePageIndicator(Context context) { - this(context, null); - } - - public UnderlinePageIndicator(Context context, AttributeSet attrs) { - this(context, attrs, R.attr.vpiUnderlinePageIndicatorStyle); - } - - public UnderlinePageIndicator(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - if (isInEditMode()) return; - - final Resources res = getResources(); - - //Load defaults from resources - final boolean defaultFades = res.getBoolean(R.bool.default_underline_indicator_fades); - final int defaultFadeDelay = res.getInteger(R.integer.default_underline_indicator_fade_delay); - final int defaultFadeLength = res.getInteger(R.integer.default_underline_indicator_fade_length); - final int defaultSelectedColor = res.getColor(R.color.default_underline_indicator_selected_color); - - //Retrieve styles attributes - TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.UnderlinePageIndicator, defStyle, 0); - - setFades(a.getBoolean(R.styleable.UnderlinePageIndicator_fades, defaultFades)); - setSelectedColor(a.getColor(R.styleable.UnderlinePageIndicator_selectedColor, defaultSelectedColor)); - setFadeDelay(a.getInteger(R.styleable.UnderlinePageIndicator_fadeDelay, defaultFadeDelay)); - setFadeLength(a.getInteger(R.styleable.UnderlinePageIndicator_fadeLength, defaultFadeLength)); - - a.recycle(); - - final ViewConfiguration configuration = ViewConfiguration.get(context); - mTouchSlop = ViewConfigurationCompat.getScaledPagingTouchSlop(configuration); - } - - public boolean getFades() { - return mFades; - } - - public void setFades(boolean fades) { - if (fades != mFades) { - mFades = fades; - if (fades) { - post(mFadeRunnable); - } else { - removeCallbacks(mFadeRunnable); - mPaint.setAlpha(0xFF); - invalidate(); - } - } - } - - public int getFadeDelay() { - return mFadeDelay; - } - - public void setFadeDelay(int fadeDelay) { - mFadeDelay = fadeDelay; - } - - public int getFadeLength() { - return mFadeLength; - } - - public void setFadeLength(int fadeLength) { - mFadeLength = fadeLength; - mFadeBy = 0xFF / (mFadeLength / FADE_FRAME_MS); - } - - public int getSelectedColor() { - return mPaint.getColor(); - } - - public void setSelectedColor(int selectedColor) { - mPaint.setColor(selectedColor); - invalidate(); - } - - @Override - protected void onDraw(Canvas canvas) { - super.onDraw(canvas); - - if (mViewPager == null) { - return; - } - final int count = mViewPager.getAdapter().getCount(); - if (count == 0) { - return; - } - - if (mCurrentPage >= count) { - setCurrentItem(count - 1); - return; - } - - final int paddingLeft = getPaddingLeft(); - final float pageWidth = (getWidth() - paddingLeft - getPaddingRight()) / (1f * count); - final float left = paddingLeft + pageWidth * (mCurrentPage + mPositionOffset); - final float right = left + pageWidth; - final float top = getPaddingTop(); - final float bottom = getHeight() - getPaddingBottom(); - canvas.drawRect(left, top, right, bottom, mPaint); - } - - public boolean onTouchEvent(MotionEvent ev) { - if (super.onTouchEvent(ev)) { - return true; - } - if ((mViewPager == null) || (mViewPager.getAdapter().getCount() == 0)) { - return false; - } - - final int action = ev.getAction(); - - switch (action & MotionEventCompat.ACTION_MASK) { - case MotionEvent.ACTION_DOWN: - mActivePointerId = MotionEventCompat.getPointerId(ev, 0); - mLastMotionX = ev.getX(); - break; - - case MotionEvent.ACTION_MOVE: { - final int activePointerIndex = MotionEventCompat.findPointerIndex(ev, mActivePointerId); - final float x = MotionEventCompat.getX(ev, activePointerIndex); - final float deltaX = x - mLastMotionX; - - if (!mIsDragging) { - if (Math.abs(deltaX) > mTouchSlop) { - mIsDragging = true; - } - } - - if (mIsDragging) { - mLastMotionX = x; - if (mViewPager.isFakeDragging() || mViewPager.beginFakeDrag()) { - mViewPager.fakeDragBy(deltaX); - } - } - - break; - } - - case MotionEvent.ACTION_CANCEL: - case MotionEvent.ACTION_UP: - if (!mIsDragging) { - final int count = mViewPager.getAdapter().getCount(); - final int width = getWidth(); - final float halfWidth = width / 2f; - final float sixthWidth = width / 6f; - - if ((mCurrentPage > 0) && (ev.getX() < halfWidth - sixthWidth)) { - mViewPager.setCurrentItem(mCurrentPage - 1); - return true; - } else if ((mCurrentPage < count - 1) && (ev.getX() > halfWidth + sixthWidth)) { - mViewPager.setCurrentItem(mCurrentPage + 1); - return true; - } - } - - mIsDragging = false; - mActivePointerId = INVALID_POINTER; - if (mViewPager.isFakeDragging()) mViewPager.endFakeDrag(); - break; - - case MotionEventCompat.ACTION_POINTER_DOWN: { - final int index = MotionEventCompat.getActionIndex(ev); - final float x = MotionEventCompat.getX(ev, index); - mLastMotionX = x; - mActivePointerId = MotionEventCompat.getPointerId(ev, index); - break; - } - - case MotionEventCompat.ACTION_POINTER_UP: - final int pointerIndex = MotionEventCompat.getActionIndex(ev); - final int pointerId = MotionEventCompat.getPointerId(ev, pointerIndex); - if (pointerId == mActivePointerId) { - final int newPointerIndex = pointerIndex == 0 ? 1 : 0; - mActivePointerId = MotionEventCompat.getPointerId(ev, newPointerIndex); - } - mLastMotionX = MotionEventCompat.getX(ev, MotionEventCompat.findPointerIndex(ev, mActivePointerId)); - break; - } - - return true; - }; - - @Override - public void setViewPager(ViewPager viewPager) { - if (mViewPager == viewPager) { - return; - } - if (mViewPager != null) { - //Clear us from the old pager. - mViewPager.setOnPageChangeListener(null); - } - if (viewPager.getAdapter() == null) { - throw new IllegalStateException("ViewPager does not have adapter instance."); - } - mViewPager = viewPager; - mViewPager.setOnPageChangeListener(this); - invalidate(); - post(new Runnable() { - @Override public void run() { - if (mFades) { - post(mFadeRunnable); - } - } - }); - } - - @Override - public void setViewPager(ViewPager view, int initialPosition) { - setViewPager(view); - setCurrentItem(initialPosition); - } - - @Override - public void setCurrentItem(int item) { - if (mViewPager == null) { - throw new IllegalStateException("ViewPager has not been bound."); - } - mViewPager.setCurrentItem(item); - mCurrentPage = item; - invalidate(); - } - - @Override - public void notifyDataSetChanged() { - invalidate(); - } - - @Override - public void onPageScrollStateChanged(int state) { - mScrollState = state; - - if (mListener != null) { - mListener.onPageScrollStateChanged(state); - } - } - - @Override - public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - mCurrentPage = position; - mPositionOffset = positionOffset; - if (mFades) { - if (positionOffsetPixels > 0) { - removeCallbacks(mFadeRunnable); - mPaint.setAlpha(0xFF); - } else if (mScrollState != ViewPager.SCROLL_STATE_DRAGGING) { - postDelayed(mFadeRunnable, mFadeDelay); - } - } - invalidate(); - - if (mListener != null) { - mListener.onPageScrolled(position, positionOffset, positionOffsetPixels); - } - } - - @Override - public void onPageSelected(int position) { - if (mScrollState == ViewPager.SCROLL_STATE_IDLE) { - mCurrentPage = position; - mPositionOffset = 0; - invalidate(); - mFadeRunnable.run(); - } - if (mListener != null) { - mListener.onPageSelected(position); - } - } - - @Override - public void setOnPageChangeListener(ViewPager.OnPageChangeListener listener) { - mListener = listener; - } - - @Override - public void onRestoreInstanceState(Parcelable state) { - SavedState savedState = (SavedState)state; - super.onRestoreInstanceState(savedState.getSuperState()); - mCurrentPage = savedState.currentPage; - requestLayout(); - } - - @Override - public Parcelable onSaveInstanceState() { - Parcelable superState = super.onSaveInstanceState(); - SavedState savedState = new SavedState(superState); - savedState.currentPage = mCurrentPage; - return savedState; - } - - static class SavedState extends BaseSavedState { - int currentPage; - - public SavedState(Parcelable superState) { - super(superState); - } - - private SavedState(Parcel in) { - super(in); - currentPage = in.readInt(); - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - super.writeToParcel(dest, flags); - dest.writeInt(currentPage); - } - - public static final Creator CREATOR = new Creator() { - @Override - public SavedState createFromParcel(Parcel in) { - return new SavedState(in); - } - - @Override - public SavedState[] newArray(int size) { - return new SavedState[size]; - } - }; - } -} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..e7b4def --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +include ':app' diff --git a/test/.classpath b/test/.classpath deleted file mode 100644 index 3308b2e..0000000 --- a/test/.classpath +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/test/.project b/test/.project deleted file mode 100644 index 9b7d0f6..0000000 --- a/test/.project +++ /dev/null @@ -1,34 +0,0 @@ - - - Yaaic-Test - - - Yaaic - - - - com.android.ide.eclipse.adt.ResourceManagerBuilder - - - - - com.android.ide.eclipse.adt.PreCompilerBuilder - - - - - org.eclipse.jdt.core.javabuilder - - - - - com.android.ide.eclipse.adt.ApkBuilder - - - - - - com.android.ide.eclipse.adt.AndroidNature - org.eclipse.jdt.core.javanature - - diff --git a/test/AndroidManifest.xml b/test/AndroidManifest.xml deleted file mode 100644 index 64211ad..0000000 --- a/test/AndroidManifest.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/test/libs/robotium-solo-3.5.1.jar b/test/libs/robotium-solo-3.5.1.jar deleted file mode 100644 index 972b259badc0c7f487375566589c7fb1f22e0104..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58332 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 jE_JM_wSKMCk~HdaR`( - - 4.0.0 - - org.yaaic - yaaic-test - 1.1-SNAPSHOT - apk - - yaaic test - - Test automation project for Yaaic. - - http://www.yaaic.org - 2009 - - - https://github.com/pocmo/Yaaic - scm:git:git://github.com/pocmo/Yaaic.git - - scm:git:git@github.com:pocmo/Yaaic.git - - - - - Sebastian Kaspari - sebastian@yaaic.org - pocmo - http://www.androidzeitgeist.com - - developer - - - - - - GitHub Issues - https://github.com/pocmo/Yaaic/issues - - - - - com.google.android - android - 4.1.1.4 - provided - - - - com.google.android - android-test - 4.1.1.4 - provided - - - - org.yaaic - yaaic - apk - 1.1-SNAPSHOT - - - - org.yaaic - yaaic - jar - provided - 1.1-SNAPSHOT - - - - com.actionbarsherlock - library - 4.1.0 - apklib - provided - - - - com.viewpagerindicator - library - 2.3.1 - apklib - provided - - - - com.jayway.android.robotium - robotium-solo - 3.5.1 - - - - - - UTF-8 - - - - ${project.artifactId} - src - - - - com.jayway.maven.plugins.android.generation2 - 3.3.0 - android-maven-plugin - true - - - 14 - - - - - - - diff --git a/test/project.properties b/test/project.properties deleted file mode 100644 index 8da376a..0000000 --- a/test/project.properties +++ /dev/null @@ -1,11 +0,0 @@ -# This file is automatically generated by Android Tools. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file must be checked in Version Control Systems. -# -# To customize properties used by the Ant build system use, -# "ant.properties", and override values to adapt the script to your -# project structure. - -# Project target. -target=android-15 diff --git a/test/res/drawable/icon.png b/test/res/drawable/icon.png deleted file mode 100644 index a07c69fa5a0f4da5d5efe96eea12a543154dbab6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2574 zcmV+p3i0)cP)Q`Og{P|8RRXpj5bgrSmEzSMfBn+{{vpNxw?;5UX;iv9sYxy_`IQHs$i<61a_iv^L>h8s-`D(`e@|IgS*Fj zNGM876Gf;3D8*1UX9a%v>yJKD*QkCwW2AirU(L{qNA)JghmGItc;(H<$!ABY&gBy1vJIEUj-b8%el*o|VkG)LqNx#TG>Jvj^jIte!!+RY z)T4j$7+PoF1AkRBf}R#^T=-q|PaK1$c<4UH)Hpq3$4WA|xtr!ZQLC=*vNE>O6E9kp+5X0eKB$6>C(lPwI@3#oY zhS_%x7e|j!$yG?ECXmh~EH~^OeuK}+sWoJse3Z3?ha3n`MM9KvA?uqpEnBg4Q46)7 zM$p%a$@l;+O}vfvx%XjH`}a{(-HHth9!JaUwV0*VqGR48^gWNYN<&~7x)y$e!X>e` zZ5!6KZoxbKuV9XUDI%#M1~IVh?pNSdeb~6@$y`v|yk=XK+fHxnDqnUK4&=QRNyIVf zYbDM*cI>~qIy*a7=z7uqkw@agd(<=y-Q7L!ty_23SGdXmahO<;N=wB+j;lNm%=OHC zy zU|>La6h%92y4IPufI$9>Xu!@y`TaNgtg&41@PwMwBdmSm7)xAWDLoqjZ==P2#*k7! z3o1)cVSI3KP_!?d8G^Lg0FtLXC~JYdxi|c%h~lXEixY=%VSFF@!*3&&9>(Rb|iK54Cx5;s~PY5iaV1het%w`dgQFBAJ;aFK zImQC}(|QaCFYUm1JVfzSc)ebv=)ObI)0jwJb``}Zj9J0n0Xgn*Zc(rFM9$xh_makZbm-at_v5^SW zM1y1SW@%+FuIy*WR)i3A2N_q;(YO`O!A|Ts^%z}9ZepCj3ytlw#x%N_fNrKKtPh`< z|1{UqF`4LxHaCQ79+E=uUXCOZ35jAMRz%R%0(P!0FMv=sk>Nr8%+OzY^c-M9@+fz=G`qa@v4sF5u-2289-#$**LWnyNNDwDf1( zkUiMnw|y$tn>pQP=Vn!#|17L^5AGrjtBkN$D@v)Z7LXc5EFhLB4<;7Wehh)CMqX|W zqsiZaO^benJ_hwa&V0ub$-_HUk**?g6fm9|!@kguU6*zhK)$qn-<3*kFrYPIaqR=V zUaUvk>@F_89b@tHs8R!*QKY;INJ<2_U+K6Ca3e9Gsl2{qY0%a7J?uICWgHuLfj+MB z=GkAN1&ifT#2u}B+2S#~$5jA(Qn^;H%CCmIae4AE-Dsng|Hl*Ov!z72k3ZnJs{pp| z+pW`DDueC#mEWOf=ucJ!dTL}hzOeiS-i?m2E;`EKz4<&Lu~NnW?peqVU^@<+T3KKu z{yrI%Qy-Z%HEvLUz}n^~m?7x`xuCtNR#L2En!T>dQtIKdS#V-Hzt3RtwTeYtmQ&dR z6qXZvac*oc@BUYEH%@Ylv_1&tSjkbzzU6*h1(3^C`;1z;g_SmOtclS?KWk2VYE zM*oS<=C483XckW?GN|1jfh3Ro(h - - - diff --git a/test/res/values/strings.xml b/test/res/values/strings.xml deleted file mode 100644 index f4ff21a..0000000 --- a/test/res/values/strings.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - Hello World! - YaaicTest - diff --git a/test/src/org/yaaic/test/AllTests.java b/test/src/org/yaaic/test/AllTests.java deleted file mode 100644 index 70a7cb3..0000000 --- a/test/src/org/yaaic/test/AllTests.java +++ /dev/null @@ -1,43 +0,0 @@ -/* -Yaaic - Yet Another Android IRC Client - -Copyright 2009-2010 Sebastian Kaspari - -This file is part of Yaaic. - -Yaaic is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Yaaic is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with Yaaic. If not, see . -*/ -package org.yaaic.test; - -import junit.framework.Test; -import junit.framework.TestSuite; - -/** - * All tests for Yaaic (org.yaaic.test.*) - * - * @author Sebastian Kaspari - */ -public class AllTests { - - public static Test suite() { - TestSuite suite = new TestSuite("Test for org.yaaic.test"); - //$JUnit-BEGIN$ - suite.addTest(org.yaaic.test.model.AllTests.suite()); - suite.addTest(org.yaaic.test.receiver.AllTests.suite()); - suite.addTest(org.yaaic.test.scenario.AllTests.suite()); - //$JUnit-END$ - return suite; - } - -} diff --git a/test/src/org/yaaic/test/model/AllTests.java b/test/src/org/yaaic/test/model/AllTests.java deleted file mode 100644 index b60e84f..0000000 --- a/test/src/org/yaaic/test/model/AllTests.java +++ /dev/null @@ -1,48 +0,0 @@ -/* -Yaaic - Yet Another Android IRC Client - -Copyright 2009-2010 Sebastian Kaspari - -This file is part of Yaaic. - -Yaaic is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Yaaic is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with Yaaic. If not, see . -*/ -package org.yaaic.test.model; - -import junit.framework.Test; -import junit.framework.TestSuite; - -/** - * All tests in org.yaaic.test.model - * - * @author Sebastian Kaspari - */ -public class AllTests -{ - public static Test suite() { - TestSuite suite = new TestSuite("Test for org.yaaic.test.model"); - //$JUnit-BEGIN$ - suite.addTestSuite(BroadcastTest.class); - suite.addTestSuite(ChannelTest.class); - suite.addTestSuite(IdentityTest.class); - suite.addTestSuite(MessageTest.class); - suite.addTestSuite(QueryTest.class); - suite.addTestSuite(ServerInfoTest.class); - suite.addTestSuite(ServerTest.class); - suite.addTestSuite(ScrollbackTest.class); - //$JUnit-END$ - return suite; - } - -} diff --git a/test/src/org/yaaic/test/model/BroadcastTest.java b/test/src/org/yaaic/test/model/BroadcastTest.java deleted file mode 100644 index 688b310..0000000 --- a/test/src/org/yaaic/test/model/BroadcastTest.java +++ /dev/null @@ -1,65 +0,0 @@ -/* -Yaaic - Yet Another Android IRC Client - -Copyright 2009-2010 Sebastian Kaspari - -This file is part of Yaaic. - -Yaaic is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Yaaic is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with Yaaic. If not, see . -*/ -package org.yaaic.test.model; - -import org.yaaic.model.Broadcast; -import org.yaaic.model.Extra; - -import android.content.Intent; -import junit.framework.TestCase; - -/** - * Test case for org.yaaic.model.Broadcast - * - * @author Sebastian Kaspari - */ -public class BroadcastTest extends TestCase -{ - public void testConversationIntentHelper() - { - String broadcastType = Broadcast.CONVERSATION_MESSAGE; - int serverId = 99; - String conversationName = "#foobar"; - - Intent intent = Broadcast.createConversationIntent(broadcastType, serverId, conversationName); - - assertEquals(broadcastType, intent.getAction()); - - assertTrue(intent.hasExtra(Extra.SERVER)); - assertEquals(serverId, intent.getExtras().getInt(Extra.SERVER)); - - assertTrue(intent.hasExtra(Extra.CONVERSATION)); - assertEquals(conversationName, intent.getExtras().getString(Extra.CONVERSATION)); - } - - public void testServerIntentHelper() - { - String broadcastType = Broadcast.SERVER_UPDATE; - int serverId = 42; - - Intent intent = Broadcast.createServerIntent(broadcastType, serverId); - - assertEquals(broadcastType, intent.getAction()); - - assertTrue(intent.hasExtra(Extra.SERVER)); - assertEquals(serverId, intent.getExtras().getInt(Extra.SERVER)); - } -} diff --git a/test/src/org/yaaic/test/model/ChannelTest.java b/test/src/org/yaaic/test/model/ChannelTest.java deleted file mode 100644 index 66c0be5..0000000 --- a/test/src/org/yaaic/test/model/ChannelTest.java +++ /dev/null @@ -1,68 +0,0 @@ -/* -Yaaic - Yet Another Android IRC Client - -Copyright 2009-2010 Sebastian Kaspari - -This file is part of Yaaic. - -Yaaic is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Yaaic is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with Yaaic. If not, see . -*/ -package org.yaaic.test.model; - -import org.yaaic.model.Channel; -import org.yaaic.model.Conversation; - -import junit.framework.TestCase; - -/** - * Test case for org.yaaic.model.Channel - * - * @author Sebastian Kaspari - */ -public class ChannelTest extends TestCase -{ - private Channel channel; - - @Override - protected void setUp() - { - this.channel = new Channel("#yaaic"); - } - - public void testGetType() - { - assertEquals(Conversation.TYPE_CHANNEL, channel.getType()); - } - - public void testGetName() - { - assertEquals("#yaaic", channel.getName()); - } - - public void testSetAndGetTopic() - { - assertEquals("", channel.getTopic()); - - String topic = "This is a topic"; - channel.setTopic(topic); - - assertEquals(topic, channel.getTopic()); - } - - - public void testInheritance() - { - assertTrue(channel instanceof Conversation); - } -} diff --git a/test/src/org/yaaic/test/model/IdentityTest.java b/test/src/org/yaaic/test/model/IdentityTest.java deleted file mode 100644 index 3378c40..0000000 --- a/test/src/org/yaaic/test/model/IdentityTest.java +++ /dev/null @@ -1,68 +0,0 @@ -/* -Yaaic - Yet Another Android IRC Client - -Copyright 2009-2010 Sebastian Kaspari - -This file is part of Yaaic. - -Yaaic is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Yaaic is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with Yaaic. If not, see . -*/ -package org.yaaic.test.model; - -import org.yaaic.model.Identity; - -import junit.framework.TestCase; - -/** - * Test case for org.yaaic.model.Identity - * - * @author Sebastian Kaspari - */ -public class IdentityTest extends TestCase -{ - private Identity identity; - - @Override - protected void setUp() - { - this.identity = new Identity(); - } - - public void testSetAndGetNickname() - { - assertNull(identity.getNickname()); - - String nickname = "InvaderZim"; - identity.setNickname(nickname); - assertEquals(nickname, identity.getNickname()); - } - - public void testSetAndGetIdent() - { - assertNull(identity.getIdent()); - - String ident = "invader"; - identity.setIdent(ident); - assertEquals(ident, identity.getIdent()); - } - - public void testSetAndGetRealName() - { - assertNull(identity.getRealName()); - - String realname = "Invader Zim"; - identity.setRealName(realname); - assertEquals(realname, identity.getRealName()); - } -} diff --git a/test/src/org/yaaic/test/model/MessageTest.java b/test/src/org/yaaic/test/model/MessageTest.java deleted file mode 100644 index bb8036e..0000000 --- a/test/src/org/yaaic/test/model/MessageTest.java +++ /dev/null @@ -1,73 +0,0 @@ -/* -Yaaic - Yet Another Android IRC Client - -Copyright 2009-2010 Sebastian Kaspari - -This file is part of Yaaic. - -Yaaic is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Yaaic is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with Yaaic. If not, see . -*/ -package org.yaaic.test.model; - -import org.yaaic.model.Message; - -import junit.framework.TestCase; - -/** - * Test case for org.yaaic.model.Message - * - * @author Sebastian Kaspari - */ -public class MessageTest extends TestCase -{ - private Message message; - private String text = " Hello World!"; - - @Override - protected void setUp() - { - this.message = new Message(text); - } - - public void testSetAndGetIcon() - { - assertEquals(-1, message.getIcon()); - - message.setIcon(25); // Normally we use an ressource id - assertEquals(25, message.getIcon()); - - message.setIcon(-1); // The message class uses -1 as "no icon" - assertEquals(-1, message.getIcon()); - } - - public void testGetText() - { - assertEquals(text, message.getText()); - } - - public void testTimestamp() - { - Message message = new Message(""); - - message.setTimestamp(1270505773862l); - - assertEquals("[00:16] ", message.renderTimeStamp(false)); - assertEquals("[00:16] ", message.renderTimeStamp(true)); - - message.setTimestamp(1270908275000l); - - assertEquals("[04:04] ", message.renderTimeStamp(false)); - assertEquals("[16:04] ", message.renderTimeStamp(true)); - } -} diff --git a/test/src/org/yaaic/test/model/QueryTest.java b/test/src/org/yaaic/test/model/QueryTest.java deleted file mode 100644 index c927dcb..0000000 --- a/test/src/org/yaaic/test/model/QueryTest.java +++ /dev/null @@ -1,52 +0,0 @@ -/* -Yaaic - Yet Another Android IRC Client - -Copyright 2009-2010 Sebastian Kaspari - -This file is part of Yaaic. - -Yaaic is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Yaaic is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with Yaaic. If not, see . -*/ -package org.yaaic.test.model; - -import org.yaaic.model.Query; -import org.yaaic.model.Conversation; - -import junit.framework.TestCase; - -/** - * Test case for org.yaaic.model.Query - * - * @author Sebastian Kaspari - */ -public class QueryTest extends TestCase -{ - private Query query; - - @Override - protected void setUp() - { - this.query = new Query("pocmo"); - } - - public void testGetType() - { - assertEquals(Conversation.TYPE_QUERY, query.getType()); - } - - public void testInheritance() - { - assertTrue(query instanceof Conversation); - } -} diff --git a/test/src/org/yaaic/test/model/ScrollbackTest.java b/test/src/org/yaaic/test/model/ScrollbackTest.java deleted file mode 100644 index 303b2ba..0000000 --- a/test/src/org/yaaic/test/model/ScrollbackTest.java +++ /dev/null @@ -1,84 +0,0 @@ -/* -Yaaic - Yet Another Android IRC Client - -Copyright 2009-2010 Sebastian Kaspari - -This file is part of Yaaic. - -Yaaic is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Yaaic is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with Yaaic. If not, see . -*/ -package org.yaaic.test.model; - -import org.yaaic.model.Scrollback; - -import junit.framework.TestCase; - -/** - * Test case for org.yaaic.model.Scrollback - * - * @author Sebastian Kaspari - */ -public class ScrollbackTest extends TestCase -{ - private Scrollback scrollback; - - @Override - public void setUp() - { - scrollback = new Scrollback(); - } - - public void testEmptyHistoryBack() - { - assertNull(scrollback.goBack()); - assertNull(scrollback.goBack()); - } - - public void testEmptyHistoryForward() - { - assertEquals("", scrollback.goForward()); - assertEquals("", scrollback.goForward()); - } - - public void testHistory() - { - scrollback.addMessage("Message One"); - - assertEquals("Message One", scrollback.goBack()); - assertEquals("Message One", scrollback.goBack()); - - assertEquals("", scrollback.goForward()); - - scrollback.addMessage("Message Two"); - assertEquals("Message Two", scrollback.goBack()); - assertEquals("Message One", scrollback.goBack()); - - assertEquals("Message Two", scrollback.goForward()); - assertEquals("", scrollback.goForward()); - - scrollback.addMessage("Message Three"); - scrollback.addMessage("Message Four"); - - assertEquals("Message Four", scrollback.goBack()); - assertEquals("Message Three", scrollback.goBack()); - assertEquals("Message Two", scrollback.goBack()); - assertEquals("Message One", scrollback.goBack()); - assertEquals("Message One", scrollback.goBack()); - - assertEquals("Message Two", scrollback.goForward()); - assertEquals("Message Three", scrollback.goForward()); - assertEquals("Message Four", scrollback.goForward()); - assertEquals("", scrollback.goForward()); - } -} diff --git a/test/src/org/yaaic/test/model/ServerInfoTest.java b/test/src/org/yaaic/test/model/ServerInfoTest.java deleted file mode 100644 index 2af8ad1..0000000 --- a/test/src/org/yaaic/test/model/ServerInfoTest.java +++ /dev/null @@ -1,52 +0,0 @@ -/* -Yaaic - Yet Another Android IRC Client - -Copyright 2009-2010 Sebastian Kaspari - -This file is part of Yaaic. - -Yaaic is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Yaaic is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with Yaaic. If not, see . -*/ -package org.yaaic.test.model; - -import org.yaaic.model.ServerInfo; -import org.yaaic.model.Conversation; - -import junit.framework.TestCase; - -/** - * Test case for org.yaaic.model.ServerInfo - * - * @author Sebastian Kaspari - */ -public class ServerInfoTest extends TestCase -{ - private ServerInfo serverInfo; - - @Override - protected void setUp() - { - this.serverInfo = new ServerInfo(); - } - - public void testGetType() - { - assertEquals(Conversation.TYPE_SERVER, serverInfo.getType()); - } - - public void testInheritance() - { - assertTrue(serverInfo instanceof Conversation); - } -} diff --git a/test/src/org/yaaic/test/model/ServerTest.java b/test/src/org/yaaic/test/model/ServerTest.java deleted file mode 100644 index 22c4543..0000000 --- a/test/src/org/yaaic/test/model/ServerTest.java +++ /dev/null @@ -1,177 +0,0 @@ -/* -Yaaic - Yet Another Android IRC Client - -Copyright 2009-2010 Sebastian Kaspari - -This file is part of Yaaic. - -Yaaic is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Yaaic is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with Yaaic. If not, see . -*/ -package org.yaaic.test.model; - -import org.yaaic.model.Channel; -import org.yaaic.model.Conversation; -import org.yaaic.model.Identity; -import org.yaaic.model.Query; -import org.yaaic.model.Server; -import org.yaaic.model.ServerInfo; -import org.yaaic.model.Status; - -import junit.framework.TestCase; - -/** - * Test case for org.yaaic.model.Server - * - * @author Sebastian Kaspari - */ -public class ServerTest extends TestCase -{ - private Server server; - - @Override - public void setUp() - { - this.server = new Server(); - } - - public void testInstance() - { - assertEquals(1, server.getConversations().size()); - - assertNotNull(server.getConversation(ServerInfo.DEFAULT_NAME)); - assertEquals(Conversation.TYPE_SERVER, server.getConversation(ServerInfo.DEFAULT_NAME).getType()); - } - - public void testSetAndGetHost() - { - assertNull(server.getHost()); - - server.setHost("irc.epd-me.net"); - assertEquals("irc.epd-me.net", server.getHost()); - } - - public void testSetAndGetIdentity() - { - assertNull(server.getIdentity()); - - Identity identity = new Identity(); - identity.setNickname("ServerTest"); - server.setIdentity(identity); - - assertEquals("ServerTest", server.getIdentity().getNickname()); - } - - public void testSetAndGetId() - { - assertEquals(0, server.getId()); - - server.setId(42); - assertEquals(42, server.getId()); - - server.setId(23); - assertEquals(23, server.getId()); - } - - public void testSetAndGetPassword() - { - assertEquals(null, server.getPassword()); - - server.setPassword("secret"); - assertEquals("secret", server.getPassword()); - } - - public void testSetAndGetTitle() - { - assertEquals(null, server.getTitle()); - - server.setTitle("MyServer"); - assertEquals("MyServer", server.getTitle()); - } - - public void testSetAndGetPort() - { - assertEquals(0, server.getPort()); - - server.setPort(12345); - assertEquals(12345, server.getPort()); - } - - public void testSetAndGetCharset() - { - assertNull(server.getCharset()); - - server.setCharset("UTF-16"); - assertEquals("UTF-16", server.getCharset()); - } - - public void testSetAndGetStatus() - { - assertEquals(Status.DISCONNECTED, server.getStatus()); - assertTrue(server.isDisconnected()); - assertFalse(server.isConnected()); - - server.setStatus(Status.PRE_CONNECTING); - assertEquals(Status.PRE_CONNECTING, server.getStatus()); - assertFalse(server.isDisconnected()); - assertFalse(server.isConnected()); - - server.setStatus(Status.CONNECTING); - assertEquals(Status.CONNECTING, server.getStatus()); - assertFalse(server.isDisconnected()); - assertFalse(server.isConnected()); - - server.setStatus(Status.CONNECTED); - assertEquals(Status.CONNECTED, server.getStatus()); - assertFalse(server.isDisconnected()); - assertTrue(server.isConnected()); - } - - public void testConversationHandling() - { - Channel channel = new Channel("#yaaic"); - - server.addConversation(channel); - assertEquals(2, server.getConversations().size()); - assertNotNull(server.getConversation("#yaaic")); - - // ignore case - assertNotNull(server.getConversation("#yAAic")); - - server.addConversation(new Query("pocmo")); - assertEquals(3, server.getConversations().size()); - - // test order - String[] names = { ServerInfo.DEFAULT_NAME, "#yaaic", "pocmo" }; - int i = 0; - for (Conversation conversation : server.getConversations()) { - assertEquals(names[i], conversation.getName()); - i++; - } - - server.removeConversation("#yaaic"); - assertEquals(2, server.getConversations().size()); - - String[] names2 = { ServerInfo.DEFAULT_NAME, "pocmo" }; - int j = 0; - for (Conversation conversation : server.getConversations()) { - assertEquals(names2[j], conversation.getName()); - j++; - } - - // There's a new ServerInfo object after clear - server.clearConversations(); - assertEquals(1, server.getConversations().size()); - assertNotNull(server.getConversation(ServerInfo.DEFAULT_NAME)); - } -} \ No newline at end of file diff --git a/test/src/org/yaaic/test/receiver/AllTests.java b/test/src/org/yaaic/test/receiver/AllTests.java deleted file mode 100644 index e1b27b4..0000000 --- a/test/src/org/yaaic/test/receiver/AllTests.java +++ /dev/null @@ -1,41 +0,0 @@ -/* -Yaaic - Yet Another Android IRC Client - -Copyright 2009-2010 Sebastian Kaspari - -This file is part of Yaaic. - -Yaaic is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Yaaic is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with Yaaic. If not, see . -*/ -package org.yaaic.test.receiver; - -import junit.framework.Test; -import junit.framework.TestSuite; - -/** - * All tests in org.yaaic.test.receiver - * - * @author Sebastian Kaspari - */ -public class AllTests -{ - public static Test suite() { - TestSuite suite = new TestSuite("Test for org.yaaic.test.receiver"); - //$JUnit-BEGIN$ - suite.addTestSuite(ConversationReceiverTest.class); - //$JUnit-END$ - return suite; - } - -} \ No newline at end of file diff --git a/test/src/org/yaaic/test/receiver/ConversationReceiverTest.java b/test/src/org/yaaic/test/receiver/ConversationReceiverTest.java deleted file mode 100644 index 9d8c68a..0000000 --- a/test/src/org/yaaic/test/receiver/ConversationReceiverTest.java +++ /dev/null @@ -1,113 +0,0 @@ -/* -Yaaic - Yet Another Android IRC Client - -Copyright 2009-2010 Sebastian Kaspari - -This file is part of Yaaic. - -Yaaic is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Yaaic is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with Yaaic. If not, see . -*/ -package org.yaaic.test.receiver; - -import org.yaaic.listener.ConversationListener; -import org.yaaic.model.Broadcast; -import org.yaaic.receiver.ConversationReceiver; - -import android.content.Intent; -import android.test.AndroidTestCase; - -/** - * Test case for org.yaaic.receiver.ConversationReceiver - * - * @author Sebastian Kaspari - */ -public class ConversationReceiverTest extends AndroidTestCase implements ConversationListener -{ - private boolean onConversationMessageCalled; - private boolean onNewConversationCalled; - private boolean onRemoveConversationCalled; - - private ConversationReceiver receiver; - private String testTarget = "#unittest"; - private int serverId = 42; - - public void setUp() - { - onConversationMessageCalled = false; - onNewConversationCalled = false; - onRemoveConversationCalled = false; - - receiver = new ConversationReceiver(serverId, this); - } - - public void testMessageBroadcast() - { - Intent intent = Broadcast.createConversationIntent(Broadcast.CONVERSATION_MESSAGE, serverId, testTarget); - receiver.onReceive(getContext(), intent); - - assertTrue(onConversationMessageCalled); - assertFalse(onNewConversationCalled); - assertFalse(onRemoveConversationCalled); - } - - public void testNewBroadcast() - { - Intent intent = Broadcast.createConversationIntent(Broadcast.CONVERSATION_NEW, serverId, testTarget); - receiver.onReceive(getContext(), intent); - - assertFalse(onConversationMessageCalled); - assertTrue(onNewConversationCalled); - assertFalse(onRemoveConversationCalled); - } - - public void testRemoveBroadcast() - { - Intent intent = Broadcast.createConversationIntent(Broadcast.CONVERSATION_REMOVE, serverId, testTarget); - receiver.onReceive(getContext(), intent); - - assertFalse(onConversationMessageCalled); - assertFalse(onNewConversationCalled); - assertTrue(onRemoveConversationCalled); - } - - @Override - public void onConversationMessage(String target) - { - assertEquals(testTarget, target); - - onConversationMessageCalled = true; - } - - @Override - public void onNewConversation(String target) - { - assertEquals(testTarget, target); - - onNewConversationCalled = true; - } - - @Override - public void onRemoveConversation(String target) - { - assertEquals(testTarget, target); - - onRemoveConversationCalled = true; - } - - @Override - public void onTopicChanged(String topic) - { - // XXX: Implement me! - } -} diff --git a/test/src/org/yaaic/test/scenario/AllTests.java b/test/src/org/yaaic/test/scenario/AllTests.java deleted file mode 100644 index 9bc4e23..0000000 --- a/test/src/org/yaaic/test/scenario/AllTests.java +++ /dev/null @@ -1,41 +0,0 @@ -/* -Yaaic - Yet Another Android IRC Client - -Copyright 2009-2010 Sebastian Kaspari - -This file is part of Yaaic. - -Yaaic is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Yaaic is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with Yaaic. If not, see . -*/ -package org.yaaic.test.scenario; - -import junit.framework.Test; -import junit.framework.TestSuite; - -/** - * All scenario tests - * - * @author Sebastian Kaspari - */ -public class AllTests { - public static Test suite() { - TestSuite suite = new TestSuite("Scenario-Tests"); - //$JUnit-BEGIN$ - suite.addTestSuite(ServerListScenarios.class); - suite.addTestSuite(ConnectionScenarios.class); - suite.addTestSuite(ChannelScenarios.class); - //$JUnit-END$ - return suite; - } -} diff --git a/test/src/org/yaaic/test/scenario/ChannelScenarios.java b/test/src/org/yaaic/test/scenario/ChannelScenarios.java deleted file mode 100644 index 2b814e0..0000000 --- a/test/src/org/yaaic/test/scenario/ChannelScenarios.java +++ /dev/null @@ -1,97 +0,0 @@ -/* -Yaaic - Yet Another Android IRC Client - -Copyright 2009-2010 Sebastian Kaspari - -This file is part of Yaaic. - -Yaaic is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Yaaic is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with Yaaic. If not, see . -*/ -package org.yaaic.test.scenario; - - - -import android.test.ActivityInstrumentationTestCase2; -import android.util.Log; - -import com.jayway.android.robotium.solo.Solo; - -/** - * Scenarios regarding channels of a server - * - * @author Sebastian Kaspari - */ -@SuppressWarnings("rawtypes") -public class ChannelScenarios extends ActivityInstrumentationTestCase2 -{ - private Solo solo; - private ScenarioHelper helper; - - /** - * Create a new ChannelScenario instance - * - * @throws ClassNotFoundException - */ - @SuppressWarnings("unchecked") - public ChannelScenarios() throws ClassNotFoundException - { - super( - "org.yaaic", - Class.forName("org.yaaic.activity.ServersActivity") - ); - } - - /** - * Setup test case - */ - @Override - protected void setUp() - { - if (solo == null) { - solo = new Solo(getInstrumentation(), getActivity()); - helper = new ScenarioHelper(solo); - } - - helper.createTestServer(); - helper.connectToServer(); - } - - /** - * Cleanup after test - */ - @Override - protected void tearDown() - { - helper.disconnectFromServer(); - helper.deleteTestServer(); - - solo.finishOpenedActivities(); - } - - /** - * Scenario: Write a channel message - * - * - Connect to server - * - Join test channel - * - Write a message - * - The message is displayed in the view - */ - public void testSendingChannelMessage() - { - helper.joinTestChannel(); - - helper.send("Hello Test-World"); - assertTrue(solo.searchText(" Hello Test-World")); - } -} diff --git a/test/src/org/yaaic/test/scenario/ConnectionScenarios.java b/test/src/org/yaaic/test/scenario/ConnectionScenarios.java deleted file mode 100644 index 7729e9d..0000000 --- a/test/src/org/yaaic/test/scenario/ConnectionScenarios.java +++ /dev/null @@ -1,101 +0,0 @@ -/* -Yaaic - Yet Another Android IRC Client - -Copyright 2009-2010 Sebastian Kaspari - -This file is part of Yaaic. - -Yaaic is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Yaaic is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with Yaaic. If not, see . -*/ -package org.yaaic.test.scenario; - - - -import android.test.ActivityInstrumentationTestCase2; -import android.util.Log; - -import com.jayway.android.robotium.solo.Solo; - -/** - * Test scenarios including connecting to a server - * - * @author Sebastian Kaspari - */ -@SuppressWarnings("rawtypes") -public class ConnectionScenarios extends ActivityInstrumentationTestCase2 -{ - private ScenarioHelper helper; - private Solo solo; - - /** - * Create a new ConnectionScenario instance - * - * @throws ClassNotFoundException - */ - @SuppressWarnings("unchecked") - public ConnectionScenarios() throws ClassNotFoundException - { - super( - "org.yaaic", - Class.forName("org.yaaic.activity.ServersActivity") - ); - } - - /** - * Setup test case - */ - @Override - protected void setUp() - { - if (solo == null) { - solo = new Solo(getInstrumentation(), getActivity()); - helper = new ScenarioHelper(solo); - } - - helper.createTestServer(); - helper.connectToServer(); - } - - /** - * Cleanup after test - */ - @Override - protected void tearDown() - { - helper.disconnectFromServer(); - helper.deleteTestServer(); - - solo.finishOpenedActivities(); - } - - /** - * Scenario: Join a channel - * - * - Connect to server - * - Enter command: /j #yaaic-test - * - A new conversation with text #yaaic-test appears - * - Disconnect - */ - public void testJoiningChannel() - { - // Join channel - solo.enterText(0, "/j #yaaic-test"); - solo.sendKey(Solo.ENTER); - - solo.sleep(1500); - - // Assert channel joined - assertTrue(solo.searchText("#yaaic-test")); - } -} diff --git a/test/src/org/yaaic/test/scenario/ScenarioHelper.java b/test/src/org/yaaic/test/scenario/ScenarioHelper.java deleted file mode 100644 index 9282757..0000000 --- a/test/src/org/yaaic/test/scenario/ScenarioHelper.java +++ /dev/null @@ -1,174 +0,0 @@ -/* -Yaaic - Yet Another Android IRC Client - -Copyright 2009-2010 Sebastian Kaspari - -This file is part of Yaaic. - -Yaaic is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Yaaic is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with Yaaic. If not, see . -*/ -package org.yaaic.test.scenario; - -import org.yaaic.R; -import org.yaaic.activity.ConversationActivity; -import org.yaaic.activity.ServersActivity; - -import android.view.View; -import android.widget.EditText; - -import com.jayway.android.robotium.solo.Solo; - -/** - * Scenario helper for performing common actions - * - * @author Sebastian Kaspari - */ -public class ScenarioHelper -{ - private Solo solo; - - public ScenarioHelper(Solo solo) - { - this.solo = solo; - } - - /** - * Create a test server (RobotiumTest) - * - * Starting Point: ServersActivity - * Ending Point: ServersActivity - * - * @param solo - */ - public void createTestServer() - { - if (!solo.searchText("RobotiumTest")) { - solo.assertCurrentActivity("Starting at ServersActivity", "ServersActivity"); - - View view = solo.getView(R.id.add); - assert view != null; - - solo.clickOnView(view); - - solo.waitForActivity("AddServerActivity"); - solo.assertCurrentActivity("Switched to AddServerActivity", "AddServerActivity"); - - solo.enterText(0, "RobotiumTest"); - solo.enterText(1, "irc.epd-me.net"); - - solo.enterText(4, "YaaicBotium"); - - // Somehow robotium doesn't detect the field when using index 5 - EditText realname = (EditText) solo.getView(R.id.realname); - solo.enterText(realname, "Robotium and Yaaic"); - - solo.clickOnButton(solo.getString(R.string.server_save)); - - solo.waitForActivity("ServersActivity", 2000); - } - } - - /** - * Connect to the test server - * - * Starting Point: ServersActivity - * Ending Point: ConversationsActivity - * - * @param solo - */ - public void connectToServer() - { - solo.clickOnText("RobotiumTest"); - - solo.waitForActivity("ConversationActivity", 3000); - solo.assertCurrentActivity("Assert is ConversationActivity", ConversationActivity.class); - - solo.waitForText(solo.getString(R.string.message_login_done)); - } - - /** - * Disconnect from the test server - * - * Starting Point: ConversationsActivity - * Ending Point: ServersActivity - * - * @param solo - */ - public void disconnectFromServer() - { - // Go back - solo.goBack(); - solo.waitForActivity("ServersActivity", 2000); - solo.assertCurrentActivity("Assert is ServersActivity", ServersActivity.class); - - // Disconnect - solo.clickLongOnText("RobotiumTest"); - solo.clickOnText("Disconnect"); - - solo.waitForActivity("ServersActivity", 1000); - solo.assertCurrentActivity("Assert is ServersActivity", ServersActivity.class); - } - - /** - * Delete the test server (RobotiumTest) - * - * Starting Point: ServersActivity - * Ending Point: ServersActivity - * - * @param solo - */ - public void deleteTestServer() - { - if (solo.searchText("RobotiumTest")) { - // Delete server again - solo.clickLongOnText("RobotiumTest"); - solo.clickOnText("Delete"); - - solo.waitForActivity("ServersActivity", 1000); - solo.assertCurrentActivity("Assert is ServersActivity", ServersActivity.class); - } - } - - /** - * Join the test channel - * - * Starting Point: ConversationsActivity - * Ending Point: ConversationsActivity - * - * @param solo - */ - public void joinTestChannel() - { - // Send join command - send("/j #yaaic-test"); - - // Wait for channel joined - solo.waitForText("#yaaic-test"); - } - - /** - * Send a message via the command line - * - * Starting Point: ConversationsActivity - * Ending Point: ConversationsActivity - * - * @param solo - * @param message - */ - public void send(String message) - { - solo.enterText(0, message); - solo.sendKey(Solo.ENTER); - } -} diff --git a/test/src/org/yaaic/test/scenario/ServerListScenarios.java b/test/src/org/yaaic/test/scenario/ServerListScenarios.java deleted file mode 100644 index d0ba19b..0000000 --- a/test/src/org/yaaic/test/scenario/ServerListScenarios.java +++ /dev/null @@ -1,131 +0,0 @@ -/* -Yaaic - Yet Another Android IRC Client - -Copyright 2009-2010 Sebastian Kaspari - -This file is part of Yaaic. - -Yaaic is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Yaaic is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with Yaaic. If not, see . -*/ -package org.yaaic.test.scenario; - -import org.yaaic.R; -import org.yaaic.activity.ServersActivity; - -import android.test.ActivityInstrumentationTestCase2; -import android.view.View; -import android.widget.EditText; - -import com.jayway.android.robotium.solo.Solo; - -/** - * Scenario Tests for the ServersActivity - * - * @author Sebastian Kaspari - */ -@SuppressWarnings("rawtypes") -public class ServerListScenarios extends ActivityInstrumentationTestCase2 -{ - private Solo solo; - private ScenarioHelper helper; - - /** - * Create a new ServerListScenarios instance - * - * @throws ClassNotFoundException - */ - @SuppressWarnings("unchecked") - public ServerListScenarios() throws ClassNotFoundException - { - super("org.yaaic", ServersActivity.class); - } - - /** - * Setup test case - */ - @Override - protected void setUp() - { - if (solo == null) { - solo = new Solo(getInstrumentation(), getActivity()); - helper = new ScenarioHelper(solo); - } - } - - /** - * Cleanup after run - */ - @Override - protected void tearDown() - { - solo.finishOpenedActivities(); - } - - /** - * Test-Scenario: - * - * Add server: - * - Select "Add server" from the menu - * - Add all necessary information - * - Click on Save - * - The new server appears in the list - * - * Remove server: - * - Long press on the server in the list - * - Select delete - * - The server is no longer in the list - */ - public void testAddingAndRemovingServer() - { - // Delete Testserver if already exists - helper.deleteTestServer(); - - // Assert server does not exist - assertFalse(solo.searchText("RobotiumTest")); - - // Add server - View view = solo.getView(R.id.add); - assert view != null; - solo.clickOnView(view); - - solo.waitForActivity("AddServerActivity", 2000); - - solo.assertCurrentActivity("Switched to AddServerActivity", "AddServerActivity"); - - solo.enterText(0, "RobotiumTest"); - solo.enterText(1, "irc.epd-me.net"); - - solo.enterText(4, "YaaicBotium"); - - // Somehow robotium doesn't detect the field when using index 5 - EditText realname = (EditText) solo.getView(R.id.realname); - solo.enterText(realname, "Robotium and Yaaic"); - - solo.clickOnButton(solo.getString(R.string.server_save)); - - solo.waitForActivity("ServersActivity", 1000); - solo.assertCurrentActivity("Switched back to ServersActivity", "ServersActivity"); - - // Assert new server exists - assertTrue(solo.searchText("RobotiumTest")); - - // Remove new server again - solo.clickLongOnText("RobotiumTest"); - - solo.clickOnText("Delete"); - - solo.waitForActivity("ServersActivity", 1000); - solo.assertCurrentActivity("Switched back to ServersActivity", "ServersActivity"); - } -} diff --git a/tools/check_languages.rb b/tools/check_languages.rb deleted file mode 100755 index 48dba45..0000000 --- a/tools/check_languages.rb +++ /dev/null @@ -1,108 +0,0 @@ -#!/usr/bin/ruby -# Yaaic - Yet Another Android IRC Client -# -# Copyright 2009-2010 Sebastian Kaspari -# -# This file is part of Yaaic. -# -# Yaaic is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Yaaic is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Yaaic. If not, see . - -# TODO: Use a XML parser instead of reading lines - -base_path = "#{File.dirname(__FILE__)}/../application/res/" -original_file = "#{base_path}values/strings.xml" -languages = [] -items = {} -pattern = Regexp.new '([^<]+)' -lang_pattern = Regexp.new 'values-([a-zA-Z_-]+)' -show_keys = false - -show_keys = true if ARGV.length == 1 && ARGV[0] == '--show-keys' - -# Scan for languages -Dir.new(base_path).entries.each { |directory| - result = lang_pattern.match directory - if !result.nil? then - languages.push result[1] - end -} - -puts "Found #{languages.length} language(s): #{languages.inspect}" - -# Grab all keys from the original file -file = File.new(original_file, 'r') -while line = file.gets - result = pattern.match line - if !result.nil? then - items[result[1]] = result[2] - end -end -file.close - -puts "Found #{items.length} items in strings.xml" -puts - -# Check all langauges files for keys -languages.each { |language| - keys = 0 - check = items.clone - untranslated = {} - unused = {} - language_file = "#{base_path}values-#{language}/strings.xml" - - file = File.new(language_file, 'r') - while line = file.gets - result = pattern.match line - if !result.nil? then - key = result[1] - value = result[2] - - check.delete key - if items[key].nil? then - unused[key] = value - else - untranslated[key] = value if items[key] == value - end - keys += 1 - end - end - - translated = items.length - untranslated.length - check.length - translated_percent = sprintf('%.2f', 100.to_f / items.length.to_f * translated.to_f) - keys_percent = sprintf('%.2f', 100.to_f / items.length.to_f * keys.to_f) - - puts "Language #{language}" - puts " * Keys: #{keys.to_s.rjust 5}/#{items.length.to_s.ljust 5} #{keys_percent.to_s.rjust 6}%" - puts " * Translated: #{translated.to_s.rjust 5}/#{items.length.to_s.ljust 5} #{translated_percent.to_s.rjust 6}%" - - if show_keys then - if check.length > 0 then - puts " * Missing keys:" - check.each { |key,value| puts " * #{key}" } - end - - if untranslated.length > 0 then - puts " * Untranslated keys:" - untranslated.each { |key,value| puts " * #{key}" } - end - - if unused.length > 0 then - puts " * Unused keys:" - unused.each { |key,value| puts " * #{key}" } if unused.length > 0 - end - end - - puts -} -

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%0A03X%h@VcJLH+gJm3sMzG=X1S%0K z-=mrqE&?8lz8Q#^IWX_~sfx^TuWOUlHfxmM7RTsf1v6(v-UgAEJ%pf2vALaKey zfO%y`q9^3{HF0K8GI3*~M(cS9Ykktq-k@MJU8b4N zuNgJ-Lb1EgP@=Mccp&Ge&J-EDhd2>`8xXdWBPWB%svvtfpco#i~ z6nbwX3LA0YQ9*DTfv`9nsGJV`chOplI}_-Jxe|%6Ia1d3Z*OhQ7z0x@IiT4T{%|c~ z!7}Ro9&+IaB4ssZ`!D(02V>;lP?Gtzf{t=^{fvo%-S^r2wAhr?fV)cM;MkN)@YN-2 zqgN@#%ft}vB!eE5$_Q4z*CKc;6F>q}S`}H~i1Vzg=u?RUixY_>jj)E-fPyJ6gLaix zV_lZS<|(8XBkjgGo_?ow}UiMxW;4oGo!~3(6z-Ej0)B^w1K@a_&uq~KgKv8fI;oOw}_w*2RHHasiPq}lvgUF4~VN6=yyxwkDGR%py@7| zWS_(-pN45&in}2Ue@qFLj7K~Gnx zuV?xZ%X~>sSOT9aX+D@&wn(p7MjwQmTLkxPqi=KWT}1b6BX3M@d`PcN{EpkYEVF!$ z&x6rBNY{6`emVsCppD>>66fMx`TeOp0CjG|y!9O?g5eH0zz|6;-7@_`_WA9Ey-9H0 zR=7=g_Ta?Lsyi%rO;|c9LTn*JI6~_LkX5)&cq#EBPsA}?k0%s_Gk#M;{Ip;9lVoCq`zTe+9I2& z5VZ_rsS`-sLWi`4*I6JZq2nhc>?7RQo%*)Zs{oVXNYb5Euo)g+e*MoDNpuCNI-JJ97H(vE*~%>LJ+xVwKa9O{LOWO^nYG;qT1- zrK>AGz{ovsL{3^W`uI>i?y!jF#BP46k{RO#E%^!M1uex1XIOJsMVK23bIDIq!KvY6 z!(g*P3aH=>4)chR1qc4-yLP=9DW6G(mWR|f1)h)uc_02CFrvlMif-A|Vv?`6cy<{n zff+0vRxJh$$LedSHiNs_WMa?4(QCp>al(D&DwNS@SPhW*qyv@#Y>JUC z&gQ`cn(ZG{xgfW^Pr@dCYb0?A*>uC`u>03(#;L3d&ekwjqK(V@D9(kVjuGvHuo20T zqCvv?ulsVpP@ouwtJHh#!qFluA(=ei&@!D@<1TfWa~RDIUS)!BV6h}j`%#RGNf+Vz z|PU}c3CQj&AYjg+<|3Bo~bI@5hL5gbwJW-1NTgN1aG ztu9ryYtF}QG!~SAYpj}7T}RB0Oc%XR3T)$}`jBHPE?(9(SP0XiGFC|OuQ-dHcF*)r zCb*Ox^&h1N9JDSahu~s>`ua(w@)a}2xs;cX9TkjMkf^o-p+}){xN0I0&s+`{cI?5( zg`1ey7a5{3aOzU$7<}6}!IT{l1vw`Tgoe-+FfSRn*JL8lvu&YyuT-I(Ke|uH3TX=& zf^{{ueKjmho)8&3^o=-`MN|~+EhulPC>CP1MU%SrMh(JjRzfBNq>?K!!dhD&gLvgX zROMdRAjhrqmOnz|Uk+S~s~D+W=rj^_UF2@%`Jz4&FTVdOVP-5TZVy~uW~-)S4%LHi zxY4^Mc>U?1g752nUYxxH02h)`j6mYv`~H1@MC}yoNAkD#b)XUOSYYR#Z+Rl3cFfZ} zzJ>&sv?KR&IbvDA!OHZ??nbDp4pGVGHl2I{YUC zr`;^{AUi5?HKqIA0?=*0?Xd^xuiA4iy9OVUABF6n-4_s|NYW6@Ks}}lU|4?rLUS}$ zA%b$u^luZb+J!r|@?Ao9wBei~-qRs7Z*bBYw2pgu<}kq-p=$UZz_fnY^e#bN;WW1^ zygv@6ill~p+Fy040_@*y_J7!I^PhF;|A|=qKM>gs30q%C$hV=cgh4G2k@Cte78ZYa zYm^v)Ey8e-{)7@e5?g-{*9e=H^WY8X0-t1ARJ=FfH(L-d6jQofD3w>aA9h@hOk6ov z7Yzh(Z6b-t}M@%tbD?i)W4lkLt1TNn0;ut)^QMK z_*UegqMVi!IkXsL)tV)p^p+adCBH(j-H8(=-0YQT6jQx#yj+8%>QIbz7NE_5l7@Qd z^;ou?WPFTsF9!|pesXXFqfs?DkoH-+la|%sSN%hbMYMP{C~W%6ldP~b5R$`@oUEWu zCcDhd#_}`kOh?IT4_O1!rqLdC46-%QmCQ>ku!#&mF6AR=E&YZ|bUz12@ly}Gx6d$d zdI0E?{KouxECo=YS7$KU!03+YSTRdypQVU@tES)EqY;o|vbxYM;BGgIgSo}AsV-(P z=a#u_8ovJ6G-^51I)ftpPGfdf`ertzYV|m>R56yuJvkOX zc&D^gt)LX$+E&-kY|9&auGn4F(bv8PF~cXmq;$JUu$nY5Z}xr7t= zCp1v?Q(Mm*QhF?4GWOT3>BOfXB;Cw|a}-V6oCA#T*7YDJ=GX--Wz;+y>gz_boW14> z;vO@zmL^~~5N8Xb&>u94bWC@suXyUrh+5-UyekNB(a+;`Hj=3G=d4lN)3O1rd~Z0r|+ja zIGHmxD?dU;O)51D(i|ZysAB8u(By`B=`cJq#oQK57b8Bii_vQ7XqmV}sXI<5S8G*u z2p!#DGxLU$vEAHh9g;N~h!w-xZSRcEb0sF}s8}H(n?egpJh<<#e0KYq37}1*=04{V zb^`U3y&N3grlvUK=c?Qu;DWNDrfMfE%*U&AgP@QYFZwag5#33ZrBI!_%gd{J1F(c~ z_~8nn#NAJXqPs1LvUHsaH&sVtIy$!JK=mB1-$uY}k+ECY09hPEVCA^%;nUQ3J z-pGA%YQ)f6KG~WmdVXQB2uIlwdZU(n1i{QQAqZ|dp)8x$kl@udKg488-WCxM93Y@Y*2knY=CSTN9WA*(=exADDv`Rlt%dk8!}U$2vylKvuu3eZqUHo^27TWid8 z%n<&dS7>gyI*Py}nB8Vh43T(;?^c^{M1S}QaG1zGn9r;S5>LuLSfAH#h+iM!!vSb= zMFRQYW(KJc;ADhhVuWuzlQE=(;GtmGP&E{VWb^swMBV@_zQ4DGm*IUrXOLEjDt=Dc zbPr|aVI9Fx+(Skcntx(7`>R{bIYCZ5k6*=apfDT8ddgk%+GCM+B8-$CP9TcVpL*2o z|3<-|XQt)P@8GmcGMXR$)TzbDU!mUt)MhD}DNl{GrHNdPvK8<#x{A3rS@tNe;2GZ@zpThR%4|-+RG4so zoVUr5eo~O(=Fe=#f3Os+ydK8C^)^)L0N zf~4e^4E)OirLt<_)m!D-MA;6ZT^R%~G)b7h@X3kI%xELgO5?`VUH%$B`(1w5in6mO z0y0gClxge9c=&FtkI2`V+U>Z{36crdA(ckID$rfPUXf(f2I02hfHb$doJhO`gfdPv zt2~+6G!Mnmh!Oi$@yg~|o8*@lLNKGWvgE+% z=JQ&PEE(fG>FR>2wLZKt_SU&r+&m<3X?=04p}?SS6=+Hx)tege(TDw+LU7~9$Exz6i%>h+oE&MKm{ov%3IFvEiAUwf)xxfaU&iys z$nu00Ub(MzNX9U^670{vR1ifvpZw^xe|LDP3HkYmvO2V@@j<+wzqBJ=c~L$6)O6+9 zMy%bY=59RD0RmeA-h$JAu4Mn7O}1UhP0*y#A@~8@<0z#3h=x6CK!=19$&P_5!f+VN z6KUvQ2boayYle>nvG8?ft0Ui-uFX0VH*ddvU? zL>Q26Jy0PL7R@#>LXN;(feuoP(01-Z4lHHE#8s1crk`*4UsKk75^u&EOXa8v1VDrXeaZMpzV#GDpRh{pbV9)^xs~)1q2QjSF2qeU4AIvb zsrNn^i>xv(>q5KX$FHrAgw@{z??BkDB&=lWg%)AICe{C8eZ!xT5DkNho^D`>1v4Se zCK<6hH;XU@-G;GKc^4^d$~jjxZ~=QM{?O)G%dwo?uO{wDcGkjZ`5NT8`2bYMZirgA z%=Dr!e~1t^)!gSu+`ln#hj07>8B8F0zEIb5P2hr>g2k)eiD-C&qqAQmt#}wQ9$gKD zSY|vrQa_~#MG|US_kdLYO2$u?82`Mszf2m?shMt)YLz-XZJ~Aa&Vx66TYeE5LD1C^H zi_E=x|72=c+5)vZ-1Qz$QkOiHSa(2*Dz-;|Ky>g7*c3A%R%@Tef_Qs*pE&1s5%33*d1$?~=jW8=KtVtL7Q$S1+Q`zht!|)P2FL1lp2d+HDKrxeXW?LKUo6Y`{pQeF zZp>@t=UZ!(|Chovp8Q7*x^Nd1up8n4d2(K;VH(sS3^t>a($*;q*U=I&#`>KX_cYU- zl^qs_4vSWc^Fv_a21@zD9H$|R%yCf0djb;@<<{-yGHX$9Pf)hp1ydb2$5CE{Md@^j08C9_H zISXe7BHj<+32?I)HPBQDz>PxTf)f+7K78XQ^G$rqPXY6Vk~Gc|K$zJ~fr(^!jrJ>m z9}UGTg4mV4GxS0>7?*+NqM>ZzYH6k_x1PR>7VEol*eP}-!|43G=yboiU>M3eNG!h- zHe(HXGz%HhSt}| z8WN`dXvP@qk~U~VpA+yEkc0+=B1WzOdiah~qNMOGnJ|{T%y(^7C#e#9?KTJCsvl5B z2-^(+7mDFb4X^>398@yfwmtiO!p-FU;H-EGz$VwQuiqUDZF=@Fk2QswTD`efZ&NvL zbP4_RViHv_9}PTSzvvg?OEbC~qZes=tV;U(GTKhESdw=YD%J~C62o}q@6K_?gHpKz zTRa%!#5V6kxcJx}`+TvY4mqQ=g6R}51W@w|pllRz#9|J-s_WeNUoFpZJx_=pH~0uI zvz?`_iIT)&k^aTAF>}89`8?u}q8P33I1I?#$TO@yyBA`7SEtG73SCCq;05xwb7k>| zI*fgB)@h&4r8Y;VVuHeco_*a~!6%TNXlSh;Yv2Y4WRF^;IKFjJpP^B6jBj`t=yZibI(Zd@q?IE>Hj-XglKENWH@4RXh_v5NJ zZ6K~6lt7H0B-qC6c8Y^4`?f3Hfvd{1^mbtH+4Rua}CSwO)UBVyjX z0NSMUtK0L1oG$TYp-#MsNF}w7H{E88mj9HREl+&~`{OKAg1={Y{}uar{?q5!q?S4x0wvo*q)0VIEz{yTEacg9LO45L}ETBm|JvW?ZF^zVFQHx zBzMH>48O7NS=~axE7u=}Zy=mi;=8-{(tDybAI6#Wi^G|c>*$cQWyGud$nb^eDEsbr z*4EP#&(YIl=hdYb0Dz3%*?C1X06LZe0HDgQkTrRjeo%EFY;m}u7!`@Uhyh4g9I;3o zy0igISPk)D9J;IlP?!TElDJZAs*nL=n4!2-ODaIRn|M3}cvMZ%Lvn*sETSV30+yl_W{7Xnx&8|J~@rI;A9 zdt8s&1nXvX>Md@uI*t@ESIOq23L|=96h2Fn8&-xFjLNgX%%q#taRo|(msgEjp3B4d z>H<(#5o>{!W_j3t^uuEiVuG_rT3`37Bv^ocr*iH>?y4C1s`lD^O*lMRb-ZJXX1nyq zBdGM{B0lh;vD|*N@PH6`x*4=^d^?6IQ{P~1&f1YZsKTa_p@3@(>G6&GI*pQTbjp;M^tXqVa0jsb1E`d>3rMgIXPulTWA)@7446?z&bb?| zoF3wpsVnu>*-Hy^TPuq@<{xh~7Y~3bT?IG4-JhWjqWH^7hBdN_E#M$Dy53a z<+dmp=JQrBADZ@M{PhTFh1!nTx7)337{5sbU-TsVF6mzR;xUjXGKT9-R6?+E8z1av z_P9-aY`|6lJnlknmrXmV%_67%Qa!qR<@wP)5gOs*7@)IfqRPXH+ewOhdN-8!VMM%} zWa5@;T3w*fL0#nai4rC`wmXOjCg>@U_(bNx_3S2DLex8l-rt)mrb$j4OM|v*ps-ak zj*=&^%bfX5V|?`++YHh6<~}ZVynj90a@&iLMGAY7L;51G-#sD$!Kj|OaglCm9V>D` zB7FwBAm8+C9CUZ+MVS$yuWrw+{BjLbT4M-~isQo!8EKvDnz z6T4C-VGhLT3hf-We5M&uJyJBwBrU;e3;ve@7`K)jhnS(>g#;j~#1=kYc!)=JxeP(H zqFm_CI#s{=m%1&wGFP8LRVIH9YHXcHpkNM1Qp6qt#~cfACP_C!ICpZ=NuK?I<~vp>!>E$LyZnr2F*i^wyF(jLq}TSA8?GXdq1 z{USI#^thLy6^pFQ!;Ks>Mo$(#!L(O?3D*+tO68e`jNs2Sxtgl3Al-=4RISp@^Mipb zDTp|Y9DIe%wC^6_^S!7?14bZ8hz%J@E>NS%_^|1T=e6ru6}) z>OtkJ<--$Sf{pxKA;xH>K%(JZy&1<{H84@J+K;2Pc=b zo$IFu2>lw?*v<2-nu2uzvaD#l-f#;w&5(7e6;pcbqZc!q04Mca{8o?WYmQQc{)M2r zG$eBtV_Z+{XKT=8HQgaX3kaGq@f)7DLps@vnoH874f%ek$Yey0jHzWYOoC&fdXP6 zPMpLb$I>V5R76)h)#^3nCF}3P!wFkhi~5jAlx0K*tMAeb_^k$?M$^@_iqaaey)csc z^m=d9hzXwrcgW9y+)7Kdd8sSp z&4%)e`Kal@_b-nj!+1(9vtYx53G*gdV9|mw=$x7@2N8Lg-?1I-NeeEWK}!Q%{k}IJ zfN74}2aa_=bUcy5d4qO|^i*JHLYmrF!z4Rib1hExOzjxVPKp4k#-i?SYb^2;j`uiM zBm`iIt@pdZvBozCjZ5#>hH0@Xu3S_^1khAu2*HD|jjZ<^lcsE#YTvk(WL`m5L)$~)gic0 zp4B0`aGu@7zW^||jeBG@zlwdNH3t{>$f<`H`yE>!BlbJBURLaPWc`%*Z~v^Zo)qfI z9<~B6$yI`RyUz&6$T$BNf={*{F9sie2KGDh4^jUquM5$rL9P;oBZRyiPT@P_(x_6(g_d|(E=JW8I4xk{ip}m}|`SxSQdi4R!do(%xQSv|w zOLUdr3#npJqkAwoHrQ1b2u{Ruyqbd!vpba7hbCWdj>pBRcr8hr+=2LQ6Y!=gD^N4L z$RDO;#XGsAK)?V2&_VN0guYv&AKWk$J(>AU{KQCZG1yMt^L_y`2GlJel3IEquzF$(xZ5s3 znko&zQku)CBQFYx1IGY|R6PcrP~qcC-E`HFk}Q6@62Qa9{V6-BdQ?c>(BB5Nlsj;! zT@MMYzZYP2n|I0!P)fS@8QXFA7QBNooaoMM^`bDER2l)Rm0to$CZ|S0O=KVkRxm~) zU7>ZQVC7K1n?lLeqpZREPJlf5^57Y@0Tn=01(qAdmK(=%8p&`+KpKq$u#any!&4Db z23ry%&n`-ykhSv-yCoE6SBv&z0gy@NGk~rpC`9m$(wL0tCt67t>H|PA6S=D+h(jLU zIzT>XJS%?9FO9>Oc>q98C*TqRRkHL(5`FzH!+df>kzCtHJkB?k8qp&_1T8q5Y6$LI zSMt3p(BMuL(ae362bfbxLd8NtzLtFcZ2JesCXpg8WuM_kME$L84HY{4gfDy$tilJz zx*mvn1tf6pJNw#LwZ~xiprhkvfxvoeGSqbe3ckIV*Md{yLL7e##j6VuvIXO52dG zk!vzd6W=m9m>~_ zESCa8?UgwxaosN20)Ha<&6o-a|I;M+Mh@6#02S3uPDXpwQg!f*;Qoi&=r~bm4VUAO zk|}?O%DV1az9VWeQ~Q{ivg{Jv%>efHs}qRsfrDY3dJi?AFyx=}_Tcnf={ikti0dO@(JD_395n%mArC}_Vh#n)MYDwv8 zT!>tnA)}AY@dMvLb{j zAAkGZBz0~GY~VQGU&b8fWgui#mA+gmX4ME+BWrAsgYhk+m{jHKA2<>j6qkn4h!_BV zeOX+X7vSdtiAyWw?WI=ZL3)2@;IDi58>abw5aLFOkmaRozOZFBuzoEI1AA$MElh;+ zuXO+j(=HJ_=So{905-5;sgZ05&DH;I)tSD`B4*VASCd6y08u78o=@7ypO88dx(vip z!xguzVr?)^jZ{Zp9?2mpT(Mc;-ww~d_MX0Pm1ergE%t88nko0_ztN5WCDwt3dAl@A z3p#%dlbFR}RKhi#ad})-cAC*+v7*(1R&h9?>>AL7>BAN$|Bhchs3fZe>;1URH8+0)I zCuo=QGswMuIX>^v+q3n6EtB`!bsI>Rq%~Y)BFPG--N&EAu6*SBqZ}LnKo`w_61)Em zVA}mN5aquC%)gSm|A&4F0S9vl?{}Blv5Un(a+S9RHs^$bLm$v$=#0j)y>Gdhq|=rfdGs z7XAN*1^r)g@5-1O3!pz%o8gBkEtsbta}S|;Ey%2TDKWknvVulsTR=rc+t8)^Zn^qC z;H_NG0wqZQAcYB-$>HzMmzND6V7CFUXqRZN-u%6b?-bE9)R8O;mvffcpt@KS`sk55 zjQStUaWdex^`RNH_qm7<86~i`L2n*Zlkpv z`d0C$+TYu;0XaB9oKYl?9tO{55pik9xeSjG$41dP5L-V#iQ07sOu@ckvV*ZevY8cC z`7KhIk}J^6f)NZ^FYZ2mk7|hXzmA}I~ZfqtmI(y(e?%f*jVl>k4s%|5!> zjkqqY(OR!V7WJzFM*{$TT82|69LZN8)@LS`F>UbxEhq>OEu*oeO0Hs?oc8qNtU}#Q z@iGyjYcgX;lpIbtK0{%F;d4C|Z~StWo$Q$dvFUqB0hmb@p03s5C#)%SOHLIEI89{< zHvKpw@W}N68?pLz2CARsMg#P*TyscqQYAErW*#u(MK!cBE`23+hY|>2Fn1_xxX93k z<=G(FQz_-HB~LQp6zuX`C)eKjab~HHxd8-t5-onp{!E2Ub5{3^l1hT3}z}s^? z$)59| z-U&u(0hjRiZ(rJC@B{*WMPPpDd4KO)<=V2q9uX!VOhi2x5OlSEb!|JyBZX)zqdE)P zyETZRsr3BC9G>pn_PhNDs`h|z8`q@k;KL3Pd6SAp@O0N)KCXTbz^kJ6i1a6(3*7=A zq{ZnXOw2E9XT^hCI&wb#%SXdhc)hpqG_qkuxu4tFm-FqLVuhcqHS4*RZ^@XSIQH$o zTIlqH&j|?}>N!Yy_eXGZuc%iXXk~Feur0~C!T;FdUKXu1=3h(z;NPm||6vmQ-*@=G z>DRyJvp+ugM}N&ITklVFt8JncF4_TutR0SKP&{ z(`jMP0kODFHM18h$6EdC>u2Jl>qIFIn07_9rWK5Ekb@E8*2zVy?CH95TGwo&$?{H$ z*DI?_kddKCTfbh4HQ|$PzmHTLB>%ke(DDEHOr`+@(M+uri2LbFxb2Kp*pe)N975F z9m=|2)a$oTYY#i?N+@#5P=8-FIS&3jQWB7g*m)%{@|~Xk;5Guo%|A%4!>Iatr;)H8TXYhSwxpd4o1$z8uV>X(2H`q$3r(??!(n;W788$Kt#OmSRcP;u#~ z9l_eD6)@@~Ee4gA{0v0FU>If^3)Bxx83V^)^4ugnigh=dik?`4`N48;l*;Ll$4pdJ z!U=0n58H>5i)#I;Rc}YS9?T3Z7;GwfM2ROYq%A&nEl*y0sZ20RV$-R+SrJAOp?a)V z!!1}#PQ|L~ta_fhVi=OX;lI3d5k!JJ4Wtq#KGJBY-?jRy&LO}+ul}Bv_vvKj>)8A~ zKKsYL&}59*peNpA!+;~_bvvR3k*tq1WJ-W`8=!smk{wg zUfzJ&hATwzbWEs3$>u~>>kXw| zrBf^j$O?bTLb=iscrVShaw8&FwpzAQx4o3u?-01p0K8BPmj2CRv4p}k`x|LD<7pUE z2V+aJIe_PSZP8FRZED?FU>411dILQ?;Fd6#sl^xM3F5NsYNpF>h(m-^#>9%|I(Qg1 zLd!>GWUY*B0%7OoxntWGRJ*;2M=iq`v$U$>MaGEx`8#r^r07>*h7^-PA5?nRSZ{!; z?V|XvPQw%4nN3qiZv=u5aZ0maMnNCkIJP)UN&;DO9}(K6{Shs265_S<3k7r4PWC?C zLz%a0iuPrWr9Z%X@11w``ua#c;o&fGxvkur{mWrIn8YJ;&ELT&j1k%+!3bI5IAKEg zrl%k|8ov7F=aj+j&M1QIz$Vcb6WKGemor|XC7-6!6`qp4*0Oti7E$2Mf@r4Em3z{q z*8=KSB<_DSf1iyIx6-E&JTk8Vx1#j9wTwG5R zY>rHAA$*-);MIO1?wNf!Jc-gq_De#zD8NrJ)EFg<>AE28%-DP;@eZ1|lfoD3#3W(7bD?)%dlzw(SjqKD`lTa> ziYk?Pq<0Y{7KuPL4(VNj1Wcp+Dj;oRUwP68XFdg%4=PZDKx>(02Wyalo}0G@@_LaZsidi|pHfW; z7U<8k)?nH^#@o`Qp@@#Q4xeeGH+=63zVd=Ic_OEkVNROwD5QnPjC> z4!Er2QrS+dEmQJN`9s}a)TWMne~M2ebXO!9zv89g-wtdN`e)DZe~3^1#r&&is$wZ4 zf55dA6HG%SNm`m0LMdhFTthYDkOD`-AZ4b3uhgH+`Vwc;4`zX%HII z;CbHj>%Oy`@+QPaf|MhV_np^GeLT88uB;rL-;LqP`T*HMui3-!M-habbF}+LvG+dv z#?(VN(Zcd3L=ePGKs4@#3P%0>Ch9*1PxKtBuSK48F49NAiBkMhSZ~=T-7+8RYJn0Q zc;4!wU7;2gyrGwR9CA9L5@$%{)@@h1mECj(TYTDh;(z-Z+{{oT^_ir7y`kEJB<5XeGi*RyBJc9KQe}I9YZWUVz0R&FCyR&F^8n)Sfod5GMr=M&PS@+aw;$_j}Q_Q zoGH6BL)4#<*^g1&s7NpMEK#|$vn3DGLI#1^08(yr_$u$nH8nTV$fmuWz(gffeQKJcQP*x~!5OT^ zmOoX4A_HinwSHt%Y^vf0D^0-*IhyLe86%I@3m2(<+MGEWjX@;kf!%E`3!md;jxN4^ ze@>UseWh47u6=jzSG?!fyM*?`IbDL6GT9sgjuG;-Ac!GDPhAt$1K4s>@6A3i#S_Gq{KgXuQvlb;*sc;yY})(*?Ef1A z)Q&k>mmzeEy9nCaDI_c=xkf;Xq1ADp)^u2~5bhhT-R6jw5YV#V{Tk8C`{kaLGl!zv zmZS!<<%W_mHw;fyHa=_S8&n^7DB7dlr3Z{>R1Yw*7zS~W=wv&J!rKc!gK(HNG89U@ z1a>%D4`&i_iKl;k7cmcgUSck>yU@u>R=*g#M9d}OXz2T&<=_+RRGRgdl)36JQs)1U zj$QvLW&Z1_>wm6%CFn0_+W&=3{##%-f!79-B7jek*a$)%TaTzhLR$h6Ncb&TAyz|4 zo;Z+ovdrpWIqm|)jf^(4g#8+z9S9MP*3MV-`}i^{2-2#cvSfBzR@N0;y7uqAsV6*u z3WF9PqzDwP?*S9StSQS{to8%_%7A;xkItT&KbNhnArn{mWg*9%>VM(F{nkd|P1cTK zT#(t8u$2r>UsA6{?wXG4?$usWmM>^qox3@MJpj|6vd@38TR4H|1{}NbLTTi|5Dp*B zaV^+_2HvR4-_iRPSi{q*A5;Ise9S(Y$8Qzx6&Qo=V$D`s?}zBX+3i9R7FhO^(9gy5 z^U=6^o|CKPnAWz@s3i?JSUggV?8}^YY~zf@nXUO(kg~oIwUZcSNV4K}T)OQ66M7hJ zXWhFn+7H*`v-PoFHr509BAiFquM7zVfx#{kh^V;RSR%P4AXjJ@Ft`RbI^s5m0e+=$N6+0M?^!HLd=na;)B*p*IB-_+QF z-$>ui$=Kn4GHF)wn&O`mF^~josA;7A{0q}9=)}oECdB^T-vCiOp~rTC>^wlQwj<+^59Tdtxlfe(j@Vs zDOuQ%WDHdBU60-tGr1D;u~EZzrqkyd9DCL2q= zPiqNQ{k(+|#hMeh1nNY(#+FLjV_ueE#2A?OHzF*Gjt+)6&d)g zRa|jrq14Ou{CZ_njj>=aEbtrL!Phr9)Tc^)sL9LDzgBc;BRc(G5O{7 z0K%T2`gDwri>L>qno)fJjjJ-P0B<&c+7ngGRF!S6pI?nxIo7CxZn9xyJ+tD3CLWXI zsohYKS8B0r`ZdyTY=&oPL9Bqbphb)xOcQb~N!4WIA|%e~yV3GcU$FVv6W$2M#MPdq zPLN~dAY<6?JxV`LR83QP$6ev!@6Kt0YGxKq0FF&T}; zybx@`wYGNMll`o`8;VDTK_h)gIVX7Ljm#4>8HF7#>Ga%YND7dtzM7vTeff9HL*&#z zEU5iwM&LS-Di`cE#{E)(28RU3BvpfhIZSI#l9o)hE)1C2WuE8Y{l#G+X?2^Zyb0RjM zFb$R~6b5?Wc^0*b&y9A^gx+59&n>5Y@UTT#u6y)A`MyzMzrRK9yf+_xaCl0(LE3lt z%A(3AY&(;CfDr!%5#SP?enJZL`8GSXH_E3EKms9%q0^nUJ1huA3lvy`v`x}Jq|{@a zf`P~xcfL<>|69CmI!67lKwfl|AZ!DrIUI)D4xdP!>R1;~Cx2xmOfb~*s+X`AR?t@= zIutrw;@g&S5QhJRt27}SLn6J7VQ402V98d`l-!wP&jhCfE!&}kVf>h@B0Wuf>X`|_ zVbe9J#`CR@S}LTB{rc1=l;WFn4Dz1ZF4tr$L48diPGrLR5H5&4!m}no)!u7ud*4j* zPt97DFtXTXaX4(h+wz#_tYR(5l+;+EPDg*6x|{ykbJ%&vw(}lv0Yy9Up021Vzk+>FLeRusavK4x zk5iU7x`H8bDkdt|vIjVxk!!^qkvHd*VP2RFCFpUOGL)Rt2!NG2aY?F{5hCoPrxug1wRUpFu08 zkeA-S&R|`MGfwXYFQp{UbWB9>ENdxIi7FC^U+0~L%`md!Eo_$|RN4^Qn&IyJiOI^6 zR+?c!zJHLRdq&ZKAK{6tX#s zXUXyqJ$c`Lcz6M#8X7AT>=9Tzu;Ypz@w{lvJ{1N@+3m({niQHj+4}=OvnV}g{Zvo5 zHL-)xfbJ`Z724Q#AtLewWi1b%Q8LR@)NSY}=*_Z(L2y3>fwp;9S85I`t*{bDKT{YE zKPfg&O(X(Z*(sJeA|}J7aQ2mTsq&mj{CeF7`5Vn&qGI$`fxg?GDW^l|mJ%%Uf*W7@ivxS1YcWLeLB5q$QkUst;u2oG;mLvIr7W(D<`LxPp|r1M%H#$M@N#K1aw; z>N_o}hd8jjUfZn~PvAp}a#Lz2T#D;=d>vYhw^EJ1%{#{J_h_)eUFwE5l2PTmb~u9| z>$jx1LBzR0Y&$7Sal`o`wW}-MihXw#NEuK~)b0e36!6+6;4j|gY`E@0pl+{x7U7u? z+{~uG6rn595IYjHGW9uSIFG@473sO2!MfKlGNMV$_M4An7MA-ns6XY*B;0Gylc$N! zv@tHhbM4d@_$9jKtp4a1k3~jyP}cgj$ub?aR#&vs6zPX}+0D#}UgL3EaHnf){d;%D zN#SJ+4P?H6y#|XHgTHblx?{r=k&n?={~r_eKlLGGOg;XWegl~>(8=__ZvF4;{Z-|h z=G4*orc&sJzC;wxgVU8FY{^5XDTsuR8D<4p)g}^~vDk8qH~eNYG8rKqDKU*7xn%79 z)@HZttb)xwSAXtzd||k>!!NZAlr~T6f$O-bKIb`FCmr#7e|c5_!TQ1%2$;0el-kpU zgvpu`6w%UWuxKvYsSlxr_jLO0dnV*$J+aQT)ID*%lGH^m4YcwW z+?9%4J?vb_$FaF$%BwQJBbed73j%G!-!Kwjk#(a4O^R$^%LCKdbe*r^sa`s2yi)~G za!XSuO~w{??Y(_+qiNA0Ie!X#;Mf4ePxy+rAKYHAA%*iaUsQ6i;PZLH`X%iNES&ImUxvyLZlDtV(#HFzy`SkvYkMS2k(HjhY}CEpT6x$?QrT(TvJVjns`eh^9xYeIt8W;Pap^ zrHXaZ7UaxU{_Xhm=}s8cq)LIXMe+`MH1 zE<+P`kHKydXZrPLXS@xK;3IB+8Md2f2F6Ftmsfr^ucJ0sC(JU0vwWyHdnv z;sw%paqP-n8lQi0tzSB~37gQ2zGzN;dcmC)&2PlNY?@`nKEUY1rU^c_>-^8~Aoc%0 zWAndz;{V33Xec?&i6g%;e5usLD1wkCjzbpCa}_R77G6aSVdoTF$RO+QNxGLxiPg-L ztR|-fWAwSO-^tH*m4;=_z7K{f@v(eYDD|QoV2iLtT~L{NJa=w-@o97OYMUMF%KZ(x z4SHUV-77)EV65MRf$_VUhJYV);v+05enIeH)<&OjnOR4kkel)Tw#^EW%UV>kT#c`5 zdOUR~4PV}_u>&sxv34L69nDfxlWrPnhKRvC<}7WtfjKo}LQ}TN-#79>72Rq7LGO-8 zK<^k@llh5*Zfm)W3qE6~wLQm8cI$|&Lz`(sdZU51b*pTl-80XA@-&luYj&-7zau&W zN7lJ8%^ch9X)#8!qMxM8o;`~QurJB3;cjS`(Q4fK^V#v~QxoVc{z;x!m7T`ohzx0F z|L#+xuB8kEi>`E#RE)Y!uDH6(Kn2@pZ4a^6X9_o%S36e@w?u`6q_S|i^eVw;yXB|# zRQSN;VImY1+gBMizFc_D^^j=b*U-b07cw*KJKezEd3OAltM?P;jj%cV^3>yR*yld6 zJ3IUvr+ZqfQ!6O9Yzs)wR=RMH_ zhq!xGg0$4u%9%dj@n~kQtx4e+<+8HqE)gtHEvE~4%@EwiSgW<%#i3Pc-{QJNZqI2l{ zn&nx$6JoKA!}zzs({?n5?zm17MG6&uHi~IC^I`Zzi8Jm{QcSmuZ#~)+9wGAJm{Pf} z*dOD{!bN8a+iA!-Bla~vV;G;My+eZ7=0&;rGItIuuzoU-3Bq907YS$>F@97rEdSzB#+yB+9$xl~YhyrD94&X^rZ z4+>>@+ro>swDUd84ONu~aCz}oIKZ03Z~vp?E)K3c)vxgVLY?tM5+Xg&qEX^ZH09J+ zq7GxX1sMhU>D&Sx(YJ}%(`YaNoCttF`Ujb-u7(37T7r0wRu(A}1*$ffJuqzYm$Y10 zI-rzhCeSbeHInvUpW#tHm(F>U`a(03z1mRC2TcKXSi#?Of~KZJhrxRy8Rv`AnypaWT-FK+@JPPi5hq;vzQceUiQ8hvp=k9Wd zPC0^PCoztSs- zwb)ZUj?c2soSvN@oPB@4U7>a3x6AGD5)@xzSB&y19hS3LkMgP&8W2hLiHlInJE(jI;J7P?-TWfv$v@j=Ray~*%TW4;`r-LItxNZ@LSG2Ta-txeU#7} z<8s@6M6Sl&zlTSDR%}Sd@VTM*mhv!jM}yz2dqP+>)-`n&2hz19k(U z>o;olAi(<9aDxo$Jzo>UXvz>1mX@&&(nAELx)iF?X|~Rd^kSo;4D+(@Nvi61e>iN( z?O=akJAf&s-5&r6|7$zh9|s-Y%3A=UT0BF|PP}A-MZnorKX@m>;d!^h! zAnlZTCGys6HgTqb@df`E9v2@r8QxOpUbE<;1>`nM$Z>j+P*m0@j_Dh6aCx_{63it% zduhc&9Cv()jveqH-W~$wJ?Lb*ni3Ap1nC6tVp#EM}*03G3qBKA? zBsk&mcLn15#1q=SI>_f+jaKDnhnn z04B9H*mH^b#dkK*w8*mP9sd~5$G1O2}y1^+bJKLIrUZicE_I@_44 zI6GQ8e1!ZD7=)d<&BwNSJ5wPW8xf#`ld2=o&dJQ)(e__9U8Sn?SCRgP3G0uXulrs1 z2bEza2}-{;%D^{xR<+NOJ~u$iR8$H%t9r5b_!{m&roF&e{*NMkih?an@vbK{Yomc{ z%k6&se(hn(0EBM04iTS~+l;w%kA|gVxc8SBqvPpNdyKW_G;pUigdBkbo4aXo5hobX&8j5Uka-Hxb*c5K};f}jZdyXQ=WgG7H=$#;BOZc@>Qh_hA4WFU*m zzTLvZuWxEsy41Rs81v8ahYhA7qCFL;LxMA|12<+qI*&TuJVt7&rsr$Y_V^V0)%Z+N zsmIzeifL>^)R*G52TmNzSFhZGbvv!SjGVmC;49Tb=YeL0J5RH#295W&SBsuK*83AF zF^XT<*=c%Yz4T$FDnuX5u&wb>`wZoVu?LFJTHqB}y2yUij{Qz>pF_73+cz$_6gNeE zvfTgitDA_7BfiOX5Y zO|wwKK98fCkxDX3>@w&~;q@)16S{Ia2$lU#0xX0~3H3cj&-%H_XsR)v4=6rA=f_qM zz*B`IL$KuK?*|x{&&Po2}84UWc<)$Ucp_oR{oGdQnHsB zDMv^c&&d#`(3>K?FvIULpLXm%qlu2Hx-||Ppvev_`hnV3T2GczmrExowvS z@CnO4CeDXJXqgt`4j4qFa6m~7(>$9^L%i_e5;f?t2s1~2AyJ<8`x_~ER-U#~_A!wU z`ES#Le~zrE{*X2QC#L;d`!&|Q@H9}~@wGZ7H~SsWl|B!_giy$rXDq`&JWz}&w>Q#p zCG2h&87|JQZq}}h@pBH^E4tDGk$=CJt2PKDiPWL680=$D=w0Fbtf)YB#u-6xD zxMcYr0}r!S(znvNoF=nos@~sDra&gQW0lqeu}ItrJ7*)oJ4Z*BIG?yFx3>2)v%Dh{ z?VYai=&iHLlY98pMNda5$erbFK=m0mG-heZ9yk>{SMPst@Q^ktj!9LnT?y)E6b1 zC@j*^KDQfLdY{AgO@0#}GI58Zol|}pi%_D|DXCUSPjTG}iuJW$b~ z!uZK+b|DcWDb_GwUziSQ32-=48=Dz*nSaAr7^$gH|2Rp=DngkwmOqD>Qlz%`~-m9A)wCgP1m;>m1^6v^L&+t`Ro>^cAnH9fuj zeWvksHTX^ z__Li1OP=~Vd7SDv&rL~OZME_(qIZZ9rgJZ-V@k)8iZN$r?#~V4=5w>^>XwT?Ot@pT zicx!)thG%0-7adVe@Y8$L?w#?Cz#yzP-xw#&(AiGN`)Ajdgcac@T`J&Zsj%7565oR zn>Q*;ezwOUC{ES&c23cx3X$;jzrg%U0rG zbV4Q7hZ$8>s!{j2I^nF(mh=2-fpbb}sa8{s++p5o?_A??#cTTFO1>IPch;)5TBfue zerBvwm$dp#y%EhR;t=zDSf}ZR)}B#oyAb5}P3bYu4x`qh(v>6VY2< z&BYCg>P*-sdQ=qp3~P0*35!?!pKG3_=X;c5!nimv)UwjUM(Vv{@~~9WR67YlV~@2# z6tsb58wVvqn{^_~Q=(Fz8(yO%*qs>hRO7+eAt98W6c6^GyaGo`# zwpKO5Yni38IzvvUr43b%H^HH%gA6NA(=^YCf~={Toi$txN^{Hu-Ed4hjiE2kq+gKO zayvL>{TL>dLwQDd)S_lyb?07rCj_PeeqY}pypaj5#)nQ`L~QSonpOm6jr_1<8&4?L zZYi}tPUpc1?}?BVz6jrfPKbxI?q-wP`~Q|NlfTl>;B8(fUVIV`DS`8C3uHNa7!@QHcwnBal?l2s411Yq=2#AhH zeBd7KVV}XdHe8Xb6Vt1NuEAjt{x*?ajriRbrA^3>CkNKSa?>UJG?sAtM9$gklL2}6 z2Ur!$K@3D60sPk$Xs5{6rgIQU7iJKqU5HnnPj93kmxY?>Usa94KnnG{{m{1kKtWO! zF~6$T{GR*R8faZsN?tW)r(M1bRit*^jJ_IaVPOy{Glq~#GaV#z>(Kla>3i#U+Wj6p zVKV3SC3;T}UG(Jjqj%GnARRD?hft2XwlOdl%r=oiP^-%7O@}HZwJ*Dm!+A=QQL?x$ zVM@{BK<$LhmaqG_9&WoztKlZy^2-kW^3$0opohc7OtH!!h_)n)CqnI#T(r>r#5-y8 zf=Rlf{GI_3#$mO&@U2t7H~VQjdD>Cjb06IMe6o6ffcAErZ2Dtfws5JT%J>V z3%NfyE0Q3(qg`njT;#wAa~_L5W-|6R_?PqU%N+<%C%?l=9$<;N^SM`FA-@f{j5LS$ z?OkcU%Y=1AKlbWyUQ-Cy7!ngi!pwk#$G|F45UkOQ29j}8h!$RH)*vIqA2%Z-3>c#j za|;zbK+jY+G0P@C%$kfH-7Je0Gl?;tlO^{75bNP%>fx|~D$Thg?qPDIAK-KRL$*Yw0{#ww+*F@i@h~-Zc5vJ%5#b1CIup<=4$QC4r8|4pp_)nj_+THvFrGuscw~C8KIfu*n0$S`+k@;zTpUa5ZeYQ@;^mOx zPw}aIEJJMvD^B*3pt7@Jhc3>rlhEs2U*wG@UXsVc4_CmACPls^@2s#L0C`dL(7$MCBY zrcK%xAym?;BpbHL7b)5YlPmT7mjV>fWl!A{{m%EhhvcQ604d$phFqF-^sM}9nOI&K z;|F+3_o?66h7L)sGixB;sl5|f52bskD0Ts)Ar0;l+=+h?n(+Na9J--JKMmT4z}G^5 zco`*TFtH`l$9>R`;bCyLB|GHOijL?T)z!mc&A4C3aH!kZ3c3Wbmytl73qtE|-d7f# z8jbY#25#ua zU(&A5_;BFdS49}MiC?)J6LC#>|aBM6#R=mz3M8@8&uPJGlW4v z2cdH5gC4BDSh{jo+LRXW5SJZbpDib`X?m&%S!!QZQ`CzYg`fW@Fc3dREfV>F^Q}JVH$Ao}zDr)B z(zqPq-C6i&X(&uHIvdVq(aqkJK+r~fbR}XNUNgfW;Q~_KlZXDL`|#7+iyuFwPplON zxi7_JTETwUHwuZSbr4)j449jnzc*7R(ICkuF_!qV)W2?#DTD~{!?|a)qh^IWxgMc9 zPe!8K#BhOi_N&B9hIMCpWM<2t`daZteGx1&j(&an$TQaWJM04z4BlAyt z0K16~B~kouO7hPF<1cK|{{%;pGqrR1_k{fa_9lPb``=th@dqC}9`gquyOc1yjS6T! z#Hd6j38J@TrL-3uQGQuiGAQ3y$L&KKI;Pbhg};!`L>^+Q$x)ylT`Knl~v z)SIG}SmM+cEv%N*C^=W6N7=I+wYN9^gHn`9=|S_fl5|fL=S<>voZ{V&lrOaCQY2a} zOPH-#cndcPm0KKNP7yjiz{qPlcpFR$IwhBK3fWq!MN3Lk51)y+pp_BPQWl4XnTHfi z=WjVCTLcFffNwYmJs2rBdggSbxnQLfkzgKW*Kby_YPJU9{$&O5Lp`N5Ru-I(vKE~M zguTv)cf$FM?Svb&I7LC(?;!j;^EsmJsZ1UhBJ<7Pu>=y1jPABf^ZiK_uz>+XRo#*A z5egXhyp8>?MmLzZWBLl(pH^g2A5Im&a-B=|5+XW z(U2kg$Mt^zkkK(yR-nuu8wTrKHJV@{ylyoW8AF8ab0UbKh2dy73wh|`(-5R|Uu^hp zKY3GG(z&A`O#F!j zsJOz&{X&y>`%J!*n0Wkf!^@$bK)E89ah1UU9Q9E1Y>sM|93xX;g>32Qv=E)TDM^Gh zE4S-U++;5VZBE#l+rhV$r))ZT-#*z;de_ptK?m~ap?#h1<|>nN7i4us;C(y# zSc9U~PE=$;S@m}hI>ls1e&)kic>Xde88C2k5a^G;f0`5T|ARS6Ih)%4+ob-FmJ}U3 z^+8DgAv#NIWn*iI*p7(h$Vei6Pa1z=!7Ih%o;7xS0Qm|+TjuQs@5i~KB`6e9={_JE`jJPhfW-Bo@QE6Gm~8_nCy4PmFNvQ;xiRUXV#XUgAwVRl0)@RZ;7=;{uRR{9PM2k{w>gdT>p3c zPVryiO$nK=fnKjt4YmqXv|p4o7|Kr8opvTp9J<6mD1$%l(!uSaq+{a#yq=KljncrI zT#)@?GMkn4Xk7mA=->m4yJ^%B1)5^Z+fZk<$CdxRB3gbE1$JVB zAb%N=S4{KRqA+GQzOX=H_6kSq6ukP@i)A)l03vcka41Mzp<)V3DK6y95Ph^LvuJXM z>J}zh#8`Fy-t;rA{Q6JHJu&}#(X0?4GPzMZ>7Xv18Mgjb_cBQ()S+m0DUE#VsJmBn z#jYmL>e5ImlCddjuhvcMc-MMW#Unh~dkLDxh)!l{P>Zj)xMrtRh|0SEJ)iIyu2{@B zslwfq-5^H}Nm7lopEl2T>BP232b$_kp$XAgK@SgEZ21`|um%~OoUS3G2PrykWZB4z z)nXiPiD-<#tNZKKD;gc|M}?J!C-PVvCnrWDR zuX0+i+$v8LHR~C$@-z(^7$0mdy{J|mw3w&vy%SpQ8D0pBU=s9i>X&g`kv2=xH(h^w zD5Nz=%iIrbi1?$2V*GT~t8gn)B*B09+u#uMY2$yM1&0$H~e69h&aiw;;H${bkp}!qYhV3(I z{l|~J{rLRP4u|Ov;`qxT{uT+@UvB5Gv)=!fhvLXzt4e&5ZR^wfo9*+qg#tODH_;jW z1&PY?_P488=cKr0TScbGo){DY{+fEBTI1eriy^7ioT@EURQtZW`+zz42eQ;J-`D;G z#ws!ehQp%@H*lc9?MMj6zVZy|p+vBvRfyuqLZ*nHy)Fsfc>YSA1~h%^i2I1W%G)&E_BW-1`miPU1A8Indsb zIc%wcgpj|wpuOr!wyWuQP)X@*5e@s>oj(&N^D$D!FMogbqM;3o)H1d!^eO5(FnvwX zRh35n#ga>bvDyfN4e2H5V@v@Pz11bg`RqgxI(&Hq=FymSBlsz&k3<@Atc?KDdUa7`J5;C;1Kk*%B zYhbi&+t_*8?<##*&ts_D!h*I;bSdHOzVQ#HyOyI(p7n>=B@PfMs`N196;VVFFj`1; zgi2CAJsqa;rD9SBFC_Y%t;>`G$&&NN7Ar@CkT)jmr3V(nVS^h) zlw$RQe4mpA0$!I%Fp?tc7}D2oyFx@^?&?P|XKk~M0Xau4osG|->IM=1Yz4J!;&r`o z2tjs|rG=u)d+Ew*=kd;UuT^|;t`ZhM#d%LDEHw&R03PtP#!~QReP>U$Ux@og>PZoP zxq0N4#s>in`J$tdIdJ4DvqFKy=#A)Z+>2@zw5#(brl3k8#R7#-%ucN1Z_f%LXMXAu zFwELiA>g)4==jfg*UBbZK~YR~FQE76da&~bv6*YA>HFmal{CD{JKi>VX_fPikr;;DJy3Kzb4(L!nlgE=l=Q9q& z${ZjjBL)N~vD>u@b|c2!_U#v9CvYaDtfC( z5?+%$>v}t;-PbEvU-^MBfQXTxqSeXc^e~z3biUD&;ivz0Mfp{RD#!tM4|r=VoRJ2& zLheX|HwICem37-=sUDsQo%JT07}|IQhk;;)tqwuy5yh$=IdZYIlf1FS=1WtHQ)L=L zc7_W7TJVRDY-v0FKGT0hWQ`krVuGP|KVLNj@aXs)Ot?7*Wnj~~hd4`->jZ!&x7U@atTDJz?W8a^KP+}22CpS`cp^*Z7WFB>(^y5<}*?WF%Sb6A%uxHU(m zN*LSo^((|Vr)SRW7x6Vh4JR)}d~!-Zkdn6y;w)&O>N)CbO$1-=DhgZ6RZ zP7nzS5b<)~(=Hz~fObvOeRUfaZ(m0EEJ8qx4h^Shi7&RNmj%UJWPxykSe0;vLU^)^ z$n84gfoz*NO)$4na-4tXcU63pF!+7Y#c%#Mda8BjATHb2&^6A7&wLeAC|Vl>SDl;q zS=ehrTZr=KyYmKK0St=DAdx}KX#s(>W!p3#h`)>4s0*n>wAUcQ2bc{j=#5@zaVcRC zV}ebwtl}dtG8d2=cQ`%O#!neg$Jc2+MogkugYfEs`5J!(l|poe-*X?%#p{o|4gOSV z`~mC!F-HGaEa^!3=`<^gK9~yu3lZ?prdDwWYJpetL)*aK_Q%KQY>}Ir+ZcMSK7&FM zH0Fc7aGKFY+dlX_)6eqsZ>1dWQ!A$Dh*er~^-R=O8;vrWqG%Cv8< z$-1C@9Orw0?agYCX)}Wx&hAnWefv-N85_HJV)mURsqa6iZ1`0SsIOK7l(a_KvEOC%DJ+%no57o}YjCu8it;v?OmGCnb5y@^VO z7@O`SOjq(ce{+ejK@>CbG zm*AgGJcIr0K9}3(%ju5fTDV9j*TheCeuekOo=bIpUsi zCf%zOd>nrSF65P<2qr7Mc^hBK51aY8p~?{8xCM5P2*S~oWM7#{wB00jU*onC^Z4D{ z*Sq-> z|I?sq21SLF=+0O3S_Nm69s=?RMIOOij?g+Rmfy+HFSWVPWQf~&NZ6{&V{qNPqT{Q$M0CAnleRrBMi~;*R@??BAxV z^$UPQE1&~w%X^vOpDOrc&`v#IDZfORk(I|d@&CXsq6pBr%DQE2r8xSsN;&nsFPr#^ z@Vi11a);5fr`Y9E7B0uKhm}*r7?pp0#g#@Fdy(gs*0e!K|57hZCFph({5{XttrKKXIGtI;{ zu_{TJTL-F;>u&kU$R~@kXVlfuMpBYBZ=isy3QmxuTxLBQivHL`jROEQuTc zu|M=l^NXN4?GHjMKtW7i{fW1wj1*pg*4b{f!!PJFrrhrPt#977bAbk5*CO!bOx^Qt z1yiqRA zJPb^iSmyVcg>it-x|+<)fIM1fm5;vOCmm;l0xvnM?*VUw*C_Ez=2N#ls{><*ON%XT zV|U%99qmT+-%v8W8^-I%b>|D{9-oNLq9s?SDq|i;PCG*o{PCrS_tjjpi*JGq#GeOQ zU;qZx4G0Qyr5}(OSH}tQKyLXwl5x#F^aS4Fd-8F7lvj;#F%rZep6_@&s#zL&P2PF*+;el1buUsx7O&Hy64ze=D# zBEUaZcK(m8=6{qu|1Nj5VZ2or76d3+)6-@3drh`ch(3V^A)^xIF_Bad+r)#!gCi@B z$Q+X6WR1hKqGA59sxU%tYE*`B(}^soieSmpY-&`kP(Lg9QT1EQpASFoUUFYH z>0rPgwSBu<9@fv+ohJEy!Wq0THB6z+z`t348fa0@2oHAV((w2scdZ;iIimaHCb%Me zop(ispgKNXn?vDBnOGsY2e6_?Iqhs|Ch3%tI(3+?pEK}j#Vtm#!E~zybRyoYnrN~WufYoTDQ*;j*T z&&bTaBhqF!Aktan#H+3kp+|f^E{xspZ|MbAR93s(aC6i=Tn6jIUP3ZX>_*SpBpi}( zxzqtt-7V?uU7a$snD?FAQZXGvDucXLV`hmRo91?l?Z@MYpf_ zp>UyKfHP}t&`2&pe`^N7a8Mph>gOA0+AK4?xN%~Qei7v9@WwG-K;2T zS^YwA@A0_jc#SrzOFHpGzca>-E6uV5;8oP3k})*HX-BjDvt??6!=1X9qt&A+)o6BW z|1fjIJ2KPWn1rH=8I^et0Z1Cpgoe$Ir)Q=@6%Sw@1L%faEh@6uG?MM*YZ@!ituOog z6jN$xnvltI_$62#OJSyeuDTmbdzI6PvK7}`4s%`@F)FfVP*D;ABuL`M?{kx`TYEmL z$W{{s2U!XyqQDFm<{Ro2a9~CbCc3PdE!x7Rul-!iSIYdFpI6FdXJ^gkMwTvaCU1iT z(Kc?9EjwoRqb8q&py?jtwo=%>$5SCOUa~q&v`NAw5Jw8ujKaF-OK&c6jiu z7YTm!3FJxrFb6ELGv`jcz7TKuXP`J8b+h|dC?WDNj;FPr@N{uYwfgacA>D%MRKf0yGHYN`sm11n`(P2eSM^46A=elA4CGx>Spw;xgOLIFhZctjtaJpIt-tdel0{X-278s15LUbfbtj5{NR zL7e8c**F1Qe?U}>oqNpjvmzPxMzux1N2-g%lDGfFg=mQW^Br7JrqV9JkwnDrRTgaV}`0Y9}4tIIGp`YC^)#FCv)=>4MQ9VL}b?1r_1q|36jWTJKIyPXJ zaQcOXeX?XU=CZkyfCE5d78*1qDc0DUKWmN$K9FbGQ>UP#HnW&GyuS}JD~+OBsu1s3 zJo>!&1<;yHFnxS;n#rWs4|7V<=RE*E2?NI)Qe1)2Sj$(4w*qmuS$xNVJzRkv1uJjGNxlJvwx_s3 zYW`n`q`1YRbZrN(UYaFs5T0V}{C!g_(LA=wlK}Rg&v<>nhB4?SvK`vgU&lo3{cMcWg%|>@mEUGxqFP3ue@DFS7Wbg(fsnc)5j{e zmeH|SOL?~DyBloJ1U?3Z9KkgjqJ|uE^tfH421}1@zIuBcOha37hjNyi35T|pol+7T zueQ-!@edxUaDY|}%9GGr16;qnXq+*E>ASvUI#ktmzfTn#jmGEU7Z^oQa6pbQ?EyWX0es(;NBw z=tS4zBS*lq8?GN!Ysa>LWR?<01Z3Cf_e+6plF1CqSsWulYENOB?{oxb(b=G4;y@a# zOne&ahL;g@>3jH+miJGQ&=Hiib#LSNt2kI3tf~nCqD)kDBB~3NhtXCtCqx(^F`{dU z;#9K<>*3PuiN&PJTADr)@V+X0`*W$F#_}CtpU^wMM5im}v@%;j@fV$vyE4CYX1idQ7Ws`UIs-VDWaX0r)biy~R+jq7V}9@-ySP@R=U zSWxzjpR37AuZ0~3bld&)#7&4TNV#F|7(oZC`3Z^3PK{If%7{KFr_3h$L7baxD0!aR zZCkV6>dQGtg3#2&534lt9S1721#-0oa|dY??z+~iC<5*NW-45SOmR`ZU2zmAr7qMp zY53V#g!C9Z(UNrfZl32PygbU&3ADP}I;Ucov!n|ZW2Z}+j$nq%^HQO?kunP)VW zbWls-E@}EcyIAzejh{qHWXr1g<%DwSC&el0Ors>CYU$X@&}p;vo1bDOP1Ggib%7B` z=i2qvmnITNi1O=}h%C{dEfu8fPhgh6(R3$?BB6!M#m}V_XkmC-$)NBdXUqrEOaJ&aE~)R4I-&Z1BUrkCBS6G zzjw6${I=ygv>vdH>WfCHH7e98)>FIDYH*DElel$n1juz2V>BfiapjVxiL>r%un7t3 zuZw*Jt&%8#-wYI87+TxtsQHMIo*eJNmZHxN0HvlfENZ)hR&r}?T#Xvg0j)CAtB8r{ z3T-FH+_xB9nASt&?tLWIPf zmp`MN1jOLWS4O^0xUMz~--KSNGYP#gUu=(J&i+X#=8R|`I=^NvNe{NEIMUc0)gyt5 zx3t7ic3FsdkzBAMEuItN0W6svb7L(@#2-s~Dr2D|T*zWky5H6EvF&UNLr+k|GBOdT z3k6Ar2^!)KHsqf6KfP(noh9`p86>)e>9YAg5btIb?yo2Y;=v-uH$fKmBK!!IT5}JJ zP*z>HHyZASA*8S>{aloQ{-h!2!l?`ZY|m$VS?W&Asj61+r~u%n0+Rp!Gq7GXC!;#AiXh}77ncCXUarW+1bPn*y>5e z3RM7y$kA0-8bx%Vh_jFAa&ZG6-$*3UO>UABm=&m+UJ&lIPP!rNr`F9ji;&c6&6o@m zLkf^W*33rQ@Wmy*q5jrrmyGCGRxLNPj}BDiS<~CgRX*LUe?gX;=v>7r$FxPQVUL8R z791ILm`OW?7X?RpHSS(qjs(VhS6}cVFs3w+mtRhApW@Due=pLgl?F z2z|;8eD=fm_KrFKwx)Qyr}$tXIP)I1@t&v95P9$L$tNW81d%|>?b>~HEb-VbNBH4# z#hGy`|HYk|ubcK*NM9uP0D+22ZgooOIKe`l()kP|c?QcN6%IS1XJBud@mNWF4Mb~| zVj4~HmUnfy?}X@{s|=q5E?eH=@)I8d72&P(4Ds}7uUzmo%BROP#5ok5vsBQ)M-zIZhNQ*S%Y?yJ5R|mGC`5r}Elf%fZWcRb|R;wTs zjCMvwRg`hg;+aLRsAgJ~H*;MZ2%JO~h|bY?GY8D?LDUla?hiy+R8J}@Q+OiY(Kgue zib#w58yDDr&EXK5&}lxfRlJc?yr~i@^NNzF*@@fVXTm6L1H)r2JFmQgYRu$SL zrQZ8VU*U3gNHf4Tb<#1O*f4?YPZ0B>2Bk}a_nMEfOFL-S4vvr={*)M)o8z_UeQC)B zpG!QE*)Fi<&~cCaAt2R2>m7h#PS)7ECYJbxHoSzq&1G>Ls-pzoz8^ zdcchq*&PiD$$T=~%yo=vk6R^y?yJii^a#Usk7*eHC~;~FRld8&sN9;9_4cC9 z5LP~piVH{vtK_XkibZKE4y`g}@-L_GA2%SDSWx?p1z4m&fju4LUhx*8n$GJ%Vk4OBHWCXKXa-FL4RGlanVtY_B6wD0pP7XFA=nTd5-=9YRbfj) z6;WP>r+jBUsG@g(02n(5?$|tWhC&L4(mURaRd>4J?GU$X@K%4?os^1W-{$@Qi?geW zsw+*i2^!p;;O_43?ykYz-Gg1+-Ge*9-Q6KL!7Vt!UFN2$X1cq&tJci0;N`%5;GBKF ze}A^OcuTqxPnzDg7T2KiAzZfD&r8_H_c?_@K5?Yek<}X^^IB?`ou02eCQ}=|nSss+ zx56JF<-SV_K1Ors28F44if3}vW)@!45wKq-JzVPw;B9))=X1eWtC#w(0DL6);Ahj{ zvkks?yyCokvvfoi9Gkx7ee8^)2FLCv%dosCX-Mv=4=tM*Vov^!J{KNjcnU#6ddy&V zc$B(&-LJHAGo26fwDP3coZybfV$5gJ{#ojtXSg$4?20HovYIU`Wtv7$%E<$Zc4x0X zU~1}uLl(<3;{Y<2fcn6PR62gD9vxxQjj&F#*)f@?>zMD7nio+RMDVH9m_;RDiN$D& zZ`V9;cS6mxnsBooIS9_*n_6^TU3LnY57fd$w2UJKg;gWEyy=qfXsIQf*gAP~SEBCNNOp zn_N#{?N6zqlSQ9x6Kbb)d?A3gQ!54D^pX06>D~PbWcunmkGz zKM&aWJNhIBgPfapjQ4`LN9t9@ptBf(MfDdl>7R@W1nXUtATwm5Ql>qfXM}7xdsSg| z(do{LH-Zo5;>@FC##B|%G8phz&cQg-mSBK`CV3X}v3+Qfog>%M{`LJ`d&tO25zz}o z)ibFffAqUzp)17-URlgy$l=Z`Y{3DtgnP*@sNfnFk5C3^(&$H(qn&f7#>1T%?=iI) zJa&<{3W_4pzoULZrTbr*N!-ZJ38_tr9Fvnm*XW0h&+V~$&&bDnu}**fuv@wH3Ac-hXT*)(n2XA1)Q!QZ%hPAJ zjh>;JM}$u5siC{w`STYKmuG=>8D9n1sGk5VJ;3U%xII&nH(XZW^af-Ven12le2LUJ zl?~uCU$qYQmzym)`e0cfzEL#BK6WT}U`;mSI5)ygO=-Nv_H1-VUn(&L^@coCE z_tS_Hj}f6uJ_@TD4+f7YB~W&&T8#2w5#<~mX!-7tKu*oBUHXZA>^xhoTd0W;M1RFut9h|W}hV0zIQjlbb zdiR0Auc;kmwFnYvEqqDoBl;E+eB#I4M({mz5V_A{1YJ5>i{^e$KCXOogb%T2N^&%q z=NyTU-1^>X+F#xo)DeWf%fPYS8lw54u$-b!FB7r?dr&912J|?`CoRgRSIutGFHAP9 zvJX$a>gGfZy)dA)(mW=x+MddU+)4j^BK9Yk~!DMx3IEu zb6>Zx5@S{hEgR-SNjOeUgYZV~lc=qjs#*am`9QGOnUE0dyJeu)Wr~Q5dMS*@H*nAy zyH{+GJ8G72{b2O=A`TsR>wE(CkFB%=f~tT%ssj2Z3i$G76$gsx4+FUZ#AqQPQA)V+ z&!XRoYT-IgF1ddQGIOaDt$HDLxBW;miJ(_SXY8fzf+|}FfwL2yX$cP9C?Z9;B9;1X zdqO3SowR>-j#;2YuI9$D^g6#bw|W#!jVgo?Gq%gEjfNs3y*lN=&hflf&d%|YJCAeu zqOE3U|3I(%f||rJFNOJOPw?mhjo6P@Dh@7$@)33K6r(NFpc)M{j(tB->*gS(Zy|u7 zuYj|}8$9sbNxq`r)%EtSI=Tbw%z)CLCAp6f zMVzg^eCtzipBCM^$!8&|P*4t`-(0 zMFzL%*~ocE%My-vJYS!Zf18Q?NbR0FHQFAyn$1|5F3t*qo4zZN0C6Ym;7YH(p8>$O-FG(F#yNP{8lO#(NA9$728tT zZ4p&o?e^qWdfP;I)^;2eva_KY8$(oXGCZRYtpeh=2Rc=(<67Gvy6WznAy1v>vNGE( zVI;1y1=VBKu8S}&ql5jpdJHtHrA}CY?-7#>t8vI{3R>)^QX(DsSMw%o5^v)4)*HIc zNz8`~f#)bld=8I_x!vcVP0=;Q8tJd#PN-!KF$-$+>E#S0xUC>zje;r!=Y5t?f5y4d zTu;i(BR$O&$ywgy10V;@A$W0yz)o@I2;wrcUFD9@CrJjDH*wiG#mJseI$W+_WGQml z(HTD%T5;qDGc!byW2f}blAV1)Q)`TVbyWjYk*tu`V~ty?QKh5VnN=c>wFa|dWc?8M zD8_9YIJ0^Z|D#=w8310X+0R^=hhF3tf`<8ftEd-wG}a&3DpLO2RuSjlAp38I8-B-m zgZi2piaJnzoCItektmM>T-4Gk)Vw0EL?JHclQ^izYlUA!-)<}{EVF}YK*TNKclCoZ ztD7PW)s@;3tDEn#uUpHXWXO<)!H8vBmY$wZUQT~zp48o)5Ak=sz;B`~8Q=~% z!*DS=ec(++%dbbg>vxt5^&mtK(m*wo41E&vrt1eK#B1C{!V5VkiKHkJz9))w&CLOP z^S3a#F!><$VGP#CsBF|mTYJHIVmWh{Yl;fKtIq`}tw;@M&tAkLS!QTv&82RfumRZW z<7+lVEbw-&T*(<|o`ig1$~+ghUjw~#<{DtgP>PH+u}lln9p0B6leC5f=vE5S`P_dy0#(0n9oSQzinLFMG~$66g@oe(3E zY22iExC~!>MPim$hfjngZSDIE4kD8RTjP=?V8_mo9E)Tj#Jz7RNifb}GCZJ1i~-88 z_Yr{fog?fi29g($Q#~cuM{=rfK&TMVBg?lJ)9=}d)gAWE>3ko@aBdaodMbgL2uZvz zs?kqPC?ZtuG!L)x*|V~5E$e|bNw%&?g+;jCYh@3)&D9OKW*U9DVP)?Z`M62JEn^hT zPi?=F_B9?L?;Y*9!UXfM_4tfCRNkX3RLUt^40c+iuHq0`Z(?hXWy{EO+jjCAs3#BA zWnO61 zJa*_bN%9tXs5fWImUN-LL|d?Y@%GRi$V{8ad?GnPvqG6e;Xz}=QkX(=y)KNcg#8RG zQ28234F0T8k_r~=B)bk_2Bo$QUh?Epi(e@dzt4BH3MOl12AN@gYW9Bj=}5^7hPTgI zmz$8)JdmH>=I1JH0}iL_m+ZZj{70jt^7-`Hm+#gH)B3OE#-6EGKf|6kpqn+7>pd4V z@*A(_znVtRr80B|Gl5YZ4Y{2v;BeF>W@eIT@S>I#nw6VhK3!(X_;gW?$m)Gxsd`iX58Gf5<97_+-^K=PW2 z4Lk?zXNn1c2?wRN3!UrSv898!OOwiA(?qGcPKh4TYNc3+P&|ub@Cv;(>JV8`xnouY z@Kr}CkUm1^nr(#nf~)IZ6Y5+|D<>UHynk-qhv=-rdU*70*QWCD6K?OS#CjR@J=l`E z{t5LWI&sj4SsLwIg8ZT`wBbqqSloP=7qgul;+s=TA<$YG%ZG%}%0Cy&VE7%?e<%u&uV8nvqRjC(iQ_p5-XZp4W;80_s2{FG}njPXRDziT$ zn~am1^i$vS{*$cAmJ8!Mz$vWXspbPXYi3s>-9H9^l%Wl$X`O#rilMMJ^tqv zLDs*Cv%mIJ{;{s|KMP>L$JivL6*=HYJ+HC?UBEWD-R2DxeGTCSoFR({G1O5Y;I7cx z8OmAGg7Gzp56kBq^qFGEnGie5r&`jjsMu^WGwtLz%S)!l+0^b)R5is9F@_*kP!%X- z<)f;vNQ7$NEs(ca*OG(M0FHYm(^ir{#p+ul$64!%TV=OO&%Iy=U$|Kb5^;KMytEol z1*d;nO*Mst+$xNCJqfi6uBCLOpWOueRp~x#9_W?#euS9m>YTkJ4@4PK|4xc3rO(7~ zN$p}J;~=FGzKJ-~dyv`sezrtz*fAu|HK8;}EAdsHgGAkxXr(_y%=$Hk=+?dxbSln_ zN=J^-@IEjaGaQyIPT~`BAPpOH>JWO*>pnVEi^Av`^xZFd;L8ku z(E!=Dw^c9sAU!t(;Yiv<9EaQqUtl&zO)OIoqK;tt)OhG;%E@lOx>P(2eCCzy)K%K{ z?%H$R95#3V71XG~?a&ac-N-N!Q^p}G%Js!wjmpQu#=C&j;30imHloDK$Y5a_tk+BO zUz|~Xdo(NtIG0TE$6PXSdJy>a=LIE<|NO*lO`L%m=6|)-r194u61KCo1x_(rxB?fD z|HU`yH)YPh{Ov!6lYp8%cF2OLuMp^sMBl?38i+b1lQOJ3`cu-$qzr{XSQKX+X<$CZ{Nl?e0LW zZO##b&tPk`IayjlljxkQVhaJe5W3LlF7x0etzMn3vWyD(xYuN2)}1BOcRbotbM4Zc zZKL%gA0EtAZ%kmGXHiu*pZt3!TOsw+=vR-vIF_3&bAs3^<9z#k(a9S1p3VcnSG85-t>sa@M)7m z%BEFo2-)3(q_bESS!L7xnb8`=iWm|dSA)Ll9p4PTvF(#7^2VX00isB89$0SArw8*{ zpeepnK()WTk)mioac22DKTRs`2LV7Tsjp}@hiRwnXiJ*9E%no+qbkMsrqILR%)1|P zlRnG3otAL7-<(Xnsxl9<(eP37;dg$;(6x`%+|1$1%vYap`yKY;jqz^YXHO~08}TWS{Y8SQyn8eCCZ zfEYg!QUov{dSJ3V2Ky@eR&pqP+7vqf6baNA?+nQcMKh~eK_fv za=0^&UV~71?V_b&?ExK6-)brI6Mx%yN;4R}lI`zFo6#II;zIGcbe#=9pHvJ_>sa!)E?M9?ec6{sS@4k@)#GFc5|R@d>E z#TIg!?6uSk+pKA)L|rQE10vxH8++p@!CTyD1FG^|}jEu%i~jT!ZZ-nd#+W5`JrpftJCzX?CyPE zgO(&#-nzCroNZM}U5l!t;qdcDc>vhcU7(CQD3o>d>@rKcw!vkkl@p*-!?LRge6c7Q z4>5AD(9l?a8ElYO(JR%`+#m}|(D+QA8_AL^j z1mOkaRWK$Jb;+G~Kn(hoEz&-v@^tWe!1%Azm%wc9;7Jc}XmWNF>>$%U!7}!b!N!cV zMOPPo*?Jr+1B%D>L`fEVOQ*v*tDG=F7rR z7c9Z@i1*DdHpO-N9Lpa8^CB{;Q<2ap-|pl#(qLmrWYDOy<^m_Loqi`?6v4K*kzK;jLQfnQ%H{ zg)#cv<6KkIeeDmT@QB8pdVqRARXr&24ODhOb9cBL@qi)bM@WO!<*nGPl1uq6`>#bw&UwN!A~fK;6cn4VN`}kfV>tro(vbUvwui=Cu?8x2 zzejhC(vy4%BO9E0RUC9`o0;f%hku)UddhkC`k3jIv(E45_Y6`Ubo!xJqTC%%@Ewc+ ztRW)^9K8xnaPDSdI2u|x)dFVGx}!EKjjwkF1_JKcl4hOOj$D;iIfIB3fUv?kc%`u# ziwM&6BElZJU4}l)a;qP?eGWTgJm-?RO0`*W0eiV!b2kZA_+Ee>XSGy2V5|PAVuFWV zD!DX;rA@CqEjd4{(i~u4FXwXAAv(o=W88SyH(F$SFv%v&02E{XU^0O$8M^Nx>|LQA z6QsH+jusx-j1AvXIOax==_uz+W%ZSQRASt`hNyY(M%Gl4%%xVwbH%WLP5fmpDvz|R z*Z$V3cRSh^TeHrVqktwYVXuF@kt1IfbOcxl;G$bQD+r;SJwWNxsIB=}n=M8|j6vO) zBJW&)1vt=_1zFCsMH|Sb(`H-Ne9i+CVGK~TG||6x4||W?j3f%{fc7=d9d4#!!wgci zCQK7e8@BC*fEkuOtIN-sDtxXZYbC);k=&EiapaXl9ow+|SYDcrnq4Pxv}sWchspdY zTY60k>c>GhbYP^Yy1*F&Z^+>%7y>~o335f_NHIIaJfv6&KS=2}kxgc}fRqneZL>p% zbTI-1k|-Dq?+o~(zi^ZYKX^gWb>IvY|w zup~TU8mXL+Rh=es86$EDsY zhqwJS(IZ>2vQ+I5QC(duWP%-JUFt1So!&|f710T8;>B|?d?4Wb_*}btEO3n=TCnZ) zXr6XwDPn$4bRwqZvi8lLV=m5tJZ4P+yQ#EK0YXeRF|ARA!jsAJs7E2y=i{iw7s#xI z;}DnLaBSWfgId}N@sB>{lElQzq$kO8B~zQ_DI3U4J)f&x=n}!p&$GxXvI2@kdEo~T znLj#O?ILBed*Xs$28Vl9J}Wcd#q^8p*1TI8Jmq0itglHLVsriA^~OvpL|EkdM0C>f zl}kKRV2P*LsMk?GT{-_I{(VKts2^6(5f)*nEnRgdE@VM(&PVeY0pl~}PsVy$aZ#8dEM;V!XZy+5PDm)`k>Y}D3OSyhf zn|k-ENx$T%N!PGiC1+{Yp`fiuCUNUL(QQaqdY+QrcoMF zu3=~c&SDQYHZInjU0wD3n>bL-0|m|uFzA~8ZP5LTHTqw9;J-)LKj4xy^;`d-OIW&T z%{KSTbM-w8t(HLL2MTDa#xGTB42^^r#>uCjBTSl>*RT<=cVuJMZ#E?n^yWkYNbs%; z{1PuF6iVwqrMn+^*{#P+wP$&>y*wO`slOv0E)6x}2>^~K=i%%Jr6O*(BVq)lq8dtt zMj!#LT)}6l@-WryMMY%}A_FP{upk)BTWy@!wV8NgykMW4XQ`V9XW~tM`1IY?PFgOX z-^@FP5ymm{bUG>Y&uLOL%53ui3J9Rc-6=T0o5kk-XU?W7JH*mX@Ke3&hJ4I`6LiRn&B} z*Ell!YOhZUjwlu-<{0e9vDL44iqc%dF(w&w`g@K1`ai0+w4<|Js2b&0ik-hXWhn2P zsm!O(m@sTgw=PP=D3JV2Mc`09k=;{^3;|es&azX63+u72e?v4?FvCx4r)j)F)iDX3 zS!XqLAEi;1SDWBQTijKrbui|QGINxwW+j;}&c%3QxrR9g+9OC93WO#C2o2zNg2aTq zgnC@y*zGe3SDrsS8zGye7oYIe!3N42VQyavNCP@Dv-Neh$XWmyKMjKn9{oaca+}VS zn&?z|WW!&VyDw(a!d0orFid~$-aK$Z6q@dt*{;v-LthKr96CpxUOOP+2M0B)*AmT~ z5x3;1V7T3Sk8s#YS0Ao9E{F|-$#JOb!=3gbM)A{CbhFmGe=@&u2*w21J?kgr5{ zB;pXSiMD1q%Tvg_IV^r5zQp;J&e9$#-Tf-Wko-#+|1%$!{Od6O?=K+LWh(KnSoNoda`*OLmsNNO8W>=l9tg@=cteiP2?^&cBtF0%c&vLx3Zv)vmO z3d;W(KR9(wgO(#I5fpN2d~*D5V)CTQ?>A9%;`U*p2qkor6Nwt?foxQSf)WV>i3^3k zPQVa0JSG!8?GUs+Gl}#b3P5Gv1_toZx)*xaVJm$vyIwm|r{N}Rn`6Hbe>|K9Jyr49 zpwbjVHYX=r%anN6K*6OA55Y=z%5?fS<$#Gm0fi&QEN+{PhVNq2S3HXdQLp}6q0^WH zc2Oq0#u`jEJug4f=-stNGur!Nk3$*G@;fbIsgsQ!^Qbe=mr(c+XctRcdC3d#q*#~l zGjXn%g$kuv(PRMOyqG3AMG}3i^k9U^(l<`)`(;_VKNSL)1yQG>g0O1E^<}n3YW)Gl zu*@n?;fyQxUY(TdT8>N9`F$l4LLa$IS$Sq1K@PZtk|Uc1|%eTFPjqY3NhP=J+ToGaHyEoV&;> zia(L2=46ajfOU9133OdICSj0g%FmRgDKSp^jGHXU?7@NLu3zat_b!auI+^ACy`=Xu zOipY6Y>U{vluG9L$k&?hIaLEQE}_+5CC0c8d*7A1JIKW*6AdFI5P?{%i3lbYN~0-u z*eB9?El@WJ93(-u`!Lp{HvyfZ>Th3UtWk4bC_yYIch^-mPCiaYL;5GOA zM}Y`s50M)W*m;{(!UJ7aApq@T<5$wG@PykB(>bv${$9{N_|gR!Bk4u@_e8qDWjcAL zKeoSk?;-?TfRtqsSZ@C7(v9l>3G08&@=28KfGUU1Dh6hMEHYQd%Srls>XwmO zXkAC@NqE+x`I~}@JQ_&QqDT>UHmwWh=|RTSue1n6?!R2Q`j_jc13#dXgk-t7@26!g zd;50yy;~Y83WE(NtEGr`sJH$!&`m{%Po29BRFVRghO?SG%jKXBD@SPwm0`ZeGtArj zcq|_`8qcB9#xOHSbtA1;hU!#8jzqS)8G#-LZKs8rFeAIURXOG3%mvs|sC3|Xf|Z{= zF_n1`MVrVl*n#XTQgwnv90Sf*6gL}Bn=t@_1t-OzD=DL|P}Fbh`8**f{0j0kOU83c` z^afGUL|1g8prpQs{xrJ!*|ER))-+8>Sb&bQgk<2#N4Se4>_<&(A}!e~sjLW+g^VGb zGVGK+%f!9r0>y6EZ<cg6MtuMT zuv0+O^#|(_6qTwOD#g$BwVc1hlZtG1-hsX1M*!S;ui?LAf;H-AL>8)Lk3w_QrIf_P zr=cH{I^n&eV_!^v8VKItFsPpq!csq+ReP+XG=%-&R0U&I7SK{u6?JpcXsqRVYn5gS zh6uo^ESx}dlj9P4bYLF12|JC(pyV;QZDPs-Gl1E!2oe4AA!{0`mGEgR{#+Pe%FFK8 z8L)t%0sj^Fzdiwf{_$S?SpuK`ukXfRQu+TWiTqB?vJ?e>$-=y5r)R7ro0u#V1`wQ1 zBRfM8Q{)Ple1t|=A6)AhT)@H-?|Yjolokx}72u~zUn45{kn8WU(QemycaQh;=JWx) z`~8Bhv4VX~BpPHne0b1FO>A!_;>?~@L~LnkEXt(|p@-AlPkWyUt~e8D7qseAL)kBWc-Yl;sDTm@hl z`^TgD^Kq^6|9Dg+fB6vqadIa`^IL%kA`Wa|b}(arQ*$e8l0=oqPEz512=EJcK4e=b zDBnM;Y1124uR905&lS2Qa*f+WWd`lKGhIJ?vIk=j;ud2b1kEj9JsvHO$2j4STAN(1 z+l!p`OP9>j%xB77j+ir_NK$zC+A`-j;rje6C$T=hUge(WNXGM;D>YFS>suXH82OEe zhE9F0lOpma&%5Pz)B04ObXGSG#q;faf#p-ij~PzaAh{%wU8S!BmqsYwL0gq^M4uIe zRaMAWbMYFnvAcMMkWGXz770KFzaz9&iq3`zrpQMVrKdli|7aOOP|{dk7R zv%Ia2s?I$qFw6C!&qXCH&~#>WI$QMuwk^4@?w#M>ZNAIkET~QwhO&ZR=f2@i?MuVBLZ2zBFUF4P*x|rE2 zKd67j&MoMjEuqn#(F6Z+siS34AYP*Kc0b8be)>#8(hAypt3yS2M~j(O#iOjK%w~!Q ztN{%Y#lYf1?(rlm*jEeQUu<{^P>3W~(K}DQd_QE4o7P&gjTZNi>u4<5(qAM#p)VUm zkAI#876osCMM1kiih?f>><4UgUExrQwSeD>f?qF^PiNZPBv#uIbNaVu zf*8=mzj31)Ejy0u_uvc?iAz@0sU~9`-zSdn{Z=a;!hb=+$(ZO$?7saNQu*=b66Q~zW`W&B*ZxulX@Gyx+kpNj z_lrU@zI)5<7^Zby2^2g_+05Ou4(7WP&b#&T=f{^9NMLu-WBAiVA8&G1FLqe={7I)e~DRUSlXtU62q?o+zjR!yN?!Ojl8 zi7vi*VzZj|@|@Z=5N419JHIBSnO&+u3Bf%({)4-wbHK?Ld|?x&n0t zf1Kq07OLvAtJs6bAK}B(C*3YlMkSL})4kl>%5`QKcRaE~nOr??9h4O0a`T&5b`nm! z$~X`@>i+_rKgVgAzlP4gCs4ojssH`*uju^W`hk@yx^}Y+sJv(D>9I9THn4+>nBeK? z64bYi76{HVDpV)As-$>pb5^=D1yY$Wbnc%e2`)hI6+@3J0xUtpBqdRw9+&PikG+iE z?jLTrKci=-QEYXBgCf9MYY*?_iVjEni$j#blCs7*G+1mx^(|22Mfmp1%M~mt>kORQ zv+b8LXFS2Wl7A4HyY;}00NRF(1uCMB#^I1(d0@&qOEf$EQ~Pv{LYy9CHvS+JW*3?zaHh+||IuMeikDaZE`T|h zlk_g2G+e8Jps}F=ysTh}AA?&j)fIpxhQP3%Qf){>B7>aiTLM&qofYO6;8!XB*%qcn zG@JJ0-1zGC;k3@~cJU`Z|9ckuL~*<)kM?fqWN7K6!okb%z0Z3L5uWJD0zU$GxVFLs z%9MC97}E9hp(^S>s%OcG@$R{q*h$1SG@6ZVwOoIEjSduZKLi80X>@+-+`q2;#DwSN zYp&bXpo6BRtFNcS;YyxpFnuj%gw=SmsqtwIkLu8k-iP#wYdHzjzgHl51hd5w%9^w4 zv^>tSude3OEt{bXarD5QF)U#txgO#B1iuo}9{*mx7qy19;ZDKo5X$R{1VAf(p16GV7Kqv_E3 zBM?tguHXA;UZY>jEp`ff=MR7Yb8jw$|nmP|Z22~uOcP3T9)$JtJ)4>nUVV+ZYn^eSI}b3>J0G;5{@ z#tPEEO(j14^&|RALi-O(2Ve*1FaPQvX+?w5m>doxkoJCsvT!eq6&h1E6fBvupl16J zG$$q`Dy38^N<+jp*$>he`Oza&cX^Q5!k6&>Sq%I|0Q z^PP9MCln`5vcdp0!Wf>Om%A_pE=A=kAz_;?H|g$C5j9jDT%k!hzDofwQdTT;5&%lX zovK1=q0e|ywl*L&PV8$lFT zIysv)2xyDk>bv^$Cer2g)8gXH198)`XYDdyZrQfHq-JBmlfj9qGM9x(N_E4_lzY&M zZ>8)o7?Ob#O_IW+?IT;PIF-fN_hF-sHdIhWvG>^_^Gv3U`vy_dzMW)| zzPA_?<+9dnV8+Zd-ULd*y>;Ply%acF6O46b#qNL2+3NYYuNp_36Nh=l-6hyHbEzUF z5uc;D-SRBZ4KvQ5bSWczfoD{!`+5q;#E%~qqvUYo&wxt)jfblA#AH;zo5d(NpC);! zY&ep%0yX^ZSC$FY;2anQghuHf?BzdC=mFP0{*z3Sozve8=yCn^XAB&TOsowIt^eEW z{`WSzFferjN{{|gKTuh*1y+uEGYTA#+c31SwWKIhrhf<-NeQdOA^H=khNC)I&0%D- zg{kV`a%*vm?v)FGXOdWh8r)j847MpCH2D{CU z%hy>J5n)#bn#C;irsx)iy}M70+deFk0S`z55S6AYfD)}$7dR@6ubc{&U}8tJt?`_k zqkiihnYk<|kA>FsW~$`~1f<%QBk>LtnQ~oW2K&&gpQ%iaik~Bo(VOJ2*(a3q_as+z zip5m{Nt7R9t(5&k(+N#+a`d5krX(|*X|D{hJ^NX^5ZTHZDI8-qO2GK$$D;NVY?4L_ zM+gfTN*QTU#9uYxWi7^znm>Dll?nD`12DItvn@4-Ist7Jd+EuQBkh1pan%! z9pSDL>8GU<3_}fxo=|8qp8TiTAEAxn)?rZnbwy&y!LnjM8~d@_Zjx=9mGgNz7PwNE zl)k^hHaTwQ-Sm-Pa%@U|iB^c#CBPkA{H!?%e}ceh`92>2w~EDJ`O0V0y|lkvz}m_J zn(Y>NRT^)$0}?k4HqnC^g*{zDvi*XD?Gp6ky}@-ID&B(w4mD~DWk#P-IAgs2P@nlT z{xA58*&T5j0iz<;CToF`_q)z~Z{z1m+O+d(E+YiryIr+k{!A%%oCuEevi#IwMFYH>ht&W@d zZR6x*_x1VZ2B({=5jm6ye+Ud3IlP(vb-_@<&>gW4LO4%#3-E38s2IL)2b(>kv5-AU zu4%2&TAXuTr6T$guu^7v4#-ulP|M&()82_Tc}gP%+;{q#I~H46!A=b(E>|r|o6LmU z9v7V@Vo5DKz>I!m5TQ~_C`+q4EV?aQu{3wpHD(~ON*;{@wLLcc`B5x0hO6O=Gv_wU z*qmqCyk-093ZkyURC*eA(e?M@f~*UqVxUS%6Qj@jZ&_HX&Got~mNyBQYEvpcrAk$< z{V^?u_E!oXYaBBwA@_u9#;I_jrl|<1gfzmO!>k1QjPAwCb?(Y_fi;SKE=&dV!-fiU zefH()EDcjrHW_yZBenCZPXzV_`F^=6Myi0+PzRI*P%XV2tlct;88vqn>;Siwo8tU{ zy>I#7$_9w5B8lY032N+ID6Q2oh#S0L*C0boWxI`s-6@QaFEH6m3Th~b15E(rMhL_c z(+^ht=b?m8UFrrO%myfIqu9q_o%~5!7r}h44@wVGP}PfA1@-$7NkoQ|9fD6Nxh$r! z^H}5FppxmI1rBgddsBLDU4tpC+b#JVMJ2^MVA9hhSEylf8 zd1uhSIlgiWfx8CSW9s|VmVDH}A{gaU9CTSd53R)^_v+^}>)E66%tR=_yyYAakXzU@ zesmzlHCXGXooNeg7BORy#Ji|mRFp)-kVAxudKUqTk>LF$Xr-CinbG1yoe;KqFPGkA|_ z-Q70`iZqM&Iq?$FUw{ffZ@z$+tCW>Tsm(D{@AOK}-J7w#0JQPgcvel#8w=wb`xG|Tm(9%kJqa+ATb06^1{jcv zrV=8FsCBb0t#fb=evp)&B)j~e}oM%w+6 zGRD=HbTap+{O7sg9JwCYnDS%;jf@map7hb13L>+%jTo+~u52EaRdhh};OXn^84~{w zgTZ-&dpb_!(kL#~c~0sJjIbgfFkap1@6v~C4KCT9x9<3@@Y?3RM(#=v@f-oP@jtt4 zvHC7OT6k7XmhN|wvGR^EqSt4S?3Qc7Ab7>@=FMYyJ~a#INhHVVx}Rg6)a%?ze}<_d z{Ni^E`&sl-KoY|tO@ZzK{Ae%z4Xpu`s3d2)fKRxZPk7S^TzyzCE21LVL}%HGWkLEU zSMmr%P)iWEhUFvwZ!|xbcsH*DNEDR*mgdv^uhH_~$NcZbFl7pumBIn7YPE7T3z!mJ z?Wa#*9*C^Sap^(~Hv{8z8LckMq-}Mq&$w^?k9ptvffg7{>s$HghV`{0<5_85`#_tg z@yVDR{Vvd@!Dwjkawwf1RkX$GqRrND3R{X{Dh)FUwRX9bh;TcHtp`}Gc^BHQ?Q?=^ z5P-&rtBs;*=8e|3p@U=m4xU*$e<7bCuv%?wPHg#MDC5I*sIK?AzQi(E}8*4R4rt{R!E6I z>O1n^=#-mze%yI@l@ktv=*v8X2x#m55l~Mf=ht#rEb~?)G-FgtQ$Z;9)&JSFdskBN z>$ej+O)=L-AjFI|vI_J_VJfDb6uWt%>ID(eV~H}lIcXGwz}$l+Hc}pf(o`;aw}a_J z+n)gk?+GV;3FHf6IONfXiK1Q7?Xra?2xQ@!85(P4ZVhv$pc|xLzL|{DXo`laN5*bz z^g~Pz?c$^m7lrBnI<2!Z22`nl5$pM1F!<-w`Y%+d|N68RHn6rf1p3td(Y#Gk_^o;C zqir?2@HP7xQpnQ*sXs6-01R44Ah*RMokUu4&9v{VXj}hk6X76+>WuB)e<2X2Z!#l| z{mOJ9188P|!2xBDx|wQ_XeFp7)1bu{I~i=88U&>ptY*@av}MC0gT`+e;&zvf`?VdKay2ml+x~Oeb(BwYvewW z2j_(Vz&{^5W8F@>xNi_&Bn_3W_Z zk$KGyI*9BJsmlq6i$j(Ix9d*5gV=&bwn)07cs`8)C8exp#>@-|_~?3a;WU_Ki_I4U z+Wm9?pWWoI;G5LAXBi&YBk{P$U^)3sT^lcJdu!aUSAH8l2;IE*l|g(uwnDh_7eAQW zJ<{3LNq7RMF2C)&Up>$s3}M_KMEH7Bel{bu?wNm=eYG?8o`*gcT%Gj0k3YNq)Q-o)bbeQS_hJIxl(z3ID+?F4oAtJ8O#eNR87?(sVDyAj;q`rhg7y;!|(pM1gx zKi_%hi`*^$a018g`(tS8#XTW+Cza2HVuX=6LAE@Zt8kA-Rb3XsL#f!8rgGQOax%sW zHVXyNQovR0!e#PNdROI&hyP?mh74E~o%-_Ba}oAT{KY?0N%2Vpm3;qwFBK(}#;crIGy^eVZ1W~lj0 zRb&e-C^;-?DNi{@Rz8dfJuA^M#*=j&55qHks-wjkykn)tP>f~V67#A`N!H3ZGszwA zbcQDJqDiX#B!3o49(x)GHC<$AQZ(tU>vC60vJVk5D7n%2NlImVj|8Y;>%B01T%$W9 zC}Bz>Hq7&=cSV}e6>-D6ry=O%vtN+B2~I(xU+_OiPjFZ=d{uY)Sk-sZl;?SW`!gk# z)q<0~dZY~XyLP>fru9=p<_BBOp(zIzS^4FVL(jV0sS0gdExIBQA*SoFTFptO+Ow9* zXT#;yuN+KJJ=5Y5MmdMWw>Yhzkm?hiEcd9drWv6jg}<)GdZ12XGbdZX99E)Lm`G1@ zhSvdf0*V7iv-&(}PkG8dx}GnzVpr=poW`Y-w~u&}joA|^bsSch4|WG7s}0Ss#+RDV z_R&=07aJ|Kmnss#WtVkM>CU9G&YPTWKQ^h)Sf`E8w8Y`I`t(2)hv+Jk)u@l7VzpHQ zoTW&FcOc7Ud6cN3B$&mr4FgfWEZOI|;PaF3AWjZ*gbHE_w`2X7_yFD5#wX*((}>a1{pUS1qSWo z`Vlj-#LdpBYL##|@( zjqBs(CPRbUcM|kXQTp_1jET@MaEc&&!3=lPvB&1Py$}?p z7{VYAS;(EDNzT1&YMKz;@h93N1~vo}AW1JK=0L|ph=K_U1LB+6)OB$9!YK)>>hC_c z-NjlpSzv$cb1;ZfJmTcUm%PN%B1>CWT*#~iZC3`QmX1dXq7fE}o#+GkF&#Ij>j!exq zaFy&vkxR*;>w*yPtB}9#haOxV^ujDfVNjO+7iI4lq*<4xfmW*0wkj)a+qP}nHY)k1 zZQHhO+jgZ{Y25t2>7MB6xYKiQ#ECd@e($}{e%4wKbSNBc7KpJM$&)x)PZc88P{OCQ zb7slIMl5WZlsxtmIXZ9Dq}gPNH!Pj|GOHkuD+4|2Xa1yAofT|VM2STCG^ zxB&HzVLanDb_WOY&UDZJDtNr{No{zbFuxE;OHMYyw_Z^J_$*U~d=|olDf81W!$G2- zhFAszuSwX&UHtBjTj*XihNk^AS&7)>JvB;p$}I{~Cni-!o6$*4`4C6>5O%-WHeOLc zZ914!Vl95o<}jyO&N*@R>gx0-x$7OqnjLs^o|Cech;LjJcN`3w1D&KXSlLa&k@s`E zDHTJqLhrC*t=$SRaY0{GqvcrLVyM+tHfYy^ZJ1!yh<5@i+^k~ zH)t|HfLlRDSHNZrF4TicK8hhmTlMSf7Ot{cAXE_L{D&z&p)m(aTPl)nINBn%) z9h7Fz)N_jrWGFLR>aTOT_*^mnWEAt~PizGU;`999Vs$4 z%rpIUE7L!Q^-cEJ#&?)|py4zX0-_G@jgYXX&QhF;|kEp2B)Qm8AVkAxl0dD&5 zY54NDXa4$m6p3uMp3I0^HyZIAsbyEUN6hdA?pMsnFCqY@ax&@!nrEHxv#@20BuN+- zVRFQTG%gr0d$=;KMG)Pk%$iM$XFnH?_NX&a0n;yK%A!>^{>2S|ZC?SmRl}vA%a9C> zhw7C_T}=-H%eHP~6DD z?zK{LYnKI}uddca@7EAXUO;_-`S5`U9`vkxLl190dj5EE!P}NZp3DhVGgR{+3aJv4 z^Eu6B&yfIu5vRl+7-46&k9h7Eh9N@WZ~g;cxOtOU4`n}aVqgUs9n#RG={a!ao%BYW zXv!IqyS9`hHnfZVPo?x*z4WtaIz}DhFD%1A%rc~u;>h@clwqW}tH0LXeVGV6>I(w< z{>PF2|04YTCk&RdHPp8faQMQshWd_9|InfTSJm674(pZS?EU$1Mf|uCPiniYlTIn_ z*+_ek*wAR=KpjLxZA}EJt!M_q;N{?+_JhcEb+eF!Y{C4SAG^GK*p#)4K!Zx*Owj~{ zaGBDL^_2Av=+St_o)MjJZ}0D}?oY?og2_V4ofi1daAZxt$((ofgT z{BYSxyO-ZC>FJ}UM{Z1|wfsSVyru&EKpec~0Mp>tV8}_Hw_oKe>`si{rfnWh@Zo{j zH)N8d{gND>pEJKm%V|d~<_3_w)B)g!=lJZLB>nwBUc_PrqDGDz1FAR7xi2LZG9%Z{ zm|gh&h74ZwJ zbNxuAxq^yejbPu({nlYNEOtb{`{4A*N;T{hlYGGP#_w(m{{lfrUPT9ePgAxX=2>?JOIE&Ol z#lmr}Cd&}Nr0qE*Ot2hQiH+f8>`7uCwN3!)L;Z@VT})hyxrJi%T=RI%O@rqTnAorl z-lL#13;blS6MWMGU!>->1Z3~Pw9q^}#HJfUl|3NsiT$6(-L z3+GmgxGnFbI2G(Yf703)XEwZM-rp)l#v+q2wJeH1#7h3iFbIOSC$gKy6N{UF6M=S+ zF?~ELXT8{1aQU+&t&P3j&Z4{7b}^R}X-&Pk-hKjhu?HrR&>VFBJ)@!TjcZ@2h}=~| z;Deu`^FfKWz2Omyl!g`puE~-%eE!l>r+$Y>ZsW?RSlnr8;snrG9o$w;y(n5|j2l`o z&&;)QR?xiO2@=I6LPyg)54m~_2Xa$tMy8Q1MpB23Qa1H-=CB}pGc(6~d|rl^x>%dP zJ+NqVRaNT?i!C~3_e50^8ATYA;@@B z9ALKv%_5dHlD+einay1{QetVH20=}fp9l?7oIhL{QV+{jD)T%SJ02p4rtcyUR@LzE zMhY?NIhiw}IGy;`Y~}eo?u7oJ@c=lf*;b5m@tneys}sGyO{=^8_%y~3!pFQUcsD_n zg66E5?@L@6HPHR(Po)*aTWg2;l*C-EURsX2^6`e%jrc*U77}1R5oAlZ5wv7W{RT%n zc1jH0J^V}44YOM939rLqmxz;msSTa_F!tgqAvyJ3%Dt!0*$rJjfi=g=|EgIj7D{bQ zj$bmhY(*g{Be6t5GI3X#{3hr?NzKh;p#hHc`^!O*ReHQQ?D?*|(jKQpse>~AbVyq* zjk3Gcr|~JS(p#bqDsc zrUky*bFxtWCHC~BP`yjqA*%&E-Tr-~$VC@Va9fA4G6SHvCyxV?-CHvM^3-3M5D2w) zf#5qugjSnAIR&naPP$YlBWC89PNF-McW9RxL!$GI@J#rY8P(jxX@+lEol>KQRVgu! z9kNZ6k`i^}LOPMm(118^AUya2gCw;orCOovm9AMPdl=`1_+Sn153%c@1^bV;jI=dI zr!nGz(}Gh@g;M-ld$;dQ=@gGCcA7e(mt=fmbK-s?`w3w#Nyg)nqt1!xiwBEnUqT?} z3oJ{s6g69FU*{yJj(c`_MIbvB0m>{a8I!wB?r}lR@NzYhWz-;Yk=$s!q?z7@AEl|O z1I|-aEnKf)LCV8AEk!>!5!{ zuC~qZKx4c+xe=y2L}R2W(#{Y#7q}HXkY#A{`2#b|l2>ezS1;XHaZ?TelNMXvG6|!a z=+JvpeB|Hx*t0YaVy1d*m$7r^`Rf9ZG;&w*3=7)Ur=03Q^aVy*_(#adlhLf^cjR1{ zT!kM;ikO&#($XlQ)e3ts)BB%%4dX}WJ{b*Xx)nw@MD#B}yzc?SQq;6l!w}&V%1B#3HV_$c;{ldhbJWfe=c*F8ucMsLyZ#+5A zqFHeWcL}KY6CmWN=Ig;haL{|EYonXtUNg0g+R~dLVFX_Ah+$$DrfI( z7jcDiY>-5zaNjb>|!# zu|Q<5_Xqw`hQeIUKQEAaYMGXE&8)9E4b-@*n)bz%aS1*5q^#Sy9c~9d;J6tFOSzNCG82KYFN~s@XDq? z^X+0jZS8x2U3qL_^>>I)nErbf5bG6x?)!QI2aG{ZdI4){{73n%FzEB~GnZ_p#I^g^ z0=)bM)&r^?g>^{_nj_DU(rZ&U+bLitVHD(tnkK$uLiR>gc~k93Qn>}Yx0vQt^ao~{ z91q?htp0_Cz2I7+qh$(oLb>C1f)DnD4>A^y^nl$Qvouf@p$I!U#gtzdvoD@Cw2@(F#8BmSeJoMo|hWmTB;?@9c4`XO`%(qeP`Nh9$j)?c_waO#gTxJf5yL&K*KH zzA@!q4smS+1Ys=4P}=*xeBiJkxG?feQ(c3JyrY{JdX^pvF3fqm;XO9*Kv=W-$s#-` z4qy)xT@EKVE^bY&bV0!e*0-)nLAO1$M|9B_T{I`zv0A)VnqY)!zm*h4he&%T9K%_Q zk3t0BC2?icA0)hMSs3u5e{ct?&c(Dn+{wfkviCdiPx&-#rnjB8lBf67K~hCOyVVgK z9k(#34BTv}`5H>M+V^WiJPqyMv0&@((^Nn$%H&1u>f#yTFiQwA0jA=WV=L0w5NsDg zRd{`wIS1JKC`^Cr5j~Z7bjOrtk=&W^!^!NIq?}mOz@d+;|M3ydu&X_TqL-A*pD(cl zTjYpnmNFb~dZw8`9;ptt5d1|HyzeF#Ain|OO^*bzD6>;JNxT~;tG92?G)+2bHwqGB zpOt5x<(nw!LCWgsN|pWU4-x~OFd9|bBDmNfL`Ml)oiThl z(qAIp$ufC`#XJT-gv-T76luM=hjVWLZq zkz|7=S|M6xyZ5l~^M=*9x<<`jSQrOgpN6jTer)%9cxAi4+P~~0-{0fu@%oIYdBnNN z?&5Pr;@vz#zhO-8k-9L|GExmx7unBclE@bDen<@dqlE#f+boRX!?_Rx7=94{N$R|E{p4Q4%$&CNE$ z8=r2PnH+6~DM;J`@0$c>?-3_lq7A7+^5l;>7oe60n^Sl8ZBkSj&J!I_a_Dr1lpJHk zYZ5n?nWiLvX2`b*yeF`GQ4%)ma1UC&^Pie_zMwg}vl8BXcP^ir;SX&u9XSlk4s0EX zjH?>Aq;+p);t{~2Inptp5V;d|ENsoRr)jJcvbZ1t5KA_s(R>X=3BD3*H27*MO;MKP zyw<+@%8w)62L}qCgf|6JTGbpy@tp6~9w77OL=UInvjnPzMxHltj}G-`y!QnmS1FJF zWiP=GhTh(bX*A7HI74U`1>;7EE$bP_3)JVfQ9DbPHYt>u9>-&%&yd<#q`w)@$)M zKMlhJS$%HL+JMJ}-!T6RyKfD&aEWwv)gL$GY{uo*F zy4Ts#@?>=Cghr6tWO2NaGLeSG2xJ{D z{_~+1$IeR{ED74Et5Oe%cTrG#bx&X`B0kUs9s7a=j5%BOWCDwmy#NR?Y%-uJe@0;* zlkwu``Kd=h4wrFr$9UlR4J3TT+_4`bwEiVTTH;g+HAW^KdmeXw5DxQF>}m0VEbcld zvd>v*L4B8sOw6lZW6CaJVWmS^@e#)kdS9f9#-sQ7T0t$)v?zNdQxjy=2XkxUdz}L_ zh9(H;U^i(m(B4DyM%b#gGXKtc#F`k6f+whZNEYkGiLf4!xMxu^XhDs!;hefQYPLp` zzLZ{+d($M^fYel12Z|BAwsS z-NsN!-_i14XHS``udXP6P(Qs^H_uHN-D61M{eCuBu>|V*E|CNxvG7Cq{dE5Zghkpe z$WX&sKQ$32x32NJV3A1Hn5R;yauT4yUnky}S4r)ioi#r{zi%!(eIon5+WpP*YQo5c z6;gf#etXrk`_VHy+p~N7?PN%E`P)X&HeeQ%@;dhYu{U^dB?N}n)E@&r9|Bn_!#I}~ zaIy@-??oPgrDxkz(2XYWxc>=A2Vz(Fqif&|@B57d zLN!F7hZFlOZF(_SL1$VKMs0yrS{V7x*;R{ZPTg^Wmxztb*qWJRwsFatSvsG&)UuT1 zQUyPIs=UBcEMHE&XW!f z>eN#X=RpP)+0Fnfl*iKiG%I5m;haBcPF7b}R_nFovhwZ}B$oEXsYKhj$zzHjCxKSv z?}h*yb#aEDZD1A(+;!$Ry(w7|q^N7EiVf%z7x-u5g9s%LZ!?o7$&zScP33787YHqc zdyo?z==)cJi%WE5JJBbQ3Tj*V7Gr)=7DDtdhlnh?tNFu+2RT+HQteXR%tZ>AEL#HS z2aUsY#VjYSor=O{=)A)aP3R^5ad-cPdU(y>-~4)>Erq4Nyu% zp&R8Far?!hu-y6b5R0*ZAO_?Rrj^#x1#8qGQ;A{Y#XJLc9y!OD(-$sk&r#L>kpgPs zS!P7lxuh~nYpqZz3TirpR9l2ZvUois}{Q!xu^{7eSX?gTQ z*uw%2{F(!z=azF53URxQCBYbVIc|0e?ED2aWoQhfmD$fvzt9Uy^-lS{fH>Qwm@s_}BNjKbXh&@=yWc#2O4qpBMqbBLT^cIR-JP@R){lGwS zoVXZcg`to@^9j%!Nl4q>oSxG`L_&QS3j|xqC)BOnveji_PDK!=@28jnN{9wp{q3L^ z?1CMc>Oq3V+#!!df0fQ9<+^rB&36y46|o!PKDSy>74Ivz^J>|yWzQ-eo8R4MVAC5g zB_w$B2M&xJ0zKldHIld0f*I0=kk`#&P0el>aQE;v(u0e;>Wc~s48*yoSh*5?Z)t^O}(Dz|SOo#?E3ejSvlgY9ZS}mgo-{m)jMB7e|&&2`5b;*sScg zjRSp)U*>vq6tOUqY8r+@xB<}xesgB~OhOGZ6RgO zaC)qlwTnpx@DFiqHma@l&C@==AN0B{#e%k%l+m>rgL=~T?$G7Xys?EvixD#f$V}_v zK>g$y*hQ+{5+^dJ7&VVmEBk@MD7URLEtjU7{VgAeOqIATTUFGXRcsDh0(U8ySUDqYd-GUQH>9IUr~%C4$XdY~3A=gt++*mXqG+z}@Qou=R3vMDRMENBzRf!+k^+WD zj{A|zz$5eI4*Z8LScFS_#3RhkDGT8iW>hD~i(3+X*%71QmmlDUV9zbI?t|fQ7Zt+^ zZ|dk5hVt)vd9m5a@u0&)e;WR{Bdra~{8+bECiK<5>SI)8H(}I+KKI8_H*BlsCvQ1lswrYj8`h}MHg)~N#QBKe`%Y-f0*q&F=>TP%R zmUOJo6xiQ`3gew_ebN{6Mu~wOG0};834?WmL8Aqv98L1sdF?ghYo6rYTFWT)NdQT}^hE zSh_(d)EOC|9@B%{*&>5MXJxc-2aXwmp!TC!kNDpDJ4O*xROfsx zJya@v_j;e@U+O%WGpe$N&d4k?ddsL(bOV2V8n01_fHm%=`HyY=OvKAon>mwxk|$2e z(Liy>ENu$jE!k9Lu3`k5+dCjxwq>r;oYE=B#p4#i9Toz)aTk+Ocuz}uEtbD>S_2df zQ7y43Z;h7E>z<`iEKe&e1gLwBWd>CJF5aBH1)g<~W$IBC%BSqWw`4WWG5;Q0H1<9C z7Fi_((RwV89z0&ff;WVYI4=+hUq6#2?TjhTC5|N4-$d0c?lPQ-pFnk4oYjw~x$bcu^sqYAU-9q1%NYL`J=s6ul(g*^fyd^*K^4(IOuaId*JY6T zF+Kn)Xi0};d(SHr*8EApKM;g~W@CJj%;-)RYcdmpE~FUSCHZtEkcIbx;CBQuKh2@T z9D3J`j(8`2W!V<<`uM!U<%9&eH0(FQV!K)y(U}njcSHgMCVFdTH<{N%z?S>S1T7m* zg4GQG$t_fthsm3CRf`Ex8<~*HiVR2$4#~>uX6)FP;?)EF7v#6;4~2M>bS4Qz>Fgilr>K%k-W1U#u1_SY!&a7T2q zPvQ>PF!7(8^D_3gT!hQjk}$tJlCEUFF*5}-+W;EV%+!h} zVnE%6H*#EOikjp8++zeHFAJ0-Yv1=dAwT*X<)4tjcmq+^RGU2u89;G2G{+&<1n8_~ za%}tYWDs)LNjYv2^?+#+@gg?}EMyo%W%t6xNL&$a8shCl#HN=!<1GQL@%$h@BY-+r z=y@di^+afXlwFW&GAG$ESI` zMAEwZi}(f(5lh~FRrOU^sQeFZ^uM2m|6}_5@2BCv&xL}qqqCLMKZwx^(z3|%DBR7N z3{6oD4QfIMlJuoPZ1ngvIp+Qd$Z-^qOjc^0GP-(pZu1iz`1;4X4*XJIP5@8T6ra9! z+YK>l>S`+;o<~!y#~H4sG*v!tpx1EK&?EXR@X(G&Db2NJ`^5OJb7(i{eG-x-HYhLJ ztTG;*baR&{WoJPWl7*YH`l=!pgglB_`qk;R)VW}}4l^8R#eJ}W98Rtr!*la*EZxU= z6uI$YNaq1fxel%syOg@Dka!mPDVw|3CfRz{4AF8{&k{Z|G8_yR;W9m$4wUyoHM9iV zT<~d0Jhz4>+hdnwY>-U7t11#A>3$)Gqk%&Zqe*~)rAX;Esq%E1;uqJr`Yq|SO7Iq@ zmouxn_1D>l6+EVPO&g4shbx10SMSL_ofM(0x8Lc%;|1$%Cw)P{t8pTFU9KVAu_Xf= zUv*>Uu%h@!mZWZ9KFbaKKJRco-!K!Tm_&%<;k@!2UQ=dOWj+FL*j$mS)T;(xT;;r< zaZ+E#*z2}i5`|-@8KC`rdh@nN=J6uti6#9b=jf&Mki=#coAObVSLp)Chm@sB5AI;fztL{-#IIb(+-ne^sLs|6^qQ@6^=)V`TiV41xca zko?y+NsQC{%THzabHA|C`fg5m(%)m@$6A<9AA~>%FeBNGw+pVtLT2oy{I%wy;;bNE z4m|2)6=n(aY|jL{pT9;!CC!pXwEMjbz3ns7tN*9{m-&=g;{QVc5^v-`;uF=0lRuXy^W(~tW}`~ z1M6%F6qC1n%Ph%PRuZ!m2}j%;hHc2vldJX!tA;>L6LoXRaUHOb%EY-<%4sTO7aB7T zC&ez_bA{w!&bI6M;)7*r8a_M$_*3+^ca)TQlJaQ?;@t7}Ns^WfD#Y1hQ{h$SEbz*0OK zNFdb~f83XC-2%S>2JUdQ(){X2gzb3HWTyJt>1#g3<(Gz7|2pghTM4XcUu&24A3F*E zKM(s~Yw2L4ZzZO0V`TMDR%@n`^p_tRN=9Tn2c!-5T#P_z&dfJ)tkZ^ud%{A6MJPma zAW&j-8SG&REv@#tOyFOE-93KD3Sc21dlRuBVn2y|AonT_feYC6sNArgn+X;U? z-8|s>f?1Ko4p8k;nM}Hnd!vcOc zZO&m1Spo{TFE3f0O_N!r#|kW)h9l(XFO-LUYy;mI*HxlS?&CZEV0AqDhwF=1_<)PNC4BdI}lIR z=h4CwyzSa_W_mBer@?2GqwgMuZv_U+XBdN8HIN@-2K@Ql&h;mzqHKvm1uIumtceQq zhuwe(_Lv|(;jJporV3&Y@1}qG9(#V2Ra3zRxp<(W**U*4&m0|9^>lT8a5ao8bE&5c zSn;7%hO$>hoo(vpo}#<4OGzPGW}3^;q=|=a>RTyxz>!%Y|0)o0+oeTZ@o*YiL``ES z;d5!2=s<4r5uyV_?4a4*B2*}Z>lh6NmqR)V#6kC&qC$vXLr^9Yb%10DK=j`fN4`%^ zLrCSdFuH=CaOXLP)uQu2t9Vg8bbbk;RIeZM)zcy06v8nC@2HvoSPWP6R^ zdi6JcKrKJVZd!HKotBDboFO!cXOrf#zx|DwAx!iY%L>g@B_9EbZPd@2a)EjeWXL8< zly~8;`wJ1diwbg2H?4?X!ai)TK^N~6@~=JaP#<*Z^0mL?|A$?`zh7woOUBVZ;oW~< zVE@%EBl_$0SM%&2S`KAR#dQ^g474ui15HM>0M%!G7!igqk+=TGy{NJkcc8m{HqF`pHyHXS)1mq?N)KI_@Y<`#|Ih2{OxL$c#-=0O~RU0No<01}{()ys6m~hslbk+VU%O zq~Fmki^?P=Cs6;p-cLviWr+21CYbH!QO9?j=VDp8-=KqARbx)+w^^+!T$%0%p7}qb;&Evt0+9&cI!DR!lGu z9w9H7T$CKgAz&o(L_k{$%`cP(VgkVE(*6lqJoW=AX3_@*gE z7mB*nGfCM~^Z2+yCetgu59>3{C5v3MQ?+xtgCFeUtDR4DDE{sK(+y{UEc0#W7SW+s zvuVeWF!<}-u;}aBFiEupyJr~Eol0g*O^P2mRR%EV%2tM=gMw6LE5_v^kILsa_Y_Q! zl2>xlkT0v{LaaAVU?sr~6wRaSzAtmgF_bIkok;s@Jw6l~QQHS`3;8Kwo(onh8w=@I zOMC&g{svhI*=f!3wP!35t2fqbO+muh%0qp?-uciuJ>&EX+OmY0x9pyl##5lwFBa%Ly0Px#8 z-pexK7|ngDMCVLd_) zAPFhWYu$i9+?(ktwps#(#axFt?6LhIm4kR%=_|}B*_whg!Oz>B+dCpwji53A%}i;W zgLs`JCX?prjr_?AMt9}spJb#bkG!tD76HS07(KB#EZ{x(#MunnITI@}>yUzItYJnJ}Le;udv{l4UF zRI`^Ks0?omj|w>Nnj8B;S8#@{3X__2A`W+YXt_iudp45sB;Yrbdol6;HqY%9kHuB@UN@Rj^ zoR`e0t_W{g`f|6-8eE!gN9gmc+@rv%l!IGuOH3};Y`oGK{X!d8El}x14@JJX@>@Q3 zz%PA({Lg4*hPcyhch?sKqT3XKB|+wBt|bht&n&DjpZI>kT-zu2W?B#^wX~RMzvWL> zmW7xiJR*06`#EF&lap}dy1-Sh@19P>^9?4r>H<+qZ))H07z5eYrhU+wN13F5TiaOk z;{VaUY^Oo3E9D4ZQviV9fRU{7c>dcID>Eks(e4Wu&HYDQ^c4sB z|K<(w&pYE^G3`I@36)KSbrF;gH0%T3o@a8%24ZnZBtZ>M^BnOWV#Gc@uvNAuyM8B* zw813=FwI*r2J5RAiq2E(bRDC)i36Y)IPaJ(Cl8gCp%obM*46ssD^Ant)%rQz&yQ!g z9&ROr6h4+PdoSc+;)<}t+AnDkzM-@~Qb1ru;2(@U|09DC=r(-)czuaR@A(JR;?=#b zH7n+YG*!DRdLpHD7VW}b?&*6B8o0GXRKR#ZAM<4@(pTe-A68I}I)Mpb9J%hiTziUH zy=lQ-mCdd-v5?WjHGjp-3Q^lEulkWbF>s0 zS79}p&Mv4(=>e*#G!g%T>)e^2?Ro?q?6I^cIs4oU-yZvr}uGu^h|u z1#qTcDgF*5MpagWLPN$^rm6TRMclJ#>rOzwhLB2*=tb3Cv`k~P};B=`K{vra#X zu)Rfx{9zUGQxx5KcTGw69o`yRnPJ^1`~+~bRqK&vaMCAof4=571vOjX7HNW7$s*onZe{Nfd-l`6j7uGXs-l!LGk zU6vDyRv*@esZJ1pSkuz)djSq6ZCbt%<%}jxMpi2MOX&ATsqhITF?}AtXu3qc@2c)w)|d2ALQwj?Py`up#OOw>+W ziYoaMkN5@Wue>>ayy10sq5GSd^~}G`y1KVL_`?}3MWR*XUVG1*sr|q`KT2(~F5jw6 z=U%LO3=<=p=W+@^a7%4$S}d7Xc07bS6m7nCQ&rz)Sjdwx{=qa1`{E%rvrOcVX%BDC z8cEqAAv?}=Au7fZ8U6Ys8{)GzJdM=3G^|VNkstjT@%uRC?1nXT>vZ4NFhKh?1%jtnhiXq!Mr%0FcvYHF_f zTa6%Ug+hvL>F9K6Y&*&xr^M~64wAmaJ0i2#6E*l5RGbic$r_S&lDLG-n}gO*EK-ly z-^6*z!vy#9@agx$SuC?ohvMO`M;fo6H-9KRk}J-r-)oZ~y6hGfIoPfD!TNEqi;sD{qwn*Y5fS7z5RK-QRU9qhCM81tBlh~M(0T%<<-y+#XBfLC z&f*$fmlc1i3oJHP+M%2{#l)Q6E04Hg#?&2ls{XLWlbvGp2{W`1gt;@ghB*2e21 z-AC!z>3_t01^3zu_Nf?-mbfACnV3IzdxC`LJtX9fzjnkNS6d=^6X>HguIQ}?A#WpJ31q4)x9KL&* znx2p7I9P5}SJXX;tro@4Y&;m3D+_aY>v|PX`p`$X)HIG7`A8xdN2Q!45m}PFT0lsy zXk1b0Nhlyf(K5Aaoz9?QZ>b<@p{Q^jfsx=<4D1YL_PKwSKa+_i)M%1QERB0eEY;z{ z!$4`ay_Ixj&ZHcp7}A`Tqgb<5#uV?A>>!?}lf@>XjLTSiU} zZQd_8G^wr98rum`i}aA+iTYW=_wPeI)_NLt%=$2*gs{|0h9E)ZMW;eqD2w@!etkW2 z)=cKaFm34<^4e!oa92wcIw)DZ#5TZ!(mE4Sy7f(Nm`RXFLJWbV8{l zY^U-fp$65E3}xgHH)9*e!9ZL{qd+arO7C4z|7l6$&BOsj5F9D`*q&3`xl|V9L4!XI z7sjjzl6;vB(g(@zRRhZPilMXKI1?B-N5!96?KBbsq=qj|g{l=kQ2bJ4b`eWU2GN^f zj*UrAgHv3RgOsFA_px)kq)3Hb&WIDC;Lmf&ujV;%_7%idVR8I=5F>H3YIQC<;lL;V zGBR+h2Sk*8_6dtAYU`AoHir0Rl<>YF`OrZDcS7&JAWD%1kpN|5xk?4XZ}0>cH;%n?eE72Yu<+wPJj?cB*NIyc)yQMD~YVokJ z*+N$nFBE1)VwRC96OUoCv_KMk(3ED<$sc+;Gi(@YupDzh6GvOIx9Y=ZmTuLYzh7we zOY^nJ&Vdr)JaHC`j+{f7O`^z4;PzoBr$o^r4`qk4=^a*gWEkNzLvUory0u@B0L%Q1 z1aT1Y^OUcYckJm&pZS>l_mGMORn(38P_{uS3PmV`@WimRlx9^9y7%*-;1Vlzy*i(= z{R7Tz{iuas(f)@`?#yVrdH(4sqH`@Nn_^`+%TDOzhDmdzG&mQjYTB4go~dSuV?3XrPf!qp&9S}Fg;lBMqS{1d9QLgNn=~WG@Jgm! zzK3X;ye<|5Zh891`Brh2fp_v&pWFdX9IJ~{D`;pKaDm*^wWZZJ9>(--AGNx~=Rlzgi9GT$eq=P@ zlwe^qVQf(Uw|yv}w&NV# zn~dGQM@l;<-q6Xe9!ZX)&d(iwM@r(GtzocQkCl!KxN2|jD*^l*^g{I-9=E*P7-7Tm zb?)FXon)@)P-wbsueQuU}^LchPwnyHM0E!eqJh z;&z(y5=-R+J{e(>HDO_HSY5H8Sh>f-n3P4tOwQ6wb$t2v2iaq22y(M*XcgsMKp$-{ zkSI2?AW6t5cGO-iQEJ+l6~zeds}L zw;NP!pm5m@t8Xx9NqytwWn$$4d3^I7u`mQ;z=g_a|}03 zgOsd%!#G@KuVh@Wbyyp;-57+2mlICLHStd4c={SD2xnhjZ=lsMA+Z6kehf_}uXVig z=mC8g6HpgWF&Qdkl0ZB@WbeQtlYI<4UIoWcm=6Dy?`=~suJgM$iF<`-P5(Ta?Kf-u zjZLrUrXGb84BPioADr;|-u-!u>!pg7KkdB(o_LM{CoKN?@MPeZV0)7mLTsjTdEK~Y zLp6b<`z7i=&BEI;Z6f!ohaK50p^7i#vY9=WKbp2Io+E{LA}I&iWRCsqj^s1sr$svO z{D2n&YHwR5RNwS9&$oP^HgRaa3`x!WykoPQO(v#5NT6&W84kINv+-?-*ZEq#E8AQMg zY|!=qp(sT{(M-(Qq5)F+HupF`_PHl7wntBeBoDKY;+>3Z% za6F`3|1(%lLzG|9m2?x)V<}#A1lmC(PC|kjK{k#^RzJ%P3v~}uDb$o3Nx2+) zwjqD$G~z~bxNPq(*E7!Kr0Bt5u+2+LdSfu#(aE-Zyqbvh!Y!d$%0So$gF7%~wB8~S z)~mPD1UZ>%wEiLn7Kz;wVg`4pX$=4fS5jbe4IyQTR=FTAB_1EqhaX#coSH1>{vX^-jwqvg`Bj zl+}i?b@>_SF9$-re{CK8duRIp=rRa8J2=`p{40sGQWe@0MHSPBboKn)<~vdxpIEK} z4R!ivOeLBvUyV5hHH+5TH^h>q(MyEyER6alEMSeSXPwIB))jh|iyEaW)GH=_dDI#~ z8k$!xj$U5fsiT)BjMy{7T+>Ce>QNBMSxzPk&?SnHs>jO`dUgv}Ai0uqRW}q3< zj`hhNT+1qV5WP<;y=e{7q7ad~M79DLjoF}*Z0j>S=&jCz@Yio)#>;8U*Qv+t0AX!s zSXKVi{cXy2R`oHClJW6P`-ep=N4LGX8Q(Cb+C=oyOPvOAnw_c-FrY-L;glCuX1Kkj zTq8H+M(wRl@0LEm8U{!nIEws<6X%n5zqlLRWKUZ2Y$A_E zxP}{sT1lDd4Ny#*orEsbv^ME~N3?$+V%3b3hm0?T`WE&_})7ozt^;IWAX- z%X9RE+g$xXYVq6onj2x$lWOak=uOx>?`!k$Q7$@kHi|imCIs~-IIZH;t^{P@azIoS z`ML1sE?pw*=l@_lyjZQI*@)2@GFLoKD1XUo-;=%Gl%UD0nS%qrH@(F6I( zt_}88-0f>hjo&v-u`AYUz3gZG5}5>#U$a}hQndSJ7~^h^7OQ+myxbuE#GFi&su<7g zp6*l***21y9wy$L78-7CIWUhaDE1*p^5N7cbXH&9R=txwj8E z)-9My>!{EvY{8~+Ej+G#(QxZ{sH2vC6wzVDqBGsDa~fa)T7Xb>}I}d<*tII=sD6^OUi)1wr0$Wa5W&=USv=mwtIjQYbzSw?CB>@ z!EXObfqs2NlU{t7D)U56#V*d2<;bo#)@4uToYu@W7LCOd>VqXlj|yye(usD;+;v-o zi$QW2D~i?2_BJz6D^W^6mJeY{H>$Di*l!(7+!zz!q_A!CCvG@OvsiEozJ6mV`cjLm z0w7dXrj8)qku`nyDhf#Uo;lvfRm|&U)A`tXp{HxR6&}Pm9FB<*OfU*h>|ZDgu1sE_ z&2=NJ5aECT43(M>tZi7ZRLg0wp>%W$v!<=3F4sFs8`l8hqXVjt!&;?P;ZJt;b%=_# z(46wBx}aKi6^0CCsG=j)#!o|S-JML?r=>)yY1-v=)D4V3N5UPIWha2d^kcZ0IIme3 z_sY1Uvu~mtAsSA+#$!?QF#d9*@5j{LXZ=w z_pMxsinebiFs2FQ!4-g?>k}reO-Uj$A2k3oEiJbeCE*NUscOs?B8cY>CiYIA-Awid z!u3X<$=yMT^X`3s%JrcDPAog1rAU_32Dkog5~>}#dEc`sW(dF8mE0g|DF&}11`jA` zKPkt>fizcnj=7f^@XF^5ls7#hXnQc7(m#PwP(};)9(euzEF0^mvws#9mIPPVnx5kC zEgRwuSSeGZhv%GU?f-3?qW|P+z$oRLm4sQuC+qdyLiq}dXyr%Y7Qr7Gx#A$yn$)~_ zwP-^rrQu@-)11P-Lf!*{e8eNsc;2;sD)R?X&y(sD-ZfG6a9*rJDw&hvTHgPswl4vM zvits5k``K|kcb*v_JkC&?>os_24ml{Mp1}1vLq=<3P~YLz1p-;k*p<3C5cL957F{J zk9D4zc}Dg7{^$Fh_hsgFK4-t@-g};V?f2$&3lzk@wN`Ug8(E(y9`^cz(`?6WXT7i8 zdc3i`n!fylVo@vJDn`A0&@eS)#n}iUyFP}XO%HBP~sSSVn5LRWEB>fJSamZj_};5}-+yu~l#1=F$rHmPh`6||=GqqX`` z!PzlFCq$lQ(Ai~I@;~XzuKrxkvg_2Y3#?U+talvq7uBSl_?@}U{jrJL$Q*e#m#T>E zahI;ncLlT>00-!+im# z1{Ry-DwUVYMm$Ny*Ndd3*T!&evgeG;uYV#IcG zgg+-`H4mpeJj2+dz?xytyL*07PPZFQVM)4u1c7O&Z6mYN>xLyRFZR-@_J@h4EgLRs z*&CV49WVStJ)Z8HgV6V}D33@;3GF!G8t~poMy^eFMl|(d5kW8MwiG`&`qSo3*$4*)D%)eE!*v`KaNK zB&C|V-DiZnR!cPPKS0kMu60u2zU+#M?Hi9@cY4{%v@Y<7lzD&Ex{!^nLK!Cy+}UaF zSbTX|E{};%?g{(oSKj^0npmFbm~3(`(JhtNGZ$nNag=;RuuAKkzgOnNe_oQod2vCd z%6IsGzTsREGS+l<`qT>j5!j%cjXDpJ)XzkyZ_uH3UB{Q%bByaekSl6vElpPxxw;Bw z6&YQ+Z*)_tjy~M^T$X^A(;CJ@IWL7ORW6wOS9B?Sp&#ZB{-C-8CqFzZB%!xUNlZ2Q zS>~viBhr-k>bk^ef8)?<8Y!?6d>uoWr12<=tGu_tK&Ev%lPq zQ$Oi5zg~~OS$}!|uqGVv*%(iVUzFZn$#;!8n49jxz<~(OUnWL@-FYc4bK2jDguBF; zF}zqtcaZ1Yyzlnz3rz-Y*RyS4&E-?6ep?@oMKH z%U9ktc`a4Hue9`8g*fd_dCr!)D)7_OXr(j1gqOFn&@b#htQKv`%f0rrcu8n*nkIw5 z%4LRP2R1~1S~`nm=OHo8fQvE5Dsd~;nnW|PuaQd9+RL0FdX&F7>U#N(2eP@f;PhfE zMs$=G;C~6eOO~)VUL$L%>-+!%g}$*iI!}9LpY^a+ zd=cf1q!YP~)V-17sX3FE-lP~SBDeki$`rPKDKa}_h3cFKYnp}YZF|z|%G78zKdU|+ zy|UT4QAnbydPNUQV2^#+y@^(UhYNHs9|&qXDcus{`DS;^?*6t9a5eN`{x$_pcGZnd zLT@>{Sn`hw`|Nppw!)1?h zYrbT?#$&JVo0_)%tF&@&&PtxpT^uI|8Z#XVhR&pV$G<(!V4Jb_MfYLfvr6=ft(o)N zY&q%d0vC0P?Ac)TG_qukmcy>{AjJ?QuohyA~zR( z_;|eKL4okmHy^v-j(21?@avrzhFr%?)w?iGYM*RIAlX#JZS(YYC3qY8d3YeV5lplv z7+WJwCRb=}W+wQouho(6I6W@%>LJk^y36Xz%FLcAgfEuW{cqW-rfR9eLY0se`Z!q_ zQQ3bjZcEV<7vOo=Cw4uc<~CeF-u>mrkKpgL3LNa*T3Hc2h6}H(u#vkf5qb7^gzK9c zw!}rvkA5Vm3v5%bgRAs3be@Ra5shJ%j#%-2wZGN+)CWpDq;_zM4d+}|XFKA4 zvFyURmgP4}ZwhcX_$T%Z>~nR#qkh)2M6;1=1`9YJ3!Xi>tQk zI~K6CKd^~)UY1gFC|-vxO{Ykk@#@Qp8k73g?-dU>vItmlbnlTW?kw58`{l!i*_(E+ z5j9#S-9}TxcGsZgbmTS8=A6Km9TIN(+aASAo<10GY^dGj^%5sNr9}c!I`03a*S?f; z>)qgY>{m)G_p6!(DF=t@b3MPG%5<+ZRy(+P)^@R5x4(I_t!q?W|LoVr_|}FEm3B=d zzkT~czd%lTqmAdjr- zgT?vl?UP2w+E^N!()p^ua|9+lhw`DeoYeD@mpeQqPCJL0W*+>HG^fqb)(wBFXy@zf z@9Y~0H_mvD_cx6@+i`=NdT>$fY28%}yrQ$2luUdT?)7#mXp}FpufWm8O5JFpx3X_B zACzHARgF-&hg@$_n0Ef$ix(VK)h>hmpMTQcT`DEJA-}`+t!+x}w@2skUJ}9cGXHD4 zW-)26o@3iPH_DVDERlgcjYxAC)-)~sPUemE=eN%p*yHj%D!bKKa{Y|!b zxi@BYnGFc}*v1K68*EX?yK3KHTC=9J!M(`6@z>I{a1ZyFmyZARL>gB6B?Awx0IS8p z8(Z^A)U8I`e1s$Z1v!5YxzBgp3K=Gr6XS}zz`~5<+Ov*l^ShhhSaVh(ZVvk)-Iu4l zqGL+^jajbUtm;yFm%K%D2iN!+`L&rQ4m zurPLQTxtF_;ktRD@a@cvELE9=n~&R1owGP|ss6|nv3a?7#ooOAU=i`TBe%2j#EsEV zyu{O4?rY~uSK=-{X1CyO{;xZH*{iIVt`%ax>G`vdcYR_rl0KjLQjyasGV?~_Yes)Q zWBIldR^r9x+ZI__N`Hv^IKFQtv{ZFO#>nx5X1(w+h8YSm{ z)(}tMD`9LI+EIB^z2RMQ<0#Xawut@C={PqVi7?^FufJvFOpbeGyg75mFql>9*Ydd9 zk*&vQZwPuMym#{Wz$G5lW0BL$8W{Vuik?fWdiUJCr|zdJ6FkJNepEt#+yTYe)^meY zlm?9VI!o%sD@mLW0iE=^yY^!@PNoAx~` z(+=PAjYwN2!&aj7Ugg)bSvoULASf2S;#t{GvrRloGR$m9!@I=z04_9ejl-FNed#pj>T)-@oLBqz zZ9c~lx}wI=wC?cfRV7N7r3F*njy&Fa_GQVJ3jR0TN7~{}7$#}_h?;F;7TUvlY&&80 zGY-0C%=h`LF13EtM`9&Zil^xoR9@Xwo4aS|z9bzRjeYUHeiKKcr>U} zytZ8UE&EmB#}MbhCPGoY~2jevv6uR zlV2rE4DGB=NqMn)%N;ms{C**B1G5pot<|I0qXz^A?37kk-c>jp7Gtkgp`bSMXl_Bh zerJ+x?GDpU?S_#B%J+}%dgih|X)E_DueuLanc7|j4uW9q}^gfkRTz>#dDt z@@V9hofzP}^++kTcRaR%$NX%lY$rHF2jBIEs`WSr4Xv`EtE%eg*zrf$UCY-c0fHZS$2s-MOd} z_4eYSSl^-~-t>}36n_ErvEXyPH znAnZO+Sm0)G&Xl-ofc;;)*e(jqEif>k3zLL|%OMYk};>ppb z^Kk_5Y>u#p^_(mX@1ZwABl zPruxFcCf2_lUA^)D4iVK$Y8E758E8-BOk*XM3cb&F zS;-RR@O7-nGMm-A%LIn%P%z%~a80@tAy0j{o>=nI_ZVOAf-#!lOVDxlfolaO7rdhN z@9EuFSP~rG^fIjc(9J{ix2}ly+6cAI78iHEKdUX+T{=CzOX{Yje04Z-j*eq%df8ph zj;iL9fu0?oN86U&<%kpy5}&(2wC;Lb`>R{hSNjh4h*f8Z?4NrJQiuC(9aHu>PG>ok^<{ z4x+^w5$p)gu#O1-_Vl)&sDq5%UEz|d5UE4AwY}ZzSuHIk)hs1Fzh0GePbhg|x?jQM zO1;sYgepSxws+RWR(+~-?rll8F*fL-A3k69;^r-bbE>^>9ReIuPX>0F4?cn=jafo% z_&IIG%OWFh*1s~2J;b&D^5N4~{q@WyLRn@Bme%(Q!j?zoH#(FqU!Mh+TS;zfTbf6< zYxm8g7u41t%Q@Y%sFD3u_U90jj;+lO=Xvub);@xL&9pV6{>|cZoK=mhekInQd-6QC zEEo>+b3SMnj~`hq$#X@+YSib}(<_H1owdp~eXS|b3>e;Cs++!C)~4x~{&CiK%2G9# z`0jhLg|T&8ND!_^^*R`v&9N$va*y>&`&LaK>H^I_Ds}wt=3obioSko5d!q zecEr=zo7Z4X*H{q`Rmd0#q}#IQ$pMOF3fws;KIC+!F^A+8y$3u`?Bu7+4*xkRv8*E z^-CFYcR#QzR@~C>FW|y@R_?V%UX{91<--imc^ta$O4&rV_8rO>NhsaZwJ^*&>%e!F z;%@pqTi$)QR@uV%G5u_;wK_Aqiu1HCbVR$3m=~Cu{6@qxB8NV zzPZBwH7gUvj+Dc!iGH5bh^mDNB!(PRRwtcB&5#_3%XhL`e%ybf4eGQ?;gYGHg;0R* zsb9S0wCLP>^ciBYp$16{p06(U$J@Iei?^rS>%JJS2Ia}*Ae4qB9XS1Jw@-CNMdQ%O zvb&6t+>4Y~Nig_W9OjGf8#@< z@UrSj@9(U5pDP%?gpVO0I@fx6gw)X!|J@OiiaPRoP4$r{zYT9n9z4$E5FdB-{s?>X zD$(wRt53J~rH0J9d*y(O-wg&1-&rxE^IRA%y{y^&Eo9%?nBbb8H1T;sTM%8Fyq3OC z1Btkf>b&VM&vBSM#>{x^61$KUT6w20WGuhOzfP&)+O1XmVY6LgHR{uy)}+s0ed2TG zs_jFkZp$(J)>`JiO!LRAU;J%fI1KMTe9Lol^U#-DvV{`kt8XiM@2he0EL`ly@U~Sf zw>2)JAmVVekd}-|m5iN;WAp~cYk};_Uczvec~MUick>$tyNhfNod@M`4{txA%7uu#VQYo;=^nWyX@GM74Sai6=JFX}ko zwLQwd14>TGnMRf{JC*^9;_*;ySS{ zdz0FIlax%J_q7~OH~a**P?SqvQ7BEk@QWjD>ju^I&{bzubrs4PZ z*4Y%$8IRUqsOYM7vv$1y#pBtIcltf%bW7uY(d% z?ZaBUO1yeI=#(lS^=|&Ox@Y*fgvPG;hYTmrizx4Gj8S6aUCdSx-NCKw5pzc3$u}i| zTLa$=KGMoZ@f&>=NL4>zbs(}PjIB2jpA&GO?^SfMtiPP3#!o{&X2aU&7N6)D+C#Oj zif&5NG~3u%WqnMm{bhZO$*RX~B^qk$u3W*lW-`+M=ayh_EkEK$^xRVnm-gm4*s=RX zZkCXKb&|a+y}kOCSIx~jTbl6K$BjPTKKLk~%XQsetuKr9_os@v{l3XtT1~fdSnlY3 zwxk|@N$Xdh8)AZ3OxHZhVG)(f`z%K&9@_g|i$3jroiE>$c;6e_19~q1OfS%5H&16I z96!Z&M6pctUgqff{CVa|3T=W-pN9Gz?d4C3j?!I!^^5-f8GYwarx2|zYm_%FG*jc0 zbgNJ3XTGkqfbM+h8@r=DOb=Xqw~6UH{$wB+W=MozN~d{$MdJhG$R*}NhD*!>0ZWr( zOvhbFrYoP&23gMnbp!+HD5FBXSfV=05FhE7VN|I_3pW`%yQ;ee-$^ZAvS;(WToV?&+v$XV2 zjSIGSUfcb0EOn3UU3q84BdhF!gR1sdU&LH?)7o8nAC*fm!cdko6UxKR{NCKXZYwx%AcCUD*JfP;V0acLpA}Q{P}Xe zGc(kwy7orzn;pczUb-Z4cwdwGqwVIw3LS$-MmB7%xh-zta^jmE*XtU)*aC*z$``$p z)`g0FkU8q%{n+rd(g#6gxMQ>qyAcjXm!WEOjN8X2w*@F~I!)c(KwKi{OzaLkO%%z| zwmh=u;F>IrvnyGcTDbUQlbB6)?=ER6_YE+jPkiCv|KI#AmGrjvY2g-ELa{_fbW&gK z+tO;e-Tob~e7YQRe_L&zW%kIM%`QnaZ6Aw+xmQp9J;BIxCKn9^N-x)J&9Y+)Qgjo@ zbFQ4Lta(JCJhyg!X~N$7H(ym6u?03;^!x1K^{+{D6FlQ!v2jh>}7$n(+-(`Odc1=0BFY{Y(=sngxLEaZHvo@KfACXl1Px!#8`C3^H z1!0-?FBWjuu5#JGdfBFoQ_?zZ(q?U6>Aa%@SjvB|Sr@Y@$B${wsiLm9C-U=$lW-3C z0Sx+LjAk2@zXrW4ERr~IVgKt{#@v~X_@ieWSI9lu|24LBZN1N@-JzY#kH@wwRZ>5w zJO=NP_+O4X5)-4&R!e<$b>?4lH(xe?^>UU{Hcr=SL9{5dGI#C6gt=BuPAp7xDkk5Y z&10VMCY!s8hRS|R>(sr?|8sfZ(Pz9{1+RAhG~9Z}Tugkarq1eHu=wCv{k>Y6<#&Jg z>baAm(xP2Uqr+)Qg)+4yPZ^b`4RU>mt7A>}lQ2w=COk1a7-t z7j`$O7q>8H^I-7JmFl?{xb;@eS-JH;xtceF_Blm7vAI6c3f11ntzx>}D{YJ)&6z9I zl7Cxxv)8vDcTYb5LB|zqy;Wk~A(^JXf%B@{$#uLtU z&@#?Vs9UCB`Sp^Zo!{E!K9#MkKg6+jsd2kTd@!eo##bHs@T!!%EpoAWm}9G7OZ?8s%Q;Ovm@abA&nkE!@oM%e5RXEN?Azf^vkZ*!ROk?gyN zLkxO2c;lk)cP-j1SpHKb+uUjRl1qhumlW+5(`Z|PBa)Xtb9&56xY@EY^q!qmMDyv~%{w)MYdF(h2eRL&DUO)kG9TKyMI<;-<+TN zaX&XJ9-4F9^+3^YapPHe`FX|_yUzSJ3KHtS@W}jDNbTLN7I(Lm1?&D+&K-_iw@3Tj z;_IE8>wlcN6rw=4#r9N*`H%fFKcaYk#BaE*Fker6w3(H_egSX8&|Q1u?k&4wolEyW zvK}t#X!1YwqR9Rm?a7z#zI@19^{`0CIg0OQuLy5^{^5$U%@IRhM-w%DMdFr?Uu#Sd zt*P~e(cn5gvJy3GHZ#rms)_K#Wt324j=kp7K+vOJx~e9M!kT(&qQ4%K|0&;*lu~v0 z&yhDX>d)lhx2ZqXRn*f|Q#Cdb(N#mh7toCFHj=JjLUS0=>mmFM#{_wMI@`m18T+r6 z5d94e%@?A-^6~TX^7KaT-kknx(#i)8_9J?>Rw_Ir-QA8>kXsA^LL~8g0r1@LpbH zL?+daa6z{ud22EJ=L9gzCKQo<*hGw-@ZN-ptFwrHMt1JBl*Usmv3ZfD#^b^=no@{; zVIO223g;{!Q;-&6c6`whbw3j+T@9OlsY}4A3s6DqKm8Jc^WiY)s(Irb-Qhme$*o_U zo~H+_OglI``g!AhojpA?J$!ue9(II@Jr-h6L}~Z?zkk01!h8f_&`Q$-@4*1o^YnFg zaJCzxKXvVxt>-Rd-@wWK22z}j21G!Svx2+9TbYp>84*?i!d=K6*^%m1Yz=kNn-klBfLy?>P~~m8v&O^ zHs_~b1c)IFnI`EY8(#ziyd%L|(H`#wr+AS&8)BcLy%8acA%$pxHIOTZr(Z5`K`sUc zkt5@Xe#X`ok~pqd>3Y2fq)xC0(mpl)YJ+EHFp$VSfn+CySZ9bl-48k*Ga@#D_l9W* z_(_-t6UErii{K4V%5a4;!CrNj9l;B6ZOR%m>7JYP0=#VLVj3EK6vAmeb|OA>Ni9b(d`oL{J{s2)O`# z`jr7YRT!jE-Zt6bM#}WFG{sNz!5-f5Mkh3GNC_B}jiEo-*={0rl5>pMx~e2R`x=ao zcqSSeFfP$6Y%?ZZJ-q)`UuQRrboH&pFa83sITu1&kcc1+%@JixlE~i9q#`Kk0MTyr zh4jP|K)3}oEQ%(qib;5q=v4BZIEj{2!OhnWK5t;4q4~TL`h!r!_d=q_P%tsql=W-8 z>6;Ee@GJ{Fqx0J(6HKy``o&HDfOs`!`q|Y=W-LH^lq`Qrm}1hO)CqC^oLC_vRtuu@ ztGc%`RssDpK%Wn#mTa>b>0=o(OWs<^69|Sw!bFD&yXA~TF~?`bovQ~-vrNFtqK?tf zAjgVKzus^EQ_9%NP8y}(v;g>~g@8fs|CoLyp2MWB=V^@hCyWgxpm%qI4nEM+Z{o;T zQf+H?tDVpVZEHgQKzsPCOiX}DYfgFi#2P&@ape51p%0O(Xo33?NWAE{yp)AWoOozb zHYWE$#7CCW5|aJ{u6aN$Xr836PkISC`$+s0ocpXC0qj2ng`*v? zw+)lD5>$U`JF9s0yNaM!z>uEbC@kzc-@U|MBKE604nC!=* zi84sSE9JhOP>Y{~@=<&m0e<@QX-1HlYrPTPZY>2+jt~S9y4JhigGrveOu;ERJDR`= zcT}qJiylJfJOL>bkhD;O*!BMn5;-__jfr^I{<3mb`?WMQPc29*0{S~jO(_>9^*@qk1~mrItX{+n zz{r_hXz%u0iwQg_)?|dL__@0W!Y^u&)jhof$rXqs8q1wZ@<>f|8?w42O2mF1OeAtw z#!(3%8d;UaE}+4KkmvbP5b;ovVR#+Uct@FW75jJA&w<)i@HF%!*+>MFDh0;LKcZZB zAl_Dxb6`7?ba+4-bP;)46ccmOEJWT$sUAa&(YUyleGkwtg}jN5PucY|(w{Ut{2S?M zr>r%9DJhOHm~(w!MVk6oN@60As|Yu-$UqsS|5jelCrJDCT(Ap-GWaY7Oc2zf4`PC` zvy2Je*s_S`l~-hd^{YT*=po)v9}|XxEJ%W*RP-Pg8Mtxn8It^+$t-SRh>0<2apJOG zlCrAULf2*U0R0URerS&pfZjcf*q}szVvB>cMERASy_Xk~NF;a^dKAtz{Zsl>26?wb z0*1r zJ}DgJNgvn-@pT^CvzTE8d5HUn4YI+r97X_ii7XV4i9{Md6bpVTlW#=7=|;9MazU?s z@J9P*a{?ytq==KX5(V2K>T^DFE(jTw-@>SjUSDcIJ|pc3-xwP;DHVDMfZ+YUgN5K2 zsgTpqLF<|{BLJ20__H_Rh&C{u3D!W5GXAME(w$Vw^voWM{cDRwJ|X(K1^Pj+-1EcW ziIH=r#uQA=An7c)vi9Ty$di>TNOxAUU>gL3Gp2)}`){@0{@MZiCWWy3 zgkHJ*osWq#WdY*$Dbn1mSY7P(W(f_=V_4%u$5nA9CS|hXojm6vZf_LE_>vW7AHSB7 zs=eZ-qxlh+0p^W!U8W9lRq6~4JX^-13aMaVFIoM<( zdTod2`Y~dSiXfVl7N!wd!c&`{W&=nIm+QB1AcQrfZS)#k{ak9~RY5JP4h{sniTgz;Qx`BvI^7G*TS2PU zB2qSNzJojzoOD9n#ss{#os+3EAz-5GLf^yCkKi4MtoBY$XU4ywj4OE5J5>dw(uW!q zoneg`so{>BN6py{vrXZ09WE9YLun$x9I7aZdY4e6OePWO2b34CkXep?@SYr4b*F*K zoyHsmxsT~@Ag9Vsm?L6nQ^^}~cgi}gt9Y-6Jau#oN*@Ch8$HYZh7BC4X5({I~3CN22cs01azr-e+5-^XIPCQkc8dX>82*0#=hRp9*!{Gf#>!p8XVF7M;qy- zY#_D=`wFC=H@Yl3th0EQk0lUGs$B8^1c^aqrE3IWS-a*%BT zb*cg&@}SuC%MdoIsRSkkbs}M^!(qV84KbDk#|FYpBAa@-vPkU4zqN zrtG{@{{zTq5DQ5a?IbSjk7bd;lqg=2VJjjT1S;SN_muN4;_8HJQoat%rVgmH%21VXrtAHk&d=o znDzvNTJ*rDl~Go=7NtgfIyNT;Hl!w+{t(;E*pAx0W&t;w51?qHYr`R7*a1sCqTz^t zQFe2NZc56k+dI23&k)MjB`}XePoZlhsDT-iX9vmvD;2+AFaf(Kf!)#dai|`CMA?Wk#3!L(ne_`{vjiqu=xOdoMQRW;kVZ-}uD$CM2Eh*AV0^TC9_UabJ#FV1 ziZUBJuHe@I@C^WzP~Nr5;BNqkhXOkvZ0FKTy|0W6I{^^ndMG?+V`_M$K~9!Brv^PV zHdaLrdjmu-V^fOQ_K>!0A!^9lqWRSV0W?6|? zh2qSdBC~$b;YY@(_3K58Gl9`EV3Z$4k+G82@1UPxQKO zh0U9er{gwnXNuJilKz`ypVJ=(uc&~@ADZZs9oR%ooZZKDNgkTWY_HLE`G@}?z3hjT z1axM;?E?A}@EGLcoJ3Fz7>v(!N5&@9&jVPn6 zkRT}mq{SdD@)GHnh9(|1ektVOG3)Di`zhn?oG_|tF1{`JK?rkKMp9p3JAh47(bv=6 z*$(C@L{umJ6wxp-b7&7E9HmGVZwHO@KF+qzZg8p^aw0BtyrTRTp}JX%WjhqxG#bFK z8!-gUrN5x6NDMX6TswV^8xHGhD2LEVWYXveXZsJnWEg_c5ow2ZM{#Bu_vi9rK~D_T zSYKn;hX`v+m!NYIDqmUn|ng~I;X;?1`1uM;SvSDpmDmJgq%=I)*i=!8Nrm7>aD*pr#`Q9` zm7)aK{$i~uLzE`vcb&@{#A}4I zA8qhsdDvj;1RtciLMAzbKQar&|7d&}ZpwD#%0!k`DxFJ<9{^LoL80h!R}=ckv7B2M9`^C{ zAc|X6J2$*DhLh)7o>spIwf`3&OhP|9%dN3P+p>U+X8N56Gv<{ zk#JzgV){4ALmYwww^`<#;*NIMI1 z9Xb`2mSJ;&$fxe@>F0&z^oS$8aK=AJDhy>Hk5;7rBkH74&rgm+sCjz^VzeI){cL}> z!~z!cVO0e^7htcTjx&}`DSLrk2fvFYgq7za8X9=Ggy^+zE$#o#I#aQP_z9MciW4^; z?*t_>Kz%Dj#0dmFKQ=E&PS^A$xMP_J@xk|(jbQmOD z*A<;l7r_M(KUY9;9xsMXAI&)qS&I6jiX>rs=j#SQ@d8Bja>2#**k}~TZ5+v`RBHyr z*>|LHRU>-<*T7Eb=9m$Qzr>y@SjcsXASnzyTnI3z0G!1XdNRoa*P%^~P9Ee|_+$1mcnr zAjCG5ea@-Qgh1|+V`JFg`{bhL54c8P;5sB}w85^b&&0%-!L*eA#9${HAD-L?nv{mH zM{m9LYg30AHyDCp;OXOx)Ny0_h2syfW+@9qW*0vLEF9EW<|w_k=wV|~EVywLKSlg< zX7ffmwCK));V%L-i>^>M8DXV*G>3bl* z{mD#t<@(aK!+<3So{FA!bKCz3o^BvTuchpaiQ84xk!GbO5Q3^G;Ub-|!APpZscPwu zO2my7+pNR@(iOZ?7X{e_r@mnMKgAS-op>lqTmD!j1UcZ~F+dBTpu^p;p~tf7m?pRv_j^IOHGf|(6U^N9 z53)OWdb?w_J?^ZM9)&h#8XYhLy8h1&qz*EXRJClO3i%Upl$kth5cf?7-Jz?VYrCl< zjf*oqXTzFrTFV&?B2Rv-hPWj0)Q~?xz)0C*ZH5m|0@-VzA{A5sJlRK`EVbGiYx@Op zF=w66LVEyl2^nHz7&anFY>bWX-qYhf;%J!ha{SI-UFc}0xdX;AM#=bKKQ>@oK=Ho{+4 zCx}fcheY8VE@uxAa2Rrj5(<7^4mLbRpC32p)P#f_4@u8&Lk&`%0}irYhc2!=^04v7 z$4K(oHQDDg7T3Q|mq*-!9j#6_(kDk`;Up8R6fizKOcXcMf?;jr@}d-JSb|L$Puze& zwyCRnD&)v3FisClnXOSYkN+`El&Qv_*O`br3g1v3W00hE?YgSH9I&ARdP6S|{Gh`DQW7si4ua@Ok{1fiP6B^?>m^LMG0etgPrQQONwGL#p zN2&cr)jwgPWkpZqC%*#?U~AtoDZC!C0Zlth(F{-=nKt|nIGQ15KRYlz+YiXmt4Zf< zUN8O$o!AY@O@O%DZT8fw_rde8f*H{3!j7Z*;HXY*8BPS)S_k-yYppq~_u|pX7Cw353V0bj;m>TTA%+d%PoCXfm zQ5?Ab_$LmCcJ3+WZ$xZo+9i9g11OAFB+ttH_v@cPiLC&rn9KN5bAuKk+bsH!MQl;h zeuC4X{~?1ANsG4r*cUT~Np~`>G(4M1QwhR@jNma*8x(&7bN-1xVnd-h8~+A#z(ayJCGkl(GDn&ZzUq$R=JUdT;)YloSczpa zny>?TjJ2B3l54=)Au`s!GyW56RC4gxlgj8dTxx|&p$p;nYhdjYu(kuGH7!_g{RbbT z?(@|3lsi%p42ya+eo#5!QOp!E{Sz~Y31=EUDf>5)h_vT8(o2GWmn?^-VH7)8SNsz@ z#Qse&{UOd`%xhN)dlNK9jHFq}hU1@5sW{8TS5)Il*!-DZ5qJnBe3Ak}m;0aiA=Uz= zDF2hpBf_|DGk9zpl=!|V%N$?(PdxoitfTm&R0$%!qZP8yEdaEJ95sV(GV$jBCk~0V zHpKzuQQOD-%3)-sC?3iyO_X*B>;4HFPEW%c>%MD>?aMoFn^R-cI%~$##u|?ThxpxH> zkiNr%5TR&meOCP+0Z+v#+HjM;M9o_DLRoVffwQF$!*(dOJXHTD?ohsj=4aw7?6Db1 zXl1c+Yx_Z67a_XQb`sJ4zcU2EOevEh4x+W=1@eq2jUCME?NORIrTc#erl^UD)Plv) zkW|e{cNl$gVf0Z!akSmwpEx2)bmYE@=%8T7yaPyTMcQxC-XOR2pAd;h6SNA(zX1)v zG>LN5A`jkpM~mN`1I)aFbmX1!=_8JyNcuoW9UeAgBB_ef})$7GTzH)YPX$o&}Zjj4?=MWRE74?;Q%UB(G5KlzB#q`__uAuv)VRzQ~?tPzy#V>LP1oRfZeQd zWDRA?!X@v1HRmkQ6$ZMBD3uxR!KO>J6F4Q&AGO&e+PCV}0nBEAM8nyHV8fBP2BnR6 z%F;c~Y&zTlaB$8e$sXX@z1VPwB-0J@xIYqXar0c~R6v0pZ<3a!o_*Lzi0cvU*OK-J zQ%_o_+((!SK)3;TqaSve9gYo2s!NQX44s|}57j`P#Sq7005JVpx*wZ3BF`8A4$&Vn z52tLG%e#}`!C|Ch{THg!q~WKl5!lp8Stt1&8M`R&VInF1JhRBpr(m4jP+r-fATPp$ z4p_?`|FDHR+5V*gG~qZaas?nMGE_|-9|_#>z-WrzoL&%x%?*|G59yK|36Yy`V;Gk; z7|{TRHffaHBQe-W(>Za>C&zOL<>CMVIT_i?G6+lPLooS*{}a7##bbkz*pHllL{s;f z9><0P|Hi<-AQ5328pdpF($oB79us$Xwq6ucT{$cvZ4~`*8JjQ_6Oi+dbgbyVdweJc zTpb?BA?aArFTjRDr=Y1EI}L%gtIUE@kzx@=2oDMe#C>5%aX}jTT%pWGx4rmd6M^Tk zJm48eXMcFS6+PWR0ul3DY)9hn%if5TBw$WGf`F` z+9v;)GA`nj`QQ23>p=w$paLZnF8y6hTuk|<+*8*Gqoq^$lhF_o07zRudZ^O8kBLVv z5M_JH4INSN10^;>Fryd0svrCXaU7&ja!ATLL~`C4pUmaR(?EV8*H)AcZT_}nB+0N zWGYT5ThTsw{j8@ThaUiN4Q*I4BN)M!Mnwq}alc>0hvnW=ep%GiMhH$fGK zejtkF6($Wh5|!YFw}sOzJ;xq58~+z_T0X_+zYw<<_s-#p0UYEYu`NWL($Ktn^QSly z0K{4&HxmMuw)XwG+h8Uma6M%d*qhe>0~j)EBL_r=jFjXDTi1bfKLAh&1<3IJPXWm( zBcfagj!zi^ipT>W==nr!$DdN3(3>*(S>RaS#Ez1o_X9;FJGh+z4qZXH6tbWw@i^;R zFqC=EV6lb|MQGhes)WXm|0dT1qT#?s96j<}=01o#1r*UAJyeN~pI<%UsKmb@afP*b za`1A<_gGlKTMYLJqN~;6KB{Oso_2UQC2u&1-45^LJ5f24ON8Xd)b>|L4L~Af5Jn$C z@&zsmqfjDF>Ki2ll^z)7Z6P0f!44aikW=F^a=E^LoQdKW{^06o853O3ymoR z^m>#*zAU6lT^Ba;y*;KdC>?>17`* z{xkF1j6ByT51Vl^DEm~xB^y-SYf4|^*2f|LLY#qID8!3X&c-f9y19|far7$0x|LL6 zV7&8%GqlG8bF75KzT&xCdZhL>$dU%$j9!KK%}y1B*gE9=BWfx-+-z72I}{gJlLm=2 z9N$YtO(aI4Or7qvC4Lt$y&6&>nsEZ$I7x;2_}QOW@rPvD)2CMGkAUK5!;pjarj2lg z0Tt2{W>xcqK^*yc%n%+_4&O!4JnfZzke$1WfF^?SrnB($I2AOMnJFu&fnVdfd^Lr<8kmtr>5CkW}-EDg7R4^NgWA{Z^s6CJ3(VeeTIHUP7uy%r{Y!1`!paLavcU* zJPjSHkW?LmvJ*1Wsj_SX@jO60bVX65OBIXMDJZOZAb}*)l}~5`IpEj>68f$Ne?_0d z-RcN^M(eN};Xq#o=&PX2lWRnkK2=@8{1>y!Sta#@%40y30F9xiz~@b - - 4.0.0 - - org.yaaic - yaaic - 1.1-SNAPSHOT - apk - - yaaic - - Yaaic is as the full name (Yet another Android IRC - client) already says an Internet Relay Chat (IRC) client for - Android devices. - - http://www.yaaic.org - 2009 - - - https://github.com/pocmo/Yaaic - scm:git:git://github.com/pocmo/Yaaic.git - - scm:git:git@github.com:pocmo/Yaaic.git - - - - - - Sebastian Kaspari - sebastian@yaaic.org - pocmo - http://www.androidzeitgeist.com - - developer - - - - - - GitHub Issues - https://github.com/pocmo/Yaaic/issues - - - - - com.google.android - android - 4.1.1.4 - provided - - - - com.actionbarsherlock - library - 4.2.0 - apklib - - - - com.viewpagerindicator - library - 2.3.1 - apklib - - - - - - UTF-8 - - - - ${project.artifactId} - src - - - - com.jayway.maven.plugins.android.generation2 - 3.5.0 - android-maven-plugin - true - - - 17 - - - - - - - diff --git a/application/project.properties b/application/project.properties deleted file mode 100644 index 1dda423..0000000 --- a/application/project.properties +++ /dev/null @@ -1,13 +0,0 @@ -# This file is automatically generated by Android Tools. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file must be checked in Version Control Systems. -# -# To customize properties used by the Ant build system use, -# "ant.properties", and override values to adapt the script to your -# project structure. - -# Project target. -target=android-15 -android.library.reference.1=../libs/ViewPagerIndicator -android.library.reference.2=../libs/ActionBarSherlock diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..331760c --- /dev/null +++ b/build.gradle @@ -0,0 +1,21 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + repositories { + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:1.1.0' + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +allprojects { + repositories { + maven { url "http://dl.bintray.com/populov/maven" } + + jcenter() + } +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..1d3591c --- /dev/null +++ b/gradle.properties @@ -0,0 +1,18 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +# Default value: -Xmx10248m -XX:MaxPermSize=256m +# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..8c0fb64a8698b08ecc4158d828ca593c4928e9dd GIT binary patch literal 49896 zcmagFb986H(k`5d^NVfUwr$(C?M#x1ZQHiZiEVpg+jrjgoQrerx!>1o_ul)D>ebz~ zs=Mmxr&>W81QY-S1PKWQ%N-;H^tS;2*XwVA`dej1RRn1z<;3VgfE4~kaG`A%QSPsR z#ovnZe+tS9%1MfeDyz`RirvdjPRK~p(#^q2(^5@O&NM19EHdvN-A&StN>0g6QA^VN z0Gx%Gq#PD$QMRFzmK+utjS^Y1F0e8&u&^=w5K<;4Rz|i3A=o|IKLY+g`iK6vfr9?+ z-`>gmU&i?FGSL5&F?TXFu`&Js6h;15QFkXp2M1H9|Eq~bpov-GU(uz%mH0n55wUl- zv#~ccAz`F5wlQ>e_KlJS3@{)B?^v*EQM=IxLa&76^y51a((wq|2-`qON>+4dLc{Oo z51}}o^Zen(oAjxDK7b++9_Yg`67p$bPo3~BCpGM7uAWmvIhWc5Gi+gQZ|Pwa-Gll@<1xmcPy z|NZmu6m)g5Ftu~BG&Xdxclw7Cij{xbBMBn-LMII#Slp`AElb&2^Hw+w>(3crLH!;I zN+Vk$D+wP1#^!MDCiad@vM>H#6+`Ct#~6VHL4lzmy;lSdk>`z6)=>Wh15Q2)dQtGqvn0vJU@+(B5{MUc*qs4!T+V=q=wy)<6$~ z!G>e_4dN@lGeF_$q9`Ju6Ncb*x?O7=l{anm7Eahuj_6lA{*#Gv*TaJclevPVbbVYu z(NY?5q+xxbO6%g1xF0r@Ix8fJ~u)VRUp`S%&rN$&e!Od`~s+64J z5*)*WSi*i{k%JjMSIN#X;jC{HG$-^iX+5f5BGOIHWAl*%15Z#!xntpk($-EGKCzKa zT7{siZ9;4TICsWQ$pu&wKZQTCvpI$Xvzwxoi+XkkpeE&&kFb!B?h2hi%^YlXt|-@5 zHJ~%AN!g_^tmn1?HSm^|gCE#!GRtK2(L{9pL#hp0xh zME}|DB>(5)`iE7CM)&_+S}-Bslc#@B5W4_+k4Cp$l>iVyg$KP>CN?SVGZ(&02>iZK zB<^HP$g$Lq*L$BWd?2(F?-MUbNWTJVQdW7$#8a|k_30#vHAD1Z{c#p;bETk0VnU5A zBgLe2HFJ3032$G<`m*OB!KM$*sdM20jm)It5OSru@tXpK5LT>#8)N!*skNu1$TpIw zufjjdp#lyH5bZ%|Iuo|iu9vG1HrIVWLH>278xo>aVBkPN3V$~!=KnlXQ4eDqS7%E% zQ!z^$Q$b^6Q)g#cLpwur(|<0gWHo6A6jc;n`t(V9T;LzTAU{IAu*uEQ%Ort1k+Kn+f_N`9|bxYC+~Z1 zCC1UCWv*Orx$_@ydv9mIe(liLfOr7mhbV@tKw{6)q^1DH1nmvZ0cj215R<~&I<4S| zgnr;9Cdjqpz#o8i0CQjtl`}{c*P)aSdH|abxGdrR)-3z+02-eX(k*B)Uqv6~^nh** z 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 \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >&- +APP_HOME="`pwd -P`" +cd "$SAVED" >&- + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..aec9973 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/libs/ActionBarSherlock/.classpath b/libs/ActionBarSherlock/.classpath deleted file mode 100644 index a4763d1..0000000 --- a/libs/ActionBarSherlock/.classpath +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/libs/ActionBarSherlock/.project b/libs/ActionBarSherlock/.project deleted file mode 100644 index 31c6470..0000000 --- a/libs/ActionBarSherlock/.project +++ /dev/null @@ -1,33 +0,0 @@ - - - ActionBarSherlock - - - - - - com.android.ide.eclipse.adt.ResourceManagerBuilder - - - - - com.android.ide.eclipse.adt.PreCompilerBuilder - - - - - org.eclipse.jdt.core.javabuilder - - - - - com.android.ide.eclipse.adt.ApkBuilder - - - - - - com.android.ide.eclipse.adt.AndroidNature - org.eclipse.jdt.core.javanature - - diff --git a/libs/ActionBarSherlock/AndroidManifest.xml b/libs/ActionBarSherlock/AndroidManifest.xml deleted file mode 100644 index 7b8a848..0000000 --- a/libs/ActionBarSherlock/AndroidManifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/libs/ActionBarSherlock/README.md b/libs/ActionBarSherlock/README.md deleted file mode 100644 index e8a2c08..0000000 --- a/libs/ActionBarSherlock/README.md +++ /dev/null @@ -1,15 +0,0 @@ -ActionBarSherlock Library -========================= - -This folder contains the main library which should be linked against as an -Android library project in your application. - -For more information see the "Including In Your Project" section of the -[usage page][1]. - - - - - - - [1]: http://actionbarsherlock.com/usage.html diff --git a/libs/ActionBarSherlock/libs/android-support-v4.jar b/libs/ActionBarSherlock/libs/android-support-v4.jar deleted file mode 100644 index 6080877d4ade158f24ad7ccd9a10db2ac9060b47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 385685 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