From 50265979467cf30334088a826ffd79dbbdeefa50 Mon Sep 17 00:00:00 2001 From: Sergey Solovyev Date: Fri, 30 Nov 2012 13:43:41 +0400 Subject: [PATCH 01/14] Application structure changed --- .../pom.xml | 2 +- .../AndroidManifest.xml | 328 +++++++++--------- .../doc/GoogleAdMobAdsSdk-4.3.1-javadocs.zip | Bin .../misc/doc/achartengine-0.7.0-javadocs.zip | Bin .../misc/lib/GoogleAdMobAdsSdk-4.3.1.jar | Bin .../misc/lib/achartengine-0.7.0.jar | Bin .../misc/lib/achartengine-0.7.1.jar | Bin .../misc/other/prepare_avds.sh | 0 .../misc/other/remove_avds.sh | 0 .../misc/other/take_screenshots.py | 0 .../misc/other/take_screenshots.sh | 0 .../misc/other/take_screenshots2.sh | 0 .../misc/other/wait_device.py | 0 .../res/calculatorpp/01_main_screen_port.png | Bin .../calculatorpp/01_main_screen_port_sm.png | Bin .../res/calculatorpp/02_main_screen_land.png | Bin .../03_main_screen_port_with_expression.png | Bin .../res/calculatorpp/04_plot_graph_menu.png | Bin .../calculatorpp/04_plot_graph_menu_sm.png | Bin .../misc/res/calculatorpp/05_graph_screen.png | Bin .../res/calculatorpp/05_graph_screen_sm.png | Bin .../res/calculatorpp/06_constants_screen.png | Bin .../calculatorpp/06_constants_screen_sm.png | Bin .../07_constant_create_dialog.png | Bin .../08_constants_context_menu.png | Bin .../res/calculatorpp/09_functions_screen.png | Bin .../calculatorpp/09_functions_screen_sm.png | Bin .../res/calculatorpp/10_history_screen.png | Bin .../res/calculatorpp/10_history_screen_sm.png | Bin .../11_history_item_context_menu.png | Bin .../res/calculatorpp/12_saved_history_tab.png | Bin .../13_saved_history_item_context_menu.png | Bin .../misc/res/calculatorpp/14_about_screen.png | Bin .../res/calculatorpp/14_about_screen_sm.png | Bin .../res/calculatorpp/15_release_notes_tab.png | Bin .../misc/res/calculatorpp/16_help_screen.png | Bin .../res/calculatorpp/16_help_screen_sm.png | Bin .../misc/res/calculatorpp/17_hints_tab.png | Bin .../misc/res/calculatorpp/18_preferences.png | Bin .../res/calculatorpp/18_preferences_02.png | Bin .../res/calculatorpp/18_preferences_03.png | Bin .../res/calculatorpp/18_preferences_sm.png | Bin .../misc/res/calculatorpp/plan.png | Bin .../misc/res/calculatorpp/plan.xcf | Bin .../misc/res/icon-green.png | Bin .../misc/res/icon-hi-res.png | Bin .../misc/res/icon-promo.png | Bin .../misc/res/icon.png | Bin .../misc/res/kb_facebook.png | Bin .../misc/res/kb_facebook_icon.png | Bin .../misc/res/logo-admob.png | Bin .../misc/res/logo-scaled.png | Bin .../misc/res/logo-small.png | Bin .../misc/res/logo.cdr | Bin .../misc/res/logo.png | Bin .../misc/res/widget.png | Bin .../misc/res/work/Backup_of_logo.cdr | Bin .../misc/res/work/header.png | Bin .../misc/res/work/header_bg.png | Bin .../misc/res/work/header_sm.png | Bin .../misc/res/work/heart_original.png | Bin .../misc/res/work/icon.png | Bin .../misc/res/work/icon_favicon_light_blue.ico | Bin .../misc/res/work/icon_favicon_light_blue.png | Bin .../misc/res/work/icon_favicon_purple.ico | Bin .../misc/res/work/icon_small.png | Bin .../misc/res/work/log11o.psd | Bin .../misc/res/work/logo.cdr | Bin .../misc/res/work/logo.png | Bin .../misc/res/work/logoFULL copy.png | Bin .../misc/res/work/logoFULL.pdf | Bin .../misc/res/work/logoFULL.png | Bin .../misc/res/work/logoFULL_banner.png | Bin .../misc/res/work/logoFULL_small.png | Bin .../misc/res/work/logo_black.png | Bin .../misc/res/work/logo_blue.png | Bin .../misc/res/work/logo_light_blue.png | Bin .../misc/res/work/logo_purple.png | Bin .../misc/res/work/promo_logo.png | Bin .../misc/res/work/text_logo.png | Bin .../misc/res/work/text_logo_blue.png | Bin .../misc/res/work/text_logo_light_blue.png | Bin .../work/text_logo_light_blue_cpp_forum.png | Bin .../misc/res/work/text_logo_purple.png | Bin .../misc/src/achartengine-0.7.0.jar | Bin .../misc/src/bsh.jar | Bin {calculatorpp => app-android}/pom.xml | 2 +- {calculatorpp => app-android}/proguard.cfg | 0 .../project.properties | 0 .../res/drawable-hdpi/ab_add.png | Bin .../res/drawable-hdpi/ab_icon.png | Bin .../res/drawable-hdpi/ab_icon_long.png | Bin .../res/drawable-hdpi/ab_settings.png | Bin .../res/drawable-hdpi/icon.png | Bin .../res/drawable-hdpi/icon_onscreen.png | Bin .../res/drawable-hdpi/kb_copy.png | Bin .../res/drawable-hdpi/kb_delete.png | Bin .../res/drawable-hdpi/kb_facebook.png | Bin .../res/drawable-hdpi/kb_heart.png | Bin .../res/drawable-hdpi/kb_logo.png | Bin .../res/drawable-hdpi/kb_paste.png | Bin .../res/drawable-hdpi/kb_settings.png | Bin .../res/drawable-hdpi/logo.png | Bin .../res/drawable-ldpi/ab_add.png | Bin .../res/drawable-ldpi/ab_icon.png | Bin .../res/drawable-ldpi/ab_settings.png | Bin .../res/drawable-ldpi/icon.png | Bin .../res/drawable-ldpi/icon_onscreen.png | Bin .../res/drawable-ldpi/kb_copy.png | Bin .../res/drawable-ldpi/kb_delete.png | Bin .../res/drawable-ldpi/kb_facebook.png | Bin .../res/drawable-ldpi/kb_heart.png | Bin .../res/drawable-ldpi/kb_logo.png | Bin .../res/drawable-ldpi/kb_paste.png | Bin .../res/drawable-ldpi/kb_settings.png | Bin .../res/drawable-ldpi/logo.png | Bin .../res/drawable-mdpi/ab_add.png | Bin .../res/drawable-mdpi/ab_icon.png | Bin .../res/drawable-mdpi/ab_settings.png | Bin .../res/drawable-mdpi/icon.png | Bin .../res/drawable-mdpi/icon_onscreen.png | Bin .../res/drawable-mdpi/kb_copy.png | Bin .../res/drawable-mdpi/kb_delete.png | Bin .../res/drawable-mdpi/kb_facebook.png | Bin .../res/drawable-mdpi/kb_heart.png | Bin .../res/drawable-mdpi/kb_logo.png | Bin .../res/drawable-mdpi/kb_paste.png | Bin .../res/drawable-mdpi/kb_settings.png | Bin .../res/drawable-mdpi/logo.png | Bin .../cpp_onscreen_button_close.png | Bin .../cpp_onscreen_button_fold.png | Bin .../cpp_onscreen_button_minimize.png | Bin .../cpp_onscreen_header_logo.png | Bin ...efault_abs__ab_transparent_dark_holo.9.png | Bin ..._abs__btn_cab_done_default_holo_dark.9.png | Bin ..._abs__btn_cab_done_focused_holo_dark.9.png | Bin ..._abs__btn_cab_done_pressed_holo_dark.9.png | Bin .../default_abs__list_focused_holo.9.png | Bin .../default_abs__list_longpressed_holo.9.png | Bin .../default_abs__list_pressed_holo_dark.9.png | Bin ...lt_abs__spinner_ab_focused_holo_dark.9.png | Bin ...lt_abs__spinner_ab_pressed_holo_dark.9.png | Bin ...fault_abs__tab_selected_focused_holo.9.png | Bin .../default_abs__tab_selected_holo.9.png | Bin ...fault_abs__tab_selected_pressed_holo.9.png | Bin ...ult_abs__tab_unselected_pressed_holo.9.png | Bin ...o_blue_abs__ab_transparent_dark_holo.9.png | Bin .../metro_blue_abs__list_focused_holo.9.png | Bin ...tro_blue_abs__list_pressed_holo_dark.9.png | Bin ..._blue_abs__tab_selected_focused_holo.9.png | Bin .../metro_blue_abs__tab_selected_holo.9.png | Bin ..._blue_abs__tab_selected_pressed_holo.9.png | Bin ...lue_abs__tab_unselected_pressed_holo.9.png | Bin .../res/drawable-nodpi/widget_preview.png | Bin .../res/drawable-xhdpi/ab_add.png | Bin .../res/drawable-xhdpi/ab_icon.png | Bin .../res/drawable-xhdpi/ab_settings.png | Bin .../drawable-xhdpi/ic_menu_preferences.png | Bin .../res/drawable-xhdpi/icon.png | Bin .../res/drawable-xhdpi/icon_onscreen.png | Bin .../res/drawable-xhdpi/kb_copy.png | Bin .../res/drawable-xhdpi/kb_delete.png | Bin .../res/drawable-xhdpi/kb_facebook.png | Bin .../res/drawable-xhdpi/kb_heart.png | Bin .../res/drawable-xhdpi/kb_logo.png | Bin .../res/drawable-xhdpi/kb_paste.png | Bin .../res/drawable-xhdpi/kb_settings.png | Bin .../res/drawable-xhdpi/logo.png | Bin .../res/drawable-xlarge-hdpi/kb_copy.png | Bin .../res/drawable-xlarge-hdpi/kb_delete.png | Bin .../res/drawable-xlarge-hdpi/kb_facebook.png | Bin .../res/drawable-xlarge-hdpi/kb_heart.png | Bin .../res/drawable-xlarge-hdpi/kb_logo.png | Bin .../res/drawable-xlarge-hdpi/kb_paste.png | Bin .../res/drawable-xlarge-hdpi/kb_settings.png | Bin .../res/drawable/blue_button.xml | 0 .../res/drawable/blue_button_dark.xml | 0 .../res/drawable/blue_button_dark_shape.xml | 0 .../res/drawable/blue_button_shape.xml | 0 .../default_abs__btn_cab_done_holo_dark.xml | 0 ...default_abs__item_background_holo_dark.xml | 0 ...lector_background_transition_holo_dark.xml | 0 .../default_abs__list_selector_holo_dark.xml | 0 .../default_abs__spinner_ab_holo_dark.xml | 0 .../default_abs__tab_indicator_ab_holo.xml | 0 .../res/drawable/gray_button.xml | 0 .../res/drawable/gray_button_dark.xml | 0 .../res/drawable/gray_button_dark_shape.xml | 0 .../res/drawable/gray_button_shape.xml | 0 .../metro_blue_abs__tab_indicator_ab_holo.xml | 0 .../res/drawable/metro_blue_button.xml | 0 .../res/drawable/metro_blue_button_shape.xml | 0 .../res/drawable/metro_blue_list_item.xml | 0 .../res/drawable/metro_button_dark.xml | 0 .../res/drawable/metro_button_dark_shape.xml | 0 .../res/drawable/metro_button_green.xml | 0 .../res/drawable/metro_button_green_shape.xml | 0 .../res/drawable/metro_button_light.xml | 0 .../res/drawable/metro_button_light_shape.xml | 0 .../res/drawable/metro_button_pressed.xml | 0 .../res/drawable/metro_button_purple.xml | 0 .../drawable/metro_button_purple_shape.xml | 0 .../res/drawable/metro_green_list_item.xml | 0 .../res/drawable/metro_purple_list_item.xml | 0 .../res/drawable/pane_background.xml | 0 .../res/drawable/violet_button.xml | 0 .../res/drawable/violet_button_dark.xml | 0 .../res/drawable/violet_button_dark_shape.xml | 0 .../res/drawable/violet_button_shape.xml | 0 .../res/layout-land/calc_keyboard.xml | 0 .../res/layout-land/calc_keyboard_mobile.xml | 0 .../res/layout-land/main_calculator.xml | 0 .../layout-land/main_calculator_mobile.xml | 0 .../res/layout-land/main_first_pane.xml | 0 .../layout-land/main_first_pane_mobile.xml | 0 .../res/layout-large-land/calc_keyboard.xml | 0 .../res/layout-large-land/main_calculator.xml | 0 .../res/layout-large/calc_display.xml | 0 .../res/layout-large/calc_editor.xml | 0 .../res/layout-large/calc_keyboard.xml | 0 .../res/layout-large/main_calculator.xml | 0 .../res/layout-xlarge-land/calc_keyboard.xml | 0 .../layout-xlarge-land/main_calculator.xml | 0 .../res/layout-xlarge/calc_display.xml | 0 .../res/layout-xlarge/calc_editor.xml | 0 .../res/layout-xlarge/calc_keyboard.xml | 0 .../res/layout-xlarge/main_calculator.xml | 0 .../res/layout/about_fragment.xml | 0 .../res/layout/ad.xml | 0 .../res/layout/admob_pref.xml | 0 .../res/layout/calc_clear_button.xml | 0 .../res/layout/calc_copy_button.xml | 0 .../res/layout/calc_display.xml | 0 .../res/layout/calc_display_mobile.xml | 0 .../res/layout/calc_division_button.xml | 0 .../res/layout/calc_donate_button.xml | 0 .../res/layout/calc_dot_button.xml | 0 .../res/layout/calc_editor.xml | 0 .../res/layout/calc_editor_mobile.xml | 0 .../res/layout/calc_eight_digit_button.xml | 0 .../res/layout/calc_empty_button.xml | 0 .../res/layout/calc_equals_button.xml | 0 .../res/layout/calc_erase_button.xml | 0 .../res/layout/calc_five_digit_button.xml | 0 .../res/layout/calc_four_digit_button.xml | 0 .../res/layout/calc_functions_button.xml | 0 .../res/layout/calc_history_button.xml | 0 .../res/layout/calc_keyboard.xml | 0 .../res/layout/calc_keyboard_mobile.xml | 0 .../res/layout/calc_left_button.xml | 0 .../res/layout/calc_multiplication_button.xml | 0 .../res/layout/calc_nine_digit_button.xml | 0 .../res/layout/calc_one_digit_button.xml | 0 .../res/layout/calc_operators_button.xml | 0 .../res/layout/calc_paste_button.xml | 0 .../res/layout/calc_plot_view.xml | 0 .../res/layout/calc_plus_button.xml | 0 .../res/layout/calc_right_button.xml | 0 .../res/layout/calc_round_brackets_button.xml | 0 .../res/layout/calc_seven_digit_button.xml | 0 .../res/layout/calc_six_digit_button.xml | 0 .../res/layout/calc_subtraction_button.xml | 0 .../res/layout/calc_three_digit_button.xml | 0 .../res/layout/calc_title.xml | 0 .../res/layout/calc_two_digit_button.xml | 0 .../res/layout/calc_vars_button.xml | 0 .../res/layout/calc_zero_digit_button.xml | 0 .../res/layout/calculator_messages_dialog.xml | 0 .../calculator_messages_dialog_message.xml | 0 .../res/layout/display_error_message.xml | 0 .../res/layout/drag_button_calibration.xml | 0 .../res/layout/feedback.xml | 0 .../res/layout/function_add_param.xml | 0 .../res/layout/function_edit.xml | 0 .../res/layout/function_edit_param.xml | 0 .../res/layout/help_faq_fragment.xml | 0 .../res/layout/help_hints_fragment.xml | 0 .../res/layout/help_screens_fragment.xml | 0 .../res/layout/history_edit.xml | 0 .../res/layout/history_fragment.xml | 0 .../res/layout/history_item.xml | 0 .../res/layout/main_calculator.xml | 0 .../res/layout/main_calculator_mobile.xml | 0 .../res/layout/main_empty.xml | 0 .../res/layout/main_empty_multi_pane.xml | 0 .../res/layout/math_entities_fragment.xml | 0 .../res/layout/math_entity.xml | 0 .../res/layout/notespp_announce.xml | 0 .../res/layout/onscreen_display.xml | 0 .../res/layout/onscreen_editor.xml | 0 .../res/layout/onscreen_footer.xml | 0 .../res/layout/onscreen_header.xml | 0 .../res/layout/onscreen_keyboard.xml | 0 .../res/layout/onscreen_layout.xml | 0 .../res/layout/plot_fragment.xml | 0 .../res/layout/release_notes_fragment.xml | 0 .../res/layout/saved_history_item.xml | 0 .../res/layout/tabs.xml | 0 .../res/layout/unit_converter.xml | 0 .../res/layout/var_edit.xml | 0 .../res/layout/vars_fragment.xml | 0 .../res/layout/widget_app_button.xml | 0 .../res/layout/widget_clear_button.xml | 0 .../res/layout/widget_copy_button.xml | 0 .../res/layout/widget_display.xml | 0 .../res/layout/widget_division_button.xml | 0 .../res/layout/widget_dot_button.xml | 0 .../res/layout/widget_editor.xml | 0 .../res/layout/widget_eight_digit_button.xml | 0 .../res/layout/widget_equals_button.xml | 0 .../res/layout/widget_erase_button.xml | 0 .../res/layout/widget_five_digit_button.xml | 0 .../res/layout/widget_four_digit_button.xml | 0 .../res/layout/widget_functions_button.xml | 0 .../res/layout/widget_history_button.xml | 0 .../res/layout/widget_keyboard.xml | 0 .../res/layout/widget_layout.xml | 0 .../res/layout/widget_left_button.xml | 0 .../res/layout/widget_like_button.xml | 0 .../layout/widget_multiplication_button.xml | 0 .../res/layout/widget_nine_digit_button.xml | 0 .../res/layout/widget_one_digit_button.xml | 0 .../res/layout/widget_paste_button.xml | 0 .../res/layout/widget_percent_button.xml | 0 .../res/layout/widget_plus_button.xml | 0 .../res/layout/widget_power_button.xml | 0 .../res/layout/widget_right_button.xml | 0 .../layout/widget_round_brackets_button.xml | 0 .../res/layout/widget_settings_button.xml | 0 .../res/layout/widget_seven_digit_button.xml | 0 .../res/layout/widget_six_digit_button.xml | 0 .../res/layout/widget_subtraction_button.xml | 0 .../res/layout/widget_three_digit_button.xml | 0 .../res/layout/widget_two_digit_button.xml | 0 .../res/layout/widget_vars_button.xml | 0 .../res/layout/widget_zero_digit_button.xml | 0 .../res/menu/functions_menu.xml | 0 .../res/menu/history_menu.xml | 0 .../res/menu/plot_menu.xml | 0 .../res/menu/vars_menu.xml | 0 .../res/values-es/text_about.xml | 0 .../res/values-es/text_functions.xml | 0 .../res/values-es/text_help.xml | 0 .../res/values-es/text_operators.xml | 0 .../res/values-es/text_strings.xml | 0 .../res/values-es/text_vars.xml | 0 .../res/values-it/text_about.xml | 0 .../res/values-it/text_functions.xml | 0 .../res/values-it/text_help.xml | 0 .../res/values-it/text_operators.xml | 0 .../res/values-it/text_strings.xml | 0 .../res/values-it/text_vars.xml | 0 .../res/values-large-hdpi/dimens.xml | 0 .../res/values-large-mdpi/dimens.xml | 0 .../res/values-large-tvdpi/dimens.xml | 0 .../res/values-large/dimens.xml | 0 .../res/values-normal-hdpi/dimens.xml | 0 .../res/values-normal-mdpi/dimens.xml | 0 .../res/values-normal-tvdpi/dimens.xml | 0 .../res/values-normal-xhdpi/dimens.xml | 0 .../res/values-normal/dimens.xml | 0 .../res/values-ru/text_about.xml | 0 .../res/values-ru/text_functions.xml | 0 .../res/values-ru/text_help.xml | 0 .../res/values-ru/text_operators.xml | 0 .../res/values-ru/text_preferences.xml | 0 .../res/values-ru/text_strings.xml | 0 .../res/values-ru/text_vars.xml | 0 .../res/values-small-hdpi/dimens.xml | 0 .../res/values-small-xhdpi/dimens.xml | 0 .../res/values-small/dimens.xml | 0 .../res/values-uk/text_about.xml | 0 .../res/values-uk/text_functions.xml | 0 .../res/values-uk/text_help.xml | 0 .../res/values-uk/text_operators.xml | 0 .../res/values-uk/text_preferences.xml | 0 .../res/values-uk/text_strings.xml | 0 .../res/values-uk/text_vars.xml | 0 .../res/values-v14/dimens.xml | 0 .../res/values-xlarge-hdpi/dimens.xml | 0 .../res/values-xlarge-mdpi/dimens.xml | 0 .../res/values-xlarge/dimens.xml | 0 .../res/values-zh-rtw/text_about.xml | 0 .../res/values-zh-rtw/text_functions.xml | 0 .../res/values-zh-rtw/text_help.xml | 0 .../res/values-zh-rtw/text_operators.xml | 0 .../res/values-zh-rtw/text_preferences.xml | 0 .../res/values-zh-rtw/text_strings.xml | 0 .../res/values-zh-rtw/text_vars.xml | 0 .../res/values/arrays.xml | 0 .../res/values/attributes.xml | 0 .../res/values/colors.xml | 0 .../res/values/dimens.xml | 0 .../res/values/preferences.xml | 0 .../res/values/styles.xml | 0 .../res/values/styles_history.xml | 0 .../res/values/styles_var.xml | 0 .../res/values/text_about.xml | 0 .../res/values/text_functions.xml | 0 .../res/values/text_help.xml | 0 .../res/values/text_operators.xml | 0 .../res/values/text_preferences.xml | 0 .../res/values/text_strings.xml | 0 .../res/values/text_vars.xml | 0 .../res/values/theme_gray.xml | 0 .../res/values/theme_light_blue.xml | 0 .../res/values/theme_metro_blue.xml | 0 .../res/values/theme_metro_green.xml | 0 .../res/values/theme_metro_purple.xml | 0 .../res/values/theme_violet.xml | 0 .../res/xml/calculator_widget_info_3x3.xml | 0 .../res/xml/calculator_widget_info_3x4.xml | 0 .../res/xml/calculator_widget_info_4x4.xml | 0 .../res/xml/calculator_widget_info_4x5.xml | 0 .../res/xml/preferences.xml | 0 .../res/xml/preferences_appearance.xml | 0 .../res/xml/preferences_calculations.xml | 0 .../res/xml/preferences_onscreen.xml | 0 .../res/xml/preferences_other.xml | 0 .../res/xml/preferences_plot.xml | 0 .../org/solovyev/android/AndroidUtils2.java | 0 .../calculator/AbstractCalculatorHelper.java | 0 .../android/calculator/AndroidCalculator.java | 0 .../AndroidCalculatorClipboard.java | 0 .../AndroidCalculatorDisplayView.java | 0 .../AndroidCalculatorEditorView.java | 0 .../calculator/AndroidCalculatorKeyboard.java | 0 .../calculator/AndroidCalculatorLogger.java | 0 .../calculator/AndroidCalculatorNotifier.java | 0 .../AndroidCalculatorPreferenceService.java | 0 .../calculator/AndroidFunctionCategory.java | 0 .../calculator/AndroidNumeralBase.java | 0 .../calculator/AndroidOperatorCategory.java | 0 .../calculator/AndroidVarCategory.java | 0 .../calculator/CalculatorActivity.java | 0 .../calculator/CalculatorActivityHelper.java | 0 .../CalculatorActivityHelperImpl.java | 0 .../CalculatorActivityLauncher.java | 0 .../calculator/CalculatorActivityMobile.java | 0 .../calculator/CalculatorApplication.java | 0 .../android/calculator/CalculatorButtons.java | 0 .../calculator/CalculatorDisplayFragment.java | 0 .../calculator/CalculatorDisplayMenuItem.java | 0 .../CalculatorDisplayOnClickListener.java | 0 .../calculator/CalculatorEditorFragment.java | 0 .../calculator/CalculatorFixableMessage.java | 0 .../calculator/CalculatorFragment.java | 0 .../CalculatorFragmentActivity.java | 0 .../calculator/CalculatorFragmentHelper.java | 0 .../CalculatorFragmentHelperImpl.java | 0 .../CalculatorKeyboardFragment.java | 0 .../android/calculator/CalculatorMenu.java | 0 .../calculator/CalculatorMessagesDialog.java | 0 .../CalculatorOnscreenStartActivity.java | 0 .../calculator/CalculatorPreferences.java | 0 .../CalculatorPreferencesActivity.java | 0 .../calculator/CalculatorSecurity.java | 0 .../calculator/CharacterAtPositionFinder.java | 0 .../calculator/ConversionMenuItem.java | 0 .../calculator/CursorDragProcessor.java | 0 .../calculator/DigitButtonDragProcessor.java | 0 .../android/calculator/EvalDragProcessor.java | 0 .../calculator/NumeralBaseButtons.java | 0 .../ParcelableCalculatorDisplayViewState.java | 0 .../ParcelableCalculatorEditorViewState.java | 0 .../about/CalculatorAboutActivity.java | 0 .../about/CalculatorAboutFragment.java | 0 .../about/CalculatorFragmentType.java | 0 .../about/CalculatorReleaseNotesFragment.java | 0 .../android/calculator/about/TextHelper.java | 0 .../AndroidExternalListenersContainer.java | 0 ...efaultExternalCalculatorIntentHandler.java | 0 .../ExternalCalculatorIntentHandler.java | 0 .../ExternalCalculatorStateUpdater.java | 0 .../function/FunctionEditDialogFragment.java | 0 .../function/FunctionEditorSaver.java | 0 .../function/FunctionParamEditText.java | 0 .../function/FunctionParamsView.java | 0 .../help/CalculatorHelpActivity.java | 0 .../help/CalculatorHelpFaqFragment.java | 0 .../help/CalculatorHelpHintsFragment.java | 0 .../help/CalculatorHelpScreensFragment.java | 0 .../AbstractCalculatorHistoryFragment.java | 0 .../history/AndroidCalculatorHistory.java | 0 .../history/CalculatorHistoryActivity.java | 0 .../history/CalculatorHistoryFragment.java | 0 .../CalculatorSavedHistoryFragment.java | 0 .../history/HistoryArrayAdapter.java | 0 .../history/HistoryItemMenuData.java | 0 .../history/HistoryItemMenuItem.java | 0 .../history/TextViewEditorAdapter.java | 0 .../edit/AbstractMathEntityListFragment.java | 0 .../edit/CalculatorFunctionsActivity.java | 0 .../edit/CalculatorFunctionsFragment.java | 0 .../edit/CalculatorOperatorsActivity.java | 0 .../edit/CalculatorOperatorsFragment.java | 0 .../math/edit/CalculatorVarsActivity.java | 0 .../math/edit/CalculatorVarsFragment.java | 0 .../math/edit/MathEntityRemover.java | 0 .../math/edit/VarEditDialogFragment.java | 0 .../calculator/math/edit/VarEditorSaver.java | 0 .../model/AndroidCalculatorEngine.java | 0 .../model/AndroidMathEntityDao.java | 0 .../android/calculator/model/Messages.java | 0 .../CalculatorOnscreenBroadcastReceiver.java | 0 .../onscreen/CalculatorOnscreenService.java | 0 .../onscreen/CalculatorOnscreenView.java | 0 .../onscreen/CalculatorOnscreenViewDef.java | 0 .../onscreen/OnscreenViewListener.java | 0 .../plot/CalculatorPlotActivity.java | 0 .../plot/CalculatorPlotFragment.java | 0 .../CalculatorPlotPreferenceActivity.java | 0 .../calculator/plot/GraphLineColor.java | 0 .../android/calculator/plot/MyXYSeries.java | 0 .../android/calculator/plot/PlotUtils.java | 0 .../calculator/view/AngleUnitsButton.java | 0 .../view/CalculatorAdditionalTitle.java | 0 .../view/NumeralBaseConverterDialog.java | 0 .../calculator/view/NumeralBasesButton.java | 0 .../view/OnDragListenerVibrator.java | 0 .../calculator/view/TextHighlighter.java | 0 .../view/UnitConverterViewBuilder.java | 0 .../AbstractCalculatorWidgetProvider.java | 0 ...CalculatorWidgetConfigurationActivity.java | 0 .../widget/CalculatorWidgetIntentHandler.java | 0 .../widget/CalculatorWidgetProvider.java | 0 .../widget/CalculatorWidgetProvider3x4.java | 0 .../widget/CalculatorWidgetProvider4x4.java | 0 .../widget/CalculatorWidgetProvider4x5.java | 0 .../calculator/widget/WidgetButton.java | 0 .../android/fragments/FragmentUtils.java | 0 .../android/AndroidNumeralBaseTest.java | 0 .../AndroidCalculatorEditorViewTest.java | 0 .../calculator/CalculatorTestUtils.java | 0 .../calculator/CalculatorppTestRunner.java | 0 .../calculator/TextHighlighterTest.java | 0 .../calculator/history/HistoryUtilsTest.java | 0 .../android/calculator/model/VarTest.java | 0 .../calculator/plot/PlotUtilsTest.java | 0 .../common/FloatIntervalMapperTest.java | 0 .../common/math/DiscreteNormalizerTest.java | 0 {calculatorpp-core => core}/pom.xml | 0 .../AbstractCalculatorMathRegistry.java | 0 .../calculator/AbstractNumberBuilder.java | 0 .../android/calculator/Calculator.java | 0 .../calculator/CalculatorButtonActions.java | 0 .../calculator/CalculatorClipboard.java | 0 .../CalculatorConversionEventData.java | 0 .../CalculatorConversionEventDataImpl.java | 0 .../android/calculator/CalculatorDisplay.java | 0 .../CalculatorDisplayChangeEventData.java | 0 .../CalculatorDisplayChangeEventDataImpl.java | 0 .../calculator/CalculatorDisplayImpl.java | 0 .../calculator/CalculatorDisplayView.java | 0 .../CalculatorDisplayViewState.java | 0 .../CalculatorDisplayViewStateImpl.java | 0 .../android/calculator/CalculatorEditor.java | 0 .../CalculatorEditorChangeEventData.java | 0 .../CalculatorEditorChangeEventDataImpl.java | 0 .../calculator/CalculatorEditorImpl.java | 0 .../calculator/CalculatorEditorView.java | 0 .../calculator/CalculatorEditorViewState.java | 0 .../CalculatorEditorViewStateImpl.java | 0 .../android/calculator/CalculatorEngine.java | 0 .../calculator/CalculatorEngineControl.java | 0 .../calculator/CalculatorEngineImpl.java | 0 .../calculator/CalculatorEvalException.java | 0 .../CalculatorEvaluationEventData.java | 0 .../CalculatorEvaluationEventDataImpl.java | 0 .../calculator/CalculatorEventContainer.java | 0 .../calculator/CalculatorEventData.java | 0 .../calculator/CalculatorEventDataImpl.java | 0 .../calculator/CalculatorEventHolder.java | 0 .../calculator/CalculatorEventListener.java | 0 .../calculator/CalculatorEventType.java | 0 .../android/calculator/CalculatorFailure.java | 0 .../calculator/CalculatorFailureImpl.java | 0 .../calculator/CalculatorFixableError.java | 0 .../CalculatorFunctionsMathRegistry.java | 0 .../android/calculator/CalculatorImpl.java | 0 .../android/calculator/CalculatorInput.java | 0 .../calculator/CalculatorInputImpl.java | 0 .../calculator/CalculatorKeyboard.java | 0 .../calculator/CalculatorKeyboardImpl.java | 0 .../android/calculator/CalculatorLocator.java | 0 .../android/calculator/CalculatorLogger.java | 0 .../calculator/CalculatorMathEngine.java | 0 .../calculator/CalculatorMathRegistry.java | 0 .../android/calculator/CalculatorMessage.java | 0 .../calculator/CalculatorMessages.java | 0 .../calculator/CalculatorNotifier.java | 0 .../CalculatorOperatorsMathRegistry.java | 0 .../android/calculator/CalculatorOutput.java | 0 .../calculator/CalculatorOutputImpl.java | 0 .../calculator/CalculatorParseException.java | 0 .../CalculatorPostfixFunctionsRegistry.java | 0 .../CalculatorPreferenceService.java | 0 .../calculator/CalculatorSpecialButton.java | 0 .../android/calculator/CalculatorUtils.java | 0 .../calculator/CalculatorVarsRegistry.java | 0 .../solovyev/android/calculator/Change.java | 0 .../android/calculator/ChangeImpl.java | 0 .../android/calculator/ConversionFailure.java | 0 .../calculator/ConversionFailureImpl.java | 0 .../calculator/DummyCalculatorClipboard.java | 0 .../calculator/DummyCalculatorNotifier.java | 0 .../solovyev/android/calculator/Editor.java | 0 .../android/calculator/FunctionCategory.java | 0 .../ListCalculatorEventContainer.java | 0 .../android/calculator/LiteNumberBuilder.java | 0 .../solovyev/android/calculator/Locator.java | 0 .../android/calculator/MathEntityDao.java | 0 .../MathEntityPersistenceContainer.java | 0 .../calculator/MathPersistenceEntity.java | 0 .../android/calculator/NumberBuilder.java | 0 .../android/calculator/OperatorCategory.java | 0 .../calculator/PreparedExpression.java | 0 .../calculator/SystemOutCalculatorLogger.java | 0 .../calculator/ToJsclTextProcessor.java | 0 .../android/calculator/VarCategory.java | 0 .../CalculatorExternalListenersContainer.java | 0 .../history/AbstractHistoryState.java | 0 .../CalculatorDisplayHistoryState.java | 0 .../calculator/history/CalculatorHistory.java | 0 .../history/CalculatorHistoryImpl.java | 0 .../history/CalculatorHistoryState.java | 0 .../history/EditorHistoryState.java | 0 .../android/calculator/history/History.java | 0 .../calculator/history/HistoryUtils.java | 0 .../jscl/FromJsclNumericTextProcessor.java | 0 .../calculator/jscl/JsclOperation.java | 0 .../android/calculator/math/MathType.java | 0 .../android/calculator/model/AFunction.java | 0 .../android/calculator/model/Functions.java | 0 .../calculator/model/MathEntityBuilder.java | 0 .../android/calculator/model/Var.java | 0 .../android/calculator/model/Vars.java | 0 .../calculator/text/DummyTextProcessor.java | 0 .../text/FromJsclSimplifyTextProcessor.java | 0 .../calculator/text/TextProcessor.java | 0 .../units/CalculatorNumeralBase.java | 0 .../common/utils/ListListenersContainer.java | 0 .../math/units/ConversionException.java | 0 .../solovyev/math/units/ConversionUtils.java | 0 .../java/org/solovyev/math/units/Unit.java | 0 .../solovyev/math/units/UnitConverter.java | 0 .../org/solovyev/math/units/UnitImpl.java | 0 .../org/solovyev/math/units/UnitType.java | 0 .../android/calculator/messages.properties | 0 .../android/calculator/messages_ru.properties | 0 .../android/calculator/messages_uk.properties | 0 .../android/calculator/messages_zh.properties | 0 .../calculator/AbstractCalculatorTest.java | 0 .../CalculatorDisplayViewStateImplTest.java | 0 .../calculator/CalculatorEditorImplTest.java | 0 .../CalculatorEditorViewStateImplTest.java | 0 .../calculator/CalculatorImplTest.java | 0 .../calculator/CalculatorTestUtils.java | 0 .../FromJsclSimplifyTextProcessorTest.java | 0 .../history/CalculatorHistoryImplTest.java | 0 .../FromJsclNumericTextProcessorTest.java | 0 .../android/calculator/math/MathTypeTest.java | 0 .../model/AndroidCalculatorEngineTest.java | 0 .../calculator/model/FunctionsTest.java | 0 .../calculator/model/NumeralBaseTest.java | 0 .../model/ToJsclTextProcessorTest.java | 0 .../android/calculator/model/nb_table.csv | 0 pom.xml | 6 +- 668 files changed, 169 insertions(+), 169 deletions(-) rename {calculatorpp-test => app-android-test}/pom.xml (90%) rename {calculatorpp => app-android}/AndroidManifest.xml (94%) rename {calculatorpp => app-android}/misc/doc/GoogleAdMobAdsSdk-4.3.1-javadocs.zip (100%) rename {calculatorpp => app-android}/misc/doc/achartengine-0.7.0-javadocs.zip (100%) rename {calculatorpp => app-android}/misc/lib/GoogleAdMobAdsSdk-4.3.1.jar (100%) rename {calculatorpp => app-android}/misc/lib/achartengine-0.7.0.jar (100%) rename {calculatorpp => app-android}/misc/lib/achartengine-0.7.1.jar (100%) rename {calculatorpp => app-android}/misc/other/prepare_avds.sh (100%) mode change 100755 => 100644 rename {calculatorpp => app-android}/misc/other/remove_avds.sh (100%) mode change 100755 => 100644 rename {calculatorpp => app-android}/misc/other/take_screenshots.py (100%) rename {calculatorpp => app-android}/misc/other/take_screenshots.sh (100%) mode change 100755 => 100644 rename {calculatorpp => app-android}/misc/other/take_screenshots2.sh (100%) mode change 100755 => 100644 rename {calculatorpp => app-android}/misc/other/wait_device.py (100%) rename {calculatorpp => app-android}/misc/res/calculatorpp/01_main_screen_port.png (100%) rename {calculatorpp => app-android}/misc/res/calculatorpp/01_main_screen_port_sm.png (100%) rename {calculatorpp => app-android}/misc/res/calculatorpp/02_main_screen_land.png (100%) rename {calculatorpp => app-android}/misc/res/calculatorpp/03_main_screen_port_with_expression.png (100%) rename {calculatorpp => app-android}/misc/res/calculatorpp/04_plot_graph_menu.png (100%) rename {calculatorpp => app-android}/misc/res/calculatorpp/04_plot_graph_menu_sm.png (100%) rename {calculatorpp => app-android}/misc/res/calculatorpp/05_graph_screen.png (100%) rename {calculatorpp => app-android}/misc/res/calculatorpp/05_graph_screen_sm.png (100%) rename {calculatorpp => app-android}/misc/res/calculatorpp/06_constants_screen.png (100%) rename {calculatorpp => app-android}/misc/res/calculatorpp/06_constants_screen_sm.png (100%) rename {calculatorpp => app-android}/misc/res/calculatorpp/07_constant_create_dialog.png (100%) rename {calculatorpp => app-android}/misc/res/calculatorpp/08_constants_context_menu.png (100%) rename {calculatorpp => app-android}/misc/res/calculatorpp/09_functions_screen.png (100%) rename {calculatorpp => app-android}/misc/res/calculatorpp/09_functions_screen_sm.png (100%) rename {calculatorpp => app-android}/misc/res/calculatorpp/10_history_screen.png (100%) rename {calculatorpp => app-android}/misc/res/calculatorpp/10_history_screen_sm.png (100%) rename {calculatorpp => app-android}/misc/res/calculatorpp/11_history_item_context_menu.png (100%) rename {calculatorpp => app-android}/misc/res/calculatorpp/12_saved_history_tab.png (100%) rename {calculatorpp => app-android}/misc/res/calculatorpp/13_saved_history_item_context_menu.png (100%) rename {calculatorpp => app-android}/misc/res/calculatorpp/14_about_screen.png (100%) rename {calculatorpp => app-android}/misc/res/calculatorpp/14_about_screen_sm.png (100%) rename {calculatorpp => app-android}/misc/res/calculatorpp/15_release_notes_tab.png (100%) rename {calculatorpp => app-android}/misc/res/calculatorpp/16_help_screen.png (100%) rename {calculatorpp => app-android}/misc/res/calculatorpp/16_help_screen_sm.png (100%) rename {calculatorpp => app-android}/misc/res/calculatorpp/17_hints_tab.png (100%) rename {calculatorpp => app-android}/misc/res/calculatorpp/18_preferences.png (100%) rename {calculatorpp => app-android}/misc/res/calculatorpp/18_preferences_02.png (100%) rename {calculatorpp => app-android}/misc/res/calculatorpp/18_preferences_03.png (100%) rename {calculatorpp => app-android}/misc/res/calculatorpp/18_preferences_sm.png (100%) rename {calculatorpp => app-android}/misc/res/calculatorpp/plan.png (100%) rename {calculatorpp => app-android}/misc/res/calculatorpp/plan.xcf (100%) rename {calculatorpp => app-android}/misc/res/icon-green.png (100%) mode change 100755 => 100644 rename {calculatorpp => app-android}/misc/res/icon-hi-res.png (100%) rename {calculatorpp => app-android}/misc/res/icon-promo.png (100%) rename {calculatorpp => app-android}/misc/res/icon.png (100%) mode change 100755 => 100644 rename {calculatorpp => app-android}/misc/res/kb_facebook.png (100%) rename {calculatorpp => app-android}/misc/res/kb_facebook_icon.png (100%) rename {calculatorpp => app-android}/misc/res/logo-admob.png (100%) rename {calculatorpp => app-android}/misc/res/logo-scaled.png (100%) rename {calculatorpp => app-android}/misc/res/logo-small.png (100%) rename {calculatorpp => app-android}/misc/res/logo.cdr (100%) mode change 100755 => 100644 rename {calculatorpp => app-android}/misc/res/logo.png (100%) mode change 100755 => 100644 rename {calculatorpp => app-android}/misc/res/widget.png (100%) rename {calculatorpp => app-android}/misc/res/work/Backup_of_logo.cdr (100%) rename {calculatorpp => app-android}/misc/res/work/header.png (100%) rename {calculatorpp => app-android}/misc/res/work/header_bg.png (100%) rename {calculatorpp => app-android}/misc/res/work/header_sm.png (100%) rename {calculatorpp => app-android}/misc/res/work/heart_original.png (100%) rename {calculatorpp => app-android}/misc/res/work/icon.png (100%) rename {calculatorpp => app-android}/misc/res/work/icon_favicon_light_blue.ico (100%) rename {calculatorpp => app-android}/misc/res/work/icon_favicon_light_blue.png (100%) rename {calculatorpp => app-android}/misc/res/work/icon_favicon_purple.ico (100%) rename {calculatorpp => app-android}/misc/res/work/icon_small.png (100%) rename {calculatorpp => app-android}/misc/res/work/log11o.psd (100%) rename {calculatorpp => app-android}/misc/res/work/logo.cdr (100%) rename {calculatorpp => app-android}/misc/res/work/logo.png (100%) rename {calculatorpp => app-android}/misc/res/work/logoFULL copy.png (100%) rename {calculatorpp => app-android}/misc/res/work/logoFULL.pdf (100%) rename {calculatorpp => app-android}/misc/res/work/logoFULL.png (100%) rename {calculatorpp => app-android}/misc/res/work/logoFULL_banner.png (100%) rename {calculatorpp => app-android}/misc/res/work/logoFULL_small.png (100%) rename {calculatorpp => app-android}/misc/res/work/logo_black.png (100%) rename {calculatorpp => app-android}/misc/res/work/logo_blue.png (100%) rename {calculatorpp => app-android}/misc/res/work/logo_light_blue.png (100%) rename {calculatorpp => app-android}/misc/res/work/logo_purple.png (100%) rename {calculatorpp => app-android}/misc/res/work/promo_logo.png (100%) rename {calculatorpp => app-android}/misc/res/work/text_logo.png (100%) rename {calculatorpp => app-android}/misc/res/work/text_logo_blue.png (100%) rename {calculatorpp => app-android}/misc/res/work/text_logo_light_blue.png (100%) rename {calculatorpp => app-android}/misc/res/work/text_logo_light_blue_cpp_forum.png (100%) rename {calculatorpp => app-android}/misc/res/work/text_logo_purple.png (100%) rename {calculatorpp => app-android}/misc/src/achartengine-0.7.0.jar (100%) rename {calculatorpp => app-android}/misc/src/bsh.jar (100%) rename {calculatorpp => app-android}/pom.xml (99%) rename {calculatorpp => app-android}/proguard.cfg (100%) rename {calculatorpp => app-android}/project.properties (100%) rename {calculatorpp => app-android}/res/drawable-hdpi/ab_add.png (100%) rename {calculatorpp => app-android}/res/drawable-hdpi/ab_icon.png (100%) rename {calculatorpp => app-android}/res/drawable-hdpi/ab_icon_long.png (100%) rename {calculatorpp => app-android}/res/drawable-hdpi/ab_settings.png (100%) rename {calculatorpp => app-android}/res/drawable-hdpi/icon.png (100%) rename {calculatorpp => app-android}/res/drawable-hdpi/icon_onscreen.png (100%) rename {calculatorpp => app-android}/res/drawable-hdpi/kb_copy.png (100%) rename {calculatorpp => app-android}/res/drawable-hdpi/kb_delete.png (100%) rename {calculatorpp => app-android}/res/drawable-hdpi/kb_facebook.png (100%) rename {calculatorpp => app-android}/res/drawable-hdpi/kb_heart.png (100%) rename {calculatorpp => app-android}/res/drawable-hdpi/kb_logo.png (100%) rename {calculatorpp => app-android}/res/drawable-hdpi/kb_paste.png (100%) rename {calculatorpp => app-android}/res/drawable-hdpi/kb_settings.png (100%) rename {calculatorpp => app-android}/res/drawable-hdpi/logo.png (100%) rename {calculatorpp => app-android}/res/drawable-ldpi/ab_add.png (100%) rename {calculatorpp => app-android}/res/drawable-ldpi/ab_icon.png (100%) rename {calculatorpp => app-android}/res/drawable-ldpi/ab_settings.png (100%) rename {calculatorpp => app-android}/res/drawable-ldpi/icon.png (100%) rename {calculatorpp => app-android}/res/drawable-ldpi/icon_onscreen.png (100%) rename {calculatorpp => app-android}/res/drawable-ldpi/kb_copy.png (100%) rename {calculatorpp => app-android}/res/drawable-ldpi/kb_delete.png (100%) rename {calculatorpp => app-android}/res/drawable-ldpi/kb_facebook.png (100%) rename {calculatorpp => app-android}/res/drawable-ldpi/kb_heart.png (100%) rename {calculatorpp => app-android}/res/drawable-ldpi/kb_logo.png (100%) rename {calculatorpp => app-android}/res/drawable-ldpi/kb_paste.png (100%) rename {calculatorpp => app-android}/res/drawable-ldpi/kb_settings.png (100%) rename {calculatorpp => app-android}/res/drawable-ldpi/logo.png (100%) rename {calculatorpp => app-android}/res/drawable-mdpi/ab_add.png (100%) mode change 100755 => 100644 rename {calculatorpp => app-android}/res/drawable-mdpi/ab_icon.png (100%) rename {calculatorpp => app-android}/res/drawable-mdpi/ab_settings.png (100%) rename {calculatorpp => app-android}/res/drawable-mdpi/icon.png (100%) rename {calculatorpp => app-android}/res/drawable-mdpi/icon_onscreen.png (100%) rename {calculatorpp => app-android}/res/drawable-mdpi/kb_copy.png (100%) rename {calculatorpp => app-android}/res/drawable-mdpi/kb_delete.png (100%) rename {calculatorpp => app-android}/res/drawable-mdpi/kb_facebook.png (100%) rename {calculatorpp => app-android}/res/drawable-mdpi/kb_heart.png (100%) rename {calculatorpp => app-android}/res/drawable-mdpi/kb_logo.png (100%) rename {calculatorpp => app-android}/res/drawable-mdpi/kb_paste.png (100%) rename {calculatorpp => app-android}/res/drawable-mdpi/kb_settings.png (100%) rename {calculatorpp => app-android}/res/drawable-mdpi/logo.png (100%) rename {calculatorpp => app-android}/res/drawable-nodpi/cpp_onscreen_button_close.png (100%) rename {calculatorpp => app-android}/res/drawable-nodpi/cpp_onscreen_button_fold.png (100%) rename {calculatorpp => app-android}/res/drawable-nodpi/cpp_onscreen_button_minimize.png (100%) rename {calculatorpp => app-android}/res/drawable-nodpi/cpp_onscreen_header_logo.png (100%) rename {calculatorpp => app-android}/res/drawable-nodpi/default_abs__ab_transparent_dark_holo.9.png (100%) rename {calculatorpp => app-android}/res/drawable-nodpi/default_abs__btn_cab_done_default_holo_dark.9.png (100%) rename {calculatorpp => app-android}/res/drawable-nodpi/default_abs__btn_cab_done_focused_holo_dark.9.png (100%) rename {calculatorpp => app-android}/res/drawable-nodpi/default_abs__btn_cab_done_pressed_holo_dark.9.png (100%) rename {calculatorpp => app-android}/res/drawable-nodpi/default_abs__list_focused_holo.9.png (100%) rename {calculatorpp => app-android}/res/drawable-nodpi/default_abs__list_longpressed_holo.9.png (100%) rename {calculatorpp => app-android}/res/drawable-nodpi/default_abs__list_pressed_holo_dark.9.png (100%) rename {calculatorpp => app-android}/res/drawable-nodpi/default_abs__spinner_ab_focused_holo_dark.9.png (100%) rename {calculatorpp => app-android}/res/drawable-nodpi/default_abs__spinner_ab_pressed_holo_dark.9.png (100%) rename {calculatorpp => app-android}/res/drawable-nodpi/default_abs__tab_selected_focused_holo.9.png (100%) rename {calculatorpp => app-android}/res/drawable-nodpi/default_abs__tab_selected_holo.9.png (100%) rename {calculatorpp => app-android}/res/drawable-nodpi/default_abs__tab_selected_pressed_holo.9.png (100%) rename {calculatorpp => app-android}/res/drawable-nodpi/default_abs__tab_unselected_pressed_holo.9.png (100%) rename {calculatorpp => app-android}/res/drawable-nodpi/metro_blue_abs__ab_transparent_dark_holo.9.png (100%) rename {calculatorpp => app-android}/res/drawable-nodpi/metro_blue_abs__list_focused_holo.9.png (100%) rename {calculatorpp => app-android}/res/drawable-nodpi/metro_blue_abs__list_pressed_holo_dark.9.png (100%) rename {calculatorpp => app-android}/res/drawable-nodpi/metro_blue_abs__tab_selected_focused_holo.9.png (100%) rename {calculatorpp => app-android}/res/drawable-nodpi/metro_blue_abs__tab_selected_holo.9.png (100%) rename {calculatorpp => app-android}/res/drawable-nodpi/metro_blue_abs__tab_selected_pressed_holo.9.png (100%) rename {calculatorpp => app-android}/res/drawable-nodpi/metro_blue_abs__tab_unselected_pressed_holo.9.png (100%) rename {calculatorpp => app-android}/res/drawable-nodpi/widget_preview.png (100%) rename {calculatorpp => app-android}/res/drawable-xhdpi/ab_add.png (100%) rename {calculatorpp => app-android}/res/drawable-xhdpi/ab_icon.png (100%) rename {calculatorpp => app-android}/res/drawable-xhdpi/ab_settings.png (100%) rename {calculatorpp => app-android}/res/drawable-xhdpi/ic_menu_preferences.png (100%) mode change 100755 => 100644 rename {calculatorpp => app-android}/res/drawable-xhdpi/icon.png (100%) rename {calculatorpp => app-android}/res/drawable-xhdpi/icon_onscreen.png (100%) rename {calculatorpp => app-android}/res/drawable-xhdpi/kb_copy.png (100%) rename {calculatorpp => app-android}/res/drawable-xhdpi/kb_delete.png (100%) rename {calculatorpp => app-android}/res/drawable-xhdpi/kb_facebook.png (100%) rename {calculatorpp => app-android}/res/drawable-xhdpi/kb_heart.png (100%) rename {calculatorpp => app-android}/res/drawable-xhdpi/kb_logo.png (100%) rename {calculatorpp => app-android}/res/drawable-xhdpi/kb_paste.png (100%) rename {calculatorpp => app-android}/res/drawable-xhdpi/kb_settings.png (100%) rename {calculatorpp => app-android}/res/drawable-xhdpi/logo.png (100%) rename {calculatorpp => app-android}/res/drawable-xlarge-hdpi/kb_copy.png (100%) rename {calculatorpp => app-android}/res/drawable-xlarge-hdpi/kb_delete.png (100%) rename {calculatorpp => app-android}/res/drawable-xlarge-hdpi/kb_facebook.png (100%) rename {calculatorpp => app-android}/res/drawable-xlarge-hdpi/kb_heart.png (100%) rename {calculatorpp => app-android}/res/drawable-xlarge-hdpi/kb_logo.png (100%) rename {calculatorpp => app-android}/res/drawable-xlarge-hdpi/kb_paste.png (100%) rename {calculatorpp => app-android}/res/drawable-xlarge-hdpi/kb_settings.png (100%) rename {calculatorpp => app-android}/res/drawable/blue_button.xml (100%) rename {calculatorpp => app-android}/res/drawable/blue_button_dark.xml (100%) rename {calculatorpp => app-android}/res/drawable/blue_button_dark_shape.xml (100%) rename {calculatorpp => app-android}/res/drawable/blue_button_shape.xml (100%) rename {calculatorpp => app-android}/res/drawable/default_abs__btn_cab_done_holo_dark.xml (100%) rename {calculatorpp => app-android}/res/drawable/default_abs__item_background_holo_dark.xml (100%) rename {calculatorpp => app-android}/res/drawable/default_abs__list_selector_background_transition_holo_dark.xml (100%) rename {calculatorpp => app-android}/res/drawable/default_abs__list_selector_holo_dark.xml (100%) rename {calculatorpp => app-android}/res/drawable/default_abs__spinner_ab_holo_dark.xml (100%) rename {calculatorpp => app-android}/res/drawable/default_abs__tab_indicator_ab_holo.xml (100%) rename {calculatorpp => app-android}/res/drawable/gray_button.xml (100%) rename {calculatorpp => app-android}/res/drawable/gray_button_dark.xml (100%) rename {calculatorpp => app-android}/res/drawable/gray_button_dark_shape.xml (100%) rename {calculatorpp => app-android}/res/drawable/gray_button_shape.xml (100%) rename {calculatorpp => app-android}/res/drawable/metro_blue_abs__tab_indicator_ab_holo.xml (100%) rename {calculatorpp => app-android}/res/drawable/metro_blue_button.xml (100%) rename {calculatorpp => app-android}/res/drawable/metro_blue_button_shape.xml (100%) rename {calculatorpp => app-android}/res/drawable/metro_blue_list_item.xml (100%) rename {calculatorpp => app-android}/res/drawable/metro_button_dark.xml (100%) rename {calculatorpp => app-android}/res/drawable/metro_button_dark_shape.xml (100%) rename {calculatorpp => app-android}/res/drawable/metro_button_green.xml (100%) rename {calculatorpp => app-android}/res/drawable/metro_button_green_shape.xml (100%) rename {calculatorpp => app-android}/res/drawable/metro_button_light.xml (100%) rename {calculatorpp => app-android}/res/drawable/metro_button_light_shape.xml (100%) rename {calculatorpp => app-android}/res/drawable/metro_button_pressed.xml (100%) rename {calculatorpp => app-android}/res/drawable/metro_button_purple.xml (100%) rename {calculatorpp => app-android}/res/drawable/metro_button_purple_shape.xml (100%) rename {calculatorpp => app-android}/res/drawable/metro_green_list_item.xml (100%) rename {calculatorpp => app-android}/res/drawable/metro_purple_list_item.xml (100%) rename {calculatorpp => app-android}/res/drawable/pane_background.xml (100%) rename {calculatorpp => app-android}/res/drawable/violet_button.xml (100%) rename {calculatorpp => app-android}/res/drawable/violet_button_dark.xml (100%) rename {calculatorpp => app-android}/res/drawable/violet_button_dark_shape.xml (100%) rename {calculatorpp => app-android}/res/drawable/violet_button_shape.xml (100%) rename {calculatorpp => app-android}/res/layout-land/calc_keyboard.xml (100%) rename {calculatorpp => app-android}/res/layout-land/calc_keyboard_mobile.xml (100%) rename {calculatorpp => app-android}/res/layout-land/main_calculator.xml (100%) rename {calculatorpp => app-android}/res/layout-land/main_calculator_mobile.xml (100%) rename {calculatorpp => app-android}/res/layout-land/main_first_pane.xml (100%) rename {calculatorpp => app-android}/res/layout-land/main_first_pane_mobile.xml (100%) rename {calculatorpp => app-android}/res/layout-large-land/calc_keyboard.xml (100%) rename {calculatorpp => app-android}/res/layout-large-land/main_calculator.xml (100%) rename {calculatorpp => app-android}/res/layout-large/calc_display.xml (100%) rename {calculatorpp => app-android}/res/layout-large/calc_editor.xml (100%) rename {calculatorpp => app-android}/res/layout-large/calc_keyboard.xml (100%) rename {calculatorpp => app-android}/res/layout-large/main_calculator.xml (100%) rename {calculatorpp => app-android}/res/layout-xlarge-land/calc_keyboard.xml (100%) rename {calculatorpp => app-android}/res/layout-xlarge-land/main_calculator.xml (100%) rename {calculatorpp => app-android}/res/layout-xlarge/calc_display.xml (100%) rename {calculatorpp => app-android}/res/layout-xlarge/calc_editor.xml (100%) rename {calculatorpp => app-android}/res/layout-xlarge/calc_keyboard.xml (100%) rename {calculatorpp => app-android}/res/layout-xlarge/main_calculator.xml (100%) rename {calculatorpp => app-android}/res/layout/about_fragment.xml (100%) rename {calculatorpp => app-android}/res/layout/ad.xml (100%) rename {calculatorpp => app-android}/res/layout/admob_pref.xml (100%) rename {calculatorpp => app-android}/res/layout/calc_clear_button.xml (100%) rename {calculatorpp => app-android}/res/layout/calc_copy_button.xml (100%) rename {calculatorpp => app-android}/res/layout/calc_display.xml (100%) rename {calculatorpp => app-android}/res/layout/calc_display_mobile.xml (100%) rename {calculatorpp => app-android}/res/layout/calc_division_button.xml (100%) rename {calculatorpp => app-android}/res/layout/calc_donate_button.xml (100%) rename {calculatorpp => app-android}/res/layout/calc_dot_button.xml (100%) rename {calculatorpp => app-android}/res/layout/calc_editor.xml (100%) rename {calculatorpp => app-android}/res/layout/calc_editor_mobile.xml (100%) rename {calculatorpp => app-android}/res/layout/calc_eight_digit_button.xml (100%) rename {calculatorpp => app-android}/res/layout/calc_empty_button.xml (100%) rename {calculatorpp => app-android}/res/layout/calc_equals_button.xml (100%) rename {calculatorpp => app-android}/res/layout/calc_erase_button.xml (100%) rename {calculatorpp => app-android}/res/layout/calc_five_digit_button.xml (100%) rename {calculatorpp => app-android}/res/layout/calc_four_digit_button.xml (100%) rename {calculatorpp => app-android}/res/layout/calc_functions_button.xml (100%) rename {calculatorpp => app-android}/res/layout/calc_history_button.xml (100%) rename {calculatorpp => app-android}/res/layout/calc_keyboard.xml (100%) rename {calculatorpp => app-android}/res/layout/calc_keyboard_mobile.xml (100%) rename {calculatorpp => app-android}/res/layout/calc_left_button.xml (100%) rename {calculatorpp => app-android}/res/layout/calc_multiplication_button.xml (100%) rename {calculatorpp => app-android}/res/layout/calc_nine_digit_button.xml (100%) rename {calculatorpp => app-android}/res/layout/calc_one_digit_button.xml (100%) rename {calculatorpp => app-android}/res/layout/calc_operators_button.xml (100%) rename {calculatorpp => app-android}/res/layout/calc_paste_button.xml (100%) rename {calculatorpp => app-android}/res/layout/calc_plot_view.xml (100%) rename {calculatorpp => app-android}/res/layout/calc_plus_button.xml (100%) rename {calculatorpp => app-android}/res/layout/calc_right_button.xml (100%) rename {calculatorpp => app-android}/res/layout/calc_round_brackets_button.xml (100%) rename {calculatorpp => app-android}/res/layout/calc_seven_digit_button.xml (100%) rename {calculatorpp => app-android}/res/layout/calc_six_digit_button.xml (100%) rename {calculatorpp => app-android}/res/layout/calc_subtraction_button.xml (100%) rename {calculatorpp => app-android}/res/layout/calc_three_digit_button.xml (100%) rename {calculatorpp => app-android}/res/layout/calc_title.xml (100%) rename {calculatorpp => app-android}/res/layout/calc_two_digit_button.xml (100%) rename {calculatorpp => app-android}/res/layout/calc_vars_button.xml (100%) rename {calculatorpp => app-android}/res/layout/calc_zero_digit_button.xml (100%) rename {calculatorpp => app-android}/res/layout/calculator_messages_dialog.xml (100%) rename {calculatorpp => app-android}/res/layout/calculator_messages_dialog_message.xml (100%) rename {calculatorpp => app-android}/res/layout/display_error_message.xml (100%) rename {calculatorpp => app-android}/res/layout/drag_button_calibration.xml (100%) rename {calculatorpp => app-android}/res/layout/feedback.xml (100%) rename {calculatorpp => app-android}/res/layout/function_add_param.xml (100%) rename {calculatorpp => app-android}/res/layout/function_edit.xml (100%) rename {calculatorpp => app-android}/res/layout/function_edit_param.xml (100%) rename {calculatorpp => app-android}/res/layout/help_faq_fragment.xml (100%) rename {calculatorpp => app-android}/res/layout/help_hints_fragment.xml (100%) rename {calculatorpp => app-android}/res/layout/help_screens_fragment.xml (100%) rename {calculatorpp => app-android}/res/layout/history_edit.xml (100%) rename {calculatorpp => app-android}/res/layout/history_fragment.xml (100%) rename {calculatorpp => app-android}/res/layout/history_item.xml (100%) rename {calculatorpp => app-android}/res/layout/main_calculator.xml (100%) rename {calculatorpp => app-android}/res/layout/main_calculator_mobile.xml (100%) rename {calculatorpp => app-android}/res/layout/main_empty.xml (100%) rename {calculatorpp => app-android}/res/layout/main_empty_multi_pane.xml (100%) rename {calculatorpp => app-android}/res/layout/math_entities_fragment.xml (100%) rename {calculatorpp => app-android}/res/layout/math_entity.xml (100%) rename {calculatorpp => app-android}/res/layout/notespp_announce.xml (100%) rename {calculatorpp => app-android}/res/layout/onscreen_display.xml (100%) rename {calculatorpp => app-android}/res/layout/onscreen_editor.xml (100%) rename {calculatorpp => app-android}/res/layout/onscreen_footer.xml (100%) rename {calculatorpp => app-android}/res/layout/onscreen_header.xml (100%) rename {calculatorpp => app-android}/res/layout/onscreen_keyboard.xml (100%) rename {calculatorpp => app-android}/res/layout/onscreen_layout.xml (100%) rename {calculatorpp => app-android}/res/layout/plot_fragment.xml (100%) rename {calculatorpp => app-android}/res/layout/release_notes_fragment.xml (100%) rename {calculatorpp => app-android}/res/layout/saved_history_item.xml (100%) rename {calculatorpp => app-android}/res/layout/tabs.xml (100%) rename {calculatorpp => app-android}/res/layout/unit_converter.xml (100%) rename {calculatorpp => app-android}/res/layout/var_edit.xml (100%) rename {calculatorpp => app-android}/res/layout/vars_fragment.xml (100%) rename {calculatorpp => app-android}/res/layout/widget_app_button.xml (100%) rename {calculatorpp => app-android}/res/layout/widget_clear_button.xml (100%) rename {calculatorpp => app-android}/res/layout/widget_copy_button.xml (100%) rename {calculatorpp => app-android}/res/layout/widget_display.xml (100%) rename {calculatorpp => app-android}/res/layout/widget_division_button.xml (100%) rename {calculatorpp => app-android}/res/layout/widget_dot_button.xml (100%) rename {calculatorpp => app-android}/res/layout/widget_editor.xml (100%) rename {calculatorpp => app-android}/res/layout/widget_eight_digit_button.xml (100%) rename {calculatorpp => app-android}/res/layout/widget_equals_button.xml (100%) rename {calculatorpp => app-android}/res/layout/widget_erase_button.xml (100%) rename {calculatorpp => app-android}/res/layout/widget_five_digit_button.xml (100%) rename {calculatorpp => app-android}/res/layout/widget_four_digit_button.xml (100%) rename {calculatorpp => app-android}/res/layout/widget_functions_button.xml (100%) rename {calculatorpp => app-android}/res/layout/widget_history_button.xml (100%) rename {calculatorpp => app-android}/res/layout/widget_keyboard.xml (100%) rename {calculatorpp => app-android}/res/layout/widget_layout.xml (100%) rename {calculatorpp => app-android}/res/layout/widget_left_button.xml (100%) rename {calculatorpp => app-android}/res/layout/widget_like_button.xml (100%) rename {calculatorpp => app-android}/res/layout/widget_multiplication_button.xml (100%) rename {calculatorpp => app-android}/res/layout/widget_nine_digit_button.xml (100%) rename {calculatorpp => app-android}/res/layout/widget_one_digit_button.xml (100%) rename {calculatorpp => app-android}/res/layout/widget_paste_button.xml (100%) rename {calculatorpp => app-android}/res/layout/widget_percent_button.xml (100%) rename {calculatorpp => app-android}/res/layout/widget_plus_button.xml (100%) rename {calculatorpp => app-android}/res/layout/widget_power_button.xml (100%) rename {calculatorpp => app-android}/res/layout/widget_right_button.xml (100%) rename {calculatorpp => app-android}/res/layout/widget_round_brackets_button.xml (100%) rename {calculatorpp => app-android}/res/layout/widget_settings_button.xml (100%) rename {calculatorpp => app-android}/res/layout/widget_seven_digit_button.xml (100%) rename {calculatorpp => app-android}/res/layout/widget_six_digit_button.xml (100%) rename {calculatorpp => app-android}/res/layout/widget_subtraction_button.xml (100%) rename {calculatorpp => app-android}/res/layout/widget_three_digit_button.xml (100%) rename {calculatorpp => app-android}/res/layout/widget_two_digit_button.xml (100%) rename {calculatorpp => app-android}/res/layout/widget_vars_button.xml (100%) rename {calculatorpp => app-android}/res/layout/widget_zero_digit_button.xml (100%) rename {calculatorpp => app-android}/res/menu/functions_menu.xml (100%) rename {calculatorpp => app-android}/res/menu/history_menu.xml (100%) rename {calculatorpp => app-android}/res/menu/plot_menu.xml (100%) rename {calculatorpp => app-android}/res/menu/vars_menu.xml (100%) rename {calculatorpp => app-android}/res/values-es/text_about.xml (100%) rename {calculatorpp => app-android}/res/values-es/text_functions.xml (100%) rename {calculatorpp => app-android}/res/values-es/text_help.xml (100%) rename {calculatorpp => app-android}/res/values-es/text_operators.xml (100%) rename {calculatorpp => app-android}/res/values-es/text_strings.xml (100%) rename {calculatorpp => app-android}/res/values-es/text_vars.xml (100%) rename {calculatorpp => app-android}/res/values-it/text_about.xml (100%) rename {calculatorpp => app-android}/res/values-it/text_functions.xml (100%) rename {calculatorpp => app-android}/res/values-it/text_help.xml (100%) rename {calculatorpp => app-android}/res/values-it/text_operators.xml (100%) rename {calculatorpp => app-android}/res/values-it/text_strings.xml (100%) rename {calculatorpp => app-android}/res/values-it/text_vars.xml (100%) rename {calculatorpp => app-android}/res/values-large-hdpi/dimens.xml (100%) rename {calculatorpp => app-android}/res/values-large-mdpi/dimens.xml (100%) rename {calculatorpp => app-android}/res/values-large-tvdpi/dimens.xml (100%) rename {calculatorpp => app-android}/res/values-large/dimens.xml (100%) rename {calculatorpp => app-android}/res/values-normal-hdpi/dimens.xml (100%) rename {calculatorpp => app-android}/res/values-normal-mdpi/dimens.xml (100%) rename {calculatorpp => app-android}/res/values-normal-tvdpi/dimens.xml (100%) rename {calculatorpp => app-android}/res/values-normal-xhdpi/dimens.xml (100%) rename {calculatorpp => app-android}/res/values-normal/dimens.xml (100%) rename {calculatorpp => app-android}/res/values-ru/text_about.xml (100%) rename {calculatorpp => app-android}/res/values-ru/text_functions.xml (100%) rename {calculatorpp => app-android}/res/values-ru/text_help.xml (100%) rename {calculatorpp => app-android}/res/values-ru/text_operators.xml (100%) rename {calculatorpp => app-android}/res/values-ru/text_preferences.xml (100%) rename {calculatorpp => app-android}/res/values-ru/text_strings.xml (100%) rename {calculatorpp => app-android}/res/values-ru/text_vars.xml (100%) rename {calculatorpp => app-android}/res/values-small-hdpi/dimens.xml (100%) rename {calculatorpp => app-android}/res/values-small-xhdpi/dimens.xml (100%) rename {calculatorpp => app-android}/res/values-small/dimens.xml (100%) rename {calculatorpp => app-android}/res/values-uk/text_about.xml (100%) rename {calculatorpp => app-android}/res/values-uk/text_functions.xml (100%) rename {calculatorpp => app-android}/res/values-uk/text_help.xml (100%) rename {calculatorpp => app-android}/res/values-uk/text_operators.xml (100%) rename {calculatorpp => app-android}/res/values-uk/text_preferences.xml (100%) rename {calculatorpp => app-android}/res/values-uk/text_strings.xml (100%) rename {calculatorpp => app-android}/res/values-uk/text_vars.xml (100%) rename {calculatorpp => app-android}/res/values-v14/dimens.xml (100%) rename {calculatorpp => app-android}/res/values-xlarge-hdpi/dimens.xml (100%) rename {calculatorpp => app-android}/res/values-xlarge-mdpi/dimens.xml (100%) rename {calculatorpp => app-android}/res/values-xlarge/dimens.xml (100%) rename {calculatorpp => app-android}/res/values-zh-rtw/text_about.xml (100%) rename {calculatorpp => app-android}/res/values-zh-rtw/text_functions.xml (100%) rename {calculatorpp => app-android}/res/values-zh-rtw/text_help.xml (100%) rename {calculatorpp => app-android}/res/values-zh-rtw/text_operators.xml (100%) rename {calculatorpp => app-android}/res/values-zh-rtw/text_preferences.xml (100%) rename {calculatorpp => app-android}/res/values-zh-rtw/text_strings.xml (100%) rename {calculatorpp => app-android}/res/values-zh-rtw/text_vars.xml (100%) rename {calculatorpp => app-android}/res/values/arrays.xml (100%) rename {calculatorpp => app-android}/res/values/attributes.xml (100%) rename {calculatorpp => app-android}/res/values/colors.xml (100%) rename {calculatorpp => app-android}/res/values/dimens.xml (100%) rename {calculatorpp => app-android}/res/values/preferences.xml (100%) rename {calculatorpp => app-android}/res/values/styles.xml (100%) rename {calculatorpp => app-android}/res/values/styles_history.xml (100%) rename {calculatorpp => app-android}/res/values/styles_var.xml (100%) rename {calculatorpp => app-android}/res/values/text_about.xml (100%) rename {calculatorpp => app-android}/res/values/text_functions.xml (100%) rename {calculatorpp => app-android}/res/values/text_help.xml (100%) rename {calculatorpp => app-android}/res/values/text_operators.xml (100%) rename {calculatorpp => app-android}/res/values/text_preferences.xml (100%) rename {calculatorpp => app-android}/res/values/text_strings.xml (100%) rename {calculatorpp => app-android}/res/values/text_vars.xml (100%) rename {calculatorpp => app-android}/res/values/theme_gray.xml (100%) rename {calculatorpp => app-android}/res/values/theme_light_blue.xml (100%) rename {calculatorpp => app-android}/res/values/theme_metro_blue.xml (100%) rename {calculatorpp => app-android}/res/values/theme_metro_green.xml (100%) rename {calculatorpp => app-android}/res/values/theme_metro_purple.xml (100%) rename {calculatorpp => app-android}/res/values/theme_violet.xml (100%) rename {calculatorpp => app-android}/res/xml/calculator_widget_info_3x3.xml (100%) rename {calculatorpp => app-android}/res/xml/calculator_widget_info_3x4.xml (100%) rename {calculatorpp => app-android}/res/xml/calculator_widget_info_4x4.xml (100%) rename {calculatorpp => app-android}/res/xml/calculator_widget_info_4x5.xml (100%) rename {calculatorpp => app-android}/res/xml/preferences.xml (100%) rename {calculatorpp => app-android}/res/xml/preferences_appearance.xml (100%) rename {calculatorpp => app-android}/res/xml/preferences_calculations.xml (100%) rename {calculatorpp => app-android}/res/xml/preferences_onscreen.xml (100%) rename {calculatorpp => app-android}/res/xml/preferences_other.xml (100%) rename {calculatorpp => app-android}/res/xml/preferences_plot.xml (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/AndroidUtils2.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/AbstractCalculatorHelper.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/AndroidCalculator.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/AndroidCalculatorClipboard.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/AndroidCalculatorDisplayView.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/AndroidCalculatorEditorView.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/AndroidCalculatorKeyboard.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/AndroidCalculatorLogger.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/AndroidCalculatorNotifier.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/AndroidCalculatorPreferenceService.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/AndroidFunctionCategory.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/AndroidNumeralBase.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/AndroidOperatorCategory.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/AndroidVarCategory.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/CalculatorActivity.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/CalculatorActivityHelper.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/CalculatorActivityHelperImpl.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/CalculatorActivityLauncher.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/CalculatorActivityMobile.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/CalculatorApplication.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/CalculatorButtons.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/CalculatorDisplayFragment.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/CalculatorDisplayMenuItem.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/CalculatorDisplayOnClickListener.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/CalculatorEditorFragment.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/CalculatorFixableMessage.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/CalculatorFragment.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/CalculatorFragmentActivity.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/CalculatorFragmentHelper.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/CalculatorFragmentHelperImpl.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/CalculatorKeyboardFragment.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/CalculatorMenu.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/CalculatorMessagesDialog.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/CalculatorOnscreenStartActivity.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/CalculatorPreferences.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/CalculatorPreferencesActivity.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/CalculatorSecurity.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/CharacterAtPositionFinder.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/ConversionMenuItem.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/CursorDragProcessor.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/DigitButtonDragProcessor.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/EvalDragProcessor.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/NumeralBaseButtons.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/ParcelableCalculatorDisplayViewState.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/ParcelableCalculatorEditorViewState.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/about/CalculatorAboutActivity.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/about/CalculatorAboutFragment.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/about/CalculatorFragmentType.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/about/CalculatorReleaseNotesFragment.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/about/TextHelper.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/external/AndroidExternalListenersContainer.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/external/DefaultExternalCalculatorIntentHandler.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/external/ExternalCalculatorIntentHandler.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/external/ExternalCalculatorStateUpdater.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/function/FunctionEditDialogFragment.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/function/FunctionEditorSaver.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/function/FunctionParamEditText.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/function/FunctionParamsView.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/help/CalculatorHelpActivity.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/help/CalculatorHelpFaqFragment.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/help/CalculatorHelpHintsFragment.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/help/CalculatorHelpScreensFragment.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/history/AbstractCalculatorHistoryFragment.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/history/AndroidCalculatorHistory.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/history/CalculatorHistoryActivity.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/history/CalculatorHistoryFragment.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/history/CalculatorSavedHistoryFragment.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/history/HistoryArrayAdapter.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/history/HistoryItemMenuData.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/history/HistoryItemMenuItem.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/history/TextViewEditorAdapter.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/math/edit/AbstractMathEntityListFragment.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorFunctionsActivity.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorFunctionsFragment.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorOperatorsActivity.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorOperatorsFragment.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorVarsActivity.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorVarsFragment.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/math/edit/MathEntityRemover.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/math/edit/VarEditDialogFragment.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/math/edit/VarEditorSaver.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/model/AndroidCalculatorEngine.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/model/AndroidMathEntityDao.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/model/Messages.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenBroadcastReceiver.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenService.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenView.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenViewDef.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/onscreen/OnscreenViewListener.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/plot/CalculatorPlotActivity.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/plot/CalculatorPlotFragment.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/plot/CalculatorPlotPreferenceActivity.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/plot/GraphLineColor.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/plot/MyXYSeries.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/plot/PlotUtils.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/view/AngleUnitsButton.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/view/CalculatorAdditionalTitle.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/view/NumeralBaseConverterDialog.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/view/NumeralBasesButton.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/view/OnDragListenerVibrator.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/view/TextHighlighter.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/view/UnitConverterViewBuilder.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/widget/AbstractCalculatorWidgetProvider.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetConfigurationActivity.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetIntentHandler.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider3x4.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider4x4.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider4x5.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/calculator/widget/WidgetButton.java (100%) rename {calculatorpp => app-android}/src/main/java/org/solovyev/android/fragments/FragmentUtils.java (100%) rename {calculatorpp => app-android}/src/test/java/org/solovyev/android/AndroidNumeralBaseTest.java (100%) rename {calculatorpp => app-android}/src/test/java/org/solovyev/android/calculator/AndroidCalculatorEditorViewTest.java (100%) rename {calculatorpp => app-android}/src/test/java/org/solovyev/android/calculator/CalculatorTestUtils.java (100%) rename {calculatorpp => app-android}/src/test/java/org/solovyev/android/calculator/CalculatorppTestRunner.java (100%) rename {calculatorpp => app-android}/src/test/java/org/solovyev/android/calculator/TextHighlighterTest.java (100%) rename {calculatorpp => app-android}/src/test/java/org/solovyev/android/calculator/history/HistoryUtilsTest.java (100%) rename {calculatorpp => app-android}/src/test/java/org/solovyev/android/calculator/model/VarTest.java (100%) rename {calculatorpp => app-android}/src/test/java/org/solovyev/android/calculator/plot/PlotUtilsTest.java (100%) rename {calculatorpp => app-android}/src/test/java/org/solovyev/common/FloatIntervalMapperTest.java (100%) rename {calculatorpp => app-android}/src/test/java/org/solovyev/common/math/DiscreteNormalizerTest.java (100%) rename {calculatorpp-core => core}/pom.xml (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/AbstractCalculatorMathRegistry.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/AbstractNumberBuilder.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/Calculator.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorButtonActions.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorClipboard.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorConversionEventData.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorConversionEventDataImpl.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorDisplay.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorDisplayChangeEventData.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorDisplayChangeEventDataImpl.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorDisplayImpl.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorDisplayView.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorDisplayViewState.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorDisplayViewStateImpl.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorEditor.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorEditorChangeEventData.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorEditorChangeEventDataImpl.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorEditorImpl.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorEditorView.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorEditorViewState.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorEditorViewStateImpl.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorEngine.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorEngineControl.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorEngineImpl.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorEvalException.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorEvaluationEventData.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorEvaluationEventDataImpl.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorEventContainer.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorEventData.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorEventDataImpl.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorEventHolder.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorEventListener.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorEventType.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorFailure.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorFailureImpl.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorFixableError.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorFunctionsMathRegistry.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorImpl.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorInput.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorInputImpl.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorKeyboard.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorKeyboardImpl.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorLocator.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorLogger.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorMathEngine.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorMathRegistry.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorMessage.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorMessages.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorNotifier.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorOperatorsMathRegistry.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorOutput.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorOutputImpl.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorParseException.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorPostfixFunctionsRegistry.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorPreferenceService.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorSpecialButton.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorUtils.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/CalculatorVarsRegistry.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/Change.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/ChangeImpl.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/ConversionFailure.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/ConversionFailureImpl.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/DummyCalculatorClipboard.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/DummyCalculatorNotifier.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/Editor.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/FunctionCategory.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/ListCalculatorEventContainer.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/LiteNumberBuilder.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/Locator.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/MathEntityDao.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/MathEntityPersistenceContainer.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/MathPersistenceEntity.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/NumberBuilder.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/OperatorCategory.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/PreparedExpression.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/SystemOutCalculatorLogger.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/ToJsclTextProcessor.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/VarCategory.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/external/CalculatorExternalListenersContainer.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/history/AbstractHistoryState.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/history/CalculatorDisplayHistoryState.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/history/CalculatorHistory.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/history/CalculatorHistoryImpl.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/history/CalculatorHistoryState.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/history/EditorHistoryState.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/history/History.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/history/HistoryUtils.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/jscl/FromJsclNumericTextProcessor.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/jscl/JsclOperation.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/math/MathType.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/model/AFunction.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/model/Functions.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/model/MathEntityBuilder.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/model/Var.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/model/Vars.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/text/DummyTextProcessor.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/text/FromJsclSimplifyTextProcessor.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/text/TextProcessor.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/android/calculator/units/CalculatorNumeralBase.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/common/utils/ListListenersContainer.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/math/units/ConversionException.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/math/units/ConversionUtils.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/math/units/Unit.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/math/units/UnitConverter.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/math/units/UnitImpl.java (100%) rename {calculatorpp-core => core}/src/main/java/org/solovyev/math/units/UnitType.java (100%) rename {calculatorpp-core => core}/src/main/resources/org/solovyev/android/calculator/messages.properties (100%) rename {calculatorpp-core => core}/src/main/resources/org/solovyev/android/calculator/messages_ru.properties (100%) rename {calculatorpp-core => core}/src/main/resources/org/solovyev/android/calculator/messages_uk.properties (100%) rename {calculatorpp-core => core}/src/main/resources/org/solovyev/android/calculator/messages_zh.properties (100%) rename {calculatorpp-core => core}/src/test/java/org/solovyev/android/calculator/AbstractCalculatorTest.java (100%) rename {calculatorpp-core => core}/src/test/java/org/solovyev/android/calculator/CalculatorDisplayViewStateImplTest.java (100%) rename {calculatorpp-core => core}/src/test/java/org/solovyev/android/calculator/CalculatorEditorImplTest.java (100%) rename {calculatorpp-core => core}/src/test/java/org/solovyev/android/calculator/CalculatorEditorViewStateImplTest.java (100%) rename {calculatorpp-core => core}/src/test/java/org/solovyev/android/calculator/CalculatorImplTest.java (100%) rename {calculatorpp-core => core}/src/test/java/org/solovyev/android/calculator/CalculatorTestUtils.java (100%) rename {calculatorpp-core => core}/src/test/java/org/solovyev/android/calculator/FromJsclSimplifyTextProcessorTest.java (100%) rename {calculatorpp-core => core}/src/test/java/org/solovyev/android/calculator/history/CalculatorHistoryImplTest.java (100%) rename {calculatorpp-core => core}/src/test/java/org/solovyev/android/calculator/jscl/FromJsclNumericTextProcessorTest.java (100%) rename {calculatorpp-core => core}/src/test/java/org/solovyev/android/calculator/math/MathTypeTest.java (100%) rename {calculatorpp-core => core}/src/test/java/org/solovyev/android/calculator/model/AndroidCalculatorEngineTest.java (100%) rename {calculatorpp-core => core}/src/test/java/org/solovyev/android/calculator/model/FunctionsTest.java (100%) rename {calculatorpp-core => core}/src/test/java/org/solovyev/android/calculator/model/NumeralBaseTest.java (100%) rename {calculatorpp-core => core}/src/test/java/org/solovyev/android/calculator/model/ToJsclTextProcessorTest.java (100%) rename {calculatorpp-core => core}/src/test/resources/org/solovyev/android/calculator/model/nb_table.csv (100%) diff --git a/calculatorpp-test/pom.xml b/app-android-test/pom.xml similarity index 90% rename from calculatorpp-test/pom.xml rename to app-android-test/pom.xml index a054d398..e7c0fedb 100644 --- a/calculatorpp-test/pom.xml +++ b/app-android-test/pom.xml @@ -10,7 +10,7 @@ 4.0.0 org.solovyev.android - calculatorpp-test + calculatorpp-app-android-test Calculator++ Application (Test) diff --git a/calculatorpp/AndroidManifest.xml b/app-android/AndroidManifest.xml similarity index 94% rename from calculatorpp/AndroidManifest.xml rename to app-android/AndroidManifest.xml index 9fe203f6..a4f62aff 100644 --- a/calculatorpp/AndroidManifest.xml +++ b/app-android/AndroidManifest.xml @@ -1,165 +1,165 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/calculatorpp/misc/doc/GoogleAdMobAdsSdk-4.3.1-javadocs.zip b/app-android/misc/doc/GoogleAdMobAdsSdk-4.3.1-javadocs.zip similarity index 100% rename from calculatorpp/misc/doc/GoogleAdMobAdsSdk-4.3.1-javadocs.zip rename to app-android/misc/doc/GoogleAdMobAdsSdk-4.3.1-javadocs.zip diff --git a/calculatorpp/misc/doc/achartengine-0.7.0-javadocs.zip b/app-android/misc/doc/achartengine-0.7.0-javadocs.zip similarity index 100% rename from calculatorpp/misc/doc/achartengine-0.7.0-javadocs.zip rename to app-android/misc/doc/achartengine-0.7.0-javadocs.zip diff --git a/calculatorpp/misc/lib/GoogleAdMobAdsSdk-4.3.1.jar b/app-android/misc/lib/GoogleAdMobAdsSdk-4.3.1.jar similarity index 100% rename from calculatorpp/misc/lib/GoogleAdMobAdsSdk-4.3.1.jar rename to app-android/misc/lib/GoogleAdMobAdsSdk-4.3.1.jar diff --git a/calculatorpp/misc/lib/achartengine-0.7.0.jar b/app-android/misc/lib/achartengine-0.7.0.jar similarity index 100% rename from calculatorpp/misc/lib/achartengine-0.7.0.jar rename to app-android/misc/lib/achartengine-0.7.0.jar diff --git a/calculatorpp/misc/lib/achartengine-0.7.1.jar b/app-android/misc/lib/achartengine-0.7.1.jar similarity index 100% rename from calculatorpp/misc/lib/achartengine-0.7.1.jar rename to app-android/misc/lib/achartengine-0.7.1.jar diff --git a/calculatorpp/misc/other/prepare_avds.sh b/app-android/misc/other/prepare_avds.sh old mode 100755 new mode 100644 similarity index 100% rename from calculatorpp/misc/other/prepare_avds.sh rename to app-android/misc/other/prepare_avds.sh diff --git a/calculatorpp/misc/other/remove_avds.sh b/app-android/misc/other/remove_avds.sh old mode 100755 new mode 100644 similarity index 100% rename from calculatorpp/misc/other/remove_avds.sh rename to app-android/misc/other/remove_avds.sh diff --git a/calculatorpp/misc/other/take_screenshots.py b/app-android/misc/other/take_screenshots.py similarity index 100% rename from calculatorpp/misc/other/take_screenshots.py rename to app-android/misc/other/take_screenshots.py diff --git a/calculatorpp/misc/other/take_screenshots.sh b/app-android/misc/other/take_screenshots.sh old mode 100755 new mode 100644 similarity index 100% rename from calculatorpp/misc/other/take_screenshots.sh rename to app-android/misc/other/take_screenshots.sh diff --git a/calculatorpp/misc/other/take_screenshots2.sh b/app-android/misc/other/take_screenshots2.sh old mode 100755 new mode 100644 similarity index 100% rename from calculatorpp/misc/other/take_screenshots2.sh rename to app-android/misc/other/take_screenshots2.sh diff --git a/calculatorpp/misc/other/wait_device.py b/app-android/misc/other/wait_device.py similarity index 100% rename from calculatorpp/misc/other/wait_device.py rename to app-android/misc/other/wait_device.py diff --git a/calculatorpp/misc/res/calculatorpp/01_main_screen_port.png b/app-android/misc/res/calculatorpp/01_main_screen_port.png similarity index 100% rename from calculatorpp/misc/res/calculatorpp/01_main_screen_port.png rename to app-android/misc/res/calculatorpp/01_main_screen_port.png diff --git a/calculatorpp/misc/res/calculatorpp/01_main_screen_port_sm.png b/app-android/misc/res/calculatorpp/01_main_screen_port_sm.png similarity index 100% rename from calculatorpp/misc/res/calculatorpp/01_main_screen_port_sm.png rename to app-android/misc/res/calculatorpp/01_main_screen_port_sm.png diff --git a/calculatorpp/misc/res/calculatorpp/02_main_screen_land.png b/app-android/misc/res/calculatorpp/02_main_screen_land.png similarity index 100% rename from calculatorpp/misc/res/calculatorpp/02_main_screen_land.png rename to app-android/misc/res/calculatorpp/02_main_screen_land.png diff --git a/calculatorpp/misc/res/calculatorpp/03_main_screen_port_with_expression.png b/app-android/misc/res/calculatorpp/03_main_screen_port_with_expression.png similarity index 100% rename from calculatorpp/misc/res/calculatorpp/03_main_screen_port_with_expression.png rename to app-android/misc/res/calculatorpp/03_main_screen_port_with_expression.png diff --git a/calculatorpp/misc/res/calculatorpp/04_plot_graph_menu.png b/app-android/misc/res/calculatorpp/04_plot_graph_menu.png similarity index 100% rename from calculatorpp/misc/res/calculatorpp/04_plot_graph_menu.png rename to app-android/misc/res/calculatorpp/04_plot_graph_menu.png diff --git a/calculatorpp/misc/res/calculatorpp/04_plot_graph_menu_sm.png b/app-android/misc/res/calculatorpp/04_plot_graph_menu_sm.png similarity index 100% rename from calculatorpp/misc/res/calculatorpp/04_plot_graph_menu_sm.png rename to app-android/misc/res/calculatorpp/04_plot_graph_menu_sm.png diff --git a/calculatorpp/misc/res/calculatorpp/05_graph_screen.png b/app-android/misc/res/calculatorpp/05_graph_screen.png similarity index 100% rename from calculatorpp/misc/res/calculatorpp/05_graph_screen.png rename to app-android/misc/res/calculatorpp/05_graph_screen.png diff --git a/calculatorpp/misc/res/calculatorpp/05_graph_screen_sm.png b/app-android/misc/res/calculatorpp/05_graph_screen_sm.png similarity index 100% rename from calculatorpp/misc/res/calculatorpp/05_graph_screen_sm.png rename to app-android/misc/res/calculatorpp/05_graph_screen_sm.png diff --git a/calculatorpp/misc/res/calculatorpp/06_constants_screen.png b/app-android/misc/res/calculatorpp/06_constants_screen.png similarity index 100% rename from calculatorpp/misc/res/calculatorpp/06_constants_screen.png rename to app-android/misc/res/calculatorpp/06_constants_screen.png diff --git a/calculatorpp/misc/res/calculatorpp/06_constants_screen_sm.png b/app-android/misc/res/calculatorpp/06_constants_screen_sm.png similarity index 100% rename from calculatorpp/misc/res/calculatorpp/06_constants_screen_sm.png rename to app-android/misc/res/calculatorpp/06_constants_screen_sm.png diff --git a/calculatorpp/misc/res/calculatorpp/07_constant_create_dialog.png b/app-android/misc/res/calculatorpp/07_constant_create_dialog.png similarity index 100% rename from calculatorpp/misc/res/calculatorpp/07_constant_create_dialog.png rename to app-android/misc/res/calculatorpp/07_constant_create_dialog.png diff --git a/calculatorpp/misc/res/calculatorpp/08_constants_context_menu.png b/app-android/misc/res/calculatorpp/08_constants_context_menu.png similarity index 100% rename from calculatorpp/misc/res/calculatorpp/08_constants_context_menu.png rename to app-android/misc/res/calculatorpp/08_constants_context_menu.png diff --git a/calculatorpp/misc/res/calculatorpp/09_functions_screen.png b/app-android/misc/res/calculatorpp/09_functions_screen.png similarity index 100% rename from calculatorpp/misc/res/calculatorpp/09_functions_screen.png rename to app-android/misc/res/calculatorpp/09_functions_screen.png diff --git a/calculatorpp/misc/res/calculatorpp/09_functions_screen_sm.png b/app-android/misc/res/calculatorpp/09_functions_screen_sm.png similarity index 100% rename from calculatorpp/misc/res/calculatorpp/09_functions_screen_sm.png rename to app-android/misc/res/calculatorpp/09_functions_screen_sm.png diff --git a/calculatorpp/misc/res/calculatorpp/10_history_screen.png b/app-android/misc/res/calculatorpp/10_history_screen.png similarity index 100% rename from calculatorpp/misc/res/calculatorpp/10_history_screen.png rename to app-android/misc/res/calculatorpp/10_history_screen.png diff --git a/calculatorpp/misc/res/calculatorpp/10_history_screen_sm.png b/app-android/misc/res/calculatorpp/10_history_screen_sm.png similarity index 100% rename from calculatorpp/misc/res/calculatorpp/10_history_screen_sm.png rename to app-android/misc/res/calculatorpp/10_history_screen_sm.png diff --git a/calculatorpp/misc/res/calculatorpp/11_history_item_context_menu.png b/app-android/misc/res/calculatorpp/11_history_item_context_menu.png similarity index 100% rename from calculatorpp/misc/res/calculatorpp/11_history_item_context_menu.png rename to app-android/misc/res/calculatorpp/11_history_item_context_menu.png diff --git a/calculatorpp/misc/res/calculatorpp/12_saved_history_tab.png b/app-android/misc/res/calculatorpp/12_saved_history_tab.png similarity index 100% rename from calculatorpp/misc/res/calculatorpp/12_saved_history_tab.png rename to app-android/misc/res/calculatorpp/12_saved_history_tab.png diff --git a/calculatorpp/misc/res/calculatorpp/13_saved_history_item_context_menu.png b/app-android/misc/res/calculatorpp/13_saved_history_item_context_menu.png similarity index 100% rename from calculatorpp/misc/res/calculatorpp/13_saved_history_item_context_menu.png rename to app-android/misc/res/calculatorpp/13_saved_history_item_context_menu.png diff --git a/calculatorpp/misc/res/calculatorpp/14_about_screen.png b/app-android/misc/res/calculatorpp/14_about_screen.png similarity index 100% rename from calculatorpp/misc/res/calculatorpp/14_about_screen.png rename to app-android/misc/res/calculatorpp/14_about_screen.png diff --git a/calculatorpp/misc/res/calculatorpp/14_about_screen_sm.png b/app-android/misc/res/calculatorpp/14_about_screen_sm.png similarity index 100% rename from calculatorpp/misc/res/calculatorpp/14_about_screen_sm.png rename to app-android/misc/res/calculatorpp/14_about_screen_sm.png diff --git a/calculatorpp/misc/res/calculatorpp/15_release_notes_tab.png b/app-android/misc/res/calculatorpp/15_release_notes_tab.png similarity index 100% rename from calculatorpp/misc/res/calculatorpp/15_release_notes_tab.png rename to app-android/misc/res/calculatorpp/15_release_notes_tab.png diff --git a/calculatorpp/misc/res/calculatorpp/16_help_screen.png b/app-android/misc/res/calculatorpp/16_help_screen.png similarity index 100% rename from calculatorpp/misc/res/calculatorpp/16_help_screen.png rename to app-android/misc/res/calculatorpp/16_help_screen.png diff --git a/calculatorpp/misc/res/calculatorpp/16_help_screen_sm.png b/app-android/misc/res/calculatorpp/16_help_screen_sm.png similarity index 100% rename from calculatorpp/misc/res/calculatorpp/16_help_screen_sm.png rename to app-android/misc/res/calculatorpp/16_help_screen_sm.png diff --git a/calculatorpp/misc/res/calculatorpp/17_hints_tab.png b/app-android/misc/res/calculatorpp/17_hints_tab.png similarity index 100% rename from calculatorpp/misc/res/calculatorpp/17_hints_tab.png rename to app-android/misc/res/calculatorpp/17_hints_tab.png diff --git a/calculatorpp/misc/res/calculatorpp/18_preferences.png b/app-android/misc/res/calculatorpp/18_preferences.png similarity index 100% rename from calculatorpp/misc/res/calculatorpp/18_preferences.png rename to app-android/misc/res/calculatorpp/18_preferences.png diff --git a/calculatorpp/misc/res/calculatorpp/18_preferences_02.png b/app-android/misc/res/calculatorpp/18_preferences_02.png similarity index 100% rename from calculatorpp/misc/res/calculatorpp/18_preferences_02.png rename to app-android/misc/res/calculatorpp/18_preferences_02.png diff --git a/calculatorpp/misc/res/calculatorpp/18_preferences_03.png b/app-android/misc/res/calculatorpp/18_preferences_03.png similarity index 100% rename from calculatorpp/misc/res/calculatorpp/18_preferences_03.png rename to app-android/misc/res/calculatorpp/18_preferences_03.png diff --git a/calculatorpp/misc/res/calculatorpp/18_preferences_sm.png b/app-android/misc/res/calculatorpp/18_preferences_sm.png similarity index 100% rename from calculatorpp/misc/res/calculatorpp/18_preferences_sm.png rename to app-android/misc/res/calculatorpp/18_preferences_sm.png diff --git a/calculatorpp/misc/res/calculatorpp/plan.png b/app-android/misc/res/calculatorpp/plan.png similarity index 100% rename from calculatorpp/misc/res/calculatorpp/plan.png rename to app-android/misc/res/calculatorpp/plan.png diff --git a/calculatorpp/misc/res/calculatorpp/plan.xcf b/app-android/misc/res/calculatorpp/plan.xcf similarity index 100% rename from calculatorpp/misc/res/calculatorpp/plan.xcf rename to app-android/misc/res/calculatorpp/plan.xcf diff --git a/calculatorpp/misc/res/icon-green.png b/app-android/misc/res/icon-green.png old mode 100755 new mode 100644 similarity index 100% rename from calculatorpp/misc/res/icon-green.png rename to app-android/misc/res/icon-green.png diff --git a/calculatorpp/misc/res/icon-hi-res.png b/app-android/misc/res/icon-hi-res.png similarity index 100% rename from calculatorpp/misc/res/icon-hi-res.png rename to app-android/misc/res/icon-hi-res.png diff --git a/calculatorpp/misc/res/icon-promo.png b/app-android/misc/res/icon-promo.png similarity index 100% rename from calculatorpp/misc/res/icon-promo.png rename to app-android/misc/res/icon-promo.png diff --git a/calculatorpp/misc/res/icon.png b/app-android/misc/res/icon.png old mode 100755 new mode 100644 similarity index 100% rename from calculatorpp/misc/res/icon.png rename to app-android/misc/res/icon.png diff --git a/calculatorpp/misc/res/kb_facebook.png b/app-android/misc/res/kb_facebook.png similarity index 100% rename from calculatorpp/misc/res/kb_facebook.png rename to app-android/misc/res/kb_facebook.png diff --git a/calculatorpp/misc/res/kb_facebook_icon.png b/app-android/misc/res/kb_facebook_icon.png similarity index 100% rename from calculatorpp/misc/res/kb_facebook_icon.png rename to app-android/misc/res/kb_facebook_icon.png diff --git a/calculatorpp/misc/res/logo-admob.png b/app-android/misc/res/logo-admob.png similarity index 100% rename from calculatorpp/misc/res/logo-admob.png rename to app-android/misc/res/logo-admob.png diff --git a/calculatorpp/misc/res/logo-scaled.png b/app-android/misc/res/logo-scaled.png similarity index 100% rename from calculatorpp/misc/res/logo-scaled.png rename to app-android/misc/res/logo-scaled.png diff --git a/calculatorpp/misc/res/logo-small.png b/app-android/misc/res/logo-small.png similarity index 100% rename from calculatorpp/misc/res/logo-small.png rename to app-android/misc/res/logo-small.png diff --git a/calculatorpp/misc/res/logo.cdr b/app-android/misc/res/logo.cdr old mode 100755 new mode 100644 similarity index 100% rename from calculatorpp/misc/res/logo.cdr rename to app-android/misc/res/logo.cdr diff --git a/calculatorpp/misc/res/logo.png b/app-android/misc/res/logo.png old mode 100755 new mode 100644 similarity index 100% rename from calculatorpp/misc/res/logo.png rename to app-android/misc/res/logo.png diff --git a/calculatorpp/misc/res/widget.png b/app-android/misc/res/widget.png similarity index 100% rename from calculatorpp/misc/res/widget.png rename to app-android/misc/res/widget.png diff --git a/calculatorpp/misc/res/work/Backup_of_logo.cdr b/app-android/misc/res/work/Backup_of_logo.cdr similarity index 100% rename from calculatorpp/misc/res/work/Backup_of_logo.cdr rename to app-android/misc/res/work/Backup_of_logo.cdr diff --git a/calculatorpp/misc/res/work/header.png b/app-android/misc/res/work/header.png similarity index 100% rename from calculatorpp/misc/res/work/header.png rename to app-android/misc/res/work/header.png diff --git a/calculatorpp/misc/res/work/header_bg.png b/app-android/misc/res/work/header_bg.png similarity index 100% rename from calculatorpp/misc/res/work/header_bg.png rename to app-android/misc/res/work/header_bg.png diff --git a/calculatorpp/misc/res/work/header_sm.png b/app-android/misc/res/work/header_sm.png similarity index 100% rename from calculatorpp/misc/res/work/header_sm.png rename to app-android/misc/res/work/header_sm.png diff --git a/calculatorpp/misc/res/work/heart_original.png b/app-android/misc/res/work/heart_original.png similarity index 100% rename from calculatorpp/misc/res/work/heart_original.png rename to app-android/misc/res/work/heart_original.png diff --git a/calculatorpp/misc/res/work/icon.png b/app-android/misc/res/work/icon.png similarity index 100% rename from calculatorpp/misc/res/work/icon.png rename to app-android/misc/res/work/icon.png diff --git a/calculatorpp/misc/res/work/icon_favicon_light_blue.ico b/app-android/misc/res/work/icon_favicon_light_blue.ico similarity index 100% rename from calculatorpp/misc/res/work/icon_favicon_light_blue.ico rename to app-android/misc/res/work/icon_favicon_light_blue.ico diff --git a/calculatorpp/misc/res/work/icon_favicon_light_blue.png b/app-android/misc/res/work/icon_favicon_light_blue.png similarity index 100% rename from calculatorpp/misc/res/work/icon_favicon_light_blue.png rename to app-android/misc/res/work/icon_favicon_light_blue.png diff --git a/calculatorpp/misc/res/work/icon_favicon_purple.ico b/app-android/misc/res/work/icon_favicon_purple.ico similarity index 100% rename from calculatorpp/misc/res/work/icon_favicon_purple.ico rename to app-android/misc/res/work/icon_favicon_purple.ico diff --git a/calculatorpp/misc/res/work/icon_small.png b/app-android/misc/res/work/icon_small.png similarity index 100% rename from calculatorpp/misc/res/work/icon_small.png rename to app-android/misc/res/work/icon_small.png diff --git a/calculatorpp/misc/res/work/log11o.psd b/app-android/misc/res/work/log11o.psd similarity index 100% rename from calculatorpp/misc/res/work/log11o.psd rename to app-android/misc/res/work/log11o.psd diff --git a/calculatorpp/misc/res/work/logo.cdr b/app-android/misc/res/work/logo.cdr similarity index 100% rename from calculatorpp/misc/res/work/logo.cdr rename to app-android/misc/res/work/logo.cdr diff --git a/calculatorpp/misc/res/work/logo.png b/app-android/misc/res/work/logo.png similarity index 100% rename from calculatorpp/misc/res/work/logo.png rename to app-android/misc/res/work/logo.png diff --git a/calculatorpp/misc/res/work/logoFULL copy.png b/app-android/misc/res/work/logoFULL copy.png similarity index 100% rename from calculatorpp/misc/res/work/logoFULL copy.png rename to app-android/misc/res/work/logoFULL copy.png diff --git a/calculatorpp/misc/res/work/logoFULL.pdf b/app-android/misc/res/work/logoFULL.pdf similarity index 100% rename from calculatorpp/misc/res/work/logoFULL.pdf rename to app-android/misc/res/work/logoFULL.pdf diff --git a/calculatorpp/misc/res/work/logoFULL.png b/app-android/misc/res/work/logoFULL.png similarity index 100% rename from calculatorpp/misc/res/work/logoFULL.png rename to app-android/misc/res/work/logoFULL.png diff --git a/calculatorpp/misc/res/work/logoFULL_banner.png b/app-android/misc/res/work/logoFULL_banner.png similarity index 100% rename from calculatorpp/misc/res/work/logoFULL_banner.png rename to app-android/misc/res/work/logoFULL_banner.png diff --git a/calculatorpp/misc/res/work/logoFULL_small.png b/app-android/misc/res/work/logoFULL_small.png similarity index 100% rename from calculatorpp/misc/res/work/logoFULL_small.png rename to app-android/misc/res/work/logoFULL_small.png diff --git a/calculatorpp/misc/res/work/logo_black.png b/app-android/misc/res/work/logo_black.png similarity index 100% rename from calculatorpp/misc/res/work/logo_black.png rename to app-android/misc/res/work/logo_black.png diff --git a/calculatorpp/misc/res/work/logo_blue.png b/app-android/misc/res/work/logo_blue.png similarity index 100% rename from calculatorpp/misc/res/work/logo_blue.png rename to app-android/misc/res/work/logo_blue.png diff --git a/calculatorpp/misc/res/work/logo_light_blue.png b/app-android/misc/res/work/logo_light_blue.png similarity index 100% rename from calculatorpp/misc/res/work/logo_light_blue.png rename to app-android/misc/res/work/logo_light_blue.png diff --git a/calculatorpp/misc/res/work/logo_purple.png b/app-android/misc/res/work/logo_purple.png similarity index 100% rename from calculatorpp/misc/res/work/logo_purple.png rename to app-android/misc/res/work/logo_purple.png diff --git a/calculatorpp/misc/res/work/promo_logo.png b/app-android/misc/res/work/promo_logo.png similarity index 100% rename from calculatorpp/misc/res/work/promo_logo.png rename to app-android/misc/res/work/promo_logo.png diff --git a/calculatorpp/misc/res/work/text_logo.png b/app-android/misc/res/work/text_logo.png similarity index 100% rename from calculatorpp/misc/res/work/text_logo.png rename to app-android/misc/res/work/text_logo.png diff --git a/calculatorpp/misc/res/work/text_logo_blue.png b/app-android/misc/res/work/text_logo_blue.png similarity index 100% rename from calculatorpp/misc/res/work/text_logo_blue.png rename to app-android/misc/res/work/text_logo_blue.png diff --git a/calculatorpp/misc/res/work/text_logo_light_blue.png b/app-android/misc/res/work/text_logo_light_blue.png similarity index 100% rename from calculatorpp/misc/res/work/text_logo_light_blue.png rename to app-android/misc/res/work/text_logo_light_blue.png diff --git a/calculatorpp/misc/res/work/text_logo_light_blue_cpp_forum.png b/app-android/misc/res/work/text_logo_light_blue_cpp_forum.png similarity index 100% rename from calculatorpp/misc/res/work/text_logo_light_blue_cpp_forum.png rename to app-android/misc/res/work/text_logo_light_blue_cpp_forum.png diff --git a/calculatorpp/misc/res/work/text_logo_purple.png b/app-android/misc/res/work/text_logo_purple.png similarity index 100% rename from calculatorpp/misc/res/work/text_logo_purple.png rename to app-android/misc/res/work/text_logo_purple.png diff --git a/calculatorpp/misc/src/achartengine-0.7.0.jar b/app-android/misc/src/achartengine-0.7.0.jar similarity index 100% rename from calculatorpp/misc/src/achartengine-0.7.0.jar rename to app-android/misc/src/achartengine-0.7.0.jar diff --git a/calculatorpp/misc/src/bsh.jar b/app-android/misc/src/bsh.jar similarity index 100% rename from calculatorpp/misc/src/bsh.jar rename to app-android/misc/src/bsh.jar diff --git a/calculatorpp/pom.xml b/app-android/pom.xml similarity index 99% rename from calculatorpp/pom.xml rename to app-android/pom.xml index d01ac953..a40e5f96 100644 --- a/calculatorpp/pom.xml +++ b/app-android/pom.xml @@ -10,7 +10,7 @@ 4.0.0 org.solovyev.android - calculatorpp + calculatorpp-app-android apk Calculator++ Application diff --git a/calculatorpp/proguard.cfg b/app-android/proguard.cfg similarity index 100% rename from calculatorpp/proguard.cfg rename to app-android/proguard.cfg diff --git a/calculatorpp/project.properties b/app-android/project.properties similarity index 100% rename from calculatorpp/project.properties rename to app-android/project.properties diff --git a/calculatorpp/res/drawable-hdpi/ab_add.png b/app-android/res/drawable-hdpi/ab_add.png similarity index 100% rename from calculatorpp/res/drawable-hdpi/ab_add.png rename to app-android/res/drawable-hdpi/ab_add.png diff --git a/calculatorpp/res/drawable-hdpi/ab_icon.png b/app-android/res/drawable-hdpi/ab_icon.png similarity index 100% rename from calculatorpp/res/drawable-hdpi/ab_icon.png rename to app-android/res/drawable-hdpi/ab_icon.png diff --git a/calculatorpp/res/drawable-hdpi/ab_icon_long.png b/app-android/res/drawable-hdpi/ab_icon_long.png similarity index 100% rename from calculatorpp/res/drawable-hdpi/ab_icon_long.png rename to app-android/res/drawable-hdpi/ab_icon_long.png diff --git a/calculatorpp/res/drawable-hdpi/ab_settings.png b/app-android/res/drawable-hdpi/ab_settings.png similarity index 100% rename from calculatorpp/res/drawable-hdpi/ab_settings.png rename to app-android/res/drawable-hdpi/ab_settings.png diff --git a/calculatorpp/res/drawable-hdpi/icon.png b/app-android/res/drawable-hdpi/icon.png similarity index 100% rename from calculatorpp/res/drawable-hdpi/icon.png rename to app-android/res/drawable-hdpi/icon.png diff --git a/calculatorpp/res/drawable-hdpi/icon_onscreen.png b/app-android/res/drawable-hdpi/icon_onscreen.png similarity index 100% rename from calculatorpp/res/drawable-hdpi/icon_onscreen.png rename to app-android/res/drawable-hdpi/icon_onscreen.png diff --git a/calculatorpp/res/drawable-hdpi/kb_copy.png b/app-android/res/drawable-hdpi/kb_copy.png similarity index 100% rename from calculatorpp/res/drawable-hdpi/kb_copy.png rename to app-android/res/drawable-hdpi/kb_copy.png diff --git a/calculatorpp/res/drawable-hdpi/kb_delete.png b/app-android/res/drawable-hdpi/kb_delete.png similarity index 100% rename from calculatorpp/res/drawable-hdpi/kb_delete.png rename to app-android/res/drawable-hdpi/kb_delete.png diff --git a/calculatorpp/res/drawable-hdpi/kb_facebook.png b/app-android/res/drawable-hdpi/kb_facebook.png similarity index 100% rename from calculatorpp/res/drawable-hdpi/kb_facebook.png rename to app-android/res/drawable-hdpi/kb_facebook.png diff --git a/calculatorpp/res/drawable-hdpi/kb_heart.png b/app-android/res/drawable-hdpi/kb_heart.png similarity index 100% rename from calculatorpp/res/drawable-hdpi/kb_heart.png rename to app-android/res/drawable-hdpi/kb_heart.png diff --git a/calculatorpp/res/drawable-hdpi/kb_logo.png b/app-android/res/drawable-hdpi/kb_logo.png similarity index 100% rename from calculatorpp/res/drawable-hdpi/kb_logo.png rename to app-android/res/drawable-hdpi/kb_logo.png diff --git a/calculatorpp/res/drawable-hdpi/kb_paste.png b/app-android/res/drawable-hdpi/kb_paste.png similarity index 100% rename from calculatorpp/res/drawable-hdpi/kb_paste.png rename to app-android/res/drawable-hdpi/kb_paste.png diff --git a/calculatorpp/res/drawable-hdpi/kb_settings.png b/app-android/res/drawable-hdpi/kb_settings.png similarity index 100% rename from calculatorpp/res/drawable-hdpi/kb_settings.png rename to app-android/res/drawable-hdpi/kb_settings.png diff --git a/calculatorpp/res/drawable-hdpi/logo.png b/app-android/res/drawable-hdpi/logo.png similarity index 100% rename from calculatorpp/res/drawable-hdpi/logo.png rename to app-android/res/drawable-hdpi/logo.png diff --git a/calculatorpp/res/drawable-ldpi/ab_add.png b/app-android/res/drawable-ldpi/ab_add.png similarity index 100% rename from calculatorpp/res/drawable-ldpi/ab_add.png rename to app-android/res/drawable-ldpi/ab_add.png diff --git a/calculatorpp/res/drawable-ldpi/ab_icon.png b/app-android/res/drawable-ldpi/ab_icon.png similarity index 100% rename from calculatorpp/res/drawable-ldpi/ab_icon.png rename to app-android/res/drawable-ldpi/ab_icon.png diff --git a/calculatorpp/res/drawable-ldpi/ab_settings.png b/app-android/res/drawable-ldpi/ab_settings.png similarity index 100% rename from calculatorpp/res/drawable-ldpi/ab_settings.png rename to app-android/res/drawable-ldpi/ab_settings.png diff --git a/calculatorpp/res/drawable-ldpi/icon.png b/app-android/res/drawable-ldpi/icon.png similarity index 100% rename from calculatorpp/res/drawable-ldpi/icon.png rename to app-android/res/drawable-ldpi/icon.png diff --git a/calculatorpp/res/drawable-ldpi/icon_onscreen.png b/app-android/res/drawable-ldpi/icon_onscreen.png similarity index 100% rename from calculatorpp/res/drawable-ldpi/icon_onscreen.png rename to app-android/res/drawable-ldpi/icon_onscreen.png diff --git a/calculatorpp/res/drawable-ldpi/kb_copy.png b/app-android/res/drawable-ldpi/kb_copy.png similarity index 100% rename from calculatorpp/res/drawable-ldpi/kb_copy.png rename to app-android/res/drawable-ldpi/kb_copy.png diff --git a/calculatorpp/res/drawable-ldpi/kb_delete.png b/app-android/res/drawable-ldpi/kb_delete.png similarity index 100% rename from calculatorpp/res/drawable-ldpi/kb_delete.png rename to app-android/res/drawable-ldpi/kb_delete.png diff --git a/calculatorpp/res/drawable-ldpi/kb_facebook.png b/app-android/res/drawable-ldpi/kb_facebook.png similarity index 100% rename from calculatorpp/res/drawable-ldpi/kb_facebook.png rename to app-android/res/drawable-ldpi/kb_facebook.png diff --git a/calculatorpp/res/drawable-ldpi/kb_heart.png b/app-android/res/drawable-ldpi/kb_heart.png similarity index 100% rename from calculatorpp/res/drawable-ldpi/kb_heart.png rename to app-android/res/drawable-ldpi/kb_heart.png diff --git a/calculatorpp/res/drawable-ldpi/kb_logo.png b/app-android/res/drawable-ldpi/kb_logo.png similarity index 100% rename from calculatorpp/res/drawable-ldpi/kb_logo.png rename to app-android/res/drawable-ldpi/kb_logo.png diff --git a/calculatorpp/res/drawable-ldpi/kb_paste.png b/app-android/res/drawable-ldpi/kb_paste.png similarity index 100% rename from calculatorpp/res/drawable-ldpi/kb_paste.png rename to app-android/res/drawable-ldpi/kb_paste.png diff --git a/calculatorpp/res/drawable-ldpi/kb_settings.png b/app-android/res/drawable-ldpi/kb_settings.png similarity index 100% rename from calculatorpp/res/drawable-ldpi/kb_settings.png rename to app-android/res/drawable-ldpi/kb_settings.png diff --git a/calculatorpp/res/drawable-ldpi/logo.png b/app-android/res/drawable-ldpi/logo.png similarity index 100% rename from calculatorpp/res/drawable-ldpi/logo.png rename to app-android/res/drawable-ldpi/logo.png diff --git a/calculatorpp/res/drawable-mdpi/ab_add.png b/app-android/res/drawable-mdpi/ab_add.png old mode 100755 new mode 100644 similarity index 100% rename from calculatorpp/res/drawable-mdpi/ab_add.png rename to app-android/res/drawable-mdpi/ab_add.png diff --git a/calculatorpp/res/drawable-mdpi/ab_icon.png b/app-android/res/drawable-mdpi/ab_icon.png similarity index 100% rename from calculatorpp/res/drawable-mdpi/ab_icon.png rename to app-android/res/drawable-mdpi/ab_icon.png diff --git a/calculatorpp/res/drawable-mdpi/ab_settings.png b/app-android/res/drawable-mdpi/ab_settings.png similarity index 100% rename from calculatorpp/res/drawable-mdpi/ab_settings.png rename to app-android/res/drawable-mdpi/ab_settings.png diff --git a/calculatorpp/res/drawable-mdpi/icon.png b/app-android/res/drawable-mdpi/icon.png similarity index 100% rename from calculatorpp/res/drawable-mdpi/icon.png rename to app-android/res/drawable-mdpi/icon.png diff --git a/calculatorpp/res/drawable-mdpi/icon_onscreen.png b/app-android/res/drawable-mdpi/icon_onscreen.png similarity index 100% rename from calculatorpp/res/drawable-mdpi/icon_onscreen.png rename to app-android/res/drawable-mdpi/icon_onscreen.png diff --git a/calculatorpp/res/drawable-mdpi/kb_copy.png b/app-android/res/drawable-mdpi/kb_copy.png similarity index 100% rename from calculatorpp/res/drawable-mdpi/kb_copy.png rename to app-android/res/drawable-mdpi/kb_copy.png diff --git a/calculatorpp/res/drawable-mdpi/kb_delete.png b/app-android/res/drawable-mdpi/kb_delete.png similarity index 100% rename from calculatorpp/res/drawable-mdpi/kb_delete.png rename to app-android/res/drawable-mdpi/kb_delete.png diff --git a/calculatorpp/res/drawable-mdpi/kb_facebook.png b/app-android/res/drawable-mdpi/kb_facebook.png similarity index 100% rename from calculatorpp/res/drawable-mdpi/kb_facebook.png rename to app-android/res/drawable-mdpi/kb_facebook.png diff --git a/calculatorpp/res/drawable-mdpi/kb_heart.png b/app-android/res/drawable-mdpi/kb_heart.png similarity index 100% rename from calculatorpp/res/drawable-mdpi/kb_heart.png rename to app-android/res/drawable-mdpi/kb_heart.png diff --git a/calculatorpp/res/drawable-mdpi/kb_logo.png b/app-android/res/drawable-mdpi/kb_logo.png similarity index 100% rename from calculatorpp/res/drawable-mdpi/kb_logo.png rename to app-android/res/drawable-mdpi/kb_logo.png diff --git a/calculatorpp/res/drawable-mdpi/kb_paste.png b/app-android/res/drawable-mdpi/kb_paste.png similarity index 100% rename from calculatorpp/res/drawable-mdpi/kb_paste.png rename to app-android/res/drawable-mdpi/kb_paste.png diff --git a/calculatorpp/res/drawable-mdpi/kb_settings.png b/app-android/res/drawable-mdpi/kb_settings.png similarity index 100% rename from calculatorpp/res/drawable-mdpi/kb_settings.png rename to app-android/res/drawable-mdpi/kb_settings.png diff --git a/calculatorpp/res/drawable-mdpi/logo.png b/app-android/res/drawable-mdpi/logo.png similarity index 100% rename from calculatorpp/res/drawable-mdpi/logo.png rename to app-android/res/drawable-mdpi/logo.png diff --git a/calculatorpp/res/drawable-nodpi/cpp_onscreen_button_close.png b/app-android/res/drawable-nodpi/cpp_onscreen_button_close.png similarity index 100% rename from calculatorpp/res/drawable-nodpi/cpp_onscreen_button_close.png rename to app-android/res/drawable-nodpi/cpp_onscreen_button_close.png diff --git a/calculatorpp/res/drawable-nodpi/cpp_onscreen_button_fold.png b/app-android/res/drawable-nodpi/cpp_onscreen_button_fold.png similarity index 100% rename from calculatorpp/res/drawable-nodpi/cpp_onscreen_button_fold.png rename to app-android/res/drawable-nodpi/cpp_onscreen_button_fold.png diff --git a/calculatorpp/res/drawable-nodpi/cpp_onscreen_button_minimize.png b/app-android/res/drawable-nodpi/cpp_onscreen_button_minimize.png similarity index 100% rename from calculatorpp/res/drawable-nodpi/cpp_onscreen_button_minimize.png rename to app-android/res/drawable-nodpi/cpp_onscreen_button_minimize.png diff --git a/calculatorpp/res/drawable-nodpi/cpp_onscreen_header_logo.png b/app-android/res/drawable-nodpi/cpp_onscreen_header_logo.png similarity index 100% rename from calculatorpp/res/drawable-nodpi/cpp_onscreen_header_logo.png rename to app-android/res/drawable-nodpi/cpp_onscreen_header_logo.png diff --git a/calculatorpp/res/drawable-nodpi/default_abs__ab_transparent_dark_holo.9.png b/app-android/res/drawable-nodpi/default_abs__ab_transparent_dark_holo.9.png similarity index 100% rename from calculatorpp/res/drawable-nodpi/default_abs__ab_transparent_dark_holo.9.png rename to app-android/res/drawable-nodpi/default_abs__ab_transparent_dark_holo.9.png diff --git a/calculatorpp/res/drawable-nodpi/default_abs__btn_cab_done_default_holo_dark.9.png b/app-android/res/drawable-nodpi/default_abs__btn_cab_done_default_holo_dark.9.png similarity index 100% rename from calculatorpp/res/drawable-nodpi/default_abs__btn_cab_done_default_holo_dark.9.png rename to app-android/res/drawable-nodpi/default_abs__btn_cab_done_default_holo_dark.9.png diff --git a/calculatorpp/res/drawable-nodpi/default_abs__btn_cab_done_focused_holo_dark.9.png b/app-android/res/drawable-nodpi/default_abs__btn_cab_done_focused_holo_dark.9.png similarity index 100% rename from calculatorpp/res/drawable-nodpi/default_abs__btn_cab_done_focused_holo_dark.9.png rename to app-android/res/drawable-nodpi/default_abs__btn_cab_done_focused_holo_dark.9.png diff --git a/calculatorpp/res/drawable-nodpi/default_abs__btn_cab_done_pressed_holo_dark.9.png b/app-android/res/drawable-nodpi/default_abs__btn_cab_done_pressed_holo_dark.9.png similarity index 100% rename from calculatorpp/res/drawable-nodpi/default_abs__btn_cab_done_pressed_holo_dark.9.png rename to app-android/res/drawable-nodpi/default_abs__btn_cab_done_pressed_holo_dark.9.png diff --git a/calculatorpp/res/drawable-nodpi/default_abs__list_focused_holo.9.png b/app-android/res/drawable-nodpi/default_abs__list_focused_holo.9.png similarity index 100% rename from calculatorpp/res/drawable-nodpi/default_abs__list_focused_holo.9.png rename to app-android/res/drawable-nodpi/default_abs__list_focused_holo.9.png diff --git a/calculatorpp/res/drawable-nodpi/default_abs__list_longpressed_holo.9.png b/app-android/res/drawable-nodpi/default_abs__list_longpressed_holo.9.png similarity index 100% rename from calculatorpp/res/drawable-nodpi/default_abs__list_longpressed_holo.9.png rename to app-android/res/drawable-nodpi/default_abs__list_longpressed_holo.9.png diff --git a/calculatorpp/res/drawable-nodpi/default_abs__list_pressed_holo_dark.9.png b/app-android/res/drawable-nodpi/default_abs__list_pressed_holo_dark.9.png similarity index 100% rename from calculatorpp/res/drawable-nodpi/default_abs__list_pressed_holo_dark.9.png rename to app-android/res/drawable-nodpi/default_abs__list_pressed_holo_dark.9.png diff --git a/calculatorpp/res/drawable-nodpi/default_abs__spinner_ab_focused_holo_dark.9.png b/app-android/res/drawable-nodpi/default_abs__spinner_ab_focused_holo_dark.9.png similarity index 100% rename from calculatorpp/res/drawable-nodpi/default_abs__spinner_ab_focused_holo_dark.9.png rename to app-android/res/drawable-nodpi/default_abs__spinner_ab_focused_holo_dark.9.png diff --git a/calculatorpp/res/drawable-nodpi/default_abs__spinner_ab_pressed_holo_dark.9.png b/app-android/res/drawable-nodpi/default_abs__spinner_ab_pressed_holo_dark.9.png similarity index 100% rename from calculatorpp/res/drawable-nodpi/default_abs__spinner_ab_pressed_holo_dark.9.png rename to app-android/res/drawable-nodpi/default_abs__spinner_ab_pressed_holo_dark.9.png diff --git a/calculatorpp/res/drawable-nodpi/default_abs__tab_selected_focused_holo.9.png b/app-android/res/drawable-nodpi/default_abs__tab_selected_focused_holo.9.png similarity index 100% rename from calculatorpp/res/drawable-nodpi/default_abs__tab_selected_focused_holo.9.png rename to app-android/res/drawable-nodpi/default_abs__tab_selected_focused_holo.9.png diff --git a/calculatorpp/res/drawable-nodpi/default_abs__tab_selected_holo.9.png b/app-android/res/drawable-nodpi/default_abs__tab_selected_holo.9.png similarity index 100% rename from calculatorpp/res/drawable-nodpi/default_abs__tab_selected_holo.9.png rename to app-android/res/drawable-nodpi/default_abs__tab_selected_holo.9.png diff --git a/calculatorpp/res/drawable-nodpi/default_abs__tab_selected_pressed_holo.9.png b/app-android/res/drawable-nodpi/default_abs__tab_selected_pressed_holo.9.png similarity index 100% rename from calculatorpp/res/drawable-nodpi/default_abs__tab_selected_pressed_holo.9.png rename to app-android/res/drawable-nodpi/default_abs__tab_selected_pressed_holo.9.png diff --git a/calculatorpp/res/drawable-nodpi/default_abs__tab_unselected_pressed_holo.9.png b/app-android/res/drawable-nodpi/default_abs__tab_unselected_pressed_holo.9.png similarity index 100% rename from calculatorpp/res/drawable-nodpi/default_abs__tab_unselected_pressed_holo.9.png rename to app-android/res/drawable-nodpi/default_abs__tab_unselected_pressed_holo.9.png diff --git a/calculatorpp/res/drawable-nodpi/metro_blue_abs__ab_transparent_dark_holo.9.png b/app-android/res/drawable-nodpi/metro_blue_abs__ab_transparent_dark_holo.9.png similarity index 100% rename from calculatorpp/res/drawable-nodpi/metro_blue_abs__ab_transparent_dark_holo.9.png rename to app-android/res/drawable-nodpi/metro_blue_abs__ab_transparent_dark_holo.9.png diff --git a/calculatorpp/res/drawable-nodpi/metro_blue_abs__list_focused_holo.9.png b/app-android/res/drawable-nodpi/metro_blue_abs__list_focused_holo.9.png similarity index 100% rename from calculatorpp/res/drawable-nodpi/metro_blue_abs__list_focused_holo.9.png rename to app-android/res/drawable-nodpi/metro_blue_abs__list_focused_holo.9.png diff --git a/calculatorpp/res/drawable-nodpi/metro_blue_abs__list_pressed_holo_dark.9.png b/app-android/res/drawable-nodpi/metro_blue_abs__list_pressed_holo_dark.9.png similarity index 100% rename from calculatorpp/res/drawable-nodpi/metro_blue_abs__list_pressed_holo_dark.9.png rename to app-android/res/drawable-nodpi/metro_blue_abs__list_pressed_holo_dark.9.png diff --git a/calculatorpp/res/drawable-nodpi/metro_blue_abs__tab_selected_focused_holo.9.png b/app-android/res/drawable-nodpi/metro_blue_abs__tab_selected_focused_holo.9.png similarity index 100% rename from calculatorpp/res/drawable-nodpi/metro_blue_abs__tab_selected_focused_holo.9.png rename to app-android/res/drawable-nodpi/metro_blue_abs__tab_selected_focused_holo.9.png diff --git a/calculatorpp/res/drawable-nodpi/metro_blue_abs__tab_selected_holo.9.png b/app-android/res/drawable-nodpi/metro_blue_abs__tab_selected_holo.9.png similarity index 100% rename from calculatorpp/res/drawable-nodpi/metro_blue_abs__tab_selected_holo.9.png rename to app-android/res/drawable-nodpi/metro_blue_abs__tab_selected_holo.9.png diff --git a/calculatorpp/res/drawable-nodpi/metro_blue_abs__tab_selected_pressed_holo.9.png b/app-android/res/drawable-nodpi/metro_blue_abs__tab_selected_pressed_holo.9.png similarity index 100% rename from calculatorpp/res/drawable-nodpi/metro_blue_abs__tab_selected_pressed_holo.9.png rename to app-android/res/drawable-nodpi/metro_blue_abs__tab_selected_pressed_holo.9.png diff --git a/calculatorpp/res/drawable-nodpi/metro_blue_abs__tab_unselected_pressed_holo.9.png b/app-android/res/drawable-nodpi/metro_blue_abs__tab_unselected_pressed_holo.9.png similarity index 100% rename from calculatorpp/res/drawable-nodpi/metro_blue_abs__tab_unselected_pressed_holo.9.png rename to app-android/res/drawable-nodpi/metro_blue_abs__tab_unselected_pressed_holo.9.png diff --git a/calculatorpp/res/drawable-nodpi/widget_preview.png b/app-android/res/drawable-nodpi/widget_preview.png similarity index 100% rename from calculatorpp/res/drawable-nodpi/widget_preview.png rename to app-android/res/drawable-nodpi/widget_preview.png diff --git a/calculatorpp/res/drawable-xhdpi/ab_add.png b/app-android/res/drawable-xhdpi/ab_add.png similarity index 100% rename from calculatorpp/res/drawable-xhdpi/ab_add.png rename to app-android/res/drawable-xhdpi/ab_add.png diff --git a/calculatorpp/res/drawable-xhdpi/ab_icon.png b/app-android/res/drawable-xhdpi/ab_icon.png similarity index 100% rename from calculatorpp/res/drawable-xhdpi/ab_icon.png rename to app-android/res/drawable-xhdpi/ab_icon.png diff --git a/calculatorpp/res/drawable-xhdpi/ab_settings.png b/app-android/res/drawable-xhdpi/ab_settings.png similarity index 100% rename from calculatorpp/res/drawable-xhdpi/ab_settings.png rename to app-android/res/drawable-xhdpi/ab_settings.png diff --git a/calculatorpp/res/drawable-xhdpi/ic_menu_preferences.png b/app-android/res/drawable-xhdpi/ic_menu_preferences.png old mode 100755 new mode 100644 similarity index 100% rename from calculatorpp/res/drawable-xhdpi/ic_menu_preferences.png rename to app-android/res/drawable-xhdpi/ic_menu_preferences.png diff --git a/calculatorpp/res/drawable-xhdpi/icon.png b/app-android/res/drawable-xhdpi/icon.png similarity index 100% rename from calculatorpp/res/drawable-xhdpi/icon.png rename to app-android/res/drawable-xhdpi/icon.png diff --git a/calculatorpp/res/drawable-xhdpi/icon_onscreen.png b/app-android/res/drawable-xhdpi/icon_onscreen.png similarity index 100% rename from calculatorpp/res/drawable-xhdpi/icon_onscreen.png rename to app-android/res/drawable-xhdpi/icon_onscreen.png diff --git a/calculatorpp/res/drawable-xhdpi/kb_copy.png b/app-android/res/drawable-xhdpi/kb_copy.png similarity index 100% rename from calculatorpp/res/drawable-xhdpi/kb_copy.png rename to app-android/res/drawable-xhdpi/kb_copy.png diff --git a/calculatorpp/res/drawable-xhdpi/kb_delete.png b/app-android/res/drawable-xhdpi/kb_delete.png similarity index 100% rename from calculatorpp/res/drawable-xhdpi/kb_delete.png rename to app-android/res/drawable-xhdpi/kb_delete.png diff --git a/calculatorpp/res/drawable-xhdpi/kb_facebook.png b/app-android/res/drawable-xhdpi/kb_facebook.png similarity index 100% rename from calculatorpp/res/drawable-xhdpi/kb_facebook.png rename to app-android/res/drawable-xhdpi/kb_facebook.png diff --git a/calculatorpp/res/drawable-xhdpi/kb_heart.png b/app-android/res/drawable-xhdpi/kb_heart.png similarity index 100% rename from calculatorpp/res/drawable-xhdpi/kb_heart.png rename to app-android/res/drawable-xhdpi/kb_heart.png diff --git a/calculatorpp/res/drawable-xhdpi/kb_logo.png b/app-android/res/drawable-xhdpi/kb_logo.png similarity index 100% rename from calculatorpp/res/drawable-xhdpi/kb_logo.png rename to app-android/res/drawable-xhdpi/kb_logo.png diff --git a/calculatorpp/res/drawable-xhdpi/kb_paste.png b/app-android/res/drawable-xhdpi/kb_paste.png similarity index 100% rename from calculatorpp/res/drawable-xhdpi/kb_paste.png rename to app-android/res/drawable-xhdpi/kb_paste.png diff --git a/calculatorpp/res/drawable-xhdpi/kb_settings.png b/app-android/res/drawable-xhdpi/kb_settings.png similarity index 100% rename from calculatorpp/res/drawable-xhdpi/kb_settings.png rename to app-android/res/drawable-xhdpi/kb_settings.png diff --git a/calculatorpp/res/drawable-xhdpi/logo.png b/app-android/res/drawable-xhdpi/logo.png similarity index 100% rename from calculatorpp/res/drawable-xhdpi/logo.png rename to app-android/res/drawable-xhdpi/logo.png diff --git a/calculatorpp/res/drawable-xlarge-hdpi/kb_copy.png b/app-android/res/drawable-xlarge-hdpi/kb_copy.png similarity index 100% rename from calculatorpp/res/drawable-xlarge-hdpi/kb_copy.png rename to app-android/res/drawable-xlarge-hdpi/kb_copy.png diff --git a/calculatorpp/res/drawable-xlarge-hdpi/kb_delete.png b/app-android/res/drawable-xlarge-hdpi/kb_delete.png similarity index 100% rename from calculatorpp/res/drawable-xlarge-hdpi/kb_delete.png rename to app-android/res/drawable-xlarge-hdpi/kb_delete.png diff --git a/calculatorpp/res/drawable-xlarge-hdpi/kb_facebook.png b/app-android/res/drawable-xlarge-hdpi/kb_facebook.png similarity index 100% rename from calculatorpp/res/drawable-xlarge-hdpi/kb_facebook.png rename to app-android/res/drawable-xlarge-hdpi/kb_facebook.png diff --git a/calculatorpp/res/drawable-xlarge-hdpi/kb_heart.png b/app-android/res/drawable-xlarge-hdpi/kb_heart.png similarity index 100% rename from calculatorpp/res/drawable-xlarge-hdpi/kb_heart.png rename to app-android/res/drawable-xlarge-hdpi/kb_heart.png diff --git a/calculatorpp/res/drawable-xlarge-hdpi/kb_logo.png b/app-android/res/drawable-xlarge-hdpi/kb_logo.png similarity index 100% rename from calculatorpp/res/drawable-xlarge-hdpi/kb_logo.png rename to app-android/res/drawable-xlarge-hdpi/kb_logo.png diff --git a/calculatorpp/res/drawable-xlarge-hdpi/kb_paste.png b/app-android/res/drawable-xlarge-hdpi/kb_paste.png similarity index 100% rename from calculatorpp/res/drawable-xlarge-hdpi/kb_paste.png rename to app-android/res/drawable-xlarge-hdpi/kb_paste.png diff --git a/calculatorpp/res/drawable-xlarge-hdpi/kb_settings.png b/app-android/res/drawable-xlarge-hdpi/kb_settings.png similarity index 100% rename from calculatorpp/res/drawable-xlarge-hdpi/kb_settings.png rename to app-android/res/drawable-xlarge-hdpi/kb_settings.png diff --git a/calculatorpp/res/drawable/blue_button.xml b/app-android/res/drawable/blue_button.xml similarity index 100% rename from calculatorpp/res/drawable/blue_button.xml rename to app-android/res/drawable/blue_button.xml diff --git a/calculatorpp/res/drawable/blue_button_dark.xml b/app-android/res/drawable/blue_button_dark.xml similarity index 100% rename from calculatorpp/res/drawable/blue_button_dark.xml rename to app-android/res/drawable/blue_button_dark.xml diff --git a/calculatorpp/res/drawable/blue_button_dark_shape.xml b/app-android/res/drawable/blue_button_dark_shape.xml similarity index 100% rename from calculatorpp/res/drawable/blue_button_dark_shape.xml rename to app-android/res/drawable/blue_button_dark_shape.xml diff --git a/calculatorpp/res/drawable/blue_button_shape.xml b/app-android/res/drawable/blue_button_shape.xml similarity index 100% rename from calculatorpp/res/drawable/blue_button_shape.xml rename to app-android/res/drawable/blue_button_shape.xml diff --git a/calculatorpp/res/drawable/default_abs__btn_cab_done_holo_dark.xml b/app-android/res/drawable/default_abs__btn_cab_done_holo_dark.xml similarity index 100% rename from calculatorpp/res/drawable/default_abs__btn_cab_done_holo_dark.xml rename to app-android/res/drawable/default_abs__btn_cab_done_holo_dark.xml diff --git a/calculatorpp/res/drawable/default_abs__item_background_holo_dark.xml b/app-android/res/drawable/default_abs__item_background_holo_dark.xml similarity index 100% rename from calculatorpp/res/drawable/default_abs__item_background_holo_dark.xml rename to app-android/res/drawable/default_abs__item_background_holo_dark.xml diff --git a/calculatorpp/res/drawable/default_abs__list_selector_background_transition_holo_dark.xml b/app-android/res/drawable/default_abs__list_selector_background_transition_holo_dark.xml similarity index 100% rename from calculatorpp/res/drawable/default_abs__list_selector_background_transition_holo_dark.xml rename to app-android/res/drawable/default_abs__list_selector_background_transition_holo_dark.xml diff --git a/calculatorpp/res/drawable/default_abs__list_selector_holo_dark.xml b/app-android/res/drawable/default_abs__list_selector_holo_dark.xml similarity index 100% rename from calculatorpp/res/drawable/default_abs__list_selector_holo_dark.xml rename to app-android/res/drawable/default_abs__list_selector_holo_dark.xml diff --git a/calculatorpp/res/drawable/default_abs__spinner_ab_holo_dark.xml b/app-android/res/drawable/default_abs__spinner_ab_holo_dark.xml similarity index 100% rename from calculatorpp/res/drawable/default_abs__spinner_ab_holo_dark.xml rename to app-android/res/drawable/default_abs__spinner_ab_holo_dark.xml diff --git a/calculatorpp/res/drawable/default_abs__tab_indicator_ab_holo.xml b/app-android/res/drawable/default_abs__tab_indicator_ab_holo.xml similarity index 100% rename from calculatorpp/res/drawable/default_abs__tab_indicator_ab_holo.xml rename to app-android/res/drawable/default_abs__tab_indicator_ab_holo.xml diff --git a/calculatorpp/res/drawable/gray_button.xml b/app-android/res/drawable/gray_button.xml similarity index 100% rename from calculatorpp/res/drawable/gray_button.xml rename to app-android/res/drawable/gray_button.xml diff --git a/calculatorpp/res/drawable/gray_button_dark.xml b/app-android/res/drawable/gray_button_dark.xml similarity index 100% rename from calculatorpp/res/drawable/gray_button_dark.xml rename to app-android/res/drawable/gray_button_dark.xml diff --git a/calculatorpp/res/drawable/gray_button_dark_shape.xml b/app-android/res/drawable/gray_button_dark_shape.xml similarity index 100% rename from calculatorpp/res/drawable/gray_button_dark_shape.xml rename to app-android/res/drawable/gray_button_dark_shape.xml diff --git a/calculatorpp/res/drawable/gray_button_shape.xml b/app-android/res/drawable/gray_button_shape.xml similarity index 100% rename from calculatorpp/res/drawable/gray_button_shape.xml rename to app-android/res/drawable/gray_button_shape.xml diff --git a/calculatorpp/res/drawable/metro_blue_abs__tab_indicator_ab_holo.xml b/app-android/res/drawable/metro_blue_abs__tab_indicator_ab_holo.xml similarity index 100% rename from calculatorpp/res/drawable/metro_blue_abs__tab_indicator_ab_holo.xml rename to app-android/res/drawable/metro_blue_abs__tab_indicator_ab_holo.xml diff --git a/calculatorpp/res/drawable/metro_blue_button.xml b/app-android/res/drawable/metro_blue_button.xml similarity index 100% rename from calculatorpp/res/drawable/metro_blue_button.xml rename to app-android/res/drawable/metro_blue_button.xml diff --git a/calculatorpp/res/drawable/metro_blue_button_shape.xml b/app-android/res/drawable/metro_blue_button_shape.xml similarity index 100% rename from calculatorpp/res/drawable/metro_blue_button_shape.xml rename to app-android/res/drawable/metro_blue_button_shape.xml diff --git a/calculatorpp/res/drawable/metro_blue_list_item.xml b/app-android/res/drawable/metro_blue_list_item.xml similarity index 100% rename from calculatorpp/res/drawable/metro_blue_list_item.xml rename to app-android/res/drawable/metro_blue_list_item.xml diff --git a/calculatorpp/res/drawable/metro_button_dark.xml b/app-android/res/drawable/metro_button_dark.xml similarity index 100% rename from calculatorpp/res/drawable/metro_button_dark.xml rename to app-android/res/drawable/metro_button_dark.xml diff --git a/calculatorpp/res/drawable/metro_button_dark_shape.xml b/app-android/res/drawable/metro_button_dark_shape.xml similarity index 100% rename from calculatorpp/res/drawable/metro_button_dark_shape.xml rename to app-android/res/drawable/metro_button_dark_shape.xml diff --git a/calculatorpp/res/drawable/metro_button_green.xml b/app-android/res/drawable/metro_button_green.xml similarity index 100% rename from calculatorpp/res/drawable/metro_button_green.xml rename to app-android/res/drawable/metro_button_green.xml diff --git a/calculatorpp/res/drawable/metro_button_green_shape.xml b/app-android/res/drawable/metro_button_green_shape.xml similarity index 100% rename from calculatorpp/res/drawable/metro_button_green_shape.xml rename to app-android/res/drawable/metro_button_green_shape.xml diff --git a/calculatorpp/res/drawable/metro_button_light.xml b/app-android/res/drawable/metro_button_light.xml similarity index 100% rename from calculatorpp/res/drawable/metro_button_light.xml rename to app-android/res/drawable/metro_button_light.xml diff --git a/calculatorpp/res/drawable/metro_button_light_shape.xml b/app-android/res/drawable/metro_button_light_shape.xml similarity index 100% rename from calculatorpp/res/drawable/metro_button_light_shape.xml rename to app-android/res/drawable/metro_button_light_shape.xml diff --git a/calculatorpp/res/drawable/metro_button_pressed.xml b/app-android/res/drawable/metro_button_pressed.xml similarity index 100% rename from calculatorpp/res/drawable/metro_button_pressed.xml rename to app-android/res/drawable/metro_button_pressed.xml diff --git a/calculatorpp/res/drawable/metro_button_purple.xml b/app-android/res/drawable/metro_button_purple.xml similarity index 100% rename from calculatorpp/res/drawable/metro_button_purple.xml rename to app-android/res/drawable/metro_button_purple.xml diff --git a/calculatorpp/res/drawable/metro_button_purple_shape.xml b/app-android/res/drawable/metro_button_purple_shape.xml similarity index 100% rename from calculatorpp/res/drawable/metro_button_purple_shape.xml rename to app-android/res/drawable/metro_button_purple_shape.xml diff --git a/calculatorpp/res/drawable/metro_green_list_item.xml b/app-android/res/drawable/metro_green_list_item.xml similarity index 100% rename from calculatorpp/res/drawable/metro_green_list_item.xml rename to app-android/res/drawable/metro_green_list_item.xml diff --git a/calculatorpp/res/drawable/metro_purple_list_item.xml b/app-android/res/drawable/metro_purple_list_item.xml similarity index 100% rename from calculatorpp/res/drawable/metro_purple_list_item.xml rename to app-android/res/drawable/metro_purple_list_item.xml diff --git a/calculatorpp/res/drawable/pane_background.xml b/app-android/res/drawable/pane_background.xml similarity index 100% rename from calculatorpp/res/drawable/pane_background.xml rename to app-android/res/drawable/pane_background.xml diff --git a/calculatorpp/res/drawable/violet_button.xml b/app-android/res/drawable/violet_button.xml similarity index 100% rename from calculatorpp/res/drawable/violet_button.xml rename to app-android/res/drawable/violet_button.xml diff --git a/calculatorpp/res/drawable/violet_button_dark.xml b/app-android/res/drawable/violet_button_dark.xml similarity index 100% rename from calculatorpp/res/drawable/violet_button_dark.xml rename to app-android/res/drawable/violet_button_dark.xml diff --git a/calculatorpp/res/drawable/violet_button_dark_shape.xml b/app-android/res/drawable/violet_button_dark_shape.xml similarity index 100% rename from calculatorpp/res/drawable/violet_button_dark_shape.xml rename to app-android/res/drawable/violet_button_dark_shape.xml diff --git a/calculatorpp/res/drawable/violet_button_shape.xml b/app-android/res/drawable/violet_button_shape.xml similarity index 100% rename from calculatorpp/res/drawable/violet_button_shape.xml rename to app-android/res/drawable/violet_button_shape.xml diff --git a/calculatorpp/res/layout-land/calc_keyboard.xml b/app-android/res/layout-land/calc_keyboard.xml similarity index 100% rename from calculatorpp/res/layout-land/calc_keyboard.xml rename to app-android/res/layout-land/calc_keyboard.xml diff --git a/calculatorpp/res/layout-land/calc_keyboard_mobile.xml b/app-android/res/layout-land/calc_keyboard_mobile.xml similarity index 100% rename from calculatorpp/res/layout-land/calc_keyboard_mobile.xml rename to app-android/res/layout-land/calc_keyboard_mobile.xml diff --git a/calculatorpp/res/layout-land/main_calculator.xml b/app-android/res/layout-land/main_calculator.xml similarity index 100% rename from calculatorpp/res/layout-land/main_calculator.xml rename to app-android/res/layout-land/main_calculator.xml diff --git a/calculatorpp/res/layout-land/main_calculator_mobile.xml b/app-android/res/layout-land/main_calculator_mobile.xml similarity index 100% rename from calculatorpp/res/layout-land/main_calculator_mobile.xml rename to app-android/res/layout-land/main_calculator_mobile.xml diff --git a/calculatorpp/res/layout-land/main_first_pane.xml b/app-android/res/layout-land/main_first_pane.xml similarity index 100% rename from calculatorpp/res/layout-land/main_first_pane.xml rename to app-android/res/layout-land/main_first_pane.xml diff --git a/calculatorpp/res/layout-land/main_first_pane_mobile.xml b/app-android/res/layout-land/main_first_pane_mobile.xml similarity index 100% rename from calculatorpp/res/layout-land/main_first_pane_mobile.xml rename to app-android/res/layout-land/main_first_pane_mobile.xml diff --git a/calculatorpp/res/layout-large-land/calc_keyboard.xml b/app-android/res/layout-large-land/calc_keyboard.xml similarity index 100% rename from calculatorpp/res/layout-large-land/calc_keyboard.xml rename to app-android/res/layout-large-land/calc_keyboard.xml diff --git a/calculatorpp/res/layout-large-land/main_calculator.xml b/app-android/res/layout-large-land/main_calculator.xml similarity index 100% rename from calculatorpp/res/layout-large-land/main_calculator.xml rename to app-android/res/layout-large-land/main_calculator.xml diff --git a/calculatorpp/res/layout-large/calc_display.xml b/app-android/res/layout-large/calc_display.xml similarity index 100% rename from calculatorpp/res/layout-large/calc_display.xml rename to app-android/res/layout-large/calc_display.xml diff --git a/calculatorpp/res/layout-large/calc_editor.xml b/app-android/res/layout-large/calc_editor.xml similarity index 100% rename from calculatorpp/res/layout-large/calc_editor.xml rename to app-android/res/layout-large/calc_editor.xml diff --git a/calculatorpp/res/layout-large/calc_keyboard.xml b/app-android/res/layout-large/calc_keyboard.xml similarity index 100% rename from calculatorpp/res/layout-large/calc_keyboard.xml rename to app-android/res/layout-large/calc_keyboard.xml diff --git a/calculatorpp/res/layout-large/main_calculator.xml b/app-android/res/layout-large/main_calculator.xml similarity index 100% rename from calculatorpp/res/layout-large/main_calculator.xml rename to app-android/res/layout-large/main_calculator.xml diff --git a/calculatorpp/res/layout-xlarge-land/calc_keyboard.xml b/app-android/res/layout-xlarge-land/calc_keyboard.xml similarity index 100% rename from calculatorpp/res/layout-xlarge-land/calc_keyboard.xml rename to app-android/res/layout-xlarge-land/calc_keyboard.xml diff --git a/calculatorpp/res/layout-xlarge-land/main_calculator.xml b/app-android/res/layout-xlarge-land/main_calculator.xml similarity index 100% rename from calculatorpp/res/layout-xlarge-land/main_calculator.xml rename to app-android/res/layout-xlarge-land/main_calculator.xml diff --git a/calculatorpp/res/layout-xlarge/calc_display.xml b/app-android/res/layout-xlarge/calc_display.xml similarity index 100% rename from calculatorpp/res/layout-xlarge/calc_display.xml rename to app-android/res/layout-xlarge/calc_display.xml diff --git a/calculatorpp/res/layout-xlarge/calc_editor.xml b/app-android/res/layout-xlarge/calc_editor.xml similarity index 100% rename from calculatorpp/res/layout-xlarge/calc_editor.xml rename to app-android/res/layout-xlarge/calc_editor.xml diff --git a/calculatorpp/res/layout-xlarge/calc_keyboard.xml b/app-android/res/layout-xlarge/calc_keyboard.xml similarity index 100% rename from calculatorpp/res/layout-xlarge/calc_keyboard.xml rename to app-android/res/layout-xlarge/calc_keyboard.xml diff --git a/calculatorpp/res/layout-xlarge/main_calculator.xml b/app-android/res/layout-xlarge/main_calculator.xml similarity index 100% rename from calculatorpp/res/layout-xlarge/main_calculator.xml rename to app-android/res/layout-xlarge/main_calculator.xml diff --git a/calculatorpp/res/layout/about_fragment.xml b/app-android/res/layout/about_fragment.xml similarity index 100% rename from calculatorpp/res/layout/about_fragment.xml rename to app-android/res/layout/about_fragment.xml diff --git a/calculatorpp/res/layout/ad.xml b/app-android/res/layout/ad.xml similarity index 100% rename from calculatorpp/res/layout/ad.xml rename to app-android/res/layout/ad.xml diff --git a/calculatorpp/res/layout/admob_pref.xml b/app-android/res/layout/admob_pref.xml similarity index 100% rename from calculatorpp/res/layout/admob_pref.xml rename to app-android/res/layout/admob_pref.xml diff --git a/calculatorpp/res/layout/calc_clear_button.xml b/app-android/res/layout/calc_clear_button.xml similarity index 100% rename from calculatorpp/res/layout/calc_clear_button.xml rename to app-android/res/layout/calc_clear_button.xml diff --git a/calculatorpp/res/layout/calc_copy_button.xml b/app-android/res/layout/calc_copy_button.xml similarity index 100% rename from calculatorpp/res/layout/calc_copy_button.xml rename to app-android/res/layout/calc_copy_button.xml diff --git a/calculatorpp/res/layout/calc_display.xml b/app-android/res/layout/calc_display.xml similarity index 100% rename from calculatorpp/res/layout/calc_display.xml rename to app-android/res/layout/calc_display.xml diff --git a/calculatorpp/res/layout/calc_display_mobile.xml b/app-android/res/layout/calc_display_mobile.xml similarity index 100% rename from calculatorpp/res/layout/calc_display_mobile.xml rename to app-android/res/layout/calc_display_mobile.xml diff --git a/calculatorpp/res/layout/calc_division_button.xml b/app-android/res/layout/calc_division_button.xml similarity index 100% rename from calculatorpp/res/layout/calc_division_button.xml rename to app-android/res/layout/calc_division_button.xml diff --git a/calculatorpp/res/layout/calc_donate_button.xml b/app-android/res/layout/calc_donate_button.xml similarity index 100% rename from calculatorpp/res/layout/calc_donate_button.xml rename to app-android/res/layout/calc_donate_button.xml diff --git a/calculatorpp/res/layout/calc_dot_button.xml b/app-android/res/layout/calc_dot_button.xml similarity index 100% rename from calculatorpp/res/layout/calc_dot_button.xml rename to app-android/res/layout/calc_dot_button.xml diff --git a/calculatorpp/res/layout/calc_editor.xml b/app-android/res/layout/calc_editor.xml similarity index 100% rename from calculatorpp/res/layout/calc_editor.xml rename to app-android/res/layout/calc_editor.xml diff --git a/calculatorpp/res/layout/calc_editor_mobile.xml b/app-android/res/layout/calc_editor_mobile.xml similarity index 100% rename from calculatorpp/res/layout/calc_editor_mobile.xml rename to app-android/res/layout/calc_editor_mobile.xml diff --git a/calculatorpp/res/layout/calc_eight_digit_button.xml b/app-android/res/layout/calc_eight_digit_button.xml similarity index 100% rename from calculatorpp/res/layout/calc_eight_digit_button.xml rename to app-android/res/layout/calc_eight_digit_button.xml diff --git a/calculatorpp/res/layout/calc_empty_button.xml b/app-android/res/layout/calc_empty_button.xml similarity index 100% rename from calculatorpp/res/layout/calc_empty_button.xml rename to app-android/res/layout/calc_empty_button.xml diff --git a/calculatorpp/res/layout/calc_equals_button.xml b/app-android/res/layout/calc_equals_button.xml similarity index 100% rename from calculatorpp/res/layout/calc_equals_button.xml rename to app-android/res/layout/calc_equals_button.xml diff --git a/calculatorpp/res/layout/calc_erase_button.xml b/app-android/res/layout/calc_erase_button.xml similarity index 100% rename from calculatorpp/res/layout/calc_erase_button.xml rename to app-android/res/layout/calc_erase_button.xml diff --git a/calculatorpp/res/layout/calc_five_digit_button.xml b/app-android/res/layout/calc_five_digit_button.xml similarity index 100% rename from calculatorpp/res/layout/calc_five_digit_button.xml rename to app-android/res/layout/calc_five_digit_button.xml diff --git a/calculatorpp/res/layout/calc_four_digit_button.xml b/app-android/res/layout/calc_four_digit_button.xml similarity index 100% rename from calculatorpp/res/layout/calc_four_digit_button.xml rename to app-android/res/layout/calc_four_digit_button.xml diff --git a/calculatorpp/res/layout/calc_functions_button.xml b/app-android/res/layout/calc_functions_button.xml similarity index 100% rename from calculatorpp/res/layout/calc_functions_button.xml rename to app-android/res/layout/calc_functions_button.xml diff --git a/calculatorpp/res/layout/calc_history_button.xml b/app-android/res/layout/calc_history_button.xml similarity index 100% rename from calculatorpp/res/layout/calc_history_button.xml rename to app-android/res/layout/calc_history_button.xml diff --git a/calculatorpp/res/layout/calc_keyboard.xml b/app-android/res/layout/calc_keyboard.xml similarity index 100% rename from calculatorpp/res/layout/calc_keyboard.xml rename to app-android/res/layout/calc_keyboard.xml diff --git a/calculatorpp/res/layout/calc_keyboard_mobile.xml b/app-android/res/layout/calc_keyboard_mobile.xml similarity index 100% rename from calculatorpp/res/layout/calc_keyboard_mobile.xml rename to app-android/res/layout/calc_keyboard_mobile.xml diff --git a/calculatorpp/res/layout/calc_left_button.xml b/app-android/res/layout/calc_left_button.xml similarity index 100% rename from calculatorpp/res/layout/calc_left_button.xml rename to app-android/res/layout/calc_left_button.xml diff --git a/calculatorpp/res/layout/calc_multiplication_button.xml b/app-android/res/layout/calc_multiplication_button.xml similarity index 100% rename from calculatorpp/res/layout/calc_multiplication_button.xml rename to app-android/res/layout/calc_multiplication_button.xml diff --git a/calculatorpp/res/layout/calc_nine_digit_button.xml b/app-android/res/layout/calc_nine_digit_button.xml similarity index 100% rename from calculatorpp/res/layout/calc_nine_digit_button.xml rename to app-android/res/layout/calc_nine_digit_button.xml diff --git a/calculatorpp/res/layout/calc_one_digit_button.xml b/app-android/res/layout/calc_one_digit_button.xml similarity index 100% rename from calculatorpp/res/layout/calc_one_digit_button.xml rename to app-android/res/layout/calc_one_digit_button.xml diff --git a/calculatorpp/res/layout/calc_operators_button.xml b/app-android/res/layout/calc_operators_button.xml similarity index 100% rename from calculatorpp/res/layout/calc_operators_button.xml rename to app-android/res/layout/calc_operators_button.xml diff --git a/calculatorpp/res/layout/calc_paste_button.xml b/app-android/res/layout/calc_paste_button.xml similarity index 100% rename from calculatorpp/res/layout/calc_paste_button.xml rename to app-android/res/layout/calc_paste_button.xml diff --git a/calculatorpp/res/layout/calc_plot_view.xml b/app-android/res/layout/calc_plot_view.xml similarity index 100% rename from calculatorpp/res/layout/calc_plot_view.xml rename to app-android/res/layout/calc_plot_view.xml diff --git a/calculatorpp/res/layout/calc_plus_button.xml b/app-android/res/layout/calc_plus_button.xml similarity index 100% rename from calculatorpp/res/layout/calc_plus_button.xml rename to app-android/res/layout/calc_plus_button.xml diff --git a/calculatorpp/res/layout/calc_right_button.xml b/app-android/res/layout/calc_right_button.xml similarity index 100% rename from calculatorpp/res/layout/calc_right_button.xml rename to app-android/res/layout/calc_right_button.xml diff --git a/calculatorpp/res/layout/calc_round_brackets_button.xml b/app-android/res/layout/calc_round_brackets_button.xml similarity index 100% rename from calculatorpp/res/layout/calc_round_brackets_button.xml rename to app-android/res/layout/calc_round_brackets_button.xml diff --git a/calculatorpp/res/layout/calc_seven_digit_button.xml b/app-android/res/layout/calc_seven_digit_button.xml similarity index 100% rename from calculatorpp/res/layout/calc_seven_digit_button.xml rename to app-android/res/layout/calc_seven_digit_button.xml diff --git a/calculatorpp/res/layout/calc_six_digit_button.xml b/app-android/res/layout/calc_six_digit_button.xml similarity index 100% rename from calculatorpp/res/layout/calc_six_digit_button.xml rename to app-android/res/layout/calc_six_digit_button.xml diff --git a/calculatorpp/res/layout/calc_subtraction_button.xml b/app-android/res/layout/calc_subtraction_button.xml similarity index 100% rename from calculatorpp/res/layout/calc_subtraction_button.xml rename to app-android/res/layout/calc_subtraction_button.xml diff --git a/calculatorpp/res/layout/calc_three_digit_button.xml b/app-android/res/layout/calc_three_digit_button.xml similarity index 100% rename from calculatorpp/res/layout/calc_three_digit_button.xml rename to app-android/res/layout/calc_three_digit_button.xml diff --git a/calculatorpp/res/layout/calc_title.xml b/app-android/res/layout/calc_title.xml similarity index 100% rename from calculatorpp/res/layout/calc_title.xml rename to app-android/res/layout/calc_title.xml diff --git a/calculatorpp/res/layout/calc_two_digit_button.xml b/app-android/res/layout/calc_two_digit_button.xml similarity index 100% rename from calculatorpp/res/layout/calc_two_digit_button.xml rename to app-android/res/layout/calc_two_digit_button.xml diff --git a/calculatorpp/res/layout/calc_vars_button.xml b/app-android/res/layout/calc_vars_button.xml similarity index 100% rename from calculatorpp/res/layout/calc_vars_button.xml rename to app-android/res/layout/calc_vars_button.xml diff --git a/calculatorpp/res/layout/calc_zero_digit_button.xml b/app-android/res/layout/calc_zero_digit_button.xml similarity index 100% rename from calculatorpp/res/layout/calc_zero_digit_button.xml rename to app-android/res/layout/calc_zero_digit_button.xml diff --git a/calculatorpp/res/layout/calculator_messages_dialog.xml b/app-android/res/layout/calculator_messages_dialog.xml similarity index 100% rename from calculatorpp/res/layout/calculator_messages_dialog.xml rename to app-android/res/layout/calculator_messages_dialog.xml diff --git a/calculatorpp/res/layout/calculator_messages_dialog_message.xml b/app-android/res/layout/calculator_messages_dialog_message.xml similarity index 100% rename from calculatorpp/res/layout/calculator_messages_dialog_message.xml rename to app-android/res/layout/calculator_messages_dialog_message.xml diff --git a/calculatorpp/res/layout/display_error_message.xml b/app-android/res/layout/display_error_message.xml similarity index 100% rename from calculatorpp/res/layout/display_error_message.xml rename to app-android/res/layout/display_error_message.xml diff --git a/calculatorpp/res/layout/drag_button_calibration.xml b/app-android/res/layout/drag_button_calibration.xml similarity index 100% rename from calculatorpp/res/layout/drag_button_calibration.xml rename to app-android/res/layout/drag_button_calibration.xml diff --git a/calculatorpp/res/layout/feedback.xml b/app-android/res/layout/feedback.xml similarity index 100% rename from calculatorpp/res/layout/feedback.xml rename to app-android/res/layout/feedback.xml diff --git a/calculatorpp/res/layout/function_add_param.xml b/app-android/res/layout/function_add_param.xml similarity index 100% rename from calculatorpp/res/layout/function_add_param.xml rename to app-android/res/layout/function_add_param.xml diff --git a/calculatorpp/res/layout/function_edit.xml b/app-android/res/layout/function_edit.xml similarity index 100% rename from calculatorpp/res/layout/function_edit.xml rename to app-android/res/layout/function_edit.xml diff --git a/calculatorpp/res/layout/function_edit_param.xml b/app-android/res/layout/function_edit_param.xml similarity index 100% rename from calculatorpp/res/layout/function_edit_param.xml rename to app-android/res/layout/function_edit_param.xml diff --git a/calculatorpp/res/layout/help_faq_fragment.xml b/app-android/res/layout/help_faq_fragment.xml similarity index 100% rename from calculatorpp/res/layout/help_faq_fragment.xml rename to app-android/res/layout/help_faq_fragment.xml diff --git a/calculatorpp/res/layout/help_hints_fragment.xml b/app-android/res/layout/help_hints_fragment.xml similarity index 100% rename from calculatorpp/res/layout/help_hints_fragment.xml rename to app-android/res/layout/help_hints_fragment.xml diff --git a/calculatorpp/res/layout/help_screens_fragment.xml b/app-android/res/layout/help_screens_fragment.xml similarity index 100% rename from calculatorpp/res/layout/help_screens_fragment.xml rename to app-android/res/layout/help_screens_fragment.xml diff --git a/calculatorpp/res/layout/history_edit.xml b/app-android/res/layout/history_edit.xml similarity index 100% rename from calculatorpp/res/layout/history_edit.xml rename to app-android/res/layout/history_edit.xml diff --git a/calculatorpp/res/layout/history_fragment.xml b/app-android/res/layout/history_fragment.xml similarity index 100% rename from calculatorpp/res/layout/history_fragment.xml rename to app-android/res/layout/history_fragment.xml diff --git a/calculatorpp/res/layout/history_item.xml b/app-android/res/layout/history_item.xml similarity index 100% rename from calculatorpp/res/layout/history_item.xml rename to app-android/res/layout/history_item.xml diff --git a/calculatorpp/res/layout/main_calculator.xml b/app-android/res/layout/main_calculator.xml similarity index 100% rename from calculatorpp/res/layout/main_calculator.xml rename to app-android/res/layout/main_calculator.xml diff --git a/calculatorpp/res/layout/main_calculator_mobile.xml b/app-android/res/layout/main_calculator_mobile.xml similarity index 100% rename from calculatorpp/res/layout/main_calculator_mobile.xml rename to app-android/res/layout/main_calculator_mobile.xml diff --git a/calculatorpp/res/layout/main_empty.xml b/app-android/res/layout/main_empty.xml similarity index 100% rename from calculatorpp/res/layout/main_empty.xml rename to app-android/res/layout/main_empty.xml diff --git a/calculatorpp/res/layout/main_empty_multi_pane.xml b/app-android/res/layout/main_empty_multi_pane.xml similarity index 100% rename from calculatorpp/res/layout/main_empty_multi_pane.xml rename to app-android/res/layout/main_empty_multi_pane.xml diff --git a/calculatorpp/res/layout/math_entities_fragment.xml b/app-android/res/layout/math_entities_fragment.xml similarity index 100% rename from calculatorpp/res/layout/math_entities_fragment.xml rename to app-android/res/layout/math_entities_fragment.xml diff --git a/calculatorpp/res/layout/math_entity.xml b/app-android/res/layout/math_entity.xml similarity index 100% rename from calculatorpp/res/layout/math_entity.xml rename to app-android/res/layout/math_entity.xml diff --git a/calculatorpp/res/layout/notespp_announce.xml b/app-android/res/layout/notespp_announce.xml similarity index 100% rename from calculatorpp/res/layout/notespp_announce.xml rename to app-android/res/layout/notespp_announce.xml diff --git a/calculatorpp/res/layout/onscreen_display.xml b/app-android/res/layout/onscreen_display.xml similarity index 100% rename from calculatorpp/res/layout/onscreen_display.xml rename to app-android/res/layout/onscreen_display.xml diff --git a/calculatorpp/res/layout/onscreen_editor.xml b/app-android/res/layout/onscreen_editor.xml similarity index 100% rename from calculatorpp/res/layout/onscreen_editor.xml rename to app-android/res/layout/onscreen_editor.xml diff --git a/calculatorpp/res/layout/onscreen_footer.xml b/app-android/res/layout/onscreen_footer.xml similarity index 100% rename from calculatorpp/res/layout/onscreen_footer.xml rename to app-android/res/layout/onscreen_footer.xml diff --git a/calculatorpp/res/layout/onscreen_header.xml b/app-android/res/layout/onscreen_header.xml similarity index 100% rename from calculatorpp/res/layout/onscreen_header.xml rename to app-android/res/layout/onscreen_header.xml diff --git a/calculatorpp/res/layout/onscreen_keyboard.xml b/app-android/res/layout/onscreen_keyboard.xml similarity index 100% rename from calculatorpp/res/layout/onscreen_keyboard.xml rename to app-android/res/layout/onscreen_keyboard.xml diff --git a/calculatorpp/res/layout/onscreen_layout.xml b/app-android/res/layout/onscreen_layout.xml similarity index 100% rename from calculatorpp/res/layout/onscreen_layout.xml rename to app-android/res/layout/onscreen_layout.xml diff --git a/calculatorpp/res/layout/plot_fragment.xml b/app-android/res/layout/plot_fragment.xml similarity index 100% rename from calculatorpp/res/layout/plot_fragment.xml rename to app-android/res/layout/plot_fragment.xml diff --git a/calculatorpp/res/layout/release_notes_fragment.xml b/app-android/res/layout/release_notes_fragment.xml similarity index 100% rename from calculatorpp/res/layout/release_notes_fragment.xml rename to app-android/res/layout/release_notes_fragment.xml diff --git a/calculatorpp/res/layout/saved_history_item.xml b/app-android/res/layout/saved_history_item.xml similarity index 100% rename from calculatorpp/res/layout/saved_history_item.xml rename to app-android/res/layout/saved_history_item.xml diff --git a/calculatorpp/res/layout/tabs.xml b/app-android/res/layout/tabs.xml similarity index 100% rename from calculatorpp/res/layout/tabs.xml rename to app-android/res/layout/tabs.xml diff --git a/calculatorpp/res/layout/unit_converter.xml b/app-android/res/layout/unit_converter.xml similarity index 100% rename from calculatorpp/res/layout/unit_converter.xml rename to app-android/res/layout/unit_converter.xml diff --git a/calculatorpp/res/layout/var_edit.xml b/app-android/res/layout/var_edit.xml similarity index 100% rename from calculatorpp/res/layout/var_edit.xml rename to app-android/res/layout/var_edit.xml diff --git a/calculatorpp/res/layout/vars_fragment.xml b/app-android/res/layout/vars_fragment.xml similarity index 100% rename from calculatorpp/res/layout/vars_fragment.xml rename to app-android/res/layout/vars_fragment.xml diff --git a/calculatorpp/res/layout/widget_app_button.xml b/app-android/res/layout/widget_app_button.xml similarity index 100% rename from calculatorpp/res/layout/widget_app_button.xml rename to app-android/res/layout/widget_app_button.xml diff --git a/calculatorpp/res/layout/widget_clear_button.xml b/app-android/res/layout/widget_clear_button.xml similarity index 100% rename from calculatorpp/res/layout/widget_clear_button.xml rename to app-android/res/layout/widget_clear_button.xml diff --git a/calculatorpp/res/layout/widget_copy_button.xml b/app-android/res/layout/widget_copy_button.xml similarity index 100% rename from calculatorpp/res/layout/widget_copy_button.xml rename to app-android/res/layout/widget_copy_button.xml diff --git a/calculatorpp/res/layout/widget_display.xml b/app-android/res/layout/widget_display.xml similarity index 100% rename from calculatorpp/res/layout/widget_display.xml rename to app-android/res/layout/widget_display.xml diff --git a/calculatorpp/res/layout/widget_division_button.xml b/app-android/res/layout/widget_division_button.xml similarity index 100% rename from calculatorpp/res/layout/widget_division_button.xml rename to app-android/res/layout/widget_division_button.xml diff --git a/calculatorpp/res/layout/widget_dot_button.xml b/app-android/res/layout/widget_dot_button.xml similarity index 100% rename from calculatorpp/res/layout/widget_dot_button.xml rename to app-android/res/layout/widget_dot_button.xml diff --git a/calculatorpp/res/layout/widget_editor.xml b/app-android/res/layout/widget_editor.xml similarity index 100% rename from calculatorpp/res/layout/widget_editor.xml rename to app-android/res/layout/widget_editor.xml diff --git a/calculatorpp/res/layout/widget_eight_digit_button.xml b/app-android/res/layout/widget_eight_digit_button.xml similarity index 100% rename from calculatorpp/res/layout/widget_eight_digit_button.xml rename to app-android/res/layout/widget_eight_digit_button.xml diff --git a/calculatorpp/res/layout/widget_equals_button.xml b/app-android/res/layout/widget_equals_button.xml similarity index 100% rename from calculatorpp/res/layout/widget_equals_button.xml rename to app-android/res/layout/widget_equals_button.xml diff --git a/calculatorpp/res/layout/widget_erase_button.xml b/app-android/res/layout/widget_erase_button.xml similarity index 100% rename from calculatorpp/res/layout/widget_erase_button.xml rename to app-android/res/layout/widget_erase_button.xml diff --git a/calculatorpp/res/layout/widget_five_digit_button.xml b/app-android/res/layout/widget_five_digit_button.xml similarity index 100% rename from calculatorpp/res/layout/widget_five_digit_button.xml rename to app-android/res/layout/widget_five_digit_button.xml diff --git a/calculatorpp/res/layout/widget_four_digit_button.xml b/app-android/res/layout/widget_four_digit_button.xml similarity index 100% rename from calculatorpp/res/layout/widget_four_digit_button.xml rename to app-android/res/layout/widget_four_digit_button.xml diff --git a/calculatorpp/res/layout/widget_functions_button.xml b/app-android/res/layout/widget_functions_button.xml similarity index 100% rename from calculatorpp/res/layout/widget_functions_button.xml rename to app-android/res/layout/widget_functions_button.xml diff --git a/calculatorpp/res/layout/widget_history_button.xml b/app-android/res/layout/widget_history_button.xml similarity index 100% rename from calculatorpp/res/layout/widget_history_button.xml rename to app-android/res/layout/widget_history_button.xml diff --git a/calculatorpp/res/layout/widget_keyboard.xml b/app-android/res/layout/widget_keyboard.xml similarity index 100% rename from calculatorpp/res/layout/widget_keyboard.xml rename to app-android/res/layout/widget_keyboard.xml diff --git a/calculatorpp/res/layout/widget_layout.xml b/app-android/res/layout/widget_layout.xml similarity index 100% rename from calculatorpp/res/layout/widget_layout.xml rename to app-android/res/layout/widget_layout.xml diff --git a/calculatorpp/res/layout/widget_left_button.xml b/app-android/res/layout/widget_left_button.xml similarity index 100% rename from calculatorpp/res/layout/widget_left_button.xml rename to app-android/res/layout/widget_left_button.xml diff --git a/calculatorpp/res/layout/widget_like_button.xml b/app-android/res/layout/widget_like_button.xml similarity index 100% rename from calculatorpp/res/layout/widget_like_button.xml rename to app-android/res/layout/widget_like_button.xml diff --git a/calculatorpp/res/layout/widget_multiplication_button.xml b/app-android/res/layout/widget_multiplication_button.xml similarity index 100% rename from calculatorpp/res/layout/widget_multiplication_button.xml rename to app-android/res/layout/widget_multiplication_button.xml diff --git a/calculatorpp/res/layout/widget_nine_digit_button.xml b/app-android/res/layout/widget_nine_digit_button.xml similarity index 100% rename from calculatorpp/res/layout/widget_nine_digit_button.xml rename to app-android/res/layout/widget_nine_digit_button.xml diff --git a/calculatorpp/res/layout/widget_one_digit_button.xml b/app-android/res/layout/widget_one_digit_button.xml similarity index 100% rename from calculatorpp/res/layout/widget_one_digit_button.xml rename to app-android/res/layout/widget_one_digit_button.xml diff --git a/calculatorpp/res/layout/widget_paste_button.xml b/app-android/res/layout/widget_paste_button.xml similarity index 100% rename from calculatorpp/res/layout/widget_paste_button.xml rename to app-android/res/layout/widget_paste_button.xml diff --git a/calculatorpp/res/layout/widget_percent_button.xml b/app-android/res/layout/widget_percent_button.xml similarity index 100% rename from calculatorpp/res/layout/widget_percent_button.xml rename to app-android/res/layout/widget_percent_button.xml diff --git a/calculatorpp/res/layout/widget_plus_button.xml b/app-android/res/layout/widget_plus_button.xml similarity index 100% rename from calculatorpp/res/layout/widget_plus_button.xml rename to app-android/res/layout/widget_plus_button.xml diff --git a/calculatorpp/res/layout/widget_power_button.xml b/app-android/res/layout/widget_power_button.xml similarity index 100% rename from calculatorpp/res/layout/widget_power_button.xml rename to app-android/res/layout/widget_power_button.xml diff --git a/calculatorpp/res/layout/widget_right_button.xml b/app-android/res/layout/widget_right_button.xml similarity index 100% rename from calculatorpp/res/layout/widget_right_button.xml rename to app-android/res/layout/widget_right_button.xml diff --git a/calculatorpp/res/layout/widget_round_brackets_button.xml b/app-android/res/layout/widget_round_brackets_button.xml similarity index 100% rename from calculatorpp/res/layout/widget_round_brackets_button.xml rename to app-android/res/layout/widget_round_brackets_button.xml diff --git a/calculatorpp/res/layout/widget_settings_button.xml b/app-android/res/layout/widget_settings_button.xml similarity index 100% rename from calculatorpp/res/layout/widget_settings_button.xml rename to app-android/res/layout/widget_settings_button.xml diff --git a/calculatorpp/res/layout/widget_seven_digit_button.xml b/app-android/res/layout/widget_seven_digit_button.xml similarity index 100% rename from calculatorpp/res/layout/widget_seven_digit_button.xml rename to app-android/res/layout/widget_seven_digit_button.xml diff --git a/calculatorpp/res/layout/widget_six_digit_button.xml b/app-android/res/layout/widget_six_digit_button.xml similarity index 100% rename from calculatorpp/res/layout/widget_six_digit_button.xml rename to app-android/res/layout/widget_six_digit_button.xml diff --git a/calculatorpp/res/layout/widget_subtraction_button.xml b/app-android/res/layout/widget_subtraction_button.xml similarity index 100% rename from calculatorpp/res/layout/widget_subtraction_button.xml rename to app-android/res/layout/widget_subtraction_button.xml diff --git a/calculatorpp/res/layout/widget_three_digit_button.xml b/app-android/res/layout/widget_three_digit_button.xml similarity index 100% rename from calculatorpp/res/layout/widget_three_digit_button.xml rename to app-android/res/layout/widget_three_digit_button.xml diff --git a/calculatorpp/res/layout/widget_two_digit_button.xml b/app-android/res/layout/widget_two_digit_button.xml similarity index 100% rename from calculatorpp/res/layout/widget_two_digit_button.xml rename to app-android/res/layout/widget_two_digit_button.xml diff --git a/calculatorpp/res/layout/widget_vars_button.xml b/app-android/res/layout/widget_vars_button.xml similarity index 100% rename from calculatorpp/res/layout/widget_vars_button.xml rename to app-android/res/layout/widget_vars_button.xml diff --git a/calculatorpp/res/layout/widget_zero_digit_button.xml b/app-android/res/layout/widget_zero_digit_button.xml similarity index 100% rename from calculatorpp/res/layout/widget_zero_digit_button.xml rename to app-android/res/layout/widget_zero_digit_button.xml diff --git a/calculatorpp/res/menu/functions_menu.xml b/app-android/res/menu/functions_menu.xml similarity index 100% rename from calculatorpp/res/menu/functions_menu.xml rename to app-android/res/menu/functions_menu.xml diff --git a/calculatorpp/res/menu/history_menu.xml b/app-android/res/menu/history_menu.xml similarity index 100% rename from calculatorpp/res/menu/history_menu.xml rename to app-android/res/menu/history_menu.xml diff --git a/calculatorpp/res/menu/plot_menu.xml b/app-android/res/menu/plot_menu.xml similarity index 100% rename from calculatorpp/res/menu/plot_menu.xml rename to app-android/res/menu/plot_menu.xml diff --git a/calculatorpp/res/menu/vars_menu.xml b/app-android/res/menu/vars_menu.xml similarity index 100% rename from calculatorpp/res/menu/vars_menu.xml rename to app-android/res/menu/vars_menu.xml diff --git a/calculatorpp/res/values-es/text_about.xml b/app-android/res/values-es/text_about.xml similarity index 100% rename from calculatorpp/res/values-es/text_about.xml rename to app-android/res/values-es/text_about.xml diff --git a/calculatorpp/res/values-es/text_functions.xml b/app-android/res/values-es/text_functions.xml similarity index 100% rename from calculatorpp/res/values-es/text_functions.xml rename to app-android/res/values-es/text_functions.xml diff --git a/calculatorpp/res/values-es/text_help.xml b/app-android/res/values-es/text_help.xml similarity index 100% rename from calculatorpp/res/values-es/text_help.xml rename to app-android/res/values-es/text_help.xml diff --git a/calculatorpp/res/values-es/text_operators.xml b/app-android/res/values-es/text_operators.xml similarity index 100% rename from calculatorpp/res/values-es/text_operators.xml rename to app-android/res/values-es/text_operators.xml diff --git a/calculatorpp/res/values-es/text_strings.xml b/app-android/res/values-es/text_strings.xml similarity index 100% rename from calculatorpp/res/values-es/text_strings.xml rename to app-android/res/values-es/text_strings.xml diff --git a/calculatorpp/res/values-es/text_vars.xml b/app-android/res/values-es/text_vars.xml similarity index 100% rename from calculatorpp/res/values-es/text_vars.xml rename to app-android/res/values-es/text_vars.xml diff --git a/calculatorpp/res/values-it/text_about.xml b/app-android/res/values-it/text_about.xml similarity index 100% rename from calculatorpp/res/values-it/text_about.xml rename to app-android/res/values-it/text_about.xml diff --git a/calculatorpp/res/values-it/text_functions.xml b/app-android/res/values-it/text_functions.xml similarity index 100% rename from calculatorpp/res/values-it/text_functions.xml rename to app-android/res/values-it/text_functions.xml diff --git a/calculatorpp/res/values-it/text_help.xml b/app-android/res/values-it/text_help.xml similarity index 100% rename from calculatorpp/res/values-it/text_help.xml rename to app-android/res/values-it/text_help.xml diff --git a/calculatorpp/res/values-it/text_operators.xml b/app-android/res/values-it/text_operators.xml similarity index 100% rename from calculatorpp/res/values-it/text_operators.xml rename to app-android/res/values-it/text_operators.xml diff --git a/calculatorpp/res/values-it/text_strings.xml b/app-android/res/values-it/text_strings.xml similarity index 100% rename from calculatorpp/res/values-it/text_strings.xml rename to app-android/res/values-it/text_strings.xml diff --git a/calculatorpp/res/values-it/text_vars.xml b/app-android/res/values-it/text_vars.xml similarity index 100% rename from calculatorpp/res/values-it/text_vars.xml rename to app-android/res/values-it/text_vars.xml diff --git a/calculatorpp/res/values-large-hdpi/dimens.xml b/app-android/res/values-large-hdpi/dimens.xml similarity index 100% rename from calculatorpp/res/values-large-hdpi/dimens.xml rename to app-android/res/values-large-hdpi/dimens.xml diff --git a/calculatorpp/res/values-large-mdpi/dimens.xml b/app-android/res/values-large-mdpi/dimens.xml similarity index 100% rename from calculatorpp/res/values-large-mdpi/dimens.xml rename to app-android/res/values-large-mdpi/dimens.xml diff --git a/calculatorpp/res/values-large-tvdpi/dimens.xml b/app-android/res/values-large-tvdpi/dimens.xml similarity index 100% rename from calculatorpp/res/values-large-tvdpi/dimens.xml rename to app-android/res/values-large-tvdpi/dimens.xml diff --git a/calculatorpp/res/values-large/dimens.xml b/app-android/res/values-large/dimens.xml similarity index 100% rename from calculatorpp/res/values-large/dimens.xml rename to app-android/res/values-large/dimens.xml diff --git a/calculatorpp/res/values-normal-hdpi/dimens.xml b/app-android/res/values-normal-hdpi/dimens.xml similarity index 100% rename from calculatorpp/res/values-normal-hdpi/dimens.xml rename to app-android/res/values-normal-hdpi/dimens.xml diff --git a/calculatorpp/res/values-normal-mdpi/dimens.xml b/app-android/res/values-normal-mdpi/dimens.xml similarity index 100% rename from calculatorpp/res/values-normal-mdpi/dimens.xml rename to app-android/res/values-normal-mdpi/dimens.xml diff --git a/calculatorpp/res/values-normal-tvdpi/dimens.xml b/app-android/res/values-normal-tvdpi/dimens.xml similarity index 100% rename from calculatorpp/res/values-normal-tvdpi/dimens.xml rename to app-android/res/values-normal-tvdpi/dimens.xml diff --git a/calculatorpp/res/values-normal-xhdpi/dimens.xml b/app-android/res/values-normal-xhdpi/dimens.xml similarity index 100% rename from calculatorpp/res/values-normal-xhdpi/dimens.xml rename to app-android/res/values-normal-xhdpi/dimens.xml diff --git a/calculatorpp/res/values-normal/dimens.xml b/app-android/res/values-normal/dimens.xml similarity index 100% rename from calculatorpp/res/values-normal/dimens.xml rename to app-android/res/values-normal/dimens.xml diff --git a/calculatorpp/res/values-ru/text_about.xml b/app-android/res/values-ru/text_about.xml similarity index 100% rename from calculatorpp/res/values-ru/text_about.xml rename to app-android/res/values-ru/text_about.xml diff --git a/calculatorpp/res/values-ru/text_functions.xml b/app-android/res/values-ru/text_functions.xml similarity index 100% rename from calculatorpp/res/values-ru/text_functions.xml rename to app-android/res/values-ru/text_functions.xml diff --git a/calculatorpp/res/values-ru/text_help.xml b/app-android/res/values-ru/text_help.xml similarity index 100% rename from calculatorpp/res/values-ru/text_help.xml rename to app-android/res/values-ru/text_help.xml diff --git a/calculatorpp/res/values-ru/text_operators.xml b/app-android/res/values-ru/text_operators.xml similarity index 100% rename from calculatorpp/res/values-ru/text_operators.xml rename to app-android/res/values-ru/text_operators.xml diff --git a/calculatorpp/res/values-ru/text_preferences.xml b/app-android/res/values-ru/text_preferences.xml similarity index 100% rename from calculatorpp/res/values-ru/text_preferences.xml rename to app-android/res/values-ru/text_preferences.xml diff --git a/calculatorpp/res/values-ru/text_strings.xml b/app-android/res/values-ru/text_strings.xml similarity index 100% rename from calculatorpp/res/values-ru/text_strings.xml rename to app-android/res/values-ru/text_strings.xml diff --git a/calculatorpp/res/values-ru/text_vars.xml b/app-android/res/values-ru/text_vars.xml similarity index 100% rename from calculatorpp/res/values-ru/text_vars.xml rename to app-android/res/values-ru/text_vars.xml diff --git a/calculatorpp/res/values-small-hdpi/dimens.xml b/app-android/res/values-small-hdpi/dimens.xml similarity index 100% rename from calculatorpp/res/values-small-hdpi/dimens.xml rename to app-android/res/values-small-hdpi/dimens.xml diff --git a/calculatorpp/res/values-small-xhdpi/dimens.xml b/app-android/res/values-small-xhdpi/dimens.xml similarity index 100% rename from calculatorpp/res/values-small-xhdpi/dimens.xml rename to app-android/res/values-small-xhdpi/dimens.xml diff --git a/calculatorpp/res/values-small/dimens.xml b/app-android/res/values-small/dimens.xml similarity index 100% rename from calculatorpp/res/values-small/dimens.xml rename to app-android/res/values-small/dimens.xml diff --git a/calculatorpp/res/values-uk/text_about.xml b/app-android/res/values-uk/text_about.xml similarity index 100% rename from calculatorpp/res/values-uk/text_about.xml rename to app-android/res/values-uk/text_about.xml diff --git a/calculatorpp/res/values-uk/text_functions.xml b/app-android/res/values-uk/text_functions.xml similarity index 100% rename from calculatorpp/res/values-uk/text_functions.xml rename to app-android/res/values-uk/text_functions.xml diff --git a/calculatorpp/res/values-uk/text_help.xml b/app-android/res/values-uk/text_help.xml similarity index 100% rename from calculatorpp/res/values-uk/text_help.xml rename to app-android/res/values-uk/text_help.xml diff --git a/calculatorpp/res/values-uk/text_operators.xml b/app-android/res/values-uk/text_operators.xml similarity index 100% rename from calculatorpp/res/values-uk/text_operators.xml rename to app-android/res/values-uk/text_operators.xml diff --git a/calculatorpp/res/values-uk/text_preferences.xml b/app-android/res/values-uk/text_preferences.xml similarity index 100% rename from calculatorpp/res/values-uk/text_preferences.xml rename to app-android/res/values-uk/text_preferences.xml diff --git a/calculatorpp/res/values-uk/text_strings.xml b/app-android/res/values-uk/text_strings.xml similarity index 100% rename from calculatorpp/res/values-uk/text_strings.xml rename to app-android/res/values-uk/text_strings.xml diff --git a/calculatorpp/res/values-uk/text_vars.xml b/app-android/res/values-uk/text_vars.xml similarity index 100% rename from calculatorpp/res/values-uk/text_vars.xml rename to app-android/res/values-uk/text_vars.xml diff --git a/calculatorpp/res/values-v14/dimens.xml b/app-android/res/values-v14/dimens.xml similarity index 100% rename from calculatorpp/res/values-v14/dimens.xml rename to app-android/res/values-v14/dimens.xml diff --git a/calculatorpp/res/values-xlarge-hdpi/dimens.xml b/app-android/res/values-xlarge-hdpi/dimens.xml similarity index 100% rename from calculatorpp/res/values-xlarge-hdpi/dimens.xml rename to app-android/res/values-xlarge-hdpi/dimens.xml diff --git a/calculatorpp/res/values-xlarge-mdpi/dimens.xml b/app-android/res/values-xlarge-mdpi/dimens.xml similarity index 100% rename from calculatorpp/res/values-xlarge-mdpi/dimens.xml rename to app-android/res/values-xlarge-mdpi/dimens.xml diff --git a/calculatorpp/res/values-xlarge/dimens.xml b/app-android/res/values-xlarge/dimens.xml similarity index 100% rename from calculatorpp/res/values-xlarge/dimens.xml rename to app-android/res/values-xlarge/dimens.xml diff --git a/calculatorpp/res/values-zh-rtw/text_about.xml b/app-android/res/values-zh-rtw/text_about.xml similarity index 100% rename from calculatorpp/res/values-zh-rtw/text_about.xml rename to app-android/res/values-zh-rtw/text_about.xml diff --git a/calculatorpp/res/values-zh-rtw/text_functions.xml b/app-android/res/values-zh-rtw/text_functions.xml similarity index 100% rename from calculatorpp/res/values-zh-rtw/text_functions.xml rename to app-android/res/values-zh-rtw/text_functions.xml diff --git a/calculatorpp/res/values-zh-rtw/text_help.xml b/app-android/res/values-zh-rtw/text_help.xml similarity index 100% rename from calculatorpp/res/values-zh-rtw/text_help.xml rename to app-android/res/values-zh-rtw/text_help.xml diff --git a/calculatorpp/res/values-zh-rtw/text_operators.xml b/app-android/res/values-zh-rtw/text_operators.xml similarity index 100% rename from calculatorpp/res/values-zh-rtw/text_operators.xml rename to app-android/res/values-zh-rtw/text_operators.xml diff --git a/calculatorpp/res/values-zh-rtw/text_preferences.xml b/app-android/res/values-zh-rtw/text_preferences.xml similarity index 100% rename from calculatorpp/res/values-zh-rtw/text_preferences.xml rename to app-android/res/values-zh-rtw/text_preferences.xml diff --git a/calculatorpp/res/values-zh-rtw/text_strings.xml b/app-android/res/values-zh-rtw/text_strings.xml similarity index 100% rename from calculatorpp/res/values-zh-rtw/text_strings.xml rename to app-android/res/values-zh-rtw/text_strings.xml diff --git a/calculatorpp/res/values-zh-rtw/text_vars.xml b/app-android/res/values-zh-rtw/text_vars.xml similarity index 100% rename from calculatorpp/res/values-zh-rtw/text_vars.xml rename to app-android/res/values-zh-rtw/text_vars.xml diff --git a/calculatorpp/res/values/arrays.xml b/app-android/res/values/arrays.xml similarity index 100% rename from calculatorpp/res/values/arrays.xml rename to app-android/res/values/arrays.xml diff --git a/calculatorpp/res/values/attributes.xml b/app-android/res/values/attributes.xml similarity index 100% rename from calculatorpp/res/values/attributes.xml rename to app-android/res/values/attributes.xml diff --git a/calculatorpp/res/values/colors.xml b/app-android/res/values/colors.xml similarity index 100% rename from calculatorpp/res/values/colors.xml rename to app-android/res/values/colors.xml diff --git a/calculatorpp/res/values/dimens.xml b/app-android/res/values/dimens.xml similarity index 100% rename from calculatorpp/res/values/dimens.xml rename to app-android/res/values/dimens.xml diff --git a/calculatorpp/res/values/preferences.xml b/app-android/res/values/preferences.xml similarity index 100% rename from calculatorpp/res/values/preferences.xml rename to app-android/res/values/preferences.xml diff --git a/calculatorpp/res/values/styles.xml b/app-android/res/values/styles.xml similarity index 100% rename from calculatorpp/res/values/styles.xml rename to app-android/res/values/styles.xml diff --git a/calculatorpp/res/values/styles_history.xml b/app-android/res/values/styles_history.xml similarity index 100% rename from calculatorpp/res/values/styles_history.xml rename to app-android/res/values/styles_history.xml diff --git a/calculatorpp/res/values/styles_var.xml b/app-android/res/values/styles_var.xml similarity index 100% rename from calculatorpp/res/values/styles_var.xml rename to app-android/res/values/styles_var.xml diff --git a/calculatorpp/res/values/text_about.xml b/app-android/res/values/text_about.xml similarity index 100% rename from calculatorpp/res/values/text_about.xml rename to app-android/res/values/text_about.xml diff --git a/calculatorpp/res/values/text_functions.xml b/app-android/res/values/text_functions.xml similarity index 100% rename from calculatorpp/res/values/text_functions.xml rename to app-android/res/values/text_functions.xml diff --git a/calculatorpp/res/values/text_help.xml b/app-android/res/values/text_help.xml similarity index 100% rename from calculatorpp/res/values/text_help.xml rename to app-android/res/values/text_help.xml diff --git a/calculatorpp/res/values/text_operators.xml b/app-android/res/values/text_operators.xml similarity index 100% rename from calculatorpp/res/values/text_operators.xml rename to app-android/res/values/text_operators.xml diff --git a/calculatorpp/res/values/text_preferences.xml b/app-android/res/values/text_preferences.xml similarity index 100% rename from calculatorpp/res/values/text_preferences.xml rename to app-android/res/values/text_preferences.xml diff --git a/calculatorpp/res/values/text_strings.xml b/app-android/res/values/text_strings.xml similarity index 100% rename from calculatorpp/res/values/text_strings.xml rename to app-android/res/values/text_strings.xml diff --git a/calculatorpp/res/values/text_vars.xml b/app-android/res/values/text_vars.xml similarity index 100% rename from calculatorpp/res/values/text_vars.xml rename to app-android/res/values/text_vars.xml diff --git a/calculatorpp/res/values/theme_gray.xml b/app-android/res/values/theme_gray.xml similarity index 100% rename from calculatorpp/res/values/theme_gray.xml rename to app-android/res/values/theme_gray.xml diff --git a/calculatorpp/res/values/theme_light_blue.xml b/app-android/res/values/theme_light_blue.xml similarity index 100% rename from calculatorpp/res/values/theme_light_blue.xml rename to app-android/res/values/theme_light_blue.xml diff --git a/calculatorpp/res/values/theme_metro_blue.xml b/app-android/res/values/theme_metro_blue.xml similarity index 100% rename from calculatorpp/res/values/theme_metro_blue.xml rename to app-android/res/values/theme_metro_blue.xml diff --git a/calculatorpp/res/values/theme_metro_green.xml b/app-android/res/values/theme_metro_green.xml similarity index 100% rename from calculatorpp/res/values/theme_metro_green.xml rename to app-android/res/values/theme_metro_green.xml diff --git a/calculatorpp/res/values/theme_metro_purple.xml b/app-android/res/values/theme_metro_purple.xml similarity index 100% rename from calculatorpp/res/values/theme_metro_purple.xml rename to app-android/res/values/theme_metro_purple.xml diff --git a/calculatorpp/res/values/theme_violet.xml b/app-android/res/values/theme_violet.xml similarity index 100% rename from calculatorpp/res/values/theme_violet.xml rename to app-android/res/values/theme_violet.xml diff --git a/calculatorpp/res/xml/calculator_widget_info_3x3.xml b/app-android/res/xml/calculator_widget_info_3x3.xml similarity index 100% rename from calculatorpp/res/xml/calculator_widget_info_3x3.xml rename to app-android/res/xml/calculator_widget_info_3x3.xml diff --git a/calculatorpp/res/xml/calculator_widget_info_3x4.xml b/app-android/res/xml/calculator_widget_info_3x4.xml similarity index 100% rename from calculatorpp/res/xml/calculator_widget_info_3x4.xml rename to app-android/res/xml/calculator_widget_info_3x4.xml diff --git a/calculatorpp/res/xml/calculator_widget_info_4x4.xml b/app-android/res/xml/calculator_widget_info_4x4.xml similarity index 100% rename from calculatorpp/res/xml/calculator_widget_info_4x4.xml rename to app-android/res/xml/calculator_widget_info_4x4.xml diff --git a/calculatorpp/res/xml/calculator_widget_info_4x5.xml b/app-android/res/xml/calculator_widget_info_4x5.xml similarity index 100% rename from calculatorpp/res/xml/calculator_widget_info_4x5.xml rename to app-android/res/xml/calculator_widget_info_4x5.xml diff --git a/calculatorpp/res/xml/preferences.xml b/app-android/res/xml/preferences.xml similarity index 100% rename from calculatorpp/res/xml/preferences.xml rename to app-android/res/xml/preferences.xml diff --git a/calculatorpp/res/xml/preferences_appearance.xml b/app-android/res/xml/preferences_appearance.xml similarity index 100% rename from calculatorpp/res/xml/preferences_appearance.xml rename to app-android/res/xml/preferences_appearance.xml diff --git a/calculatorpp/res/xml/preferences_calculations.xml b/app-android/res/xml/preferences_calculations.xml similarity index 100% rename from calculatorpp/res/xml/preferences_calculations.xml rename to app-android/res/xml/preferences_calculations.xml diff --git a/calculatorpp/res/xml/preferences_onscreen.xml b/app-android/res/xml/preferences_onscreen.xml similarity index 100% rename from calculatorpp/res/xml/preferences_onscreen.xml rename to app-android/res/xml/preferences_onscreen.xml diff --git a/calculatorpp/res/xml/preferences_other.xml b/app-android/res/xml/preferences_other.xml similarity index 100% rename from calculatorpp/res/xml/preferences_other.xml rename to app-android/res/xml/preferences_other.xml diff --git a/calculatorpp/res/xml/preferences_plot.xml b/app-android/res/xml/preferences_plot.xml similarity index 100% rename from calculatorpp/res/xml/preferences_plot.xml rename to app-android/res/xml/preferences_plot.xml diff --git a/calculatorpp/src/main/java/org/solovyev/android/AndroidUtils2.java b/app-android/src/main/java/org/solovyev/android/AndroidUtils2.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/AndroidUtils2.java rename to app-android/src/main/java/org/solovyev/android/AndroidUtils2.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/AbstractCalculatorHelper.java b/app-android/src/main/java/org/solovyev/android/calculator/AbstractCalculatorHelper.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/AbstractCalculatorHelper.java rename to app-android/src/main/java/org/solovyev/android/calculator/AbstractCalculatorHelper.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/AndroidCalculator.java b/app-android/src/main/java/org/solovyev/android/calculator/AndroidCalculator.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/AndroidCalculator.java rename to app-android/src/main/java/org/solovyev/android/calculator/AndroidCalculator.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/AndroidCalculatorClipboard.java b/app-android/src/main/java/org/solovyev/android/calculator/AndroidCalculatorClipboard.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/AndroidCalculatorClipboard.java rename to app-android/src/main/java/org/solovyev/android/calculator/AndroidCalculatorClipboard.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/AndroidCalculatorDisplayView.java b/app-android/src/main/java/org/solovyev/android/calculator/AndroidCalculatorDisplayView.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/AndroidCalculatorDisplayView.java rename to app-android/src/main/java/org/solovyev/android/calculator/AndroidCalculatorDisplayView.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/AndroidCalculatorEditorView.java b/app-android/src/main/java/org/solovyev/android/calculator/AndroidCalculatorEditorView.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/AndroidCalculatorEditorView.java rename to app-android/src/main/java/org/solovyev/android/calculator/AndroidCalculatorEditorView.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/AndroidCalculatorKeyboard.java b/app-android/src/main/java/org/solovyev/android/calculator/AndroidCalculatorKeyboard.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/AndroidCalculatorKeyboard.java rename to app-android/src/main/java/org/solovyev/android/calculator/AndroidCalculatorKeyboard.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/AndroidCalculatorLogger.java b/app-android/src/main/java/org/solovyev/android/calculator/AndroidCalculatorLogger.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/AndroidCalculatorLogger.java rename to app-android/src/main/java/org/solovyev/android/calculator/AndroidCalculatorLogger.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/AndroidCalculatorNotifier.java b/app-android/src/main/java/org/solovyev/android/calculator/AndroidCalculatorNotifier.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/AndroidCalculatorNotifier.java rename to app-android/src/main/java/org/solovyev/android/calculator/AndroidCalculatorNotifier.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/AndroidCalculatorPreferenceService.java b/app-android/src/main/java/org/solovyev/android/calculator/AndroidCalculatorPreferenceService.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/AndroidCalculatorPreferenceService.java rename to app-android/src/main/java/org/solovyev/android/calculator/AndroidCalculatorPreferenceService.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/AndroidFunctionCategory.java b/app-android/src/main/java/org/solovyev/android/calculator/AndroidFunctionCategory.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/AndroidFunctionCategory.java rename to app-android/src/main/java/org/solovyev/android/calculator/AndroidFunctionCategory.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/AndroidNumeralBase.java b/app-android/src/main/java/org/solovyev/android/calculator/AndroidNumeralBase.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/AndroidNumeralBase.java rename to app-android/src/main/java/org/solovyev/android/calculator/AndroidNumeralBase.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/AndroidOperatorCategory.java b/app-android/src/main/java/org/solovyev/android/calculator/AndroidOperatorCategory.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/AndroidOperatorCategory.java rename to app-android/src/main/java/org/solovyev/android/calculator/AndroidOperatorCategory.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/AndroidVarCategory.java b/app-android/src/main/java/org/solovyev/android/calculator/AndroidVarCategory.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/AndroidVarCategory.java rename to app-android/src/main/java/org/solovyev/android/calculator/AndroidVarCategory.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorActivity.java b/app-android/src/main/java/org/solovyev/android/calculator/CalculatorActivity.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorActivity.java rename to app-android/src/main/java/org/solovyev/android/calculator/CalculatorActivity.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorActivityHelper.java b/app-android/src/main/java/org/solovyev/android/calculator/CalculatorActivityHelper.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorActivityHelper.java rename to app-android/src/main/java/org/solovyev/android/calculator/CalculatorActivityHelper.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorActivityHelperImpl.java b/app-android/src/main/java/org/solovyev/android/calculator/CalculatorActivityHelperImpl.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorActivityHelperImpl.java rename to app-android/src/main/java/org/solovyev/android/calculator/CalculatorActivityHelperImpl.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorActivityLauncher.java b/app-android/src/main/java/org/solovyev/android/calculator/CalculatorActivityLauncher.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorActivityLauncher.java rename to app-android/src/main/java/org/solovyev/android/calculator/CalculatorActivityLauncher.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorActivityMobile.java b/app-android/src/main/java/org/solovyev/android/calculator/CalculatorActivityMobile.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorActivityMobile.java rename to app-android/src/main/java/org/solovyev/android/calculator/CalculatorActivityMobile.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorApplication.java b/app-android/src/main/java/org/solovyev/android/calculator/CalculatorApplication.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorApplication.java rename to app-android/src/main/java/org/solovyev/android/calculator/CalculatorApplication.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorButtons.java b/app-android/src/main/java/org/solovyev/android/calculator/CalculatorButtons.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorButtons.java rename to app-android/src/main/java/org/solovyev/android/calculator/CalculatorButtons.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorDisplayFragment.java b/app-android/src/main/java/org/solovyev/android/calculator/CalculatorDisplayFragment.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorDisplayFragment.java rename to app-android/src/main/java/org/solovyev/android/calculator/CalculatorDisplayFragment.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorDisplayMenuItem.java b/app-android/src/main/java/org/solovyev/android/calculator/CalculatorDisplayMenuItem.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorDisplayMenuItem.java rename to app-android/src/main/java/org/solovyev/android/calculator/CalculatorDisplayMenuItem.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorDisplayOnClickListener.java b/app-android/src/main/java/org/solovyev/android/calculator/CalculatorDisplayOnClickListener.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorDisplayOnClickListener.java rename to app-android/src/main/java/org/solovyev/android/calculator/CalculatorDisplayOnClickListener.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorEditorFragment.java b/app-android/src/main/java/org/solovyev/android/calculator/CalculatorEditorFragment.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorEditorFragment.java rename to app-android/src/main/java/org/solovyev/android/calculator/CalculatorEditorFragment.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorFixableMessage.java b/app-android/src/main/java/org/solovyev/android/calculator/CalculatorFixableMessage.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorFixableMessage.java rename to app-android/src/main/java/org/solovyev/android/calculator/CalculatorFixableMessage.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorFragment.java b/app-android/src/main/java/org/solovyev/android/calculator/CalculatorFragment.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorFragment.java rename to app-android/src/main/java/org/solovyev/android/calculator/CalculatorFragment.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorFragmentActivity.java b/app-android/src/main/java/org/solovyev/android/calculator/CalculatorFragmentActivity.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorFragmentActivity.java rename to app-android/src/main/java/org/solovyev/android/calculator/CalculatorFragmentActivity.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorFragmentHelper.java b/app-android/src/main/java/org/solovyev/android/calculator/CalculatorFragmentHelper.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorFragmentHelper.java rename to app-android/src/main/java/org/solovyev/android/calculator/CalculatorFragmentHelper.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorFragmentHelperImpl.java b/app-android/src/main/java/org/solovyev/android/calculator/CalculatorFragmentHelperImpl.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorFragmentHelperImpl.java rename to app-android/src/main/java/org/solovyev/android/calculator/CalculatorFragmentHelperImpl.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorKeyboardFragment.java b/app-android/src/main/java/org/solovyev/android/calculator/CalculatorKeyboardFragment.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorKeyboardFragment.java rename to app-android/src/main/java/org/solovyev/android/calculator/CalculatorKeyboardFragment.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorMenu.java b/app-android/src/main/java/org/solovyev/android/calculator/CalculatorMenu.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorMenu.java rename to app-android/src/main/java/org/solovyev/android/calculator/CalculatorMenu.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorMessagesDialog.java b/app-android/src/main/java/org/solovyev/android/calculator/CalculatorMessagesDialog.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorMessagesDialog.java rename to app-android/src/main/java/org/solovyev/android/calculator/CalculatorMessagesDialog.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorOnscreenStartActivity.java b/app-android/src/main/java/org/solovyev/android/calculator/CalculatorOnscreenStartActivity.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorOnscreenStartActivity.java rename to app-android/src/main/java/org/solovyev/android/calculator/CalculatorOnscreenStartActivity.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorPreferences.java b/app-android/src/main/java/org/solovyev/android/calculator/CalculatorPreferences.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorPreferences.java rename to app-android/src/main/java/org/solovyev/android/calculator/CalculatorPreferences.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorPreferencesActivity.java b/app-android/src/main/java/org/solovyev/android/calculator/CalculatorPreferencesActivity.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorPreferencesActivity.java rename to app-android/src/main/java/org/solovyev/android/calculator/CalculatorPreferencesActivity.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorSecurity.java b/app-android/src/main/java/org/solovyev/android/calculator/CalculatorSecurity.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/CalculatorSecurity.java rename to app-android/src/main/java/org/solovyev/android/calculator/CalculatorSecurity.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/CharacterAtPositionFinder.java b/app-android/src/main/java/org/solovyev/android/calculator/CharacterAtPositionFinder.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/CharacterAtPositionFinder.java rename to app-android/src/main/java/org/solovyev/android/calculator/CharacterAtPositionFinder.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/ConversionMenuItem.java b/app-android/src/main/java/org/solovyev/android/calculator/ConversionMenuItem.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/ConversionMenuItem.java rename to app-android/src/main/java/org/solovyev/android/calculator/ConversionMenuItem.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/CursorDragProcessor.java b/app-android/src/main/java/org/solovyev/android/calculator/CursorDragProcessor.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/CursorDragProcessor.java rename to app-android/src/main/java/org/solovyev/android/calculator/CursorDragProcessor.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/DigitButtonDragProcessor.java b/app-android/src/main/java/org/solovyev/android/calculator/DigitButtonDragProcessor.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/DigitButtonDragProcessor.java rename to app-android/src/main/java/org/solovyev/android/calculator/DigitButtonDragProcessor.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/EvalDragProcessor.java b/app-android/src/main/java/org/solovyev/android/calculator/EvalDragProcessor.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/EvalDragProcessor.java rename to app-android/src/main/java/org/solovyev/android/calculator/EvalDragProcessor.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/NumeralBaseButtons.java b/app-android/src/main/java/org/solovyev/android/calculator/NumeralBaseButtons.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/NumeralBaseButtons.java rename to app-android/src/main/java/org/solovyev/android/calculator/NumeralBaseButtons.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/ParcelableCalculatorDisplayViewState.java b/app-android/src/main/java/org/solovyev/android/calculator/ParcelableCalculatorDisplayViewState.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/ParcelableCalculatorDisplayViewState.java rename to app-android/src/main/java/org/solovyev/android/calculator/ParcelableCalculatorDisplayViewState.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/ParcelableCalculatorEditorViewState.java b/app-android/src/main/java/org/solovyev/android/calculator/ParcelableCalculatorEditorViewState.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/ParcelableCalculatorEditorViewState.java rename to app-android/src/main/java/org/solovyev/android/calculator/ParcelableCalculatorEditorViewState.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/about/CalculatorAboutActivity.java b/app-android/src/main/java/org/solovyev/android/calculator/about/CalculatorAboutActivity.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/about/CalculatorAboutActivity.java rename to app-android/src/main/java/org/solovyev/android/calculator/about/CalculatorAboutActivity.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/about/CalculatorAboutFragment.java b/app-android/src/main/java/org/solovyev/android/calculator/about/CalculatorAboutFragment.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/about/CalculatorAboutFragment.java rename to app-android/src/main/java/org/solovyev/android/calculator/about/CalculatorAboutFragment.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/about/CalculatorFragmentType.java b/app-android/src/main/java/org/solovyev/android/calculator/about/CalculatorFragmentType.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/about/CalculatorFragmentType.java rename to app-android/src/main/java/org/solovyev/android/calculator/about/CalculatorFragmentType.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/about/CalculatorReleaseNotesFragment.java b/app-android/src/main/java/org/solovyev/android/calculator/about/CalculatorReleaseNotesFragment.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/about/CalculatorReleaseNotesFragment.java rename to app-android/src/main/java/org/solovyev/android/calculator/about/CalculatorReleaseNotesFragment.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/about/TextHelper.java b/app-android/src/main/java/org/solovyev/android/calculator/about/TextHelper.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/about/TextHelper.java rename to app-android/src/main/java/org/solovyev/android/calculator/about/TextHelper.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/external/AndroidExternalListenersContainer.java b/app-android/src/main/java/org/solovyev/android/calculator/external/AndroidExternalListenersContainer.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/external/AndroidExternalListenersContainer.java rename to app-android/src/main/java/org/solovyev/android/calculator/external/AndroidExternalListenersContainer.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/external/DefaultExternalCalculatorIntentHandler.java b/app-android/src/main/java/org/solovyev/android/calculator/external/DefaultExternalCalculatorIntentHandler.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/external/DefaultExternalCalculatorIntentHandler.java rename to app-android/src/main/java/org/solovyev/android/calculator/external/DefaultExternalCalculatorIntentHandler.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/external/ExternalCalculatorIntentHandler.java b/app-android/src/main/java/org/solovyev/android/calculator/external/ExternalCalculatorIntentHandler.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/external/ExternalCalculatorIntentHandler.java rename to app-android/src/main/java/org/solovyev/android/calculator/external/ExternalCalculatorIntentHandler.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/external/ExternalCalculatorStateUpdater.java b/app-android/src/main/java/org/solovyev/android/calculator/external/ExternalCalculatorStateUpdater.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/external/ExternalCalculatorStateUpdater.java rename to app-android/src/main/java/org/solovyev/android/calculator/external/ExternalCalculatorStateUpdater.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/function/FunctionEditDialogFragment.java b/app-android/src/main/java/org/solovyev/android/calculator/function/FunctionEditDialogFragment.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/function/FunctionEditDialogFragment.java rename to app-android/src/main/java/org/solovyev/android/calculator/function/FunctionEditDialogFragment.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/function/FunctionEditorSaver.java b/app-android/src/main/java/org/solovyev/android/calculator/function/FunctionEditorSaver.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/function/FunctionEditorSaver.java rename to app-android/src/main/java/org/solovyev/android/calculator/function/FunctionEditorSaver.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/function/FunctionParamEditText.java b/app-android/src/main/java/org/solovyev/android/calculator/function/FunctionParamEditText.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/function/FunctionParamEditText.java rename to app-android/src/main/java/org/solovyev/android/calculator/function/FunctionParamEditText.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/function/FunctionParamsView.java b/app-android/src/main/java/org/solovyev/android/calculator/function/FunctionParamsView.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/function/FunctionParamsView.java rename to app-android/src/main/java/org/solovyev/android/calculator/function/FunctionParamsView.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/help/CalculatorHelpActivity.java b/app-android/src/main/java/org/solovyev/android/calculator/help/CalculatorHelpActivity.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/help/CalculatorHelpActivity.java rename to app-android/src/main/java/org/solovyev/android/calculator/help/CalculatorHelpActivity.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/help/CalculatorHelpFaqFragment.java b/app-android/src/main/java/org/solovyev/android/calculator/help/CalculatorHelpFaqFragment.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/help/CalculatorHelpFaqFragment.java rename to app-android/src/main/java/org/solovyev/android/calculator/help/CalculatorHelpFaqFragment.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/help/CalculatorHelpHintsFragment.java b/app-android/src/main/java/org/solovyev/android/calculator/help/CalculatorHelpHintsFragment.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/help/CalculatorHelpHintsFragment.java rename to app-android/src/main/java/org/solovyev/android/calculator/help/CalculatorHelpHintsFragment.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/help/CalculatorHelpScreensFragment.java b/app-android/src/main/java/org/solovyev/android/calculator/help/CalculatorHelpScreensFragment.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/help/CalculatorHelpScreensFragment.java rename to app-android/src/main/java/org/solovyev/android/calculator/help/CalculatorHelpScreensFragment.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/history/AbstractCalculatorHistoryFragment.java b/app-android/src/main/java/org/solovyev/android/calculator/history/AbstractCalculatorHistoryFragment.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/history/AbstractCalculatorHistoryFragment.java rename to app-android/src/main/java/org/solovyev/android/calculator/history/AbstractCalculatorHistoryFragment.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/history/AndroidCalculatorHistory.java b/app-android/src/main/java/org/solovyev/android/calculator/history/AndroidCalculatorHistory.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/history/AndroidCalculatorHistory.java rename to app-android/src/main/java/org/solovyev/android/calculator/history/AndroidCalculatorHistory.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/history/CalculatorHistoryActivity.java b/app-android/src/main/java/org/solovyev/android/calculator/history/CalculatorHistoryActivity.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/history/CalculatorHistoryActivity.java rename to app-android/src/main/java/org/solovyev/android/calculator/history/CalculatorHistoryActivity.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/history/CalculatorHistoryFragment.java b/app-android/src/main/java/org/solovyev/android/calculator/history/CalculatorHistoryFragment.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/history/CalculatorHistoryFragment.java rename to app-android/src/main/java/org/solovyev/android/calculator/history/CalculatorHistoryFragment.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/history/CalculatorSavedHistoryFragment.java b/app-android/src/main/java/org/solovyev/android/calculator/history/CalculatorSavedHistoryFragment.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/history/CalculatorSavedHistoryFragment.java rename to app-android/src/main/java/org/solovyev/android/calculator/history/CalculatorSavedHistoryFragment.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/history/HistoryArrayAdapter.java b/app-android/src/main/java/org/solovyev/android/calculator/history/HistoryArrayAdapter.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/history/HistoryArrayAdapter.java rename to app-android/src/main/java/org/solovyev/android/calculator/history/HistoryArrayAdapter.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/history/HistoryItemMenuData.java b/app-android/src/main/java/org/solovyev/android/calculator/history/HistoryItemMenuData.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/history/HistoryItemMenuData.java rename to app-android/src/main/java/org/solovyev/android/calculator/history/HistoryItemMenuData.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/history/HistoryItemMenuItem.java b/app-android/src/main/java/org/solovyev/android/calculator/history/HistoryItemMenuItem.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/history/HistoryItemMenuItem.java rename to app-android/src/main/java/org/solovyev/android/calculator/history/HistoryItemMenuItem.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/history/TextViewEditorAdapter.java b/app-android/src/main/java/org/solovyev/android/calculator/history/TextViewEditorAdapter.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/history/TextViewEditorAdapter.java rename to app-android/src/main/java/org/solovyev/android/calculator/history/TextViewEditorAdapter.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/math/edit/AbstractMathEntityListFragment.java b/app-android/src/main/java/org/solovyev/android/calculator/math/edit/AbstractMathEntityListFragment.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/math/edit/AbstractMathEntityListFragment.java rename to app-android/src/main/java/org/solovyev/android/calculator/math/edit/AbstractMathEntityListFragment.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorFunctionsActivity.java b/app-android/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorFunctionsActivity.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorFunctionsActivity.java rename to app-android/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorFunctionsActivity.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorFunctionsFragment.java b/app-android/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorFunctionsFragment.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorFunctionsFragment.java rename to app-android/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorFunctionsFragment.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorOperatorsActivity.java b/app-android/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorOperatorsActivity.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorOperatorsActivity.java rename to app-android/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorOperatorsActivity.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorOperatorsFragment.java b/app-android/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorOperatorsFragment.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorOperatorsFragment.java rename to app-android/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorOperatorsFragment.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorVarsActivity.java b/app-android/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorVarsActivity.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorVarsActivity.java rename to app-android/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorVarsActivity.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorVarsFragment.java b/app-android/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorVarsFragment.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorVarsFragment.java rename to app-android/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorVarsFragment.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/math/edit/MathEntityRemover.java b/app-android/src/main/java/org/solovyev/android/calculator/math/edit/MathEntityRemover.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/math/edit/MathEntityRemover.java rename to app-android/src/main/java/org/solovyev/android/calculator/math/edit/MathEntityRemover.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/math/edit/VarEditDialogFragment.java b/app-android/src/main/java/org/solovyev/android/calculator/math/edit/VarEditDialogFragment.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/math/edit/VarEditDialogFragment.java rename to app-android/src/main/java/org/solovyev/android/calculator/math/edit/VarEditDialogFragment.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/math/edit/VarEditorSaver.java b/app-android/src/main/java/org/solovyev/android/calculator/math/edit/VarEditorSaver.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/math/edit/VarEditorSaver.java rename to app-android/src/main/java/org/solovyev/android/calculator/math/edit/VarEditorSaver.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/model/AndroidCalculatorEngine.java b/app-android/src/main/java/org/solovyev/android/calculator/model/AndroidCalculatorEngine.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/model/AndroidCalculatorEngine.java rename to app-android/src/main/java/org/solovyev/android/calculator/model/AndroidCalculatorEngine.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/model/AndroidMathEntityDao.java b/app-android/src/main/java/org/solovyev/android/calculator/model/AndroidMathEntityDao.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/model/AndroidMathEntityDao.java rename to app-android/src/main/java/org/solovyev/android/calculator/model/AndroidMathEntityDao.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/model/Messages.java b/app-android/src/main/java/org/solovyev/android/calculator/model/Messages.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/model/Messages.java rename to app-android/src/main/java/org/solovyev/android/calculator/model/Messages.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenBroadcastReceiver.java b/app-android/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenBroadcastReceiver.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenBroadcastReceiver.java rename to app-android/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenBroadcastReceiver.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenService.java b/app-android/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenService.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenService.java rename to app-android/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenService.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenView.java b/app-android/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenView.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenView.java rename to app-android/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenView.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenViewDef.java b/app-android/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenViewDef.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenViewDef.java rename to app-android/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenViewDef.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/onscreen/OnscreenViewListener.java b/app-android/src/main/java/org/solovyev/android/calculator/onscreen/OnscreenViewListener.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/onscreen/OnscreenViewListener.java rename to app-android/src/main/java/org/solovyev/android/calculator/onscreen/OnscreenViewListener.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/plot/CalculatorPlotActivity.java b/app-android/src/main/java/org/solovyev/android/calculator/plot/CalculatorPlotActivity.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/plot/CalculatorPlotActivity.java rename to app-android/src/main/java/org/solovyev/android/calculator/plot/CalculatorPlotActivity.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/plot/CalculatorPlotFragment.java b/app-android/src/main/java/org/solovyev/android/calculator/plot/CalculatorPlotFragment.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/plot/CalculatorPlotFragment.java rename to app-android/src/main/java/org/solovyev/android/calculator/plot/CalculatorPlotFragment.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/plot/CalculatorPlotPreferenceActivity.java b/app-android/src/main/java/org/solovyev/android/calculator/plot/CalculatorPlotPreferenceActivity.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/plot/CalculatorPlotPreferenceActivity.java rename to app-android/src/main/java/org/solovyev/android/calculator/plot/CalculatorPlotPreferenceActivity.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/plot/GraphLineColor.java b/app-android/src/main/java/org/solovyev/android/calculator/plot/GraphLineColor.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/plot/GraphLineColor.java rename to app-android/src/main/java/org/solovyev/android/calculator/plot/GraphLineColor.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/plot/MyXYSeries.java b/app-android/src/main/java/org/solovyev/android/calculator/plot/MyXYSeries.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/plot/MyXYSeries.java rename to app-android/src/main/java/org/solovyev/android/calculator/plot/MyXYSeries.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/plot/PlotUtils.java b/app-android/src/main/java/org/solovyev/android/calculator/plot/PlotUtils.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/plot/PlotUtils.java rename to app-android/src/main/java/org/solovyev/android/calculator/plot/PlotUtils.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/view/AngleUnitsButton.java b/app-android/src/main/java/org/solovyev/android/calculator/view/AngleUnitsButton.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/view/AngleUnitsButton.java rename to app-android/src/main/java/org/solovyev/android/calculator/view/AngleUnitsButton.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/view/CalculatorAdditionalTitle.java b/app-android/src/main/java/org/solovyev/android/calculator/view/CalculatorAdditionalTitle.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/view/CalculatorAdditionalTitle.java rename to app-android/src/main/java/org/solovyev/android/calculator/view/CalculatorAdditionalTitle.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/view/NumeralBaseConverterDialog.java b/app-android/src/main/java/org/solovyev/android/calculator/view/NumeralBaseConverterDialog.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/view/NumeralBaseConverterDialog.java rename to app-android/src/main/java/org/solovyev/android/calculator/view/NumeralBaseConverterDialog.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/view/NumeralBasesButton.java b/app-android/src/main/java/org/solovyev/android/calculator/view/NumeralBasesButton.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/view/NumeralBasesButton.java rename to app-android/src/main/java/org/solovyev/android/calculator/view/NumeralBasesButton.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/view/OnDragListenerVibrator.java b/app-android/src/main/java/org/solovyev/android/calculator/view/OnDragListenerVibrator.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/view/OnDragListenerVibrator.java rename to app-android/src/main/java/org/solovyev/android/calculator/view/OnDragListenerVibrator.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/view/TextHighlighter.java b/app-android/src/main/java/org/solovyev/android/calculator/view/TextHighlighter.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/view/TextHighlighter.java rename to app-android/src/main/java/org/solovyev/android/calculator/view/TextHighlighter.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/view/UnitConverterViewBuilder.java b/app-android/src/main/java/org/solovyev/android/calculator/view/UnitConverterViewBuilder.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/view/UnitConverterViewBuilder.java rename to app-android/src/main/java/org/solovyev/android/calculator/view/UnitConverterViewBuilder.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/widget/AbstractCalculatorWidgetProvider.java b/app-android/src/main/java/org/solovyev/android/calculator/widget/AbstractCalculatorWidgetProvider.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/widget/AbstractCalculatorWidgetProvider.java rename to app-android/src/main/java/org/solovyev/android/calculator/widget/AbstractCalculatorWidgetProvider.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetConfigurationActivity.java b/app-android/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetConfigurationActivity.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetConfigurationActivity.java rename to app-android/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetConfigurationActivity.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetIntentHandler.java b/app-android/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetIntentHandler.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetIntentHandler.java rename to app-android/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetIntentHandler.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider.java b/app-android/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider.java rename to app-android/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider3x4.java b/app-android/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider3x4.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider3x4.java rename to app-android/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider3x4.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider4x4.java b/app-android/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider4x4.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider4x4.java rename to app-android/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider4x4.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider4x5.java b/app-android/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider4x5.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider4x5.java rename to app-android/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider4x5.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/widget/WidgetButton.java b/app-android/src/main/java/org/solovyev/android/calculator/widget/WidgetButton.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/calculator/widget/WidgetButton.java rename to app-android/src/main/java/org/solovyev/android/calculator/widget/WidgetButton.java diff --git a/calculatorpp/src/main/java/org/solovyev/android/fragments/FragmentUtils.java b/app-android/src/main/java/org/solovyev/android/fragments/FragmentUtils.java similarity index 100% rename from calculatorpp/src/main/java/org/solovyev/android/fragments/FragmentUtils.java rename to app-android/src/main/java/org/solovyev/android/fragments/FragmentUtils.java diff --git a/calculatorpp/src/test/java/org/solovyev/android/AndroidNumeralBaseTest.java b/app-android/src/test/java/org/solovyev/android/AndroidNumeralBaseTest.java similarity index 100% rename from calculatorpp/src/test/java/org/solovyev/android/AndroidNumeralBaseTest.java rename to app-android/src/test/java/org/solovyev/android/AndroidNumeralBaseTest.java diff --git a/calculatorpp/src/test/java/org/solovyev/android/calculator/AndroidCalculatorEditorViewTest.java b/app-android/src/test/java/org/solovyev/android/calculator/AndroidCalculatorEditorViewTest.java similarity index 100% rename from calculatorpp/src/test/java/org/solovyev/android/calculator/AndroidCalculatorEditorViewTest.java rename to app-android/src/test/java/org/solovyev/android/calculator/AndroidCalculatorEditorViewTest.java diff --git a/calculatorpp/src/test/java/org/solovyev/android/calculator/CalculatorTestUtils.java b/app-android/src/test/java/org/solovyev/android/calculator/CalculatorTestUtils.java similarity index 100% rename from calculatorpp/src/test/java/org/solovyev/android/calculator/CalculatorTestUtils.java rename to app-android/src/test/java/org/solovyev/android/calculator/CalculatorTestUtils.java diff --git a/calculatorpp/src/test/java/org/solovyev/android/calculator/CalculatorppTestRunner.java b/app-android/src/test/java/org/solovyev/android/calculator/CalculatorppTestRunner.java similarity index 100% rename from calculatorpp/src/test/java/org/solovyev/android/calculator/CalculatorppTestRunner.java rename to app-android/src/test/java/org/solovyev/android/calculator/CalculatorppTestRunner.java diff --git a/calculatorpp/src/test/java/org/solovyev/android/calculator/TextHighlighterTest.java b/app-android/src/test/java/org/solovyev/android/calculator/TextHighlighterTest.java similarity index 100% rename from calculatorpp/src/test/java/org/solovyev/android/calculator/TextHighlighterTest.java rename to app-android/src/test/java/org/solovyev/android/calculator/TextHighlighterTest.java diff --git a/calculatorpp/src/test/java/org/solovyev/android/calculator/history/HistoryUtilsTest.java b/app-android/src/test/java/org/solovyev/android/calculator/history/HistoryUtilsTest.java similarity index 100% rename from calculatorpp/src/test/java/org/solovyev/android/calculator/history/HistoryUtilsTest.java rename to app-android/src/test/java/org/solovyev/android/calculator/history/HistoryUtilsTest.java diff --git a/calculatorpp/src/test/java/org/solovyev/android/calculator/model/VarTest.java b/app-android/src/test/java/org/solovyev/android/calculator/model/VarTest.java similarity index 100% rename from calculatorpp/src/test/java/org/solovyev/android/calculator/model/VarTest.java rename to app-android/src/test/java/org/solovyev/android/calculator/model/VarTest.java diff --git a/calculatorpp/src/test/java/org/solovyev/android/calculator/plot/PlotUtilsTest.java b/app-android/src/test/java/org/solovyev/android/calculator/plot/PlotUtilsTest.java similarity index 100% rename from calculatorpp/src/test/java/org/solovyev/android/calculator/plot/PlotUtilsTest.java rename to app-android/src/test/java/org/solovyev/android/calculator/plot/PlotUtilsTest.java diff --git a/calculatorpp/src/test/java/org/solovyev/common/FloatIntervalMapperTest.java b/app-android/src/test/java/org/solovyev/common/FloatIntervalMapperTest.java similarity index 100% rename from calculatorpp/src/test/java/org/solovyev/common/FloatIntervalMapperTest.java rename to app-android/src/test/java/org/solovyev/common/FloatIntervalMapperTest.java diff --git a/calculatorpp/src/test/java/org/solovyev/common/math/DiscreteNormalizerTest.java b/app-android/src/test/java/org/solovyev/common/math/DiscreteNormalizerTest.java similarity index 100% rename from calculatorpp/src/test/java/org/solovyev/common/math/DiscreteNormalizerTest.java rename to app-android/src/test/java/org/solovyev/common/math/DiscreteNormalizerTest.java diff --git a/calculatorpp-core/pom.xml b/core/pom.xml similarity index 100% rename from calculatorpp-core/pom.xml rename to core/pom.xml diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/AbstractCalculatorMathRegistry.java b/core/src/main/java/org/solovyev/android/calculator/AbstractCalculatorMathRegistry.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/AbstractCalculatorMathRegistry.java rename to core/src/main/java/org/solovyev/android/calculator/AbstractCalculatorMathRegistry.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/AbstractNumberBuilder.java b/core/src/main/java/org/solovyev/android/calculator/AbstractNumberBuilder.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/AbstractNumberBuilder.java rename to core/src/main/java/org/solovyev/android/calculator/AbstractNumberBuilder.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/Calculator.java b/core/src/main/java/org/solovyev/android/calculator/Calculator.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/Calculator.java rename to core/src/main/java/org/solovyev/android/calculator/Calculator.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorButtonActions.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorButtonActions.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorButtonActions.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorButtonActions.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorClipboard.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorClipboard.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorClipboard.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorClipboard.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorConversionEventData.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorConversionEventData.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorConversionEventData.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorConversionEventData.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorConversionEventDataImpl.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorConversionEventDataImpl.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorConversionEventDataImpl.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorConversionEventDataImpl.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorDisplay.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorDisplay.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorDisplay.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorDisplay.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorDisplayChangeEventData.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorDisplayChangeEventData.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorDisplayChangeEventData.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorDisplayChangeEventData.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorDisplayChangeEventDataImpl.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorDisplayChangeEventDataImpl.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorDisplayChangeEventDataImpl.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorDisplayChangeEventDataImpl.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorDisplayImpl.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorDisplayImpl.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorDisplayImpl.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorDisplayImpl.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorDisplayView.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorDisplayView.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorDisplayView.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorDisplayView.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorDisplayViewState.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorDisplayViewState.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorDisplayViewState.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorDisplayViewState.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorDisplayViewStateImpl.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorDisplayViewStateImpl.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorDisplayViewStateImpl.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorDisplayViewStateImpl.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEditor.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorEditor.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEditor.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorEditor.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEditorChangeEventData.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorEditorChangeEventData.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEditorChangeEventData.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorEditorChangeEventData.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEditorChangeEventDataImpl.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorEditorChangeEventDataImpl.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEditorChangeEventDataImpl.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorEditorChangeEventDataImpl.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEditorImpl.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorEditorImpl.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEditorImpl.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorEditorImpl.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEditorView.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorEditorView.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEditorView.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorEditorView.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEditorViewState.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorEditorViewState.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEditorViewState.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorEditorViewState.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEditorViewStateImpl.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorEditorViewStateImpl.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEditorViewStateImpl.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorEditorViewStateImpl.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEngine.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorEngine.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEngine.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorEngine.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEngineControl.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorEngineControl.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEngineControl.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorEngineControl.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEngineImpl.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorEngineImpl.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEngineImpl.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorEngineImpl.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEvalException.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorEvalException.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEvalException.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorEvalException.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEvaluationEventData.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorEvaluationEventData.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEvaluationEventData.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorEvaluationEventData.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEvaluationEventDataImpl.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorEvaluationEventDataImpl.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEvaluationEventDataImpl.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorEvaluationEventDataImpl.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEventContainer.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorEventContainer.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEventContainer.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorEventContainer.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEventData.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorEventData.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEventData.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorEventData.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEventDataImpl.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorEventDataImpl.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEventDataImpl.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorEventDataImpl.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEventHolder.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorEventHolder.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEventHolder.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorEventHolder.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEventListener.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorEventListener.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEventListener.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorEventListener.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEventType.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorEventType.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEventType.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorEventType.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorFailure.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorFailure.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorFailure.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorFailure.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorFailureImpl.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorFailureImpl.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorFailureImpl.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorFailureImpl.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorFixableError.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorFixableError.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorFixableError.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorFixableError.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorFunctionsMathRegistry.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorFunctionsMathRegistry.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorFunctionsMathRegistry.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorFunctionsMathRegistry.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorImpl.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorImpl.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorImpl.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorImpl.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorInput.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorInput.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorInput.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorInput.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorInputImpl.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorInputImpl.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorInputImpl.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorInputImpl.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorKeyboard.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorKeyboard.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorKeyboard.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorKeyboard.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorKeyboardImpl.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorKeyboardImpl.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorKeyboardImpl.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorKeyboardImpl.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorLocator.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorLocator.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorLocator.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorLocator.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorLogger.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorLogger.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorLogger.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorLogger.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorMathEngine.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorMathEngine.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorMathEngine.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorMathEngine.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorMathRegistry.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorMathRegistry.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorMathRegistry.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorMathRegistry.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorMessage.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorMessage.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorMessage.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorMessage.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorMessages.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorMessages.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorMessages.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorMessages.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorNotifier.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorNotifier.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorNotifier.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorNotifier.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorOperatorsMathRegistry.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorOperatorsMathRegistry.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorOperatorsMathRegistry.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorOperatorsMathRegistry.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorOutput.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorOutput.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorOutput.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorOutput.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorOutputImpl.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorOutputImpl.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorOutputImpl.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorOutputImpl.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorParseException.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorParseException.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorParseException.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorParseException.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorPostfixFunctionsRegistry.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorPostfixFunctionsRegistry.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorPostfixFunctionsRegistry.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorPostfixFunctionsRegistry.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorPreferenceService.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorPreferenceService.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorPreferenceService.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorPreferenceService.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorSpecialButton.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorSpecialButton.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorSpecialButton.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorSpecialButton.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorUtils.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorUtils.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorUtils.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorUtils.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorVarsRegistry.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorVarsRegistry.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorVarsRegistry.java rename to core/src/main/java/org/solovyev/android/calculator/CalculatorVarsRegistry.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/Change.java b/core/src/main/java/org/solovyev/android/calculator/Change.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/Change.java rename to core/src/main/java/org/solovyev/android/calculator/Change.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/ChangeImpl.java b/core/src/main/java/org/solovyev/android/calculator/ChangeImpl.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/ChangeImpl.java rename to core/src/main/java/org/solovyev/android/calculator/ChangeImpl.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/ConversionFailure.java b/core/src/main/java/org/solovyev/android/calculator/ConversionFailure.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/ConversionFailure.java rename to core/src/main/java/org/solovyev/android/calculator/ConversionFailure.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/ConversionFailureImpl.java b/core/src/main/java/org/solovyev/android/calculator/ConversionFailureImpl.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/ConversionFailureImpl.java rename to core/src/main/java/org/solovyev/android/calculator/ConversionFailureImpl.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/DummyCalculatorClipboard.java b/core/src/main/java/org/solovyev/android/calculator/DummyCalculatorClipboard.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/DummyCalculatorClipboard.java rename to core/src/main/java/org/solovyev/android/calculator/DummyCalculatorClipboard.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/DummyCalculatorNotifier.java b/core/src/main/java/org/solovyev/android/calculator/DummyCalculatorNotifier.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/DummyCalculatorNotifier.java rename to core/src/main/java/org/solovyev/android/calculator/DummyCalculatorNotifier.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/Editor.java b/core/src/main/java/org/solovyev/android/calculator/Editor.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/Editor.java rename to core/src/main/java/org/solovyev/android/calculator/Editor.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/FunctionCategory.java b/core/src/main/java/org/solovyev/android/calculator/FunctionCategory.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/FunctionCategory.java rename to core/src/main/java/org/solovyev/android/calculator/FunctionCategory.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/ListCalculatorEventContainer.java b/core/src/main/java/org/solovyev/android/calculator/ListCalculatorEventContainer.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/ListCalculatorEventContainer.java rename to core/src/main/java/org/solovyev/android/calculator/ListCalculatorEventContainer.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/LiteNumberBuilder.java b/core/src/main/java/org/solovyev/android/calculator/LiteNumberBuilder.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/LiteNumberBuilder.java rename to core/src/main/java/org/solovyev/android/calculator/LiteNumberBuilder.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/Locator.java b/core/src/main/java/org/solovyev/android/calculator/Locator.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/Locator.java rename to core/src/main/java/org/solovyev/android/calculator/Locator.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/MathEntityDao.java b/core/src/main/java/org/solovyev/android/calculator/MathEntityDao.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/MathEntityDao.java rename to core/src/main/java/org/solovyev/android/calculator/MathEntityDao.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/MathEntityPersistenceContainer.java b/core/src/main/java/org/solovyev/android/calculator/MathEntityPersistenceContainer.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/MathEntityPersistenceContainer.java rename to core/src/main/java/org/solovyev/android/calculator/MathEntityPersistenceContainer.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/MathPersistenceEntity.java b/core/src/main/java/org/solovyev/android/calculator/MathPersistenceEntity.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/MathPersistenceEntity.java rename to core/src/main/java/org/solovyev/android/calculator/MathPersistenceEntity.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/NumberBuilder.java b/core/src/main/java/org/solovyev/android/calculator/NumberBuilder.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/NumberBuilder.java rename to core/src/main/java/org/solovyev/android/calculator/NumberBuilder.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/OperatorCategory.java b/core/src/main/java/org/solovyev/android/calculator/OperatorCategory.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/OperatorCategory.java rename to core/src/main/java/org/solovyev/android/calculator/OperatorCategory.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/PreparedExpression.java b/core/src/main/java/org/solovyev/android/calculator/PreparedExpression.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/PreparedExpression.java rename to core/src/main/java/org/solovyev/android/calculator/PreparedExpression.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/SystemOutCalculatorLogger.java b/core/src/main/java/org/solovyev/android/calculator/SystemOutCalculatorLogger.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/SystemOutCalculatorLogger.java rename to core/src/main/java/org/solovyev/android/calculator/SystemOutCalculatorLogger.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/ToJsclTextProcessor.java b/core/src/main/java/org/solovyev/android/calculator/ToJsclTextProcessor.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/ToJsclTextProcessor.java rename to core/src/main/java/org/solovyev/android/calculator/ToJsclTextProcessor.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/VarCategory.java b/core/src/main/java/org/solovyev/android/calculator/VarCategory.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/VarCategory.java rename to core/src/main/java/org/solovyev/android/calculator/VarCategory.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/external/CalculatorExternalListenersContainer.java b/core/src/main/java/org/solovyev/android/calculator/external/CalculatorExternalListenersContainer.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/external/CalculatorExternalListenersContainer.java rename to core/src/main/java/org/solovyev/android/calculator/external/CalculatorExternalListenersContainer.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/history/AbstractHistoryState.java b/core/src/main/java/org/solovyev/android/calculator/history/AbstractHistoryState.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/history/AbstractHistoryState.java rename to core/src/main/java/org/solovyev/android/calculator/history/AbstractHistoryState.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/history/CalculatorDisplayHistoryState.java b/core/src/main/java/org/solovyev/android/calculator/history/CalculatorDisplayHistoryState.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/history/CalculatorDisplayHistoryState.java rename to core/src/main/java/org/solovyev/android/calculator/history/CalculatorDisplayHistoryState.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/history/CalculatorHistory.java b/core/src/main/java/org/solovyev/android/calculator/history/CalculatorHistory.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/history/CalculatorHistory.java rename to core/src/main/java/org/solovyev/android/calculator/history/CalculatorHistory.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/history/CalculatorHistoryImpl.java b/core/src/main/java/org/solovyev/android/calculator/history/CalculatorHistoryImpl.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/history/CalculatorHistoryImpl.java rename to core/src/main/java/org/solovyev/android/calculator/history/CalculatorHistoryImpl.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/history/CalculatorHistoryState.java b/core/src/main/java/org/solovyev/android/calculator/history/CalculatorHistoryState.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/history/CalculatorHistoryState.java rename to core/src/main/java/org/solovyev/android/calculator/history/CalculatorHistoryState.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/history/EditorHistoryState.java b/core/src/main/java/org/solovyev/android/calculator/history/EditorHistoryState.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/history/EditorHistoryState.java rename to core/src/main/java/org/solovyev/android/calculator/history/EditorHistoryState.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/history/History.java b/core/src/main/java/org/solovyev/android/calculator/history/History.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/history/History.java rename to core/src/main/java/org/solovyev/android/calculator/history/History.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/history/HistoryUtils.java b/core/src/main/java/org/solovyev/android/calculator/history/HistoryUtils.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/history/HistoryUtils.java rename to core/src/main/java/org/solovyev/android/calculator/history/HistoryUtils.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/jscl/FromJsclNumericTextProcessor.java b/core/src/main/java/org/solovyev/android/calculator/jscl/FromJsclNumericTextProcessor.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/jscl/FromJsclNumericTextProcessor.java rename to core/src/main/java/org/solovyev/android/calculator/jscl/FromJsclNumericTextProcessor.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/jscl/JsclOperation.java b/core/src/main/java/org/solovyev/android/calculator/jscl/JsclOperation.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/jscl/JsclOperation.java rename to core/src/main/java/org/solovyev/android/calculator/jscl/JsclOperation.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/math/MathType.java b/core/src/main/java/org/solovyev/android/calculator/math/MathType.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/math/MathType.java rename to core/src/main/java/org/solovyev/android/calculator/math/MathType.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/model/AFunction.java b/core/src/main/java/org/solovyev/android/calculator/model/AFunction.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/model/AFunction.java rename to core/src/main/java/org/solovyev/android/calculator/model/AFunction.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/model/Functions.java b/core/src/main/java/org/solovyev/android/calculator/model/Functions.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/model/Functions.java rename to core/src/main/java/org/solovyev/android/calculator/model/Functions.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/model/MathEntityBuilder.java b/core/src/main/java/org/solovyev/android/calculator/model/MathEntityBuilder.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/model/MathEntityBuilder.java rename to core/src/main/java/org/solovyev/android/calculator/model/MathEntityBuilder.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/model/Var.java b/core/src/main/java/org/solovyev/android/calculator/model/Var.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/model/Var.java rename to core/src/main/java/org/solovyev/android/calculator/model/Var.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/model/Vars.java b/core/src/main/java/org/solovyev/android/calculator/model/Vars.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/model/Vars.java rename to core/src/main/java/org/solovyev/android/calculator/model/Vars.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/text/DummyTextProcessor.java b/core/src/main/java/org/solovyev/android/calculator/text/DummyTextProcessor.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/text/DummyTextProcessor.java rename to core/src/main/java/org/solovyev/android/calculator/text/DummyTextProcessor.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/text/FromJsclSimplifyTextProcessor.java b/core/src/main/java/org/solovyev/android/calculator/text/FromJsclSimplifyTextProcessor.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/text/FromJsclSimplifyTextProcessor.java rename to core/src/main/java/org/solovyev/android/calculator/text/FromJsclSimplifyTextProcessor.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/text/TextProcessor.java b/core/src/main/java/org/solovyev/android/calculator/text/TextProcessor.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/text/TextProcessor.java rename to core/src/main/java/org/solovyev/android/calculator/text/TextProcessor.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/units/CalculatorNumeralBase.java b/core/src/main/java/org/solovyev/android/calculator/units/CalculatorNumeralBase.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/android/calculator/units/CalculatorNumeralBase.java rename to core/src/main/java/org/solovyev/android/calculator/units/CalculatorNumeralBase.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/common/utils/ListListenersContainer.java b/core/src/main/java/org/solovyev/common/utils/ListListenersContainer.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/common/utils/ListListenersContainer.java rename to core/src/main/java/org/solovyev/common/utils/ListListenersContainer.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/math/units/ConversionException.java b/core/src/main/java/org/solovyev/math/units/ConversionException.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/math/units/ConversionException.java rename to core/src/main/java/org/solovyev/math/units/ConversionException.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/math/units/ConversionUtils.java b/core/src/main/java/org/solovyev/math/units/ConversionUtils.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/math/units/ConversionUtils.java rename to core/src/main/java/org/solovyev/math/units/ConversionUtils.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/math/units/Unit.java b/core/src/main/java/org/solovyev/math/units/Unit.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/math/units/Unit.java rename to core/src/main/java/org/solovyev/math/units/Unit.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/math/units/UnitConverter.java b/core/src/main/java/org/solovyev/math/units/UnitConverter.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/math/units/UnitConverter.java rename to core/src/main/java/org/solovyev/math/units/UnitConverter.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/math/units/UnitImpl.java b/core/src/main/java/org/solovyev/math/units/UnitImpl.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/math/units/UnitImpl.java rename to core/src/main/java/org/solovyev/math/units/UnitImpl.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/math/units/UnitType.java b/core/src/main/java/org/solovyev/math/units/UnitType.java similarity index 100% rename from calculatorpp-core/src/main/java/org/solovyev/math/units/UnitType.java rename to core/src/main/java/org/solovyev/math/units/UnitType.java diff --git a/calculatorpp-core/src/main/resources/org/solovyev/android/calculator/messages.properties b/core/src/main/resources/org/solovyev/android/calculator/messages.properties similarity index 100% rename from calculatorpp-core/src/main/resources/org/solovyev/android/calculator/messages.properties rename to core/src/main/resources/org/solovyev/android/calculator/messages.properties diff --git a/calculatorpp-core/src/main/resources/org/solovyev/android/calculator/messages_ru.properties b/core/src/main/resources/org/solovyev/android/calculator/messages_ru.properties similarity index 100% rename from calculatorpp-core/src/main/resources/org/solovyev/android/calculator/messages_ru.properties rename to core/src/main/resources/org/solovyev/android/calculator/messages_ru.properties diff --git a/calculatorpp-core/src/main/resources/org/solovyev/android/calculator/messages_uk.properties b/core/src/main/resources/org/solovyev/android/calculator/messages_uk.properties similarity index 100% rename from calculatorpp-core/src/main/resources/org/solovyev/android/calculator/messages_uk.properties rename to core/src/main/resources/org/solovyev/android/calculator/messages_uk.properties diff --git a/calculatorpp-core/src/main/resources/org/solovyev/android/calculator/messages_zh.properties b/core/src/main/resources/org/solovyev/android/calculator/messages_zh.properties similarity index 100% rename from calculatorpp-core/src/main/resources/org/solovyev/android/calculator/messages_zh.properties rename to core/src/main/resources/org/solovyev/android/calculator/messages_zh.properties diff --git a/calculatorpp-core/src/test/java/org/solovyev/android/calculator/AbstractCalculatorTest.java b/core/src/test/java/org/solovyev/android/calculator/AbstractCalculatorTest.java similarity index 100% rename from calculatorpp-core/src/test/java/org/solovyev/android/calculator/AbstractCalculatorTest.java rename to core/src/test/java/org/solovyev/android/calculator/AbstractCalculatorTest.java diff --git a/calculatorpp-core/src/test/java/org/solovyev/android/calculator/CalculatorDisplayViewStateImplTest.java b/core/src/test/java/org/solovyev/android/calculator/CalculatorDisplayViewStateImplTest.java similarity index 100% rename from calculatorpp-core/src/test/java/org/solovyev/android/calculator/CalculatorDisplayViewStateImplTest.java rename to core/src/test/java/org/solovyev/android/calculator/CalculatorDisplayViewStateImplTest.java diff --git a/calculatorpp-core/src/test/java/org/solovyev/android/calculator/CalculatorEditorImplTest.java b/core/src/test/java/org/solovyev/android/calculator/CalculatorEditorImplTest.java similarity index 100% rename from calculatorpp-core/src/test/java/org/solovyev/android/calculator/CalculatorEditorImplTest.java rename to core/src/test/java/org/solovyev/android/calculator/CalculatorEditorImplTest.java diff --git a/calculatorpp-core/src/test/java/org/solovyev/android/calculator/CalculatorEditorViewStateImplTest.java b/core/src/test/java/org/solovyev/android/calculator/CalculatorEditorViewStateImplTest.java similarity index 100% rename from calculatorpp-core/src/test/java/org/solovyev/android/calculator/CalculatorEditorViewStateImplTest.java rename to core/src/test/java/org/solovyev/android/calculator/CalculatorEditorViewStateImplTest.java diff --git a/calculatorpp-core/src/test/java/org/solovyev/android/calculator/CalculatorImplTest.java b/core/src/test/java/org/solovyev/android/calculator/CalculatorImplTest.java similarity index 100% rename from calculatorpp-core/src/test/java/org/solovyev/android/calculator/CalculatorImplTest.java rename to core/src/test/java/org/solovyev/android/calculator/CalculatorImplTest.java diff --git a/calculatorpp-core/src/test/java/org/solovyev/android/calculator/CalculatorTestUtils.java b/core/src/test/java/org/solovyev/android/calculator/CalculatorTestUtils.java similarity index 100% rename from calculatorpp-core/src/test/java/org/solovyev/android/calculator/CalculatorTestUtils.java rename to core/src/test/java/org/solovyev/android/calculator/CalculatorTestUtils.java diff --git a/calculatorpp-core/src/test/java/org/solovyev/android/calculator/FromJsclSimplifyTextProcessorTest.java b/core/src/test/java/org/solovyev/android/calculator/FromJsclSimplifyTextProcessorTest.java similarity index 100% rename from calculatorpp-core/src/test/java/org/solovyev/android/calculator/FromJsclSimplifyTextProcessorTest.java rename to core/src/test/java/org/solovyev/android/calculator/FromJsclSimplifyTextProcessorTest.java diff --git a/calculatorpp-core/src/test/java/org/solovyev/android/calculator/history/CalculatorHistoryImplTest.java b/core/src/test/java/org/solovyev/android/calculator/history/CalculatorHistoryImplTest.java similarity index 100% rename from calculatorpp-core/src/test/java/org/solovyev/android/calculator/history/CalculatorHistoryImplTest.java rename to core/src/test/java/org/solovyev/android/calculator/history/CalculatorHistoryImplTest.java diff --git a/calculatorpp-core/src/test/java/org/solovyev/android/calculator/jscl/FromJsclNumericTextProcessorTest.java b/core/src/test/java/org/solovyev/android/calculator/jscl/FromJsclNumericTextProcessorTest.java similarity index 100% rename from calculatorpp-core/src/test/java/org/solovyev/android/calculator/jscl/FromJsclNumericTextProcessorTest.java rename to core/src/test/java/org/solovyev/android/calculator/jscl/FromJsclNumericTextProcessorTest.java diff --git a/calculatorpp-core/src/test/java/org/solovyev/android/calculator/math/MathTypeTest.java b/core/src/test/java/org/solovyev/android/calculator/math/MathTypeTest.java similarity index 100% rename from calculatorpp-core/src/test/java/org/solovyev/android/calculator/math/MathTypeTest.java rename to core/src/test/java/org/solovyev/android/calculator/math/MathTypeTest.java diff --git a/calculatorpp-core/src/test/java/org/solovyev/android/calculator/model/AndroidCalculatorEngineTest.java b/core/src/test/java/org/solovyev/android/calculator/model/AndroidCalculatorEngineTest.java similarity index 100% rename from calculatorpp-core/src/test/java/org/solovyev/android/calculator/model/AndroidCalculatorEngineTest.java rename to core/src/test/java/org/solovyev/android/calculator/model/AndroidCalculatorEngineTest.java diff --git a/calculatorpp-core/src/test/java/org/solovyev/android/calculator/model/FunctionsTest.java b/core/src/test/java/org/solovyev/android/calculator/model/FunctionsTest.java similarity index 100% rename from calculatorpp-core/src/test/java/org/solovyev/android/calculator/model/FunctionsTest.java rename to core/src/test/java/org/solovyev/android/calculator/model/FunctionsTest.java diff --git a/calculatorpp-core/src/test/java/org/solovyev/android/calculator/model/NumeralBaseTest.java b/core/src/test/java/org/solovyev/android/calculator/model/NumeralBaseTest.java similarity index 100% rename from calculatorpp-core/src/test/java/org/solovyev/android/calculator/model/NumeralBaseTest.java rename to core/src/test/java/org/solovyev/android/calculator/model/NumeralBaseTest.java diff --git a/calculatorpp-core/src/test/java/org/solovyev/android/calculator/model/ToJsclTextProcessorTest.java b/core/src/test/java/org/solovyev/android/calculator/model/ToJsclTextProcessorTest.java similarity index 100% rename from calculatorpp-core/src/test/java/org/solovyev/android/calculator/model/ToJsclTextProcessorTest.java rename to core/src/test/java/org/solovyev/android/calculator/model/ToJsclTextProcessorTest.java diff --git a/calculatorpp-core/src/test/resources/org/solovyev/android/calculator/model/nb_table.csv b/core/src/test/resources/org/solovyev/android/calculator/model/nb_table.csv similarity index 100% rename from calculatorpp-core/src/test/resources/org/solovyev/android/calculator/model/nb_table.csv rename to core/src/test/resources/org/solovyev/android/calculator/model/nb_table.csv diff --git a/pom.xml b/pom.xml index 7a3d5cf8..6b531925 100644 --- a/pom.xml +++ b/pom.xml @@ -23,9 +23,9 @@ - calculatorpp - calculatorpp-test - calculatorpp-core + app-android + app-android-test + core From 476f6352d27a8b7cb64f64daa4a1db36f37f37c5 Mon Sep 17 00:00:00 2001 From: Sergey Solovyev Date: Fri, 30 Nov 2012 16:11:31 +0400 Subject: [PATCH 02/14] changes --- app-android-core/pom.xml | 37 ++++++++++++++++++++++++++++++++ app-android-widget/pom.xml | 44 ++++++++++++++++++++++++++++++++++++++ app-android/pom.xml | 6 +++++- pom.xml | 16 +++++++++++++- 4 files changed, 101 insertions(+), 2 deletions(-) create mode 100644 app-android-core/pom.xml create mode 100644 app-android-widget/pom.xml diff --git a/app-android-core/pom.xml b/app-android-core/pom.xml new file mode 100644 index 00000000..7d0625bf --- /dev/null +++ b/app-android-core/pom.xml @@ -0,0 +1,37 @@ + + + 4.0.0 + + + org.solovyev.android + calculatorpp-parent + 1.5.3-SNAPSHOT + + + org.solovyev.android + app-android-core + 1.5.3-SNAPSHOT + Calculator++ Application Core + apklib + + + + org.solovyev.android + calculatorpp-core + + + + + + + + com.jayway.maven.plugins.android.generation2 + android-maven-plugin + + + + + + \ No newline at end of file diff --git a/app-android-widget/pom.xml b/app-android-widget/pom.xml new file mode 100644 index 00000000..f7b3dfe6 --- /dev/null +++ b/app-android-widget/pom.xml @@ -0,0 +1,44 @@ + + + 4.0.0 + + + org.solovyev.android + calculatorpp-parent + 1.5.3-SNAPSHOT + + + org.solovyev.android + app-android-widget + 1.5.3-SNAPSHOT + Calculator++ Application Widget + apklib + + + + + org.solovyev.android + calculatorpp-core + + + + org.solovyev.android.calculator + app-android-core + + + + + + + + + com.jayway.maven.plugins.android.generation2 + android-maven-plugin + + + + + + \ No newline at end of file diff --git a/app-android/pom.xml b/app-android/pom.xml index a40e5f96..87cc953e 100644 --- a/app-android/pom.xml +++ b/app-android/pom.xml @@ -21,9 +21,13 @@ org.solovyev.android calculatorpp-core - 1.5.3-SNAPSHOT + + org.solovyev.android.calculator + app-android-core + + org.solovyev common-core diff --git a/pom.xml b/pom.xml index 6b531925..72fe5c5d 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,8 @@ app-android + app-android-core + app-android-widget app-android-test core @@ -37,7 +39,19 @@ - + + org.solovyev.android + calculatorpp-core + 1.5.3-SNAPSHOT + + + + org.solovyev.android.calculator + app-android-core + 1.5.3-SNAPSHOT + + + org.solovyev common-core ${common.version} From 324bbda552bdce7ad131adc0979b0c5ca81f4949 Mon Sep 17 00:00:00 2001 From: Sergey Solovyev Date: Fri, 30 Nov 2012 16:16:09 +0400 Subject: [PATCH 03/14] changes --- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 4 +- .../AndroidManifest.xml | 0 .../com/actionbarsherlock/BuildConfig.java | 6 + .../gen/com/actionbarsherlock/Manifest.java | 5 + .../gen/com/actionbarsherlock/R.java | 5 + .../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/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 + .../org/solovyev/android/ads/BuildConfig.java | 6 + .../org/solovyev/android/ads/Manifest.java | 5 + .../gen/org/solovyev/android/ads/R.java | 5 + .../org/solovyev/android/all/BuildConfig.java | 6 + .../org/solovyev/android/all/Manifest.java | 5 + .../gen/org/solovyev/android/all/R.java | 5 + .../net/robotmedia/billing/BuildConfig.java | 6 + .../gen/net/robotmedia/billing/Manifest.java | 5 + .../gen/net/robotmedia/billing/R.java | 5 + .../solovyev/android/core/BuildConfig.java | 6 + .../org/solovyev/android/core/Manifest.java | 5 + .../gen/org/solovyev/android/core/R.java | 5 + .../org/solovyev/android/db/BuildConfig.java | 6 + .../gen/org/solovyev/android/db/Manifest.java | 5 + .../gen/org/solovyev/android/db/R.java | 5 + .../solovyev/android/http/BuildConfig.java | 6 + .../org/solovyev/android/http/Manifest.java | 5 + .../gen/org/solovyev/android/http/R.java | 5 + .../android/keyboard/BuildConfig.java | 6 + .../solovyev/android/keyboard/Manifest.java | 5 + .../gen/org/solovyev/android/keyboard/R.java | 5 + .../solovyev/android/list/BuildConfig.java | 6 + .../org/solovyev/android/list/Manifest.java | 5 + .../gen/org/solovyev/android/list/R.java | 5 + .../solovyev/android/menu/BuildConfig.java | 6 + .../org/solovyev/android/menu/Manifest.java | 5 + .../gen/org/solovyev/android/menu/R.java | 5 + .../solovyev/android/other/BuildConfig.java | 6 + .../org/solovyev/android/other/Manifest.java | 5 + .../gen/org/solovyev/android/other/R.java | 5 + .../solovyev/android/prefs/BuildConfig.java | 6 + .../org/solovyev/android/prefs/Manifest.java | 5 + .../gen/org/solovyev/android/prefs/R.java | 5 + .../android/sherlock/BuildConfig.java | 6 + .../solovyev/android/sherlock/Manifest.java | 5 + .../gen/org/solovyev/android/sherlock/R.java | 5 + .../solovyev/android/view/BuildConfig.java | 6 + .../org/solovyev/android/view/Manifest.java | 5 + .../gen/org/solovyev/android/view/R.java | 5 + .../org/solovyev/android/LastTabSaver.java | 76 + .../android/history/HistoryDragProcessor.java | 54 + .../AbstractEnumPickerDialogPreference.java | 39 + .../prefs/AbstractPickerDialogPreference.java | 62 + .../prefs/DoublePickerDialogPreference.java | 67 + .../prefs/FloatRangeSeekBarPreference.java | 36 + .../prefs/IntegerPickerDialogPreference.java | 39 + .../prefs/IntegerRangeSeekBarPreference.java | 36 + .../prefs/MultiSelectListPreference.java | 196 +++ .../prefs/NumberPickerDialogPreference.java | 52 + .../android/prefs/RangeSeekBarPreference.java | 92 ++ .../view/AbstractAlertDialogBuilder.java | 25 + .../android/view/AbstractRangeSeekBar.java | 421 ++++++ .../android/view/ActivityViewBuilder.java | 14 + .../android/view/AndroidViewUtils.java | 93 ++ .../android/view/AutoResizeTextView.java | 301 ++++ .../org/solovyev/android/view/ButtonDef.java | 17 + .../solovyev/android/view/ColorButton.java | 232 +++ .../android/view/ColorPickerDialog.java | 234 +++ .../view/ConfirmationDialogBuilder.java | 104 ++ .../android/view/DataActivityViewBuilder.java | 13 + .../solovyev/android/view/DialogBuilder.java | 12 + .../solovyev/android/view/DoubleRange.java | 51 + .../org/solovyev/android/view/Grayable.java | 13 + .../solovyev/android/view/GrayableImpl.java | 41 + .../android/view/GrayableRelativeLayout.java | 44 + .../solovyev/android/view/GrayableView.java | 9 + .../solovyev/android/view/IntegerRange.java | 49 + .../org/solovyev/android/view/ListRange.java | 60 + .../android/view/ListViewBuilder.java | 59 + .../solovyev/android/view/NumberRange.java | 83 + .../android/view/NumberRangeSeekBar.java | 60 + .../org/solovyev/android/view/NumberType.java | 68 + .../android/view/OnClickListenerVibrator.java | 36 + .../src/org/solovyev/android/view/Picker.java | 283 ++++ .../solovyev/android/view/PickerButton.java | 105 ++ .../android/view/TextViewBuilder.java | 58 + .../android/view/VibratorContainer.java | 64 + .../org/solovyev/android/view/ViewDef.java | 27 + .../android/view/ViewFromLayoutBuilder.java | 64 + .../solovyev/android/view/ViewGrayable.java | 15 + .../view/drag/DirectionDragButton.java | 462 ++++++ .../view/drag/DirectionDragButtonDef.java | 15 + .../view/drag/DirectionDragButtonDefImpl.java | 175 +++ .../android/view/drag/DragButton.java | 164 ++ .../android/view/drag/DragButtonDef.java | 11 + .../android/view/drag/DragDirection.java | 14 + .../solovyev/android/view/drag/DragEvent.java | 42 + .../drag/DragPreferencesChangeListener.java | 20 + .../android/view/drag/OnDragListener.java | 29 + .../view/drag/OnDragListenerWrapper.java | 34 + .../view/drag/SimpleOnDragListener.java | 327 ++++ .../android/view/scroll/ScrollViewState.java | 51 + .../doc/GoogleAdMobAdsSdk-4.3.1-javadocs.zip | Bin .../misc/doc/achartengine-0.7.0-javadocs.zip | Bin .../misc/lib/GoogleAdMobAdsSdk-4.3.1.jar | Bin .../misc/lib/achartengine-0.7.0.jar | Bin .../misc/lib/achartengine-0.7.1.jar | Bin .../misc/other/prepare_avds.sh | 0 .../misc/other/remove_avds.sh | 0 .../misc/other/take_screenshots.py | 0 .../misc/other/take_screenshots.sh | 0 .../misc/other/take_screenshots2.sh | 0 .../misc/other/wait_device.py | 0 .../res/calculatorpp/01_main_screen_port.png | Bin .../calculatorpp/01_main_screen_port_sm.png | Bin .../res/calculatorpp/02_main_screen_land.png | Bin .../03_main_screen_port_with_expression.png | Bin .../res/calculatorpp/04_plot_graph_menu.png | Bin .../calculatorpp/04_plot_graph_menu_sm.png | Bin .../misc/res/calculatorpp/05_graph_screen.png | Bin .../res/calculatorpp/05_graph_screen_sm.png | Bin .../res/calculatorpp/06_constants_screen.png | Bin .../calculatorpp/06_constants_screen_sm.png | Bin .../07_constant_create_dialog.png | Bin .../08_constants_context_menu.png | Bin .../res/calculatorpp/09_functions_screen.png | Bin .../calculatorpp/09_functions_screen_sm.png | Bin .../res/calculatorpp/10_history_screen.png | Bin .../res/calculatorpp/10_history_screen_sm.png | Bin .../11_history_item_context_menu.png | Bin .../res/calculatorpp/12_saved_history_tab.png | Bin .../13_saved_history_item_context_menu.png | Bin .../misc/res/calculatorpp/14_about_screen.png | Bin .../res/calculatorpp/14_about_screen_sm.png | Bin .../res/calculatorpp/15_release_notes_tab.png | Bin .../misc/res/calculatorpp/16_help_screen.png | Bin .../res/calculatorpp/16_help_screen_sm.png | Bin .../misc/res/calculatorpp/17_hints_tab.png | Bin .../misc/res/calculatorpp/18_preferences.png | Bin .../res/calculatorpp/18_preferences_02.png | Bin .../res/calculatorpp/18_preferences_03.png | Bin .../res/calculatorpp/18_preferences_sm.png | Bin .../misc/res/calculatorpp/plan.png | Bin .../misc/res/calculatorpp/plan.xcf | Bin .../misc/res/icon-green.png | Bin .../misc/res/icon-hi-res.png | Bin .../misc/res/icon-promo.png | Bin .../misc/res/icon.png | Bin .../misc/res/kb_facebook.png | Bin .../misc/res/kb_facebook_icon.png | Bin .../misc/res/logo-admob.png | Bin .../misc/res/logo-scaled.png | Bin .../misc/res/logo-small.png | Bin .../misc/res/logo.cdr | Bin .../misc/res/logo.png | Bin .../misc/res/widget.png | Bin .../misc/res/work/Backup_of_logo.cdr | Bin .../misc/res/work/header.png | Bin .../misc/res/work/header_bg.png | Bin .../misc/res/work/header_sm.png | Bin .../misc/res/work/heart_original.png | Bin .../misc/res/work/icon.png | Bin .../misc/res/work/icon_favicon_light_blue.ico | Bin .../misc/res/work/icon_favicon_light_blue.png | Bin .../misc/res/work/icon_favicon_purple.ico | Bin .../misc/res/work/icon_small.png | Bin .../misc/res/work/log11o.psd | Bin .../misc/res/work/logo.cdr | Bin .../misc/res/work/logo.png | Bin .../misc/res/work/logoFULL copy.png | Bin .../misc/res/work/logoFULL.pdf | Bin .../misc/res/work/logoFULL.png | Bin .../misc/res/work/logoFULL_banner.png | Bin .../misc/res/work/logoFULL_small.png | Bin .../misc/res/work/logo_black.png | Bin .../misc/res/work/logo_blue.png | Bin .../misc/res/work/logo_light_blue.png | Bin .../misc/res/work/logo_purple.png | Bin .../misc/res/work/promo_logo.png | Bin .../misc/res/work/text_logo.png | Bin .../misc/res/work/text_logo_blue.png | Bin .../misc/res/work/text_logo_light_blue.png | Bin .../work/text_logo_light_blue_cpp_forum.png | Bin .../misc/res/work/text_logo_purple.png | Bin .../misc/src/achartengine-0.7.0.jar | Bin {app-android => android-app}/misc/src/bsh.jar | Bin {app-android => android-app}/pom.xml | 4 +- {app-android => android-app}/proguard.cfg | 0 .../project.properties | 0 .../res/drawable-hdpi/ab_add.png | Bin .../res/drawable-hdpi/ab_icon.png | Bin .../res/drawable-hdpi/ab_icon_long.png | Bin .../res/drawable-hdpi/ab_settings.png | Bin .../res/drawable-hdpi/icon.png | Bin .../res/drawable-hdpi/icon_onscreen.png | Bin .../res/drawable-hdpi/kb_copy.png | Bin .../res/drawable-hdpi/kb_delete.png | Bin .../res/drawable-hdpi/kb_facebook.png | Bin .../res/drawable-hdpi/kb_heart.png | Bin .../res/drawable-hdpi/kb_logo.png | Bin .../res/drawable-hdpi/kb_paste.png | Bin .../res/drawable-hdpi/kb_settings.png | Bin .../res/drawable-hdpi/logo.png | Bin .../res/drawable-ldpi/ab_add.png | Bin .../res/drawable-ldpi/ab_icon.png | Bin .../res/drawable-ldpi/ab_settings.png | Bin .../res/drawable-ldpi/icon.png | Bin .../res/drawable-ldpi/icon_onscreen.png | Bin .../res/drawable-ldpi/kb_copy.png | Bin .../res/drawable-ldpi/kb_delete.png | Bin .../res/drawable-ldpi/kb_facebook.png | Bin .../res/drawable-ldpi/kb_heart.png | Bin .../res/drawable-ldpi/kb_logo.png | Bin .../res/drawable-ldpi/kb_paste.png | Bin .../res/drawable-ldpi/kb_settings.png | Bin .../res/drawable-ldpi/logo.png | Bin .../res/drawable-mdpi/ab_add.png | Bin .../res/drawable-mdpi/ab_icon.png | Bin .../res/drawable-mdpi/ab_settings.png | Bin .../res/drawable-mdpi/icon.png | Bin .../res/drawable-mdpi/icon_onscreen.png | Bin .../res/drawable-mdpi/kb_copy.png | Bin .../res/drawable-mdpi/kb_delete.png | Bin .../res/drawable-mdpi/kb_facebook.png | Bin .../res/drawable-mdpi/kb_heart.png | Bin .../res/drawable-mdpi/kb_logo.png | Bin .../res/drawable-mdpi/kb_paste.png | Bin .../res/drawable-mdpi/kb_settings.png | Bin .../res/drawable-mdpi/logo.png | Bin .../cpp_onscreen_button_close.png | Bin .../cpp_onscreen_button_fold.png | Bin .../cpp_onscreen_button_minimize.png | Bin .../cpp_onscreen_header_logo.png | Bin ...efault_abs__ab_transparent_dark_holo.9.png | Bin ..._abs__btn_cab_done_default_holo_dark.9.png | Bin ..._abs__btn_cab_done_focused_holo_dark.9.png | Bin ..._abs__btn_cab_done_pressed_holo_dark.9.png | Bin .../default_abs__list_focused_holo.9.png | Bin .../default_abs__list_longpressed_holo.9.png | Bin .../default_abs__list_pressed_holo_dark.9.png | Bin ...lt_abs__spinner_ab_focused_holo_dark.9.png | Bin ...lt_abs__spinner_ab_pressed_holo_dark.9.png | Bin ...fault_abs__tab_selected_focused_holo.9.png | Bin .../default_abs__tab_selected_holo.9.png | Bin ...fault_abs__tab_selected_pressed_holo.9.png | Bin ...ult_abs__tab_unselected_pressed_holo.9.png | Bin ...o_blue_abs__ab_transparent_dark_holo.9.png | Bin .../metro_blue_abs__list_focused_holo.9.png | Bin ...tro_blue_abs__list_pressed_holo_dark.9.png | Bin ..._blue_abs__tab_selected_focused_holo.9.png | Bin .../metro_blue_abs__tab_selected_holo.9.png | Bin ..._blue_abs__tab_selected_pressed_holo.9.png | Bin ...lue_abs__tab_unselected_pressed_holo.9.png | Bin .../res/drawable-nodpi/widget_preview.png | Bin .../res/drawable-xhdpi/ab_add.png | Bin .../res/drawable-xhdpi/ab_icon.png | Bin .../res/drawable-xhdpi/ab_settings.png | Bin .../drawable-xhdpi/ic_menu_preferences.png | Bin .../res/drawable-xhdpi/icon.png | Bin .../res/drawable-xhdpi/icon_onscreen.png | Bin .../res/drawable-xhdpi/kb_copy.png | Bin .../res/drawable-xhdpi/kb_delete.png | Bin .../res/drawable-xhdpi/kb_facebook.png | Bin .../res/drawable-xhdpi/kb_heart.png | Bin .../res/drawable-xhdpi/kb_logo.png | Bin .../res/drawable-xhdpi/kb_paste.png | Bin .../res/drawable-xhdpi/kb_settings.png | Bin .../res/drawable-xhdpi/logo.png | Bin .../res/drawable-xlarge-hdpi/kb_copy.png | Bin .../res/drawable-xlarge-hdpi/kb_delete.png | Bin .../res/drawable-xlarge-hdpi/kb_facebook.png | Bin .../res/drawable-xlarge-hdpi/kb_heart.png | Bin .../res/drawable-xlarge-hdpi/kb_logo.png | Bin .../res/drawable-xlarge-hdpi/kb_paste.png | Bin .../res/drawable-xlarge-hdpi/kb_settings.png | Bin .../res/drawable/blue_button.xml | 0 .../res/drawable/blue_button_dark.xml | 0 .../res/drawable/blue_button_dark_shape.xml | 0 .../res/drawable/blue_button_shape.xml | 0 .../default_abs__btn_cab_done_holo_dark.xml | 0 ...default_abs__item_background_holo_dark.xml | 0 ...lector_background_transition_holo_dark.xml | 0 .../default_abs__list_selector_holo_dark.xml | 0 .../default_abs__spinner_ab_holo_dark.xml | 0 .../default_abs__tab_indicator_ab_holo.xml | 0 .../res/drawable/gray_button.xml | 0 .../res/drawable/gray_button_dark.xml | 0 .../res/drawable/gray_button_dark_shape.xml | 0 .../res/drawable/gray_button_shape.xml | 0 .../metro_blue_abs__tab_indicator_ab_holo.xml | 0 .../res/drawable/metro_blue_button.xml | 0 .../res/drawable/metro_blue_button_shape.xml | 0 .../res/drawable/metro_blue_list_item.xml | 0 .../res/drawable/metro_button_dark.xml | 0 .../res/drawable/metro_button_dark_shape.xml | 0 .../res/drawable/metro_button_green.xml | 0 .../res/drawable/metro_button_green_shape.xml | 0 .../res/drawable/metro_button_light.xml | 0 .../res/drawable/metro_button_light_shape.xml | 0 .../res/drawable/metro_button_pressed.xml | 0 .../res/drawable/metro_button_purple.xml | 0 .../drawable/metro_button_purple_shape.xml | 0 .../res/drawable/metro_green_list_item.xml | 0 .../res/drawable/metro_purple_list_item.xml | 0 .../res/drawable/pane_background.xml | 0 .../res/drawable/violet_button.xml | 0 .../res/drawable/violet_button_dark.xml | 0 .../res/drawable/violet_button_dark_shape.xml | 0 .../res/drawable/violet_button_shape.xml | 0 .../res/layout-land/calc_keyboard.xml | 0 .../res/layout-land/calc_keyboard_mobile.xml | 0 .../res/layout-land/main_calculator.xml | 0 .../layout-land/main_calculator_mobile.xml | 0 .../res/layout-land/main_first_pane.xml | 0 .../layout-land/main_first_pane_mobile.xml | 0 .../res/layout-large-land/calc_keyboard.xml | 0 .../res/layout-large-land/main_calculator.xml | 0 .../res/layout-large/calc_display.xml | 0 .../res/layout-large/calc_editor.xml | 0 .../res/layout-large/calc_keyboard.xml | 0 .../res/layout-large/main_calculator.xml | 0 .../res/layout-xlarge-land/calc_keyboard.xml | 0 .../layout-xlarge-land/main_calculator.xml | 0 .../res/layout-xlarge/calc_display.xml | 0 .../res/layout-xlarge/calc_editor.xml | 0 .../res/layout-xlarge/calc_keyboard.xml | 0 .../res/layout-xlarge/main_calculator.xml | 0 .../res/layout/about_fragment.xml | 0 .../res/layout/ad.xml | 0 .../res/layout/admob_pref.xml | 0 .../res/layout/calc_clear_button.xml | 0 .../res/layout/calc_copy_button.xml | 0 .../res/layout/calc_display.xml | 0 .../res/layout/calc_display_mobile.xml | 0 .../res/layout/calc_division_button.xml | 0 .../res/layout/calc_donate_button.xml | 0 .../res/layout/calc_dot_button.xml | 0 .../res/layout/calc_editor.xml | 0 .../res/layout/calc_editor_mobile.xml | 0 .../res/layout/calc_eight_digit_button.xml | 0 .../res/layout/calc_empty_button.xml | 0 .../res/layout/calc_equals_button.xml | 0 .../res/layout/calc_erase_button.xml | 0 .../res/layout/calc_five_digit_button.xml | 0 .../res/layout/calc_four_digit_button.xml | 0 .../res/layout/calc_functions_button.xml | 0 .../res/layout/calc_history_button.xml | 0 .../res/layout/calc_keyboard.xml | 0 .../res/layout/calc_keyboard_mobile.xml | 0 .../res/layout/calc_left_button.xml | 0 .../res/layout/calc_multiplication_button.xml | 0 .../res/layout/calc_nine_digit_button.xml | 0 .../res/layout/calc_one_digit_button.xml | 0 .../res/layout/calc_operators_button.xml | 0 .../res/layout/calc_paste_button.xml | 0 .../res/layout/calc_plot_view.xml | 0 .../res/layout/calc_plus_button.xml | 0 .../res/layout/calc_right_button.xml | 0 .../res/layout/calc_round_brackets_button.xml | 0 .../res/layout/calc_seven_digit_button.xml | 0 .../res/layout/calc_six_digit_button.xml | 0 .../res/layout/calc_subtraction_button.xml | 0 .../res/layout/calc_three_digit_button.xml | 0 .../res/layout/calc_title.xml | 0 .../res/layout/calc_two_digit_button.xml | 0 .../res/layout/calc_vars_button.xml | 0 .../res/layout/calc_zero_digit_button.xml | 0 .../res/layout/calculator_messages_dialog.xml | 0 .../calculator_messages_dialog_message.xml | 0 .../res/layout/display_error_message.xml | 0 .../res/layout/drag_button_calibration.xml | 0 .../res/layout/feedback.xml | 0 .../res/layout/function_add_param.xml | 0 .../res/layout/function_edit.xml | 0 .../res/layout/function_edit_param.xml | 0 .../res/layout/help_faq_fragment.xml | 0 .../res/layout/help_hints_fragment.xml | 0 .../res/layout/help_screens_fragment.xml | 0 .../res/layout/history_edit.xml | 0 .../res/layout/history_fragment.xml | 0 .../res/layout/history_item.xml | 0 .../res/layout/main_calculator.xml | 0 .../res/layout/main_calculator_mobile.xml | 0 .../res/layout/main_empty.xml | 0 .../res/layout/main_empty_multi_pane.xml | 0 .../res/layout/math_entities_fragment.xml | 0 .../res/layout/math_entity.xml | 0 .../res/layout/notespp_announce.xml | 0 .../res/layout/onscreen_display.xml | 0 .../res/layout/onscreen_editor.xml | 0 .../res/layout/onscreen_footer.xml | 0 .../res/layout/onscreen_header.xml | 0 .../res/layout/onscreen_keyboard.xml | 0 .../res/layout/onscreen_layout.xml | 0 .../res/layout/plot_fragment.xml | 0 .../res/layout/release_notes_fragment.xml | 0 .../res/layout/saved_history_item.xml | 0 .../res/layout/tabs.xml | 0 .../res/layout/unit_converter.xml | 0 .../res/layout/var_edit.xml | 0 .../res/layout/vars_fragment.xml | 0 .../res/layout/widget_app_button.xml | 0 .../res/layout/widget_clear_button.xml | 0 .../res/layout/widget_copy_button.xml | 0 .../res/layout/widget_display.xml | 0 .../res/layout/widget_division_button.xml | 0 .../res/layout/widget_dot_button.xml | 0 .../res/layout/widget_editor.xml | 0 .../res/layout/widget_eight_digit_button.xml | 0 .../res/layout/widget_equals_button.xml | 0 .../res/layout/widget_erase_button.xml | 0 .../res/layout/widget_five_digit_button.xml | 0 .../res/layout/widget_four_digit_button.xml | 0 .../res/layout/widget_functions_button.xml | 0 .../res/layout/widget_history_button.xml | 0 .../res/layout/widget_keyboard.xml | 0 .../res/layout/widget_layout.xml | 0 .../res/layout/widget_left_button.xml | 0 .../res/layout/widget_like_button.xml | 0 .../layout/widget_multiplication_button.xml | 0 .../res/layout/widget_nine_digit_button.xml | 0 .../res/layout/widget_one_digit_button.xml | 0 .../res/layout/widget_paste_button.xml | 0 .../res/layout/widget_percent_button.xml | 0 .../res/layout/widget_plus_button.xml | 0 .../res/layout/widget_power_button.xml | 0 .../res/layout/widget_right_button.xml | 0 .../layout/widget_round_brackets_button.xml | 0 .../res/layout/widget_settings_button.xml | 0 .../res/layout/widget_seven_digit_button.xml | 0 .../res/layout/widget_six_digit_button.xml | 0 .../res/layout/widget_subtraction_button.xml | 0 .../res/layout/widget_three_digit_button.xml | 0 .../res/layout/widget_two_digit_button.xml | 0 .../res/layout/widget_vars_button.xml | 0 .../res/layout/widget_zero_digit_button.xml | 0 .../res/menu/functions_menu.xml | 0 .../res/menu/history_menu.xml | 0 .../res/menu/plot_menu.xml | 0 .../res/menu/vars_menu.xml | 0 .../res/values-es/text_about.xml | 0 .../res/values-es/text_functions.xml | 0 .../res/values-es/text_help.xml | 0 .../res/values-es/text_operators.xml | 0 .../res/values-es/text_strings.xml | 0 .../res/values-es/text_vars.xml | 0 .../res/values-it/text_about.xml | 0 .../res/values-it/text_functions.xml | 0 .../res/values-it/text_help.xml | 0 .../res/values-it/text_operators.xml | 0 .../res/values-it/text_strings.xml | 0 .../res/values-it/text_vars.xml | 0 .../res/values-large-hdpi/dimens.xml | 0 .../res/values-large-mdpi/dimens.xml | 0 .../res/values-large-tvdpi/dimens.xml | 0 .../res/values-large/dimens.xml | 0 .../res/values-normal-hdpi/dimens.xml | 0 .../res/values-normal-mdpi/dimens.xml | 0 .../res/values-normal-tvdpi/dimens.xml | 0 .../res/values-normal-xhdpi/dimens.xml | 0 .../res/values-normal/dimens.xml | 0 .../res/values-ru/text_about.xml | 0 .../res/values-ru/text_functions.xml | 0 .../res/values-ru/text_help.xml | 0 .../res/values-ru/text_operators.xml | 0 .../res/values-ru/text_preferences.xml | 0 .../res/values-ru/text_strings.xml | 0 .../res/values-ru/text_vars.xml | 0 .../res/values-small-hdpi/dimens.xml | 0 .../res/values-small-xhdpi/dimens.xml | 0 .../res/values-small/dimens.xml | 0 .../res/values-uk/text_about.xml | 0 .../res/values-uk/text_functions.xml | 0 .../res/values-uk/text_help.xml | 0 .../res/values-uk/text_operators.xml | 0 .../res/values-uk/text_preferences.xml | 0 .../res/values-uk/text_strings.xml | 0 .../res/values-uk/text_vars.xml | 0 .../res/values-v14/dimens.xml | 0 .../res/values-xlarge-hdpi/dimens.xml | 0 .../res/values-xlarge-mdpi/dimens.xml | 0 .../res/values-xlarge/dimens.xml | 0 .../res/values-zh-rtw/text_about.xml | 0 .../res/values-zh-rtw/text_functions.xml | 0 .../res/values-zh-rtw/text_help.xml | 0 .../res/values-zh-rtw/text_operators.xml | 0 .../res/values-zh-rtw/text_preferences.xml | 0 .../res/values-zh-rtw/text_strings.xml | 0 .../res/values-zh-rtw/text_vars.xml | 0 .../res/values/arrays.xml | 0 .../res/values/attributes.xml | 0 .../res/values/colors.xml | 0 .../res/values/dimens.xml | 0 .../res/values/preferences.xml | 0 .../res/values/styles.xml | 0 .../res/values/styles_history.xml | 0 .../res/values/styles_var.xml | 0 .../res/values/text_about.xml | 0 .../res/values/text_functions.xml | 0 .../res/values/text_help.xml | 0 .../res/values/text_operators.xml | 0 .../res/values/text_preferences.xml | 0 .../res/values/text_strings.xml | 0 .../res/values/text_vars.xml | 0 .../res/values/theme_gray.xml | 0 .../res/values/theme_light_blue.xml | 0 .../res/values/theme_metro_blue.xml | 0 .../res/values/theme_metro_green.xml | 0 .../res/values/theme_metro_purple.xml | 0 .../res/values/theme_violet.xml | 0 .../res/xml/calculator_widget_info_3x3.xml | 0 .../res/xml/calculator_widget_info_3x4.xml | 0 .../res/xml/calculator_widget_info_4x4.xml | 0 .../res/xml/calculator_widget_info_4x5.xml | 0 .../res/xml/preferences.xml | 0 .../res/xml/preferences_appearance.xml | 0 .../res/xml/preferences_calculations.xml | 0 .../res/xml/preferences_onscreen.xml | 0 .../res/xml/preferences_other.xml | 0 .../res/xml/preferences_plot.xml | 0 .../org/solovyev/android/AndroidUtils2.java | 0 .../calculator/AbstractCalculatorHelper.java | 0 .../android/calculator/AndroidCalculator.java | 0 .../AndroidCalculatorClipboard.java | 0 .../AndroidCalculatorDisplayView.java | 0 .../AndroidCalculatorEditorView.java | 0 .../calculator/AndroidCalculatorKeyboard.java | 0 .../calculator/AndroidCalculatorLogger.java | 0 .../calculator/AndroidCalculatorNotifier.java | 0 .../AndroidCalculatorPreferenceService.java | 0 .../calculator/AndroidFunctionCategory.java | 0 .../calculator/AndroidNumeralBase.java | 0 .../calculator/AndroidOperatorCategory.java | 0 .../calculator/AndroidVarCategory.java | 0 .../calculator/CalculatorActivity.java | 0 .../calculator/CalculatorActivityHelper.java | 0 .../CalculatorActivityHelperImpl.java | 0 .../CalculatorActivityLauncher.java | 0 .../calculator/CalculatorActivityMobile.java | 0 .../calculator/CalculatorApplication.java | 0 .../android/calculator/CalculatorButtons.java | 0 .../calculator/CalculatorDisplayFragment.java | 0 .../calculator/CalculatorDisplayMenuItem.java | 0 .../CalculatorDisplayOnClickListener.java | 0 .../calculator/CalculatorEditorFragment.java | 0 .../calculator/CalculatorFixableMessage.java | 0 .../calculator/CalculatorFragment.java | 0 .../CalculatorFragmentActivity.java | 0 .../calculator/CalculatorFragmentHelper.java | 0 .../CalculatorFragmentHelperImpl.java | 0 .../CalculatorKeyboardFragment.java | 0 .../android/calculator/CalculatorMenu.java | 0 .../calculator/CalculatorMessagesDialog.java | 0 .../CalculatorOnscreenStartActivity.java | 0 .../calculator/CalculatorPreferences.java | 0 .../CalculatorPreferencesActivity.java | 0 .../calculator/CalculatorSecurity.java | 0 .../calculator/CharacterAtPositionFinder.java | 0 .../calculator/ConversionMenuItem.java | 0 .../calculator/CursorDragProcessor.java | 0 .../calculator/DigitButtonDragProcessor.java | 0 .../android/calculator/EvalDragProcessor.java | 0 .../calculator/NumeralBaseButtons.java | 0 .../ParcelableCalculatorDisplayViewState.java | 0 .../ParcelableCalculatorEditorViewState.java | 0 .../about/CalculatorAboutActivity.java | 0 .../about/CalculatorAboutFragment.java | 0 .../about/CalculatorFragmentType.java | 0 .../about/CalculatorReleaseNotesFragment.java | 0 .../android/calculator/about/TextHelper.java | 0 .../AndroidExternalListenersContainer.java | 0 ...efaultExternalCalculatorIntentHandler.java | 0 .../ExternalCalculatorIntentHandler.java | 0 .../ExternalCalculatorStateUpdater.java | 0 .../function/FunctionEditDialogFragment.java | 0 .../function/FunctionEditorSaver.java | 0 .../function/FunctionParamEditText.java | 0 .../function/FunctionParamsView.java | 0 .../help/CalculatorHelpActivity.java | 0 .../help/CalculatorHelpFaqFragment.java | 0 .../help/CalculatorHelpHintsFragment.java | 0 .../help/CalculatorHelpScreensFragment.java | 0 .../AbstractCalculatorHistoryFragment.java | 0 .../history/AndroidCalculatorHistory.java | 0 .../history/CalculatorHistoryActivity.java | 0 .../history/CalculatorHistoryFragment.java | 0 .../CalculatorSavedHistoryFragment.java | 0 .../history/HistoryArrayAdapter.java | 0 .../history/HistoryItemMenuData.java | 0 .../history/HistoryItemMenuItem.java | 0 .../history/TextViewEditorAdapter.java | 0 .../edit/AbstractMathEntityListFragment.java | 0 .../edit/CalculatorFunctionsActivity.java | 0 .../edit/CalculatorFunctionsFragment.java | 0 .../edit/CalculatorOperatorsActivity.java | 0 .../edit/CalculatorOperatorsFragment.java | 0 .../math/edit/CalculatorVarsActivity.java | 0 .../math/edit/CalculatorVarsFragment.java | 0 .../math/edit/MathEntityRemover.java | 0 .../math/edit/VarEditDialogFragment.java | 0 .../calculator/math/edit/VarEditorSaver.java | 0 .../model/AndroidCalculatorEngine.java | 0 .../model/AndroidMathEntityDao.java | 0 .../android/calculator/model/Messages.java | 0 .../CalculatorOnscreenBroadcastReceiver.java | 0 .../onscreen/CalculatorOnscreenService.java | 0 .../onscreen/CalculatorOnscreenView.java | 0 .../onscreen/CalculatorOnscreenViewDef.java | 0 .../onscreen/OnscreenViewListener.java | 0 .../plot/CalculatorPlotActivity.java | 0 .../plot/CalculatorPlotFragment.java | 0 .../CalculatorPlotPreferenceActivity.java | 0 .../calculator/plot/GraphLineColor.java | 0 .../android/calculator/plot/MyXYSeries.java | 0 .../android/calculator/plot/PlotUtils.java | 0 .../calculator/view/AngleUnitsButton.java | 0 .../view/CalculatorAdditionalTitle.java | 0 .../view/NumeralBaseConverterDialog.java | 0 .../calculator/view/NumeralBasesButton.java | 0 .../view/OnDragListenerVibrator.java | 0 .../calculator/view/TextHighlighter.java | 0 .../view/UnitConverterViewBuilder.java | 0 .../AbstractCalculatorWidgetProvider.java | 0 ...CalculatorWidgetConfigurationActivity.java | 0 .../widget/CalculatorWidgetIntentHandler.java | 0 .../widget/CalculatorWidgetProvider.java | 0 .../widget/CalculatorWidgetProvider3x4.java | 0 .../widget/CalculatorWidgetProvider4x4.java | 0 .../widget/CalculatorWidgetProvider4x5.java | 0 .../calculator/widget/WidgetButton.java | 0 .../android/fragments/FragmentUtils.java | 0 .../android/AndroidNumeralBaseTest.java | 0 .../AndroidCalculatorEditorViewTest.java | 0 .../calculator/CalculatorTestUtils.java | 0 .../calculator/CalculatorppTestRunner.java | 0 .../calculator/TextHighlighterTest.java | 0 .../calculator/history/HistoryUtilsTest.java | 0 .../android/calculator/model/VarTest.java | 0 .../calculator/plot/PlotUtilsTest.java | 0 .../common/FloatIntervalMapperTest.java | 0 .../common/math/DiscreteNormalizerTest.java | 0 pom.xml | 10 +- 673 files changed, 16589 insertions(+), 11 deletions(-) rename {app-android-core => android-app-core}/pom.xml (91%) rename {app-android-test => android-app-test}/pom.xml (90%) rename {app-android-widget => android-app-widget}/pom.xml (87%) rename {app-android => android-app}/AndroidManifest.xml (100%) create mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/gen/com/actionbarsherlock/BuildConfig.java create mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/gen/com/actionbarsherlock/Manifest.java create mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/gen/com/actionbarsherlock/R.java create mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/Animator.java create mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorListenerAdapter.java create mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorSet.java create mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatEvaluator.java create mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatKeyframeSet.java create mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntEvaluator.java create mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntKeyframeSet.java create mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/Keyframe.java create mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/KeyframeSet.java create mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/ObjectAnimator.java create mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/PropertyValuesHolder.java create mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/TypeEvaluator.java create mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/ValueAnimator.java create mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/view/NineViewGroup.java create mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/view/animation/AnimatorProxy.java create mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineFrameLayout.java create mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineHorizontalScrollView.java create mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineLinearLayout.java create mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/ActionMenu.java create mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/ActionMenuItem.java create mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/ActionMenuItemView.java create mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/ActionMenuPresenter.java create mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/ActionMenuView.java create mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/BaseMenuPresenter.java create mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/ListMenuItemView.java create mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuBuilder.java create mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuItemImpl.java create mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuItemWrapper.java create mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuPopupHelper.java create mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuPresenter.java create mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuView.java create mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuWrapper.java create mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/SubMenuBuilder.java create mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/SubMenuWrapper.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-ads_1.0.6/gen/org/solovyev/android/ads/BuildConfig.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-ads_1.0.6/gen/org/solovyev/android/ads/Manifest.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-ads_1.0.6/gen/org/solovyev/android/ads/R.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-all_1.0.6/gen/org/solovyev/android/all/BuildConfig.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-all_1.0.6/gen/org/solovyev/android/all/Manifest.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-all_1.0.6/gen/org/solovyev/android/all/R.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-billing_1.0.6/gen/net/robotmedia/billing/BuildConfig.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-billing_1.0.6/gen/net/robotmedia/billing/Manifest.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-billing_1.0.6/gen/net/robotmedia/billing/R.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-core_1.0.6/gen/org/solovyev/android/core/BuildConfig.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-core_1.0.6/gen/org/solovyev/android/core/Manifest.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-core_1.0.6/gen/org/solovyev/android/core/R.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-db_1.0.6/gen/org/solovyev/android/db/BuildConfig.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-db_1.0.6/gen/org/solovyev/android/db/Manifest.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-db_1.0.6/gen/org/solovyev/android/db/R.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-http_1.0.6/gen/org/solovyev/android/http/BuildConfig.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-http_1.0.6/gen/org/solovyev/android/http/Manifest.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-http_1.0.6/gen/org/solovyev/android/http/R.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-keyboard_1.0.6/gen/org/solovyev/android/keyboard/BuildConfig.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-keyboard_1.0.6/gen/org/solovyev/android/keyboard/Manifest.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-keyboard_1.0.6/gen/org/solovyev/android/keyboard/R.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-list_1.0.6/gen/org/solovyev/android/list/BuildConfig.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-list_1.0.6/gen/org/solovyev/android/list/Manifest.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-list_1.0.6/gen/org/solovyev/android/list/R.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-menu_1.0.6/gen/org/solovyev/android/menu/BuildConfig.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-menu_1.0.6/gen/org/solovyev/android/menu/Manifest.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-menu_1.0.6/gen/org/solovyev/android/menu/R.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-other_1.0.6/gen/org/solovyev/android/other/BuildConfig.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-other_1.0.6/gen/org/solovyev/android/other/Manifest.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-other_1.0.6/gen/org/solovyev/android/other/R.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-preferences_1.0.6/gen/org/solovyev/android/prefs/BuildConfig.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-preferences_1.0.6/gen/org/solovyev/android/prefs/Manifest.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-preferences_1.0.6/gen/org/solovyev/android/prefs/R.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-sherlock_1.0.6/gen/org/solovyev/android/sherlock/BuildConfig.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-sherlock_1.0.6/gen/org/solovyev/android/sherlock/Manifest.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-sherlock_1.0.6/gen/org/solovyev/android/sherlock/R.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/gen/org/solovyev/android/view/BuildConfig.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/gen/org/solovyev/android/view/Manifest.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/gen/org/solovyev/android/view/R.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/LastTabSaver.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/history/HistoryDragProcessor.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/AbstractEnumPickerDialogPreference.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/AbstractPickerDialogPreference.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/DoublePickerDialogPreference.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/FloatRangeSeekBarPreference.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/IntegerPickerDialogPreference.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/IntegerRangeSeekBarPreference.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/MultiSelectListPreference.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/NumberPickerDialogPreference.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/RangeSeekBarPreference.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/AbstractAlertDialogBuilder.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/AbstractRangeSeekBar.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ActivityViewBuilder.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/AndroidViewUtils.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/AutoResizeTextView.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ButtonDef.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ColorButton.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ColorPickerDialog.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ConfirmationDialogBuilder.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/DataActivityViewBuilder.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/DialogBuilder.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/DoubleRange.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/Grayable.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/GrayableImpl.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/GrayableRelativeLayout.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/GrayableView.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/IntegerRange.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ListRange.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ListViewBuilder.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/NumberRange.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/NumberRangeSeekBar.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/NumberType.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/OnClickListenerVibrator.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/Picker.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/PickerButton.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/TextViewBuilder.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/VibratorContainer.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ViewDef.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ViewFromLayoutBuilder.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ViewGrayable.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DirectionDragButton.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DirectionDragButtonDef.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DirectionDragButtonDefImpl.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DragButton.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DragButtonDef.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DragDirection.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DragEvent.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DragPreferencesChangeListener.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/OnDragListener.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/OnDragListenerWrapper.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/SimpleOnDragListener.java create mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/scroll/ScrollViewState.java rename {app-android => android-app}/misc/doc/GoogleAdMobAdsSdk-4.3.1-javadocs.zip (100%) rename {app-android => android-app}/misc/doc/achartengine-0.7.0-javadocs.zip (100%) rename {app-android => android-app}/misc/lib/GoogleAdMobAdsSdk-4.3.1.jar (100%) rename {app-android => android-app}/misc/lib/achartengine-0.7.0.jar (100%) rename {app-android => android-app}/misc/lib/achartengine-0.7.1.jar (100%) rename {app-android => android-app}/misc/other/prepare_avds.sh (100%) rename {app-android => android-app}/misc/other/remove_avds.sh (100%) rename {app-android => android-app}/misc/other/take_screenshots.py (100%) rename {app-android => android-app}/misc/other/take_screenshots.sh (100%) rename {app-android => android-app}/misc/other/take_screenshots2.sh (100%) rename {app-android => android-app}/misc/other/wait_device.py (100%) rename {app-android => android-app}/misc/res/calculatorpp/01_main_screen_port.png (100%) rename {app-android => android-app}/misc/res/calculatorpp/01_main_screen_port_sm.png (100%) rename {app-android => android-app}/misc/res/calculatorpp/02_main_screen_land.png (100%) rename {app-android => android-app}/misc/res/calculatorpp/03_main_screen_port_with_expression.png (100%) rename {app-android => android-app}/misc/res/calculatorpp/04_plot_graph_menu.png (100%) rename {app-android => android-app}/misc/res/calculatorpp/04_plot_graph_menu_sm.png (100%) rename {app-android => android-app}/misc/res/calculatorpp/05_graph_screen.png (100%) rename {app-android => android-app}/misc/res/calculatorpp/05_graph_screen_sm.png (100%) rename {app-android => android-app}/misc/res/calculatorpp/06_constants_screen.png (100%) rename {app-android => android-app}/misc/res/calculatorpp/06_constants_screen_sm.png (100%) rename {app-android => android-app}/misc/res/calculatorpp/07_constant_create_dialog.png (100%) rename {app-android => android-app}/misc/res/calculatorpp/08_constants_context_menu.png (100%) rename {app-android => android-app}/misc/res/calculatorpp/09_functions_screen.png (100%) rename {app-android => android-app}/misc/res/calculatorpp/09_functions_screen_sm.png (100%) rename {app-android => android-app}/misc/res/calculatorpp/10_history_screen.png (100%) rename {app-android => android-app}/misc/res/calculatorpp/10_history_screen_sm.png (100%) rename {app-android => android-app}/misc/res/calculatorpp/11_history_item_context_menu.png (100%) rename {app-android => android-app}/misc/res/calculatorpp/12_saved_history_tab.png (100%) rename {app-android => android-app}/misc/res/calculatorpp/13_saved_history_item_context_menu.png (100%) rename {app-android => android-app}/misc/res/calculatorpp/14_about_screen.png (100%) rename {app-android => android-app}/misc/res/calculatorpp/14_about_screen_sm.png (100%) rename {app-android => android-app}/misc/res/calculatorpp/15_release_notes_tab.png (100%) rename {app-android => android-app}/misc/res/calculatorpp/16_help_screen.png (100%) rename {app-android => android-app}/misc/res/calculatorpp/16_help_screen_sm.png (100%) rename {app-android => android-app}/misc/res/calculatorpp/17_hints_tab.png (100%) rename {app-android => android-app}/misc/res/calculatorpp/18_preferences.png (100%) rename {app-android => android-app}/misc/res/calculatorpp/18_preferences_02.png (100%) rename {app-android => android-app}/misc/res/calculatorpp/18_preferences_03.png (100%) rename {app-android => android-app}/misc/res/calculatorpp/18_preferences_sm.png (100%) rename {app-android => android-app}/misc/res/calculatorpp/plan.png (100%) rename {app-android => android-app}/misc/res/calculatorpp/plan.xcf (100%) rename {app-android => android-app}/misc/res/icon-green.png (100%) rename {app-android => android-app}/misc/res/icon-hi-res.png (100%) rename {app-android => android-app}/misc/res/icon-promo.png (100%) rename {app-android => android-app}/misc/res/icon.png (100%) rename {app-android => android-app}/misc/res/kb_facebook.png (100%) rename {app-android => android-app}/misc/res/kb_facebook_icon.png (100%) rename {app-android => android-app}/misc/res/logo-admob.png (100%) rename {app-android => android-app}/misc/res/logo-scaled.png (100%) rename {app-android => android-app}/misc/res/logo-small.png (100%) rename {app-android => android-app}/misc/res/logo.cdr (100%) rename {app-android => android-app}/misc/res/logo.png (100%) rename {app-android => android-app}/misc/res/widget.png (100%) rename {app-android => android-app}/misc/res/work/Backup_of_logo.cdr (100%) rename {app-android => android-app}/misc/res/work/header.png (100%) rename {app-android => android-app}/misc/res/work/header_bg.png (100%) rename {app-android => android-app}/misc/res/work/header_sm.png (100%) rename {app-android => android-app}/misc/res/work/heart_original.png (100%) rename {app-android => android-app}/misc/res/work/icon.png (100%) rename {app-android => android-app}/misc/res/work/icon_favicon_light_blue.ico (100%) rename {app-android => android-app}/misc/res/work/icon_favicon_light_blue.png (100%) rename {app-android => android-app}/misc/res/work/icon_favicon_purple.ico (100%) rename {app-android => android-app}/misc/res/work/icon_small.png (100%) rename {app-android => android-app}/misc/res/work/log11o.psd (100%) rename {app-android => android-app}/misc/res/work/logo.cdr (100%) rename {app-android => android-app}/misc/res/work/logo.png (100%) rename {app-android => android-app}/misc/res/work/logoFULL copy.png (100%) rename {app-android => android-app}/misc/res/work/logoFULL.pdf (100%) rename {app-android => android-app}/misc/res/work/logoFULL.png (100%) rename {app-android => android-app}/misc/res/work/logoFULL_banner.png (100%) rename {app-android => android-app}/misc/res/work/logoFULL_small.png (100%) rename {app-android => android-app}/misc/res/work/logo_black.png (100%) rename {app-android => android-app}/misc/res/work/logo_blue.png (100%) rename {app-android => android-app}/misc/res/work/logo_light_blue.png (100%) rename {app-android => android-app}/misc/res/work/logo_purple.png (100%) rename {app-android => android-app}/misc/res/work/promo_logo.png (100%) rename {app-android => android-app}/misc/res/work/text_logo.png (100%) rename {app-android => android-app}/misc/res/work/text_logo_blue.png (100%) rename {app-android => android-app}/misc/res/work/text_logo_light_blue.png (100%) rename {app-android => android-app}/misc/res/work/text_logo_light_blue_cpp_forum.png (100%) rename {app-android => android-app}/misc/res/work/text_logo_purple.png (100%) rename {app-android => android-app}/misc/src/achartengine-0.7.0.jar (100%) rename {app-android => android-app}/misc/src/bsh.jar (100%) rename {app-android => android-app}/pom.xml (98%) rename {app-android => android-app}/proguard.cfg (100%) rename {app-android => android-app}/project.properties (100%) rename {app-android => android-app}/res/drawable-hdpi/ab_add.png (100%) rename {app-android => android-app}/res/drawable-hdpi/ab_icon.png (100%) rename {app-android => android-app}/res/drawable-hdpi/ab_icon_long.png (100%) rename {app-android => android-app}/res/drawable-hdpi/ab_settings.png (100%) rename {app-android => android-app}/res/drawable-hdpi/icon.png (100%) rename {app-android => android-app}/res/drawable-hdpi/icon_onscreen.png (100%) rename {app-android => android-app}/res/drawable-hdpi/kb_copy.png (100%) rename {app-android => android-app}/res/drawable-hdpi/kb_delete.png (100%) rename {app-android => android-app}/res/drawable-hdpi/kb_facebook.png (100%) rename {app-android => android-app}/res/drawable-hdpi/kb_heart.png (100%) rename {app-android => android-app}/res/drawable-hdpi/kb_logo.png (100%) rename {app-android => android-app}/res/drawable-hdpi/kb_paste.png (100%) rename {app-android => android-app}/res/drawable-hdpi/kb_settings.png (100%) rename {app-android => android-app}/res/drawable-hdpi/logo.png (100%) rename {app-android => android-app}/res/drawable-ldpi/ab_add.png (100%) rename {app-android => android-app}/res/drawable-ldpi/ab_icon.png (100%) rename {app-android => android-app}/res/drawable-ldpi/ab_settings.png (100%) rename {app-android => android-app}/res/drawable-ldpi/icon.png (100%) rename {app-android => android-app}/res/drawable-ldpi/icon_onscreen.png (100%) rename {app-android => android-app}/res/drawable-ldpi/kb_copy.png (100%) rename {app-android => android-app}/res/drawable-ldpi/kb_delete.png (100%) rename {app-android => android-app}/res/drawable-ldpi/kb_facebook.png (100%) rename {app-android => android-app}/res/drawable-ldpi/kb_heart.png (100%) rename {app-android => android-app}/res/drawable-ldpi/kb_logo.png (100%) rename {app-android => android-app}/res/drawable-ldpi/kb_paste.png (100%) rename {app-android => android-app}/res/drawable-ldpi/kb_settings.png (100%) rename {app-android => android-app}/res/drawable-ldpi/logo.png (100%) rename {app-android => android-app}/res/drawable-mdpi/ab_add.png (100%) rename {app-android => android-app}/res/drawable-mdpi/ab_icon.png (100%) rename {app-android => android-app}/res/drawable-mdpi/ab_settings.png (100%) rename {app-android => android-app}/res/drawable-mdpi/icon.png (100%) rename {app-android => android-app}/res/drawable-mdpi/icon_onscreen.png (100%) rename {app-android => android-app}/res/drawable-mdpi/kb_copy.png (100%) rename {app-android => android-app}/res/drawable-mdpi/kb_delete.png (100%) rename {app-android => android-app}/res/drawable-mdpi/kb_facebook.png (100%) rename {app-android => android-app}/res/drawable-mdpi/kb_heart.png (100%) rename {app-android => android-app}/res/drawable-mdpi/kb_logo.png (100%) rename {app-android => android-app}/res/drawable-mdpi/kb_paste.png (100%) rename {app-android => android-app}/res/drawable-mdpi/kb_settings.png (100%) rename {app-android => android-app}/res/drawable-mdpi/logo.png (100%) rename {app-android => android-app}/res/drawable-nodpi/cpp_onscreen_button_close.png (100%) rename {app-android => android-app}/res/drawable-nodpi/cpp_onscreen_button_fold.png (100%) rename {app-android => android-app}/res/drawable-nodpi/cpp_onscreen_button_minimize.png (100%) rename {app-android => android-app}/res/drawable-nodpi/cpp_onscreen_header_logo.png (100%) rename {app-android => android-app}/res/drawable-nodpi/default_abs__ab_transparent_dark_holo.9.png (100%) rename {app-android => android-app}/res/drawable-nodpi/default_abs__btn_cab_done_default_holo_dark.9.png (100%) rename {app-android => android-app}/res/drawable-nodpi/default_abs__btn_cab_done_focused_holo_dark.9.png (100%) rename {app-android => android-app}/res/drawable-nodpi/default_abs__btn_cab_done_pressed_holo_dark.9.png (100%) rename {app-android => android-app}/res/drawable-nodpi/default_abs__list_focused_holo.9.png (100%) rename {app-android => android-app}/res/drawable-nodpi/default_abs__list_longpressed_holo.9.png (100%) rename {app-android => android-app}/res/drawable-nodpi/default_abs__list_pressed_holo_dark.9.png (100%) rename {app-android => android-app}/res/drawable-nodpi/default_abs__spinner_ab_focused_holo_dark.9.png (100%) rename {app-android => android-app}/res/drawable-nodpi/default_abs__spinner_ab_pressed_holo_dark.9.png (100%) rename {app-android => android-app}/res/drawable-nodpi/default_abs__tab_selected_focused_holo.9.png (100%) rename {app-android => android-app}/res/drawable-nodpi/default_abs__tab_selected_holo.9.png (100%) rename {app-android => android-app}/res/drawable-nodpi/default_abs__tab_selected_pressed_holo.9.png (100%) rename {app-android => android-app}/res/drawable-nodpi/default_abs__tab_unselected_pressed_holo.9.png (100%) rename {app-android => android-app}/res/drawable-nodpi/metro_blue_abs__ab_transparent_dark_holo.9.png (100%) rename {app-android => android-app}/res/drawable-nodpi/metro_blue_abs__list_focused_holo.9.png (100%) rename {app-android => android-app}/res/drawable-nodpi/metro_blue_abs__list_pressed_holo_dark.9.png (100%) rename {app-android => android-app}/res/drawable-nodpi/metro_blue_abs__tab_selected_focused_holo.9.png (100%) rename {app-android => android-app}/res/drawable-nodpi/metro_blue_abs__tab_selected_holo.9.png (100%) rename {app-android => android-app}/res/drawable-nodpi/metro_blue_abs__tab_selected_pressed_holo.9.png (100%) rename {app-android => android-app}/res/drawable-nodpi/metro_blue_abs__tab_unselected_pressed_holo.9.png (100%) rename {app-android => android-app}/res/drawable-nodpi/widget_preview.png (100%) rename {app-android => android-app}/res/drawable-xhdpi/ab_add.png (100%) rename {app-android => android-app}/res/drawable-xhdpi/ab_icon.png (100%) rename {app-android => android-app}/res/drawable-xhdpi/ab_settings.png (100%) rename {app-android => android-app}/res/drawable-xhdpi/ic_menu_preferences.png (100%) rename {app-android => android-app}/res/drawable-xhdpi/icon.png (100%) rename {app-android => android-app}/res/drawable-xhdpi/icon_onscreen.png (100%) rename {app-android => android-app}/res/drawable-xhdpi/kb_copy.png (100%) rename {app-android => android-app}/res/drawable-xhdpi/kb_delete.png (100%) rename {app-android => android-app}/res/drawable-xhdpi/kb_facebook.png (100%) rename {app-android => android-app}/res/drawable-xhdpi/kb_heart.png (100%) rename {app-android => android-app}/res/drawable-xhdpi/kb_logo.png (100%) rename {app-android => android-app}/res/drawable-xhdpi/kb_paste.png (100%) rename {app-android => android-app}/res/drawable-xhdpi/kb_settings.png (100%) rename {app-android => android-app}/res/drawable-xhdpi/logo.png (100%) rename {app-android => android-app}/res/drawable-xlarge-hdpi/kb_copy.png (100%) rename {app-android => android-app}/res/drawable-xlarge-hdpi/kb_delete.png (100%) rename {app-android => android-app}/res/drawable-xlarge-hdpi/kb_facebook.png (100%) rename {app-android => android-app}/res/drawable-xlarge-hdpi/kb_heart.png (100%) rename {app-android => android-app}/res/drawable-xlarge-hdpi/kb_logo.png (100%) rename {app-android => android-app}/res/drawable-xlarge-hdpi/kb_paste.png (100%) rename {app-android => android-app}/res/drawable-xlarge-hdpi/kb_settings.png (100%) rename {app-android => android-app}/res/drawable/blue_button.xml (100%) rename {app-android => android-app}/res/drawable/blue_button_dark.xml (100%) rename {app-android => android-app}/res/drawable/blue_button_dark_shape.xml (100%) rename {app-android => android-app}/res/drawable/blue_button_shape.xml (100%) rename {app-android => android-app}/res/drawable/default_abs__btn_cab_done_holo_dark.xml (100%) rename {app-android => android-app}/res/drawable/default_abs__item_background_holo_dark.xml (100%) rename {app-android => android-app}/res/drawable/default_abs__list_selector_background_transition_holo_dark.xml (100%) rename {app-android => android-app}/res/drawable/default_abs__list_selector_holo_dark.xml (100%) rename {app-android => android-app}/res/drawable/default_abs__spinner_ab_holo_dark.xml (100%) rename {app-android => android-app}/res/drawable/default_abs__tab_indicator_ab_holo.xml (100%) rename {app-android => android-app}/res/drawable/gray_button.xml (100%) rename {app-android => android-app}/res/drawable/gray_button_dark.xml (100%) rename {app-android => android-app}/res/drawable/gray_button_dark_shape.xml (100%) rename {app-android => android-app}/res/drawable/gray_button_shape.xml (100%) rename {app-android => android-app}/res/drawable/metro_blue_abs__tab_indicator_ab_holo.xml (100%) rename {app-android => android-app}/res/drawable/metro_blue_button.xml (100%) rename {app-android => android-app}/res/drawable/metro_blue_button_shape.xml (100%) rename {app-android => android-app}/res/drawable/metro_blue_list_item.xml (100%) rename {app-android => android-app}/res/drawable/metro_button_dark.xml (100%) rename {app-android => android-app}/res/drawable/metro_button_dark_shape.xml (100%) rename {app-android => android-app}/res/drawable/metro_button_green.xml (100%) rename {app-android => android-app}/res/drawable/metro_button_green_shape.xml (100%) rename {app-android => android-app}/res/drawable/metro_button_light.xml (100%) rename {app-android => android-app}/res/drawable/metro_button_light_shape.xml (100%) rename {app-android => android-app}/res/drawable/metro_button_pressed.xml (100%) rename {app-android => android-app}/res/drawable/metro_button_purple.xml (100%) rename {app-android => android-app}/res/drawable/metro_button_purple_shape.xml (100%) rename {app-android => android-app}/res/drawable/metro_green_list_item.xml (100%) rename {app-android => android-app}/res/drawable/metro_purple_list_item.xml (100%) rename {app-android => android-app}/res/drawable/pane_background.xml (100%) rename {app-android => android-app}/res/drawable/violet_button.xml (100%) rename {app-android => android-app}/res/drawable/violet_button_dark.xml (100%) rename {app-android => android-app}/res/drawable/violet_button_dark_shape.xml (100%) rename {app-android => android-app}/res/drawable/violet_button_shape.xml (100%) rename {app-android => android-app}/res/layout-land/calc_keyboard.xml (100%) rename {app-android => android-app}/res/layout-land/calc_keyboard_mobile.xml (100%) rename {app-android => android-app}/res/layout-land/main_calculator.xml (100%) rename {app-android => android-app}/res/layout-land/main_calculator_mobile.xml (100%) rename {app-android => android-app}/res/layout-land/main_first_pane.xml (100%) rename {app-android => android-app}/res/layout-land/main_first_pane_mobile.xml (100%) rename {app-android => android-app}/res/layout-large-land/calc_keyboard.xml (100%) rename {app-android => android-app}/res/layout-large-land/main_calculator.xml (100%) rename {app-android => android-app}/res/layout-large/calc_display.xml (100%) rename {app-android => android-app}/res/layout-large/calc_editor.xml (100%) rename {app-android => android-app}/res/layout-large/calc_keyboard.xml (100%) rename {app-android => android-app}/res/layout-large/main_calculator.xml (100%) rename {app-android => android-app}/res/layout-xlarge-land/calc_keyboard.xml (100%) rename {app-android => android-app}/res/layout-xlarge-land/main_calculator.xml (100%) rename {app-android => android-app}/res/layout-xlarge/calc_display.xml (100%) rename {app-android => android-app}/res/layout-xlarge/calc_editor.xml (100%) rename {app-android => android-app}/res/layout-xlarge/calc_keyboard.xml (100%) rename {app-android => android-app}/res/layout-xlarge/main_calculator.xml (100%) rename {app-android => android-app}/res/layout/about_fragment.xml (100%) rename {app-android => android-app}/res/layout/ad.xml (100%) rename {app-android => android-app}/res/layout/admob_pref.xml (100%) rename {app-android => android-app}/res/layout/calc_clear_button.xml (100%) rename {app-android => android-app}/res/layout/calc_copy_button.xml (100%) rename {app-android => android-app}/res/layout/calc_display.xml (100%) rename {app-android => android-app}/res/layout/calc_display_mobile.xml (100%) rename {app-android => android-app}/res/layout/calc_division_button.xml (100%) rename {app-android => android-app}/res/layout/calc_donate_button.xml (100%) rename {app-android => android-app}/res/layout/calc_dot_button.xml (100%) rename {app-android => android-app}/res/layout/calc_editor.xml (100%) rename {app-android => android-app}/res/layout/calc_editor_mobile.xml (100%) rename {app-android => android-app}/res/layout/calc_eight_digit_button.xml (100%) rename {app-android => android-app}/res/layout/calc_empty_button.xml (100%) rename {app-android => android-app}/res/layout/calc_equals_button.xml (100%) rename {app-android => android-app}/res/layout/calc_erase_button.xml (100%) rename {app-android => android-app}/res/layout/calc_five_digit_button.xml (100%) rename {app-android => android-app}/res/layout/calc_four_digit_button.xml (100%) rename {app-android => android-app}/res/layout/calc_functions_button.xml (100%) rename {app-android => android-app}/res/layout/calc_history_button.xml (100%) rename {app-android => android-app}/res/layout/calc_keyboard.xml (100%) rename {app-android => android-app}/res/layout/calc_keyboard_mobile.xml (100%) rename {app-android => android-app}/res/layout/calc_left_button.xml (100%) rename {app-android => android-app}/res/layout/calc_multiplication_button.xml (100%) rename {app-android => android-app}/res/layout/calc_nine_digit_button.xml (100%) rename {app-android => android-app}/res/layout/calc_one_digit_button.xml (100%) rename {app-android => android-app}/res/layout/calc_operators_button.xml (100%) rename {app-android => android-app}/res/layout/calc_paste_button.xml (100%) rename {app-android => android-app}/res/layout/calc_plot_view.xml (100%) rename {app-android => android-app}/res/layout/calc_plus_button.xml (100%) rename {app-android => android-app}/res/layout/calc_right_button.xml (100%) rename {app-android => android-app}/res/layout/calc_round_brackets_button.xml (100%) rename {app-android => android-app}/res/layout/calc_seven_digit_button.xml (100%) rename {app-android => android-app}/res/layout/calc_six_digit_button.xml (100%) rename {app-android => android-app}/res/layout/calc_subtraction_button.xml (100%) rename {app-android => android-app}/res/layout/calc_three_digit_button.xml (100%) rename {app-android => android-app}/res/layout/calc_title.xml (100%) rename {app-android => android-app}/res/layout/calc_two_digit_button.xml (100%) rename {app-android => android-app}/res/layout/calc_vars_button.xml (100%) rename {app-android => android-app}/res/layout/calc_zero_digit_button.xml (100%) rename {app-android => android-app}/res/layout/calculator_messages_dialog.xml (100%) rename {app-android => android-app}/res/layout/calculator_messages_dialog_message.xml (100%) rename {app-android => android-app}/res/layout/display_error_message.xml (100%) rename {app-android => android-app}/res/layout/drag_button_calibration.xml (100%) rename {app-android => android-app}/res/layout/feedback.xml (100%) rename {app-android => android-app}/res/layout/function_add_param.xml (100%) rename {app-android => android-app}/res/layout/function_edit.xml (100%) rename {app-android => android-app}/res/layout/function_edit_param.xml (100%) rename {app-android => android-app}/res/layout/help_faq_fragment.xml (100%) rename {app-android => android-app}/res/layout/help_hints_fragment.xml (100%) rename {app-android => android-app}/res/layout/help_screens_fragment.xml (100%) rename {app-android => android-app}/res/layout/history_edit.xml (100%) rename {app-android => android-app}/res/layout/history_fragment.xml (100%) rename {app-android => android-app}/res/layout/history_item.xml (100%) rename {app-android => android-app}/res/layout/main_calculator.xml (100%) rename {app-android => android-app}/res/layout/main_calculator_mobile.xml (100%) rename {app-android => android-app}/res/layout/main_empty.xml (100%) rename {app-android => android-app}/res/layout/main_empty_multi_pane.xml (100%) rename {app-android => android-app}/res/layout/math_entities_fragment.xml (100%) rename {app-android => android-app}/res/layout/math_entity.xml (100%) rename {app-android => android-app}/res/layout/notespp_announce.xml (100%) rename {app-android => android-app}/res/layout/onscreen_display.xml (100%) rename {app-android => android-app}/res/layout/onscreen_editor.xml (100%) rename {app-android => android-app}/res/layout/onscreen_footer.xml (100%) rename {app-android => android-app}/res/layout/onscreen_header.xml (100%) rename {app-android => android-app}/res/layout/onscreen_keyboard.xml (100%) rename {app-android => android-app}/res/layout/onscreen_layout.xml (100%) rename {app-android => android-app}/res/layout/plot_fragment.xml (100%) rename {app-android => android-app}/res/layout/release_notes_fragment.xml (100%) rename {app-android => android-app}/res/layout/saved_history_item.xml (100%) rename {app-android => android-app}/res/layout/tabs.xml (100%) rename {app-android => android-app}/res/layout/unit_converter.xml (100%) rename {app-android => android-app}/res/layout/var_edit.xml (100%) rename {app-android => android-app}/res/layout/vars_fragment.xml (100%) rename {app-android => android-app}/res/layout/widget_app_button.xml (100%) rename {app-android => android-app}/res/layout/widget_clear_button.xml (100%) rename {app-android => android-app}/res/layout/widget_copy_button.xml (100%) rename {app-android => android-app}/res/layout/widget_display.xml (100%) rename {app-android => android-app}/res/layout/widget_division_button.xml (100%) rename {app-android => android-app}/res/layout/widget_dot_button.xml (100%) rename {app-android => android-app}/res/layout/widget_editor.xml (100%) rename {app-android => android-app}/res/layout/widget_eight_digit_button.xml (100%) rename {app-android => android-app}/res/layout/widget_equals_button.xml (100%) rename {app-android => android-app}/res/layout/widget_erase_button.xml (100%) rename {app-android => android-app}/res/layout/widget_five_digit_button.xml (100%) rename {app-android => android-app}/res/layout/widget_four_digit_button.xml (100%) rename {app-android => android-app}/res/layout/widget_functions_button.xml (100%) rename {app-android => android-app}/res/layout/widget_history_button.xml (100%) rename {app-android => android-app}/res/layout/widget_keyboard.xml (100%) rename {app-android => android-app}/res/layout/widget_layout.xml (100%) rename {app-android => android-app}/res/layout/widget_left_button.xml (100%) rename {app-android => android-app}/res/layout/widget_like_button.xml (100%) rename {app-android => android-app}/res/layout/widget_multiplication_button.xml (100%) rename {app-android => android-app}/res/layout/widget_nine_digit_button.xml (100%) rename {app-android => android-app}/res/layout/widget_one_digit_button.xml (100%) rename {app-android => android-app}/res/layout/widget_paste_button.xml (100%) rename {app-android => android-app}/res/layout/widget_percent_button.xml (100%) rename {app-android => android-app}/res/layout/widget_plus_button.xml (100%) rename {app-android => android-app}/res/layout/widget_power_button.xml (100%) rename {app-android => android-app}/res/layout/widget_right_button.xml (100%) rename {app-android => android-app}/res/layout/widget_round_brackets_button.xml (100%) rename {app-android => android-app}/res/layout/widget_settings_button.xml (100%) rename {app-android => android-app}/res/layout/widget_seven_digit_button.xml (100%) rename {app-android => android-app}/res/layout/widget_six_digit_button.xml (100%) rename {app-android => android-app}/res/layout/widget_subtraction_button.xml (100%) rename {app-android => android-app}/res/layout/widget_three_digit_button.xml (100%) rename {app-android => android-app}/res/layout/widget_two_digit_button.xml (100%) rename {app-android => android-app}/res/layout/widget_vars_button.xml (100%) rename {app-android => android-app}/res/layout/widget_zero_digit_button.xml (100%) rename {app-android => android-app}/res/menu/functions_menu.xml (100%) rename {app-android => android-app}/res/menu/history_menu.xml (100%) rename {app-android => android-app}/res/menu/plot_menu.xml (100%) rename {app-android => android-app}/res/menu/vars_menu.xml (100%) rename {app-android => android-app}/res/values-es/text_about.xml (100%) rename {app-android => android-app}/res/values-es/text_functions.xml (100%) rename {app-android => android-app}/res/values-es/text_help.xml (100%) rename {app-android => android-app}/res/values-es/text_operators.xml (100%) rename {app-android => android-app}/res/values-es/text_strings.xml (100%) rename {app-android => android-app}/res/values-es/text_vars.xml (100%) rename {app-android => android-app}/res/values-it/text_about.xml (100%) rename {app-android => android-app}/res/values-it/text_functions.xml (100%) rename {app-android => android-app}/res/values-it/text_help.xml (100%) rename {app-android => android-app}/res/values-it/text_operators.xml (100%) rename {app-android => android-app}/res/values-it/text_strings.xml (100%) rename {app-android => android-app}/res/values-it/text_vars.xml (100%) rename {app-android => android-app}/res/values-large-hdpi/dimens.xml (100%) rename {app-android => android-app}/res/values-large-mdpi/dimens.xml (100%) rename {app-android => android-app}/res/values-large-tvdpi/dimens.xml (100%) rename {app-android => android-app}/res/values-large/dimens.xml (100%) rename {app-android => android-app}/res/values-normal-hdpi/dimens.xml (100%) rename {app-android => android-app}/res/values-normal-mdpi/dimens.xml (100%) rename {app-android => android-app}/res/values-normal-tvdpi/dimens.xml (100%) rename {app-android => android-app}/res/values-normal-xhdpi/dimens.xml (100%) rename {app-android => android-app}/res/values-normal/dimens.xml (100%) rename {app-android => android-app}/res/values-ru/text_about.xml (100%) rename {app-android => android-app}/res/values-ru/text_functions.xml (100%) rename {app-android => android-app}/res/values-ru/text_help.xml (100%) rename {app-android => android-app}/res/values-ru/text_operators.xml (100%) rename {app-android => android-app}/res/values-ru/text_preferences.xml (100%) rename {app-android => android-app}/res/values-ru/text_strings.xml (100%) rename {app-android => android-app}/res/values-ru/text_vars.xml (100%) rename {app-android => android-app}/res/values-small-hdpi/dimens.xml (100%) rename {app-android => android-app}/res/values-small-xhdpi/dimens.xml (100%) rename {app-android => android-app}/res/values-small/dimens.xml (100%) rename {app-android => android-app}/res/values-uk/text_about.xml (100%) rename {app-android => android-app}/res/values-uk/text_functions.xml (100%) rename {app-android => android-app}/res/values-uk/text_help.xml (100%) rename {app-android => android-app}/res/values-uk/text_operators.xml (100%) rename {app-android => android-app}/res/values-uk/text_preferences.xml (100%) rename {app-android => android-app}/res/values-uk/text_strings.xml (100%) rename {app-android => android-app}/res/values-uk/text_vars.xml (100%) rename {app-android => android-app}/res/values-v14/dimens.xml (100%) rename {app-android => android-app}/res/values-xlarge-hdpi/dimens.xml (100%) rename {app-android => android-app}/res/values-xlarge-mdpi/dimens.xml (100%) rename {app-android => android-app}/res/values-xlarge/dimens.xml (100%) rename {app-android => android-app}/res/values-zh-rtw/text_about.xml (100%) rename {app-android => android-app}/res/values-zh-rtw/text_functions.xml (100%) rename {app-android => android-app}/res/values-zh-rtw/text_help.xml (100%) rename {app-android => android-app}/res/values-zh-rtw/text_operators.xml (100%) rename {app-android => android-app}/res/values-zh-rtw/text_preferences.xml (100%) rename {app-android => android-app}/res/values-zh-rtw/text_strings.xml (100%) rename {app-android => android-app}/res/values-zh-rtw/text_vars.xml (100%) rename {app-android => android-app}/res/values/arrays.xml (100%) rename {app-android => android-app}/res/values/attributes.xml (100%) rename {app-android => android-app}/res/values/colors.xml (100%) rename {app-android => android-app}/res/values/dimens.xml (100%) rename {app-android => android-app}/res/values/preferences.xml (100%) rename {app-android => android-app}/res/values/styles.xml (100%) rename {app-android => android-app}/res/values/styles_history.xml (100%) rename {app-android => android-app}/res/values/styles_var.xml (100%) rename {app-android => android-app}/res/values/text_about.xml (100%) rename {app-android => android-app}/res/values/text_functions.xml (100%) rename {app-android => android-app}/res/values/text_help.xml (100%) rename {app-android => android-app}/res/values/text_operators.xml (100%) rename {app-android => android-app}/res/values/text_preferences.xml (100%) rename {app-android => android-app}/res/values/text_strings.xml (100%) rename {app-android => android-app}/res/values/text_vars.xml (100%) rename {app-android => android-app}/res/values/theme_gray.xml (100%) rename {app-android => android-app}/res/values/theme_light_blue.xml (100%) rename {app-android => android-app}/res/values/theme_metro_blue.xml (100%) rename {app-android => android-app}/res/values/theme_metro_green.xml (100%) rename {app-android => android-app}/res/values/theme_metro_purple.xml (100%) rename {app-android => android-app}/res/values/theme_violet.xml (100%) rename {app-android => android-app}/res/xml/calculator_widget_info_3x3.xml (100%) rename {app-android => android-app}/res/xml/calculator_widget_info_3x4.xml (100%) rename {app-android => android-app}/res/xml/calculator_widget_info_4x4.xml (100%) rename {app-android => android-app}/res/xml/calculator_widget_info_4x5.xml (100%) rename {app-android => android-app}/res/xml/preferences.xml (100%) rename {app-android => android-app}/res/xml/preferences_appearance.xml (100%) rename {app-android => android-app}/res/xml/preferences_calculations.xml (100%) rename {app-android => android-app}/res/xml/preferences_onscreen.xml (100%) rename {app-android => android-app}/res/xml/preferences_other.xml (100%) rename {app-android => android-app}/res/xml/preferences_plot.xml (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/AndroidUtils2.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/AbstractCalculatorHelper.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/AndroidCalculator.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/AndroidCalculatorClipboard.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/AndroidCalculatorDisplayView.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/AndroidCalculatorEditorView.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/AndroidCalculatorKeyboard.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/AndroidCalculatorLogger.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/AndroidCalculatorNotifier.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/AndroidCalculatorPreferenceService.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/AndroidFunctionCategory.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/AndroidNumeralBase.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/AndroidOperatorCategory.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/AndroidVarCategory.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/CalculatorActivity.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/CalculatorActivityHelper.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/CalculatorActivityHelperImpl.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/CalculatorActivityLauncher.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/CalculatorActivityMobile.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/CalculatorApplication.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/CalculatorButtons.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/CalculatorDisplayFragment.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/CalculatorDisplayMenuItem.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/CalculatorDisplayOnClickListener.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/CalculatorEditorFragment.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/CalculatorFixableMessage.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/CalculatorFragment.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/CalculatorFragmentActivity.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/CalculatorFragmentHelper.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/CalculatorFragmentHelperImpl.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/CalculatorKeyboardFragment.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/CalculatorMenu.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/CalculatorMessagesDialog.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/CalculatorOnscreenStartActivity.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/CalculatorPreferences.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/CalculatorPreferencesActivity.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/CalculatorSecurity.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/CharacterAtPositionFinder.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/ConversionMenuItem.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/CursorDragProcessor.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/DigitButtonDragProcessor.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/EvalDragProcessor.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/NumeralBaseButtons.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/ParcelableCalculatorDisplayViewState.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/ParcelableCalculatorEditorViewState.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/about/CalculatorAboutActivity.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/about/CalculatorAboutFragment.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/about/CalculatorFragmentType.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/about/CalculatorReleaseNotesFragment.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/about/TextHelper.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/external/AndroidExternalListenersContainer.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/external/DefaultExternalCalculatorIntentHandler.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/external/ExternalCalculatorIntentHandler.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/external/ExternalCalculatorStateUpdater.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/function/FunctionEditDialogFragment.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/function/FunctionEditorSaver.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/function/FunctionParamEditText.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/function/FunctionParamsView.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/help/CalculatorHelpActivity.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/help/CalculatorHelpFaqFragment.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/help/CalculatorHelpHintsFragment.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/help/CalculatorHelpScreensFragment.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/history/AbstractCalculatorHistoryFragment.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/history/AndroidCalculatorHistory.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/history/CalculatorHistoryActivity.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/history/CalculatorHistoryFragment.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/history/CalculatorSavedHistoryFragment.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/history/HistoryArrayAdapter.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/history/HistoryItemMenuData.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/history/HistoryItemMenuItem.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/history/TextViewEditorAdapter.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/math/edit/AbstractMathEntityListFragment.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorFunctionsActivity.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorFunctionsFragment.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorOperatorsActivity.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorOperatorsFragment.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorVarsActivity.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorVarsFragment.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/math/edit/MathEntityRemover.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/math/edit/VarEditDialogFragment.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/math/edit/VarEditorSaver.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/model/AndroidCalculatorEngine.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/model/AndroidMathEntityDao.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/model/Messages.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenBroadcastReceiver.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenService.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenView.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenViewDef.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/onscreen/OnscreenViewListener.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/plot/CalculatorPlotActivity.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/plot/CalculatorPlotFragment.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/plot/CalculatorPlotPreferenceActivity.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/plot/GraphLineColor.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/plot/MyXYSeries.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/plot/PlotUtils.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/view/AngleUnitsButton.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/view/CalculatorAdditionalTitle.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/view/NumeralBaseConverterDialog.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/view/NumeralBasesButton.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/view/OnDragListenerVibrator.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/view/TextHighlighter.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/view/UnitConverterViewBuilder.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/widget/AbstractCalculatorWidgetProvider.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetConfigurationActivity.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetIntentHandler.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider3x4.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider4x4.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider4x5.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/calculator/widget/WidgetButton.java (100%) rename {app-android => android-app}/src/main/java/org/solovyev/android/fragments/FragmentUtils.java (100%) rename {app-android => android-app}/src/test/java/org/solovyev/android/AndroidNumeralBaseTest.java (100%) rename {app-android => android-app}/src/test/java/org/solovyev/android/calculator/AndroidCalculatorEditorViewTest.java (100%) rename {app-android => android-app}/src/test/java/org/solovyev/android/calculator/CalculatorTestUtils.java (100%) rename {app-android => android-app}/src/test/java/org/solovyev/android/calculator/CalculatorppTestRunner.java (100%) rename {app-android => android-app}/src/test/java/org/solovyev/android/calculator/TextHighlighterTest.java (100%) rename {app-android => android-app}/src/test/java/org/solovyev/android/calculator/history/HistoryUtilsTest.java (100%) rename {app-android => android-app}/src/test/java/org/solovyev/android/calculator/model/VarTest.java (100%) rename {app-android => android-app}/src/test/java/org/solovyev/android/calculator/plot/PlotUtilsTest.java (100%) rename {app-android => android-app}/src/test/java/org/solovyev/common/FloatIntervalMapperTest.java (100%) rename {app-android => android-app}/src/test/java/org/solovyev/common/math/DiscreteNormalizerTest.java (100%) diff --git a/app-android-core/pom.xml b/android-app-core/pom.xml similarity index 91% rename from app-android-core/pom.xml rename to android-app-core/pom.xml index 7d0625bf..6099e3b9 100644 --- a/app-android-core/pom.xml +++ b/android-app-core/pom.xml @@ -11,7 +11,7 @@ org.solovyev.android - app-android-core + calculatorpp-android-app-core 1.5.3-SNAPSHOT Calculator++ Application Core apklib diff --git a/app-android-test/pom.xml b/android-app-test/pom.xml similarity index 90% rename from app-android-test/pom.xml rename to android-app-test/pom.xml index e7c0fedb..d34b699a 100644 --- a/app-android-test/pom.xml +++ b/android-app-test/pom.xml @@ -10,7 +10,7 @@ 4.0.0 org.solovyev.android - calculatorpp-app-android-test + calculatorpp-android-app-test Calculator++ Application (Test) diff --git a/app-android-widget/pom.xml b/android-app-widget/pom.xml similarity index 87% rename from app-android-widget/pom.xml rename to android-app-widget/pom.xml index f7b3dfe6..1482467f 100644 --- a/app-android-widget/pom.xml +++ b/android-app-widget/pom.xml @@ -11,7 +11,7 @@ org.solovyev.android - app-android-widget + calculatorpp-android-app-widget 1.5.3-SNAPSHOT Calculator++ Application Widget apklib @@ -25,7 +25,7 @@ org.solovyev.android.calculator - app-android-core + calculatorpp-android-app-core diff --git a/app-android/AndroidManifest.xml b/android-app/AndroidManifest.xml similarity index 100% rename from app-android/AndroidManifest.xml rename to android-app/AndroidManifest.xml diff --git a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/gen/com/actionbarsherlock/BuildConfig.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/gen/com/actionbarsherlock/BuildConfig.java new file mode 100644 index 00000000..ceb2ab07 --- /dev/null +++ b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/gen/com/actionbarsherlock/BuildConfig.java @@ -0,0 +1,6 @@ +/** Automatically generated file. DO NOT MODIFY */ +package com.actionbarsherlock; + +public final class BuildConfig { + public final static boolean DEBUG = true; +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/gen/com/actionbarsherlock/Manifest.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/gen/com/actionbarsherlock/Manifest.java new file mode 100644 index 00000000..dcc76bbd --- /dev/null +++ b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/gen/com/actionbarsherlock/Manifest.java @@ -0,0 +1,5 @@ +package com.actionbarsherlock; + +/* This stub is for using by IDE only. It is NOT the Manifest class actually packed into APK */ +public final class Manifest { +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/gen/com/actionbarsherlock/R.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/gen/com/actionbarsherlock/R.java new file mode 100644 index 00000000..8a43c169 --- /dev/null +++ b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/gen/com/actionbarsherlock/R.java @@ -0,0 +1,5 @@ +package com.actionbarsherlock; + +/* This stub is for using by IDE only. It is NOT the R class actually packed into APK */ +public final class R { +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/Animator.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/Animator.java new file mode 100644 index 00000000..2caf5b4a --- /dev/null +++ b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/Animator.java @@ -0,0 +1,278 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.internal.nineoldandroids.animation; + +import java.util.ArrayList; + +import android.view.animation.Interpolator; + +/** + * This is the superclass for classes which provide basic support for animations which can be + * started, ended, and have AnimatorListeners added to them. + */ +public abstract class Animator implements Cloneable { + + + /** + * The set of listeners to be sent events through the life of an animation. + */ + ArrayList mListeners = null; + + /** + * Starts this animation. If the animation has a nonzero startDelay, the animation will start + * running after that delay elapses. A non-delayed animation will have its initial + * value(s) set immediately, followed by calls to + * {@link AnimatorListener#onAnimationStart(Animator)} for any listeners of this animator. + * + *

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

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

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

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

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

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

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

+ */ + public static interface AnimatorListener { + /** + *

Notifies the start of the animation.

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

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

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

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

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

Notifies the repetition of the animation.

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

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

+ * + *

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

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

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

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

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

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

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

+ *

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

+ *

+ *

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

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

+ *

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

+ *

+ *

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

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

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

+ *

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

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

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

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

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

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

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

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

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

+ * + *

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

+ * + *

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

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

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

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

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

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

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

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

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

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

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

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

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

+ * + *

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

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

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

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

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

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

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

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

+ * + *

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

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

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

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

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

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

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

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

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

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

Notifies the occurrence of another frame of the animation.

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

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

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

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

The space freed by demoting a full group cannot be consumed by future menu items. + * Once items begin to overflow, all future items become overflow items as well. This is + * to avoid inadvertent reordering that may break the app's intended design. + */ + public void flagActionItems() { + if (!mIsActionItemsStale) { + return; + } + + // Presenters flag action items as needed. + boolean flagged = false; + for (WeakReference ref : mPresenters) { + final MenuPresenter presenter = ref.get(); + if (presenter == null) { + mPresenters.remove(ref); + } else { + flagged |= presenter.flagActionItems(); + } + } + + if (flagged) { + mActionItems.clear(); + mNonActionItems.clear(); + ArrayList visibleItems = getVisibleItems(); + final int itemsSize = visibleItems.size(); + for (int i = 0; i < itemsSize; i++) { + MenuItemImpl item = visibleItems.get(i); + if (item.isActionButton()) { + mActionItems.add(item); + } else { + mNonActionItems.add(item); + } + } + } else { + // Nobody flagged anything, everything is a non-action item. + // (This happens during a first pass with no action-item presenters.) + mActionItems.clear(); + mNonActionItems.clear(); + mNonActionItems.addAll(getVisibleItems()); + } + mIsActionItemsStale = false; + } + + ArrayList getActionItems() { + flagActionItems(); + return mActionItems; + } + + ArrayList getNonActionItems() { + flagActionItems(); + return mNonActionItems; + } + + public void clearHeader() { + mHeaderIcon = null; + mHeaderTitle = null; + mHeaderView = null; + + onItemsChanged(false); + } + + private void setHeaderInternal(final int titleRes, final CharSequence title, final int iconRes, + final Drawable icon, final View view) { + final Resources r = getResources(); + + if (view != null) { + mHeaderView = view; + + // If using a custom view, then the title and icon aren't used + mHeaderTitle = null; + mHeaderIcon = null; + } else { + if (titleRes > 0) { + mHeaderTitle = r.getText(titleRes); + } else if (title != null) { + mHeaderTitle = title; + } + + if (iconRes > 0) { + mHeaderIcon = r.getDrawable(iconRes); + } else if (icon != null) { + mHeaderIcon = icon; + } + + // If using the title or icon, then a custom view isn't used + mHeaderView = null; + } + + // Notify of change + onItemsChanged(false); + } + + /** + * Sets the header's title. This replaces the header view. Called by the + * builder-style methods of subclasses. + * + * @param title The new title. + * @return This MenuBuilder so additional setters can be called. + */ + protected MenuBuilder setHeaderTitleInt(CharSequence title) { + setHeaderInternal(0, title, 0, null, null); + return this; + } + + /** + * Sets the header's title. This replaces the header view. Called by the + * builder-style methods of subclasses. + * + * @param titleRes The new title (as a resource ID). + * @return This MenuBuilder so additional setters can be called. + */ + protected MenuBuilder setHeaderTitleInt(int titleRes) { + setHeaderInternal(titleRes, null, 0, null, null); + return this; + } + + /** + * Sets the header's icon. This replaces the header view. Called by the + * builder-style methods of subclasses. + * + * @param icon The new icon. + * @return This MenuBuilder so additional setters can be called. + */ + protected MenuBuilder setHeaderIconInt(Drawable icon) { + setHeaderInternal(0, null, 0, icon, null); + return this; + } + + /** + * Sets the header's icon. This replaces the header view. Called by the + * builder-style methods of subclasses. + * + * @param iconRes The new icon (as a resource ID). + * @return This MenuBuilder so additional setters can be called. + */ + protected MenuBuilder setHeaderIconInt(int iconRes) { + setHeaderInternal(0, null, iconRes, null, null); + return this; + } + + /** + * Sets the header's view. This replaces the title and icon. Called by the + * builder-style methods of subclasses. + * + * @param view The new view. + * @return This MenuBuilder so additional setters can be called. + */ + protected MenuBuilder setHeaderViewInt(View view) { + setHeaderInternal(0, null, 0, null, view); + return this; + } + + public CharSequence getHeaderTitle() { + return mHeaderTitle; + } + + public Drawable getHeaderIcon() { + return mHeaderIcon; + } + + public View getHeaderView() { + return mHeaderView; + } + + /** + * Gets the root menu (if this is a submenu, find its root menu). + * @return The root menu. + */ + public MenuBuilder getRootMenu() { + return this; + } + + /** + * Sets the current menu info that is set on all items added to this menu + * (until this is called again with different menu info, in which case that + * one will be added to all subsequent item additions). + * + * @param menuInfo The extra menu information to add. + */ + public void setCurrentMenuInfo(ContextMenuInfo menuInfo) { + mCurrentMenuInfo = menuInfo; + } + + void setOptionalIconsVisible(boolean visible) { + mOptionalIconsVisible = visible; + } + + boolean getOptionalIconsVisible() { + return mOptionalIconsVisible; + } + + public boolean expandItemActionView(MenuItemImpl item) { + if (mPresenters.isEmpty()) return false; + + boolean expanded = false; + + stopDispatchingItemsChanged(); + for (WeakReference ref : mPresenters) { + final MenuPresenter presenter = ref.get(); + if (presenter == null) { + mPresenters.remove(ref); + } else if ((expanded = presenter.expandItemActionView(this, item))) { + break; + } + } + startDispatchingItemsChanged(); + + if (expanded) { + mExpandedItem = item; + } + return expanded; + } + + public boolean collapseItemActionView(MenuItemImpl item) { + if (mPresenters.isEmpty() || mExpandedItem != item) return false; + + boolean collapsed = false; + + stopDispatchingItemsChanged(); + for (WeakReference ref : mPresenters) { + final MenuPresenter presenter = ref.get(); + if (presenter == null) { + mPresenters.remove(ref); + } else if ((collapsed = presenter.collapseItemActionView(this, item))) { + break; + } + } + startDispatchingItemsChanged(); + + if (collapsed) { + mExpandedItem = null; + } + return collapsed; + } + + public MenuItemImpl getExpandedItem() { + return mExpandedItem; + } + + public boolean bindNativeOverflow(android.view.Menu menu, android.view.MenuItem.OnMenuItemClickListener listener, HashMap map) { + final List nonActionItems = getNonActionItems(); + if (nonActionItems == null || nonActionItems.size() == 0) { + return false; + } + + boolean visible = false; + menu.clear(); + for (MenuItemImpl nonActionItem : nonActionItems) { + if (!nonActionItem.isVisible()) { + continue; + } + visible = true; + + android.view.MenuItem nativeItem; + if (nonActionItem.hasSubMenu()) { + android.view.SubMenu nativeSub = menu.addSubMenu(nonActionItem.getGroupId(), nonActionItem.getItemId(), + nonActionItem.getOrder(), nonActionItem.getTitle()); + + SubMenuBuilder subMenu = (SubMenuBuilder)nonActionItem.getSubMenu(); + for (MenuItemImpl subItem : subMenu.getVisibleItems()) { + android.view.MenuItem nativeSubItem = nativeSub.add(subItem.getGroupId(), subItem.getItemId(), + subItem.getOrder(), subItem.getTitle()); + + nativeSubItem.setIcon(subItem.getIcon()); + nativeSubItem.setOnMenuItemClickListener(listener); + nativeSubItem.setEnabled(subItem.isEnabled()); + nativeSubItem.setIntent(subItem.getIntent()); + nativeSubItem.setNumericShortcut(subItem.getNumericShortcut()); + nativeSubItem.setAlphabeticShortcut(subItem.getAlphabeticShortcut()); + nativeSubItem.setTitleCondensed(subItem.getTitleCondensed()); + nativeSubItem.setCheckable(subItem.isCheckable()); + nativeSubItem.setChecked(subItem.isChecked()); + + if (subItem.isExclusiveCheckable()) { + nativeSub.setGroupCheckable(subItem.getGroupId(), true, true); + } + + map.put(nativeSubItem, subItem); + } + + nativeItem = nativeSub.getItem(); + } else { + nativeItem = menu.add(nonActionItem.getGroupId(), nonActionItem.getItemId(), + nonActionItem.getOrder(), nonActionItem.getTitle()); + } + nativeItem.setIcon(nonActionItem.getIcon()); + nativeItem.setOnMenuItemClickListener(listener); + nativeItem.setEnabled(nonActionItem.isEnabled()); + nativeItem.setIntent(nonActionItem.getIntent()); + nativeItem.setNumericShortcut(nonActionItem.getNumericShortcut()); + nativeItem.setAlphabeticShortcut(nonActionItem.getAlphabeticShortcut()); + nativeItem.setTitleCondensed(nonActionItem.getTitleCondensed()); + nativeItem.setCheckable(nonActionItem.isCheckable()); + nativeItem.setChecked(nonActionItem.isChecked()); + + if (nonActionItem.isExclusiveCheckable()) { + menu.setGroupCheckable(nonActionItem.getGroupId(), true, true); + } + + map.put(nativeItem, nonActionItem); + } + return visible; + } +} diff --git a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuItemImpl.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuItemImpl.java new file mode 100644 index 00000000..f5359fb4 --- /dev/null +++ b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuItemImpl.java @@ -0,0 +1,647 @@ +/* + * Copyright (C) 2006 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.internal.view.menu; + +import android.content.ActivityNotFoundException; +import android.content.Context; +import android.content.Intent; +import android.graphics.drawable.Drawable; +import android.util.Log; +import android.view.ContextMenu.ContextMenuInfo; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewDebug; +import android.widget.LinearLayout; + +import com.actionbarsherlock.view.ActionProvider; +import com.actionbarsherlock.view.MenuItem; +import com.actionbarsherlock.view.SubMenu; + +/** + * @hide + */ +public final class MenuItemImpl implements MenuItem { + private static final String TAG = "MenuItemImpl"; + + private static final int SHOW_AS_ACTION_MASK = SHOW_AS_ACTION_NEVER | + SHOW_AS_ACTION_IF_ROOM | + SHOW_AS_ACTION_ALWAYS; + + private final int mId; + private final int mGroup; + private final int mCategoryOrder; + private final int mOrdering; + private CharSequence mTitle; + private CharSequence mTitleCondensed; + private Intent mIntent; + private char mShortcutNumericChar; + private char mShortcutAlphabeticChar; + + /** The icon's drawable which is only created as needed */ + private Drawable mIconDrawable; + /** + * The icon's resource ID which is used to get the Drawable when it is + * needed (if the Drawable isn't already obtained--only one of the two is + * needed). + */ + private int mIconResId = NO_ICON; + + /** The menu to which this item belongs */ + private MenuBuilder mMenu; + /** If this item should launch a sub menu, this is the sub menu to launch */ + private SubMenuBuilder mSubMenu; + + private Runnable mItemCallback; + private MenuItem.OnMenuItemClickListener mClickListener; + + private int mFlags = ENABLED; + private static final int CHECKABLE = 0x00000001; + private static final int CHECKED = 0x00000002; + private static final int EXCLUSIVE = 0x00000004; + private static final int HIDDEN = 0x00000008; + private static final int ENABLED = 0x00000010; + private static final int IS_ACTION = 0x00000020; + + private int mShowAsAction = SHOW_AS_ACTION_NEVER; + + private View mActionView; + private ActionProvider mActionProvider; + private OnActionExpandListener mOnActionExpandListener; + private boolean mIsActionViewExpanded = false; + + /** Used for the icon resource ID if this item does not have an icon */ + static final int NO_ICON = 0; + + /** + * Current use case is for context menu: Extra information linked to the + * View that added this item to the context menu. + */ + private ContextMenuInfo mMenuInfo; + + private static String sPrependShortcutLabel; + private static String sEnterShortcutLabel; + private static String sDeleteShortcutLabel; + private static String sSpaceShortcutLabel; + + + /** + * Instantiates this menu item. + * + * @param menu + * @param group Item ordering grouping control. The item will be added after + * all other items whose order is <= this number, and before any + * that are larger than it. This can also be used to define + * groups of items for batch state changes. Normally use 0. + * @param id Unique item ID. Use 0 if you do not need a unique ID. + * @param categoryOrder The ordering for this item. + * @param title The text to display for the item. + */ + MenuItemImpl(MenuBuilder menu, int group, int id, int categoryOrder, int ordering, + CharSequence title, int showAsAction) { + + /* TODO if (sPrependShortcutLabel == null) { + // This is instantiated from the UI thread, so no chance of sync issues + sPrependShortcutLabel = menu.getContext().getResources().getString( + com.android.internal.R.string.prepend_shortcut_label); + sEnterShortcutLabel = menu.getContext().getResources().getString( + com.android.internal.R.string.menu_enter_shortcut_label); + sDeleteShortcutLabel = menu.getContext().getResources().getString( + com.android.internal.R.string.menu_delete_shortcut_label); + sSpaceShortcutLabel = menu.getContext().getResources().getString( + com.android.internal.R.string.menu_space_shortcut_label); + }*/ + + mMenu = menu; + mId = id; + mGroup = group; + mCategoryOrder = categoryOrder; + mOrdering = ordering; + mTitle = title; + mShowAsAction = showAsAction; + } + + /** + * Invokes the item by calling various listeners or callbacks. + * + * @return true if the invocation was handled, false otherwise + */ + public boolean invoke() { + if (mClickListener != null && + mClickListener.onMenuItemClick(this)) { + return true; + } + + if (mMenu.dispatchMenuItemSelected(mMenu.getRootMenu(), this)) { + return true; + } + + if (mItemCallback != null) { + mItemCallback.run(); + return true; + } + + if (mIntent != null) { + try { + mMenu.getContext().startActivity(mIntent); + return true; + } catch (ActivityNotFoundException e) { + Log.e(TAG, "Can't find activity to handle intent; ignoring", e); + } + } + + if (mActionProvider != null && mActionProvider.onPerformDefaultAction()) { + return true; + } + + return false; + } + + public boolean isEnabled() { + return (mFlags & ENABLED) != 0; + } + + public MenuItem setEnabled(boolean enabled) { + if (enabled) { + mFlags |= ENABLED; + } else { + mFlags &= ~ENABLED; + } + + mMenu.onItemsChanged(false); + + return this; + } + + public int getGroupId() { + return mGroup; + } + + @ViewDebug.CapturedViewProperty + public int getItemId() { + return mId; + } + + public int getOrder() { + return mCategoryOrder; + } + + public int getOrdering() { + return mOrdering; + } + + public Intent getIntent() { + return mIntent; + } + + public MenuItem setIntent(Intent intent) { + mIntent = intent; + return this; + } + + Runnable getCallback() { + return mItemCallback; + } + + public MenuItem setCallback(Runnable callback) { + mItemCallback = callback; + return this; + } + + public char getAlphabeticShortcut() { + return mShortcutAlphabeticChar; + } + + public MenuItem setAlphabeticShortcut(char alphaChar) { + if (mShortcutAlphabeticChar == alphaChar) return this; + + mShortcutAlphabeticChar = Character.toLowerCase(alphaChar); + + mMenu.onItemsChanged(false); + + return this; + } + + public char getNumericShortcut() { + return mShortcutNumericChar; + } + + public MenuItem setNumericShortcut(char numericChar) { + if (mShortcutNumericChar == numericChar) return this; + + mShortcutNumericChar = numericChar; + + mMenu.onItemsChanged(false); + + return this; + } + + public MenuItem setShortcut(char numericChar, char alphaChar) { + mShortcutNumericChar = numericChar; + mShortcutAlphabeticChar = Character.toLowerCase(alphaChar); + + mMenu.onItemsChanged(false); + + return this; + } + + /** + * @return The active shortcut (based on QWERTY-mode of the menu). + */ + char getShortcut() { + return (mMenu.isQwertyMode() ? mShortcutAlphabeticChar : mShortcutNumericChar); + } + + /** + * @return The label to show for the shortcut. This includes the chording + * key (for example 'Menu+a'). Also, any non-human readable + * characters should be human readable (for example 'Menu+enter'). + */ + String getShortcutLabel() { + + char shortcut = getShortcut(); + if (shortcut == 0) { + return ""; + } + + StringBuilder sb = new StringBuilder(sPrependShortcutLabel); + switch (shortcut) { + + case '\n': + sb.append(sEnterShortcutLabel); + break; + + case '\b': + sb.append(sDeleteShortcutLabel); + break; + + case ' ': + sb.append(sSpaceShortcutLabel); + break; + + default: + sb.append(shortcut); + break; + } + + return sb.toString(); + } + + /** + * @return Whether this menu item should be showing shortcuts (depends on + * whether the menu should show shortcuts and whether this item has + * a shortcut defined) + */ + boolean shouldShowShortcut() { + // Show shortcuts if the menu is supposed to show shortcuts AND this item has a shortcut + return mMenu.isShortcutsVisible() && (getShortcut() != 0); + } + + public SubMenu getSubMenu() { + return mSubMenu; + } + + public boolean hasSubMenu() { + return mSubMenu != null; + } + + void setSubMenu(SubMenuBuilder subMenu) { + mSubMenu = subMenu; + + subMenu.setHeaderTitle(getTitle()); + } + + @ViewDebug.CapturedViewProperty + public CharSequence getTitle() { + return mTitle; + } + + /** + * Gets the title for a particular {@link ItemView} + * + * @param itemView The ItemView that is receiving the title + * @return Either the title or condensed title based on what the ItemView + * prefers + */ + CharSequence getTitleForItemView(MenuView.ItemView itemView) { + return ((itemView != null) && itemView.prefersCondensedTitle()) + ? getTitleCondensed() + : getTitle(); + } + + public MenuItem setTitle(CharSequence title) { + mTitle = title; + + mMenu.onItemsChanged(false); + + if (mSubMenu != null) { + mSubMenu.setHeaderTitle(title); + } + + return this; + } + + public MenuItem setTitle(int title) { + return setTitle(mMenu.getContext().getString(title)); + } + + public CharSequence getTitleCondensed() { + return mTitleCondensed != null ? mTitleCondensed : mTitle; + } + + public MenuItem setTitleCondensed(CharSequence title) { + mTitleCondensed = title; + + // Could use getTitle() in the loop below, but just cache what it would do here + if (title == null) { + title = mTitle; + } + + mMenu.onItemsChanged(false); + + return this; + } + + public Drawable getIcon() { + if (mIconDrawable != null) { + return mIconDrawable; + } + + if (mIconResId != NO_ICON) { + return mMenu.getResources().getDrawable(mIconResId); + } + + return null; + } + + public MenuItem setIcon(Drawable icon) { + mIconResId = NO_ICON; + mIconDrawable = icon; + mMenu.onItemsChanged(false); + + return this; + } + + public MenuItem setIcon(int iconResId) { + mIconDrawable = null; + mIconResId = iconResId; + + // If we have a view, we need to push the Drawable to them + mMenu.onItemsChanged(false); + + return this; + } + + public boolean isCheckable() { + return (mFlags & CHECKABLE) == CHECKABLE; + } + + public MenuItem setCheckable(boolean checkable) { + final int oldFlags = mFlags; + mFlags = (mFlags & ~CHECKABLE) | (checkable ? CHECKABLE : 0); + if (oldFlags != mFlags) { + mMenu.onItemsChanged(false); + } + + return this; + } + + public void setExclusiveCheckable(boolean exclusive) { + mFlags = (mFlags & ~EXCLUSIVE) | (exclusive ? EXCLUSIVE : 0); + } + + public boolean isExclusiveCheckable() { + return (mFlags & EXCLUSIVE) != 0; + } + + public boolean isChecked() { + return (mFlags & CHECKED) == CHECKED; + } + + public MenuItem setChecked(boolean checked) { + if ((mFlags & EXCLUSIVE) != 0) { + // Call the method on the Menu since it knows about the others in this + // exclusive checkable group + mMenu.setExclusiveItemChecked(this); + } else { + setCheckedInt(checked); + } + + return this; + } + + void setCheckedInt(boolean checked) { + final int oldFlags = mFlags; + mFlags = (mFlags & ~CHECKED) | (checked ? CHECKED : 0); + if (oldFlags != mFlags) { + mMenu.onItemsChanged(false); + } + } + + public boolean isVisible() { + return (mFlags & HIDDEN) == 0; + } + + /** + * Changes the visibility of the item. This method DOES NOT notify the + * parent menu of a change in this item, so this should only be called from + * methods that will eventually trigger this change. If unsure, use {@link #setVisible(boolean)} + * instead. + * + * @param shown Whether to show (true) or hide (false). + * @return Whether the item's shown state was changed + */ + boolean setVisibleInt(boolean shown) { + final int oldFlags = mFlags; + mFlags = (mFlags & ~HIDDEN) | (shown ? 0 : HIDDEN); + return oldFlags != mFlags; + } + + public MenuItem setVisible(boolean shown) { + // Try to set the shown state to the given state. If the shown state was changed + // (i.e. the previous state isn't the same as given state), notify the parent menu that + // the shown state has changed for this item + if (setVisibleInt(shown)) mMenu.onItemVisibleChanged(this); + + return this; + } + + public MenuItem setOnMenuItemClickListener(MenuItem.OnMenuItemClickListener clickListener) { + mClickListener = clickListener; + return this; + } + + @Override + public String toString() { + return mTitle.toString(); + } + + void setMenuInfo(ContextMenuInfo menuInfo) { + mMenuInfo = menuInfo; + } + + public ContextMenuInfo getMenuInfo() { + return mMenuInfo; + } + + public void actionFormatChanged() { + mMenu.onItemActionRequestChanged(this); + } + + /** + * @return Whether the menu should show icons for menu items. + */ + public boolean shouldShowIcon() { + return mMenu.getOptionalIconsVisible(); + } + + public boolean isActionButton() { + return (mFlags & IS_ACTION) == IS_ACTION; + } + + public boolean requestsActionButton() { + return (mShowAsAction & SHOW_AS_ACTION_IF_ROOM) == SHOW_AS_ACTION_IF_ROOM; + } + + public boolean requiresActionButton() { + return (mShowAsAction & SHOW_AS_ACTION_ALWAYS) == SHOW_AS_ACTION_ALWAYS; + } + + public void setIsActionButton(boolean isActionButton) { + if (isActionButton) { + mFlags |= IS_ACTION; + } else { + mFlags &= ~IS_ACTION; + } + } + + public boolean showsTextAsAction() { + return (mShowAsAction & SHOW_AS_ACTION_WITH_TEXT) == SHOW_AS_ACTION_WITH_TEXT; + } + + public void setShowAsAction(int actionEnum) { + switch (actionEnum & SHOW_AS_ACTION_MASK) { + case SHOW_AS_ACTION_ALWAYS: + case SHOW_AS_ACTION_IF_ROOM: + case SHOW_AS_ACTION_NEVER: + // Looks good! + break; + + default: + // Mutually exclusive options selected! + throw new IllegalArgumentException("SHOW_AS_ACTION_ALWAYS, SHOW_AS_ACTION_IF_ROOM," + + " and SHOW_AS_ACTION_NEVER are mutually exclusive."); + } + mShowAsAction = actionEnum; + mMenu.onItemActionRequestChanged(this); + } + + public MenuItem setActionView(View view) { + mActionView = view; + mActionProvider = null; + if (view != null && view.getId() == View.NO_ID && mId > 0) { + view.setId(mId); + } + mMenu.onItemActionRequestChanged(this); + return this; + } + + public MenuItem setActionView(int resId) { + final Context context = mMenu.getContext(); + final LayoutInflater inflater = LayoutInflater.from(context); + setActionView(inflater.inflate(resId, new LinearLayout(context), false)); + return this; + } + + public View getActionView() { + if (mActionView != null) { + return mActionView; + } else if (mActionProvider != null) { + mActionView = mActionProvider.onCreateActionView(); + return mActionView; + } else { + return null; + } + } + + public ActionProvider getActionProvider() { + return mActionProvider; + } + + public MenuItem setActionProvider(ActionProvider actionProvider) { + mActionView = null; + mActionProvider = actionProvider; + mMenu.onItemsChanged(true); // Measurement can be changed + return this; + } + + @Override + public MenuItem setShowAsActionFlags(int actionEnum) { + setShowAsAction(actionEnum); + return this; + } + + @Override + public boolean expandActionView() { + if ((mShowAsAction & SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW) == 0 || mActionView == null) { + return false; + } + + if (mOnActionExpandListener == null || + mOnActionExpandListener.onMenuItemActionExpand(this)) { + return mMenu.expandItemActionView(this); + } + + return false; + } + + @Override + public boolean collapseActionView() { + if ((mShowAsAction & SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW) == 0) { + return false; + } + if (mActionView == null) { + // We're already collapsed if we have no action view. + return true; + } + + if (mOnActionExpandListener == null || + mOnActionExpandListener.onMenuItemActionCollapse(this)) { + return mMenu.collapseItemActionView(this); + } + + return false; + } + + @Override + public MenuItem setOnActionExpandListener(OnActionExpandListener listener) { + mOnActionExpandListener = listener; + return this; + } + + public boolean hasCollapsibleActionView() { + return (mShowAsAction & SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW) != 0 && mActionView != null; + } + + public void setActionViewExpanded(boolean isExpanded) { + mIsActionViewExpanded = isExpanded; + mMenu.onItemsChanged(false); + } + + public boolean isActionViewExpanded() { + return mIsActionViewExpanded; + } +} diff --git a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuItemWrapper.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuItemWrapper.java new file mode 100644 index 00000000..aaf2997b --- /dev/null +++ b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuItemWrapper.java @@ -0,0 +1,310 @@ +package com.actionbarsherlock.internal.view.menu; + +import android.content.Intent; +import android.graphics.drawable.Drawable; +import android.view.ContextMenu.ContextMenuInfo; +import android.view.View; +import com.actionbarsherlock.internal.view.ActionProviderWrapper; +import com.actionbarsherlock.internal.widget.CollapsibleActionViewWrapper; +import com.actionbarsherlock.view.ActionProvider; +import com.actionbarsherlock.view.CollapsibleActionView; +import com.actionbarsherlock.view.MenuItem; +import com.actionbarsherlock.view.SubMenu; + +public class MenuItemWrapper implements MenuItem, android.view.MenuItem.OnMenuItemClickListener { + private final android.view.MenuItem mNativeItem; + private SubMenu mSubMenu = null; + private OnMenuItemClickListener mMenuItemClickListener = null; + private OnActionExpandListener mActionExpandListener = null; + private android.view.MenuItem.OnActionExpandListener mNativeActionExpandListener = null; + + + public MenuItemWrapper(android.view.MenuItem nativeItem) { + if (nativeItem == null) { + throw new IllegalStateException("Wrapped menu item cannot be null."); + } + mNativeItem = nativeItem; + } + + + @Override + public int getItemId() { + return mNativeItem.getItemId(); + } + + @Override + public int getGroupId() { + return mNativeItem.getGroupId(); + } + + @Override + public int getOrder() { + return mNativeItem.getOrder(); + } + + @Override + public MenuItem setTitle(CharSequence title) { + mNativeItem.setTitle(title); + return this; + } + + @Override + public MenuItem setTitle(int title) { + mNativeItem.setTitle(title); + return this; + } + + @Override + public CharSequence getTitle() { + return mNativeItem.getTitle(); + } + + @Override + public MenuItem setTitleCondensed(CharSequence title) { + mNativeItem.setTitleCondensed(title); + return this; + } + + @Override + public CharSequence getTitleCondensed() { + return mNativeItem.getTitleCondensed(); + } + + @Override + public MenuItem setIcon(Drawable icon) { + mNativeItem.setIcon(icon); + return this; + } + + @Override + public MenuItem setIcon(int iconRes) { + mNativeItem.setIcon(iconRes); + return this; + } + + @Override + public Drawable getIcon() { + return mNativeItem.getIcon(); + } + + @Override + public MenuItem setIntent(Intent intent) { + mNativeItem.setIntent(intent); + return this; + } + + @Override + public Intent getIntent() { + return mNativeItem.getIntent(); + } + + @Override + public MenuItem setShortcut(char numericChar, char alphaChar) { + mNativeItem.setShortcut(numericChar, alphaChar); + return this; + } + + @Override + public MenuItem setNumericShortcut(char numericChar) { + mNativeItem.setNumericShortcut(numericChar); + return this; + } + + @Override + public char getNumericShortcut() { + return mNativeItem.getNumericShortcut(); + } + + @Override + public MenuItem setAlphabeticShortcut(char alphaChar) { + mNativeItem.setAlphabeticShortcut(alphaChar); + return this; + } + + @Override + public char getAlphabeticShortcut() { + return mNativeItem.getAlphabeticShortcut(); + } + + @Override + public MenuItem setCheckable(boolean checkable) { + mNativeItem.setCheckable(checkable); + return this; + } + + @Override + public boolean isCheckable() { + return mNativeItem.isCheckable(); + } + + @Override + public MenuItem setChecked(boolean checked) { + mNativeItem.setChecked(checked); + return this; + } + + @Override + public boolean isChecked() { + return mNativeItem.isChecked(); + } + + @Override + public MenuItem setVisible(boolean visible) { + mNativeItem.setVisible(visible); + return this; + } + + @Override + public boolean isVisible() { + return mNativeItem.isVisible(); + } + + @Override + public MenuItem setEnabled(boolean enabled) { + mNativeItem.setEnabled(enabled); + return this; + } + + @Override + public boolean isEnabled() { + return mNativeItem.isEnabled(); + } + + @Override + public boolean hasSubMenu() { + return mNativeItem.hasSubMenu(); + } + + @Override + public SubMenu getSubMenu() { + if (hasSubMenu() && (mSubMenu == null)) { + mSubMenu = new SubMenuWrapper(mNativeItem.getSubMenu()); + } + return mSubMenu; + } + + @Override + public MenuItem setOnMenuItemClickListener(OnMenuItemClickListener menuItemClickListener) { + mMenuItemClickListener = menuItemClickListener; + //Register ourselves as the listener to proxy + mNativeItem.setOnMenuItemClickListener(this); + return this; + } + + @Override + public boolean onMenuItemClick(android.view.MenuItem item) { + if (mMenuItemClickListener != null) { + return mMenuItemClickListener.onMenuItemClick(this); + } + return false; + } + + @Override + public ContextMenuInfo getMenuInfo() { + return mNativeItem.getMenuInfo(); + } + + @Override + public void setShowAsAction(int actionEnum) { + mNativeItem.setShowAsAction(actionEnum); + } + + @Override + public MenuItem setShowAsActionFlags(int actionEnum) { + mNativeItem.setShowAsActionFlags(actionEnum); + return this; + } + + @Override + public MenuItem setActionView(View view) { + if (view != null && view instanceof CollapsibleActionView) { + view = new CollapsibleActionViewWrapper(view); + } + mNativeItem.setActionView(view); + return this; + } + + @Override + public MenuItem setActionView(int resId) { + //Allow the native menu to inflate the resource + mNativeItem.setActionView(resId); + if (resId != 0) { + //Get newly created view + View view = mNativeItem.getActionView(); + if (view instanceof CollapsibleActionView) { + //Wrap it and re-set it + mNativeItem.setActionView(new CollapsibleActionViewWrapper(view)); + } + } + return this; + } + + @Override + public View getActionView() { + View actionView = mNativeItem.getActionView(); + if (actionView instanceof CollapsibleActionViewWrapper) { + return ((CollapsibleActionViewWrapper)actionView).unwrap(); + } + return actionView; + } + + @Override + public MenuItem setActionProvider(ActionProvider actionProvider) { + mNativeItem.setActionProvider(new ActionProviderWrapper(actionProvider)); + return this; + } + + @Override + public ActionProvider getActionProvider() { + android.view.ActionProvider nativeProvider = mNativeItem.getActionProvider(); + if (nativeProvider != null && nativeProvider instanceof ActionProviderWrapper) { + return ((ActionProviderWrapper)nativeProvider).unwrap(); + } + return null; + } + + @Override + public boolean expandActionView() { + return mNativeItem.expandActionView(); + } + + @Override + public boolean collapseActionView() { + return mNativeItem.collapseActionView(); + } + + @Override + public boolean isActionViewExpanded() { + return mNativeItem.isActionViewExpanded(); + } + + @Override + public MenuItem setOnActionExpandListener(OnActionExpandListener listener) { + mActionExpandListener = listener; + + if (mNativeActionExpandListener == null) { + mNativeActionExpandListener = new android.view.MenuItem.OnActionExpandListener() { + @Override + public boolean onMenuItemActionExpand(android.view.MenuItem menuItem) { + if (mActionExpandListener != null) { + return mActionExpandListener.onMenuItemActionExpand(MenuItemWrapper.this); + } + return false; + } + + @Override + public boolean onMenuItemActionCollapse(android.view.MenuItem menuItem) { + if (mActionExpandListener != null) { + return mActionExpandListener.onMenuItemActionCollapse(MenuItemWrapper.this); + } + return false; + } + }; + + //Register our inner-class as the listener to proxy method calls + mNativeItem.setOnActionExpandListener(mNativeActionExpandListener); + } + + return this; + } +} diff --git a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuPopupHelper.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuPopupHelper.java new file mode 100644 index 00000000..f030de31 --- /dev/null +++ b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuPopupHelper.java @@ -0,0 +1,376 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.internal.view.menu; + +import java.util.ArrayList; +import android.content.Context; +import android.content.res.Resources; +import android.database.DataSetObserver; +import android.os.Parcelable; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.View; +import android.view.View.MeasureSpec; +import android.view.ViewGroup; +import android.view.ViewTreeObserver; +import android.widget.AdapterView; +import android.widget.BaseAdapter; +import android.widget.FrameLayout; +import android.widget.ListAdapter; +import android.widget.PopupWindow; +import com.actionbarsherlock.R; +import com.actionbarsherlock.internal.view.View_HasStateListenerSupport; +import com.actionbarsherlock.internal.view.View_OnAttachStateChangeListener; +import com.actionbarsherlock.internal.widget.IcsListPopupWindow; +import com.actionbarsherlock.view.MenuItem; + +/** + * Presents a menu as a small, simple popup anchored to another view. + * @hide + */ +public class MenuPopupHelper implements AdapterView.OnItemClickListener, View.OnKeyListener, + ViewTreeObserver.OnGlobalLayoutListener, PopupWindow.OnDismissListener, + View_OnAttachStateChangeListener, MenuPresenter { + //UNUSED private static final String TAG = "MenuPopupHelper"; + + static final int ITEM_LAYOUT = R.layout.abs__popup_menu_item_layout; + + private Context mContext; + private LayoutInflater mInflater; + private IcsListPopupWindow mPopup; + private MenuBuilder mMenu; + private int mPopupMaxWidth; + private View mAnchorView; + private boolean mOverflowOnly; + private ViewTreeObserver mTreeObserver; + + private MenuAdapter mAdapter; + + private Callback mPresenterCallback; + + boolean mForceShowIcon; + + private ViewGroup mMeasureParent; + + public MenuPopupHelper(Context context, MenuBuilder menu) { + this(context, menu, null, false); + } + + public MenuPopupHelper(Context context, MenuBuilder menu, View anchorView) { + this(context, menu, anchorView, false); + } + + public MenuPopupHelper(Context context, MenuBuilder menu, + View anchorView, boolean overflowOnly) { + mContext = context; + mInflater = LayoutInflater.from(context); + mMenu = menu; + mOverflowOnly = overflowOnly; + + final Resources res = context.getResources(); + mPopupMaxWidth = Math.max(res.getDisplayMetrics().widthPixels / 2, + res.getDimensionPixelSize(R.dimen.abs__config_prefDialogWidth)); + + mAnchorView = anchorView; + + menu.addMenuPresenter(this); + } + + public void setAnchorView(View anchor) { + mAnchorView = anchor; + } + + public void setForceShowIcon(boolean forceShow) { + mForceShowIcon = forceShow; + } + + public void show() { + if (!tryShow()) { + throw new IllegalStateException("MenuPopupHelper cannot be used without an anchor"); + } + } + + public boolean tryShow() { + mPopup = new IcsListPopupWindow(mContext, null, R.attr.popupMenuStyle); + mPopup.setOnDismissListener(this); + mPopup.setOnItemClickListener(this); + + mAdapter = new MenuAdapter(mMenu); + mPopup.setAdapter(mAdapter); + mPopup.setModal(true); + + View anchor = mAnchorView; + if (anchor != null) { + final boolean addGlobalListener = mTreeObserver == null; + mTreeObserver = anchor.getViewTreeObserver(); // Refresh to latest + if (addGlobalListener) mTreeObserver.addOnGlobalLayoutListener(this); + ((View_HasStateListenerSupport)anchor).addOnAttachStateChangeListener(this); + mPopup.setAnchorView(anchor); + } else { + return false; + } + + mPopup.setContentWidth(Math.min(measureContentWidth(mAdapter), mPopupMaxWidth)); + mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NOT_NEEDED); + mPopup.show(); + mPopup.getListView().setOnKeyListener(this); + return true; + } + + public void dismiss() { + if (isShowing()) { + mPopup.dismiss(); + } + } + + public void onDismiss() { + mPopup = null; + mMenu.close(); + if (mTreeObserver != null) { + if (!mTreeObserver.isAlive()) mTreeObserver = mAnchorView.getViewTreeObserver(); + mTreeObserver.removeGlobalOnLayoutListener(this); + mTreeObserver = null; + } + ((View_HasStateListenerSupport)mAnchorView).removeOnAttachStateChangeListener(this); + } + + public boolean isShowing() { + return mPopup != null && mPopup.isShowing(); + } + + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + MenuAdapter adapter = mAdapter; + adapter.mAdapterMenu.performItemAction(adapter.getItem(position), 0); + } + + public boolean onKey(View v, int keyCode, KeyEvent event) { + if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_MENU) { + dismiss(); + return true; + } + return false; + } + + private int measureContentWidth(ListAdapter adapter) { + // Menus don't tend to be long, so this is more sane than it looks. + int width = 0; + View itemView = null; + int itemType = 0; + final int widthMeasureSpec = + MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); + final int heightMeasureSpec = + MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); + final int count = adapter.getCount(); + for (int i = 0; i < count; i++) { + final int positionType = adapter.getItemViewType(i); + if (positionType != itemType) { + itemType = positionType; + itemView = null; + } + if (mMeasureParent == null) { + mMeasureParent = new FrameLayout(mContext); + } + itemView = adapter.getView(i, itemView, mMeasureParent); + itemView.measure(widthMeasureSpec, heightMeasureSpec); + width = Math.max(width, itemView.getMeasuredWidth()); + } + return width; + } + + @Override + public void onGlobalLayout() { + if (isShowing()) { + final View anchor = mAnchorView; + if (anchor == null || !anchor.isShown()) { + dismiss(); + } else if (isShowing()) { + // Recompute window size and position + mPopup.show(); + } + } + } + + @Override + public void onViewAttachedToWindow(View v) { + } + + @Override + public void onViewDetachedFromWindow(View v) { + if (mTreeObserver != null) { + if (!mTreeObserver.isAlive()) mTreeObserver = v.getViewTreeObserver(); + mTreeObserver.removeGlobalOnLayoutListener(this); + } + ((View_HasStateListenerSupport)v).removeOnAttachStateChangeListener(this); + } + + @Override + public void initForMenu(Context context, MenuBuilder menu) { + // Don't need to do anything; we added as a presenter in the constructor. + } + + @Override + public MenuView getMenuView(ViewGroup root) { + throw new UnsupportedOperationException("MenuPopupHelpers manage their own views"); + } + + @Override + public void updateMenuView(boolean cleared) { + if (mAdapter != null) mAdapter.notifyDataSetChanged(); + } + + @Override + public void setCallback(Callback cb) { + mPresenterCallback = cb; + } + + @Override + public boolean onSubMenuSelected(SubMenuBuilder subMenu) { + if (subMenu.hasVisibleItems()) { + MenuPopupHelper subPopup = new MenuPopupHelper(mContext, subMenu, mAnchorView, false); + subPopup.setCallback(mPresenterCallback); + + boolean preserveIconSpacing = false; + final int count = subMenu.size(); + for (int i = 0; i < count; i++) { + MenuItem childItem = subMenu.getItem(i); + if (childItem.isVisible() && childItem.getIcon() != null) { + preserveIconSpacing = true; + break; + } + } + subPopup.setForceShowIcon(preserveIconSpacing); + + if (subPopup.tryShow()) { + if (mPresenterCallback != null) { + mPresenterCallback.onOpenSubMenu(subMenu); + } + return true; + } + } + return false; + } + + @Override + public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { + // Only care about the (sub)menu we're presenting. + if (menu != mMenu) return; + + dismiss(); + if (mPresenterCallback != null) { + mPresenterCallback.onCloseMenu(menu, allMenusAreClosing); + } + } + + @Override + public boolean flagActionItems() { + return false; + } + + public boolean expandItemActionView(MenuBuilder menu, MenuItemImpl item) { + return false; + } + + public boolean collapseItemActionView(MenuBuilder menu, MenuItemImpl item) { + return false; + } + + @Override + public int getId() { + return 0; + } + + @Override + public Parcelable onSaveInstanceState() { + return null; + } + + @Override + public void onRestoreInstanceState(Parcelable state) { + } + + private class MenuAdapter extends BaseAdapter { + private MenuBuilder mAdapterMenu; + private int mExpandedIndex = -1; + + public MenuAdapter(MenuBuilder menu) { + mAdapterMenu = menu; + registerDataSetObserver(new ExpandedIndexObserver()); + findExpandedIndex(); + } + + public int getCount() { + ArrayList items = mOverflowOnly ? + mAdapterMenu.getNonActionItems() : mAdapterMenu.getVisibleItems(); + if (mExpandedIndex < 0) { + return items.size(); + } + return items.size() - 1; + } + + public MenuItemImpl getItem(int position) { + ArrayList items = mOverflowOnly ? + mAdapterMenu.getNonActionItems() : mAdapterMenu.getVisibleItems(); + if (mExpandedIndex >= 0 && position >= mExpandedIndex) { + position++; + } + return items.get(position); + } + + public long getItemId(int position) { + // Since a menu item's ID is optional, we'll use the position as an + // ID for the item in the AdapterView + return position; + } + + public View getView(int position, View convertView, ViewGroup parent) { + if (convertView == null) { + convertView = mInflater.inflate(ITEM_LAYOUT, parent, false); + } + + MenuView.ItemView itemView = (MenuView.ItemView) convertView; + if (mForceShowIcon) { + ((ListMenuItemView) convertView).setForceShowIcon(true); + } + itemView.initialize(getItem(position), 0); + return convertView; + } + + void findExpandedIndex() { + final MenuItemImpl expandedItem = mMenu.getExpandedItem(); + if (expandedItem != null) { + final ArrayList items = mMenu.getNonActionItems(); + final int count = items.size(); + for (int i = 0; i < count; i++) { + final MenuItemImpl item = items.get(i); + if (item == expandedItem) { + mExpandedIndex = i; + return; + } + } + } + mExpandedIndex = -1; + } + } + + private class ExpandedIndexObserver extends DataSetObserver { + @Override + public void onChanged() { + mAdapter.findExpandedIndex(); + } + } +} diff --git a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuPresenter.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuPresenter.java new file mode 100644 index 00000000..c3f35472 --- /dev/null +++ b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuPresenter.java @@ -0,0 +1,148 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.internal.view.menu; + +import android.content.Context; +import android.os.Parcelable; +import android.view.ViewGroup; + +/** + * A MenuPresenter is responsible for building views for a Menu object. + * It takes over some responsibility from the old style monolithic MenuBuilder class. + */ +public interface MenuPresenter { + /** + * Called by menu implementation to notify another component of open/close events. + */ + public interface Callback { + /** + * Called when a menu is closing. + * @param menu + * @param allMenusAreClosing + */ + public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing); + + /** + * Called when a submenu opens. Useful for notifying the application + * of menu state so that it does not attempt to hide the action bar + * while a submenu is open or similar. + * + * @param subMenu Submenu currently being opened + * @return true if the Callback will handle presenting the submenu, false if + * the presenter should attempt to do so. + */ + public boolean onOpenSubMenu(MenuBuilder subMenu); + } + + /** + * Initialize this presenter for the given context and menu. + * This method is called by MenuBuilder when a presenter is + * added. See {@link MenuBuilder#addMenuPresenter(MenuPresenter)} + * + * @param context Context for this presenter; used for view creation and resource management + * @param menu Menu to host + */ + public void initForMenu(Context context, MenuBuilder menu); + + /** + * Retrieve a MenuView to display the menu specified in + * {@link #initForMenu(Context, Menu)}. + * + * @param root Intended parent of the MenuView. + * @return A freshly created MenuView. + */ + public MenuView getMenuView(ViewGroup root); + + /** + * Update the menu UI in response to a change. Called by + * MenuBuilder during the normal course of operation. + * + * @param cleared true if the menu was entirely cleared + */ + public void updateMenuView(boolean cleared); + + /** + * Set a callback object that will be notified of menu events + * related to this specific presentation. + * @param cb Callback that will be notified of future events + */ + public void setCallback(Callback cb); + + /** + * Called by Menu implementations to indicate that a submenu item + * has been selected. An active Callback should be notified, and + * if applicable the presenter should present the submenu. + * + * @param subMenu SubMenu being opened + * @return true if the the event was handled, false otherwise. + */ + public boolean onSubMenuSelected(SubMenuBuilder subMenu); + + /** + * Called by Menu implementations to indicate that a menu or submenu is + * closing. Presenter implementations should close the representation + * of the menu indicated as necessary and notify a registered callback. + * + * @param menu Menu or submenu that is closing. + * @param allMenusAreClosing True if all associated menus are closing. + */ + public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing); + + /** + * Called by Menu implementations to flag items that will be shown as actions. + * @return true if this presenter changed the action status of any items. + */ + public boolean flagActionItems(); + + /** + * Called when a menu item with a collapsable action view should expand its action view. + * + * @param menu Menu containing the item to be expanded + * @param item Item to be expanded + * @return true if this presenter expanded the action view, false otherwise. + */ + public boolean expandItemActionView(MenuBuilder menu, MenuItemImpl item); + + /** + * Called when a menu item with a collapsable action view should collapse its action view. + * + * @param menu Menu containing the item to be collapsed + * @param item Item to be collapsed + * @return true if this presenter collapsed the action view, false otherwise. + */ + public boolean collapseItemActionView(MenuBuilder menu, MenuItemImpl item); + + /** + * Returns an ID for determining how to save/restore instance state. + * @return a valid ID value. + */ + public int getId(); + + /** + * Returns a Parcelable describing the current state of the presenter. + * It will be passed to the {@link #onRestoreInstanceState(Parcelable)} + * method of the presenter sharing the same ID later. + * @return The saved instance state + */ + public Parcelable onSaveInstanceState(); + + /** + * Supplies the previously saved instance state to be restored. + * @param state The previously saved instance state + */ + public void onRestoreInstanceState(Parcelable state); +} diff --git a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuView.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuView.java new file mode 100644 index 00000000..323ba2d8 --- /dev/null +++ b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuView.java @@ -0,0 +1,120 @@ +/* + * Copyright (C) 2006 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.internal.view.menu; + +import android.graphics.drawable.Drawable; + +/** + * Minimal interface for a menu view. {@link #initialize(MenuBuilder)} must be called for the + * menu to be functional. + * + * @hide + */ +public interface MenuView { + /** + * Initializes the menu to the given menu. This should be called after the + * view is inflated. + * + * @param menu The menu that this MenuView should display. + */ + public void initialize(MenuBuilder menu); + + /** + * Returns the default animations to be used for this menu when entering/exiting. + * @return A resource ID for the default animations to be used for this menu. + */ + public int getWindowAnimations(); + + /** + * Minimal interface for a menu item view. {@link #initialize(MenuItemImpl, int)} must be called + * for the item to be functional. + */ + public interface ItemView { + /** + * Initializes with the provided MenuItemData. This should be called after the view is + * inflated. + * @param itemData The item that this ItemView should display. + * @param menuType The type of this menu, one of + * {@link MenuBuilder#TYPE_ICON}, {@link MenuBuilder#TYPE_EXPANDED}, + * {@link MenuBuilder#TYPE_DIALOG}). + */ + public void initialize(MenuItemImpl itemData, int menuType); + + /** + * Gets the item data that this view is displaying. + * @return the item data, or null if there is not one + */ + public MenuItemImpl getItemData(); + + /** + * Sets the title of the item view. + * @param title The title to set. + */ + public void setTitle(CharSequence title); + + /** + * Sets the enabled state of the item view. + * @param enabled Whether the item view should be enabled. + */ + public void setEnabled(boolean enabled); + + /** + * Displays the checkbox for the item view. This does not ensure the item view will be + * checked, for that use {@link #setChecked}. + * @param checkable Whether to display the checkbox or to hide it + */ + public void setCheckable(boolean checkable); + + /** + * Checks the checkbox for the item view. If the checkbox is hidden, it will NOT be + * made visible, call {@link #setCheckable(boolean)} for that. + * @param checked Whether the checkbox should be checked + */ + public void setChecked(boolean checked); + + /** + * Sets the shortcut for the item. + * @param showShortcut Whether a shortcut should be shown(if false, the value of + * shortcutKey should be ignored). + * @param shortcutKey The shortcut key that should be shown on the ItemView. + */ + public void setShortcut(boolean showShortcut, char shortcutKey); + + /** + * Set the icon of this item view. + * @param icon The icon of this item. null to hide the icon. + */ + public void setIcon(Drawable icon); + + /** + * Whether this item view prefers displaying the condensed title rather + * than the normal title. If a condensed title is not available, the + * normal title will be used. + * + * @return Whether this item view prefers displaying the condensed + * title. + */ + public boolean prefersCondensedTitle(); + + /** + * Whether this item view shows an icon. + * + * @return Whether this item view shows an icon. + */ + public boolean showsIcon(); + } +} diff --git a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuWrapper.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuWrapper.java new file mode 100644 index 00000000..3d4dd42f --- /dev/null +++ b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuWrapper.java @@ -0,0 +1,185 @@ +package com.actionbarsherlock.internal.view.menu; + +import java.util.WeakHashMap; +import android.content.ComponentName; +import android.content.Intent; +import android.view.KeyEvent; +import com.actionbarsherlock.view.Menu; +import com.actionbarsherlock.view.MenuItem; +import com.actionbarsherlock.view.SubMenu; + +public class MenuWrapper implements Menu { + private final android.view.Menu mNativeMenu; + + private final WeakHashMap mNativeMap = + new WeakHashMap(); + + + public MenuWrapper(android.view.Menu nativeMenu) { + mNativeMenu = nativeMenu; + } + + public android.view.Menu unwrap() { + return mNativeMenu; + } + + private MenuItem addInternal(android.view.MenuItem nativeItem) { + MenuItem item = new MenuItemWrapper(nativeItem); + mNativeMap.put(nativeItem, item); + return item; + } + + @Override + public MenuItem add(CharSequence title) { + return addInternal(mNativeMenu.add(title)); + } + + @Override + public MenuItem add(int titleRes) { + return addInternal(mNativeMenu.add(titleRes)); + } + + @Override + public MenuItem add(int groupId, int itemId, int order, CharSequence title) { + return addInternal(mNativeMenu.add(groupId, itemId, order, title)); + } + + @Override + public MenuItem add(int groupId, int itemId, int order, int titleRes) { + return addInternal(mNativeMenu.add(groupId, itemId, order, titleRes)); + } + + private SubMenu addInternal(android.view.SubMenu nativeSubMenu) { + SubMenu subMenu = new SubMenuWrapper(nativeSubMenu); + android.view.MenuItem nativeItem = nativeSubMenu.getItem(); + MenuItem item = subMenu.getItem(); + mNativeMap.put(nativeItem, item); + return subMenu; + } + + @Override + public SubMenu addSubMenu(CharSequence title) { + return addInternal(mNativeMenu.addSubMenu(title)); + } + + @Override + public SubMenu addSubMenu(int titleRes) { + return addInternal(mNativeMenu.addSubMenu(titleRes)); + } + + @Override + public SubMenu addSubMenu(int groupId, int itemId, int order, CharSequence title) { + return addInternal(mNativeMenu.addSubMenu(groupId, itemId, order, title)); + } + + @Override + public SubMenu addSubMenu(int groupId, int itemId, int order, int titleRes) { + return addInternal(mNativeMenu.addSubMenu(groupId, itemId, order, titleRes)); + } + + @Override + public int addIntentOptions(int groupId, int itemId, int order, ComponentName caller, Intent[] specifics, Intent intent, int flags, MenuItem[] outSpecificItems) { + int result; + if (outSpecificItems != null) { + android.view.MenuItem[] nativeOutItems = new android.view.MenuItem[outSpecificItems.length]; + result = mNativeMenu.addIntentOptions(groupId, itemId, order, caller, specifics, intent, flags, nativeOutItems); + for (int i = 0, length = outSpecificItems.length; i < length; i++) { + outSpecificItems[i] = new MenuItemWrapper(nativeOutItems[i]); + } + } else { + result = mNativeMenu.addIntentOptions(groupId, itemId, order, caller, specifics, intent, flags, null); + } + return result; + } + + @Override + public void removeItem(int id) { + mNativeMenu.removeItem(id); + } + + @Override + public void removeGroup(int groupId) { + mNativeMenu.removeGroup(groupId); + } + + @Override + public void clear() { + mNativeMap.clear(); + mNativeMenu.clear(); + } + + @Override + public void setGroupCheckable(int group, boolean checkable, boolean exclusive) { + mNativeMenu.setGroupCheckable(group, checkable, exclusive); + } + + @Override + public void setGroupVisible(int group, boolean visible) { + mNativeMenu.setGroupVisible(group, visible); + } + + @Override + public void setGroupEnabled(int group, boolean enabled) { + mNativeMenu.setGroupEnabled(group, enabled); + } + + @Override + public boolean hasVisibleItems() { + return mNativeMenu.hasVisibleItems(); + } + + @Override + public MenuItem findItem(int id) { + android.view.MenuItem nativeItem = mNativeMenu.findItem(id); + return findItem(nativeItem); + } + + public MenuItem findItem(android.view.MenuItem nativeItem) { + if (nativeItem == null) { + return null; + } + + MenuItem wrapped = mNativeMap.get(nativeItem); + if (wrapped != null) { + return wrapped; + } + + return addInternal(nativeItem); + } + + @Override + public int size() { + return mNativeMenu.size(); + } + + @Override + public MenuItem getItem(int index) { + android.view.MenuItem nativeItem = mNativeMenu.getItem(index); + return findItem(nativeItem); + } + + @Override + public void close() { + mNativeMenu.close(); + } + + @Override + public boolean performShortcut(int keyCode, KeyEvent event, int flags) { + return mNativeMenu.performShortcut(keyCode, event, flags); + } + + @Override + public boolean isShortcutKey(int keyCode, KeyEvent event) { + return mNativeMenu.isShortcutKey(keyCode, event); + } + + @Override + public boolean performIdentifierAction(int id, int flags) { + return mNativeMenu.performIdentifierAction(id, flags); + } + + @Override + public void setQwertyMode(boolean isQwerty) { + mNativeMenu.setQwertyMode(isQwerty); + } +} diff --git a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/SubMenuBuilder.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/SubMenuBuilder.java new file mode 100644 index 00000000..6679cf38 --- /dev/null +++ b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/SubMenuBuilder.java @@ -0,0 +1,134 @@ +/* + * Copyright (C) 2006 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.internal.view.menu; + +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.view.View; + +import com.actionbarsherlock.view.Menu; +import com.actionbarsherlock.view.MenuItem; +import com.actionbarsherlock.view.SubMenu; + +/** + * The model for a sub menu, which is an extension of the menu. Most methods are proxied to + * the parent menu. + */ +public class SubMenuBuilder extends MenuBuilder implements SubMenu { + private MenuBuilder mParentMenu; + private MenuItemImpl mItem; + + public SubMenuBuilder(Context context, MenuBuilder parentMenu, MenuItemImpl item) { + super(context); + + mParentMenu = parentMenu; + mItem = item; + } + + @Override + public void setQwertyMode(boolean isQwerty) { + mParentMenu.setQwertyMode(isQwerty); + } + + @Override + public boolean isQwertyMode() { + return mParentMenu.isQwertyMode(); + } + + @Override + public void setShortcutsVisible(boolean shortcutsVisible) { + mParentMenu.setShortcutsVisible(shortcutsVisible); + } + + @Override + public boolean isShortcutsVisible() { + return mParentMenu.isShortcutsVisible(); + } + + public Menu getParentMenu() { + return mParentMenu; + } + + public MenuItem getItem() { + return mItem; + } + + @Override + public void setCallback(Callback callback) { + mParentMenu.setCallback(callback); + } + + @Override + public MenuBuilder getRootMenu() { + return mParentMenu; + } + + @Override + boolean dispatchMenuItemSelected(MenuBuilder menu, MenuItem item) { + return super.dispatchMenuItemSelected(menu, item) || + mParentMenu.dispatchMenuItemSelected(menu, item); + } + + public SubMenu setIcon(Drawable icon) { + mItem.setIcon(icon); + return this; + } + + public SubMenu setIcon(int iconRes) { + mItem.setIcon(iconRes); + return this; + } + + public SubMenu setHeaderIcon(Drawable icon) { + return (SubMenu) super.setHeaderIconInt(icon); + } + + public SubMenu setHeaderIcon(int iconRes) { + return (SubMenu) super.setHeaderIconInt(iconRes); + } + + public SubMenu setHeaderTitle(CharSequence title) { + return (SubMenu) super.setHeaderTitleInt(title); + } + + public SubMenu setHeaderTitle(int titleRes) { + return (SubMenu) super.setHeaderTitleInt(titleRes); + } + + public SubMenu setHeaderView(View view) { + return (SubMenu) super.setHeaderViewInt(view); + } + + @Override + public boolean expandItemActionView(MenuItemImpl item) { + return mParentMenu.expandItemActionView(item); + } + + @Override + public boolean collapseItemActionView(MenuItemImpl item) { + return mParentMenu.collapseItemActionView(item); + } + + @Override + public String getActionViewStatesKey() { + final int itemId = mItem != null ? mItem.getItemId() : 0; + if (itemId == 0) { + return null; + } + return super.getActionViewStatesKey() + ":" + itemId; + } +} diff --git a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/SubMenuWrapper.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/SubMenuWrapper.java new file mode 100644 index 00000000..7d307acb --- /dev/null +++ b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/SubMenuWrapper.java @@ -0,0 +1,72 @@ +package com.actionbarsherlock.internal.view.menu; + +import android.graphics.drawable.Drawable; +import android.view.View; +import com.actionbarsherlock.view.MenuItem; +import com.actionbarsherlock.view.SubMenu; + +public class SubMenuWrapper extends MenuWrapper implements SubMenu { + private final android.view.SubMenu mNativeSubMenu; + private MenuItem mItem = null; + + public SubMenuWrapper(android.view.SubMenu nativeSubMenu) { + super(nativeSubMenu); + mNativeSubMenu = nativeSubMenu; + } + + + @Override + public SubMenu setHeaderTitle(int titleRes) { + mNativeSubMenu.setHeaderTitle(titleRes); + return this; + } + + @Override + public SubMenu setHeaderTitle(CharSequence title) { + mNativeSubMenu.setHeaderTitle(title); + return this; + } + + @Override + public SubMenu setHeaderIcon(int iconRes) { + mNativeSubMenu.setHeaderIcon(iconRes); + return this; + } + + @Override + public SubMenu setHeaderIcon(Drawable icon) { + mNativeSubMenu.setHeaderIcon(icon); + return this; + } + + @Override + public SubMenu setHeaderView(View view) { + mNativeSubMenu.setHeaderView(view); + return this; + } + + @Override + public void clearHeader() { + mNativeSubMenu.clearHeader(); + } + + @Override + public SubMenu setIcon(int iconRes) { + mNativeSubMenu.setIcon(iconRes); + return this; + } + + @Override + public SubMenu setIcon(Drawable icon) { + mNativeSubMenu.setIcon(icon); + return this; + } + + @Override + public MenuItem getItem() { + if (mItem == null) { + mItem = new MenuItemWrapper(mNativeSubMenu.getItem()); + } + return mItem; + } +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-ads_1.0.6/gen/org/solovyev/android/ads/BuildConfig.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-ads_1.0.6/gen/org/solovyev/android/ads/BuildConfig.java new file mode 100644 index 00000000..2cdcc5a6 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-ads_1.0.6/gen/org/solovyev/android/ads/BuildConfig.java @@ -0,0 +1,6 @@ +/** Automatically generated file. DO NOT MODIFY */ +package org.solovyev.android.ads; + +public final class BuildConfig { + public final static boolean DEBUG = true; +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-ads_1.0.6/gen/org/solovyev/android/ads/Manifest.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-ads_1.0.6/gen/org/solovyev/android/ads/Manifest.java new file mode 100644 index 00000000..9d2710a8 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-ads_1.0.6/gen/org/solovyev/android/ads/Manifest.java @@ -0,0 +1,5 @@ +package org.solovyev.android.ads; + +/* This stub is for using by IDE only. It is NOT the Manifest class actually packed into APK */ +public final class Manifest { +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-ads_1.0.6/gen/org/solovyev/android/ads/R.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-ads_1.0.6/gen/org/solovyev/android/ads/R.java new file mode 100644 index 00000000..510a1c46 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-ads_1.0.6/gen/org/solovyev/android/ads/R.java @@ -0,0 +1,5 @@ +package org.solovyev.android.ads; + +/* This stub is for using by IDE only. It is NOT the R class actually packed into APK */ +public final class R { +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-all_1.0.6/gen/org/solovyev/android/all/BuildConfig.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-all_1.0.6/gen/org/solovyev/android/all/BuildConfig.java new file mode 100644 index 00000000..c9c249b6 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-all_1.0.6/gen/org/solovyev/android/all/BuildConfig.java @@ -0,0 +1,6 @@ +/** Automatically generated file. DO NOT MODIFY */ +package org.solovyev.android.all; + +public final class BuildConfig { + public final static boolean DEBUG = true; +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-all_1.0.6/gen/org/solovyev/android/all/Manifest.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-all_1.0.6/gen/org/solovyev/android/all/Manifest.java new file mode 100644 index 00000000..07cbbca1 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-all_1.0.6/gen/org/solovyev/android/all/Manifest.java @@ -0,0 +1,5 @@ +package org.solovyev.android.all; + +/* This stub is for using by IDE only. It is NOT the Manifest class actually packed into APK */ +public final class Manifest { +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-all_1.0.6/gen/org/solovyev/android/all/R.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-all_1.0.6/gen/org/solovyev/android/all/R.java new file mode 100644 index 00000000..7a01793d --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-all_1.0.6/gen/org/solovyev/android/all/R.java @@ -0,0 +1,5 @@ +package org.solovyev.android.all; + +/* This stub is for using by IDE only. It is NOT the R class actually packed into APK */ +public final class R { +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-billing_1.0.6/gen/net/robotmedia/billing/BuildConfig.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-billing_1.0.6/gen/net/robotmedia/billing/BuildConfig.java new file mode 100644 index 00000000..f533bda0 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-billing_1.0.6/gen/net/robotmedia/billing/BuildConfig.java @@ -0,0 +1,6 @@ +/** Automatically generated file. DO NOT MODIFY */ +package net.robotmedia.billing; + +public final class BuildConfig { + public final static boolean DEBUG = true; +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-billing_1.0.6/gen/net/robotmedia/billing/Manifest.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-billing_1.0.6/gen/net/robotmedia/billing/Manifest.java new file mode 100644 index 00000000..22103563 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-billing_1.0.6/gen/net/robotmedia/billing/Manifest.java @@ -0,0 +1,5 @@ +package net.robotmedia.billing; + +/* This stub is for using by IDE only. It is NOT the Manifest class actually packed into APK */ +public final class Manifest { +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-billing_1.0.6/gen/net/robotmedia/billing/R.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-billing_1.0.6/gen/net/robotmedia/billing/R.java new file mode 100644 index 00000000..80008e77 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-billing_1.0.6/gen/net/robotmedia/billing/R.java @@ -0,0 +1,5 @@ +package net.robotmedia.billing; + +/* This stub is for using by IDE only. It is NOT the R class actually packed into APK */ +public final class R { +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-core_1.0.6/gen/org/solovyev/android/core/BuildConfig.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-core_1.0.6/gen/org/solovyev/android/core/BuildConfig.java new file mode 100644 index 00000000..57d0e993 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-core_1.0.6/gen/org/solovyev/android/core/BuildConfig.java @@ -0,0 +1,6 @@ +/** Automatically generated file. DO NOT MODIFY */ +package org.solovyev.android.core; + +public final class BuildConfig { + public final static boolean DEBUG = true; +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-core_1.0.6/gen/org/solovyev/android/core/Manifest.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-core_1.0.6/gen/org/solovyev/android/core/Manifest.java new file mode 100644 index 00000000..bf9ac9f5 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-core_1.0.6/gen/org/solovyev/android/core/Manifest.java @@ -0,0 +1,5 @@ +package org.solovyev.android.core; + +/* This stub is for using by IDE only. It is NOT the Manifest class actually packed into APK */ +public final class Manifest { +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-core_1.0.6/gen/org/solovyev/android/core/R.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-core_1.0.6/gen/org/solovyev/android/core/R.java new file mode 100644 index 00000000..a5563bca --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-core_1.0.6/gen/org/solovyev/android/core/R.java @@ -0,0 +1,5 @@ +package org.solovyev.android.core; + +/* This stub is for using by IDE only. It is NOT the R class actually packed into APK */ +public final class R { +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-db_1.0.6/gen/org/solovyev/android/db/BuildConfig.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-db_1.0.6/gen/org/solovyev/android/db/BuildConfig.java new file mode 100644 index 00000000..3acdf88d --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-db_1.0.6/gen/org/solovyev/android/db/BuildConfig.java @@ -0,0 +1,6 @@ +/** Automatically generated file. DO NOT MODIFY */ +package org.solovyev.android.db; + +public final class BuildConfig { + public final static boolean DEBUG = true; +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-db_1.0.6/gen/org/solovyev/android/db/Manifest.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-db_1.0.6/gen/org/solovyev/android/db/Manifest.java new file mode 100644 index 00000000..dfe89650 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-db_1.0.6/gen/org/solovyev/android/db/Manifest.java @@ -0,0 +1,5 @@ +package org.solovyev.android.db; + +/* This stub is for using by IDE only. It is NOT the Manifest class actually packed into APK */ +public final class Manifest { +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-db_1.0.6/gen/org/solovyev/android/db/R.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-db_1.0.6/gen/org/solovyev/android/db/R.java new file mode 100644 index 00000000..aefcac0c --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-db_1.0.6/gen/org/solovyev/android/db/R.java @@ -0,0 +1,5 @@ +package org.solovyev.android.db; + +/* This stub is for using by IDE only. It is NOT the R class actually packed into APK */ +public final class R { +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-http_1.0.6/gen/org/solovyev/android/http/BuildConfig.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-http_1.0.6/gen/org/solovyev/android/http/BuildConfig.java new file mode 100644 index 00000000..bac2bc3b --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-http_1.0.6/gen/org/solovyev/android/http/BuildConfig.java @@ -0,0 +1,6 @@ +/** Automatically generated file. DO NOT MODIFY */ +package org.solovyev.android.http; + +public final class BuildConfig { + public final static boolean DEBUG = true; +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-http_1.0.6/gen/org/solovyev/android/http/Manifest.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-http_1.0.6/gen/org/solovyev/android/http/Manifest.java new file mode 100644 index 00000000..8f7b4624 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-http_1.0.6/gen/org/solovyev/android/http/Manifest.java @@ -0,0 +1,5 @@ +package org.solovyev.android.http; + +/* This stub is for using by IDE only. It is NOT the Manifest class actually packed into APK */ +public final class Manifest { +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-http_1.0.6/gen/org/solovyev/android/http/R.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-http_1.0.6/gen/org/solovyev/android/http/R.java new file mode 100644 index 00000000..8f01b351 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-http_1.0.6/gen/org/solovyev/android/http/R.java @@ -0,0 +1,5 @@ +package org.solovyev.android.http; + +/* This stub is for using by IDE only. It is NOT the R class actually packed into APK */ +public final class R { +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-keyboard_1.0.6/gen/org/solovyev/android/keyboard/BuildConfig.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-keyboard_1.0.6/gen/org/solovyev/android/keyboard/BuildConfig.java new file mode 100644 index 00000000..8d7e42e5 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-keyboard_1.0.6/gen/org/solovyev/android/keyboard/BuildConfig.java @@ -0,0 +1,6 @@ +/** Automatically generated file. DO NOT MODIFY */ +package org.solovyev.android.keyboard; + +public final class BuildConfig { + public final static boolean DEBUG = true; +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-keyboard_1.0.6/gen/org/solovyev/android/keyboard/Manifest.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-keyboard_1.0.6/gen/org/solovyev/android/keyboard/Manifest.java new file mode 100644 index 00000000..588f9a0a --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-keyboard_1.0.6/gen/org/solovyev/android/keyboard/Manifest.java @@ -0,0 +1,5 @@ +package org.solovyev.android.keyboard; + +/* This stub is for using by IDE only. It is NOT the Manifest class actually packed into APK */ +public final class Manifest { +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-keyboard_1.0.6/gen/org/solovyev/android/keyboard/R.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-keyboard_1.0.6/gen/org/solovyev/android/keyboard/R.java new file mode 100644 index 00000000..4823f3eb --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-keyboard_1.0.6/gen/org/solovyev/android/keyboard/R.java @@ -0,0 +1,5 @@ +package org.solovyev.android.keyboard; + +/* This stub is for using by IDE only. It is NOT the R class actually packed into APK */ +public final class R { +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-list_1.0.6/gen/org/solovyev/android/list/BuildConfig.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-list_1.0.6/gen/org/solovyev/android/list/BuildConfig.java new file mode 100644 index 00000000..f7f63a43 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-list_1.0.6/gen/org/solovyev/android/list/BuildConfig.java @@ -0,0 +1,6 @@ +/** Automatically generated file. DO NOT MODIFY */ +package org.solovyev.android.list; + +public final class BuildConfig { + public final static boolean DEBUG = true; +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-list_1.0.6/gen/org/solovyev/android/list/Manifest.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-list_1.0.6/gen/org/solovyev/android/list/Manifest.java new file mode 100644 index 00000000..b6bf0da3 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-list_1.0.6/gen/org/solovyev/android/list/Manifest.java @@ -0,0 +1,5 @@ +package org.solovyev.android.list; + +/* This stub is for using by IDE only. It is NOT the Manifest class actually packed into APK */ +public final class Manifest { +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-list_1.0.6/gen/org/solovyev/android/list/R.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-list_1.0.6/gen/org/solovyev/android/list/R.java new file mode 100644 index 00000000..e23eb9d0 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-list_1.0.6/gen/org/solovyev/android/list/R.java @@ -0,0 +1,5 @@ +package org.solovyev.android.list; + +/* This stub is for using by IDE only. It is NOT the R class actually packed into APK */ +public final class R { +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-menu_1.0.6/gen/org/solovyev/android/menu/BuildConfig.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-menu_1.0.6/gen/org/solovyev/android/menu/BuildConfig.java new file mode 100644 index 00000000..506cda16 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-menu_1.0.6/gen/org/solovyev/android/menu/BuildConfig.java @@ -0,0 +1,6 @@ +/** Automatically generated file. DO NOT MODIFY */ +package org.solovyev.android.menu; + +public final class BuildConfig { + public final static boolean DEBUG = true; +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-menu_1.0.6/gen/org/solovyev/android/menu/Manifest.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-menu_1.0.6/gen/org/solovyev/android/menu/Manifest.java new file mode 100644 index 00000000..051d5f1b --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-menu_1.0.6/gen/org/solovyev/android/menu/Manifest.java @@ -0,0 +1,5 @@ +package org.solovyev.android.menu; + +/* This stub is for using by IDE only. It is NOT the Manifest class actually packed into APK */ +public final class Manifest { +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-menu_1.0.6/gen/org/solovyev/android/menu/R.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-menu_1.0.6/gen/org/solovyev/android/menu/R.java new file mode 100644 index 00000000..02fbd211 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-menu_1.0.6/gen/org/solovyev/android/menu/R.java @@ -0,0 +1,5 @@ +package org.solovyev.android.menu; + +/* This stub is for using by IDE only. It is NOT the R class actually packed into APK */ +public final class R { +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-other_1.0.6/gen/org/solovyev/android/other/BuildConfig.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-other_1.0.6/gen/org/solovyev/android/other/BuildConfig.java new file mode 100644 index 00000000..e3bddf1c --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-other_1.0.6/gen/org/solovyev/android/other/BuildConfig.java @@ -0,0 +1,6 @@ +/** Automatically generated file. DO NOT MODIFY */ +package org.solovyev.android.other; + +public final class BuildConfig { + public final static boolean DEBUG = true; +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-other_1.0.6/gen/org/solovyev/android/other/Manifest.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-other_1.0.6/gen/org/solovyev/android/other/Manifest.java new file mode 100644 index 00000000..e8d38fb1 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-other_1.0.6/gen/org/solovyev/android/other/Manifest.java @@ -0,0 +1,5 @@ +package org.solovyev.android.other; + +/* This stub is for using by IDE only. It is NOT the Manifest class actually packed into APK */ +public final class Manifest { +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-other_1.0.6/gen/org/solovyev/android/other/R.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-other_1.0.6/gen/org/solovyev/android/other/R.java new file mode 100644 index 00000000..d45d2276 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-other_1.0.6/gen/org/solovyev/android/other/R.java @@ -0,0 +1,5 @@ +package org.solovyev.android.other; + +/* This stub is for using by IDE only. It is NOT the R class actually packed into APK */ +public final class R { +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-preferences_1.0.6/gen/org/solovyev/android/prefs/BuildConfig.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-preferences_1.0.6/gen/org/solovyev/android/prefs/BuildConfig.java new file mode 100644 index 00000000..90f5ceeb --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-preferences_1.0.6/gen/org/solovyev/android/prefs/BuildConfig.java @@ -0,0 +1,6 @@ +/** Automatically generated file. DO NOT MODIFY */ +package org.solovyev.android.prefs; + +public final class BuildConfig { + public final static boolean DEBUG = true; +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-preferences_1.0.6/gen/org/solovyev/android/prefs/Manifest.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-preferences_1.0.6/gen/org/solovyev/android/prefs/Manifest.java new file mode 100644 index 00000000..8d450965 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-preferences_1.0.6/gen/org/solovyev/android/prefs/Manifest.java @@ -0,0 +1,5 @@ +package org.solovyev.android.prefs; + +/* This stub is for using by IDE only. It is NOT the Manifest class actually packed into APK */ +public final class Manifest { +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-preferences_1.0.6/gen/org/solovyev/android/prefs/R.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-preferences_1.0.6/gen/org/solovyev/android/prefs/R.java new file mode 100644 index 00000000..a20f3eec --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-preferences_1.0.6/gen/org/solovyev/android/prefs/R.java @@ -0,0 +1,5 @@ +package org.solovyev.android.prefs; + +/* This stub is for using by IDE only. It is NOT the R class actually packed into APK */ +public final class R { +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-sherlock_1.0.6/gen/org/solovyev/android/sherlock/BuildConfig.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-sherlock_1.0.6/gen/org/solovyev/android/sherlock/BuildConfig.java new file mode 100644 index 00000000..339e5e3a --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-sherlock_1.0.6/gen/org/solovyev/android/sherlock/BuildConfig.java @@ -0,0 +1,6 @@ +/** Automatically generated file. DO NOT MODIFY */ +package org.solovyev.android.sherlock; + +public final class BuildConfig { + public final static boolean DEBUG = true; +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-sherlock_1.0.6/gen/org/solovyev/android/sherlock/Manifest.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-sherlock_1.0.6/gen/org/solovyev/android/sherlock/Manifest.java new file mode 100644 index 00000000..370c9059 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-sherlock_1.0.6/gen/org/solovyev/android/sherlock/Manifest.java @@ -0,0 +1,5 @@ +package org.solovyev.android.sherlock; + +/* This stub is for using by IDE only. It is NOT the Manifest class actually packed into APK */ +public final class Manifest { +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-sherlock_1.0.6/gen/org/solovyev/android/sherlock/R.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-sherlock_1.0.6/gen/org/solovyev/android/sherlock/R.java new file mode 100644 index 00000000..b8722c19 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-sherlock_1.0.6/gen/org/solovyev/android/sherlock/R.java @@ -0,0 +1,5 @@ +package org.solovyev.android.sherlock; + +/* This stub is for using by IDE only. It is NOT the R class actually packed into APK */ +public final class R { +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/gen/org/solovyev/android/view/BuildConfig.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/gen/org/solovyev/android/view/BuildConfig.java new file mode 100644 index 00000000..4cc1a99f --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/gen/org/solovyev/android/view/BuildConfig.java @@ -0,0 +1,6 @@ +/** Automatically generated file. DO NOT MODIFY */ +package org.solovyev.android.view; + +public final class BuildConfig { + public final static boolean DEBUG = true; +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/gen/org/solovyev/android/view/Manifest.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/gen/org/solovyev/android/view/Manifest.java new file mode 100644 index 00000000..ba4012ab --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/gen/org/solovyev/android/view/Manifest.java @@ -0,0 +1,5 @@ +package org.solovyev.android.view; + +/* This stub is for using by IDE only. It is NOT the Manifest class actually packed into APK */ +public final class Manifest { +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/gen/org/solovyev/android/view/R.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/gen/org/solovyev/android/view/R.java new file mode 100644 index 00000000..820d2111 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/gen/org/solovyev/android/view/R.java @@ -0,0 +1,5 @@ +package org.solovyev.android.view; + +/* This stub is for using by IDE only. It is NOT the R class actually packed into APK */ +public final class R { +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/LastTabSaver.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/LastTabSaver.java new file mode 100644 index 00000000..01b48941 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/LastTabSaver.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2009-2012. Created by serso aka se.solovyev. + * For more information, please, contact se.solovyev@gmail.com + * or visit http://se.solovyev.org + */ + +package org.solovyev.android; + +import android.app.TabActivity; +import android.preference.PreferenceManager; +import android.widget.TabHost; +import org.jetbrains.annotations.NotNull; +import org.solovyev.android.prefs.StringPreference; + +/** + * User: serso + * Date: 1/9/12 + * Time: 6:17 PM + */ + +/** + * This class saves the last opened tab in the tabHost to the SharedPreferences in order to reopen it after closing + * The tab is defined by it's tab id and tab activity where it is hold => you can use the same tab ids in different tab activities + */ +public class LastTabSaver implements TabHost.OnTabChangeListener { + + // prefix of preference's key + private static final String LAST_OPENED_TAB_P_KEY = "last_opened_tab_"; + + // preference object + @NotNull + private final StringPreference preference; + + // activity that holds tab host + @NotNull + private final TabActivity tabActivity; + + /** + * Constructor applies saved preference value on tabHost returned by android.app.TabActivity#getTabHost() method + * and registers as onTabChangeListener + * + * @param tabActivity tab activity + * @param defaultTabId default tab (if no preference value is not defined) + */ + public LastTabSaver(@NotNull TabActivity tabActivity, @NotNull String defaultTabId) { + this.tabActivity = tabActivity; + this.preference = StringPreference.newInstance(getPreferenceKey(), defaultTabId); + + final TabHost tabHost = tabActivity.getTabHost(); + tabHost.setCurrentTabByTag(this.getLastOpenedTabId()); + tabHost.setOnTabChangedListener(this); + } + + /** + * Method must be invoked on android.app.Activity#onDestroy() method of tab activity + */ + public void destroy() { + final TabHost tabHost = tabActivity.getTabHost(); + tabHost.setOnTabChangedListener(null); + } + + @Override + public void onTabChanged(String tabId) { + preference.putPreference(PreferenceManager.getDefaultSharedPreferences(tabActivity), tabId); + } + + @NotNull + public String getLastOpenedTabId() { + return preference.getPreference(PreferenceManager.getDefaultSharedPreferences(tabActivity)); + } + + @NotNull + private String getPreferenceKey() { + return LAST_OPENED_TAB_P_KEY + tabActivity.getClass().getName(); + } +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/history/HistoryDragProcessor.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/history/HistoryDragProcessor.java new file mode 100644 index 00000000..d9a49fd5 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/history/HistoryDragProcessor.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2009-2011. Created by serso aka se.solovyev. + * For more information, please, contact se.solovyev@gmail.com + */ + +package org.solovyev.android.history; + +import android.util.Log; +import android.view.MotionEvent; +import org.jetbrains.annotations.NotNull; +import org.solovyev.android.view.drag.DragButton; +import org.solovyev.android.view.drag.DragDirection; +import org.solovyev.android.view.drag.SimpleOnDragListener; +import org.solovyev.common.history.HistoryAction; +import org.solovyev.common.history.HistoryControl; +import org.solovyev.common.math.Point2d; + +/** +* User: serso +* Date: 9/16/11 +* Time: 11:36 PM +*/ +public class HistoryDragProcessor implements SimpleOnDragListener.DragProcessor { + + @NotNull + private final HistoryControl historyControl; + + public HistoryDragProcessor(@NotNull HistoryControl historyControl) { + this.historyControl = historyControl; + } + + @Override + public boolean processDragEvent(@NotNull DragDirection dragDirection, @NotNull DragButton dragButton, @NotNull Point2d startPoint2d, @NotNull MotionEvent motionEvent) { + boolean result = false; + + Log.d(String.valueOf(dragButton.getId()), "History on drag event start: " + dragDirection); + + final HistoryAction historyAction; + if ( dragDirection == DragDirection.up ) { + historyAction = HistoryAction.undo; + } else if ( dragDirection == DragDirection.down ) { + historyAction = HistoryAction.redo; + } else { + historyAction = null; + } + + if (historyAction != null) { + result = true; + historyControl.doHistoryAction(historyAction); + } + + return result; + } +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/AbstractEnumPickerDialogPreference.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/AbstractEnumPickerDialogPreference.java new file mode 100644 index 00000000..3ed7a8ed --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/AbstractEnumPickerDialogPreference.java @@ -0,0 +1,39 @@ +package org.solovyev.android.prefs; + +import android.content.Context; +import android.util.AttributeSet; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.solovyev.android.Labeled; +import org.solovyev.android.LabeledFormatter; +import org.solovyev.android.view.ListRange; +import org.solovyev.android.view.Picker; +import org.solovyev.common.text.EnumMapper; + +import java.util.Arrays; + +/** + * User: serso + * Date: 8/10/12 + * Time: 2:02 AM + */ +public abstract class AbstractEnumPickerDialogPreference extends AbstractPickerDialogPreference { + + @NotNull + private final Class enumClass; + + protected AbstractEnumPickerDialogPreference(Context context, + AttributeSet attrs, + @Nullable String defaultStringValue, + boolean needValueText, + @NotNull Class enumClass) { + super(context, attrs, defaultStringValue, needValueText, new EnumMapper(enumClass)); + this.enumClass = enumClass; + } + + @NotNull + @Override + protected Picker.Range createRange(@NotNull T selected) { + return new ListRange(Arrays.asList(enumClass.getEnumConstants()), selected, new LabeledFormatter(getContext())); + } +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/AbstractPickerDialogPreference.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/AbstractPickerDialogPreference.java new file mode 100644 index 00000000..66ef429e --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/AbstractPickerDialogPreference.java @@ -0,0 +1,62 @@ +package org.solovyev.android.prefs; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.Gravity; +import android.view.View; +import android.widget.LinearLayout; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.solovyev.android.view.Picker; +import org.solovyev.common.text.Mapper; + +/** + * User: serso + * Date: 8/10/12 + * Time: 1:58 AM + */ +public abstract class AbstractPickerDialogPreference extends AbstractDialogPreference implements Picker.OnChangedListener { + + + protected AbstractPickerDialogPreference(Context context, + AttributeSet attrs, + @Nullable String defaultStringValue, + boolean needValueText, + @NotNull Mapper mapper) { + super(context, attrs, defaultStringValue, needValueText, mapper); + } + + @Override + protected LinearLayout.LayoutParams getParams() { + final LinearLayout.LayoutParams result = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); + + result.gravity = Gravity.CENTER; + + return result; + } + + @NotNull + @Override + protected View createPreferenceView(@NotNull Context context) { + final Picker result = new Picker(context); + + result.setOnChangeListener(this); + + return result; + } + + @Override + protected void initPreferenceView(@NotNull View v, @Nullable T value) { + if (value != null) { + ((Picker) v).setRange(createRange(value)); + } + } + + @NotNull + protected abstract Picker.Range createRange(@NotNull T selected); + + @Override + public void onChanged(@NotNull Picker picker, @NotNull T o) { + persistValue(o); + } +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/DoublePickerDialogPreference.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/DoublePickerDialogPreference.java new file mode 100644 index 00000000..f8c5ee8d --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/DoublePickerDialogPreference.java @@ -0,0 +1,67 @@ +package org.solovyev.android.prefs; + +import android.content.Context; +import android.util.AttributeSet; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.solovyev.android.view.DoubleRange; +import org.solovyev.android.view.NumberRange; +import org.solovyev.common.interval.Interval; +import org.solovyev.common.text.Formatter; +import org.solovyev.common.text.NumberIntervalMapper; + +import java.text.DecimalFormat; + +/** + * User: serso + * Date: 8/10/12 + * Time: 1:02 AM + */ +public class DoublePickerDialogPreference extends NumberPickerDialogPreference { + + @NotNull + private static final Formatter simpleFormatter = new DoubleFormatter(2); + + @NotNull + @Override + protected Double getDefaultStep() { + return 1d; + } + + @NotNull + @Override + protected NumberRange createRange(@NotNull Interval boundaries, @NotNull Double step, @NotNull Double selected) { + return DoubleRange.newInstance(boundaries.getLeftLimit(), boundaries.getRightLimit(), step, selected, simpleFormatter); + } + + public DoublePickerDialogPreference(Context context, AttributeSet attrs) { + super(context, attrs, new NumberIntervalMapper(Double.class)); + } + + private static class DoubleFormatter implements Formatter { + + @NotNull + private final DecimalFormat df; + + private DoubleFormatter(int numberOfDecimalDigits) { + final StringBuilder sb = new StringBuilder("#.#"); + for (int i = 1; i < numberOfDecimalDigits; i++) { + sb.append("#"); + } + + this.df = new DecimalFormat(sb.toString()); + } + + @Override + public String formatValue(@Nullable Double value) throws IllegalArgumentException { + + if (value == null) { + return "null"; + } else { + synchronized (df) { + return df.format(value); + } + } + } + } +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/FloatRangeSeekBarPreference.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/FloatRangeSeekBarPreference.java new file mode 100644 index 00000000..cfb11a47 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/FloatRangeSeekBarPreference.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2009-2011. Created by serso aka se.solovyev. + * For more information, please, contact se.solovyev@gmail.com + * or visit http://se.solovyev.org + */ + +package org.solovyev.android.prefs; + +import android.content.Context; +import android.util.AttributeSet; +import org.jetbrains.annotations.NotNull; +import org.solovyev.common.text.NumberIntervalMapper; + +/** + * User: serso + * Date: 9/21/11 + * Time: 11:41 PM + */ +public class FloatRangeSeekBarPreference extends RangeSeekBarPreference { + + public FloatRangeSeekBarPreference(@NotNull Context context, AttributeSet attrs) { + super(context, attrs, new NumberIntervalMapper(Float.class)); + } + + @NotNull + @Override + protected Float getDefaultStep() { + return 1f; + } + + @NotNull + @Override + protected Float add(@NotNull Float l, @NotNull Float r) { + return l + r; + } +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/IntegerPickerDialogPreference.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/IntegerPickerDialogPreference.java new file mode 100644 index 00000000..d7ba7f8e --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/IntegerPickerDialogPreference.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2009-2011. Created by serso aka se.solovyev. + * For more information, please, contact se.solovyev@gmail.com + * or visit http://se.solovyev.org + */ + +package org.solovyev.android.prefs; + +import android.content.Context; +import android.util.AttributeSet; +import org.jetbrains.annotations.NotNull; +import org.solovyev.android.view.IntegerRange; +import org.solovyev.android.view.NumberRange; +import org.solovyev.common.interval.Interval; +import org.solovyev.common.text.NumberIntervalMapper; + +/** + * User: serso + * Date: 9/26/11 + * Time: 10:31 PM + */ +public class IntegerPickerDialogPreference extends NumberPickerDialogPreference{ + + public IntegerPickerDialogPreference(Context context, AttributeSet attrs) { + super(context, attrs, new NumberIntervalMapper(Integer.class)); + } + + @NotNull + @Override + protected Integer getDefaultStep() { + return 1; + } + + @NotNull + @Override + protected NumberRange createRange(@NotNull Interval boundaries, @NotNull Integer step, @NotNull Integer selected) { + return IntegerRange.newInstance(boundaries.getLeftLimit(), boundaries.getRightLimit(), step, selected); + } +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/IntegerRangeSeekBarPreference.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/IntegerRangeSeekBarPreference.java new file mode 100644 index 00000000..9f948018 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/IntegerRangeSeekBarPreference.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2009-2011. Created by serso aka se.solovyev. + * For more information, please, contact se.solovyev@gmail.com + * or visit http://se.solovyev.org + */ + +package org.solovyev.android.prefs; + +import android.content.Context; +import android.util.AttributeSet; +import org.jetbrains.annotations.NotNull; +import org.solovyev.common.text.NumberIntervalMapper; + +/** + * User: serso + * Date: 9/19/11 + * Time: 10:04 PM + */ +public class IntegerRangeSeekBarPreference extends RangeSeekBarPreference { + + public IntegerRangeSeekBarPreference(@NotNull Context context, AttributeSet attrs) { + super(context, attrs, new NumberIntervalMapper(Integer.class)); + } + + @NotNull + @Override + protected Integer getDefaultStep() { + return 1; + } + + @NotNull + @Override + protected Integer add(@NotNull Integer l, @NotNull Integer r) { + return l + r; + } +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/MultiSelectListPreference.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/MultiSelectListPreference.java new file mode 100644 index 00000000..3180fdda --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/MultiSelectListPreference.java @@ -0,0 +1,196 @@ +package org.solovyev.android.prefs; + + +import android.app.AlertDialog.Builder; +import android.content.Context; +import android.content.DialogInterface; +import android.content.res.TypedArray; +import android.preference.ListPreference; +import android.preference.Preference; +import android.util.AttributeSet; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.solovyev.android.view.R; +import org.solovyev.common.text.CollectionTransformations; +import org.solovyev.common.text.StringMapper; +import org.solovyev.common.text.StringUtils; + +import java.util.ArrayList; +import java.util.List; + +/** + * A {@link Preference} that displays a list of entries as + * a dialog and allows multiple selections + *

+ * This preference will store a string into the SharedPreferences. This string will be the values selected + * from the {@link #setEntryValues(CharSequence[])} array. + *

+ */ +public class MultiSelectListPreference extends ListPreference { + + @NotNull + private static final String DEFAULT_SEPARATOR = ";"; + + @NotNull + private final org.solovyev.common.text.Mapper> mapper; + + private boolean[] checkedIndices; + + /* + ********************************************************************** + * + * CONSTRUCTORS + * + ********************************************************************** + */ + + public MultiSelectListPreference(Context context) { + this(context, null); + } + + public MultiSelectListPreference(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + + String separator = DEFAULT_SEPARATOR; + + final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MultiSelectListPreference); + for (int i = 0; i < a.getIndexCount(); i++) { + int attr = a.getIndex(i); + + final String attrValue = a.getString(attr); + + if (!StringUtils.isEmpty(attrValue)) { + switch (attr) { + case R.styleable.MultiSelectListPreference_separator: + separator = attrValue; + break; + } + } + } + + this.mapper = new Mapper(separator); + + this.checkedIndices = new boolean[getEntries().length]; + } + + @Override + public void setEntries(@NotNull CharSequence[] entries) { + super.setEntries(entries); + + checkedIndices = new boolean[entries.length]; + } + + @Override + protected void onPrepareDialogBuilder(@NotNull Builder builder) { + final CharSequence[] entries = getEntries(); + final CharSequence[] entryValues = getEntryValues(); + + if (entries == null || entryValues == null || entries.length != entryValues.length) { + throw new IllegalStateException("ListPreference requires an entries array and an entryValues array which are both the same length"); + } + + restoreCheckedEntries(); + + builder.setMultiChoiceItems(entries, checkedIndices, + new DialogInterface.OnMultiChoiceClickListener() { + public void onClick(DialogInterface dialog, int which, boolean value) { + checkedIndices[which] = value; + } + }); + } + + + private void restoreCheckedEntries() { + final CharSequence[] entryValues = getEntryValues(); + + final List values = mapper.parseValue(getValue()); + if (values != null) { + for (String value : values) { + for (int i = 0; i < entryValues.length; i++) { + final CharSequence entry = entryValues[i]; + if (entry.equals(value)) { + checkedIndices[i] = true; + break; + } + } + } + } + } + + @Override + protected void onDialogClosed(boolean positiveResult) { + final CharSequence[] entryValues = getEntryValues(); + if (positiveResult && entryValues != null) { + + final List checkedValues = new ArrayList(); + for (int i = 0; i < entryValues.length; i++) { + if (checkedIndices[i]) { + checkedValues.add(entryValues[i].toString()); + } + } + + + final String value = mapper.formatValue(checkedValues); + if (callChangeListener(value)) { + setValue(value); + } + } + } + + public static class Mapper implements org.solovyev.common.text.Mapper> { + + @NotNull + private final String separator; + + public Mapper(@NotNull String separator) { + this.separator = separator; + } + + @Override + public String formatValue(@Nullable List value) throws IllegalArgumentException { + return CollectionTransformations.formatValue(value, separator, StringMapper.getInstance()); + } + + @Override + public List parseValue(@Nullable String value) throws IllegalArgumentException { + return CollectionTransformations.split(value, separator, StringMapper.getInstance()); + } + } + + @NotNull + public static org.solovyev.common.text.Mapper> newListMapper(@NotNull org.solovyev.common.text.Mapper nestedMapper) { + return new ListMapper(DEFAULT_SEPARATOR, nestedMapper); + } + + @NotNull + public static org.solovyev.common.text.Mapper> newListMapper(@NotNull org.solovyev.common.text.Mapper nestedMapper, + @NotNull String separator) { + return new ListMapper(separator, nestedMapper); + } + + + private static class ListMapper implements org.solovyev.common.text.Mapper> { + + @NotNull + private final String separator; + + @NotNull + private final org.solovyev.common.text.Mapper nestedMapper; + + public ListMapper(@NotNull String separator, @NotNull org.solovyev.common.text.Mapper nestedMapper) { + this.separator = separator; + this.nestedMapper = nestedMapper; + } + + @Override + public String formatValue(@Nullable List value) throws IllegalArgumentException { + return CollectionTransformations.formatValue(value, separator, nestedMapper); + } + + @Override + public List parseValue(@Nullable String value) throws IllegalArgumentException { + return CollectionTransformations.split(value, separator, nestedMapper); + } + } +} + diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/NumberPickerDialogPreference.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/NumberPickerDialogPreference.java new file mode 100644 index 00000000..91721331 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/NumberPickerDialogPreference.java @@ -0,0 +1,52 @@ +package org.solovyev.android.prefs; + +import android.content.Context; +import android.util.AttributeSet; +import org.jetbrains.annotations.NotNull; +import org.solovyev.android.view.NumberRange; +import org.solovyev.android.view.Picker; +import org.solovyev.common.interval.Interval; +import org.solovyev.common.text.NumberIntervalMapper; + +/** + * User: serso + * Date: 8/10/12 + * Time: 12:57 AM + */ +public abstract class NumberPickerDialogPreference> extends AbstractPickerDialogPreference { + + @NotNull + private final Interval boundaries; + + @NotNull + private final N step; + + protected NumberPickerDialogPreference(Context context, + AttributeSet attrs, + @NotNull NumberIntervalMapper mapper) { + super(context, attrs, null, false, mapper.getMapper()); + + //noinspection ConstantConditions + boundaries = mapper.parseValue(attrs.getAttributeValue(AbstractDialogPreference.localNameSpace, "boundaries")); + + final String stringStep = attrs.getAttributeValue(AbstractDialogPreference.localNameSpace, "step"); + if (stringStep == null) { + step = getDefaultStep(); + } else { + step = mapper.getMapper().parseValue(stringStep); + } + } + + @NotNull + protected abstract N getDefaultStep(); + + @NotNull + @Override + protected Picker.Range createRange(@NotNull N selected) { + return createRange(boundaries, step, selected); + } + + @NotNull + protected abstract NumberRange createRange(@NotNull Interval boundaries, @NotNull N step, @NotNull N selected); + +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/RangeSeekBarPreference.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/RangeSeekBarPreference.java new file mode 100644 index 00000000..0abc8de4 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/RangeSeekBarPreference.java @@ -0,0 +1,92 @@ +package org.solovyev.android.prefs; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; +import android.widget.LinearLayout; +import org.jetbrains.annotations.NotNull; +import org.solovyev.android.view.AbstractRangeSeekBar; +import org.solovyev.android.view.NumberRangeSeekBar; +import org.solovyev.common.interval.Interval; +import org.solovyev.common.interval.IntervalImpl; +import org.solovyev.common.text.NumberIntervalMapper; + +/** + * User: serso + * Date: 9/19/11 + * Time: 12:27 PM + */ +public abstract class RangeSeekBarPreference> extends AbstractDialogPreference> implements AbstractRangeSeekBar.OnRangeSeekBarChangeListener { + + @NotNull + private final Interval boundaries; + + @NotNull + private final T step; + + public RangeSeekBarPreference(@NotNull Context context, AttributeSet attrs, @NotNull NumberIntervalMapper mapper) { + super(context, attrs, null, true, mapper); + + //noinspection ConstantConditions + boundaries = mapper.parseValue(attrs.getAttributeValue(AbstractDialogPreference.localNameSpace, "boundaries")); + + final String stepValue = attrs.getAttributeValue(AbstractDialogPreference.localNameSpace, "step"); + if ( stepValue == null ) { + step = getDefaultStep(); + } else { + step = mapper.getMapper().parseValue(stepValue); + } + + } + + @NotNull + protected abstract T getDefaultStep(); + + @NotNull + protected View createPreferenceView(@NotNull Context context) { + int count = 0; + for ( T t = boundaries.getLeftLimit(); t.compareTo(boundaries.getRightLimit()) <= 0; t = add(t, step) ) { + count += 1; + } + final NumberRangeSeekBar result = new NumberRangeSeekBar(boundaries, count, context); + + result.setNotifyWhileDragging(true); + result.setOnRangeSeekBarChangeListener(this); + + return result; + } + + @NotNull + protected abstract T add(@NotNull T l, @NotNull T r); + + @Override + protected LinearLayout.LayoutParams getParams() { + return null; + } + + @Override + protected void initPreferenceView(@NotNull View v, Interval value) { + if (value != null) { + ((NumberRangeSeekBar) v).setSelectedMinValue(value.getLeftLimit()); + ((NumberRangeSeekBar) v).setSelectedMaxValue(value.getRightLimit()); + setValueText(value); + } + } + + @Override + public void rangeSeekBarValuesChanged(T minValue, T maxValue, boolean changeComplete) { + final Interval interval = IntervalImpl.newClosed(minValue, maxValue); + + if (changeComplete) { + persistValue(interval); + } + + setValueText(interval); + } + + private void setValueText(@NotNull Interval interval) { + final String t = String.valueOf(interval); + final String valueText = getValueText(); + updateValueText(valueText == null ? t : t.concat(valueText)); + } +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/AbstractAlertDialogBuilder.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/AbstractAlertDialogBuilder.java new file mode 100644 index 00000000..63d34a29 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/AbstractAlertDialogBuilder.java @@ -0,0 +1,25 @@ +package org.solovyev.android.view; + +import android.app.AlertDialog; +import android.content.Context; +import org.jetbrains.annotations.NotNull; + +/** + * User: serso + * Date: 8/2/12 + * Time: 4:25 PM + */ +public abstract class AbstractAlertDialogBuilder implements DialogBuilder { + + @NotNull + private Context context; + + protected AbstractAlertDialogBuilder(@NotNull Context context) { + this.context = context; + } + + @NotNull + protected Context getContext() { + return context; + } +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/AbstractRangeSeekBar.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/AbstractRangeSeekBar.java new file mode 100644 index 00000000..17871f26 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/AbstractRangeSeekBar.java @@ -0,0 +1,421 @@ +package org.solovyev.android.view; + +/** + * User: serso + * Date: 9/19/11 + * Time: 3:30 PM + */ + +import android.content.Context; +import android.graphics.*; +import android.graphics.Paint.Style; +import android.view.MotionEvent; +import android.widget.ImageView; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.solovyev.common.Converter; +import org.solovyev.common.math.LinearNormalizer; +import org.solovyev.common.math.Normalizer; + +/** + * Widget that lets users select a minimum and maximum value on a given numerical range. + * The range value types can be one of Long, Double, Integer, Float, Short, Byte or BigDecimal. + * + * @param The Number type of the range values. One of Long, Double, Integer, Float, Short, Byte or BigDecimal. + * @author Stephan Tittel (stephan.tittel@kom.tu-darmstadt.de) + */ +public abstract class AbstractRangeSeekBar extends ImageView { + + @NotNull + private final Paint paint = new Paint(); + + @NotNull + private final ThumbContainer tc; + + @NotNull + private final Converter toDoubleConverter; + + @NotNull + private final Converter toTConverter; + + @NotNull + private final T minValue, maxValue; + + @NotNull + private final Normalizer fromValueNormalizer; + + @NotNull + private final Normalizer fromScreenNormalizer; + + private double normalizedMinValue = 0d; + + private double normalizedMaxValue = 1d; + + private Thumb pressedThumb = null; + + private boolean notifyWhileDragging = false; + + + @Nullable + private OnRangeSeekBarChangeListener listener; + + /** + * Creates a new RangeSeekBar. + * + * @param minValue The minimum value of the selectable range. + * @param maxValue The maximum value of the selectable range. + * @param steps number of steps to be used in range seek bar + * @param context parent context + * @throws IllegalArgumentException Will be thrown if min/max value types are not one of Long, Double, Integer, Float, Short, Byte or BigDecimal. + */ + public AbstractRangeSeekBar(@NotNull T minValue, @NotNull T maxValue, @Nullable Integer steps, Context context) throws IllegalArgumentException { + super(context); + + this.minValue = minValue; + this.maxValue = maxValue; + + this.toDoubleConverter = getToDoubleConverter(); + this.toTConverter = getToTConverter(); + + fromValueNormalizer = new LinearNormalizer(toDoubleConverter.convert(minValue), toDoubleConverter.convert(maxValue)); + + tc = new ThumbContainer(); + + fromScreenNormalizer = new Normalizer() { + @Override + public double normalize(double value) { + int width = getWidth(); + if (width <= 2 * tc.padding) { + // prevent division by zero, simply return 0. + return 0d; + } else { + double result = (value - tc.padding) / (width - 2 * tc.padding); + return Math.min(1d, Math.max(0d, result)); + } + } + + @Override + public double denormalize(double value) { + return (float) (tc.padding + value * (getWidth() - 2 * tc.padding)); + } + }; + } + + @NotNull + protected abstract Converter getToTConverter(); + + @NotNull + protected abstract Converter getToDoubleConverter(); + + public boolean isNotifyWhileDragging() { + return notifyWhileDragging; + } + + /** + * Should the widget notify the listener callback while the user is still dragging a thumb? Default is false. + * + * @param flag + */ + public void setNotifyWhileDragging(boolean flag) { + this.notifyWhileDragging = flag; + } + + /** + * Returns the absolute minimum value of the range that has been set at construction time. + * + * @return The absolute minimum value of the range. + */ + @NotNull + public T getMinValue() { + return minValue; + } + + /** + * Returns the absolute maximum value of the range that has been set at construction time. + * + * @return The absolute maximum value of the range. + */ + @NotNull + public T getMaxValue() { + return maxValue; + } + + /** + * Returns the currently selected min value. + * + * @return The currently selected min value. + */ + public T getSelectedMinValue() { + return denormalizeValue(normalizedMinValue); + } + + /** + * Sets the currently selected minimum value. The widget will be invalidated and redrawn. + * + * @param value The Number value to set the minimum value to. Will be clamped to given absolute minimum/maximum range. + */ + public void setSelectedMinValue(@NotNull T value) { + setNormalizedMinValue(normalizeValue(value)); + } + + /** + * Returns the currently selected max value. + * + * @return The currently selected max value. + */ + public T getSelectedMaxValue() { + return denormalizeValue(normalizedMaxValue); + } + + /** + * Sets the currently selected maximum value. The widget will be invalidated and redrawn. + * + * @param value The Number value to set the maximum value to. Will be clamped to given absolute minimum/maximum range. + */ + public void setSelectedMaxValue(@NotNull T value) { + setNormalizedMaxValue(normalizeValue(value)); + } + + /** + * Registers given listener callback to notify about changed selected values. + * + * @param listener The listener to notify about changed selected values. + */ + public void setOnRangeSeekBarChangeListener(OnRangeSeekBarChangeListener listener) { + this.listener = listener; + } + + /** + * Handles thumb selection and movement. Notifies listener callback on certain events. + */ + @Override + public boolean onTouchEvent(MotionEvent event) { + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + pressedThumb = evalPressedThumb(event.getX()); + invalidate(); + break; + case MotionEvent.ACTION_MOVE: + if (pressedThumb != null) { + + double value = convertToNormalizedValue(event.getX()); + + if (Thumb.MIN.equals(pressedThumb)) { + setNormalizedMinValue(value); + } else if (Thumb.MAX.equals(pressedThumb)) { + setNormalizedMaxValue(value); + } + + if (notifyWhileDragging && listener != null) { + listener.rangeSeekBarValuesChanged(getSelectedMinValue(), getSelectedMaxValue(), false); + } + } + break; + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: + pressedThumb = null; + invalidate(); + if (listener != null) { + listener.rangeSeekBarValuesChanged(getSelectedMinValue(), getSelectedMaxValue(), true); + } + break; + } + return true; + } + + /** + * Ensures correct size of the widget. + */ + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int width = 200; + if (MeasureSpec.UNSPECIFIED != MeasureSpec.getMode(widthMeasureSpec)) { + width = MeasureSpec.getSize(widthMeasureSpec); + } + + int height = tc.thumbImage.getHeight(); + if (MeasureSpec.UNSPECIFIED != MeasureSpec.getMode(heightMeasureSpec)) { + height = Math.min(height, MeasureSpec.getSize(heightMeasureSpec)); + } + setMeasuredDimension(width, height); + } + + /** + * Draws the widget on the given canvas. + */ + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + // draw seek bar background line + final RectF rect = tc.getRect(); + paint.setStyle(Style.FILL); + paint.setColor(Color.GRAY); + canvas.drawRect(rect, paint); + // draw seek bar active range line + rect.left = convertToScreenValue(normalizedMinValue); + rect.right = convertToScreenValue(normalizedMaxValue); + // orange color + paint.setColor(Color.rgb(255, 165, 0)); + canvas.drawRect(rect, paint); + + // draw minimum thumb + drawThumb(convertToScreenValue(normalizedMinValue), Thumb.MIN == pressedThumb, canvas); + + // draw maximum thumb + drawThumb(convertToScreenValue(normalizedMaxValue), Thumb.MAX == pressedThumb, canvas); + } + + /** + * Draws the "normal" resp. "pressed" thumb image on specified x-coordinate. + * + * @param normalizedToScreenValue The x-coordinate in screen space where to draw the image. + * @param pressed Is the thumb currently in "pressed" state? + * @param canvas The canvas to draw upon. + */ + private void drawThumb(float normalizedToScreenValue, boolean pressed, Canvas canvas) { + canvas.drawBitmap(tc.getImage(pressed), normalizedToScreenValue - tc.thumbHalfWidth, (float) ((0.5f * getHeight()) - tc.thumbHalfHeight), paint); + } + + /** + * Decides which (if any) thumb is touched by the given x-coordinate. + * + * @param touchX The x-coordinate of a touch event in screen space. + * @return The pressed thumb or null if none has been touched. + */ + private Thumb evalPressedThumb(float touchX) { + Thumb result = null; + boolean minThumbPressed = isInThumbRange(touchX, normalizedMinValue); + boolean maxThumbPressed = isInThumbRange(touchX, normalizedMaxValue); + if (minThumbPressed && maxThumbPressed) { + // if both thumbs are pressed (they lie on top of each other), choose the one with more room to drag. this avoids "stalling" the thumbs in a corner, not being able to drag them apart anymore. + result = (touchX / getWidth() > 0.5f) ? Thumb.MIN : Thumb.MAX; + } else if (minThumbPressed) { + result = Thumb.MIN; + } else if (maxThumbPressed) { + result = Thumb.MAX; + } + return result; + } + + /** + * Decides if given x-coordinate in screen space needs to be interpreted as "within" the normalized thumb x-coordinate. + * + * @param touchX The x-coordinate in screen space to check. + * @param normalizedThumbValue The normalized x-coordinate of the thumb to check. + * @return true if x-coordinate is in thumb range, false otherwise. + */ + private boolean isInThumbRange(float touchX, double normalizedThumbValue) { + return Math.abs(touchX - convertToScreenValue(normalizedThumbValue)) <= tc.thumbHalfWidth; + } + + /** + * Sets normalized min value to value so that 0 <= value <= normalized max value <= 1. + * The View will get invalidated when calling this method. + * + * @param value The new normalized min value to set. + */ + private void setNormalizedMinValue(double value) { + normalizedMinValue = Math.max(0d, Math.min(1d, Math.min(value, normalizedMaxValue))); + invalidate(); + } + + /** + * Sets normalized max value to value so that 0 <= normalized min value <= value <= 1. + * The View will get invalidated when calling this method. + * + * @param value The new normalized max value to set. + */ + private void setNormalizedMaxValue(double value) { + normalizedMaxValue = Math.max(0d, Math.min(1d, Math.max(value, normalizedMinValue))); + invalidate(); + } + + /** + * Converts a normalized value to a Number object in the value space between absolute minimum and maximum. + * + * @param normalized + * @return + */ + @SuppressWarnings("unchecked") + private T denormalizeValue(double normalized) { + return toTConverter.convert(fromValueNormalizer.denormalize(normalized)); + } + + /** + * Converts the given Number value to a normalized double. + * + * @param value The Number value to normalize. + * @return The normalized double. + */ + private double normalizeValue(T value) { + return fromValueNormalizer.normalize(toDoubleConverter.convert(value)); + } + + /** + * Converts a normalized value into screen space. + * + * @param normalizedValue The normalized value to convert. + * @return The converted value in screen space. + */ + private float convertToScreenValue(double normalizedValue) { + return (float)this.fromScreenNormalizer.denormalize(normalizedValue); + } + + /** + * Converts screen space x-coordinates into normalized values. + * + * @param screenValue The x-coordinate in screen space to convert. + * @return The normalized value. + */ + private double convertToNormalizedValue(float screenValue) { + return this.fromScreenNormalizer.normalize(screenValue); + } + + /** + * Callback listener interface to notify about changed range values. + * + * @param The Number type the RangeSeekBar has been declared with. + * @author Stephan Tittel (stephan.tittel@kom.tu-darmstadt.de) + */ + public interface OnRangeSeekBarChangeListener { + + void rangeSeekBarValuesChanged(T minValue, T maxValue, boolean changeComplete); + + } + + /** + * Thumb constants (min and max). + * + * @author Stephan Tittel (stephan.tittel@kom.tu-darmstadt.de) + */ + private static enum Thumb { + MIN, MAX + } + + private class ThumbContainer { + @NotNull + private final Bitmap thumbImage = BitmapFactory.decodeResource(getResources(), R.drawable.seek_thumb_normal); + + @NotNull + private final Bitmap thumbPressedImage = BitmapFactory.decodeResource(getResources(), R.drawable.seek_thumb_pressed); + + private final float thumbWidth = thumbImage.getWidth(); + + private final float thumbHalfWidth = 0.5f * thumbWidth; + + private final float thumbHalfHeight = 0.5f * thumbImage.getHeight(); + + private final float lineHeight = 0.3f * thumbHalfHeight; + + private final float padding = thumbHalfWidth; + + public RectF getRect() { + return new RectF(padding, 0.5f * (getHeight() - lineHeight), getWidth() - padding, 0.5f * (getHeight() + lineHeight)); + } + + public Bitmap getImage(boolean pressed) { + return pressed ? thumbPressedImage : thumbImage; + } + } + +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ActivityViewBuilder.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ActivityViewBuilder.java new file mode 100644 index 00000000..71d94fb5 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ActivityViewBuilder.java @@ -0,0 +1,14 @@ +package org.solovyev.android.view; + +import android.app.Activity; +import org.jetbrains.annotations.NotNull; + +/** + * User: serso + * Date: 4/19/12 + * Time: 4:23 PM + */ +public interface ActivityViewBuilder { + + void buildView(@NotNull Activity activity); +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/AndroidViewUtils.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/AndroidViewUtils.java new file mode 100644 index 00000000..1ffd3fde --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/AndroidViewUtils.java @@ -0,0 +1,93 @@ +package org.solovyev.android.view; + +import android.graphics.Canvas; +import android.graphics.drawable.Drawable; +import android.view.View; +import android.widget.Button; +import android.widget.ImageButton; +import android.widget.TextView; +import org.jetbrains.annotations.NotNull; + +/** + * User: serso + * Date: 11/3/12 + * Time: 10:49 PM + */ +public final class AndroidViewUtils { + + private AndroidViewUtils() { + throw new AssertionError(); + } + + public static boolean drawDrawables(Canvas canvas, @NotNull TextView textView) { + final int compoundPaddingLeft = textView.getCompoundPaddingLeft(); + final int compoundPaddingTop = textView.getCompoundPaddingTop(); + final int compoundPaddingRight = textView.getCompoundPaddingRight(); + final int compoundPaddingBottom = textView.getCompoundPaddingBottom(); + + final int scrollX = textView.getScrollX(); + final int scrollY = textView.getScrollY(); + + final int right = textView.getRight(); + final int left = textView.getLeft(); + final int bottom = textView.getBottom(); + final int top = textView.getTop(); + + final Drawable[] drawables = textView.getCompoundDrawables(); + if (drawables != null) { + + int vspace = bottom - top - compoundPaddingBottom - compoundPaddingTop; + int hspace = right - left - compoundPaddingRight - compoundPaddingLeft; + + Drawable topDr = drawables[1]; + // IMPORTANT: The coordinates computed are also used in invalidateDrawable() + // Make sure to update invalidateDrawable() when changing this code. + if (topDr != null) { + canvas.save(); + canvas.translate(scrollX + compoundPaddingLeft + (hspace - topDr.getBounds().width()) / 2, + scrollY + textView.getPaddingTop() + vspace / 2); + topDr.draw(canvas); + canvas.restore(); + return true; + } + } + + return false; + } + + public static void applyButtonDef(@NotNull Button button, @NotNull ButtonDef buttonDef) { + button.setText(buttonDef.getText()); + + final Integer drawableResId = buttonDef.getDrawableResId(); + if ( drawableResId != null ) { + button.setPadding(0, 0, 0, 0); + + final Drawable drawable = button.getContext().getResources().getDrawable(drawableResId); + button.setCompoundDrawablesWithIntrinsicBounds(null, drawable, null, null); + button.setCompoundDrawablePadding(0); + } + + applyViewDef(button, buttonDef); + } + + public static void applyButtonDef(@NotNull ImageButton imageButton, @NotNull ButtonDef buttonDef) { + final Integer drawableResId = buttonDef.getDrawableResId(); + if ( drawableResId != null ) { + imageButton.setImageDrawable(imageButton.getContext().getResources().getDrawable(drawableResId)); + } + + applyViewDef(imageButton, buttonDef); + } + + public static void applyViewDef(@NotNull View view, @NotNull ViewDef viewDef) { + final Integer backgroundResId = viewDef.getBackgroundResId(); + if (backgroundResId != null) { + view.setBackgroundResource(backgroundResId); + } + + final String tag = viewDef.getTag(); + if ( tag != null ) { + view.setTag(tag); + } + } +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/AutoResizeTextView.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/AutoResizeTextView.java new file mode 100644 index 00000000..f9ca5cb3 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/AutoResizeTextView.java @@ -0,0 +1,301 @@ +/* + * Copyright (c) 2009-2011. Created by serso aka se.solovyev. + * For more information, please, contact se.solovyev@gmail.com + * or visit http://se.solovyev.org + */ + +package org.solovyev.android.view; + +import android.content.Context; +import android.graphics.Canvas; +import android.text.Editable; +import android.text.Layout.Alignment; +import android.text.StaticLayout; +import android.text.TextPaint; +import android.util.AttributeSet; +import android.util.Log; +import android.widget.TextView; + +/** + * Text view that auto adjusts text size to fit within the view. + * If the text size equals the minimum text size and still does not + * fit, append with an ellipsis. + * + * @author Chase Colburn + * @since Apr 4, 2011 + */ +public class AutoResizeTextView extends TextView { + + // Minimum text size for this text view + public static final float MIN_TEXT_SIZE = 20; + + private float initialTextSize = 100; + + // Interface for resize notifications + public interface OnTextResizeListener { + public void onTextResize(TextView textView, float oldSize, float newSize); + } + + // Off screen canvas for text size rendering + private static final Canvas textResizeCanvas = new Canvas(); + + // Our ellipse string + private static final String ellipsis = "..."; + + // Registered resize listener + private OnTextResizeListener textResizeListener; + + // Flag for text and/or size changes to force a resize + private boolean needsResize = false; + + // Lower bounds for text size + private float minTextSize = MIN_TEXT_SIZE; + + // Text view line spacing multiplier + private float spacingMult = 1.0f; + + // Text view additional line spacing + private float spacingAdd = 0.0f; + + // Add ellipsis to text that overflows at the smallest text size + private boolean addEllipsis = true; + + // Default constructor override + public AutoResizeTextView(Context context) { + super(context); + } + + // Default constructor when inflating from XML file + public AutoResizeTextView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + // Default constructor override + public AutoResizeTextView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + /** + * When text changes, set the force resize flag to true and resetInterpreter the text size. + */ + @Override + protected void onTextChanged(final CharSequence text, final int start, final int before, final int after) { + needsResize = true; + // Since this view may be reused, it is good to resetInterpreter the text size + } + + /** + * If the text view size changed, set the force resize flag to true + */ + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + if (w != oldw || h != oldh) { + needsResize = true; + } + } + + /** + * Register listener to receive resize notifications + * + * @param listener + */ + public void setOnResizeListener(OnTextResizeListener listener) { + textResizeListener = listener; + } + + /** + * Override the set text size to update our internal reference values + */ + @Override + public void setTextSize(int unit, float size) { + super.setTextSize(unit, size); + } + + /** + * Override the set line spacing to update our internal reference values + */ + @Override + public void setLineSpacing(float add, float mult) { + super.setLineSpacing(add, mult); + spacingMult = mult; + spacingAdd = add; + } + + /** + * Set the lower text size limit and invalidate the view + * + * @param minTextSize + */ + public void setMinTextSize(float minTextSize) { + this.minTextSize = minTextSize; + requestLayout(); + invalidate(); + } + + /** + * Return lower text size limit + * + * @return + */ + public float getMinTextSize() { + return minTextSize; + } + + /** + * Set flag to add ellipsis to text that overflows at the smallest text size + * + * @param addEllipsis + */ + public void setAddEllipsis(boolean addEllipsis) { + this.addEllipsis = addEllipsis; + } + + /** + * Return flag to add ellipsis to text that overflows at the smallest text size + * + * @return + */ + public boolean getAddEllipsis() { + return addEllipsis; + } + + + /** + * Resize text after measuring + */ + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + if (changed || needsResize) { + int widthLimit = (right - left) - getCompoundPaddingLeft() - getCompoundPaddingRight(); + int heightLimit = (bottom - top) - getCompoundPaddingBottom() - getCompoundPaddingTop(); + resizeText(widthLimit, heightLimit, getText()); + } + super.onLayout(changed, left, top, right, bottom); + } + + /** + * Resize the text size with default width and height + */ + public void resizeText() { + resizeText(getText()); + } + + private void resizeText(final CharSequence text) { + int heightLimit = getHeight() - getPaddingBottom() - getPaddingTop(); + int widthLimit = getWidth() - getPaddingLeft() - getPaddingRight(); + resizeText(widthLimit, heightLimit, text); + } + + /** + * Resize the text size with specified width and height + * + * @param width + * @param height + * @param text + */ + private void resizeText(int width, int height, CharSequence text) { + Log.d(this.getClass().getName(), "Resizing: w=" + width + ", h=" + height + ", text='" + text + "'"); + + // Do not resize if the view does not have dimensions or there is no text + if (text == null || text.length() == 0 || height <= 0 || width <= 0) { + return; + } + + // Get the text view's paint object + TextPaint textPaint = getPaint(); + + // Store the current text size + float oldTextSize = textPaint.getTextSize(); + Log.d(this.getClass().getName(), "Old text size: " + oldTextSize); + + // If there is a max text size set, use the lesser of that and the default text size + // todo serso: +2 is a workaround => to be checked boundary constraints + float newTextSize = initialTextSize + 2; + + int newTextHeight; + + if (text instanceof Editable) { + ((Editable) text).append("|"); + } + + try { + + // Get the required text height + newTextHeight = getTextRect(text, textPaint, width, newTextSize); + + logDimensions(newTextSize, newTextHeight); + if (newTextHeight > height) { + // Until we either fit within our text view or we had reached our min text size, incrementally try smaller sizes + while (newTextHeight > height) { + if (newTextSize <= minTextSize) { + break; + } + newTextSize = Math.max(newTextSize - 1, minTextSize); + newTextHeight = getTextRect(text, textPaint, width, newTextSize); + logDimensions(newTextSize, newTextHeight); + } + } else { + while (newTextHeight < height) { + if (newTextSize <= minTextSize) { + break; + } + newTextSize = Math.max(newTextSize + 1, minTextSize); + newTextHeight = getTextRect(text, textPaint, width, newTextSize); + logDimensions(newTextSize, newTextHeight); + } + } + } finally { + if (text instanceof Editable) { + ((Editable) text).delete(text.length() - 1, text.length()); + } + } + + initialTextSize = newTextSize; + + // If we had reached our minimum text size and still don't fit, append an ellipsis + if (addEllipsis && newTextSize == minTextSize && newTextHeight > height) { + // Draw using a static layout + StaticLayout layout = new StaticLayout(text, textPaint, width, Alignment.ALIGN_NORMAL, spacingMult, spacingAdd, false); + layout.draw(textResizeCanvas); + int lastLine = layout.getLineForVertical(height) - 1; + int start = layout.getLineStart(lastLine); + int end = layout.getLineEnd(lastLine); + float lineWidth = layout.getLineWidth(lastLine); + float ellipseWidth = textPaint.measureText(ellipsis); + + // Trim characters off until we have enough room to draw the ellipsis + while (width < lineWidth + ellipseWidth) { + lineWidth = textPaint.measureText(text.subSequence(start, --end + 1).toString()); + } + setText(text.subSequence(0, end) + ellipsis); + + } + + // Some devices try to auto adjust line spacing, so force default line spacing + // and invalidate the layout as a side effect + textPaint.setTextSize(newTextSize); + setLineSpacing(spacingAdd, spacingMult); + + // Notify the listener if registered + if (textResizeListener != null) { + textResizeListener.onTextResize(this, oldTextSize, newTextSize); + } + + // Reset force resize flag + needsResize = false; + } + + private void logDimensions(float newTextSize, int newTextHeight) { + Log.d(this.getClass().getName(), "Nex text size: " + newTextSize + ", new text height: " + newTextHeight); + } + + // Set the text size of the text paint object and use a static layout to render text off screen before measuring + private int getTextRect(CharSequence source, TextPaint paint, int width, float textSize) { + // Update the text paint object + paint.setTextSize(textSize); + // Draw using a static layout + StaticLayout layout = new StaticLayout(source, paint, width, Alignment.ALIGN_NORMAL, spacingMult, spacingAdd, false); + layout.draw(textResizeCanvas); + return layout.getHeight(); + } +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ButtonDef.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ButtonDef.java new file mode 100644 index 00000000..3ffec7ee --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ButtonDef.java @@ -0,0 +1,17 @@ +package org.solovyev.android.view; + +import org.jetbrains.annotations.Nullable; + +/** + * User: serso + * Date: 11/4/12 + * Time: 11:52 PM + */ +public interface ButtonDef extends ViewDef { + + @Nullable + Integer getDrawableResId(); + + @Nullable + CharSequence getText(); +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ColorButton.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ColorButton.java new file mode 100644 index 00000000..cdeb541d --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ColorButton.java @@ -0,0 +1,232 @@ +/* + * 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. + */ + +/* + * Copyright (c) 2009-2011. Created by serso aka se.solovyev. + * For more information, please, contact se.solovyev@gmail.com + */ + +package org.solovyev.android.view; + +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.Vibrator; +import android.preference.PreferenceManager; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.widget.Button; +import org.jetbrains.annotations.NotNull; +import org.solovyev.android.FontSizeAdjuster; +import org.solovyev.common.math.Point2d; +import org.solovyev.common.text.StringUtils; + +/** + * NOTE: copied from com.android.calculator2.ColorButton + */ + +/** + * Button with click-animation effect. + */ +public class ColorButton extends Button { + + private int magicFlameColour; + private boolean drawMagicFlame = true; + + private static final int CLICK_FEEDBACK_INTERVAL = 10; + private static final int CLICK_FEEDBACK_DURATION = 350; + + @NotNull + private Point2d textPosition; + private long animationStart; + private Paint feedbackPaint; + + @NotNull + private final OnClickListenerVibrator onClickListener; + + private static final float H_TEXT_POSITION_DEFAULT_VALUE = 0.5f; + + private float hTextPosition = H_TEXT_POSITION_DEFAULT_VALUE; + + private boolean showText = true; + + public ColorButton(Context context, AttributeSet attrs) { + this(context, attrs, true); + } + + public ColorButton(Context context, AttributeSet attrs, boolean init) { + super(context, attrs); + + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DragButton); + final int N = a.getIndexCount(); + for (int i = 0; i < N; i++) { + int attr = a.getIndex(i); + + final String attrValue = a.getString(attr); + + if (!StringUtils.isEmpty(attrValue)) { + switch (attr) { + case R.styleable.DragButton_hTextPosition: + this.hTextPosition = Float.valueOf(attrValue); + break; + } + } + } + + if (init) { + init(context); + } + + this.onClickListener = new OnClickListenerVibrator((Vibrator)context.getSystemService(Context.VIBRATOR_SERVICE), PreferenceManager.getDefaultSharedPreferences(context)); + } + + protected void init(Context context) { + final Resources resources = getResources(); + + magicFlameColour = resources.getColor(R.color.magic_flame); + feedbackPaint = new Paint(); + feedbackPaint.setStyle(Style.STROKE); + feedbackPaint.setStrokeWidth(2); + + // applying textColor property on the paint (now it is not possible to set paint color through the xml) + getPaint().setColor(getCurrentTextColor()); + + animationStart = -1; + + if (context instanceof FontSizeAdjuster) { + ((FontSizeAdjuster) context).adjustFontSize(this); + } + } + + + @Override + public void onSizeChanged(int w, int h, int oldW, int oldH) { + measureText(); + } + + protected void measureText() { + Paint paint = getPaint(); + + if (getText() != null) { + textPosition = getTextPosition(paint, getText()); + } + } + + private Point2d getTextPosition(@NotNull Paint paint, @NotNull CharSequence text) { + final Point2d result = new Point2d(); + + result.setX(hTextPosition * getWidth() - 0.5f * paint.measureText(text.toString())); + + float height = getHeight() - paint.ascent() - paint.descent(); + + result.setY(height / 2); + + return result; + } + + @Override + protected void onTextChanged(CharSequence text, int start, int before, int after) { + measureText(); + } + + public void drawMagicFlame(int duration, Canvas canvas) { + int alpha = 255 - 255 * duration / CLICK_FEEDBACK_DURATION; + int color = magicFlameColour | (alpha << 24); + + feedbackPaint.setColor(color); + canvas.drawRect(1, 1, getWidth() - 1, getHeight() - 1, feedbackPaint); + } + + @Override + public void onDraw(Canvas canvas) { + if (drawMagicFlame) { + if (animationStart != -1) { + int animDuration = (int) (System.currentTimeMillis() - animationStart); + + if (animDuration >= CLICK_FEEDBACK_DURATION) { + animationStart = -1; + } else { + drawMagicFlame(animDuration, canvas); + postInvalidateDelayed(CLICK_FEEDBACK_INTERVAL); + } + } + } + + CharSequence text = getText(); + if ( !StringUtils.isEmpty(text) && textPosition != null) { + if (showText) { + canvas.drawText(text, 0, text.length(), textPosition.getX(), textPosition.getY(), getPaint()); + } + } else { + AndroidViewUtils.drawDrawables(canvas, this); + } + } + + public void animateClickFeedback() { + animationStart = System.currentTimeMillis(); + invalidate(); + } + + @Override + public boolean performClick() { + vibrate(); + return super.performClick(); + } + + @Override + public boolean performLongClick() { + vibrate(); + return super.performLongClick(); + } + + private void vibrate() { + this.onClickListener.onClick(this); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + boolean result = super.onTouchEvent(event); + + if (this.drawMagicFlame) { + switch (event.getAction()) { + case MotionEvent.ACTION_UP: + animateClickFeedback(); + break; + case MotionEvent.ACTION_DOWN: + case MotionEvent.ACTION_CANCEL: + invalidate(); + break; + } + } + + return result; + } + + public void setDrawMagicFlame(boolean drawMagicFlame) { + this.drawMagicFlame = drawMagicFlame; + } + + public boolean isShowText() { + return showText; + } + + public void setShowText(boolean showText) { + this.showText = showText; + } +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ColorPickerDialog.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ColorPickerDialog.java new file mode 100644 index 00000000..7fec311e --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ColorPickerDialog.java @@ -0,0 +1,234 @@ +/* + * 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 org.solovyev.android.view; + +import android.os.Bundle; +import android.app.Dialog; +import android.content.Context; +import android.graphics.*; +import android.view.MotionEvent; +import android.view.View; + +public class ColorPickerDialog extends Dialog { + + public interface OnColorChangedListener { + void colorChanged(int color); + } + + private OnColorChangedListener mListener; + private int mInitialColor; + + private static class ColorPickerView extends View { + private Paint mPaint; + private Paint mCenterPaint; + private final int[] mColors; + private OnColorChangedListener mListener; + + ColorPickerView(Context c, OnColorChangedListener l, int color) { + super(c); + mListener = l; + mColors = new int[]{ + 0xFFFF0000, 0xFFFF00FF, 0xFF0000FF, 0xFF00FFFF, 0xFF00FF00, + 0xFFFFFF00, 0xFFFF0000 + }; + Shader s = new SweepGradient(0, 0, mColors, null); + + mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + mPaint.setShader(s); + mPaint.setStyle(Paint.Style.STROKE); + mPaint.setStrokeWidth(32); + + mCenterPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + mCenterPaint.setColor(color); + mCenterPaint.setStrokeWidth(5); + } + + private boolean mTrackingCenter; + private boolean mHighlightCenter; + + @Override + protected void onDraw(Canvas canvas) { + float r = CENTER_X - mPaint.getStrokeWidth() * 0.5f; + + canvas.translate(CENTER_X, CENTER_X); + + canvas.drawOval(new RectF(-r, -r, r, r), mPaint); + canvas.drawCircle(0, 0, CENTER_RADIUS, mCenterPaint); + + if (mTrackingCenter) { + int c = mCenterPaint.getColor(); + mCenterPaint.setStyle(Paint.Style.STROKE); + + if (mHighlightCenter) { + mCenterPaint.setAlpha(0xFF); + } else { + mCenterPaint.setAlpha(0x80); + } + canvas.drawCircle(0, 0, + CENTER_RADIUS + mCenterPaint.getStrokeWidth(), + mCenterPaint); + + mCenterPaint.setStyle(Paint.Style.FILL); + mCenterPaint.setColor(c); + } + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + setMeasuredDimension(CENTER_X * 2, CENTER_Y * 2); + } + + private static final int CENTER_X = 100; + private static final int CENTER_Y = 100; + private static final int CENTER_RADIUS = 32; + + private int floatToByte(float x) { + int n = java.lang.Math.round(x); + return n; + } + + private int pinToByte(int n) { + if (n < 0) { + n = 0; + } else if (n > 255) { + n = 255; + } + return n; + } + + private int ave(int s, int d, float p) { + return s + java.lang.Math.round(p * (d - s)); + } + + private int interpColor(int colors[], float unit) { + if (unit <= 0) { + return colors[0]; + } + if (unit >= 1) { + return colors[colors.length - 1]; + } + + float p = unit * (colors.length - 1); + int i = (int) p; + p -= i; + + // now p is just the fractional part [0...1) and i is the index + int c0 = colors[i]; + int c1 = colors[i + 1]; + int a = ave(Color.alpha(c0), Color.alpha(c1), p); + int r = ave(Color.red(c0), Color.red(c1), p); + int g = ave(Color.green(c0), Color.green(c1), p); + int b = ave(Color.blue(c0), Color.blue(c1), p); + + return Color.argb(a, r, g, b); + } + + private int rotateColor(int color, float rad) { + float deg = rad * 180 / 3.1415927f; + int r = Color.red(color); + int g = Color.green(color); + int b = Color.blue(color); + + ColorMatrix cm = new ColorMatrix(); + ColorMatrix tmp = new ColorMatrix(); + + cm.setRGB2YUV(); + tmp.setRotate(0, deg); + cm.postConcat(tmp); + tmp.setYUV2RGB(); + cm.postConcat(tmp); + + final float[] a = cm.getArray(); + + int ir = floatToByte(a[0] * r + a[1] * g + a[2] * b); + int ig = floatToByte(a[5] * r + a[6] * g + a[7] * b); + int ib = floatToByte(a[10] * r + a[11] * g + a[12] * b); + + return Color.argb(Color.alpha(color), pinToByte(ir), + pinToByte(ig), pinToByte(ib)); + } + + private static final float PI = 3.1415926f; + + @Override + public boolean onTouchEvent(MotionEvent event) { + float x = event.getX() - CENTER_X; + float y = event.getY() - CENTER_Y; + boolean inCenter = java.lang.Math.sqrt(x * x + y * y) <= CENTER_RADIUS; + + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + mTrackingCenter = inCenter; + if (inCenter) { + mHighlightCenter = true; + invalidate(); + break; + } + case MotionEvent.ACTION_MOVE: + if (mTrackingCenter) { + if (mHighlightCenter != inCenter) { + mHighlightCenter = inCenter; + invalidate(); + } + } else { + float angle = (float) java.lang.Math.atan2(y, x); + // need to turn angle [-PI ... PI] into unit [0....1] + float unit = angle / (2 * PI); + if (unit < 0) { + unit += 1; + } + mCenterPaint.setColor(interpColor(mColors, unit)); + invalidate(); + } + break; + case MotionEvent.ACTION_UP: + if (mTrackingCenter) { + if (inCenter) { + mListener.colorChanged(mCenterPaint.getColor()); + } + mTrackingCenter = false; // so we draw w/o halo + invalidate(); + } + break; + } + return true; + } + } + + public ColorPickerDialog(Context context, + OnColorChangedListener listener, + int initialColor) { + super(context); + + mListener = listener; + mInitialColor = initialColor; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + OnColorChangedListener l = new OnColorChangedListener() { + public void colorChanged(int color) { + mListener.colorChanged(color); + dismiss(); + } + }; + + setContentView(new ColorPickerView(getContext(), l, mInitialColor)); + setTitle("Pick a Color"); + } +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ConfirmationDialogBuilder.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ConfirmationDialogBuilder.java new file mode 100644 index 00000000..897289a4 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ConfirmationDialogBuilder.java @@ -0,0 +1,104 @@ +package org.solovyev.android.view; + +import org.solovyev.android.ActivityDestroyerController; +import android.app.Activity; +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.solovyev.android.DialogOnActivityDestroyedListener; +import org.solovyev.android.view.R; + +/** + * User: serso + * Date: 4/29/12 + * Time: 1:25 PM + */ +public class ConfirmationDialogBuilder implements DialogBuilder { + + @NotNull + private final Context context; + + private final int messageResId; + + private int titleResId = R.string.c_confirmation; + + private int positiveButtonTextResId = android.R.string.ok; + + private int negativeButtonTextResId = android.R.string.cancel; + + @Nullable + private DialogInterface.OnClickListener positiveHandler; + + @Nullable + private DialogInterface.OnClickListener negativeHandler; + + public ConfirmationDialogBuilder(@NotNull Context context, int messageResId) { + this.context = context; + this.messageResId = messageResId; + } + + @NotNull + public ConfirmationDialogBuilder setTitleResId(int titleResId) { + this.titleResId = titleResId; + return this; + } + + @NotNull + public ConfirmationDialogBuilder setPositiveButtonTextResId(int positiveButtonTextResId) { + this.positiveButtonTextResId = positiveButtonTextResId; + return this; + } + + @NotNull + public ConfirmationDialogBuilder setNegativeButtonTextResId(int negativeButtonTextResId) { + this.negativeButtonTextResId = negativeButtonTextResId; + return this; + } + + @NotNull + public ConfirmationDialogBuilder setPositiveHandler(@Nullable DialogInterface.OnClickListener positiveHandler) { + this.positiveHandler = positiveHandler; + return this; + } + + @NotNull + public ConfirmationDialogBuilder setNegativeHandler(@Nullable DialogInterface.OnClickListener negativeHandler) { + this.negativeHandler = negativeHandler; + return this; + } + + @NotNull + @Override + public AlertDialog build() { + AlertDialog.Builder builder = new AlertDialog.Builder(context); + + builder.setTitle(titleResId); + builder.setMessage(messageResId); + builder.setPositiveButton(positiveButtonTextResId, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + if ( positiveHandler != null ) { + positiveHandler.onClick(dialog, which); + } + } + }); + + builder.setNegativeButton(negativeButtonTextResId, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + if ( negativeHandler != null ) { + negativeHandler.onClick(dialog, which); + } + } + }); + + + final AlertDialog result = builder.create(); + if ( context instanceof Activity) { + ActivityDestroyerController.getInstance().put((Activity)context, new DialogOnActivityDestroyedListener(result)); + } + return result; + } +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/DataActivityViewBuilder.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/DataActivityViewBuilder.java new file mode 100644 index 00000000..b9de4257 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/DataActivityViewBuilder.java @@ -0,0 +1,13 @@ +package org.solovyev.android.view; + +import org.jetbrains.annotations.NotNull; + +/** + * User: serso + * Date: 4/20/12 + * Time: 12:01 AM + */ +public interface DataActivityViewBuilder extends ActivityViewBuilder { + + void setData(@NotNull D data); +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/DialogBuilder.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/DialogBuilder.java new file mode 100644 index 00000000..59f3b592 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/DialogBuilder.java @@ -0,0 +1,12 @@ +package org.solovyev.android.view; + +import android.content.DialogInterface; +import org.solovyev.common.Builder; + +/** + * User: serso + * Date: 4/29/12 + * Time: 1:24 PM + */ +public interface DialogBuilder extends Builder { +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/DoubleRange.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/DoubleRange.java new file mode 100644 index 00000000..00f47c63 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/DoubleRange.java @@ -0,0 +1,51 @@ +package org.solovyev.android.view; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.solovyev.common.text.Formatter; + +/** + * User: serso + * Date: 8/10/12 + * Time: 12:51 AM + */ +public class DoubleRange extends NumberRange { + + public DoubleRange(@NotNull Double min, + @NotNull Double max, + @NotNull Double step, + int startPosition, + @Nullable Formatter formatter) { + super(min, max, step, startPosition, formatter); + } + + @NotNull + public static NumberRange newInstance(@NotNull Double min, + @NotNull Double max, + @NotNull Double step, + @NotNull Double selected, + @Nullable Formatter formatter) { + if (selected < min || selected > max) { + throw new IllegalArgumentException("Selected value: " + selected + " should be >= " + min + " and <= " + max + "!"); + } + + int startPosition = 0; + for ( double i = min; i < selected; i += step ) { + startPosition += 1; + } + + return new DoubleRange(min, max, step, startPosition, formatter); + } + + @Override + protected int getCount(@NotNull Double min, @NotNull Double max, @NotNull Double step) { + int result = (int) ((max - min) / step); + return result + 1; + } + + @NotNull + @Override + protected Double getValueAt(int position, @NotNull Double min, @NotNull Double max, @NotNull Double step) { + return min + position * step; + } +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/Grayable.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/Grayable.java new file mode 100644 index 00000000..418b69d1 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/Grayable.java @@ -0,0 +1,13 @@ +package org.solovyev.android.view; + +/** + * User: serso + * Date: 4/19/12 + * Time: 12:50 AM + */ +public interface Grayable { + + void grayOut(); + + void grayIn(); +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/GrayableImpl.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/GrayableImpl.java new file mode 100644 index 00000000..79072fa1 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/GrayableImpl.java @@ -0,0 +1,41 @@ +package org.solovyev.android.view; + +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.RectF; +import android.view.View; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * User: serso + * Date: 4/19/12 + * Time: 12:51 AM + */ +public class GrayableImpl implements ViewGrayable { + + @Nullable + private Paint paint; + + @Override + public void grayOut() { + paint = new Paint(); + paint.setARGB(180, 75, 75, 75); + } + + @Override + public void grayIn() { + paint = null; + } + + @Override + public void dispatchDraw(@NotNull View view, @NotNull Canvas canvas) { + final Paint localPaint = paint; + if (localPaint != null) { + final RectF drawRect = new RectF(); + drawRect.set(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight()); + + canvas.drawRoundRect(drawRect, 5, 5, localPaint); + } + } +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/GrayableRelativeLayout.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/GrayableRelativeLayout.java new file mode 100644 index 00000000..65493039 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/GrayableRelativeLayout.java @@ -0,0 +1,44 @@ +package org.solovyev.android.view; + +import android.content.Context; +import android.graphics.Canvas; +import android.util.AttributeSet; +import android.widget.RelativeLayout; +import org.jetbrains.annotations.NotNull; + +/** + * User: serso + * Date: 4/19/12 + * Time: 12:34 AM + */ +public class GrayableRelativeLayout extends RelativeLayout implements Grayable { + + @NotNull + private ViewGrayable grayable = new GrayableImpl(); + + public GrayableRelativeLayout(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public GrayableRelativeLayout(Context context) { + super(context); + } + + @Override + public void grayOut() { + grayable.grayOut(); + } + + @Override + public void grayIn() { + grayable.grayIn(); + } + + @Override + protected void dispatchDraw(Canvas canvas) { + super.dispatchDraw(canvas); + + this.grayable.dispatchDraw(this, canvas); + } +} + diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/GrayableView.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/GrayableView.java new file mode 100644 index 00000000..a825fecb --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/GrayableView.java @@ -0,0 +1,9 @@ +package org.solovyev.android.view; + +/** + * User: serso + * Date: 4/19/12 + * Time: 12:53 AM + */ +public interface GrayableView extends Grayable { +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/IntegerRange.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/IntegerRange.java new file mode 100644 index 00000000..37dd8ce2 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/IntegerRange.java @@ -0,0 +1,49 @@ +package org.solovyev.android.view; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.solovyev.common.text.Formatter; + +/** + * User: serso + * Date: 8/10/12 + * Time: 12:08 AM + */ +public class IntegerRange extends NumberRange { + + public IntegerRange(@NotNull Integer min, + @NotNull Integer max, + @NotNull Integer step, + int startPosition, + @Nullable Formatter formatter) { + super(min, max, step, startPosition, formatter); + } + + @NotNull + public static NumberRange newInstance(@NotNull Integer min, @NotNull Integer max, @NotNull Integer step, @NotNull Integer selected) { + if (selected < min || selected > max) { + throw new IllegalArgumentException("Selected value: " + selected + " should be >= " + min + " and <= " + max + "!"); + } + + int startPosition = 0; + for ( int i = min; i < selected; i += step ) { + startPosition += 1; + } + + return new IntegerRange(min, max, step, startPosition, null); + } + + @Override + protected int getCount(@NotNull Integer min, @NotNull Integer max, @NotNull Integer step) { + // (4 - 0)/1 + 1= 5 + // (4 - 0)/2 + 1 = 3 + // (4 - 1)/2 + 1 = 2 + return (max - min) / step + 1; + } + + @NotNull + @Override + protected Integer getValueAt(int position, @NotNull Integer min, @NotNull Integer max, @NotNull Integer step) { + return min + position * step; + } +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ListRange.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ListRange.java new file mode 100644 index 00000000..26375c74 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ListRange.java @@ -0,0 +1,60 @@ +package org.solovyev.android.view; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.solovyev.common.text.Formatter; + +import java.util.List; + +/** + * User: serso + * Date: 8/10/12 + * Time: 1:55 AM + */ +public class ListRange implements Picker.Range { + + @NotNull + private List elements; + + private int startPosition; + + @Nullable + private Formatter formatter; + + public ListRange(@NotNull List elements, @Nullable T selected) { + this.elements = elements; + this.startPosition = elements.indexOf(selected); + if ( this.startPosition < 0 ) { + this.startPosition = 0; + } + this.formatter = null; + } + + public ListRange(@NotNull List elements, @Nullable T selected, @Nullable Formatter formatter) { + this(elements, selected); + this.formatter = formatter; + } + + @Override + public int getStartPosition() { + return this.startPosition; + } + + @Override + public int getCount() { + return this.elements.size(); + } + + @NotNull + @Override + public String getStringValueAt(int position) { + final T value = getValueAt(position); + return formatter == null ? value.toString() : formatter.formatValue(value); + } + + @NotNull + @Override + public T getValueAt(int position) { + return this.elements.get(position); + } +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ListViewBuilder.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ListViewBuilder.java new file mode 100644 index 00000000..c9e5037d --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ListViewBuilder.java @@ -0,0 +1,59 @@ +package org.solovyev.android.view; + +import android.content.Context; +import android.widget.ListAdapter; +import android.widget.ListView; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * User: serso + * Date: 4/26/12 + * Time: 1:05 PM + */ +public class ListViewBuilder implements ViewBuilder { + + @Nullable + private Integer layoutId; + + @NotNull + private ListAdapter listAdapter; + + private ListViewBuilder() { + } + + @NotNull + public static ViewBuilder newInstance(@NotNull ListAdapter listAdapter) { + final ListViewBuilder result = new ListViewBuilder(); + + result.layoutId = null; + result.listAdapter = listAdapter; + + return result; + } + + @NotNull + public static ViewBuilder newInstance(int layoutId, @NotNull ListAdapter listAdapter) { + final ListViewBuilder result = new ListViewBuilder(); + + result.layoutId = layoutId; + result.listAdapter = listAdapter; + + return result; + } + + @NotNull + @Override + public ListView build(@NotNull Context context) { + final ListView result; + if (layoutId != null) { + result = ViewFromLayoutBuilder.newInstance(layoutId).build(context); + } else { + result = new ListView(context); + } + + result.setAdapter(listAdapter); + + return result; + } +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/NumberRange.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/NumberRange.java new file mode 100644 index 00000000..eb4cce91 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/NumberRange.java @@ -0,0 +1,83 @@ +package org.solovyev.android.view; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.solovyev.common.text.Formatter; + +/** + * User: serso + * Date: 8/9/12 + * Time: 11:44 PM + */ +public abstract class NumberRange> implements Picker.Range { + + @Nullable + private Formatter formatter; + + @NotNull + private final N min; + + @NotNull + private final N max; + + @NotNull + private final N step; + + private final int startPosition; + + private int count = -1; + + public NumberRange(@NotNull N min, + @NotNull N max, + @NotNull N step, + int startPosition, + @Nullable Formatter formatter) { + assert min.compareTo(max) <= 0; + + this.min = min; + this.max = max; + this.step = step; + this.startPosition = startPosition; + this.formatter = formatter; + } + + @Override + public int getStartPosition() { + if ( this.startPosition < getCount() ) { + return this.startPosition; + } else { + return getCount() - 1; + } + } + + @Override + public int getCount() { + if (count == -1) { + count = getCount(min, max, step); + } + return count; + } + + protected abstract int getCount(@NotNull N min, @NotNull N max, @NotNull N step); + + @NotNull + @Override + public String getStringValueAt(int position) { + int count = getCount(); + if (position < 0 || position >= count) { + throw new IllegalArgumentException("Position " + position + " must be >= 0 and < " + count + "!"); + } + + final N number = getValueAt(position, min, max, step); + return formatter == null ? number.toString() : formatter.formatValue(number); + } + + @NotNull + @Override + public N getValueAt(int position) { + return getValueAt(position, min, max, step); + } + + @NotNull + protected abstract N getValueAt(int position, @NotNull N min, @NotNull N max, @NotNull N step); +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/NumberRangeSeekBar.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/NumberRangeSeekBar.java new file mode 100644 index 00000000..42c728a0 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/NumberRangeSeekBar.java @@ -0,0 +1,60 @@ +package org.solovyev.android.view; + +import android.content.Context; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.solovyev.common.Converter; +import org.solovyev.common.interval.Interval; +import org.solovyev.common.math.NumberValuer; + +/** + * User: serso + * Date: 9/19/11 + * Time: 4:26 PM + */ +public class NumberRangeSeekBar> extends AbstractRangeSeekBar { + + @NotNull + private final NumberType numberType; + + + public NumberRangeSeekBar(@NotNull Interval boundaries, @Nullable Integer steps, Context context) throws IllegalArgumentException { + this(boundaries.getLeftLimit(), boundaries.getRightLimit(), steps, context); + } + + /** + * Creates a new RangeSeekBar. + * + * @param minValue The minimum value of the selectable range. + * @param maxValue The maximum value of the selectable range. + * @param steps number of steps of range + * @param context parent context + * @throws IllegalArgumentException Will be thrown if min/max value types are not one of Long, Double, Integer, Float, Short, Byte or BigDecimal. + */ + public NumberRangeSeekBar(@NotNull T minValue, @NotNull T maxValue, @Nullable Integer steps, Context context) throws IllegalArgumentException { + super(minValue, maxValue, steps, context); + + numberType = NumberType.fromNumber(minValue); + + } + + @NotNull + @Override + protected Converter getToTConverter() { + return new Converter() { + @NotNull + @Override + public T convert(@NotNull Double value) { + return (T) numberType.toNumber(value); + } + }; + } + + @NotNull + @Override + protected Converter getToDoubleConverter() { + return new NumberValuer(); + } + + +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/NumberType.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/NumberType.java new file mode 100644 index 00000000..c1cadc1f --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/NumberType.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2009-2011. Created by serso aka se.solovyev. + * For more information, please, contact se.solovyev@gmail.com + * or visit http://se.solovyev.org + */ + +package org.solovyev.android.view; + +import org.jetbrains.annotations.NotNull; + +import java.math.BigDecimal; + +/** + * Utility enumeration used to convert between Numbers and doubles. + * + * @author Stephan Tittel (stephan.tittel@kom.tu-darmstadt.de) + */ +enum NumberType { + + LONG(Long.class), + DOUBLE(Double.class), + INTEGER(Integer.class), + FLOAT(Float.class), + SHORT(Short.class), + BYTE(Byte.class), + BIG_DECIMAL(BigDecimal.class); + + @NotNull + private final Class underlyingClass; + + NumberType(@NotNull Class underlyingClass) { + this.underlyingClass = underlyingClass; + } + + @NotNull + public static NumberType fromNumber(E value) throws IllegalArgumentException { + + for (NumberType numberType : NumberType.values()) { + if (numberType.underlyingClass.isInstance(value)) { + return numberType; + } + } + + throw new IllegalArgumentException("Number class '" + value.getClass().getName() + "' is not supported"); + } + + public T toNumber(double value) { + + switch (this) { + case LONG: + return (T)new Long((long) value); + case DOUBLE: + return (T)new Double(value); + case INTEGER: + return (T)new Integer((int) value); + case FLOAT: + return (T)new Float((float) value); + case SHORT: + return (T)new Short((short) value); + case BYTE: + return (T)new Byte((byte) value); + case BIG_DECIMAL: + return (T)new BigDecimal(value); + } + + throw new InstantiationError("can't convert " + this + " to a Number object"); + } +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/OnClickListenerVibrator.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/OnClickListenerVibrator.java new file mode 100644 index 00000000..778e0040 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/OnClickListenerVibrator.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2009-2011. Created by serso aka se.solovyev. + * For more information, please, contact se.solovyev@gmail.com + * or visit http://se.solovyev.org + */ + +package org.solovyev.android.view; + +import android.content.SharedPreferences; +import android.os.Vibrator; +import android.view.View; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** +* User: serso +* Date: 10/26/11 +* Time: 11:25 PM +*/ +public class OnClickListenerVibrator implements View.OnClickListener { + + private static final float VIBRATION_TIME_SCALE = 1.0f; + + @NotNull + private VibratorContainer vibrator; + + public OnClickListenerVibrator(@Nullable Vibrator vibrator, + @NotNull SharedPreferences preferences) { + this.vibrator = new VibratorContainer(vibrator, preferences, VIBRATION_TIME_SCALE); + } + + @Override + public void onClick(View v) { + vibrator.vibrate(); + } +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/Picker.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/Picker.java new file mode 100644 index 00000000..df585b85 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/Picker.java @@ -0,0 +1,283 @@ +/* + * Copyright (c) 2009-2011. Created by serso aka se.solovyev. + * For more information, please, contact se.solovyev@gmail.com + * or visit http://se.solovyev.org + */ + +package org.solovyev.android.view; + +/** + * User: serso + * Date: 9/18/11 + * Time: 10:03 PM + */ +/* + * 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. + */ + + +import android.content.Context; +import android.content.res.TypedArray; +import android.os.Handler; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.TextView; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * A view for selecting a number + *

+ * For a dialog using this view, see {@link android.app.TimePickerDialog}. + */ +public class Picker extends LinearLayout { + + public static interface OnChangedListener { + void onChanged(@NotNull Picker picker, @NotNull T value); + } + + public static interface Range { + + int getStartPosition(); + + int getCount(); + + @NotNull + String getStringValueAt(int position); + + @NotNull + T getValueAt(int position); + } + + + @NotNull + private final Handler uiHandler = new Handler(); + + @NotNull + private final Runnable runnable = new Runnable() { + public void run() { + if (increment) { + changeCurrent(current + 1); + uiHandler.postDelayed(this, speed); + } else if (decrement) { + changeCurrent(current - 1); + uiHandler.postDelayed(this, speed); + } + } + }; + + @NotNull + private final TextView text; + + @NotNull + private Range range; + + /** + * Current value of this NumberPicker + */ + private int current; + + + @Nullable + private OnChangedListener onChangedListener; + + private long speed = 300; + + private boolean increment; + + private boolean decrement; + + @NotNull + private final PickerButton incrementButton; + + @NotNull + private final PickerButton decrementButton; + + /** + * Create a new number picker + * + * @param context the application environment + */ + public Picker(Context context) { + this(context, null); + } + + /** + * Create a new number picker + * + * @param context the application environment + * @param attrs a collection of attributes + */ + public Picker(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.Picker); + + final int orientation = a.getInt(R.styleable.Picker_orientation, VERTICAL); + + setOrientation(orientation); + + // INFLATING LAYOUT + final LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); + if (orientation == HORIZONTAL) { + inflater.inflate(R.layout.number_picker_horizontal, this, true); + } else { + inflater.inflate(R.layout.number_picker, this, true); + } + + final OnClickListener clickListener = new OnClickListener() { + public void onClick(View v) { + // now perform the increment/decrement + if (R.id.increment == v.getId()) { + changeCurrent(current + 1); + } else if (R.id.decrement == v.getId()) { + changeCurrent(current - 1); + } + } + }; + + final OnLongClickListener longClickListener = new OnLongClickListener() { + /** + * We start the long click here but rely on the {@link PickerButton} + * to inform us when the long click has ended. + */ + public boolean onLongClick(View v) { + if (R.id.increment == v.getId()) { + increment = true; + uiHandler.post(runnable); + } else if (R.id.decrement == v.getId()) { + decrement = true; + uiHandler.post(runnable); + } + return true; + } + }; + + + incrementButton = (PickerButton) this.findViewById(R.id.increment); + incrementButton.setNumberPicker(this); + incrementButton.setOnClickListener(clickListener); + incrementButton.setOnLongClickListener(longClickListener); + + decrementButton = (PickerButton) this.findViewById(R.id.decrement); + decrementButton.setNumberPicker(this); + decrementButton.setOnClickListener(clickListener); + decrementButton.setOnLongClickListener(longClickListener); + + text = (TextView) this.findViewById(R.id.timepicker_input); + + if (!isEnabled()) { + setEnabled(false); + } + } + + /** + * Set the enabled state of this view. The interpretation of the enabled + * state varies by subclass. + * + * @param enabled True if this view is enabled, false otherwise. + */ + @Override + public void setEnabled(boolean enabled) { + super.setEnabled(enabled); + incrementButton.setEnabled(enabled); + decrementButton.setEnabled(enabled); + text.setEnabled(enabled); + } + + /** + * Set the callback that indicates the number has been adjusted by the user. + * + * @param listener the callback, should not be null. + */ + public void setOnChangeListener(OnChangedListener listener) { + this.onChangedListener = listener; + } + + public void setRange(@NotNull Range range) { + this.range = range; + this.current = range.getStartPosition(); + + updateView(); + } + + public void setCurrent(int current) { + if (current < 0 || current >= range.getCount()) { + throw new IllegalArgumentException( + "Current: " + current + " should be >= 0 and < " + range.getCount()); + } + this.current = current; + updateView(); + } + + /** + * Sets the speed at which the numbers will scroll when the +/- + * buttons are longpressed + * + * @param speed The speed (in milliseconds) at which the numbers will scroll + * default 300ms + */ + public void setSpeed(long speed) { + this.speed = speed; + } + + protected void changeCurrent(int current) { + + // Wrap around the values if we go past the start or end + if (current < 0) { + current = this.range.getCount() - 1; + } else if (current >= this.range.getCount()) { + current = 0; + } + + this.current = current; + + notifyChange(); + updateView(); + } + + private void notifyChange() { + if (onChangedListener != null) { + onChangedListener.onChanged(this, range.getValueAt(current)); + } + } + + private void updateView() { + text.setText(range.getStringValueAt(current)); + } + + /** + * @hide + */ + public void cancelIncrement() { + increment = false; + } + + /** + * @hide + */ + public void cancelDecrement() { + decrement = false; + } + + /** + * @return current position in Picker + */ + public int getCurrent() { + return current; + } +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/PickerButton.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/PickerButton.java new file mode 100644 index 00000000..959119f7 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/PickerButton.java @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2009-2011. Created by serso aka se.solovyev. + * For more information, please, contact se.solovyev@gmail.com + * or visit http://se.solovyev.org + */ + +package org.solovyev.android.view; + +/** + * User: serso + * Date: 9/18/11 + * Time: 10:04 PM + */ +/* + * 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. + */ + + +import android.content.Context; +import android.util.AttributeSet; +import android.view.KeyEvent; +import android.view.MotionEvent; +import android.widget.ImageButton; + +/** + * This class exists purely to cancel long click events, that got + * started in NumberPicker + */ +public class PickerButton extends ImageButton { + + private Picker numberPicker; + + public PickerButton(Context context, AttributeSet attrs, + int defStyle) { + super(context, attrs, defStyle); + } + + public PickerButton(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public PickerButton(Context context) { + super(context); + } + + public void setNumberPicker(Picker picker) { + numberPicker = picker; + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + cancelLongPressIfRequired(event); + return super.onTouchEvent(event); + } + + @Override + public boolean onTrackballEvent(MotionEvent event) { + cancelLongPressIfRequired(event); + return super.onTrackballEvent(event); + } + + @Override + public boolean onKeyUp(int keyCode, KeyEvent event) { + if ((keyCode == KeyEvent.KEYCODE_DPAD_CENTER) + || (keyCode == KeyEvent.KEYCODE_ENTER)) { + cancelLongpress(); + } + return super.onKeyUp(keyCode, event); + } + + private void cancelLongPressIfRequired(MotionEvent event) { + if ((event.getAction() == MotionEvent.ACTION_CANCEL) + || (event.getAction() == MotionEvent.ACTION_UP)) { + cancelLongpress(); + } + } + + private void cancelLongpress() { + if (R.id.increment == getId()) { + numberPicker.cancelIncrement(); + } else if (R.id.decrement == getId()) { + numberPicker.cancelDecrement(); + } + } + + public void onWindowFocusChanged(boolean hasWindowFocus) { + super.onWindowFocusChanged(hasWindowFocus); + if (!hasWindowFocus) { + cancelLongpress(); + } + } + +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/TextViewBuilder.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/TextViewBuilder.java new file mode 100644 index 00000000..a310f659 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/TextViewBuilder.java @@ -0,0 +1,58 @@ +package org.solovyev.android.view; + +import android.content.Context; +import android.view.View; +import android.widget.TextView; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * User: serso + * Date: 4/19/12 + * Time: 11:50 PM + */ +public class TextViewBuilder implements UpdatableViewBuilder { + + private int textViewLayoutId; + + @Nullable + private String tag; + + private TextViewBuilder() { + } + + @NotNull + public static UpdatableViewBuilder newInstance(int textViewLayoutId, @Nullable String tag) { + final TextViewBuilder result = new TextViewBuilder(); + + result.textViewLayoutId = textViewLayoutId; + result.tag = tag; + + return result; + } + + @NotNull + @Override + public TextView build(@NotNull Context context) { + final TextView result = ViewFromLayoutBuilder.newInstance(textViewLayoutId).build(context); + + result.setTag(createViewTag()); + + return updateView(context, result); + } + + @NotNull + private String createViewTag() { + return tag == null ? this.getClass().getName() : tag; + } + + @NotNull + @Override + public TextView updateView(@NotNull Context context, @NotNull View view) { + if (createViewTag().equals(view.getTag())) { + return (TextView) view; + } else { + return build(context); + } + } +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/VibratorContainer.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/VibratorContainer.java new file mode 100644 index 00000000..88c1d449 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/VibratorContainer.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2009-2011. Created by serso aka se.solovyev. + * For more information, please, contact se.solovyev@gmail.com + * or visit http://se.solovyev.org + */ + +package org.solovyev.android.view; + +import android.content.SharedPreferences; +import android.os.Vibrator; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.solovyev.android.prefs.BooleanPreference; +import org.solovyev.android.prefs.NumberToStringPreference; +import org.solovyev.android.prefs.Preference; + +/** + * User: serso + * Date: 10/26/11 + * Time: 11:40 PM + */ +public class VibratorContainer implements SharedPreferences.OnSharedPreferenceChangeListener { + + public static class Preferences { + public static final Preference hapticFeedbackEnabled = new BooleanPreference("org.solovyev.android.calculator.CalculatorModel_haptic_feedback", false); + public static final Preference hapticFeedbackDuration = new NumberToStringPreference("org.solovyev.android.calculator.CalculatorActivity_calc_haptic_feedback_duration_key", 60L, Long.class); + } + + private final float vibrationTimeScale; + + @Nullable + private final Vibrator vibrator; + + private long time = 0; + + public VibratorContainer(@Nullable Vibrator vibrator, @NotNull SharedPreferences preferences, float vibrationTimeScale) { + this.vibrator = vibrator; + this.vibrationTimeScale = vibrationTimeScale; + + preferences.registerOnSharedPreferenceChangeListener(this); + onSharedPreferenceChanged(preferences, null); + + } + + public void vibrate() { + if (time > 0 && vibrator != null) { + vibrator.vibrate(time); + } + } + + @Override + public void onSharedPreferenceChanged(SharedPreferences preferences, @Nullable String key) { + if ( Preferences.hapticFeedbackEnabled.getPreference(preferences)) { + //noinspection ConstantConditions + this.time = getScaledValue(Preferences.hapticFeedbackDuration.getPreference(preferences)); + } else { + this.time = 0; + } + } + + private long getScaledValue(long vibrationTime) { + return (long) (vibrationTime * vibrationTimeScale); + } +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ViewDef.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ViewDef.java new file mode 100644 index 00000000..b99c1470 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ViewDef.java @@ -0,0 +1,27 @@ +package org.solovyev.android.view; + +import org.jetbrains.annotations.Nullable; + +/** + * User: serso + * Date: 11/4/12 + * Time: 11:59 PM + */ +public interface ViewDef { + + @Nullable + Float getLayoutWeight(); + + @Nullable + Integer getLayoutMarginLeft(); + + @Nullable + Integer getLayoutMarginRight(); + + @Nullable + String getTag(); + + @Nullable + Integer getBackgroundResId(); + +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ViewFromLayoutBuilder.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ViewFromLayoutBuilder.java new file mode 100644 index 00000000..c51a7d90 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ViewFromLayoutBuilder.java @@ -0,0 +1,64 @@ +package org.solovyev.android.view; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * User: serso + * Date: 4/18/12 + * Time: 12:57 AM + */ +public class ViewFromLayoutBuilder implements ViewBuilder { + + private final int layoutId; + + private final int viewId; + + private final boolean wholeLayout; + + @Nullable + private LayoutInflater layoutInflater; + + private ViewFromLayoutBuilder(int layoutId, int viewId, boolean wholeLayout) { + this.layoutId = layoutId; + this.viewId = viewId; + this.wholeLayout = wholeLayout; + } + + @NotNull + public static ViewFromLayoutBuilder newInstance(int layoutId, int viewId) { + return new ViewFromLayoutBuilder(layoutId, viewId, false); + } + + @NotNull + public static ViewFromLayoutBuilder newInstance(int layoutId) { + return new ViewFromLayoutBuilder(layoutId, 0, true); + } + + public void setLayoutInflater(@Nullable LayoutInflater layoutInflater) { + this.layoutInflater = layoutInflater; + } + + @NotNull + @Override + public V build(@NotNull Context context) { + + LayoutInflater li = layoutInflater; + if (li == null) { + li = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + } + + if (wholeLayout) { + // if whole layout - just return view + return (V)li.inflate(layoutId, null); + } else { + // else try to find view by id + final ViewGroup itemView = (ViewGroup) li.inflate(layoutId, null); + return (V)itemView.findViewById(viewId); + } + } +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ViewGrayable.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ViewGrayable.java new file mode 100644 index 00000000..ef2af036 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ViewGrayable.java @@ -0,0 +1,15 @@ +package org.solovyev.android.view; + +import android.graphics.Canvas; +import android.view.View; +import org.jetbrains.annotations.NotNull; + +/** + * User: serso + * Date: 4/19/12 + * Time: 12:55 AM + */ +public interface ViewGrayable extends Grayable { + + void dispatchDraw(@NotNull View view, @NotNull Canvas canvas); +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DirectionDragButton.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DirectionDragButton.java new file mode 100644 index 00000000..4b31252b --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DirectionDragButton.java @@ -0,0 +1,462 @@ +/* + * Copyright (c) 2009-2011. Created by serso aka se.solovyev. + * For more information, please, contact se.solovyev@gmail.com + */ + +package org.solovyev.android.view.drag; + +import android.content.Context; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.text.TextPaint; +import android.util.AttributeSet; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.solovyev.android.view.R; +import org.solovyev.common.math.Point2d; +import org.solovyev.common.text.CollectionTransformations; +import org.solovyev.common.text.NumberParser; +import org.solovyev.common.text.StringUtils; + +import java.util.EnumMap; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * User: serso + * Date: 7/17/11 + * Time: 10:25 PM + */ +public class DirectionDragButton extends DragButton { + + @NotNull + private final static Float DEFAULT_DIRECTION_TEXT_SCALE_FLOAT = 0.33f; + + @NotNull + private final static Integer DEFAULT_DIRECTION_TEXT_ALPHA = 140; + + private final static int DEFAULT_DIRECTION_TEXT_COLOR = Color.WHITE; + + @NotNull + private final static String DEFAULT_DIRECTION_TEXT_SCALE = "0.33;0.33;0.33;0.33"; + + protected static class DirectionTextData { + + @NotNull + private final GuiDragDirection guiDragDirection; + + @NotNull + private String text; + + @NotNull + private Point2d position; + + @NotNull + private TextPaint paint; + + @NotNull + private Float textScale = 0.5f; + + private boolean showText = true; + + private DirectionTextData(@NotNull GuiDragDirection guiDragDirection, @NotNull String text) { + this.guiDragDirection = guiDragDirection; + this.text = text; + } + + @NotNull + public GuiDragDirection getGuiDragDirection() { + return guiDragDirection; + } + + @NotNull + public String getText() { + return text; + } + + public void setText(@NotNull String text) { + this.text = text; + } + + @NotNull + public Point2d getPosition() { + return position; + } + + public void setPosition(@NotNull Point2d position) { + this.position = position; + } + + @NotNull + public TextPaint getPaint() { + return paint; + } + + public void setPaint(@NotNull TextPaint paint) { + this.paint = paint; + } + + @NotNull + public Float getTextScale() { + return textScale; + } + + public void setTextScale(@NotNull Float textScale) { + this.textScale = textScale; + } + + public boolean isShowText() { + return showText; + } + + public void setShowText(boolean showText) { + this.showText = showText; + } + } + + protected static enum GuiDragDirection { + up(DragDirection.up, 0) { + @Override + public int getAttributeId() { + return R.styleable.DirectionDragButton_textUp; + } + + @NotNull + @Override + public Point2d getTextPosition(@NotNull Paint paint, @NotNull Paint basePaint, @NotNull CharSequence text, CharSequence baseText, int w, int h) { + return getUpDownTextPosition(paint, basePaint, text, baseText, 1, w, h); + } + }, + down(DragDirection.down, 2) { + @Override + public int getAttributeId() { + return R.styleable.DirectionDragButton_textDown; + } + + @NotNull + @Override + public Point2d getTextPosition(@NotNull Paint paint, @NotNull Paint basePaint, @NotNull CharSequence text, CharSequence baseText, int w, int h) { + return getUpDownTextPosition(paint, basePaint, text, baseText, -1, w, h); + } + }, + left(DragDirection.left, 3) { + @Override + public int getAttributeId() { + return R.styleable.DirectionDragButton_textLeft; + } + + @NotNull + @Override + public Point2d getTextPosition(@NotNull Paint paint, @NotNull Paint basePaint, @NotNull CharSequence text, CharSequence baseText, int w, int h) { + return getLeftRightTextPosition(paint, basePaint, text, baseText, w, h, true); + } + }, + + right(DragDirection.right, 1) { + @Override + public int getAttributeId() { + return R.styleable.DirectionDragButton_textRight; + } + + @NotNull + @Override + public Point2d getTextPosition(@NotNull Paint paint, @NotNull Paint basePaint, @NotNull CharSequence text, CharSequence baseText, int w, int h) { + return getLeftRightTextPosition(paint, basePaint, text, baseText, w, h, false); + } + }; + + @NotNull + private final DragDirection dragDirection; + + private final int attributePosition; + + GuiDragDirection(@NotNull DragDirection dragDirection, int attributePosition) { + this.dragDirection = dragDirection; + this.attributePosition = attributePosition; + } + + public abstract int getAttributeId(); + + public int getAttributePosition() { + return attributePosition; + } + + @NotNull + public abstract Point2d getTextPosition(@NotNull Paint paint, @NotNull Paint basePaint, @NotNull CharSequence text, CharSequence baseText, int w, int h); + + @NotNull + private static Point2d getLeftRightTextPosition(@NotNull Paint paint, @NotNull Paint basePaint, CharSequence text, @NotNull CharSequence baseText, int w, int h, boolean left) { + final Point2d result = new Point2d(); + + if (left) { + float width = paint.measureText(" "); + result.setX(width); + } else { + float width = paint.measureText(text.toString() + " "); + result.setX(w - width); + } + + float selfHeight = paint.ascent() + paint.descent(); + + basePaint.measureText(StringUtils.getNotEmpty(baseText, "|")); + + result.setY(h / 2 - selfHeight / 2); + + return result; + } + + @NotNull + private static Point2d getUpDownTextPosition(@NotNull Paint paint, @NotNull Paint basePaint, @NotNull CharSequence text, CharSequence baseText, float direction, int w, int h) { + final Point2d result = new Point2d(); + + float width = paint.measureText(text.toString() + " "); + result.setX(w - width); + + float selfHeight = paint.ascent() + paint.descent(); + + basePaint.measureText(StringUtils.getNotEmpty(baseText, "|")); + + if (direction < 0) { + result.setY(h / 2 + h / 3 - selfHeight / 2); + } else { + result.setY(h / 2 - h / 3 - selfHeight / 2); + } + + return result; + } + + @Nullable + public static GuiDragDirection valueOf(@NotNull DragDirection dragDirection) { + for (GuiDragDirection guiDragDirection : values()) { + if (guiDragDirection.dragDirection == dragDirection) { + return guiDragDirection; + } + } + return null; + } + } + + @NotNull + private final Map directionTextDataMap = new EnumMap(GuiDragDirection.class); + + @NotNull + private String directionTextScale = DEFAULT_DIRECTION_TEXT_SCALE; + + @NotNull + private Integer directionTextAlpha = DEFAULT_DIRECTION_TEXT_ALPHA; + + private int directionTextColor = DEFAULT_DIRECTION_TEXT_COLOR; + + private boolean initialized = false; + + public DirectionDragButton(Context context, @NotNull AttributeSet attrs) { + super(context, attrs); + init(context, attrs); + } + + public DirectionDragButton(Context context, @NotNull DirectionDragButtonDef directionDragButtonDef) { + super(context, directionDragButtonDef); + init(context, directionDragButtonDef); + } + + private void init(@NotNull Context context, + @NotNull DirectionDragButtonDef directionDragButtonDef) { + for (GuiDragDirection guiDragDirection : GuiDragDirection.values()) { + final CharSequence directionText = directionDragButtonDef.getText(guiDragDirection.dragDirection); + this.directionTextDataMap.put(guiDragDirection, new DirectionTextData(guiDragDirection, StringUtils.getNotEmpty(directionText, ""))); + } + + this.initialized = true; + } + + public void applyDef(@NotNull DirectionDragButtonDef directionDragButtonDef) { + super.applyDef(directionDragButtonDef); + + for (GuiDragDirection guiDragDirection : GuiDragDirection.values()) { + final CharSequence directionText = directionDragButtonDef.getText(guiDragDirection.dragDirection); + this.directionTextDataMap.put(guiDragDirection, new DirectionTextData(guiDragDirection, StringUtils.getNotEmpty(directionText, ""))); + } + } + + private void init(@NotNull Context context, @NotNull AttributeSet attrs) { + + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DirectionDragButton); + + for (int i = 0; i < a.getIndexCount(); i++) { + int attr = a.getIndex(i); + + if (a.hasValue(attr)) { + switch (attr) { + case R.styleable.DirectionDragButton_directionTextColor: + this.directionTextColor = a.getColor(attr, DEFAULT_DIRECTION_TEXT_COLOR); + break; + case R.styleable.DirectionDragButton_directionTextScale: + this.directionTextScale = a.getString(attr); + break; + case R.styleable.DirectionDragButton_directionTextAlpha: + this.directionTextAlpha = a.getInt(attr, DEFAULT_DIRECTION_TEXT_ALPHA); + break; + default: + // try drag direction text + for (GuiDragDirection guiDragDirection : GuiDragDirection.values()) { + if (guiDragDirection.getAttributeId() == attr) { + this.directionTextDataMap.put(guiDragDirection, new DirectionTextData(guiDragDirection, a.getString(attr))); + break; + } + } + break; + } + } + } + + for (Map.Entry entry : getDirectionTextScales().entrySet()) { + final DirectionTextData dtd = directionTextDataMap.get(entry.getKey()); + if (dtd != null) { + dtd.setTextScale(entry.getValue()); + } + } + + initialized = true; + } + + @Override + public void onSizeChanged(int w, int h, int oldW, int oldH) { + measureText(); + } + + @Override + protected void onTextChanged(CharSequence text, int start, int before, int after) { + measureText(); + } + + protected void measureText() { + + if (initialized) { + final Paint basePaint = getPaint(); + final Resources resources = getResources(); + + for (DirectionTextData directionTextData : directionTextDataMap.values()) { + initDirectionTextPaint(basePaint, directionTextData, resources); + + final GuiDragDirection guiDragDirection = directionTextData.getGuiDragDirection(); + final String directionText = directionTextData.getText(); + final Paint directionPaint = directionTextData.getPaint(); + + directionTextData.setPosition(guiDragDirection.getTextPosition(directionPaint, basePaint, directionText, getText(), getWidth(), getHeight())); + } + } + } + + + @Override + public void onDraw(Canvas canvas) { + super.onDraw(canvas); + + final TextPaint paint = getPaint(); + final Resources resources = getResources(); + + for (DirectionTextData directionTextData : directionTextDataMap.values()) { + if (directionTextData.isShowText()) { + initDirectionTextPaint(paint, directionTextData, resources); + final String text = directionTextData.getText(); + final Point2d position = directionTextData.getPosition(); + canvas.drawText(text, 0, text.length(), position.getX(), position.getY(), directionTextData.getPaint()); + } + } + } + + protected void initDirectionTextPaint(@NotNull Paint basePaint, + @NotNull DirectionTextData directionTextData, + @NotNull Resources resources) { + final TextPaint directionTextPaint = new TextPaint(basePaint); + + directionTextPaint.setColor(directionTextColor); + directionTextPaint.setAlpha(getDirectionTextAlpha()); + directionTextPaint.setTextSize(basePaint.getTextSize() * directionTextData.getTextScale()); + + directionTextData.setPaint(directionTextPaint); + } + + protected int getDirectionTextAlpha() { + return directionTextAlpha; + } + + @SuppressWarnings("UnusedDeclaration") + @Nullable + public String getTextUp() { + return getText(GuiDragDirection.up); + } + + @SuppressWarnings("UnusedDeclaration") + @Nullable + public String getTextDown() { + return getText(GuiDragDirection.down); + } + + @Nullable + public String getText(@NotNull DragDirection direction) { + final GuiDragDirection guiDragDirection = GuiDragDirection.valueOf(direction); + return guiDragDirection == null ? null : getText(guiDragDirection); + } + + @SuppressWarnings("UnusedDeclaration") + public void showDirectionText(boolean showDirectionText, @NotNull DragDirection direction) { + final GuiDragDirection guiDragDirection = GuiDragDirection.valueOf(direction); + final DirectionTextData directionTextData = this.directionTextDataMap.get(guiDragDirection); + if ( directionTextData != null ) { + directionTextData.setShowText(showDirectionText); + } + } + + @Nullable + private String getText(@NotNull GuiDragDirection direction) { + DirectionTextData directionTextData = this.directionTextDataMap.get(direction); + if ( directionTextData == null ) { + return null; + } else { + if ( directionTextData.isShowText() ) { + return directionTextData.getText(); + } else { + return null; + } + } + } + + + @NotNull + public String getDirectionTextScale() { + return directionTextScale; + } + + @NotNull + private Map getDirectionTextScales() { + final List scales = CollectionTransformations.split(getDirectionTextScale(), ";", NumberParser.getParser(Float.class)); + + final Map result = new HashMap(); + for (GuiDragDirection guiDragDirection : GuiDragDirection.values()) { + result.put(guiDragDirection, DEFAULT_DIRECTION_TEXT_SCALE_FLOAT); + } + + if (scales.size() == 1) { + final Float scale = scales.get(0); + for (Map.Entry entry : result.entrySet()) { + entry.setValue(scale); + } + } else { + for (int i = 0; i < scales.size(); i++) { + for (GuiDragDirection guiDragDirection : GuiDragDirection.values()) { + if (guiDragDirection.getAttributePosition() == i) { + result.put(guiDragDirection, scales.get(i)); + } + } + } + } + + return result; + } + +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DirectionDragButtonDef.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DirectionDragButtonDef.java new file mode 100644 index 00000000..1e7767fb --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DirectionDragButtonDef.java @@ -0,0 +1,15 @@ +package org.solovyev.android.view.drag; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * User: serso + * Date: 11/3/12 + * Time: 1:51 PM + */ +public interface DirectionDragButtonDef extends DragButtonDef { + + @Nullable + CharSequence getText(@NotNull DragDirection dragDirection); +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DirectionDragButtonDefImpl.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DirectionDragButtonDefImpl.java new file mode 100644 index 00000000..9f32e082 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DirectionDragButtonDefImpl.java @@ -0,0 +1,175 @@ +package org.solovyev.android.view.drag; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.EnumMap; +import java.util.Map; + +/** + * User: serso + * Date: 11/3/12 + * Time: 1:57 PM + */ +public class DirectionDragButtonDefImpl implements DirectionDragButtonDef { + + @Nullable + private CharSequence text; + + private Map directionsTexts = new EnumMap(DragDirection.class); + + @Nullable + private Integer backgroundResId; + + @Nullable + private Integer drawableResId; + + @Nullable + private String tag; + + @Nullable + private Float weight; + + @Nullable + private Integer layoutMarginLeft; + + @Nullable + private Integer layoutMarginRight; + + private DirectionDragButtonDefImpl() { + } + + @NotNull + public static DirectionDragButtonDefImpl newInstance(@Nullable CharSequence text) { + return newInstance(text, null, null, null, null); + } + + @NotNull + public static DirectionDragButtonDefImpl newInstance(@Nullable CharSequence text, + @Nullable CharSequence up, + @Nullable CharSequence right, + @Nullable CharSequence down, + @Nullable CharSequence left) { + return newInstance(text, up, right, down, left, null); + } + + @NotNull + public static DirectionDragButtonDefImpl newInstance(@Nullable CharSequence text, + @Nullable CharSequence up, + @Nullable CharSequence right, + @Nullable CharSequence down, + @Nullable CharSequence left, + @Nullable Integer backgroundColor) { + final DirectionDragButtonDefImpl result = new DirectionDragButtonDefImpl(); + + result.text = text; + result.directionsTexts.put(DragDirection.up, up); + result.directionsTexts.put(DragDirection.right, right); + result.directionsTexts.put(DragDirection.down, down); + result.directionsTexts.put(DragDirection.left, left); + + result.backgroundResId = backgroundColor; + + return result; + } + + @NotNull + public static DirectionDragButtonDefImpl newDrawableInstance(@NotNull Integer drawableResId) { + return newDrawableInstance(drawableResId, null); + } + + @NotNull + public static DirectionDragButtonDefImpl newDrawableInstance(@NotNull Integer drawableResId, @Nullable Integer backgroundColor) { + final DirectionDragButtonDefImpl result = new DirectionDragButtonDefImpl(); + + result.drawableResId = drawableResId; + result.backgroundResId = backgroundColor; + + return result; + + } + + @Nullable + @Override + public CharSequence getText(@NotNull DragDirection dragDirection) { + return directionsTexts.get(dragDirection); + } + + @Nullable + @Override + public Float getLayoutWeight() { + return this.weight; + } + + @Nullable + @Override + public Integer getLayoutMarginLeft() { + return this.layoutMarginLeft; + } + + @Nullable + @Override + public Integer getLayoutMarginRight() { + return this.layoutMarginRight; + } + + @Nullable + @Override + public Integer getDrawableResId() { + return this.drawableResId; + } + + @Nullable + @Override + public String getTag() { + return tag; + } + + @Nullable + @Override + public Integer getBackgroundResId() { + return this.backgroundResId; + } + + @Nullable + @Override + public CharSequence getText() { + return text; + } + + public void setWeight(@Nullable Float weight) { + this.weight = weight; + } + + public void setLayoutMarginRight(@Nullable Integer layoutMarginRight) { + this.layoutMarginRight = layoutMarginRight; + } + + public void setLayoutMarginLeft(@Nullable Integer layoutMarginLeft) { + this.layoutMarginLeft = layoutMarginLeft; + } + + public void setBackgroundResId(int backgroundResId) { + this.backgroundResId = backgroundResId; + } + + public void setTag(@Nullable String tag) { + this.tag = tag; + } + + public void setText(@Nullable CharSequence text) { + this.text = text; + } + + public void setBackgroundResId(@Nullable Integer backgroundResId) { + this.backgroundResId = backgroundResId; + } + + public void setDrawableResId(@Nullable Integer drawableResId) { + this.drawableResId = drawableResId; + } + + public void setDirectionText(@NotNull DragDirection key, @Nullable CharSequence text) { + directionsTexts.put(key, text); + } +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DragButton.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DragButton.java new file mode 100644 index 00000000..27872469 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DragButton.java @@ -0,0 +1,164 @@ +/* + * Copyright (c) 2009-2011. Created by serso aka se.solovyev. + * For more information, please, contact se.solovyev@gmail.com + */ + +package org.solovyev.android.view.drag; + +import android.content.Context; +import android.graphics.Canvas; +import android.os.Handler; +import android.util.AttributeSet; +import android.util.Log; +import android.view.MotionEvent; +import android.view.View; +import android.widget.Button; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.solovyev.android.view.AndroidViewUtils; +import org.solovyev.common.math.Point2d; +import org.solovyev.common.text.StringUtils; + +public class DragButton extends Button { + + @Nullable + private Point2d startPoint = null; + + @Nullable + private org.solovyev.android.view.drag.OnDragListener onDragListener; + + @NotNull + private DragButton.OnTouchListenerImpl onTouchListener; + + private boolean showText = true; + + @NotNull + private final Handler uiHandler = new Handler(); + + @Nullable + private CharSequence textBackup; + + public DragButton(@NotNull Context context, @NotNull AttributeSet attrs) { + super(context, attrs); + setOnTouchListener(new OnTouchListenerImpl()); + } + + public DragButton(@NotNull Context context, @NotNull DragButtonDef dragButtonDef) { + super(context); + + setOnTouchListener(new OnTouchListenerImpl()); + + setText(dragButtonDef.getText()); + } + + public void setOnDragListener(@Nullable org.solovyev.android.view.drag.OnDragListener onDragListener) { + this.onDragListener = onDragListener; + } + + @Nullable + public org.solovyev.android.view.drag.OnDragListener getOnDragListener() { + return onDragListener; + } + + public void applyDef(@NotNull DragButtonDef buttonDef) { + AndroidViewUtils.applyButtonDef(this, buttonDef); + } + + @Override + public void setOnTouchListener(OnTouchListener l) { + if (l instanceof OnTouchListenerImpl) { + this.onTouchListener = (OnTouchListenerImpl) l; + super.setOnTouchListener(l); + } else { + this.onTouchListener.nestedOnTouchListener = l; + } + } + + /** + * OnTouchListener implementation that fires onDrag() + * + * @author serso + */ + private final class OnTouchListenerImpl implements OnTouchListener { + + @Nullable + private OnTouchListener nestedOnTouchListener; + + @Override + public boolean onTouch(@NotNull View v, @NotNull MotionEvent event) { + // processing on touch event + + boolean consumed = false; + + // in order to avoid possible NPEs + final Point2d localStartPoint = startPoint; + final org.solovyev.android.view.drag.OnDragListener localOnDragListener = onDragListener; + + if (localOnDragListener != null) { + // only if onDrag() listener specified + + Log.d(String.valueOf(getId()), "onTouch() for: " + getId() + " . Motion event: " + event); + + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + // start tracking: set start point + startPoint = new Point2d(event.getX(), event.getY()); + break; + + case MotionEvent.ACTION_UP: + // stop tracking + + if (localStartPoint != null) { + consumed = localOnDragListener.onDrag(DragButton.this, new DragEvent(localStartPoint, event)); + + if (consumed) { + if (localOnDragListener.isSuppressOnClickEvent()) { + // prevent on click action + v.setPressed(false); + } + } + } + + startPoint = null; + break; + } + } + + if (nestedOnTouchListener != null && !consumed) { + return nestedOnTouchListener.onTouch(v, event); + } else { + return consumed; + } + } + } + + @Override + protected void onDraw(Canvas canvas) { + CharSequence text = getText(); + if (!StringUtils.isEmpty(text)) { + super.onDraw(canvas); + } else { + if (!AndroidViewUtils.drawDrawables(canvas, this)) { + super.onDraw(canvas); + } + } + } + + + public boolean isShowText() { + return showText; + } + + public void setShowText(boolean showText) { + if (this.showText != showText) { + if ( showText ) { + setText(textBackup); + textBackup = null; + } else { + textBackup = this.getText(); + setText(null); + } + this.showText = showText; + } + } +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DragButtonDef.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DragButtonDef.java new file mode 100644 index 00000000..7c22ec7e --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DragButtonDef.java @@ -0,0 +1,11 @@ +package org.solovyev.android.view.drag; + +import org.solovyev.android.view.ButtonDef; + +/** + * User: serso + * Date: 11/3/12 + * Time: 1:51 PM + */ +public interface DragButtonDef extends ButtonDef { +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DragDirection.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DragDirection.java new file mode 100644 index 00000000..501142c5 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DragDirection.java @@ -0,0 +1,14 @@ +/* + * Copyright (c) 2009-2011. Created by serso aka se.solovyev. + * For more information, please, contact se.solovyev@gmail.com + */ + +package org.solovyev.android.view.drag; + +public enum DragDirection { + + up, + down, + left, + right; +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DragEvent.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DragEvent.java new file mode 100644 index 00000000..6445a418 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DragEvent.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2009-2011. Created by serso aka se.solovyev. + * For more information, please, contact se.solovyev@gmail.com + */ + +package org.solovyev.android.view.drag; + +import android.view.MotionEvent; +import org.jetbrains.annotations.NotNull; +import org.solovyev.common.math.Point2d; + +public class DragEvent { + + @NotNull + private final Point2d startPoint; + + @NotNull + private final MotionEvent motionEvent; + + public DragEvent(@NotNull Point2d startPoint, @NotNull MotionEvent motionEvent) { + this.startPoint = startPoint; + this.motionEvent = motionEvent; + } + + /** + * @return motion event started at start point + */ + @NotNull + public MotionEvent getMotionEvent() { + return motionEvent; + } + + /** + * @return start point of dragging + */ + @NotNull + public Point2d getStartPoint() { + return startPoint; + } + + +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DragPreferencesChangeListener.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DragPreferencesChangeListener.java new file mode 100644 index 00000000..a8ec5d24 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DragPreferencesChangeListener.java @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2009-2011. Created by serso aka se.solovyev. + * For more information, please, contact se.solovyev@gmail.com + */ + +package org.solovyev.android.view.drag; + +import org.jetbrains.annotations.NotNull; + +import java.util.EventListener; + +/** + * User: serso + * Date: 9/18/11 + * Time: 8:48 PM + */ +public interface DragPreferencesChangeListener extends EventListener{ + + void onDragPreferencesChange(@NotNull SimpleOnDragListener.Preferences preferences ); +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/OnDragListener.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/OnDragListener.java new file mode 100644 index 00000000..b4fd07ce --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/OnDragListener.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2009-2011. Created by serso aka se.solovyev. + * For more information, please, contact se.solovyev@gmail.com + */ + +package org.solovyev.android.view.drag; + +import org.jetbrains.annotations.NotNull; + +import java.util.EventListener; + + +public interface OnDragListener extends EventListener{ + + /** + * + * @return 'true': if drag event has taken place (i.e. onDrag() method returned true) then click action will be suppresed + */ + boolean isSuppressOnClickEvent(); + + /** + * @param dragButton drag button object for which onDrag listener was set + * @param event drag event + * + * @return 'true' if drag event occurred, 'false' otherwise + */ + boolean onDrag(@NotNull DragButton dragButton, @NotNull DragEvent event); + +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/OnDragListenerWrapper.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/OnDragListenerWrapper.java new file mode 100644 index 00000000..94513e3d --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/OnDragListenerWrapper.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2009-2011. Created by serso aka se.solovyev. + * For more information, please, contact se.solovyev@gmail.com + * or visit http://se.solovyev.org + */ + +package org.solovyev.android.view.drag; + +import org.jetbrains.annotations.NotNull; + +/** +* User: serso +* Date: 10/26/11 +* Time: 10:37 PM +*/ +public class OnDragListenerWrapper implements OnDragListener { + + @NotNull + private final OnDragListener onDragListener; + + public OnDragListenerWrapper(@NotNull OnDragListener onDragListener) { + this.onDragListener = onDragListener; + } + + @Override + public boolean isSuppressOnClickEvent() { + return this.onDragListener.isSuppressOnClickEvent(); + } + + @Override + public boolean onDrag(@NotNull DragButton dragButton, @NotNull DragEvent event) { + return this.onDragListener.onDrag(dragButton, event); + } +} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/SimpleOnDragListener.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/SimpleOnDragListener.java new file mode 100644 index 00000000..cec8a3fc --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/SimpleOnDragListener.java @@ -0,0 +1,327 @@ +/* + * Copyright (c) 2009-2011. Created by serso aka se.solovyev. + * For more information, please, contact se.solovyev@gmail.com + */ + +package org.solovyev.android.view.drag; + +import android.content.Context; +import android.content.SharedPreferences; +import android.util.Log; +import android.view.MotionEvent; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.solovyev.android.view.R; +import org.solovyev.common.MutableObject; +import org.solovyev.common.interval.Interval; +import org.solovyev.common.interval.IntervalImpl; +import org.solovyev.common.math.MathUtils; +import org.solovyev.common.math.Point2d; +import org.solovyev.common.text.Mapper; +import org.solovyev.common.text.NumberIntervalMapper; + +import java.util.HashMap; +import java.util.Map; + +public class SimpleOnDragListener implements OnDragListener, DragPreferencesChangeListener { + + @NotNull + public static final Point2d axis = new Point2d(0, 1); + + @NotNull + private DragProcessor dragProcessor; + + @NotNull + private Preferences preferences; + + public SimpleOnDragListener(@NotNull Preferences preferences) { + this.preferences = preferences; + } + + public SimpleOnDragListener(@NotNull DragProcessor dragProcessor, @NotNull Preferences preferences) { + this.dragProcessor = dragProcessor; + this.preferences = preferences; + } + + @Override + public boolean onDrag(@NotNull DragButton dragButton, @NotNull DragEvent event) { + boolean result = false; + + logDragEvent(dragButton, event); + + final Point2d startPoint = event.getStartPoint(); + final MotionEvent motionEvent = event.getMotionEvent(); + + // init end point + final Point2d endPoint = new Point2d(motionEvent.getX(), motionEvent.getY()); + + final float distance = MathUtils.getDistance(startPoint, endPoint); + + final MutableObject right = new MutableObject(); + final double angle = Math.toDegrees(MathUtils.getAngle(startPoint, MathUtils.sum(startPoint, axis), endPoint, right)); + Log.d(String.valueOf(dragButton.getId()), "Angle: " + angle); + Log.d(String.valueOf(dragButton.getId()), "Is right?: " + right.getObject()); + + final double duration = motionEvent.getEventTime() - motionEvent.getDownTime(); + + final Preference distancePreferences = preferences.getPreferencesMap().get(PreferenceType.distance); + final Preference anglePreferences = preferences.getPreferencesMap().get(PreferenceType.angle); + + DragDirection direction = null; + for (Map.Entry directionEntry : distancePreferences.getDirectionPreferences().entrySet()) { + + Log.d(String.valueOf(dragButton.getId()), "Drag direction: " + directionEntry.getKey()); + Log.d(String.valueOf(dragButton.getId()), "Trying direction interval: " + directionEntry.getValue().getInterval()); + + if (directionEntry.getValue().getInterval().contains(distance)) { + final DragPreference anglePreference = anglePreferences.getDirectionPreferences().get(directionEntry.getKey()); + + Log.d(String.valueOf(dragButton.getId()), "Trying angle interval: " + anglePreference.getInterval()); + + if (directionEntry.getKey() == DragDirection.left && right.getObject()) { + } else if (directionEntry.getKey() == DragDirection.right && !right.getObject()) { + } else { + if (anglePreference.getInterval().contains((float) angle)) { + direction = directionEntry.getKey(); + Log.d(String.valueOf(dragButton.getId()), "MATCH! Direction: " + direction); + break; + } + } + } + + } + + if (direction != null) { + final Preference durationPreferences = preferences.getPreferencesMap().get(PreferenceType.duration); + + final DragPreference durationDragPreferences = durationPreferences.getDirectionPreferences().get(direction); + + Log.d(String.valueOf(dragButton.getId()), "Trying time interval: " + durationDragPreferences.getInterval()); + if (durationDragPreferences.getInterval().contains((float) duration)) { + Log.d(String.valueOf(dragButton.getId()), "MATCH!"); + result = dragProcessor.processDragEvent(direction, dragButton, startPoint, motionEvent); + } + } + + return result; + } + + @Override + public boolean isSuppressOnClickEvent() { + return true; + } + + private void logDragEvent(@NotNull DragButton dragButton, @NotNull DragEvent event) { + final Point2d startPoint = event.getStartPoint(); + final MotionEvent motionEvent = event.getMotionEvent(); + final Point2d endPoint = new Point2d(motionEvent.getX(), motionEvent.getY()); + + Log.d(String.valueOf(dragButton.getId()), "Start point: " + startPoint + ", End point: " + endPoint); + Log.d(String.valueOf(dragButton.getId()), "Distance: " + MathUtils.getDistance(startPoint, endPoint)); + final MutableObject right = new MutableObject(); + Log.d(String.valueOf(dragButton.getId()), "Angle: " + Math.toDegrees(MathUtils.getAngle(startPoint, MathUtils.sum(startPoint, axis), endPoint, right))); + Log.d(String.valueOf(dragButton.getId()), "Is right angle? " + right); + Log.d(String.valueOf(dragButton.getId()), "Axis: " + axis + " Vector: " + MathUtils.subtract(endPoint, startPoint)); + Log.d(String.valueOf(dragButton.getId()), "Total time: " + (motionEvent.getEventTime() - motionEvent.getDownTime()) + " ms"); + } + + @NotNull + public DragProcessor getDragProcessor() { + return dragProcessor; + } + + public void setDragProcessor(@NotNull DragProcessor dragProcessor) { + this.dragProcessor = dragProcessor; + } + + @Override + public void onDragPreferencesChange(@NotNull Preferences preferences) { + this.preferences = preferences; + } + + public interface DragProcessor { + + boolean processDragEvent(@NotNull DragDirection dragDirection, @NotNull DragButton dragButton, @NotNull Point2d startPoint2d, @NotNull MotionEvent motionEvent); + } + + // todo serso: currently we do not use direction + public static String getPreferenceId(@NotNull PreferenceType preferenceType, @NotNull DragDirection direction) { + return "org.solovyev.android.calculator.DragButtonCalibrationActivity" + "_" + preferenceType.name() /*+ "_" + direction.name()*/; + } + + @NotNull + public static Preferences getDefaultPreferences(@NotNull Context context) { + return getPreferences0(null, context); + } + + @NotNull + public static Preferences getPreferences(@NotNull final SharedPreferences preferences, @NotNull Context context) { + return getPreferences0(preferences, context); + } + + @NotNull + private static Preferences getPreferences0(@Nullable final SharedPreferences preferences, @NotNull Context context) { + + final Mapper> mapper = new NumberIntervalMapper(Float.class); + + final Preferences result = new Preferences(); + + for (PreferenceType preferenceType : PreferenceType.values()) { + for (DragDirection dragDirection : DragDirection.values()) { + + final String preferenceId = getPreferenceId(preferenceType, dragDirection); + + final String defaultValue; + switch (preferenceType) { + case angle: + defaultValue = context.getResources().getString(R.string.p_drag_angle); + break; + case distance: + defaultValue = context.getResources().getString(R.string.p_drag_distance); + break; + case duration: + defaultValue = context.getResources().getString(R.string.p_drag_duration); + break; + default: + defaultValue = null; + Log.e(SimpleOnDragListener.class.getName(), "New preference type added: default preferences should be defined. Preference id: " + preferenceId); + } + + final String value = preferences == null ? defaultValue : preferences.getString(preferenceId, defaultValue); + + if (value != null) { + final Interval intervalPref = transformInterval(preferenceType, dragDirection, mapper.parseValue(value)); + + Log.d(SimpleOnDragListener.class.getName(), "Preference loaded for " + dragDirection +". Id: " + preferenceId + ", value: " + intervalPref.toString()); + + final DragPreference directionPreference = new DragPreference(dragDirection, intervalPref); + + Preference preference = result.getPreferencesMap().get(preferenceType); + if (preference == null) { + preference = new Preference(preferenceType); + result.getPreferencesMap().put(preferenceType, preference); + } + + preference.getDirectionPreferences().put(dragDirection, directionPreference); + } + } + } + + return result; + } + + @NotNull + public static Interval transformInterval(@NotNull PreferenceType preferenceType, + @NotNull DragDirection dragDirection, + @NotNull Interval interval) { + + if (preferenceType == PreferenceType.angle) { + final Float leftLimit = interval.getLeftLimit(); + final Float rightLimit = interval.getRightLimit(); + + if (leftLimit != null && rightLimit != null) { + final Float newLeftLimit; + final Float newRightLimit; + + if (dragDirection == DragDirection.up) { + newLeftLimit = 180f - rightLimit; + newRightLimit = 180f - leftLimit; + } else if (dragDirection == DragDirection.left) { + newLeftLimit = 90f - rightLimit; + newRightLimit = 90f + rightLimit; + } else if (dragDirection == DragDirection.right) { + newLeftLimit = 90f - rightLimit; + newRightLimit = 90f + rightLimit; + } else { + newLeftLimit = leftLimit; + newRightLimit = rightLimit; + } + + return IntervalImpl.newClosed(newLeftLimit, newRightLimit); + } + } + + return interval; + } + + + public static enum PreferenceType { + angle, + distance, + duration + } + + public static class DragPreference { + + @NotNull + private DragDirection direction; + + @NotNull + private Interval interval; + + + public DragPreference(@NotNull DragDirection direction, @NotNull Interval interval) { + this.direction = direction; + this.interval = interval; + } + + @NotNull + public DragDirection getDirection() { + return direction; + } + + public void setDirection(@NotNull DragDirection direction) { + this.direction = direction; + } + + @NotNull + public Interval getInterval() { + return interval; + } + + public void setInterval(@NotNull Interval interval) { + this.interval = interval; + } + } + + public static class Preference { + + @NotNull + private PreferenceType preferenceType; + + @NotNull + private Map directionPreferences = new HashMap(); + + + public Preference(@NotNull PreferenceType preferenceType) { + this.preferenceType = preferenceType; + } + + @NotNull + public PreferenceType getPreferenceType() { + return preferenceType; + } + + public void setPreferenceType(@NotNull PreferenceType preferenceType) { + this.preferenceType = preferenceType; + } + + @NotNull + public Map getDirectionPreferences() { + return directionPreferences; + } + + public void setDirectionPreferences(@NotNull Map directionPreferences) { + this.directionPreferences = directionPreferences; + } + } + + public static class Preferences { + + private final Map preferencesMap = new HashMap(); + + public Map getPreferencesMap() { + return preferencesMap; + } + } +} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/scroll/ScrollViewState.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/scroll/ScrollViewState.java new file mode 100644 index 00000000..03150983 --- /dev/null +++ b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/scroll/ScrollViewState.java @@ -0,0 +1,51 @@ +package org.solovyev.android.view.scroll; + +import android.os.Bundle; +import android.widget.ScrollView; +import org.jetbrains.annotations.NotNull; + +import java.io.Serializable; + +/** + * User: serso + * Date: 8/5/12 + * Time: 2:09 AM + */ +public class ScrollViewState implements Serializable { + + @NotNull + private static final String SCROLL_VIEW_STATE = "scroll_view_state"; + + private int scrollX = 0; + + private int scrollY = 0; + + public ScrollViewState() { + } + + public ScrollViewState(@NotNull ScrollView scrollView) { + this.scrollX = scrollView.getScrollX(); + this.scrollY = scrollView.getScrollY(); + } + + public void restoreState(@NotNull final ScrollView scrollView) { + scrollView.post(new Runnable() { + @Override + public void run() { + scrollView.scrollTo(scrollX, scrollY); + } + }); + + } + + public static void saveState(@NotNull Bundle out, @NotNull final ScrollView scrollView) { + out.putSerializable(SCROLL_VIEW_STATE, new ScrollViewState(scrollView)); + } + + public static void restoreState(@NotNull Bundle in, @NotNull final ScrollView scrollView) { + final Object o = in.getSerializable(SCROLL_VIEW_STATE); + if (o instanceof ScrollViewState) { + ((ScrollViewState) o).restoreState(scrollView); + } + } +} diff --git a/app-android/misc/doc/GoogleAdMobAdsSdk-4.3.1-javadocs.zip b/android-app/misc/doc/GoogleAdMobAdsSdk-4.3.1-javadocs.zip similarity index 100% rename from app-android/misc/doc/GoogleAdMobAdsSdk-4.3.1-javadocs.zip rename to android-app/misc/doc/GoogleAdMobAdsSdk-4.3.1-javadocs.zip diff --git a/app-android/misc/doc/achartengine-0.7.0-javadocs.zip b/android-app/misc/doc/achartengine-0.7.0-javadocs.zip similarity index 100% rename from app-android/misc/doc/achartengine-0.7.0-javadocs.zip rename to android-app/misc/doc/achartengine-0.7.0-javadocs.zip diff --git a/app-android/misc/lib/GoogleAdMobAdsSdk-4.3.1.jar b/android-app/misc/lib/GoogleAdMobAdsSdk-4.3.1.jar similarity index 100% rename from app-android/misc/lib/GoogleAdMobAdsSdk-4.3.1.jar rename to android-app/misc/lib/GoogleAdMobAdsSdk-4.3.1.jar diff --git a/app-android/misc/lib/achartengine-0.7.0.jar b/android-app/misc/lib/achartengine-0.7.0.jar similarity index 100% rename from app-android/misc/lib/achartengine-0.7.0.jar rename to android-app/misc/lib/achartengine-0.7.0.jar diff --git a/app-android/misc/lib/achartengine-0.7.1.jar b/android-app/misc/lib/achartengine-0.7.1.jar similarity index 100% rename from app-android/misc/lib/achartengine-0.7.1.jar rename to android-app/misc/lib/achartengine-0.7.1.jar diff --git a/app-android/misc/other/prepare_avds.sh b/android-app/misc/other/prepare_avds.sh similarity index 100% rename from app-android/misc/other/prepare_avds.sh rename to android-app/misc/other/prepare_avds.sh diff --git a/app-android/misc/other/remove_avds.sh b/android-app/misc/other/remove_avds.sh similarity index 100% rename from app-android/misc/other/remove_avds.sh rename to android-app/misc/other/remove_avds.sh diff --git a/app-android/misc/other/take_screenshots.py b/android-app/misc/other/take_screenshots.py similarity index 100% rename from app-android/misc/other/take_screenshots.py rename to android-app/misc/other/take_screenshots.py diff --git a/app-android/misc/other/take_screenshots.sh b/android-app/misc/other/take_screenshots.sh similarity index 100% rename from app-android/misc/other/take_screenshots.sh rename to android-app/misc/other/take_screenshots.sh diff --git a/app-android/misc/other/take_screenshots2.sh b/android-app/misc/other/take_screenshots2.sh similarity index 100% rename from app-android/misc/other/take_screenshots2.sh rename to android-app/misc/other/take_screenshots2.sh diff --git a/app-android/misc/other/wait_device.py b/android-app/misc/other/wait_device.py similarity index 100% rename from app-android/misc/other/wait_device.py rename to android-app/misc/other/wait_device.py diff --git a/app-android/misc/res/calculatorpp/01_main_screen_port.png b/android-app/misc/res/calculatorpp/01_main_screen_port.png similarity index 100% rename from app-android/misc/res/calculatorpp/01_main_screen_port.png rename to android-app/misc/res/calculatorpp/01_main_screen_port.png diff --git a/app-android/misc/res/calculatorpp/01_main_screen_port_sm.png b/android-app/misc/res/calculatorpp/01_main_screen_port_sm.png similarity index 100% rename from app-android/misc/res/calculatorpp/01_main_screen_port_sm.png rename to android-app/misc/res/calculatorpp/01_main_screen_port_sm.png diff --git a/app-android/misc/res/calculatorpp/02_main_screen_land.png b/android-app/misc/res/calculatorpp/02_main_screen_land.png similarity index 100% rename from app-android/misc/res/calculatorpp/02_main_screen_land.png rename to android-app/misc/res/calculatorpp/02_main_screen_land.png diff --git a/app-android/misc/res/calculatorpp/03_main_screen_port_with_expression.png b/android-app/misc/res/calculatorpp/03_main_screen_port_with_expression.png similarity index 100% rename from app-android/misc/res/calculatorpp/03_main_screen_port_with_expression.png rename to android-app/misc/res/calculatorpp/03_main_screen_port_with_expression.png diff --git a/app-android/misc/res/calculatorpp/04_plot_graph_menu.png b/android-app/misc/res/calculatorpp/04_plot_graph_menu.png similarity index 100% rename from app-android/misc/res/calculatorpp/04_plot_graph_menu.png rename to android-app/misc/res/calculatorpp/04_plot_graph_menu.png diff --git a/app-android/misc/res/calculatorpp/04_plot_graph_menu_sm.png b/android-app/misc/res/calculatorpp/04_plot_graph_menu_sm.png similarity index 100% rename from app-android/misc/res/calculatorpp/04_plot_graph_menu_sm.png rename to android-app/misc/res/calculatorpp/04_plot_graph_menu_sm.png diff --git a/app-android/misc/res/calculatorpp/05_graph_screen.png b/android-app/misc/res/calculatorpp/05_graph_screen.png similarity index 100% rename from app-android/misc/res/calculatorpp/05_graph_screen.png rename to android-app/misc/res/calculatorpp/05_graph_screen.png diff --git a/app-android/misc/res/calculatorpp/05_graph_screen_sm.png b/android-app/misc/res/calculatorpp/05_graph_screen_sm.png similarity index 100% rename from app-android/misc/res/calculatorpp/05_graph_screen_sm.png rename to android-app/misc/res/calculatorpp/05_graph_screen_sm.png diff --git a/app-android/misc/res/calculatorpp/06_constants_screen.png b/android-app/misc/res/calculatorpp/06_constants_screen.png similarity index 100% rename from app-android/misc/res/calculatorpp/06_constants_screen.png rename to android-app/misc/res/calculatorpp/06_constants_screen.png diff --git a/app-android/misc/res/calculatorpp/06_constants_screen_sm.png b/android-app/misc/res/calculatorpp/06_constants_screen_sm.png similarity index 100% rename from app-android/misc/res/calculatorpp/06_constants_screen_sm.png rename to android-app/misc/res/calculatorpp/06_constants_screen_sm.png diff --git a/app-android/misc/res/calculatorpp/07_constant_create_dialog.png b/android-app/misc/res/calculatorpp/07_constant_create_dialog.png similarity index 100% rename from app-android/misc/res/calculatorpp/07_constant_create_dialog.png rename to android-app/misc/res/calculatorpp/07_constant_create_dialog.png diff --git a/app-android/misc/res/calculatorpp/08_constants_context_menu.png b/android-app/misc/res/calculatorpp/08_constants_context_menu.png similarity index 100% rename from app-android/misc/res/calculatorpp/08_constants_context_menu.png rename to android-app/misc/res/calculatorpp/08_constants_context_menu.png diff --git a/app-android/misc/res/calculatorpp/09_functions_screen.png b/android-app/misc/res/calculatorpp/09_functions_screen.png similarity index 100% rename from app-android/misc/res/calculatorpp/09_functions_screen.png rename to android-app/misc/res/calculatorpp/09_functions_screen.png diff --git a/app-android/misc/res/calculatorpp/09_functions_screen_sm.png b/android-app/misc/res/calculatorpp/09_functions_screen_sm.png similarity index 100% rename from app-android/misc/res/calculatorpp/09_functions_screen_sm.png rename to android-app/misc/res/calculatorpp/09_functions_screen_sm.png diff --git a/app-android/misc/res/calculatorpp/10_history_screen.png b/android-app/misc/res/calculatorpp/10_history_screen.png similarity index 100% rename from app-android/misc/res/calculatorpp/10_history_screen.png rename to android-app/misc/res/calculatorpp/10_history_screen.png diff --git a/app-android/misc/res/calculatorpp/10_history_screen_sm.png b/android-app/misc/res/calculatorpp/10_history_screen_sm.png similarity index 100% rename from app-android/misc/res/calculatorpp/10_history_screen_sm.png rename to android-app/misc/res/calculatorpp/10_history_screen_sm.png diff --git a/app-android/misc/res/calculatorpp/11_history_item_context_menu.png b/android-app/misc/res/calculatorpp/11_history_item_context_menu.png similarity index 100% rename from app-android/misc/res/calculatorpp/11_history_item_context_menu.png rename to android-app/misc/res/calculatorpp/11_history_item_context_menu.png diff --git a/app-android/misc/res/calculatorpp/12_saved_history_tab.png b/android-app/misc/res/calculatorpp/12_saved_history_tab.png similarity index 100% rename from app-android/misc/res/calculatorpp/12_saved_history_tab.png rename to android-app/misc/res/calculatorpp/12_saved_history_tab.png diff --git a/app-android/misc/res/calculatorpp/13_saved_history_item_context_menu.png b/android-app/misc/res/calculatorpp/13_saved_history_item_context_menu.png similarity index 100% rename from app-android/misc/res/calculatorpp/13_saved_history_item_context_menu.png rename to android-app/misc/res/calculatorpp/13_saved_history_item_context_menu.png diff --git a/app-android/misc/res/calculatorpp/14_about_screen.png b/android-app/misc/res/calculatorpp/14_about_screen.png similarity index 100% rename from app-android/misc/res/calculatorpp/14_about_screen.png rename to android-app/misc/res/calculatorpp/14_about_screen.png diff --git a/app-android/misc/res/calculatorpp/14_about_screen_sm.png b/android-app/misc/res/calculatorpp/14_about_screen_sm.png similarity index 100% rename from app-android/misc/res/calculatorpp/14_about_screen_sm.png rename to android-app/misc/res/calculatorpp/14_about_screen_sm.png diff --git a/app-android/misc/res/calculatorpp/15_release_notes_tab.png b/android-app/misc/res/calculatorpp/15_release_notes_tab.png similarity index 100% rename from app-android/misc/res/calculatorpp/15_release_notes_tab.png rename to android-app/misc/res/calculatorpp/15_release_notes_tab.png diff --git a/app-android/misc/res/calculatorpp/16_help_screen.png b/android-app/misc/res/calculatorpp/16_help_screen.png similarity index 100% rename from app-android/misc/res/calculatorpp/16_help_screen.png rename to android-app/misc/res/calculatorpp/16_help_screen.png diff --git a/app-android/misc/res/calculatorpp/16_help_screen_sm.png b/android-app/misc/res/calculatorpp/16_help_screen_sm.png similarity index 100% rename from app-android/misc/res/calculatorpp/16_help_screen_sm.png rename to android-app/misc/res/calculatorpp/16_help_screen_sm.png diff --git a/app-android/misc/res/calculatorpp/17_hints_tab.png b/android-app/misc/res/calculatorpp/17_hints_tab.png similarity index 100% rename from app-android/misc/res/calculatorpp/17_hints_tab.png rename to android-app/misc/res/calculatorpp/17_hints_tab.png diff --git a/app-android/misc/res/calculatorpp/18_preferences.png b/android-app/misc/res/calculatorpp/18_preferences.png similarity index 100% rename from app-android/misc/res/calculatorpp/18_preferences.png rename to android-app/misc/res/calculatorpp/18_preferences.png diff --git a/app-android/misc/res/calculatorpp/18_preferences_02.png b/android-app/misc/res/calculatorpp/18_preferences_02.png similarity index 100% rename from app-android/misc/res/calculatorpp/18_preferences_02.png rename to android-app/misc/res/calculatorpp/18_preferences_02.png diff --git a/app-android/misc/res/calculatorpp/18_preferences_03.png b/android-app/misc/res/calculatorpp/18_preferences_03.png similarity index 100% rename from app-android/misc/res/calculatorpp/18_preferences_03.png rename to android-app/misc/res/calculatorpp/18_preferences_03.png diff --git a/app-android/misc/res/calculatorpp/18_preferences_sm.png b/android-app/misc/res/calculatorpp/18_preferences_sm.png similarity index 100% rename from app-android/misc/res/calculatorpp/18_preferences_sm.png rename to android-app/misc/res/calculatorpp/18_preferences_sm.png diff --git a/app-android/misc/res/calculatorpp/plan.png b/android-app/misc/res/calculatorpp/plan.png similarity index 100% rename from app-android/misc/res/calculatorpp/plan.png rename to android-app/misc/res/calculatorpp/plan.png diff --git a/app-android/misc/res/calculatorpp/plan.xcf b/android-app/misc/res/calculatorpp/plan.xcf similarity index 100% rename from app-android/misc/res/calculatorpp/plan.xcf rename to android-app/misc/res/calculatorpp/plan.xcf diff --git a/app-android/misc/res/icon-green.png b/android-app/misc/res/icon-green.png similarity index 100% rename from app-android/misc/res/icon-green.png rename to android-app/misc/res/icon-green.png diff --git a/app-android/misc/res/icon-hi-res.png b/android-app/misc/res/icon-hi-res.png similarity index 100% rename from app-android/misc/res/icon-hi-res.png rename to android-app/misc/res/icon-hi-res.png diff --git a/app-android/misc/res/icon-promo.png b/android-app/misc/res/icon-promo.png similarity index 100% rename from app-android/misc/res/icon-promo.png rename to android-app/misc/res/icon-promo.png diff --git a/app-android/misc/res/icon.png b/android-app/misc/res/icon.png similarity index 100% rename from app-android/misc/res/icon.png rename to android-app/misc/res/icon.png diff --git a/app-android/misc/res/kb_facebook.png b/android-app/misc/res/kb_facebook.png similarity index 100% rename from app-android/misc/res/kb_facebook.png rename to android-app/misc/res/kb_facebook.png diff --git a/app-android/misc/res/kb_facebook_icon.png b/android-app/misc/res/kb_facebook_icon.png similarity index 100% rename from app-android/misc/res/kb_facebook_icon.png rename to android-app/misc/res/kb_facebook_icon.png diff --git a/app-android/misc/res/logo-admob.png b/android-app/misc/res/logo-admob.png similarity index 100% rename from app-android/misc/res/logo-admob.png rename to android-app/misc/res/logo-admob.png diff --git a/app-android/misc/res/logo-scaled.png b/android-app/misc/res/logo-scaled.png similarity index 100% rename from app-android/misc/res/logo-scaled.png rename to android-app/misc/res/logo-scaled.png diff --git a/app-android/misc/res/logo-small.png b/android-app/misc/res/logo-small.png similarity index 100% rename from app-android/misc/res/logo-small.png rename to android-app/misc/res/logo-small.png diff --git a/app-android/misc/res/logo.cdr b/android-app/misc/res/logo.cdr similarity index 100% rename from app-android/misc/res/logo.cdr rename to android-app/misc/res/logo.cdr diff --git a/app-android/misc/res/logo.png b/android-app/misc/res/logo.png similarity index 100% rename from app-android/misc/res/logo.png rename to android-app/misc/res/logo.png diff --git a/app-android/misc/res/widget.png b/android-app/misc/res/widget.png similarity index 100% rename from app-android/misc/res/widget.png rename to android-app/misc/res/widget.png diff --git a/app-android/misc/res/work/Backup_of_logo.cdr b/android-app/misc/res/work/Backup_of_logo.cdr similarity index 100% rename from app-android/misc/res/work/Backup_of_logo.cdr rename to android-app/misc/res/work/Backup_of_logo.cdr diff --git a/app-android/misc/res/work/header.png b/android-app/misc/res/work/header.png similarity index 100% rename from app-android/misc/res/work/header.png rename to android-app/misc/res/work/header.png diff --git a/app-android/misc/res/work/header_bg.png b/android-app/misc/res/work/header_bg.png similarity index 100% rename from app-android/misc/res/work/header_bg.png rename to android-app/misc/res/work/header_bg.png diff --git a/app-android/misc/res/work/header_sm.png b/android-app/misc/res/work/header_sm.png similarity index 100% rename from app-android/misc/res/work/header_sm.png rename to android-app/misc/res/work/header_sm.png diff --git a/app-android/misc/res/work/heart_original.png b/android-app/misc/res/work/heart_original.png similarity index 100% rename from app-android/misc/res/work/heart_original.png rename to android-app/misc/res/work/heart_original.png diff --git a/app-android/misc/res/work/icon.png b/android-app/misc/res/work/icon.png similarity index 100% rename from app-android/misc/res/work/icon.png rename to android-app/misc/res/work/icon.png diff --git a/app-android/misc/res/work/icon_favicon_light_blue.ico b/android-app/misc/res/work/icon_favicon_light_blue.ico similarity index 100% rename from app-android/misc/res/work/icon_favicon_light_blue.ico rename to android-app/misc/res/work/icon_favicon_light_blue.ico diff --git a/app-android/misc/res/work/icon_favicon_light_blue.png b/android-app/misc/res/work/icon_favicon_light_blue.png similarity index 100% rename from app-android/misc/res/work/icon_favicon_light_blue.png rename to android-app/misc/res/work/icon_favicon_light_blue.png diff --git a/app-android/misc/res/work/icon_favicon_purple.ico b/android-app/misc/res/work/icon_favicon_purple.ico similarity index 100% rename from app-android/misc/res/work/icon_favicon_purple.ico rename to android-app/misc/res/work/icon_favicon_purple.ico diff --git a/app-android/misc/res/work/icon_small.png b/android-app/misc/res/work/icon_small.png similarity index 100% rename from app-android/misc/res/work/icon_small.png rename to android-app/misc/res/work/icon_small.png diff --git a/app-android/misc/res/work/log11o.psd b/android-app/misc/res/work/log11o.psd similarity index 100% rename from app-android/misc/res/work/log11o.psd rename to android-app/misc/res/work/log11o.psd diff --git a/app-android/misc/res/work/logo.cdr b/android-app/misc/res/work/logo.cdr similarity index 100% rename from app-android/misc/res/work/logo.cdr rename to android-app/misc/res/work/logo.cdr diff --git a/app-android/misc/res/work/logo.png b/android-app/misc/res/work/logo.png similarity index 100% rename from app-android/misc/res/work/logo.png rename to android-app/misc/res/work/logo.png diff --git a/app-android/misc/res/work/logoFULL copy.png b/android-app/misc/res/work/logoFULL copy.png similarity index 100% rename from app-android/misc/res/work/logoFULL copy.png rename to android-app/misc/res/work/logoFULL copy.png diff --git a/app-android/misc/res/work/logoFULL.pdf b/android-app/misc/res/work/logoFULL.pdf similarity index 100% rename from app-android/misc/res/work/logoFULL.pdf rename to android-app/misc/res/work/logoFULL.pdf diff --git a/app-android/misc/res/work/logoFULL.png b/android-app/misc/res/work/logoFULL.png similarity index 100% rename from app-android/misc/res/work/logoFULL.png rename to android-app/misc/res/work/logoFULL.png diff --git a/app-android/misc/res/work/logoFULL_banner.png b/android-app/misc/res/work/logoFULL_banner.png similarity index 100% rename from app-android/misc/res/work/logoFULL_banner.png rename to android-app/misc/res/work/logoFULL_banner.png diff --git a/app-android/misc/res/work/logoFULL_small.png b/android-app/misc/res/work/logoFULL_small.png similarity index 100% rename from app-android/misc/res/work/logoFULL_small.png rename to android-app/misc/res/work/logoFULL_small.png diff --git a/app-android/misc/res/work/logo_black.png b/android-app/misc/res/work/logo_black.png similarity index 100% rename from app-android/misc/res/work/logo_black.png rename to android-app/misc/res/work/logo_black.png diff --git a/app-android/misc/res/work/logo_blue.png b/android-app/misc/res/work/logo_blue.png similarity index 100% rename from app-android/misc/res/work/logo_blue.png rename to android-app/misc/res/work/logo_blue.png diff --git a/app-android/misc/res/work/logo_light_blue.png b/android-app/misc/res/work/logo_light_blue.png similarity index 100% rename from app-android/misc/res/work/logo_light_blue.png rename to android-app/misc/res/work/logo_light_blue.png diff --git a/app-android/misc/res/work/logo_purple.png b/android-app/misc/res/work/logo_purple.png similarity index 100% rename from app-android/misc/res/work/logo_purple.png rename to android-app/misc/res/work/logo_purple.png diff --git a/app-android/misc/res/work/promo_logo.png b/android-app/misc/res/work/promo_logo.png similarity index 100% rename from app-android/misc/res/work/promo_logo.png rename to android-app/misc/res/work/promo_logo.png diff --git a/app-android/misc/res/work/text_logo.png b/android-app/misc/res/work/text_logo.png similarity index 100% rename from app-android/misc/res/work/text_logo.png rename to android-app/misc/res/work/text_logo.png diff --git a/app-android/misc/res/work/text_logo_blue.png b/android-app/misc/res/work/text_logo_blue.png similarity index 100% rename from app-android/misc/res/work/text_logo_blue.png rename to android-app/misc/res/work/text_logo_blue.png diff --git a/app-android/misc/res/work/text_logo_light_blue.png b/android-app/misc/res/work/text_logo_light_blue.png similarity index 100% rename from app-android/misc/res/work/text_logo_light_blue.png rename to android-app/misc/res/work/text_logo_light_blue.png diff --git a/app-android/misc/res/work/text_logo_light_blue_cpp_forum.png b/android-app/misc/res/work/text_logo_light_blue_cpp_forum.png similarity index 100% rename from app-android/misc/res/work/text_logo_light_blue_cpp_forum.png rename to android-app/misc/res/work/text_logo_light_blue_cpp_forum.png diff --git a/app-android/misc/res/work/text_logo_purple.png b/android-app/misc/res/work/text_logo_purple.png similarity index 100% rename from app-android/misc/res/work/text_logo_purple.png rename to android-app/misc/res/work/text_logo_purple.png diff --git a/app-android/misc/src/achartengine-0.7.0.jar b/android-app/misc/src/achartengine-0.7.0.jar similarity index 100% rename from app-android/misc/src/achartengine-0.7.0.jar rename to android-app/misc/src/achartengine-0.7.0.jar diff --git a/app-android/misc/src/bsh.jar b/android-app/misc/src/bsh.jar similarity index 100% rename from app-android/misc/src/bsh.jar rename to android-app/misc/src/bsh.jar diff --git a/app-android/pom.xml b/android-app/pom.xml similarity index 98% rename from app-android/pom.xml rename to android-app/pom.xml index 87cc953e..ae367212 100644 --- a/app-android/pom.xml +++ b/android-app/pom.xml @@ -10,7 +10,7 @@ 4.0.0 org.solovyev.android - calculatorpp-app-android + calculatorpp-android-app apk Calculator++ Application @@ -25,7 +25,7 @@ org.solovyev.android.calculator - app-android-core + calculatorpp-android-app-core diff --git a/app-android/proguard.cfg b/android-app/proguard.cfg similarity index 100% rename from app-android/proguard.cfg rename to android-app/proguard.cfg diff --git a/app-android/project.properties b/android-app/project.properties similarity index 100% rename from app-android/project.properties rename to android-app/project.properties diff --git a/app-android/res/drawable-hdpi/ab_add.png b/android-app/res/drawable-hdpi/ab_add.png similarity index 100% rename from app-android/res/drawable-hdpi/ab_add.png rename to android-app/res/drawable-hdpi/ab_add.png diff --git a/app-android/res/drawable-hdpi/ab_icon.png b/android-app/res/drawable-hdpi/ab_icon.png similarity index 100% rename from app-android/res/drawable-hdpi/ab_icon.png rename to android-app/res/drawable-hdpi/ab_icon.png diff --git a/app-android/res/drawable-hdpi/ab_icon_long.png b/android-app/res/drawable-hdpi/ab_icon_long.png similarity index 100% rename from app-android/res/drawable-hdpi/ab_icon_long.png rename to android-app/res/drawable-hdpi/ab_icon_long.png diff --git a/app-android/res/drawable-hdpi/ab_settings.png b/android-app/res/drawable-hdpi/ab_settings.png similarity index 100% rename from app-android/res/drawable-hdpi/ab_settings.png rename to android-app/res/drawable-hdpi/ab_settings.png diff --git a/app-android/res/drawable-hdpi/icon.png b/android-app/res/drawable-hdpi/icon.png similarity index 100% rename from app-android/res/drawable-hdpi/icon.png rename to android-app/res/drawable-hdpi/icon.png diff --git a/app-android/res/drawable-hdpi/icon_onscreen.png b/android-app/res/drawable-hdpi/icon_onscreen.png similarity index 100% rename from app-android/res/drawable-hdpi/icon_onscreen.png rename to android-app/res/drawable-hdpi/icon_onscreen.png diff --git a/app-android/res/drawable-hdpi/kb_copy.png b/android-app/res/drawable-hdpi/kb_copy.png similarity index 100% rename from app-android/res/drawable-hdpi/kb_copy.png rename to android-app/res/drawable-hdpi/kb_copy.png diff --git a/app-android/res/drawable-hdpi/kb_delete.png b/android-app/res/drawable-hdpi/kb_delete.png similarity index 100% rename from app-android/res/drawable-hdpi/kb_delete.png rename to android-app/res/drawable-hdpi/kb_delete.png diff --git a/app-android/res/drawable-hdpi/kb_facebook.png b/android-app/res/drawable-hdpi/kb_facebook.png similarity index 100% rename from app-android/res/drawable-hdpi/kb_facebook.png rename to android-app/res/drawable-hdpi/kb_facebook.png diff --git a/app-android/res/drawable-hdpi/kb_heart.png b/android-app/res/drawable-hdpi/kb_heart.png similarity index 100% rename from app-android/res/drawable-hdpi/kb_heart.png rename to android-app/res/drawable-hdpi/kb_heart.png diff --git a/app-android/res/drawable-hdpi/kb_logo.png b/android-app/res/drawable-hdpi/kb_logo.png similarity index 100% rename from app-android/res/drawable-hdpi/kb_logo.png rename to android-app/res/drawable-hdpi/kb_logo.png diff --git a/app-android/res/drawable-hdpi/kb_paste.png b/android-app/res/drawable-hdpi/kb_paste.png similarity index 100% rename from app-android/res/drawable-hdpi/kb_paste.png rename to android-app/res/drawable-hdpi/kb_paste.png diff --git a/app-android/res/drawable-hdpi/kb_settings.png b/android-app/res/drawable-hdpi/kb_settings.png similarity index 100% rename from app-android/res/drawable-hdpi/kb_settings.png rename to android-app/res/drawable-hdpi/kb_settings.png diff --git a/app-android/res/drawable-hdpi/logo.png b/android-app/res/drawable-hdpi/logo.png similarity index 100% rename from app-android/res/drawable-hdpi/logo.png rename to android-app/res/drawable-hdpi/logo.png diff --git a/app-android/res/drawable-ldpi/ab_add.png b/android-app/res/drawable-ldpi/ab_add.png similarity index 100% rename from app-android/res/drawable-ldpi/ab_add.png rename to android-app/res/drawable-ldpi/ab_add.png diff --git a/app-android/res/drawable-ldpi/ab_icon.png b/android-app/res/drawable-ldpi/ab_icon.png similarity index 100% rename from app-android/res/drawable-ldpi/ab_icon.png rename to android-app/res/drawable-ldpi/ab_icon.png diff --git a/app-android/res/drawable-ldpi/ab_settings.png b/android-app/res/drawable-ldpi/ab_settings.png similarity index 100% rename from app-android/res/drawable-ldpi/ab_settings.png rename to android-app/res/drawable-ldpi/ab_settings.png diff --git a/app-android/res/drawable-ldpi/icon.png b/android-app/res/drawable-ldpi/icon.png similarity index 100% rename from app-android/res/drawable-ldpi/icon.png rename to android-app/res/drawable-ldpi/icon.png diff --git a/app-android/res/drawable-ldpi/icon_onscreen.png b/android-app/res/drawable-ldpi/icon_onscreen.png similarity index 100% rename from app-android/res/drawable-ldpi/icon_onscreen.png rename to android-app/res/drawable-ldpi/icon_onscreen.png diff --git a/app-android/res/drawable-ldpi/kb_copy.png b/android-app/res/drawable-ldpi/kb_copy.png similarity index 100% rename from app-android/res/drawable-ldpi/kb_copy.png rename to android-app/res/drawable-ldpi/kb_copy.png diff --git a/app-android/res/drawable-ldpi/kb_delete.png b/android-app/res/drawable-ldpi/kb_delete.png similarity index 100% rename from app-android/res/drawable-ldpi/kb_delete.png rename to android-app/res/drawable-ldpi/kb_delete.png diff --git a/app-android/res/drawable-ldpi/kb_facebook.png b/android-app/res/drawable-ldpi/kb_facebook.png similarity index 100% rename from app-android/res/drawable-ldpi/kb_facebook.png rename to android-app/res/drawable-ldpi/kb_facebook.png diff --git a/app-android/res/drawable-ldpi/kb_heart.png b/android-app/res/drawable-ldpi/kb_heart.png similarity index 100% rename from app-android/res/drawable-ldpi/kb_heart.png rename to android-app/res/drawable-ldpi/kb_heart.png diff --git a/app-android/res/drawable-ldpi/kb_logo.png b/android-app/res/drawable-ldpi/kb_logo.png similarity index 100% rename from app-android/res/drawable-ldpi/kb_logo.png rename to android-app/res/drawable-ldpi/kb_logo.png diff --git a/app-android/res/drawable-ldpi/kb_paste.png b/android-app/res/drawable-ldpi/kb_paste.png similarity index 100% rename from app-android/res/drawable-ldpi/kb_paste.png rename to android-app/res/drawable-ldpi/kb_paste.png diff --git a/app-android/res/drawable-ldpi/kb_settings.png b/android-app/res/drawable-ldpi/kb_settings.png similarity index 100% rename from app-android/res/drawable-ldpi/kb_settings.png rename to android-app/res/drawable-ldpi/kb_settings.png diff --git a/app-android/res/drawable-ldpi/logo.png b/android-app/res/drawable-ldpi/logo.png similarity index 100% rename from app-android/res/drawable-ldpi/logo.png rename to android-app/res/drawable-ldpi/logo.png diff --git a/app-android/res/drawable-mdpi/ab_add.png b/android-app/res/drawable-mdpi/ab_add.png similarity index 100% rename from app-android/res/drawable-mdpi/ab_add.png rename to android-app/res/drawable-mdpi/ab_add.png diff --git a/app-android/res/drawable-mdpi/ab_icon.png b/android-app/res/drawable-mdpi/ab_icon.png similarity index 100% rename from app-android/res/drawable-mdpi/ab_icon.png rename to android-app/res/drawable-mdpi/ab_icon.png diff --git a/app-android/res/drawable-mdpi/ab_settings.png b/android-app/res/drawable-mdpi/ab_settings.png similarity index 100% rename from app-android/res/drawable-mdpi/ab_settings.png rename to android-app/res/drawable-mdpi/ab_settings.png diff --git a/app-android/res/drawable-mdpi/icon.png b/android-app/res/drawable-mdpi/icon.png similarity index 100% rename from app-android/res/drawable-mdpi/icon.png rename to android-app/res/drawable-mdpi/icon.png diff --git a/app-android/res/drawable-mdpi/icon_onscreen.png b/android-app/res/drawable-mdpi/icon_onscreen.png similarity index 100% rename from app-android/res/drawable-mdpi/icon_onscreen.png rename to android-app/res/drawable-mdpi/icon_onscreen.png diff --git a/app-android/res/drawable-mdpi/kb_copy.png b/android-app/res/drawable-mdpi/kb_copy.png similarity index 100% rename from app-android/res/drawable-mdpi/kb_copy.png rename to android-app/res/drawable-mdpi/kb_copy.png diff --git a/app-android/res/drawable-mdpi/kb_delete.png b/android-app/res/drawable-mdpi/kb_delete.png similarity index 100% rename from app-android/res/drawable-mdpi/kb_delete.png rename to android-app/res/drawable-mdpi/kb_delete.png diff --git a/app-android/res/drawable-mdpi/kb_facebook.png b/android-app/res/drawable-mdpi/kb_facebook.png similarity index 100% rename from app-android/res/drawable-mdpi/kb_facebook.png rename to android-app/res/drawable-mdpi/kb_facebook.png diff --git a/app-android/res/drawable-mdpi/kb_heart.png b/android-app/res/drawable-mdpi/kb_heart.png similarity index 100% rename from app-android/res/drawable-mdpi/kb_heart.png rename to android-app/res/drawable-mdpi/kb_heart.png diff --git a/app-android/res/drawable-mdpi/kb_logo.png b/android-app/res/drawable-mdpi/kb_logo.png similarity index 100% rename from app-android/res/drawable-mdpi/kb_logo.png rename to android-app/res/drawable-mdpi/kb_logo.png diff --git a/app-android/res/drawable-mdpi/kb_paste.png b/android-app/res/drawable-mdpi/kb_paste.png similarity index 100% rename from app-android/res/drawable-mdpi/kb_paste.png rename to android-app/res/drawable-mdpi/kb_paste.png diff --git a/app-android/res/drawable-mdpi/kb_settings.png b/android-app/res/drawable-mdpi/kb_settings.png similarity index 100% rename from app-android/res/drawable-mdpi/kb_settings.png rename to android-app/res/drawable-mdpi/kb_settings.png diff --git a/app-android/res/drawable-mdpi/logo.png b/android-app/res/drawable-mdpi/logo.png similarity index 100% rename from app-android/res/drawable-mdpi/logo.png rename to android-app/res/drawable-mdpi/logo.png diff --git a/app-android/res/drawable-nodpi/cpp_onscreen_button_close.png b/android-app/res/drawable-nodpi/cpp_onscreen_button_close.png similarity index 100% rename from app-android/res/drawable-nodpi/cpp_onscreen_button_close.png rename to android-app/res/drawable-nodpi/cpp_onscreen_button_close.png diff --git a/app-android/res/drawable-nodpi/cpp_onscreen_button_fold.png b/android-app/res/drawable-nodpi/cpp_onscreen_button_fold.png similarity index 100% rename from app-android/res/drawable-nodpi/cpp_onscreen_button_fold.png rename to android-app/res/drawable-nodpi/cpp_onscreen_button_fold.png diff --git a/app-android/res/drawable-nodpi/cpp_onscreen_button_minimize.png b/android-app/res/drawable-nodpi/cpp_onscreen_button_minimize.png similarity index 100% rename from app-android/res/drawable-nodpi/cpp_onscreen_button_minimize.png rename to android-app/res/drawable-nodpi/cpp_onscreen_button_minimize.png diff --git a/app-android/res/drawable-nodpi/cpp_onscreen_header_logo.png b/android-app/res/drawable-nodpi/cpp_onscreen_header_logo.png similarity index 100% rename from app-android/res/drawable-nodpi/cpp_onscreen_header_logo.png rename to android-app/res/drawable-nodpi/cpp_onscreen_header_logo.png diff --git a/app-android/res/drawable-nodpi/default_abs__ab_transparent_dark_holo.9.png b/android-app/res/drawable-nodpi/default_abs__ab_transparent_dark_holo.9.png similarity index 100% rename from app-android/res/drawable-nodpi/default_abs__ab_transparent_dark_holo.9.png rename to android-app/res/drawable-nodpi/default_abs__ab_transparent_dark_holo.9.png diff --git a/app-android/res/drawable-nodpi/default_abs__btn_cab_done_default_holo_dark.9.png b/android-app/res/drawable-nodpi/default_abs__btn_cab_done_default_holo_dark.9.png similarity index 100% rename from app-android/res/drawable-nodpi/default_abs__btn_cab_done_default_holo_dark.9.png rename to android-app/res/drawable-nodpi/default_abs__btn_cab_done_default_holo_dark.9.png diff --git a/app-android/res/drawable-nodpi/default_abs__btn_cab_done_focused_holo_dark.9.png b/android-app/res/drawable-nodpi/default_abs__btn_cab_done_focused_holo_dark.9.png similarity index 100% rename from app-android/res/drawable-nodpi/default_abs__btn_cab_done_focused_holo_dark.9.png rename to android-app/res/drawable-nodpi/default_abs__btn_cab_done_focused_holo_dark.9.png diff --git a/app-android/res/drawable-nodpi/default_abs__btn_cab_done_pressed_holo_dark.9.png b/android-app/res/drawable-nodpi/default_abs__btn_cab_done_pressed_holo_dark.9.png similarity index 100% rename from app-android/res/drawable-nodpi/default_abs__btn_cab_done_pressed_holo_dark.9.png rename to android-app/res/drawable-nodpi/default_abs__btn_cab_done_pressed_holo_dark.9.png diff --git a/app-android/res/drawable-nodpi/default_abs__list_focused_holo.9.png b/android-app/res/drawable-nodpi/default_abs__list_focused_holo.9.png similarity index 100% rename from app-android/res/drawable-nodpi/default_abs__list_focused_holo.9.png rename to android-app/res/drawable-nodpi/default_abs__list_focused_holo.9.png diff --git a/app-android/res/drawable-nodpi/default_abs__list_longpressed_holo.9.png b/android-app/res/drawable-nodpi/default_abs__list_longpressed_holo.9.png similarity index 100% rename from app-android/res/drawable-nodpi/default_abs__list_longpressed_holo.9.png rename to android-app/res/drawable-nodpi/default_abs__list_longpressed_holo.9.png diff --git a/app-android/res/drawable-nodpi/default_abs__list_pressed_holo_dark.9.png b/android-app/res/drawable-nodpi/default_abs__list_pressed_holo_dark.9.png similarity index 100% rename from app-android/res/drawable-nodpi/default_abs__list_pressed_holo_dark.9.png rename to android-app/res/drawable-nodpi/default_abs__list_pressed_holo_dark.9.png diff --git a/app-android/res/drawable-nodpi/default_abs__spinner_ab_focused_holo_dark.9.png b/android-app/res/drawable-nodpi/default_abs__spinner_ab_focused_holo_dark.9.png similarity index 100% rename from app-android/res/drawable-nodpi/default_abs__spinner_ab_focused_holo_dark.9.png rename to android-app/res/drawable-nodpi/default_abs__spinner_ab_focused_holo_dark.9.png diff --git a/app-android/res/drawable-nodpi/default_abs__spinner_ab_pressed_holo_dark.9.png b/android-app/res/drawable-nodpi/default_abs__spinner_ab_pressed_holo_dark.9.png similarity index 100% rename from app-android/res/drawable-nodpi/default_abs__spinner_ab_pressed_holo_dark.9.png rename to android-app/res/drawable-nodpi/default_abs__spinner_ab_pressed_holo_dark.9.png diff --git a/app-android/res/drawable-nodpi/default_abs__tab_selected_focused_holo.9.png b/android-app/res/drawable-nodpi/default_abs__tab_selected_focused_holo.9.png similarity index 100% rename from app-android/res/drawable-nodpi/default_abs__tab_selected_focused_holo.9.png rename to android-app/res/drawable-nodpi/default_abs__tab_selected_focused_holo.9.png diff --git a/app-android/res/drawable-nodpi/default_abs__tab_selected_holo.9.png b/android-app/res/drawable-nodpi/default_abs__tab_selected_holo.9.png similarity index 100% rename from app-android/res/drawable-nodpi/default_abs__tab_selected_holo.9.png rename to android-app/res/drawable-nodpi/default_abs__tab_selected_holo.9.png diff --git a/app-android/res/drawable-nodpi/default_abs__tab_selected_pressed_holo.9.png b/android-app/res/drawable-nodpi/default_abs__tab_selected_pressed_holo.9.png similarity index 100% rename from app-android/res/drawable-nodpi/default_abs__tab_selected_pressed_holo.9.png rename to android-app/res/drawable-nodpi/default_abs__tab_selected_pressed_holo.9.png diff --git a/app-android/res/drawable-nodpi/default_abs__tab_unselected_pressed_holo.9.png b/android-app/res/drawable-nodpi/default_abs__tab_unselected_pressed_holo.9.png similarity index 100% rename from app-android/res/drawable-nodpi/default_abs__tab_unselected_pressed_holo.9.png rename to android-app/res/drawable-nodpi/default_abs__tab_unselected_pressed_holo.9.png diff --git a/app-android/res/drawable-nodpi/metro_blue_abs__ab_transparent_dark_holo.9.png b/android-app/res/drawable-nodpi/metro_blue_abs__ab_transparent_dark_holo.9.png similarity index 100% rename from app-android/res/drawable-nodpi/metro_blue_abs__ab_transparent_dark_holo.9.png rename to android-app/res/drawable-nodpi/metro_blue_abs__ab_transparent_dark_holo.9.png diff --git a/app-android/res/drawable-nodpi/metro_blue_abs__list_focused_holo.9.png b/android-app/res/drawable-nodpi/metro_blue_abs__list_focused_holo.9.png similarity index 100% rename from app-android/res/drawable-nodpi/metro_blue_abs__list_focused_holo.9.png rename to android-app/res/drawable-nodpi/metro_blue_abs__list_focused_holo.9.png diff --git a/app-android/res/drawable-nodpi/metro_blue_abs__list_pressed_holo_dark.9.png b/android-app/res/drawable-nodpi/metro_blue_abs__list_pressed_holo_dark.9.png similarity index 100% rename from app-android/res/drawable-nodpi/metro_blue_abs__list_pressed_holo_dark.9.png rename to android-app/res/drawable-nodpi/metro_blue_abs__list_pressed_holo_dark.9.png diff --git a/app-android/res/drawable-nodpi/metro_blue_abs__tab_selected_focused_holo.9.png b/android-app/res/drawable-nodpi/metro_blue_abs__tab_selected_focused_holo.9.png similarity index 100% rename from app-android/res/drawable-nodpi/metro_blue_abs__tab_selected_focused_holo.9.png rename to android-app/res/drawable-nodpi/metro_blue_abs__tab_selected_focused_holo.9.png diff --git a/app-android/res/drawable-nodpi/metro_blue_abs__tab_selected_holo.9.png b/android-app/res/drawable-nodpi/metro_blue_abs__tab_selected_holo.9.png similarity index 100% rename from app-android/res/drawable-nodpi/metro_blue_abs__tab_selected_holo.9.png rename to android-app/res/drawable-nodpi/metro_blue_abs__tab_selected_holo.9.png diff --git a/app-android/res/drawable-nodpi/metro_blue_abs__tab_selected_pressed_holo.9.png b/android-app/res/drawable-nodpi/metro_blue_abs__tab_selected_pressed_holo.9.png similarity index 100% rename from app-android/res/drawable-nodpi/metro_blue_abs__tab_selected_pressed_holo.9.png rename to android-app/res/drawable-nodpi/metro_blue_abs__tab_selected_pressed_holo.9.png diff --git a/app-android/res/drawable-nodpi/metro_blue_abs__tab_unselected_pressed_holo.9.png b/android-app/res/drawable-nodpi/metro_blue_abs__tab_unselected_pressed_holo.9.png similarity index 100% rename from app-android/res/drawable-nodpi/metro_blue_abs__tab_unselected_pressed_holo.9.png rename to android-app/res/drawable-nodpi/metro_blue_abs__tab_unselected_pressed_holo.9.png diff --git a/app-android/res/drawable-nodpi/widget_preview.png b/android-app/res/drawable-nodpi/widget_preview.png similarity index 100% rename from app-android/res/drawable-nodpi/widget_preview.png rename to android-app/res/drawable-nodpi/widget_preview.png diff --git a/app-android/res/drawable-xhdpi/ab_add.png b/android-app/res/drawable-xhdpi/ab_add.png similarity index 100% rename from app-android/res/drawable-xhdpi/ab_add.png rename to android-app/res/drawable-xhdpi/ab_add.png diff --git a/app-android/res/drawable-xhdpi/ab_icon.png b/android-app/res/drawable-xhdpi/ab_icon.png similarity index 100% rename from app-android/res/drawable-xhdpi/ab_icon.png rename to android-app/res/drawable-xhdpi/ab_icon.png diff --git a/app-android/res/drawable-xhdpi/ab_settings.png b/android-app/res/drawable-xhdpi/ab_settings.png similarity index 100% rename from app-android/res/drawable-xhdpi/ab_settings.png rename to android-app/res/drawable-xhdpi/ab_settings.png diff --git a/app-android/res/drawable-xhdpi/ic_menu_preferences.png b/android-app/res/drawable-xhdpi/ic_menu_preferences.png similarity index 100% rename from app-android/res/drawable-xhdpi/ic_menu_preferences.png rename to android-app/res/drawable-xhdpi/ic_menu_preferences.png diff --git a/app-android/res/drawable-xhdpi/icon.png b/android-app/res/drawable-xhdpi/icon.png similarity index 100% rename from app-android/res/drawable-xhdpi/icon.png rename to android-app/res/drawable-xhdpi/icon.png diff --git a/app-android/res/drawable-xhdpi/icon_onscreen.png b/android-app/res/drawable-xhdpi/icon_onscreen.png similarity index 100% rename from app-android/res/drawable-xhdpi/icon_onscreen.png rename to android-app/res/drawable-xhdpi/icon_onscreen.png diff --git a/app-android/res/drawable-xhdpi/kb_copy.png b/android-app/res/drawable-xhdpi/kb_copy.png similarity index 100% rename from app-android/res/drawable-xhdpi/kb_copy.png rename to android-app/res/drawable-xhdpi/kb_copy.png diff --git a/app-android/res/drawable-xhdpi/kb_delete.png b/android-app/res/drawable-xhdpi/kb_delete.png similarity index 100% rename from app-android/res/drawable-xhdpi/kb_delete.png rename to android-app/res/drawable-xhdpi/kb_delete.png diff --git a/app-android/res/drawable-xhdpi/kb_facebook.png b/android-app/res/drawable-xhdpi/kb_facebook.png similarity index 100% rename from app-android/res/drawable-xhdpi/kb_facebook.png rename to android-app/res/drawable-xhdpi/kb_facebook.png diff --git a/app-android/res/drawable-xhdpi/kb_heart.png b/android-app/res/drawable-xhdpi/kb_heart.png similarity index 100% rename from app-android/res/drawable-xhdpi/kb_heart.png rename to android-app/res/drawable-xhdpi/kb_heart.png diff --git a/app-android/res/drawable-xhdpi/kb_logo.png b/android-app/res/drawable-xhdpi/kb_logo.png similarity index 100% rename from app-android/res/drawable-xhdpi/kb_logo.png rename to android-app/res/drawable-xhdpi/kb_logo.png diff --git a/app-android/res/drawable-xhdpi/kb_paste.png b/android-app/res/drawable-xhdpi/kb_paste.png similarity index 100% rename from app-android/res/drawable-xhdpi/kb_paste.png rename to android-app/res/drawable-xhdpi/kb_paste.png diff --git a/app-android/res/drawable-xhdpi/kb_settings.png b/android-app/res/drawable-xhdpi/kb_settings.png similarity index 100% rename from app-android/res/drawable-xhdpi/kb_settings.png rename to android-app/res/drawable-xhdpi/kb_settings.png diff --git a/app-android/res/drawable-xhdpi/logo.png b/android-app/res/drawable-xhdpi/logo.png similarity index 100% rename from app-android/res/drawable-xhdpi/logo.png rename to android-app/res/drawable-xhdpi/logo.png diff --git a/app-android/res/drawable-xlarge-hdpi/kb_copy.png b/android-app/res/drawable-xlarge-hdpi/kb_copy.png similarity index 100% rename from app-android/res/drawable-xlarge-hdpi/kb_copy.png rename to android-app/res/drawable-xlarge-hdpi/kb_copy.png diff --git a/app-android/res/drawable-xlarge-hdpi/kb_delete.png b/android-app/res/drawable-xlarge-hdpi/kb_delete.png similarity index 100% rename from app-android/res/drawable-xlarge-hdpi/kb_delete.png rename to android-app/res/drawable-xlarge-hdpi/kb_delete.png diff --git a/app-android/res/drawable-xlarge-hdpi/kb_facebook.png b/android-app/res/drawable-xlarge-hdpi/kb_facebook.png similarity index 100% rename from app-android/res/drawable-xlarge-hdpi/kb_facebook.png rename to android-app/res/drawable-xlarge-hdpi/kb_facebook.png diff --git a/app-android/res/drawable-xlarge-hdpi/kb_heart.png b/android-app/res/drawable-xlarge-hdpi/kb_heart.png similarity index 100% rename from app-android/res/drawable-xlarge-hdpi/kb_heart.png rename to android-app/res/drawable-xlarge-hdpi/kb_heart.png diff --git a/app-android/res/drawable-xlarge-hdpi/kb_logo.png b/android-app/res/drawable-xlarge-hdpi/kb_logo.png similarity index 100% rename from app-android/res/drawable-xlarge-hdpi/kb_logo.png rename to android-app/res/drawable-xlarge-hdpi/kb_logo.png diff --git a/app-android/res/drawable-xlarge-hdpi/kb_paste.png b/android-app/res/drawable-xlarge-hdpi/kb_paste.png similarity index 100% rename from app-android/res/drawable-xlarge-hdpi/kb_paste.png rename to android-app/res/drawable-xlarge-hdpi/kb_paste.png diff --git a/app-android/res/drawable-xlarge-hdpi/kb_settings.png b/android-app/res/drawable-xlarge-hdpi/kb_settings.png similarity index 100% rename from app-android/res/drawable-xlarge-hdpi/kb_settings.png rename to android-app/res/drawable-xlarge-hdpi/kb_settings.png diff --git a/app-android/res/drawable/blue_button.xml b/android-app/res/drawable/blue_button.xml similarity index 100% rename from app-android/res/drawable/blue_button.xml rename to android-app/res/drawable/blue_button.xml diff --git a/app-android/res/drawable/blue_button_dark.xml b/android-app/res/drawable/blue_button_dark.xml similarity index 100% rename from app-android/res/drawable/blue_button_dark.xml rename to android-app/res/drawable/blue_button_dark.xml diff --git a/app-android/res/drawable/blue_button_dark_shape.xml b/android-app/res/drawable/blue_button_dark_shape.xml similarity index 100% rename from app-android/res/drawable/blue_button_dark_shape.xml rename to android-app/res/drawable/blue_button_dark_shape.xml diff --git a/app-android/res/drawable/blue_button_shape.xml b/android-app/res/drawable/blue_button_shape.xml similarity index 100% rename from app-android/res/drawable/blue_button_shape.xml rename to android-app/res/drawable/blue_button_shape.xml diff --git a/app-android/res/drawable/default_abs__btn_cab_done_holo_dark.xml b/android-app/res/drawable/default_abs__btn_cab_done_holo_dark.xml similarity index 100% rename from app-android/res/drawable/default_abs__btn_cab_done_holo_dark.xml rename to android-app/res/drawable/default_abs__btn_cab_done_holo_dark.xml diff --git a/app-android/res/drawable/default_abs__item_background_holo_dark.xml b/android-app/res/drawable/default_abs__item_background_holo_dark.xml similarity index 100% rename from app-android/res/drawable/default_abs__item_background_holo_dark.xml rename to android-app/res/drawable/default_abs__item_background_holo_dark.xml diff --git a/app-android/res/drawable/default_abs__list_selector_background_transition_holo_dark.xml b/android-app/res/drawable/default_abs__list_selector_background_transition_holo_dark.xml similarity index 100% rename from app-android/res/drawable/default_abs__list_selector_background_transition_holo_dark.xml rename to android-app/res/drawable/default_abs__list_selector_background_transition_holo_dark.xml diff --git a/app-android/res/drawable/default_abs__list_selector_holo_dark.xml b/android-app/res/drawable/default_abs__list_selector_holo_dark.xml similarity index 100% rename from app-android/res/drawable/default_abs__list_selector_holo_dark.xml rename to android-app/res/drawable/default_abs__list_selector_holo_dark.xml diff --git a/app-android/res/drawable/default_abs__spinner_ab_holo_dark.xml b/android-app/res/drawable/default_abs__spinner_ab_holo_dark.xml similarity index 100% rename from app-android/res/drawable/default_abs__spinner_ab_holo_dark.xml rename to android-app/res/drawable/default_abs__spinner_ab_holo_dark.xml diff --git a/app-android/res/drawable/default_abs__tab_indicator_ab_holo.xml b/android-app/res/drawable/default_abs__tab_indicator_ab_holo.xml similarity index 100% rename from app-android/res/drawable/default_abs__tab_indicator_ab_holo.xml rename to android-app/res/drawable/default_abs__tab_indicator_ab_holo.xml diff --git a/app-android/res/drawable/gray_button.xml b/android-app/res/drawable/gray_button.xml similarity index 100% rename from app-android/res/drawable/gray_button.xml rename to android-app/res/drawable/gray_button.xml diff --git a/app-android/res/drawable/gray_button_dark.xml b/android-app/res/drawable/gray_button_dark.xml similarity index 100% rename from app-android/res/drawable/gray_button_dark.xml rename to android-app/res/drawable/gray_button_dark.xml diff --git a/app-android/res/drawable/gray_button_dark_shape.xml b/android-app/res/drawable/gray_button_dark_shape.xml similarity index 100% rename from app-android/res/drawable/gray_button_dark_shape.xml rename to android-app/res/drawable/gray_button_dark_shape.xml diff --git a/app-android/res/drawable/gray_button_shape.xml b/android-app/res/drawable/gray_button_shape.xml similarity index 100% rename from app-android/res/drawable/gray_button_shape.xml rename to android-app/res/drawable/gray_button_shape.xml diff --git a/app-android/res/drawable/metro_blue_abs__tab_indicator_ab_holo.xml b/android-app/res/drawable/metro_blue_abs__tab_indicator_ab_holo.xml similarity index 100% rename from app-android/res/drawable/metro_blue_abs__tab_indicator_ab_holo.xml rename to android-app/res/drawable/metro_blue_abs__tab_indicator_ab_holo.xml diff --git a/app-android/res/drawable/metro_blue_button.xml b/android-app/res/drawable/metro_blue_button.xml similarity index 100% rename from app-android/res/drawable/metro_blue_button.xml rename to android-app/res/drawable/metro_blue_button.xml diff --git a/app-android/res/drawable/metro_blue_button_shape.xml b/android-app/res/drawable/metro_blue_button_shape.xml similarity index 100% rename from app-android/res/drawable/metro_blue_button_shape.xml rename to android-app/res/drawable/metro_blue_button_shape.xml diff --git a/app-android/res/drawable/metro_blue_list_item.xml b/android-app/res/drawable/metro_blue_list_item.xml similarity index 100% rename from app-android/res/drawable/metro_blue_list_item.xml rename to android-app/res/drawable/metro_blue_list_item.xml diff --git a/app-android/res/drawable/metro_button_dark.xml b/android-app/res/drawable/metro_button_dark.xml similarity index 100% rename from app-android/res/drawable/metro_button_dark.xml rename to android-app/res/drawable/metro_button_dark.xml diff --git a/app-android/res/drawable/metro_button_dark_shape.xml b/android-app/res/drawable/metro_button_dark_shape.xml similarity index 100% rename from app-android/res/drawable/metro_button_dark_shape.xml rename to android-app/res/drawable/metro_button_dark_shape.xml diff --git a/app-android/res/drawable/metro_button_green.xml b/android-app/res/drawable/metro_button_green.xml similarity index 100% rename from app-android/res/drawable/metro_button_green.xml rename to android-app/res/drawable/metro_button_green.xml diff --git a/app-android/res/drawable/metro_button_green_shape.xml b/android-app/res/drawable/metro_button_green_shape.xml similarity index 100% rename from app-android/res/drawable/metro_button_green_shape.xml rename to android-app/res/drawable/metro_button_green_shape.xml diff --git a/app-android/res/drawable/metro_button_light.xml b/android-app/res/drawable/metro_button_light.xml similarity index 100% rename from app-android/res/drawable/metro_button_light.xml rename to android-app/res/drawable/metro_button_light.xml diff --git a/app-android/res/drawable/metro_button_light_shape.xml b/android-app/res/drawable/metro_button_light_shape.xml similarity index 100% rename from app-android/res/drawable/metro_button_light_shape.xml rename to android-app/res/drawable/metro_button_light_shape.xml diff --git a/app-android/res/drawable/metro_button_pressed.xml b/android-app/res/drawable/metro_button_pressed.xml similarity index 100% rename from app-android/res/drawable/metro_button_pressed.xml rename to android-app/res/drawable/metro_button_pressed.xml diff --git a/app-android/res/drawable/metro_button_purple.xml b/android-app/res/drawable/metro_button_purple.xml similarity index 100% rename from app-android/res/drawable/metro_button_purple.xml rename to android-app/res/drawable/metro_button_purple.xml diff --git a/app-android/res/drawable/metro_button_purple_shape.xml b/android-app/res/drawable/metro_button_purple_shape.xml similarity index 100% rename from app-android/res/drawable/metro_button_purple_shape.xml rename to android-app/res/drawable/metro_button_purple_shape.xml diff --git a/app-android/res/drawable/metro_green_list_item.xml b/android-app/res/drawable/metro_green_list_item.xml similarity index 100% rename from app-android/res/drawable/metro_green_list_item.xml rename to android-app/res/drawable/metro_green_list_item.xml diff --git a/app-android/res/drawable/metro_purple_list_item.xml b/android-app/res/drawable/metro_purple_list_item.xml similarity index 100% rename from app-android/res/drawable/metro_purple_list_item.xml rename to android-app/res/drawable/metro_purple_list_item.xml diff --git a/app-android/res/drawable/pane_background.xml b/android-app/res/drawable/pane_background.xml similarity index 100% rename from app-android/res/drawable/pane_background.xml rename to android-app/res/drawable/pane_background.xml diff --git a/app-android/res/drawable/violet_button.xml b/android-app/res/drawable/violet_button.xml similarity index 100% rename from app-android/res/drawable/violet_button.xml rename to android-app/res/drawable/violet_button.xml diff --git a/app-android/res/drawable/violet_button_dark.xml b/android-app/res/drawable/violet_button_dark.xml similarity index 100% rename from app-android/res/drawable/violet_button_dark.xml rename to android-app/res/drawable/violet_button_dark.xml diff --git a/app-android/res/drawable/violet_button_dark_shape.xml b/android-app/res/drawable/violet_button_dark_shape.xml similarity index 100% rename from app-android/res/drawable/violet_button_dark_shape.xml rename to android-app/res/drawable/violet_button_dark_shape.xml diff --git a/app-android/res/drawable/violet_button_shape.xml b/android-app/res/drawable/violet_button_shape.xml similarity index 100% rename from app-android/res/drawable/violet_button_shape.xml rename to android-app/res/drawable/violet_button_shape.xml diff --git a/app-android/res/layout-land/calc_keyboard.xml b/android-app/res/layout-land/calc_keyboard.xml similarity index 100% rename from app-android/res/layout-land/calc_keyboard.xml rename to android-app/res/layout-land/calc_keyboard.xml diff --git a/app-android/res/layout-land/calc_keyboard_mobile.xml b/android-app/res/layout-land/calc_keyboard_mobile.xml similarity index 100% rename from app-android/res/layout-land/calc_keyboard_mobile.xml rename to android-app/res/layout-land/calc_keyboard_mobile.xml diff --git a/app-android/res/layout-land/main_calculator.xml b/android-app/res/layout-land/main_calculator.xml similarity index 100% rename from app-android/res/layout-land/main_calculator.xml rename to android-app/res/layout-land/main_calculator.xml diff --git a/app-android/res/layout-land/main_calculator_mobile.xml b/android-app/res/layout-land/main_calculator_mobile.xml similarity index 100% rename from app-android/res/layout-land/main_calculator_mobile.xml rename to android-app/res/layout-land/main_calculator_mobile.xml diff --git a/app-android/res/layout-land/main_first_pane.xml b/android-app/res/layout-land/main_first_pane.xml similarity index 100% rename from app-android/res/layout-land/main_first_pane.xml rename to android-app/res/layout-land/main_first_pane.xml diff --git a/app-android/res/layout-land/main_first_pane_mobile.xml b/android-app/res/layout-land/main_first_pane_mobile.xml similarity index 100% rename from app-android/res/layout-land/main_first_pane_mobile.xml rename to android-app/res/layout-land/main_first_pane_mobile.xml diff --git a/app-android/res/layout-large-land/calc_keyboard.xml b/android-app/res/layout-large-land/calc_keyboard.xml similarity index 100% rename from app-android/res/layout-large-land/calc_keyboard.xml rename to android-app/res/layout-large-land/calc_keyboard.xml diff --git a/app-android/res/layout-large-land/main_calculator.xml b/android-app/res/layout-large-land/main_calculator.xml similarity index 100% rename from app-android/res/layout-large-land/main_calculator.xml rename to android-app/res/layout-large-land/main_calculator.xml diff --git a/app-android/res/layout-large/calc_display.xml b/android-app/res/layout-large/calc_display.xml similarity index 100% rename from app-android/res/layout-large/calc_display.xml rename to android-app/res/layout-large/calc_display.xml diff --git a/app-android/res/layout-large/calc_editor.xml b/android-app/res/layout-large/calc_editor.xml similarity index 100% rename from app-android/res/layout-large/calc_editor.xml rename to android-app/res/layout-large/calc_editor.xml diff --git a/app-android/res/layout-large/calc_keyboard.xml b/android-app/res/layout-large/calc_keyboard.xml similarity index 100% rename from app-android/res/layout-large/calc_keyboard.xml rename to android-app/res/layout-large/calc_keyboard.xml diff --git a/app-android/res/layout-large/main_calculator.xml b/android-app/res/layout-large/main_calculator.xml similarity index 100% rename from app-android/res/layout-large/main_calculator.xml rename to android-app/res/layout-large/main_calculator.xml diff --git a/app-android/res/layout-xlarge-land/calc_keyboard.xml b/android-app/res/layout-xlarge-land/calc_keyboard.xml similarity index 100% rename from app-android/res/layout-xlarge-land/calc_keyboard.xml rename to android-app/res/layout-xlarge-land/calc_keyboard.xml diff --git a/app-android/res/layout-xlarge-land/main_calculator.xml b/android-app/res/layout-xlarge-land/main_calculator.xml similarity index 100% rename from app-android/res/layout-xlarge-land/main_calculator.xml rename to android-app/res/layout-xlarge-land/main_calculator.xml diff --git a/app-android/res/layout-xlarge/calc_display.xml b/android-app/res/layout-xlarge/calc_display.xml similarity index 100% rename from app-android/res/layout-xlarge/calc_display.xml rename to android-app/res/layout-xlarge/calc_display.xml diff --git a/app-android/res/layout-xlarge/calc_editor.xml b/android-app/res/layout-xlarge/calc_editor.xml similarity index 100% rename from app-android/res/layout-xlarge/calc_editor.xml rename to android-app/res/layout-xlarge/calc_editor.xml diff --git a/app-android/res/layout-xlarge/calc_keyboard.xml b/android-app/res/layout-xlarge/calc_keyboard.xml similarity index 100% rename from app-android/res/layout-xlarge/calc_keyboard.xml rename to android-app/res/layout-xlarge/calc_keyboard.xml diff --git a/app-android/res/layout-xlarge/main_calculator.xml b/android-app/res/layout-xlarge/main_calculator.xml similarity index 100% rename from app-android/res/layout-xlarge/main_calculator.xml rename to android-app/res/layout-xlarge/main_calculator.xml diff --git a/app-android/res/layout/about_fragment.xml b/android-app/res/layout/about_fragment.xml similarity index 100% rename from app-android/res/layout/about_fragment.xml rename to android-app/res/layout/about_fragment.xml diff --git a/app-android/res/layout/ad.xml b/android-app/res/layout/ad.xml similarity index 100% rename from app-android/res/layout/ad.xml rename to android-app/res/layout/ad.xml diff --git a/app-android/res/layout/admob_pref.xml b/android-app/res/layout/admob_pref.xml similarity index 100% rename from app-android/res/layout/admob_pref.xml rename to android-app/res/layout/admob_pref.xml diff --git a/app-android/res/layout/calc_clear_button.xml b/android-app/res/layout/calc_clear_button.xml similarity index 100% rename from app-android/res/layout/calc_clear_button.xml rename to android-app/res/layout/calc_clear_button.xml diff --git a/app-android/res/layout/calc_copy_button.xml b/android-app/res/layout/calc_copy_button.xml similarity index 100% rename from app-android/res/layout/calc_copy_button.xml rename to android-app/res/layout/calc_copy_button.xml diff --git a/app-android/res/layout/calc_display.xml b/android-app/res/layout/calc_display.xml similarity index 100% rename from app-android/res/layout/calc_display.xml rename to android-app/res/layout/calc_display.xml diff --git a/app-android/res/layout/calc_display_mobile.xml b/android-app/res/layout/calc_display_mobile.xml similarity index 100% rename from app-android/res/layout/calc_display_mobile.xml rename to android-app/res/layout/calc_display_mobile.xml diff --git a/app-android/res/layout/calc_division_button.xml b/android-app/res/layout/calc_division_button.xml similarity index 100% rename from app-android/res/layout/calc_division_button.xml rename to android-app/res/layout/calc_division_button.xml diff --git a/app-android/res/layout/calc_donate_button.xml b/android-app/res/layout/calc_donate_button.xml similarity index 100% rename from app-android/res/layout/calc_donate_button.xml rename to android-app/res/layout/calc_donate_button.xml diff --git a/app-android/res/layout/calc_dot_button.xml b/android-app/res/layout/calc_dot_button.xml similarity index 100% rename from app-android/res/layout/calc_dot_button.xml rename to android-app/res/layout/calc_dot_button.xml diff --git a/app-android/res/layout/calc_editor.xml b/android-app/res/layout/calc_editor.xml similarity index 100% rename from app-android/res/layout/calc_editor.xml rename to android-app/res/layout/calc_editor.xml diff --git a/app-android/res/layout/calc_editor_mobile.xml b/android-app/res/layout/calc_editor_mobile.xml similarity index 100% rename from app-android/res/layout/calc_editor_mobile.xml rename to android-app/res/layout/calc_editor_mobile.xml diff --git a/app-android/res/layout/calc_eight_digit_button.xml b/android-app/res/layout/calc_eight_digit_button.xml similarity index 100% rename from app-android/res/layout/calc_eight_digit_button.xml rename to android-app/res/layout/calc_eight_digit_button.xml diff --git a/app-android/res/layout/calc_empty_button.xml b/android-app/res/layout/calc_empty_button.xml similarity index 100% rename from app-android/res/layout/calc_empty_button.xml rename to android-app/res/layout/calc_empty_button.xml diff --git a/app-android/res/layout/calc_equals_button.xml b/android-app/res/layout/calc_equals_button.xml similarity index 100% rename from app-android/res/layout/calc_equals_button.xml rename to android-app/res/layout/calc_equals_button.xml diff --git a/app-android/res/layout/calc_erase_button.xml b/android-app/res/layout/calc_erase_button.xml similarity index 100% rename from app-android/res/layout/calc_erase_button.xml rename to android-app/res/layout/calc_erase_button.xml diff --git a/app-android/res/layout/calc_five_digit_button.xml b/android-app/res/layout/calc_five_digit_button.xml similarity index 100% rename from app-android/res/layout/calc_five_digit_button.xml rename to android-app/res/layout/calc_five_digit_button.xml diff --git a/app-android/res/layout/calc_four_digit_button.xml b/android-app/res/layout/calc_four_digit_button.xml similarity index 100% rename from app-android/res/layout/calc_four_digit_button.xml rename to android-app/res/layout/calc_four_digit_button.xml diff --git a/app-android/res/layout/calc_functions_button.xml b/android-app/res/layout/calc_functions_button.xml similarity index 100% rename from app-android/res/layout/calc_functions_button.xml rename to android-app/res/layout/calc_functions_button.xml diff --git a/app-android/res/layout/calc_history_button.xml b/android-app/res/layout/calc_history_button.xml similarity index 100% rename from app-android/res/layout/calc_history_button.xml rename to android-app/res/layout/calc_history_button.xml diff --git a/app-android/res/layout/calc_keyboard.xml b/android-app/res/layout/calc_keyboard.xml similarity index 100% rename from app-android/res/layout/calc_keyboard.xml rename to android-app/res/layout/calc_keyboard.xml diff --git a/app-android/res/layout/calc_keyboard_mobile.xml b/android-app/res/layout/calc_keyboard_mobile.xml similarity index 100% rename from app-android/res/layout/calc_keyboard_mobile.xml rename to android-app/res/layout/calc_keyboard_mobile.xml diff --git a/app-android/res/layout/calc_left_button.xml b/android-app/res/layout/calc_left_button.xml similarity index 100% rename from app-android/res/layout/calc_left_button.xml rename to android-app/res/layout/calc_left_button.xml diff --git a/app-android/res/layout/calc_multiplication_button.xml b/android-app/res/layout/calc_multiplication_button.xml similarity index 100% rename from app-android/res/layout/calc_multiplication_button.xml rename to android-app/res/layout/calc_multiplication_button.xml diff --git a/app-android/res/layout/calc_nine_digit_button.xml b/android-app/res/layout/calc_nine_digit_button.xml similarity index 100% rename from app-android/res/layout/calc_nine_digit_button.xml rename to android-app/res/layout/calc_nine_digit_button.xml diff --git a/app-android/res/layout/calc_one_digit_button.xml b/android-app/res/layout/calc_one_digit_button.xml similarity index 100% rename from app-android/res/layout/calc_one_digit_button.xml rename to android-app/res/layout/calc_one_digit_button.xml diff --git a/app-android/res/layout/calc_operators_button.xml b/android-app/res/layout/calc_operators_button.xml similarity index 100% rename from app-android/res/layout/calc_operators_button.xml rename to android-app/res/layout/calc_operators_button.xml diff --git a/app-android/res/layout/calc_paste_button.xml b/android-app/res/layout/calc_paste_button.xml similarity index 100% rename from app-android/res/layout/calc_paste_button.xml rename to android-app/res/layout/calc_paste_button.xml diff --git a/app-android/res/layout/calc_plot_view.xml b/android-app/res/layout/calc_plot_view.xml similarity index 100% rename from app-android/res/layout/calc_plot_view.xml rename to android-app/res/layout/calc_plot_view.xml diff --git a/app-android/res/layout/calc_plus_button.xml b/android-app/res/layout/calc_plus_button.xml similarity index 100% rename from app-android/res/layout/calc_plus_button.xml rename to android-app/res/layout/calc_plus_button.xml diff --git a/app-android/res/layout/calc_right_button.xml b/android-app/res/layout/calc_right_button.xml similarity index 100% rename from app-android/res/layout/calc_right_button.xml rename to android-app/res/layout/calc_right_button.xml diff --git a/app-android/res/layout/calc_round_brackets_button.xml b/android-app/res/layout/calc_round_brackets_button.xml similarity index 100% rename from app-android/res/layout/calc_round_brackets_button.xml rename to android-app/res/layout/calc_round_brackets_button.xml diff --git a/app-android/res/layout/calc_seven_digit_button.xml b/android-app/res/layout/calc_seven_digit_button.xml similarity index 100% rename from app-android/res/layout/calc_seven_digit_button.xml rename to android-app/res/layout/calc_seven_digit_button.xml diff --git a/app-android/res/layout/calc_six_digit_button.xml b/android-app/res/layout/calc_six_digit_button.xml similarity index 100% rename from app-android/res/layout/calc_six_digit_button.xml rename to android-app/res/layout/calc_six_digit_button.xml diff --git a/app-android/res/layout/calc_subtraction_button.xml b/android-app/res/layout/calc_subtraction_button.xml similarity index 100% rename from app-android/res/layout/calc_subtraction_button.xml rename to android-app/res/layout/calc_subtraction_button.xml diff --git a/app-android/res/layout/calc_three_digit_button.xml b/android-app/res/layout/calc_three_digit_button.xml similarity index 100% rename from app-android/res/layout/calc_three_digit_button.xml rename to android-app/res/layout/calc_three_digit_button.xml diff --git a/app-android/res/layout/calc_title.xml b/android-app/res/layout/calc_title.xml similarity index 100% rename from app-android/res/layout/calc_title.xml rename to android-app/res/layout/calc_title.xml diff --git a/app-android/res/layout/calc_two_digit_button.xml b/android-app/res/layout/calc_two_digit_button.xml similarity index 100% rename from app-android/res/layout/calc_two_digit_button.xml rename to android-app/res/layout/calc_two_digit_button.xml diff --git a/app-android/res/layout/calc_vars_button.xml b/android-app/res/layout/calc_vars_button.xml similarity index 100% rename from app-android/res/layout/calc_vars_button.xml rename to android-app/res/layout/calc_vars_button.xml diff --git a/app-android/res/layout/calc_zero_digit_button.xml b/android-app/res/layout/calc_zero_digit_button.xml similarity index 100% rename from app-android/res/layout/calc_zero_digit_button.xml rename to android-app/res/layout/calc_zero_digit_button.xml diff --git a/app-android/res/layout/calculator_messages_dialog.xml b/android-app/res/layout/calculator_messages_dialog.xml similarity index 100% rename from app-android/res/layout/calculator_messages_dialog.xml rename to android-app/res/layout/calculator_messages_dialog.xml diff --git a/app-android/res/layout/calculator_messages_dialog_message.xml b/android-app/res/layout/calculator_messages_dialog_message.xml similarity index 100% rename from app-android/res/layout/calculator_messages_dialog_message.xml rename to android-app/res/layout/calculator_messages_dialog_message.xml diff --git a/app-android/res/layout/display_error_message.xml b/android-app/res/layout/display_error_message.xml similarity index 100% rename from app-android/res/layout/display_error_message.xml rename to android-app/res/layout/display_error_message.xml diff --git a/app-android/res/layout/drag_button_calibration.xml b/android-app/res/layout/drag_button_calibration.xml similarity index 100% rename from app-android/res/layout/drag_button_calibration.xml rename to android-app/res/layout/drag_button_calibration.xml diff --git a/app-android/res/layout/feedback.xml b/android-app/res/layout/feedback.xml similarity index 100% rename from app-android/res/layout/feedback.xml rename to android-app/res/layout/feedback.xml diff --git a/app-android/res/layout/function_add_param.xml b/android-app/res/layout/function_add_param.xml similarity index 100% rename from app-android/res/layout/function_add_param.xml rename to android-app/res/layout/function_add_param.xml diff --git a/app-android/res/layout/function_edit.xml b/android-app/res/layout/function_edit.xml similarity index 100% rename from app-android/res/layout/function_edit.xml rename to android-app/res/layout/function_edit.xml diff --git a/app-android/res/layout/function_edit_param.xml b/android-app/res/layout/function_edit_param.xml similarity index 100% rename from app-android/res/layout/function_edit_param.xml rename to android-app/res/layout/function_edit_param.xml diff --git a/app-android/res/layout/help_faq_fragment.xml b/android-app/res/layout/help_faq_fragment.xml similarity index 100% rename from app-android/res/layout/help_faq_fragment.xml rename to android-app/res/layout/help_faq_fragment.xml diff --git a/app-android/res/layout/help_hints_fragment.xml b/android-app/res/layout/help_hints_fragment.xml similarity index 100% rename from app-android/res/layout/help_hints_fragment.xml rename to android-app/res/layout/help_hints_fragment.xml diff --git a/app-android/res/layout/help_screens_fragment.xml b/android-app/res/layout/help_screens_fragment.xml similarity index 100% rename from app-android/res/layout/help_screens_fragment.xml rename to android-app/res/layout/help_screens_fragment.xml diff --git a/app-android/res/layout/history_edit.xml b/android-app/res/layout/history_edit.xml similarity index 100% rename from app-android/res/layout/history_edit.xml rename to android-app/res/layout/history_edit.xml diff --git a/app-android/res/layout/history_fragment.xml b/android-app/res/layout/history_fragment.xml similarity index 100% rename from app-android/res/layout/history_fragment.xml rename to android-app/res/layout/history_fragment.xml diff --git a/app-android/res/layout/history_item.xml b/android-app/res/layout/history_item.xml similarity index 100% rename from app-android/res/layout/history_item.xml rename to android-app/res/layout/history_item.xml diff --git a/app-android/res/layout/main_calculator.xml b/android-app/res/layout/main_calculator.xml similarity index 100% rename from app-android/res/layout/main_calculator.xml rename to android-app/res/layout/main_calculator.xml diff --git a/app-android/res/layout/main_calculator_mobile.xml b/android-app/res/layout/main_calculator_mobile.xml similarity index 100% rename from app-android/res/layout/main_calculator_mobile.xml rename to android-app/res/layout/main_calculator_mobile.xml diff --git a/app-android/res/layout/main_empty.xml b/android-app/res/layout/main_empty.xml similarity index 100% rename from app-android/res/layout/main_empty.xml rename to android-app/res/layout/main_empty.xml diff --git a/app-android/res/layout/main_empty_multi_pane.xml b/android-app/res/layout/main_empty_multi_pane.xml similarity index 100% rename from app-android/res/layout/main_empty_multi_pane.xml rename to android-app/res/layout/main_empty_multi_pane.xml diff --git a/app-android/res/layout/math_entities_fragment.xml b/android-app/res/layout/math_entities_fragment.xml similarity index 100% rename from app-android/res/layout/math_entities_fragment.xml rename to android-app/res/layout/math_entities_fragment.xml diff --git a/app-android/res/layout/math_entity.xml b/android-app/res/layout/math_entity.xml similarity index 100% rename from app-android/res/layout/math_entity.xml rename to android-app/res/layout/math_entity.xml diff --git a/app-android/res/layout/notespp_announce.xml b/android-app/res/layout/notespp_announce.xml similarity index 100% rename from app-android/res/layout/notespp_announce.xml rename to android-app/res/layout/notespp_announce.xml diff --git a/app-android/res/layout/onscreen_display.xml b/android-app/res/layout/onscreen_display.xml similarity index 100% rename from app-android/res/layout/onscreen_display.xml rename to android-app/res/layout/onscreen_display.xml diff --git a/app-android/res/layout/onscreen_editor.xml b/android-app/res/layout/onscreen_editor.xml similarity index 100% rename from app-android/res/layout/onscreen_editor.xml rename to android-app/res/layout/onscreen_editor.xml diff --git a/app-android/res/layout/onscreen_footer.xml b/android-app/res/layout/onscreen_footer.xml similarity index 100% rename from app-android/res/layout/onscreen_footer.xml rename to android-app/res/layout/onscreen_footer.xml diff --git a/app-android/res/layout/onscreen_header.xml b/android-app/res/layout/onscreen_header.xml similarity index 100% rename from app-android/res/layout/onscreen_header.xml rename to android-app/res/layout/onscreen_header.xml diff --git a/app-android/res/layout/onscreen_keyboard.xml b/android-app/res/layout/onscreen_keyboard.xml similarity index 100% rename from app-android/res/layout/onscreen_keyboard.xml rename to android-app/res/layout/onscreen_keyboard.xml diff --git a/app-android/res/layout/onscreen_layout.xml b/android-app/res/layout/onscreen_layout.xml similarity index 100% rename from app-android/res/layout/onscreen_layout.xml rename to android-app/res/layout/onscreen_layout.xml diff --git a/app-android/res/layout/plot_fragment.xml b/android-app/res/layout/plot_fragment.xml similarity index 100% rename from app-android/res/layout/plot_fragment.xml rename to android-app/res/layout/plot_fragment.xml diff --git a/app-android/res/layout/release_notes_fragment.xml b/android-app/res/layout/release_notes_fragment.xml similarity index 100% rename from app-android/res/layout/release_notes_fragment.xml rename to android-app/res/layout/release_notes_fragment.xml diff --git a/app-android/res/layout/saved_history_item.xml b/android-app/res/layout/saved_history_item.xml similarity index 100% rename from app-android/res/layout/saved_history_item.xml rename to android-app/res/layout/saved_history_item.xml diff --git a/app-android/res/layout/tabs.xml b/android-app/res/layout/tabs.xml similarity index 100% rename from app-android/res/layout/tabs.xml rename to android-app/res/layout/tabs.xml diff --git a/app-android/res/layout/unit_converter.xml b/android-app/res/layout/unit_converter.xml similarity index 100% rename from app-android/res/layout/unit_converter.xml rename to android-app/res/layout/unit_converter.xml diff --git a/app-android/res/layout/var_edit.xml b/android-app/res/layout/var_edit.xml similarity index 100% rename from app-android/res/layout/var_edit.xml rename to android-app/res/layout/var_edit.xml diff --git a/app-android/res/layout/vars_fragment.xml b/android-app/res/layout/vars_fragment.xml similarity index 100% rename from app-android/res/layout/vars_fragment.xml rename to android-app/res/layout/vars_fragment.xml diff --git a/app-android/res/layout/widget_app_button.xml b/android-app/res/layout/widget_app_button.xml similarity index 100% rename from app-android/res/layout/widget_app_button.xml rename to android-app/res/layout/widget_app_button.xml diff --git a/app-android/res/layout/widget_clear_button.xml b/android-app/res/layout/widget_clear_button.xml similarity index 100% rename from app-android/res/layout/widget_clear_button.xml rename to android-app/res/layout/widget_clear_button.xml diff --git a/app-android/res/layout/widget_copy_button.xml b/android-app/res/layout/widget_copy_button.xml similarity index 100% rename from app-android/res/layout/widget_copy_button.xml rename to android-app/res/layout/widget_copy_button.xml diff --git a/app-android/res/layout/widget_display.xml b/android-app/res/layout/widget_display.xml similarity index 100% rename from app-android/res/layout/widget_display.xml rename to android-app/res/layout/widget_display.xml diff --git a/app-android/res/layout/widget_division_button.xml b/android-app/res/layout/widget_division_button.xml similarity index 100% rename from app-android/res/layout/widget_division_button.xml rename to android-app/res/layout/widget_division_button.xml diff --git a/app-android/res/layout/widget_dot_button.xml b/android-app/res/layout/widget_dot_button.xml similarity index 100% rename from app-android/res/layout/widget_dot_button.xml rename to android-app/res/layout/widget_dot_button.xml diff --git a/app-android/res/layout/widget_editor.xml b/android-app/res/layout/widget_editor.xml similarity index 100% rename from app-android/res/layout/widget_editor.xml rename to android-app/res/layout/widget_editor.xml diff --git a/app-android/res/layout/widget_eight_digit_button.xml b/android-app/res/layout/widget_eight_digit_button.xml similarity index 100% rename from app-android/res/layout/widget_eight_digit_button.xml rename to android-app/res/layout/widget_eight_digit_button.xml diff --git a/app-android/res/layout/widget_equals_button.xml b/android-app/res/layout/widget_equals_button.xml similarity index 100% rename from app-android/res/layout/widget_equals_button.xml rename to android-app/res/layout/widget_equals_button.xml diff --git a/app-android/res/layout/widget_erase_button.xml b/android-app/res/layout/widget_erase_button.xml similarity index 100% rename from app-android/res/layout/widget_erase_button.xml rename to android-app/res/layout/widget_erase_button.xml diff --git a/app-android/res/layout/widget_five_digit_button.xml b/android-app/res/layout/widget_five_digit_button.xml similarity index 100% rename from app-android/res/layout/widget_five_digit_button.xml rename to android-app/res/layout/widget_five_digit_button.xml diff --git a/app-android/res/layout/widget_four_digit_button.xml b/android-app/res/layout/widget_four_digit_button.xml similarity index 100% rename from app-android/res/layout/widget_four_digit_button.xml rename to android-app/res/layout/widget_four_digit_button.xml diff --git a/app-android/res/layout/widget_functions_button.xml b/android-app/res/layout/widget_functions_button.xml similarity index 100% rename from app-android/res/layout/widget_functions_button.xml rename to android-app/res/layout/widget_functions_button.xml diff --git a/app-android/res/layout/widget_history_button.xml b/android-app/res/layout/widget_history_button.xml similarity index 100% rename from app-android/res/layout/widget_history_button.xml rename to android-app/res/layout/widget_history_button.xml diff --git a/app-android/res/layout/widget_keyboard.xml b/android-app/res/layout/widget_keyboard.xml similarity index 100% rename from app-android/res/layout/widget_keyboard.xml rename to android-app/res/layout/widget_keyboard.xml diff --git a/app-android/res/layout/widget_layout.xml b/android-app/res/layout/widget_layout.xml similarity index 100% rename from app-android/res/layout/widget_layout.xml rename to android-app/res/layout/widget_layout.xml diff --git a/app-android/res/layout/widget_left_button.xml b/android-app/res/layout/widget_left_button.xml similarity index 100% rename from app-android/res/layout/widget_left_button.xml rename to android-app/res/layout/widget_left_button.xml diff --git a/app-android/res/layout/widget_like_button.xml b/android-app/res/layout/widget_like_button.xml similarity index 100% rename from app-android/res/layout/widget_like_button.xml rename to android-app/res/layout/widget_like_button.xml diff --git a/app-android/res/layout/widget_multiplication_button.xml b/android-app/res/layout/widget_multiplication_button.xml similarity index 100% rename from app-android/res/layout/widget_multiplication_button.xml rename to android-app/res/layout/widget_multiplication_button.xml diff --git a/app-android/res/layout/widget_nine_digit_button.xml b/android-app/res/layout/widget_nine_digit_button.xml similarity index 100% rename from app-android/res/layout/widget_nine_digit_button.xml rename to android-app/res/layout/widget_nine_digit_button.xml diff --git a/app-android/res/layout/widget_one_digit_button.xml b/android-app/res/layout/widget_one_digit_button.xml similarity index 100% rename from app-android/res/layout/widget_one_digit_button.xml rename to android-app/res/layout/widget_one_digit_button.xml diff --git a/app-android/res/layout/widget_paste_button.xml b/android-app/res/layout/widget_paste_button.xml similarity index 100% rename from app-android/res/layout/widget_paste_button.xml rename to android-app/res/layout/widget_paste_button.xml diff --git a/app-android/res/layout/widget_percent_button.xml b/android-app/res/layout/widget_percent_button.xml similarity index 100% rename from app-android/res/layout/widget_percent_button.xml rename to android-app/res/layout/widget_percent_button.xml diff --git a/app-android/res/layout/widget_plus_button.xml b/android-app/res/layout/widget_plus_button.xml similarity index 100% rename from app-android/res/layout/widget_plus_button.xml rename to android-app/res/layout/widget_plus_button.xml diff --git a/app-android/res/layout/widget_power_button.xml b/android-app/res/layout/widget_power_button.xml similarity index 100% rename from app-android/res/layout/widget_power_button.xml rename to android-app/res/layout/widget_power_button.xml diff --git a/app-android/res/layout/widget_right_button.xml b/android-app/res/layout/widget_right_button.xml similarity index 100% rename from app-android/res/layout/widget_right_button.xml rename to android-app/res/layout/widget_right_button.xml diff --git a/app-android/res/layout/widget_round_brackets_button.xml b/android-app/res/layout/widget_round_brackets_button.xml similarity index 100% rename from app-android/res/layout/widget_round_brackets_button.xml rename to android-app/res/layout/widget_round_brackets_button.xml diff --git a/app-android/res/layout/widget_settings_button.xml b/android-app/res/layout/widget_settings_button.xml similarity index 100% rename from app-android/res/layout/widget_settings_button.xml rename to android-app/res/layout/widget_settings_button.xml diff --git a/app-android/res/layout/widget_seven_digit_button.xml b/android-app/res/layout/widget_seven_digit_button.xml similarity index 100% rename from app-android/res/layout/widget_seven_digit_button.xml rename to android-app/res/layout/widget_seven_digit_button.xml diff --git a/app-android/res/layout/widget_six_digit_button.xml b/android-app/res/layout/widget_six_digit_button.xml similarity index 100% rename from app-android/res/layout/widget_six_digit_button.xml rename to android-app/res/layout/widget_six_digit_button.xml diff --git a/app-android/res/layout/widget_subtraction_button.xml b/android-app/res/layout/widget_subtraction_button.xml similarity index 100% rename from app-android/res/layout/widget_subtraction_button.xml rename to android-app/res/layout/widget_subtraction_button.xml diff --git a/app-android/res/layout/widget_three_digit_button.xml b/android-app/res/layout/widget_three_digit_button.xml similarity index 100% rename from app-android/res/layout/widget_three_digit_button.xml rename to android-app/res/layout/widget_three_digit_button.xml diff --git a/app-android/res/layout/widget_two_digit_button.xml b/android-app/res/layout/widget_two_digit_button.xml similarity index 100% rename from app-android/res/layout/widget_two_digit_button.xml rename to android-app/res/layout/widget_two_digit_button.xml diff --git a/app-android/res/layout/widget_vars_button.xml b/android-app/res/layout/widget_vars_button.xml similarity index 100% rename from app-android/res/layout/widget_vars_button.xml rename to android-app/res/layout/widget_vars_button.xml diff --git a/app-android/res/layout/widget_zero_digit_button.xml b/android-app/res/layout/widget_zero_digit_button.xml similarity index 100% rename from app-android/res/layout/widget_zero_digit_button.xml rename to android-app/res/layout/widget_zero_digit_button.xml diff --git a/app-android/res/menu/functions_menu.xml b/android-app/res/menu/functions_menu.xml similarity index 100% rename from app-android/res/menu/functions_menu.xml rename to android-app/res/menu/functions_menu.xml diff --git a/app-android/res/menu/history_menu.xml b/android-app/res/menu/history_menu.xml similarity index 100% rename from app-android/res/menu/history_menu.xml rename to android-app/res/menu/history_menu.xml diff --git a/app-android/res/menu/plot_menu.xml b/android-app/res/menu/plot_menu.xml similarity index 100% rename from app-android/res/menu/plot_menu.xml rename to android-app/res/menu/plot_menu.xml diff --git a/app-android/res/menu/vars_menu.xml b/android-app/res/menu/vars_menu.xml similarity index 100% rename from app-android/res/menu/vars_menu.xml rename to android-app/res/menu/vars_menu.xml diff --git a/app-android/res/values-es/text_about.xml b/android-app/res/values-es/text_about.xml similarity index 100% rename from app-android/res/values-es/text_about.xml rename to android-app/res/values-es/text_about.xml diff --git a/app-android/res/values-es/text_functions.xml b/android-app/res/values-es/text_functions.xml similarity index 100% rename from app-android/res/values-es/text_functions.xml rename to android-app/res/values-es/text_functions.xml diff --git a/app-android/res/values-es/text_help.xml b/android-app/res/values-es/text_help.xml similarity index 100% rename from app-android/res/values-es/text_help.xml rename to android-app/res/values-es/text_help.xml diff --git a/app-android/res/values-es/text_operators.xml b/android-app/res/values-es/text_operators.xml similarity index 100% rename from app-android/res/values-es/text_operators.xml rename to android-app/res/values-es/text_operators.xml diff --git a/app-android/res/values-es/text_strings.xml b/android-app/res/values-es/text_strings.xml similarity index 100% rename from app-android/res/values-es/text_strings.xml rename to android-app/res/values-es/text_strings.xml diff --git a/app-android/res/values-es/text_vars.xml b/android-app/res/values-es/text_vars.xml similarity index 100% rename from app-android/res/values-es/text_vars.xml rename to android-app/res/values-es/text_vars.xml diff --git a/app-android/res/values-it/text_about.xml b/android-app/res/values-it/text_about.xml similarity index 100% rename from app-android/res/values-it/text_about.xml rename to android-app/res/values-it/text_about.xml diff --git a/app-android/res/values-it/text_functions.xml b/android-app/res/values-it/text_functions.xml similarity index 100% rename from app-android/res/values-it/text_functions.xml rename to android-app/res/values-it/text_functions.xml diff --git a/app-android/res/values-it/text_help.xml b/android-app/res/values-it/text_help.xml similarity index 100% rename from app-android/res/values-it/text_help.xml rename to android-app/res/values-it/text_help.xml diff --git a/app-android/res/values-it/text_operators.xml b/android-app/res/values-it/text_operators.xml similarity index 100% rename from app-android/res/values-it/text_operators.xml rename to android-app/res/values-it/text_operators.xml diff --git a/app-android/res/values-it/text_strings.xml b/android-app/res/values-it/text_strings.xml similarity index 100% rename from app-android/res/values-it/text_strings.xml rename to android-app/res/values-it/text_strings.xml diff --git a/app-android/res/values-it/text_vars.xml b/android-app/res/values-it/text_vars.xml similarity index 100% rename from app-android/res/values-it/text_vars.xml rename to android-app/res/values-it/text_vars.xml diff --git a/app-android/res/values-large-hdpi/dimens.xml b/android-app/res/values-large-hdpi/dimens.xml similarity index 100% rename from app-android/res/values-large-hdpi/dimens.xml rename to android-app/res/values-large-hdpi/dimens.xml diff --git a/app-android/res/values-large-mdpi/dimens.xml b/android-app/res/values-large-mdpi/dimens.xml similarity index 100% rename from app-android/res/values-large-mdpi/dimens.xml rename to android-app/res/values-large-mdpi/dimens.xml diff --git a/app-android/res/values-large-tvdpi/dimens.xml b/android-app/res/values-large-tvdpi/dimens.xml similarity index 100% rename from app-android/res/values-large-tvdpi/dimens.xml rename to android-app/res/values-large-tvdpi/dimens.xml diff --git a/app-android/res/values-large/dimens.xml b/android-app/res/values-large/dimens.xml similarity index 100% rename from app-android/res/values-large/dimens.xml rename to android-app/res/values-large/dimens.xml diff --git a/app-android/res/values-normal-hdpi/dimens.xml b/android-app/res/values-normal-hdpi/dimens.xml similarity index 100% rename from app-android/res/values-normal-hdpi/dimens.xml rename to android-app/res/values-normal-hdpi/dimens.xml diff --git a/app-android/res/values-normal-mdpi/dimens.xml b/android-app/res/values-normal-mdpi/dimens.xml similarity index 100% rename from app-android/res/values-normal-mdpi/dimens.xml rename to android-app/res/values-normal-mdpi/dimens.xml diff --git a/app-android/res/values-normal-tvdpi/dimens.xml b/android-app/res/values-normal-tvdpi/dimens.xml similarity index 100% rename from app-android/res/values-normal-tvdpi/dimens.xml rename to android-app/res/values-normal-tvdpi/dimens.xml diff --git a/app-android/res/values-normal-xhdpi/dimens.xml b/android-app/res/values-normal-xhdpi/dimens.xml similarity index 100% rename from app-android/res/values-normal-xhdpi/dimens.xml rename to android-app/res/values-normal-xhdpi/dimens.xml diff --git a/app-android/res/values-normal/dimens.xml b/android-app/res/values-normal/dimens.xml similarity index 100% rename from app-android/res/values-normal/dimens.xml rename to android-app/res/values-normal/dimens.xml diff --git a/app-android/res/values-ru/text_about.xml b/android-app/res/values-ru/text_about.xml similarity index 100% rename from app-android/res/values-ru/text_about.xml rename to android-app/res/values-ru/text_about.xml diff --git a/app-android/res/values-ru/text_functions.xml b/android-app/res/values-ru/text_functions.xml similarity index 100% rename from app-android/res/values-ru/text_functions.xml rename to android-app/res/values-ru/text_functions.xml diff --git a/app-android/res/values-ru/text_help.xml b/android-app/res/values-ru/text_help.xml similarity index 100% rename from app-android/res/values-ru/text_help.xml rename to android-app/res/values-ru/text_help.xml diff --git a/app-android/res/values-ru/text_operators.xml b/android-app/res/values-ru/text_operators.xml similarity index 100% rename from app-android/res/values-ru/text_operators.xml rename to android-app/res/values-ru/text_operators.xml diff --git a/app-android/res/values-ru/text_preferences.xml b/android-app/res/values-ru/text_preferences.xml similarity index 100% rename from app-android/res/values-ru/text_preferences.xml rename to android-app/res/values-ru/text_preferences.xml diff --git a/app-android/res/values-ru/text_strings.xml b/android-app/res/values-ru/text_strings.xml similarity index 100% rename from app-android/res/values-ru/text_strings.xml rename to android-app/res/values-ru/text_strings.xml diff --git a/app-android/res/values-ru/text_vars.xml b/android-app/res/values-ru/text_vars.xml similarity index 100% rename from app-android/res/values-ru/text_vars.xml rename to android-app/res/values-ru/text_vars.xml diff --git a/app-android/res/values-small-hdpi/dimens.xml b/android-app/res/values-small-hdpi/dimens.xml similarity index 100% rename from app-android/res/values-small-hdpi/dimens.xml rename to android-app/res/values-small-hdpi/dimens.xml diff --git a/app-android/res/values-small-xhdpi/dimens.xml b/android-app/res/values-small-xhdpi/dimens.xml similarity index 100% rename from app-android/res/values-small-xhdpi/dimens.xml rename to android-app/res/values-small-xhdpi/dimens.xml diff --git a/app-android/res/values-small/dimens.xml b/android-app/res/values-small/dimens.xml similarity index 100% rename from app-android/res/values-small/dimens.xml rename to android-app/res/values-small/dimens.xml diff --git a/app-android/res/values-uk/text_about.xml b/android-app/res/values-uk/text_about.xml similarity index 100% rename from app-android/res/values-uk/text_about.xml rename to android-app/res/values-uk/text_about.xml diff --git a/app-android/res/values-uk/text_functions.xml b/android-app/res/values-uk/text_functions.xml similarity index 100% rename from app-android/res/values-uk/text_functions.xml rename to android-app/res/values-uk/text_functions.xml diff --git a/app-android/res/values-uk/text_help.xml b/android-app/res/values-uk/text_help.xml similarity index 100% rename from app-android/res/values-uk/text_help.xml rename to android-app/res/values-uk/text_help.xml diff --git a/app-android/res/values-uk/text_operators.xml b/android-app/res/values-uk/text_operators.xml similarity index 100% rename from app-android/res/values-uk/text_operators.xml rename to android-app/res/values-uk/text_operators.xml diff --git a/app-android/res/values-uk/text_preferences.xml b/android-app/res/values-uk/text_preferences.xml similarity index 100% rename from app-android/res/values-uk/text_preferences.xml rename to android-app/res/values-uk/text_preferences.xml diff --git a/app-android/res/values-uk/text_strings.xml b/android-app/res/values-uk/text_strings.xml similarity index 100% rename from app-android/res/values-uk/text_strings.xml rename to android-app/res/values-uk/text_strings.xml diff --git a/app-android/res/values-uk/text_vars.xml b/android-app/res/values-uk/text_vars.xml similarity index 100% rename from app-android/res/values-uk/text_vars.xml rename to android-app/res/values-uk/text_vars.xml diff --git a/app-android/res/values-v14/dimens.xml b/android-app/res/values-v14/dimens.xml similarity index 100% rename from app-android/res/values-v14/dimens.xml rename to android-app/res/values-v14/dimens.xml diff --git a/app-android/res/values-xlarge-hdpi/dimens.xml b/android-app/res/values-xlarge-hdpi/dimens.xml similarity index 100% rename from app-android/res/values-xlarge-hdpi/dimens.xml rename to android-app/res/values-xlarge-hdpi/dimens.xml diff --git a/app-android/res/values-xlarge-mdpi/dimens.xml b/android-app/res/values-xlarge-mdpi/dimens.xml similarity index 100% rename from app-android/res/values-xlarge-mdpi/dimens.xml rename to android-app/res/values-xlarge-mdpi/dimens.xml diff --git a/app-android/res/values-xlarge/dimens.xml b/android-app/res/values-xlarge/dimens.xml similarity index 100% rename from app-android/res/values-xlarge/dimens.xml rename to android-app/res/values-xlarge/dimens.xml diff --git a/app-android/res/values-zh-rtw/text_about.xml b/android-app/res/values-zh-rtw/text_about.xml similarity index 100% rename from app-android/res/values-zh-rtw/text_about.xml rename to android-app/res/values-zh-rtw/text_about.xml diff --git a/app-android/res/values-zh-rtw/text_functions.xml b/android-app/res/values-zh-rtw/text_functions.xml similarity index 100% rename from app-android/res/values-zh-rtw/text_functions.xml rename to android-app/res/values-zh-rtw/text_functions.xml diff --git a/app-android/res/values-zh-rtw/text_help.xml b/android-app/res/values-zh-rtw/text_help.xml similarity index 100% rename from app-android/res/values-zh-rtw/text_help.xml rename to android-app/res/values-zh-rtw/text_help.xml diff --git a/app-android/res/values-zh-rtw/text_operators.xml b/android-app/res/values-zh-rtw/text_operators.xml similarity index 100% rename from app-android/res/values-zh-rtw/text_operators.xml rename to android-app/res/values-zh-rtw/text_operators.xml diff --git a/app-android/res/values-zh-rtw/text_preferences.xml b/android-app/res/values-zh-rtw/text_preferences.xml similarity index 100% rename from app-android/res/values-zh-rtw/text_preferences.xml rename to android-app/res/values-zh-rtw/text_preferences.xml diff --git a/app-android/res/values-zh-rtw/text_strings.xml b/android-app/res/values-zh-rtw/text_strings.xml similarity index 100% rename from app-android/res/values-zh-rtw/text_strings.xml rename to android-app/res/values-zh-rtw/text_strings.xml diff --git a/app-android/res/values-zh-rtw/text_vars.xml b/android-app/res/values-zh-rtw/text_vars.xml similarity index 100% rename from app-android/res/values-zh-rtw/text_vars.xml rename to android-app/res/values-zh-rtw/text_vars.xml diff --git a/app-android/res/values/arrays.xml b/android-app/res/values/arrays.xml similarity index 100% rename from app-android/res/values/arrays.xml rename to android-app/res/values/arrays.xml diff --git a/app-android/res/values/attributes.xml b/android-app/res/values/attributes.xml similarity index 100% rename from app-android/res/values/attributes.xml rename to android-app/res/values/attributes.xml diff --git a/app-android/res/values/colors.xml b/android-app/res/values/colors.xml similarity index 100% rename from app-android/res/values/colors.xml rename to android-app/res/values/colors.xml diff --git a/app-android/res/values/dimens.xml b/android-app/res/values/dimens.xml similarity index 100% rename from app-android/res/values/dimens.xml rename to android-app/res/values/dimens.xml diff --git a/app-android/res/values/preferences.xml b/android-app/res/values/preferences.xml similarity index 100% rename from app-android/res/values/preferences.xml rename to android-app/res/values/preferences.xml diff --git a/app-android/res/values/styles.xml b/android-app/res/values/styles.xml similarity index 100% rename from app-android/res/values/styles.xml rename to android-app/res/values/styles.xml diff --git a/app-android/res/values/styles_history.xml b/android-app/res/values/styles_history.xml similarity index 100% rename from app-android/res/values/styles_history.xml rename to android-app/res/values/styles_history.xml diff --git a/app-android/res/values/styles_var.xml b/android-app/res/values/styles_var.xml similarity index 100% rename from app-android/res/values/styles_var.xml rename to android-app/res/values/styles_var.xml diff --git a/app-android/res/values/text_about.xml b/android-app/res/values/text_about.xml similarity index 100% rename from app-android/res/values/text_about.xml rename to android-app/res/values/text_about.xml diff --git a/app-android/res/values/text_functions.xml b/android-app/res/values/text_functions.xml similarity index 100% rename from app-android/res/values/text_functions.xml rename to android-app/res/values/text_functions.xml diff --git a/app-android/res/values/text_help.xml b/android-app/res/values/text_help.xml similarity index 100% rename from app-android/res/values/text_help.xml rename to android-app/res/values/text_help.xml diff --git a/app-android/res/values/text_operators.xml b/android-app/res/values/text_operators.xml similarity index 100% rename from app-android/res/values/text_operators.xml rename to android-app/res/values/text_operators.xml diff --git a/app-android/res/values/text_preferences.xml b/android-app/res/values/text_preferences.xml similarity index 100% rename from app-android/res/values/text_preferences.xml rename to android-app/res/values/text_preferences.xml diff --git a/app-android/res/values/text_strings.xml b/android-app/res/values/text_strings.xml similarity index 100% rename from app-android/res/values/text_strings.xml rename to android-app/res/values/text_strings.xml diff --git a/app-android/res/values/text_vars.xml b/android-app/res/values/text_vars.xml similarity index 100% rename from app-android/res/values/text_vars.xml rename to android-app/res/values/text_vars.xml diff --git a/app-android/res/values/theme_gray.xml b/android-app/res/values/theme_gray.xml similarity index 100% rename from app-android/res/values/theme_gray.xml rename to android-app/res/values/theme_gray.xml diff --git a/app-android/res/values/theme_light_blue.xml b/android-app/res/values/theme_light_blue.xml similarity index 100% rename from app-android/res/values/theme_light_blue.xml rename to android-app/res/values/theme_light_blue.xml diff --git a/app-android/res/values/theme_metro_blue.xml b/android-app/res/values/theme_metro_blue.xml similarity index 100% rename from app-android/res/values/theme_metro_blue.xml rename to android-app/res/values/theme_metro_blue.xml diff --git a/app-android/res/values/theme_metro_green.xml b/android-app/res/values/theme_metro_green.xml similarity index 100% rename from app-android/res/values/theme_metro_green.xml rename to android-app/res/values/theme_metro_green.xml diff --git a/app-android/res/values/theme_metro_purple.xml b/android-app/res/values/theme_metro_purple.xml similarity index 100% rename from app-android/res/values/theme_metro_purple.xml rename to android-app/res/values/theme_metro_purple.xml diff --git a/app-android/res/values/theme_violet.xml b/android-app/res/values/theme_violet.xml similarity index 100% rename from app-android/res/values/theme_violet.xml rename to android-app/res/values/theme_violet.xml diff --git a/app-android/res/xml/calculator_widget_info_3x3.xml b/android-app/res/xml/calculator_widget_info_3x3.xml similarity index 100% rename from app-android/res/xml/calculator_widget_info_3x3.xml rename to android-app/res/xml/calculator_widget_info_3x3.xml diff --git a/app-android/res/xml/calculator_widget_info_3x4.xml b/android-app/res/xml/calculator_widget_info_3x4.xml similarity index 100% rename from app-android/res/xml/calculator_widget_info_3x4.xml rename to android-app/res/xml/calculator_widget_info_3x4.xml diff --git a/app-android/res/xml/calculator_widget_info_4x4.xml b/android-app/res/xml/calculator_widget_info_4x4.xml similarity index 100% rename from app-android/res/xml/calculator_widget_info_4x4.xml rename to android-app/res/xml/calculator_widget_info_4x4.xml diff --git a/app-android/res/xml/calculator_widget_info_4x5.xml b/android-app/res/xml/calculator_widget_info_4x5.xml similarity index 100% rename from app-android/res/xml/calculator_widget_info_4x5.xml rename to android-app/res/xml/calculator_widget_info_4x5.xml diff --git a/app-android/res/xml/preferences.xml b/android-app/res/xml/preferences.xml similarity index 100% rename from app-android/res/xml/preferences.xml rename to android-app/res/xml/preferences.xml diff --git a/app-android/res/xml/preferences_appearance.xml b/android-app/res/xml/preferences_appearance.xml similarity index 100% rename from app-android/res/xml/preferences_appearance.xml rename to android-app/res/xml/preferences_appearance.xml diff --git a/app-android/res/xml/preferences_calculations.xml b/android-app/res/xml/preferences_calculations.xml similarity index 100% rename from app-android/res/xml/preferences_calculations.xml rename to android-app/res/xml/preferences_calculations.xml diff --git a/app-android/res/xml/preferences_onscreen.xml b/android-app/res/xml/preferences_onscreen.xml similarity index 100% rename from app-android/res/xml/preferences_onscreen.xml rename to android-app/res/xml/preferences_onscreen.xml diff --git a/app-android/res/xml/preferences_other.xml b/android-app/res/xml/preferences_other.xml similarity index 100% rename from app-android/res/xml/preferences_other.xml rename to android-app/res/xml/preferences_other.xml diff --git a/app-android/res/xml/preferences_plot.xml b/android-app/res/xml/preferences_plot.xml similarity index 100% rename from app-android/res/xml/preferences_plot.xml rename to android-app/res/xml/preferences_plot.xml diff --git a/app-android/src/main/java/org/solovyev/android/AndroidUtils2.java b/android-app/src/main/java/org/solovyev/android/AndroidUtils2.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/AndroidUtils2.java rename to android-app/src/main/java/org/solovyev/android/AndroidUtils2.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/AbstractCalculatorHelper.java b/android-app/src/main/java/org/solovyev/android/calculator/AbstractCalculatorHelper.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/AbstractCalculatorHelper.java rename to android-app/src/main/java/org/solovyev/android/calculator/AbstractCalculatorHelper.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/AndroidCalculator.java b/android-app/src/main/java/org/solovyev/android/calculator/AndroidCalculator.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/AndroidCalculator.java rename to android-app/src/main/java/org/solovyev/android/calculator/AndroidCalculator.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/AndroidCalculatorClipboard.java b/android-app/src/main/java/org/solovyev/android/calculator/AndroidCalculatorClipboard.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/AndroidCalculatorClipboard.java rename to android-app/src/main/java/org/solovyev/android/calculator/AndroidCalculatorClipboard.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/AndroidCalculatorDisplayView.java b/android-app/src/main/java/org/solovyev/android/calculator/AndroidCalculatorDisplayView.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/AndroidCalculatorDisplayView.java rename to android-app/src/main/java/org/solovyev/android/calculator/AndroidCalculatorDisplayView.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/AndroidCalculatorEditorView.java b/android-app/src/main/java/org/solovyev/android/calculator/AndroidCalculatorEditorView.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/AndroidCalculatorEditorView.java rename to android-app/src/main/java/org/solovyev/android/calculator/AndroidCalculatorEditorView.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/AndroidCalculatorKeyboard.java b/android-app/src/main/java/org/solovyev/android/calculator/AndroidCalculatorKeyboard.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/AndroidCalculatorKeyboard.java rename to android-app/src/main/java/org/solovyev/android/calculator/AndroidCalculatorKeyboard.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/AndroidCalculatorLogger.java b/android-app/src/main/java/org/solovyev/android/calculator/AndroidCalculatorLogger.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/AndroidCalculatorLogger.java rename to android-app/src/main/java/org/solovyev/android/calculator/AndroidCalculatorLogger.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/AndroidCalculatorNotifier.java b/android-app/src/main/java/org/solovyev/android/calculator/AndroidCalculatorNotifier.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/AndroidCalculatorNotifier.java rename to android-app/src/main/java/org/solovyev/android/calculator/AndroidCalculatorNotifier.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/AndroidCalculatorPreferenceService.java b/android-app/src/main/java/org/solovyev/android/calculator/AndroidCalculatorPreferenceService.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/AndroidCalculatorPreferenceService.java rename to android-app/src/main/java/org/solovyev/android/calculator/AndroidCalculatorPreferenceService.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/AndroidFunctionCategory.java b/android-app/src/main/java/org/solovyev/android/calculator/AndroidFunctionCategory.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/AndroidFunctionCategory.java rename to android-app/src/main/java/org/solovyev/android/calculator/AndroidFunctionCategory.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/AndroidNumeralBase.java b/android-app/src/main/java/org/solovyev/android/calculator/AndroidNumeralBase.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/AndroidNumeralBase.java rename to android-app/src/main/java/org/solovyev/android/calculator/AndroidNumeralBase.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/AndroidOperatorCategory.java b/android-app/src/main/java/org/solovyev/android/calculator/AndroidOperatorCategory.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/AndroidOperatorCategory.java rename to android-app/src/main/java/org/solovyev/android/calculator/AndroidOperatorCategory.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/AndroidVarCategory.java b/android-app/src/main/java/org/solovyev/android/calculator/AndroidVarCategory.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/AndroidVarCategory.java rename to android-app/src/main/java/org/solovyev/android/calculator/AndroidVarCategory.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/CalculatorActivity.java b/android-app/src/main/java/org/solovyev/android/calculator/CalculatorActivity.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/CalculatorActivity.java rename to android-app/src/main/java/org/solovyev/android/calculator/CalculatorActivity.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/CalculatorActivityHelper.java b/android-app/src/main/java/org/solovyev/android/calculator/CalculatorActivityHelper.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/CalculatorActivityHelper.java rename to android-app/src/main/java/org/solovyev/android/calculator/CalculatorActivityHelper.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/CalculatorActivityHelperImpl.java b/android-app/src/main/java/org/solovyev/android/calculator/CalculatorActivityHelperImpl.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/CalculatorActivityHelperImpl.java rename to android-app/src/main/java/org/solovyev/android/calculator/CalculatorActivityHelperImpl.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/CalculatorActivityLauncher.java b/android-app/src/main/java/org/solovyev/android/calculator/CalculatorActivityLauncher.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/CalculatorActivityLauncher.java rename to android-app/src/main/java/org/solovyev/android/calculator/CalculatorActivityLauncher.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/CalculatorActivityMobile.java b/android-app/src/main/java/org/solovyev/android/calculator/CalculatorActivityMobile.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/CalculatorActivityMobile.java rename to android-app/src/main/java/org/solovyev/android/calculator/CalculatorActivityMobile.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/CalculatorApplication.java b/android-app/src/main/java/org/solovyev/android/calculator/CalculatorApplication.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/CalculatorApplication.java rename to android-app/src/main/java/org/solovyev/android/calculator/CalculatorApplication.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/CalculatorButtons.java b/android-app/src/main/java/org/solovyev/android/calculator/CalculatorButtons.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/CalculatorButtons.java rename to android-app/src/main/java/org/solovyev/android/calculator/CalculatorButtons.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/CalculatorDisplayFragment.java b/android-app/src/main/java/org/solovyev/android/calculator/CalculatorDisplayFragment.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/CalculatorDisplayFragment.java rename to android-app/src/main/java/org/solovyev/android/calculator/CalculatorDisplayFragment.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/CalculatorDisplayMenuItem.java b/android-app/src/main/java/org/solovyev/android/calculator/CalculatorDisplayMenuItem.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/CalculatorDisplayMenuItem.java rename to android-app/src/main/java/org/solovyev/android/calculator/CalculatorDisplayMenuItem.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/CalculatorDisplayOnClickListener.java b/android-app/src/main/java/org/solovyev/android/calculator/CalculatorDisplayOnClickListener.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/CalculatorDisplayOnClickListener.java rename to android-app/src/main/java/org/solovyev/android/calculator/CalculatorDisplayOnClickListener.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/CalculatorEditorFragment.java b/android-app/src/main/java/org/solovyev/android/calculator/CalculatorEditorFragment.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/CalculatorEditorFragment.java rename to android-app/src/main/java/org/solovyev/android/calculator/CalculatorEditorFragment.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/CalculatorFixableMessage.java b/android-app/src/main/java/org/solovyev/android/calculator/CalculatorFixableMessage.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/CalculatorFixableMessage.java rename to android-app/src/main/java/org/solovyev/android/calculator/CalculatorFixableMessage.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/CalculatorFragment.java b/android-app/src/main/java/org/solovyev/android/calculator/CalculatorFragment.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/CalculatorFragment.java rename to android-app/src/main/java/org/solovyev/android/calculator/CalculatorFragment.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/CalculatorFragmentActivity.java b/android-app/src/main/java/org/solovyev/android/calculator/CalculatorFragmentActivity.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/CalculatorFragmentActivity.java rename to android-app/src/main/java/org/solovyev/android/calculator/CalculatorFragmentActivity.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/CalculatorFragmentHelper.java b/android-app/src/main/java/org/solovyev/android/calculator/CalculatorFragmentHelper.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/CalculatorFragmentHelper.java rename to android-app/src/main/java/org/solovyev/android/calculator/CalculatorFragmentHelper.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/CalculatorFragmentHelperImpl.java b/android-app/src/main/java/org/solovyev/android/calculator/CalculatorFragmentHelperImpl.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/CalculatorFragmentHelperImpl.java rename to android-app/src/main/java/org/solovyev/android/calculator/CalculatorFragmentHelperImpl.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/CalculatorKeyboardFragment.java b/android-app/src/main/java/org/solovyev/android/calculator/CalculatorKeyboardFragment.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/CalculatorKeyboardFragment.java rename to android-app/src/main/java/org/solovyev/android/calculator/CalculatorKeyboardFragment.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/CalculatorMenu.java b/android-app/src/main/java/org/solovyev/android/calculator/CalculatorMenu.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/CalculatorMenu.java rename to android-app/src/main/java/org/solovyev/android/calculator/CalculatorMenu.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/CalculatorMessagesDialog.java b/android-app/src/main/java/org/solovyev/android/calculator/CalculatorMessagesDialog.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/CalculatorMessagesDialog.java rename to android-app/src/main/java/org/solovyev/android/calculator/CalculatorMessagesDialog.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/CalculatorOnscreenStartActivity.java b/android-app/src/main/java/org/solovyev/android/calculator/CalculatorOnscreenStartActivity.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/CalculatorOnscreenStartActivity.java rename to android-app/src/main/java/org/solovyev/android/calculator/CalculatorOnscreenStartActivity.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/CalculatorPreferences.java b/android-app/src/main/java/org/solovyev/android/calculator/CalculatorPreferences.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/CalculatorPreferences.java rename to android-app/src/main/java/org/solovyev/android/calculator/CalculatorPreferences.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/CalculatorPreferencesActivity.java b/android-app/src/main/java/org/solovyev/android/calculator/CalculatorPreferencesActivity.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/CalculatorPreferencesActivity.java rename to android-app/src/main/java/org/solovyev/android/calculator/CalculatorPreferencesActivity.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/CalculatorSecurity.java b/android-app/src/main/java/org/solovyev/android/calculator/CalculatorSecurity.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/CalculatorSecurity.java rename to android-app/src/main/java/org/solovyev/android/calculator/CalculatorSecurity.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/CharacterAtPositionFinder.java b/android-app/src/main/java/org/solovyev/android/calculator/CharacterAtPositionFinder.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/CharacterAtPositionFinder.java rename to android-app/src/main/java/org/solovyev/android/calculator/CharacterAtPositionFinder.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/ConversionMenuItem.java b/android-app/src/main/java/org/solovyev/android/calculator/ConversionMenuItem.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/ConversionMenuItem.java rename to android-app/src/main/java/org/solovyev/android/calculator/ConversionMenuItem.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/CursorDragProcessor.java b/android-app/src/main/java/org/solovyev/android/calculator/CursorDragProcessor.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/CursorDragProcessor.java rename to android-app/src/main/java/org/solovyev/android/calculator/CursorDragProcessor.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/DigitButtonDragProcessor.java b/android-app/src/main/java/org/solovyev/android/calculator/DigitButtonDragProcessor.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/DigitButtonDragProcessor.java rename to android-app/src/main/java/org/solovyev/android/calculator/DigitButtonDragProcessor.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/EvalDragProcessor.java b/android-app/src/main/java/org/solovyev/android/calculator/EvalDragProcessor.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/EvalDragProcessor.java rename to android-app/src/main/java/org/solovyev/android/calculator/EvalDragProcessor.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/NumeralBaseButtons.java b/android-app/src/main/java/org/solovyev/android/calculator/NumeralBaseButtons.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/NumeralBaseButtons.java rename to android-app/src/main/java/org/solovyev/android/calculator/NumeralBaseButtons.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/ParcelableCalculatorDisplayViewState.java b/android-app/src/main/java/org/solovyev/android/calculator/ParcelableCalculatorDisplayViewState.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/ParcelableCalculatorDisplayViewState.java rename to android-app/src/main/java/org/solovyev/android/calculator/ParcelableCalculatorDisplayViewState.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/ParcelableCalculatorEditorViewState.java b/android-app/src/main/java/org/solovyev/android/calculator/ParcelableCalculatorEditorViewState.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/ParcelableCalculatorEditorViewState.java rename to android-app/src/main/java/org/solovyev/android/calculator/ParcelableCalculatorEditorViewState.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/about/CalculatorAboutActivity.java b/android-app/src/main/java/org/solovyev/android/calculator/about/CalculatorAboutActivity.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/about/CalculatorAboutActivity.java rename to android-app/src/main/java/org/solovyev/android/calculator/about/CalculatorAboutActivity.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/about/CalculatorAboutFragment.java b/android-app/src/main/java/org/solovyev/android/calculator/about/CalculatorAboutFragment.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/about/CalculatorAboutFragment.java rename to android-app/src/main/java/org/solovyev/android/calculator/about/CalculatorAboutFragment.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/about/CalculatorFragmentType.java b/android-app/src/main/java/org/solovyev/android/calculator/about/CalculatorFragmentType.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/about/CalculatorFragmentType.java rename to android-app/src/main/java/org/solovyev/android/calculator/about/CalculatorFragmentType.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/about/CalculatorReleaseNotesFragment.java b/android-app/src/main/java/org/solovyev/android/calculator/about/CalculatorReleaseNotesFragment.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/about/CalculatorReleaseNotesFragment.java rename to android-app/src/main/java/org/solovyev/android/calculator/about/CalculatorReleaseNotesFragment.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/about/TextHelper.java b/android-app/src/main/java/org/solovyev/android/calculator/about/TextHelper.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/about/TextHelper.java rename to android-app/src/main/java/org/solovyev/android/calculator/about/TextHelper.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/external/AndroidExternalListenersContainer.java b/android-app/src/main/java/org/solovyev/android/calculator/external/AndroidExternalListenersContainer.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/external/AndroidExternalListenersContainer.java rename to android-app/src/main/java/org/solovyev/android/calculator/external/AndroidExternalListenersContainer.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/external/DefaultExternalCalculatorIntentHandler.java b/android-app/src/main/java/org/solovyev/android/calculator/external/DefaultExternalCalculatorIntentHandler.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/external/DefaultExternalCalculatorIntentHandler.java rename to android-app/src/main/java/org/solovyev/android/calculator/external/DefaultExternalCalculatorIntentHandler.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/external/ExternalCalculatorIntentHandler.java b/android-app/src/main/java/org/solovyev/android/calculator/external/ExternalCalculatorIntentHandler.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/external/ExternalCalculatorIntentHandler.java rename to android-app/src/main/java/org/solovyev/android/calculator/external/ExternalCalculatorIntentHandler.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/external/ExternalCalculatorStateUpdater.java b/android-app/src/main/java/org/solovyev/android/calculator/external/ExternalCalculatorStateUpdater.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/external/ExternalCalculatorStateUpdater.java rename to android-app/src/main/java/org/solovyev/android/calculator/external/ExternalCalculatorStateUpdater.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/function/FunctionEditDialogFragment.java b/android-app/src/main/java/org/solovyev/android/calculator/function/FunctionEditDialogFragment.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/function/FunctionEditDialogFragment.java rename to android-app/src/main/java/org/solovyev/android/calculator/function/FunctionEditDialogFragment.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/function/FunctionEditorSaver.java b/android-app/src/main/java/org/solovyev/android/calculator/function/FunctionEditorSaver.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/function/FunctionEditorSaver.java rename to android-app/src/main/java/org/solovyev/android/calculator/function/FunctionEditorSaver.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/function/FunctionParamEditText.java b/android-app/src/main/java/org/solovyev/android/calculator/function/FunctionParamEditText.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/function/FunctionParamEditText.java rename to android-app/src/main/java/org/solovyev/android/calculator/function/FunctionParamEditText.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/function/FunctionParamsView.java b/android-app/src/main/java/org/solovyev/android/calculator/function/FunctionParamsView.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/function/FunctionParamsView.java rename to android-app/src/main/java/org/solovyev/android/calculator/function/FunctionParamsView.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/help/CalculatorHelpActivity.java b/android-app/src/main/java/org/solovyev/android/calculator/help/CalculatorHelpActivity.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/help/CalculatorHelpActivity.java rename to android-app/src/main/java/org/solovyev/android/calculator/help/CalculatorHelpActivity.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/help/CalculatorHelpFaqFragment.java b/android-app/src/main/java/org/solovyev/android/calculator/help/CalculatorHelpFaqFragment.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/help/CalculatorHelpFaqFragment.java rename to android-app/src/main/java/org/solovyev/android/calculator/help/CalculatorHelpFaqFragment.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/help/CalculatorHelpHintsFragment.java b/android-app/src/main/java/org/solovyev/android/calculator/help/CalculatorHelpHintsFragment.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/help/CalculatorHelpHintsFragment.java rename to android-app/src/main/java/org/solovyev/android/calculator/help/CalculatorHelpHintsFragment.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/help/CalculatorHelpScreensFragment.java b/android-app/src/main/java/org/solovyev/android/calculator/help/CalculatorHelpScreensFragment.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/help/CalculatorHelpScreensFragment.java rename to android-app/src/main/java/org/solovyev/android/calculator/help/CalculatorHelpScreensFragment.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/history/AbstractCalculatorHistoryFragment.java b/android-app/src/main/java/org/solovyev/android/calculator/history/AbstractCalculatorHistoryFragment.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/history/AbstractCalculatorHistoryFragment.java rename to android-app/src/main/java/org/solovyev/android/calculator/history/AbstractCalculatorHistoryFragment.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/history/AndroidCalculatorHistory.java b/android-app/src/main/java/org/solovyev/android/calculator/history/AndroidCalculatorHistory.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/history/AndroidCalculatorHistory.java rename to android-app/src/main/java/org/solovyev/android/calculator/history/AndroidCalculatorHistory.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/history/CalculatorHistoryActivity.java b/android-app/src/main/java/org/solovyev/android/calculator/history/CalculatorHistoryActivity.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/history/CalculatorHistoryActivity.java rename to android-app/src/main/java/org/solovyev/android/calculator/history/CalculatorHistoryActivity.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/history/CalculatorHistoryFragment.java b/android-app/src/main/java/org/solovyev/android/calculator/history/CalculatorHistoryFragment.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/history/CalculatorHistoryFragment.java rename to android-app/src/main/java/org/solovyev/android/calculator/history/CalculatorHistoryFragment.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/history/CalculatorSavedHistoryFragment.java b/android-app/src/main/java/org/solovyev/android/calculator/history/CalculatorSavedHistoryFragment.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/history/CalculatorSavedHistoryFragment.java rename to android-app/src/main/java/org/solovyev/android/calculator/history/CalculatorSavedHistoryFragment.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/history/HistoryArrayAdapter.java b/android-app/src/main/java/org/solovyev/android/calculator/history/HistoryArrayAdapter.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/history/HistoryArrayAdapter.java rename to android-app/src/main/java/org/solovyev/android/calculator/history/HistoryArrayAdapter.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/history/HistoryItemMenuData.java b/android-app/src/main/java/org/solovyev/android/calculator/history/HistoryItemMenuData.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/history/HistoryItemMenuData.java rename to android-app/src/main/java/org/solovyev/android/calculator/history/HistoryItemMenuData.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/history/HistoryItemMenuItem.java b/android-app/src/main/java/org/solovyev/android/calculator/history/HistoryItemMenuItem.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/history/HistoryItemMenuItem.java rename to android-app/src/main/java/org/solovyev/android/calculator/history/HistoryItemMenuItem.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/history/TextViewEditorAdapter.java b/android-app/src/main/java/org/solovyev/android/calculator/history/TextViewEditorAdapter.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/history/TextViewEditorAdapter.java rename to android-app/src/main/java/org/solovyev/android/calculator/history/TextViewEditorAdapter.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/math/edit/AbstractMathEntityListFragment.java b/android-app/src/main/java/org/solovyev/android/calculator/math/edit/AbstractMathEntityListFragment.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/math/edit/AbstractMathEntityListFragment.java rename to android-app/src/main/java/org/solovyev/android/calculator/math/edit/AbstractMathEntityListFragment.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorFunctionsActivity.java b/android-app/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorFunctionsActivity.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorFunctionsActivity.java rename to android-app/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorFunctionsActivity.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorFunctionsFragment.java b/android-app/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorFunctionsFragment.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorFunctionsFragment.java rename to android-app/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorFunctionsFragment.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorOperatorsActivity.java b/android-app/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorOperatorsActivity.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorOperatorsActivity.java rename to android-app/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorOperatorsActivity.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorOperatorsFragment.java b/android-app/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorOperatorsFragment.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorOperatorsFragment.java rename to android-app/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorOperatorsFragment.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorVarsActivity.java b/android-app/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorVarsActivity.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorVarsActivity.java rename to android-app/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorVarsActivity.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorVarsFragment.java b/android-app/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorVarsFragment.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorVarsFragment.java rename to android-app/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorVarsFragment.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/math/edit/MathEntityRemover.java b/android-app/src/main/java/org/solovyev/android/calculator/math/edit/MathEntityRemover.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/math/edit/MathEntityRemover.java rename to android-app/src/main/java/org/solovyev/android/calculator/math/edit/MathEntityRemover.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/math/edit/VarEditDialogFragment.java b/android-app/src/main/java/org/solovyev/android/calculator/math/edit/VarEditDialogFragment.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/math/edit/VarEditDialogFragment.java rename to android-app/src/main/java/org/solovyev/android/calculator/math/edit/VarEditDialogFragment.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/math/edit/VarEditorSaver.java b/android-app/src/main/java/org/solovyev/android/calculator/math/edit/VarEditorSaver.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/math/edit/VarEditorSaver.java rename to android-app/src/main/java/org/solovyev/android/calculator/math/edit/VarEditorSaver.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/model/AndroidCalculatorEngine.java b/android-app/src/main/java/org/solovyev/android/calculator/model/AndroidCalculatorEngine.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/model/AndroidCalculatorEngine.java rename to android-app/src/main/java/org/solovyev/android/calculator/model/AndroidCalculatorEngine.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/model/AndroidMathEntityDao.java b/android-app/src/main/java/org/solovyev/android/calculator/model/AndroidMathEntityDao.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/model/AndroidMathEntityDao.java rename to android-app/src/main/java/org/solovyev/android/calculator/model/AndroidMathEntityDao.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/model/Messages.java b/android-app/src/main/java/org/solovyev/android/calculator/model/Messages.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/model/Messages.java rename to android-app/src/main/java/org/solovyev/android/calculator/model/Messages.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenBroadcastReceiver.java b/android-app/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenBroadcastReceiver.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenBroadcastReceiver.java rename to android-app/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenBroadcastReceiver.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenService.java b/android-app/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenService.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenService.java rename to android-app/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenService.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenView.java b/android-app/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenView.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenView.java rename to android-app/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenView.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenViewDef.java b/android-app/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenViewDef.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenViewDef.java rename to android-app/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenViewDef.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/onscreen/OnscreenViewListener.java b/android-app/src/main/java/org/solovyev/android/calculator/onscreen/OnscreenViewListener.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/onscreen/OnscreenViewListener.java rename to android-app/src/main/java/org/solovyev/android/calculator/onscreen/OnscreenViewListener.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/plot/CalculatorPlotActivity.java b/android-app/src/main/java/org/solovyev/android/calculator/plot/CalculatorPlotActivity.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/plot/CalculatorPlotActivity.java rename to android-app/src/main/java/org/solovyev/android/calculator/plot/CalculatorPlotActivity.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/plot/CalculatorPlotFragment.java b/android-app/src/main/java/org/solovyev/android/calculator/plot/CalculatorPlotFragment.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/plot/CalculatorPlotFragment.java rename to android-app/src/main/java/org/solovyev/android/calculator/plot/CalculatorPlotFragment.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/plot/CalculatorPlotPreferenceActivity.java b/android-app/src/main/java/org/solovyev/android/calculator/plot/CalculatorPlotPreferenceActivity.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/plot/CalculatorPlotPreferenceActivity.java rename to android-app/src/main/java/org/solovyev/android/calculator/plot/CalculatorPlotPreferenceActivity.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/plot/GraphLineColor.java b/android-app/src/main/java/org/solovyev/android/calculator/plot/GraphLineColor.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/plot/GraphLineColor.java rename to android-app/src/main/java/org/solovyev/android/calculator/plot/GraphLineColor.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/plot/MyXYSeries.java b/android-app/src/main/java/org/solovyev/android/calculator/plot/MyXYSeries.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/plot/MyXYSeries.java rename to android-app/src/main/java/org/solovyev/android/calculator/plot/MyXYSeries.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/plot/PlotUtils.java b/android-app/src/main/java/org/solovyev/android/calculator/plot/PlotUtils.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/plot/PlotUtils.java rename to android-app/src/main/java/org/solovyev/android/calculator/plot/PlotUtils.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/view/AngleUnitsButton.java b/android-app/src/main/java/org/solovyev/android/calculator/view/AngleUnitsButton.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/view/AngleUnitsButton.java rename to android-app/src/main/java/org/solovyev/android/calculator/view/AngleUnitsButton.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/view/CalculatorAdditionalTitle.java b/android-app/src/main/java/org/solovyev/android/calculator/view/CalculatorAdditionalTitle.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/view/CalculatorAdditionalTitle.java rename to android-app/src/main/java/org/solovyev/android/calculator/view/CalculatorAdditionalTitle.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/view/NumeralBaseConverterDialog.java b/android-app/src/main/java/org/solovyev/android/calculator/view/NumeralBaseConverterDialog.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/view/NumeralBaseConverterDialog.java rename to android-app/src/main/java/org/solovyev/android/calculator/view/NumeralBaseConverterDialog.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/view/NumeralBasesButton.java b/android-app/src/main/java/org/solovyev/android/calculator/view/NumeralBasesButton.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/view/NumeralBasesButton.java rename to android-app/src/main/java/org/solovyev/android/calculator/view/NumeralBasesButton.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/view/OnDragListenerVibrator.java b/android-app/src/main/java/org/solovyev/android/calculator/view/OnDragListenerVibrator.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/view/OnDragListenerVibrator.java rename to android-app/src/main/java/org/solovyev/android/calculator/view/OnDragListenerVibrator.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/view/TextHighlighter.java b/android-app/src/main/java/org/solovyev/android/calculator/view/TextHighlighter.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/view/TextHighlighter.java rename to android-app/src/main/java/org/solovyev/android/calculator/view/TextHighlighter.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/view/UnitConverterViewBuilder.java b/android-app/src/main/java/org/solovyev/android/calculator/view/UnitConverterViewBuilder.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/view/UnitConverterViewBuilder.java rename to android-app/src/main/java/org/solovyev/android/calculator/view/UnitConverterViewBuilder.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/widget/AbstractCalculatorWidgetProvider.java b/android-app/src/main/java/org/solovyev/android/calculator/widget/AbstractCalculatorWidgetProvider.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/widget/AbstractCalculatorWidgetProvider.java rename to android-app/src/main/java/org/solovyev/android/calculator/widget/AbstractCalculatorWidgetProvider.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetConfigurationActivity.java b/android-app/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetConfigurationActivity.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetConfigurationActivity.java rename to android-app/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetConfigurationActivity.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetIntentHandler.java b/android-app/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetIntentHandler.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetIntentHandler.java rename to android-app/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetIntentHandler.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider.java b/android-app/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider.java rename to android-app/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider3x4.java b/android-app/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider3x4.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider3x4.java rename to android-app/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider3x4.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider4x4.java b/android-app/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider4x4.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider4x4.java rename to android-app/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider4x4.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider4x5.java b/android-app/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider4x5.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider4x5.java rename to android-app/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider4x5.java diff --git a/app-android/src/main/java/org/solovyev/android/calculator/widget/WidgetButton.java b/android-app/src/main/java/org/solovyev/android/calculator/widget/WidgetButton.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/calculator/widget/WidgetButton.java rename to android-app/src/main/java/org/solovyev/android/calculator/widget/WidgetButton.java diff --git a/app-android/src/main/java/org/solovyev/android/fragments/FragmentUtils.java b/android-app/src/main/java/org/solovyev/android/fragments/FragmentUtils.java similarity index 100% rename from app-android/src/main/java/org/solovyev/android/fragments/FragmentUtils.java rename to android-app/src/main/java/org/solovyev/android/fragments/FragmentUtils.java diff --git a/app-android/src/test/java/org/solovyev/android/AndroidNumeralBaseTest.java b/android-app/src/test/java/org/solovyev/android/AndroidNumeralBaseTest.java similarity index 100% rename from app-android/src/test/java/org/solovyev/android/AndroidNumeralBaseTest.java rename to android-app/src/test/java/org/solovyev/android/AndroidNumeralBaseTest.java diff --git a/app-android/src/test/java/org/solovyev/android/calculator/AndroidCalculatorEditorViewTest.java b/android-app/src/test/java/org/solovyev/android/calculator/AndroidCalculatorEditorViewTest.java similarity index 100% rename from app-android/src/test/java/org/solovyev/android/calculator/AndroidCalculatorEditorViewTest.java rename to android-app/src/test/java/org/solovyev/android/calculator/AndroidCalculatorEditorViewTest.java diff --git a/app-android/src/test/java/org/solovyev/android/calculator/CalculatorTestUtils.java b/android-app/src/test/java/org/solovyev/android/calculator/CalculatorTestUtils.java similarity index 100% rename from app-android/src/test/java/org/solovyev/android/calculator/CalculatorTestUtils.java rename to android-app/src/test/java/org/solovyev/android/calculator/CalculatorTestUtils.java diff --git a/app-android/src/test/java/org/solovyev/android/calculator/CalculatorppTestRunner.java b/android-app/src/test/java/org/solovyev/android/calculator/CalculatorppTestRunner.java similarity index 100% rename from app-android/src/test/java/org/solovyev/android/calculator/CalculatorppTestRunner.java rename to android-app/src/test/java/org/solovyev/android/calculator/CalculatorppTestRunner.java diff --git a/app-android/src/test/java/org/solovyev/android/calculator/TextHighlighterTest.java b/android-app/src/test/java/org/solovyev/android/calculator/TextHighlighterTest.java similarity index 100% rename from app-android/src/test/java/org/solovyev/android/calculator/TextHighlighterTest.java rename to android-app/src/test/java/org/solovyev/android/calculator/TextHighlighterTest.java diff --git a/app-android/src/test/java/org/solovyev/android/calculator/history/HistoryUtilsTest.java b/android-app/src/test/java/org/solovyev/android/calculator/history/HistoryUtilsTest.java similarity index 100% rename from app-android/src/test/java/org/solovyev/android/calculator/history/HistoryUtilsTest.java rename to android-app/src/test/java/org/solovyev/android/calculator/history/HistoryUtilsTest.java diff --git a/app-android/src/test/java/org/solovyev/android/calculator/model/VarTest.java b/android-app/src/test/java/org/solovyev/android/calculator/model/VarTest.java similarity index 100% rename from app-android/src/test/java/org/solovyev/android/calculator/model/VarTest.java rename to android-app/src/test/java/org/solovyev/android/calculator/model/VarTest.java diff --git a/app-android/src/test/java/org/solovyev/android/calculator/plot/PlotUtilsTest.java b/android-app/src/test/java/org/solovyev/android/calculator/plot/PlotUtilsTest.java similarity index 100% rename from app-android/src/test/java/org/solovyev/android/calculator/plot/PlotUtilsTest.java rename to android-app/src/test/java/org/solovyev/android/calculator/plot/PlotUtilsTest.java diff --git a/app-android/src/test/java/org/solovyev/common/FloatIntervalMapperTest.java b/android-app/src/test/java/org/solovyev/common/FloatIntervalMapperTest.java similarity index 100% rename from app-android/src/test/java/org/solovyev/common/FloatIntervalMapperTest.java rename to android-app/src/test/java/org/solovyev/common/FloatIntervalMapperTest.java diff --git a/app-android/src/test/java/org/solovyev/common/math/DiscreteNormalizerTest.java b/android-app/src/test/java/org/solovyev/common/math/DiscreteNormalizerTest.java similarity index 100% rename from app-android/src/test/java/org/solovyev/common/math/DiscreteNormalizerTest.java rename to android-app/src/test/java/org/solovyev/common/math/DiscreteNormalizerTest.java diff --git a/pom.xml b/pom.xml index 72fe5c5d..63aa0983 100644 --- a/pom.xml +++ b/pom.xml @@ -23,10 +23,10 @@ - app-android - app-android-core - app-android-widget - app-android-test + android-app + android-app-core + android-app-widget + android-app-test core @@ -47,7 +47,7 @@ org.solovyev.android.calculator - app-android-core + calculatorpp-android-app-core 1.5.3-SNAPSHOT From 53a2b84f510479a3f8029a41ba3fdfb5ef11f062 Mon Sep 17 00:00:00 2001 From: Sergey Solovyev Date: Fri, 30 Nov 2012 18:07:20 +0400 Subject: [PATCH 04/14] changes --- android-app-core/AndroidManifest.xml | 6 ++++ android-app-widget/AndroidManifest.xml | 6 ++++ android-app-widget/pom.xml | 3 +- .../org/solovyev/android/ads/BuildConfig.java | 6 ---- .../net/robotmedia/billing/BuildConfig.java | 6 ---- .../solovyev/android/core/BuildConfig.java | 6 ---- .../org/solovyev/android/db/BuildConfig.java | 6 ---- .../solovyev/android/http/BuildConfig.java | 6 ---- .../android/keyboard/BuildConfig.java | 6 ---- .../solovyev/android/list/BuildConfig.java | 6 ---- .../solovyev/android/menu/BuildConfig.java | 6 ---- .../solovyev/android/other/BuildConfig.java | 6 ---- .../solovyev/android/prefs/BuildConfig.java | 6 ---- .../solovyev/android/view/BuildConfig.java | 6 ---- android-app/pom.xml | 9 +++++- android-app/project.properties | 30 ++++++++++--------- core/pom.xml | 2 +- pom.xml | 10 ++++++- 18 files changed, 48 insertions(+), 84 deletions(-) create mode 100644 android-app-core/AndroidManifest.xml create mode 100644 android-app-widget/AndroidManifest.xml delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-ads_1.0.6/gen/org/solovyev/android/ads/BuildConfig.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-billing_1.0.6/gen/net/robotmedia/billing/BuildConfig.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-core_1.0.6/gen/org/solovyev/android/core/BuildConfig.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-db_1.0.6/gen/org/solovyev/android/db/BuildConfig.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-http_1.0.6/gen/org/solovyev/android/http/BuildConfig.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-keyboard_1.0.6/gen/org/solovyev/android/keyboard/BuildConfig.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-list_1.0.6/gen/org/solovyev/android/list/BuildConfig.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-menu_1.0.6/gen/org/solovyev/android/menu/BuildConfig.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-other_1.0.6/gen/org/solovyev/android/other/BuildConfig.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-preferences_1.0.6/gen/org/solovyev/android/prefs/BuildConfig.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/gen/org/solovyev/android/view/BuildConfig.java diff --git a/android-app-core/AndroidManifest.xml b/android-app-core/AndroidManifest.xml new file mode 100644 index 00000000..312325db --- /dev/null +++ b/android-app-core/AndroidManifest.xml @@ -0,0 +1,6 @@ + + \ No newline at end of file diff --git a/android-app-widget/AndroidManifest.xml b/android-app-widget/AndroidManifest.xml new file mode 100644 index 00000000..25df81f1 --- /dev/null +++ b/android-app-widget/AndroidManifest.xml @@ -0,0 +1,6 @@ + + \ No newline at end of file diff --git a/android-app-widget/pom.xml b/android-app-widget/pom.xml index 1482467f..9fa5b134 100644 --- a/android-app-widget/pom.xml +++ b/android-app-widget/pom.xml @@ -24,8 +24,9 @@ - org.solovyev.android.calculator + org.solovyev.android calculatorpp-android-app-core + apklib diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-ads_1.0.6/gen/org/solovyev/android/ads/BuildConfig.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-ads_1.0.6/gen/org/solovyev/android/ads/BuildConfig.java deleted file mode 100644 index 2cdcc5a6..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-ads_1.0.6/gen/org/solovyev/android/ads/BuildConfig.java +++ /dev/null @@ -1,6 +0,0 @@ -/** Automatically generated file. DO NOT MODIFY */ -package org.solovyev.android.ads; - -public final class BuildConfig { - public final static boolean DEBUG = true; -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-billing_1.0.6/gen/net/robotmedia/billing/BuildConfig.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-billing_1.0.6/gen/net/robotmedia/billing/BuildConfig.java deleted file mode 100644 index f533bda0..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-billing_1.0.6/gen/net/robotmedia/billing/BuildConfig.java +++ /dev/null @@ -1,6 +0,0 @@ -/** Automatically generated file. DO NOT MODIFY */ -package net.robotmedia.billing; - -public final class BuildConfig { - public final static boolean DEBUG = true; -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-core_1.0.6/gen/org/solovyev/android/core/BuildConfig.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-core_1.0.6/gen/org/solovyev/android/core/BuildConfig.java deleted file mode 100644 index 57d0e993..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-core_1.0.6/gen/org/solovyev/android/core/BuildConfig.java +++ /dev/null @@ -1,6 +0,0 @@ -/** Automatically generated file. DO NOT MODIFY */ -package org.solovyev.android.core; - -public final class BuildConfig { - public final static boolean DEBUG = true; -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-db_1.0.6/gen/org/solovyev/android/db/BuildConfig.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-db_1.0.6/gen/org/solovyev/android/db/BuildConfig.java deleted file mode 100644 index 3acdf88d..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-db_1.0.6/gen/org/solovyev/android/db/BuildConfig.java +++ /dev/null @@ -1,6 +0,0 @@ -/** Automatically generated file. DO NOT MODIFY */ -package org.solovyev.android.db; - -public final class BuildConfig { - public final static boolean DEBUG = true; -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-http_1.0.6/gen/org/solovyev/android/http/BuildConfig.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-http_1.0.6/gen/org/solovyev/android/http/BuildConfig.java deleted file mode 100644 index bac2bc3b..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-http_1.0.6/gen/org/solovyev/android/http/BuildConfig.java +++ /dev/null @@ -1,6 +0,0 @@ -/** Automatically generated file. DO NOT MODIFY */ -package org.solovyev.android.http; - -public final class BuildConfig { - public final static boolean DEBUG = true; -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-keyboard_1.0.6/gen/org/solovyev/android/keyboard/BuildConfig.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-keyboard_1.0.6/gen/org/solovyev/android/keyboard/BuildConfig.java deleted file mode 100644 index 8d7e42e5..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-keyboard_1.0.6/gen/org/solovyev/android/keyboard/BuildConfig.java +++ /dev/null @@ -1,6 +0,0 @@ -/** Automatically generated file. DO NOT MODIFY */ -package org.solovyev.android.keyboard; - -public final class BuildConfig { - public final static boolean DEBUG = true; -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-list_1.0.6/gen/org/solovyev/android/list/BuildConfig.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-list_1.0.6/gen/org/solovyev/android/list/BuildConfig.java deleted file mode 100644 index f7f63a43..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-list_1.0.6/gen/org/solovyev/android/list/BuildConfig.java +++ /dev/null @@ -1,6 +0,0 @@ -/** Automatically generated file. DO NOT MODIFY */ -package org.solovyev.android.list; - -public final class BuildConfig { - public final static boolean DEBUG = true; -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-menu_1.0.6/gen/org/solovyev/android/menu/BuildConfig.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-menu_1.0.6/gen/org/solovyev/android/menu/BuildConfig.java deleted file mode 100644 index 506cda16..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-menu_1.0.6/gen/org/solovyev/android/menu/BuildConfig.java +++ /dev/null @@ -1,6 +0,0 @@ -/** Automatically generated file. DO NOT MODIFY */ -package org.solovyev.android.menu; - -public final class BuildConfig { - public final static boolean DEBUG = true; -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-other_1.0.6/gen/org/solovyev/android/other/BuildConfig.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-other_1.0.6/gen/org/solovyev/android/other/BuildConfig.java deleted file mode 100644 index e3bddf1c..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-other_1.0.6/gen/org/solovyev/android/other/BuildConfig.java +++ /dev/null @@ -1,6 +0,0 @@ -/** Automatically generated file. DO NOT MODIFY */ -package org.solovyev.android.other; - -public final class BuildConfig { - public final static boolean DEBUG = true; -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-preferences_1.0.6/gen/org/solovyev/android/prefs/BuildConfig.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-preferences_1.0.6/gen/org/solovyev/android/prefs/BuildConfig.java deleted file mode 100644 index 90f5ceeb..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-preferences_1.0.6/gen/org/solovyev/android/prefs/BuildConfig.java +++ /dev/null @@ -1,6 +0,0 @@ -/** Automatically generated file. DO NOT MODIFY */ -package org.solovyev.android.prefs; - -public final class BuildConfig { - public final static boolean DEBUG = true; -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/gen/org/solovyev/android/view/BuildConfig.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/gen/org/solovyev/android/view/BuildConfig.java deleted file mode 100644 index 4cc1a99f..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/gen/org/solovyev/android/view/BuildConfig.java +++ /dev/null @@ -1,6 +0,0 @@ -/** Automatically generated file. DO NOT MODIFY */ -package org.solovyev.android.view; - -public final class BuildConfig { - public final static boolean DEBUG = true; -} \ No newline at end of file diff --git a/android-app/pom.xml b/android-app/pom.xml index ae367212..40283d01 100644 --- a/android-app/pom.xml +++ b/android-app/pom.xml @@ -24,8 +24,15 @@ - org.solovyev.android.calculator + org.solovyev.android calculatorpp-android-app-core + apklib + + + + org.solovyev.android + calculatorpp-android-app-widget + apklib diff --git a/android-app/project.properties b/android-app/project.properties index a00e8017..41cc5058 100644 --- a/android-app/project.properties +++ b/android-app/project.properties @@ -9,19 +9,21 @@ # Project target. target=android-15 -android.library.reference.1=gen-external-apklibs/org.solovyev.android_android-common-all_1.0.6 -android.library.reference.2=gen-external-apklibs/org.solovyev.android_android-common-ads_1.0.6 -android.library.reference.3=gen-external-apklibs/org.solovyev.android_android-common-core_1.0.6 -android.library.reference.4=gen-external-apklibs/org.solovyev.android_android-common-billing_1.0.6 -android.library.reference.5=gen-external-apklibs/org.solovyev.android_android-common-db_1.0.6 -android.library.reference.6=gen-external-apklibs/org.solovyev.android_android-common-http_1.0.6 -android.library.reference.7=gen-external-apklibs/org.solovyev.android_android-common-list_1.0.6 -android.library.reference.8=gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6 -android.library.reference.9=gen-external-apklibs/org.solovyev.android_android-common-preferences_1.0.6 -android.library.reference.10=gen-external-apklibs/org.solovyev.android_android-common-menu_1.0.6 -android.library.reference.11=gen-external-apklibs/org.solovyev.android_android-common-other_1.0.6 -android.library.reference.12=gen-external-apklibs/org.solovyev.android_android-common-sherlock_1.0.6 -android.library.reference.13=gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0 -android.library.reference.14=gen-external-apklibs/org.solovyev.android_android-common-keyboard_1.0.6 +android.library.reference.1=../android-app-core +android.library.reference.2=../android-app-widget +android.library.reference.3=gen-external-apklibs/org.solovyev.android_android-common-all_1.0.6 +android.library.reference.4=gen-external-apklibs/org.solovyev.android_android-common-ads_1.0.6 +android.library.reference.5=gen-external-apklibs/org.solovyev.android_android-common-core_1.0.6 +android.library.reference.6=gen-external-apklibs/org.solovyev.android_android-common-billing_1.0.6 +android.library.reference.7=gen-external-apklibs/org.solovyev.android_android-common-db_1.0.6 +android.library.reference.8=gen-external-apklibs/org.solovyev.android_android-common-http_1.0.6 +android.library.reference.9=gen-external-apklibs/org.solovyev.android_android-common-list_1.0.6 +android.library.reference.10=gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6 +android.library.reference.11=gen-external-apklibs/org.solovyev.android_android-common-preferences_1.0.6 +android.library.reference.12=gen-external-apklibs/org.solovyev.android_android-common-menu_1.0.6 +android.library.reference.13=gen-external-apklibs/org.solovyev.android_android-common-other_1.0.6 +android.library.reference.14=gen-external-apklibs/org.solovyev.android_android-common-sherlock_1.0.6 +android.library.reference.15=gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0 +android.library.reference.16=gen-external-apklibs/org.solovyev.android_android-common-keyboard_1.0.6 diff --git a/core/pom.xml b/core/pom.xml index 79a47275..55a1ae37 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -11,7 +11,7 @@ org.solovyev.android calculatorpp-core 1.5.3-SNAPSHOT - Calculator++ Application Core + Calculator++ Core jar diff --git a/pom.xml b/pom.xml index 63aa0983..3808b754 100644 --- a/pom.xml +++ b/pom.xml @@ -46,9 +46,17 @@ - org.solovyev.android.calculator + org.solovyev.android calculatorpp-android-app-core 1.5.3-SNAPSHOT + apklib + + + + org.solovyev.android + calculatorpp-android-app-widget + 1.5.3-SNAPSHOT + apklib From b9a90f79f9d86f400eaa1dc3fa125a70c24135e1 Mon Sep 17 00:00:00 2001 From: Sergey Solovyev Date: Fri, 30 Nov 2012 18:14:00 +0400 Subject: [PATCH 05/14] removed gen folder --- .../gen/com/actionbarsherlock/BuildConfig.java | 6 ------ .../gen/org/solovyev/android/all/BuildConfig.java | 6 ------ .../gen/org/solovyev/android/sherlock/BuildConfig.java | 6 ------ 3 files changed, 18 deletions(-) delete mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/gen/com/actionbarsherlock/BuildConfig.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-all_1.0.6/gen/org/solovyev/android/all/BuildConfig.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-sherlock_1.0.6/gen/org/solovyev/android/sherlock/BuildConfig.java diff --git a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/gen/com/actionbarsherlock/BuildConfig.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/gen/com/actionbarsherlock/BuildConfig.java deleted file mode 100644 index ceb2ab07..00000000 --- a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/gen/com/actionbarsherlock/BuildConfig.java +++ /dev/null @@ -1,6 +0,0 @@ -/** Automatically generated file. DO NOT MODIFY */ -package com.actionbarsherlock; - -public final class BuildConfig { - public final static boolean DEBUG = true; -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-all_1.0.6/gen/org/solovyev/android/all/BuildConfig.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-all_1.0.6/gen/org/solovyev/android/all/BuildConfig.java deleted file mode 100644 index c9c249b6..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-all_1.0.6/gen/org/solovyev/android/all/BuildConfig.java +++ /dev/null @@ -1,6 +0,0 @@ -/** Automatically generated file. DO NOT MODIFY */ -package org.solovyev.android.all; - -public final class BuildConfig { - public final static boolean DEBUG = true; -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-sherlock_1.0.6/gen/org/solovyev/android/sherlock/BuildConfig.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-sherlock_1.0.6/gen/org/solovyev/android/sherlock/BuildConfig.java deleted file mode 100644 index 339e5e3a..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-sherlock_1.0.6/gen/org/solovyev/android/sherlock/BuildConfig.java +++ /dev/null @@ -1,6 +0,0 @@ -/** Automatically generated file. DO NOT MODIFY */ -package org.solovyev.android.sherlock; - -public final class BuildConfig { - public final static boolean DEBUG = true; -} \ No newline at end of file From fb53604b3fca94f1feb75cbfe5c4283573c978f0 Mon Sep 17 00:00:00 2001 From: Sergey Solovyev Date: Fri, 30 Nov 2012 18:21:16 +0400 Subject: [PATCH 06/14] removed gen folder --- .../gen/net/robotmedia/billing/Manifest.java | 5 ----- .../gen/net/robotmedia/billing/R.java | 5 ----- .../gen/org/solovyev/android/db/Manifest.java | 5 ----- .../gen/org/solovyev/android/db/R.java | 5 ----- .../gen/org/solovyev/android/http/Manifest.java | 5 ----- .../gen/org/solovyev/android/http/R.java | 5 ----- .../gen/org/solovyev/android/list/Manifest.java | 5 ----- .../gen/org/solovyev/android/list/R.java | 5 ----- 8 files changed, 40 deletions(-) delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-billing_1.0.6/gen/net/robotmedia/billing/Manifest.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-billing_1.0.6/gen/net/robotmedia/billing/R.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-db_1.0.6/gen/org/solovyev/android/db/Manifest.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-db_1.0.6/gen/org/solovyev/android/db/R.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-http_1.0.6/gen/org/solovyev/android/http/Manifest.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-http_1.0.6/gen/org/solovyev/android/http/R.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-list_1.0.6/gen/org/solovyev/android/list/Manifest.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-list_1.0.6/gen/org/solovyev/android/list/R.java diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-billing_1.0.6/gen/net/robotmedia/billing/Manifest.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-billing_1.0.6/gen/net/robotmedia/billing/Manifest.java deleted file mode 100644 index 22103563..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-billing_1.0.6/gen/net/robotmedia/billing/Manifest.java +++ /dev/null @@ -1,5 +0,0 @@ -package net.robotmedia.billing; - -/* This stub is for using by IDE only. It is NOT the Manifest class actually packed into APK */ -public final class Manifest { -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-billing_1.0.6/gen/net/robotmedia/billing/R.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-billing_1.0.6/gen/net/robotmedia/billing/R.java deleted file mode 100644 index 80008e77..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-billing_1.0.6/gen/net/robotmedia/billing/R.java +++ /dev/null @@ -1,5 +0,0 @@ -package net.robotmedia.billing; - -/* This stub is for using by IDE only. It is NOT the R class actually packed into APK */ -public final class R { -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-db_1.0.6/gen/org/solovyev/android/db/Manifest.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-db_1.0.6/gen/org/solovyev/android/db/Manifest.java deleted file mode 100644 index dfe89650..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-db_1.0.6/gen/org/solovyev/android/db/Manifest.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.solovyev.android.db; - -/* This stub is for using by IDE only. It is NOT the Manifest class actually packed into APK */ -public final class Manifest { -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-db_1.0.6/gen/org/solovyev/android/db/R.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-db_1.0.6/gen/org/solovyev/android/db/R.java deleted file mode 100644 index aefcac0c..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-db_1.0.6/gen/org/solovyev/android/db/R.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.solovyev.android.db; - -/* This stub is for using by IDE only. It is NOT the R class actually packed into APK */ -public final class R { -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-http_1.0.6/gen/org/solovyev/android/http/Manifest.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-http_1.0.6/gen/org/solovyev/android/http/Manifest.java deleted file mode 100644 index 8f7b4624..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-http_1.0.6/gen/org/solovyev/android/http/Manifest.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.solovyev.android.http; - -/* This stub is for using by IDE only. It is NOT the Manifest class actually packed into APK */ -public final class Manifest { -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-http_1.0.6/gen/org/solovyev/android/http/R.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-http_1.0.6/gen/org/solovyev/android/http/R.java deleted file mode 100644 index 8f01b351..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-http_1.0.6/gen/org/solovyev/android/http/R.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.solovyev.android.http; - -/* This stub is for using by IDE only. It is NOT the R class actually packed into APK */ -public final class R { -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-list_1.0.6/gen/org/solovyev/android/list/Manifest.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-list_1.0.6/gen/org/solovyev/android/list/Manifest.java deleted file mode 100644 index b6bf0da3..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-list_1.0.6/gen/org/solovyev/android/list/Manifest.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.solovyev.android.list; - -/* This stub is for using by IDE only. It is NOT the Manifest class actually packed into APK */ -public final class Manifest { -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-list_1.0.6/gen/org/solovyev/android/list/R.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-list_1.0.6/gen/org/solovyev/android/list/R.java deleted file mode 100644 index e23eb9d0..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-list_1.0.6/gen/org/solovyev/android/list/R.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.solovyev.android.list; - -/* This stub is for using by IDE only. It is NOT the R class actually packed into APK */ -public final class R { -} \ No newline at end of file From 5d1ddf976de49569f65764afa817c9bd5d4aa734 Mon Sep 17 00:00:00 2001 From: Sergey Solovyev Date: Fri, 30 Nov 2012 18:24:48 +0400 Subject: [PATCH 07/14] removed gen folder --- .../gen/com/actionbarsherlock/Manifest.java | 5 - .../gen/com/actionbarsherlock/R.java | 5 - .../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/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 - .../org/solovyev/android/ads/Manifest.java | 5 - .../gen/org/solovyev/android/ads/R.java | 5 - .../org/solovyev/android/all/Manifest.java | 5 - .../gen/org/solovyev/android/all/R.java | 5 - .../org/solovyev/android/core/Manifest.java | 5 - .../gen/org/solovyev/android/core/R.java | 5 - .../solovyev/android/keyboard/Manifest.java | 5 - .../gen/org/solovyev/android/keyboard/R.java | 5 - .../org/solovyev/android/menu/Manifest.java | 5 - .../gen/org/solovyev/android/menu/R.java | 5 - .../org/solovyev/android/other/Manifest.java | 5 - .../gen/org/solovyev/android/other/R.java | 5 - .../org/solovyev/android/prefs/Manifest.java | 5 - .../gen/org/solovyev/android/prefs/R.java | 5 - .../solovyev/android/sherlock/Manifest.java | 5 - .../gen/org/solovyev/android/sherlock/R.java | 5 - .../org/solovyev/android/view/Manifest.java | 5 - .../gen/org/solovyev/android/view/R.java | 5 - .../org/solovyev/android/LastTabSaver.java | 76 - .../android/history/HistoryDragProcessor.java | 54 - .../AbstractEnumPickerDialogPreference.java | 39 - .../prefs/AbstractPickerDialogPreference.java | 62 - .../prefs/DoublePickerDialogPreference.java | 67 - .../prefs/FloatRangeSeekBarPreference.java | 36 - .../prefs/IntegerPickerDialogPreference.java | 39 - .../prefs/IntegerRangeSeekBarPreference.java | 36 - .../prefs/MultiSelectListPreference.java | 196 --- .../prefs/NumberPickerDialogPreference.java | 52 - .../android/prefs/RangeSeekBarPreference.java | 92 -- .../view/AbstractAlertDialogBuilder.java | 25 - .../android/view/AbstractRangeSeekBar.java | 421 ------ .../android/view/ActivityViewBuilder.java | 14 - .../android/view/AndroidViewUtils.java | 93 -- .../android/view/AutoResizeTextView.java | 301 ---- .../org/solovyev/android/view/ButtonDef.java | 17 - .../solovyev/android/view/ColorButton.java | 232 --- .../android/view/ColorPickerDialog.java | 234 --- .../view/ConfirmationDialogBuilder.java | 104 -- .../android/view/DataActivityViewBuilder.java | 13 - .../solovyev/android/view/DialogBuilder.java | 12 - .../solovyev/android/view/DoubleRange.java | 51 - .../org/solovyev/android/view/Grayable.java | 13 - .../solovyev/android/view/GrayableImpl.java | 41 - .../android/view/GrayableRelativeLayout.java | 44 - .../solovyev/android/view/GrayableView.java | 9 - .../solovyev/android/view/IntegerRange.java | 49 - .../org/solovyev/android/view/ListRange.java | 60 - .../android/view/ListViewBuilder.java | 59 - .../solovyev/android/view/NumberRange.java | 83 - .../android/view/NumberRangeSeekBar.java | 60 - .../org/solovyev/android/view/NumberType.java | 68 - .../android/view/OnClickListenerVibrator.java | 36 - .../src/org/solovyev/android/view/Picker.java | 283 ---- .../solovyev/android/view/PickerButton.java | 105 -- .../android/view/TextViewBuilder.java | 58 - .../android/view/VibratorContainer.java | 64 - .../org/solovyev/android/view/ViewDef.java | 27 - .../android/view/ViewFromLayoutBuilder.java | 64 - .../solovyev/android/view/ViewGrayable.java | 15 - .../view/drag/DirectionDragButton.java | 462 ------ .../view/drag/DirectionDragButtonDef.java | 15 - .../view/drag/DirectionDragButtonDefImpl.java | 175 --- .../android/view/drag/DragButton.java | 164 -- .../android/view/drag/DragButtonDef.java | 11 - .../android/view/drag/DragDirection.java | 14 - .../solovyev/android/view/drag/DragEvent.java | 42 - .../drag/DragPreferencesChangeListener.java | 20 - .../android/view/drag/OnDragListener.java | 29 - .../view/drag/OnDragListenerWrapper.java | 34 - .../view/drag/SimpleOnDragListener.java | 327 ---- .../android/view/scroll/ScrollViewState.java | 51 - 107 files changed, 16454 deletions(-) delete mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/gen/com/actionbarsherlock/Manifest.java delete mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/gen/com/actionbarsherlock/R.java delete mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/Animator.java delete mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorListenerAdapter.java delete mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorSet.java delete mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatEvaluator.java delete mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatKeyframeSet.java delete mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntEvaluator.java delete mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntKeyframeSet.java delete mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/Keyframe.java delete mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/KeyframeSet.java delete mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/ObjectAnimator.java delete mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/PropertyValuesHolder.java delete mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/TypeEvaluator.java delete mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/ValueAnimator.java delete mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/view/NineViewGroup.java delete mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/view/animation/AnimatorProxy.java delete mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineFrameLayout.java delete mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineHorizontalScrollView.java delete mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineLinearLayout.java delete mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/ActionMenu.java delete mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/ActionMenuItem.java delete mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/ActionMenuItemView.java delete mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/ActionMenuPresenter.java delete mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/ActionMenuView.java delete mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/BaseMenuPresenter.java delete mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/ListMenuItemView.java delete mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuBuilder.java delete mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuItemImpl.java delete mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuItemWrapper.java delete mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuPopupHelper.java delete mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuPresenter.java delete mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuView.java delete mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuWrapper.java delete mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/SubMenuBuilder.java delete mode 100644 android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/SubMenuWrapper.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-ads_1.0.6/gen/org/solovyev/android/ads/Manifest.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-ads_1.0.6/gen/org/solovyev/android/ads/R.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-all_1.0.6/gen/org/solovyev/android/all/Manifest.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-all_1.0.6/gen/org/solovyev/android/all/R.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-core_1.0.6/gen/org/solovyev/android/core/Manifest.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-core_1.0.6/gen/org/solovyev/android/core/R.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-keyboard_1.0.6/gen/org/solovyev/android/keyboard/Manifest.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-keyboard_1.0.6/gen/org/solovyev/android/keyboard/R.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-menu_1.0.6/gen/org/solovyev/android/menu/Manifest.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-menu_1.0.6/gen/org/solovyev/android/menu/R.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-other_1.0.6/gen/org/solovyev/android/other/Manifest.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-other_1.0.6/gen/org/solovyev/android/other/R.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-preferences_1.0.6/gen/org/solovyev/android/prefs/Manifest.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-preferences_1.0.6/gen/org/solovyev/android/prefs/R.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-sherlock_1.0.6/gen/org/solovyev/android/sherlock/Manifest.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-sherlock_1.0.6/gen/org/solovyev/android/sherlock/R.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/gen/org/solovyev/android/view/Manifest.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/gen/org/solovyev/android/view/R.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/LastTabSaver.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/history/HistoryDragProcessor.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/AbstractEnumPickerDialogPreference.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/AbstractPickerDialogPreference.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/DoublePickerDialogPreference.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/FloatRangeSeekBarPreference.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/IntegerPickerDialogPreference.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/IntegerRangeSeekBarPreference.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/MultiSelectListPreference.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/NumberPickerDialogPreference.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/RangeSeekBarPreference.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/AbstractAlertDialogBuilder.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/AbstractRangeSeekBar.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ActivityViewBuilder.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/AndroidViewUtils.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/AutoResizeTextView.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ButtonDef.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ColorButton.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ColorPickerDialog.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ConfirmationDialogBuilder.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/DataActivityViewBuilder.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/DialogBuilder.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/DoubleRange.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/Grayable.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/GrayableImpl.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/GrayableRelativeLayout.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/GrayableView.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/IntegerRange.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ListRange.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ListViewBuilder.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/NumberRange.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/NumberRangeSeekBar.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/NumberType.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/OnClickListenerVibrator.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/Picker.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/PickerButton.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/TextViewBuilder.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/VibratorContainer.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ViewDef.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ViewFromLayoutBuilder.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ViewGrayable.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DirectionDragButton.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DirectionDragButtonDef.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DirectionDragButtonDefImpl.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DragButton.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DragButtonDef.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DragDirection.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DragEvent.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DragPreferencesChangeListener.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/OnDragListener.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/OnDragListenerWrapper.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/SimpleOnDragListener.java delete mode 100644 android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/scroll/ScrollViewState.java diff --git a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/gen/com/actionbarsherlock/Manifest.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/gen/com/actionbarsherlock/Manifest.java deleted file mode 100644 index dcc76bbd..00000000 --- a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/gen/com/actionbarsherlock/Manifest.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.actionbarsherlock; - -/* This stub is for using by IDE only. It is NOT the Manifest class actually packed into APK */ -public final class Manifest { -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/gen/com/actionbarsherlock/R.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/gen/com/actionbarsherlock/R.java deleted file mode 100644 index 8a43c169..00000000 --- a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/gen/com/actionbarsherlock/R.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.actionbarsherlock; - -/* This stub is for using by IDE only. It is NOT the R class actually packed into APK */ -public final class R { -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/Animator.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/Animator.java deleted file mode 100644 index 2caf5b4a..00000000 --- a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/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/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorListenerAdapter.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorListenerAdapter.java deleted file mode 100644 index 02ddff48..00000000 --- a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/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/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorSet.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorSet.java deleted file mode 100644 index 3231080c..00000000 --- a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/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/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatEvaluator.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatEvaluator.java deleted file mode 100644 index e4101936..00000000 --- a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/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/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatKeyframeSet.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatKeyframeSet.java deleted file mode 100644 index 6d9dafa7..00000000 --- a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/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/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntEvaluator.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntEvaluator.java deleted file mode 100644 index ed5e79ec..00000000 --- a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/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/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntKeyframeSet.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntKeyframeSet.java deleted file mode 100644 index e9215e7f..00000000 --- a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/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/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/Keyframe.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/Keyframe.java deleted file mode 100644 index ab76fa7f..00000000 --- a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/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/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/KeyframeSet.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/KeyframeSet.java deleted file mode 100644 index a71e1ad3..00000000 --- a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/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/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/ObjectAnimator.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/ObjectAnimator.java deleted file mode 100644 index 21d15c02..00000000 --- a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/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/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/PropertyValuesHolder.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/PropertyValuesHolder.java deleted file mode 100644 index 84f7504a..00000000 --- a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/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/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/TypeEvaluator.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/TypeEvaluator.java deleted file mode 100644 index 0ea31924..00000000 --- a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/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/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/ValueAnimator.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/animation/ValueAnimator.java deleted file mode 100644 index d8a12c68..00000000 --- a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/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/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/view/NineViewGroup.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/view/NineViewGroup.java deleted file mode 100644 index 7b830b9c..00000000 --- a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/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/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/view/animation/AnimatorProxy.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/view/animation/AnimatorProxy.java deleted file mode 100644 index 067d0494..00000000 --- a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/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/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineFrameLayout.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineFrameLayout.java deleted file mode 100644 index 953e3e84..00000000 --- a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/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/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineHorizontalScrollView.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineHorizontalScrollView.java deleted file mode 100644 index 129b5aaa..00000000 --- a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/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/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineLinearLayout.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineLinearLayout.java deleted file mode 100644 index 1f381013..00000000 --- a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/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/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/ActionMenu.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/ActionMenu.java deleted file mode 100644 index 0354ad1a..00000000 --- a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/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/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/ActionMenuItem.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/ActionMenuItem.java deleted file mode 100644 index 510b9748..00000000 --- a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/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/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/ActionMenuItemView.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/ActionMenuItemView.java deleted file mode 100644 index dcb50f36..00000000 --- a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/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/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/ActionMenuPresenter.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/ActionMenuPresenter.java deleted file mode 100644 index 876a22c5..00000000 --- a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/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/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/ActionMenuView.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/ActionMenuView.java deleted file mode 100644 index 0e3b1ae0..00000000 --- a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/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/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/BaseMenuPresenter.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/BaseMenuPresenter.java deleted file mode 100644 index 6da26f2a..00000000 --- a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/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/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/ListMenuItemView.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/ListMenuItemView.java deleted file mode 100644 index ac25c373..00000000 --- a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/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/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuBuilder.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuBuilder.java deleted file mode 100644 index 179b8f03..00000000 --- a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/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/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuItemImpl.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuItemImpl.java deleted file mode 100644 index f5359fb4..00000000 --- a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/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/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuItemWrapper.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuItemWrapper.java deleted file mode 100644 index aaf2997b..00000000 --- a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/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/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuPopupHelper.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuPopupHelper.java deleted file mode 100644 index f030de31..00000000 --- a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/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/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuPresenter.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuPresenter.java deleted file mode 100644 index c3f35472..00000000 --- a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/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/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuView.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuView.java deleted file mode 100644 index 323ba2d8..00000000 --- a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/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/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuWrapper.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/MenuWrapper.java deleted file mode 100644 index 3d4dd42f..00000000 --- a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/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/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/SubMenuBuilder.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/SubMenuBuilder.java deleted file mode 100644 index 6679cf38..00000000 --- a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/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/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/SubMenuWrapper.java b/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/src/com/actionbarsherlock/internal/view/menu/SubMenuWrapper.java deleted file mode 100644 index 7d307acb..00000000 --- a/android-app/gen-external-apklibs/com.actionbarsherlock_actionbarsherlock_4.2.0/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/android-app/gen-external-apklibs/org.solovyev.android_android-common-ads_1.0.6/gen/org/solovyev/android/ads/Manifest.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-ads_1.0.6/gen/org/solovyev/android/ads/Manifest.java deleted file mode 100644 index 9d2710a8..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-ads_1.0.6/gen/org/solovyev/android/ads/Manifest.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.solovyev.android.ads; - -/* This stub is for using by IDE only. It is NOT the Manifest class actually packed into APK */ -public final class Manifest { -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-ads_1.0.6/gen/org/solovyev/android/ads/R.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-ads_1.0.6/gen/org/solovyev/android/ads/R.java deleted file mode 100644 index 510a1c46..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-ads_1.0.6/gen/org/solovyev/android/ads/R.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.solovyev.android.ads; - -/* This stub is for using by IDE only. It is NOT the R class actually packed into APK */ -public final class R { -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-all_1.0.6/gen/org/solovyev/android/all/Manifest.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-all_1.0.6/gen/org/solovyev/android/all/Manifest.java deleted file mode 100644 index 07cbbca1..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-all_1.0.6/gen/org/solovyev/android/all/Manifest.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.solovyev.android.all; - -/* This stub is for using by IDE only. It is NOT the Manifest class actually packed into APK */ -public final class Manifest { -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-all_1.0.6/gen/org/solovyev/android/all/R.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-all_1.0.6/gen/org/solovyev/android/all/R.java deleted file mode 100644 index 7a01793d..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-all_1.0.6/gen/org/solovyev/android/all/R.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.solovyev.android.all; - -/* This stub is for using by IDE only. It is NOT the R class actually packed into APK */ -public final class R { -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-core_1.0.6/gen/org/solovyev/android/core/Manifest.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-core_1.0.6/gen/org/solovyev/android/core/Manifest.java deleted file mode 100644 index bf9ac9f5..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-core_1.0.6/gen/org/solovyev/android/core/Manifest.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.solovyev.android.core; - -/* This stub is for using by IDE only. It is NOT the Manifest class actually packed into APK */ -public final class Manifest { -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-core_1.0.6/gen/org/solovyev/android/core/R.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-core_1.0.6/gen/org/solovyev/android/core/R.java deleted file mode 100644 index a5563bca..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-core_1.0.6/gen/org/solovyev/android/core/R.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.solovyev.android.core; - -/* This stub is for using by IDE only. It is NOT the R class actually packed into APK */ -public final class R { -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-keyboard_1.0.6/gen/org/solovyev/android/keyboard/Manifest.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-keyboard_1.0.6/gen/org/solovyev/android/keyboard/Manifest.java deleted file mode 100644 index 588f9a0a..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-keyboard_1.0.6/gen/org/solovyev/android/keyboard/Manifest.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.solovyev.android.keyboard; - -/* This stub is for using by IDE only. It is NOT the Manifest class actually packed into APK */ -public final class Manifest { -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-keyboard_1.0.6/gen/org/solovyev/android/keyboard/R.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-keyboard_1.0.6/gen/org/solovyev/android/keyboard/R.java deleted file mode 100644 index 4823f3eb..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-keyboard_1.0.6/gen/org/solovyev/android/keyboard/R.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.solovyev.android.keyboard; - -/* This stub is for using by IDE only. It is NOT the R class actually packed into APK */ -public final class R { -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-menu_1.0.6/gen/org/solovyev/android/menu/Manifest.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-menu_1.0.6/gen/org/solovyev/android/menu/Manifest.java deleted file mode 100644 index 051d5f1b..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-menu_1.0.6/gen/org/solovyev/android/menu/Manifest.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.solovyev.android.menu; - -/* This stub is for using by IDE only. It is NOT the Manifest class actually packed into APK */ -public final class Manifest { -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-menu_1.0.6/gen/org/solovyev/android/menu/R.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-menu_1.0.6/gen/org/solovyev/android/menu/R.java deleted file mode 100644 index 02fbd211..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-menu_1.0.6/gen/org/solovyev/android/menu/R.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.solovyev.android.menu; - -/* This stub is for using by IDE only. It is NOT the R class actually packed into APK */ -public final class R { -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-other_1.0.6/gen/org/solovyev/android/other/Manifest.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-other_1.0.6/gen/org/solovyev/android/other/Manifest.java deleted file mode 100644 index e8d38fb1..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-other_1.0.6/gen/org/solovyev/android/other/Manifest.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.solovyev.android.other; - -/* This stub is for using by IDE only. It is NOT the Manifest class actually packed into APK */ -public final class Manifest { -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-other_1.0.6/gen/org/solovyev/android/other/R.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-other_1.0.6/gen/org/solovyev/android/other/R.java deleted file mode 100644 index d45d2276..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-other_1.0.6/gen/org/solovyev/android/other/R.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.solovyev.android.other; - -/* This stub is for using by IDE only. It is NOT the R class actually packed into APK */ -public final class R { -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-preferences_1.0.6/gen/org/solovyev/android/prefs/Manifest.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-preferences_1.0.6/gen/org/solovyev/android/prefs/Manifest.java deleted file mode 100644 index 8d450965..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-preferences_1.0.6/gen/org/solovyev/android/prefs/Manifest.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.solovyev.android.prefs; - -/* This stub is for using by IDE only. It is NOT the Manifest class actually packed into APK */ -public final class Manifest { -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-preferences_1.0.6/gen/org/solovyev/android/prefs/R.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-preferences_1.0.6/gen/org/solovyev/android/prefs/R.java deleted file mode 100644 index a20f3eec..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-preferences_1.0.6/gen/org/solovyev/android/prefs/R.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.solovyev.android.prefs; - -/* This stub is for using by IDE only. It is NOT the R class actually packed into APK */ -public final class R { -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-sherlock_1.0.6/gen/org/solovyev/android/sherlock/Manifest.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-sherlock_1.0.6/gen/org/solovyev/android/sherlock/Manifest.java deleted file mode 100644 index 370c9059..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-sherlock_1.0.6/gen/org/solovyev/android/sherlock/Manifest.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.solovyev.android.sherlock; - -/* This stub is for using by IDE only. It is NOT the Manifest class actually packed into APK */ -public final class Manifest { -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-sherlock_1.0.6/gen/org/solovyev/android/sherlock/R.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-sherlock_1.0.6/gen/org/solovyev/android/sherlock/R.java deleted file mode 100644 index b8722c19..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-sherlock_1.0.6/gen/org/solovyev/android/sherlock/R.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.solovyev.android.sherlock; - -/* This stub is for using by IDE only. It is NOT the R class actually packed into APK */ -public final class R { -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/gen/org/solovyev/android/view/Manifest.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/gen/org/solovyev/android/view/Manifest.java deleted file mode 100644 index ba4012ab..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/gen/org/solovyev/android/view/Manifest.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.solovyev.android.view; - -/* This stub is for using by IDE only. It is NOT the Manifest class actually packed into APK */ -public final class Manifest { -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/gen/org/solovyev/android/view/R.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/gen/org/solovyev/android/view/R.java deleted file mode 100644 index 820d2111..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/gen/org/solovyev/android/view/R.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.solovyev.android.view; - -/* This stub is for using by IDE only. It is NOT the R class actually packed into APK */ -public final class R { -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/LastTabSaver.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/LastTabSaver.java deleted file mode 100644 index 01b48941..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/LastTabSaver.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (c) 2009-2012. Created by serso aka se.solovyev. - * For more information, please, contact se.solovyev@gmail.com - * or visit http://se.solovyev.org - */ - -package org.solovyev.android; - -import android.app.TabActivity; -import android.preference.PreferenceManager; -import android.widget.TabHost; -import org.jetbrains.annotations.NotNull; -import org.solovyev.android.prefs.StringPreference; - -/** - * User: serso - * Date: 1/9/12 - * Time: 6:17 PM - */ - -/** - * This class saves the last opened tab in the tabHost to the SharedPreferences in order to reopen it after closing - * The tab is defined by it's tab id and tab activity where it is hold => you can use the same tab ids in different tab activities - */ -public class LastTabSaver implements TabHost.OnTabChangeListener { - - // prefix of preference's key - private static final String LAST_OPENED_TAB_P_KEY = "last_opened_tab_"; - - // preference object - @NotNull - private final StringPreference preference; - - // activity that holds tab host - @NotNull - private final TabActivity tabActivity; - - /** - * Constructor applies saved preference value on tabHost returned by android.app.TabActivity#getTabHost() method - * and registers as onTabChangeListener - * - * @param tabActivity tab activity - * @param defaultTabId default tab (if no preference value is not defined) - */ - public LastTabSaver(@NotNull TabActivity tabActivity, @NotNull String defaultTabId) { - this.tabActivity = tabActivity; - this.preference = StringPreference.newInstance(getPreferenceKey(), defaultTabId); - - final TabHost tabHost = tabActivity.getTabHost(); - tabHost.setCurrentTabByTag(this.getLastOpenedTabId()); - tabHost.setOnTabChangedListener(this); - } - - /** - * Method must be invoked on android.app.Activity#onDestroy() method of tab activity - */ - public void destroy() { - final TabHost tabHost = tabActivity.getTabHost(); - tabHost.setOnTabChangedListener(null); - } - - @Override - public void onTabChanged(String tabId) { - preference.putPreference(PreferenceManager.getDefaultSharedPreferences(tabActivity), tabId); - } - - @NotNull - public String getLastOpenedTabId() { - return preference.getPreference(PreferenceManager.getDefaultSharedPreferences(tabActivity)); - } - - @NotNull - private String getPreferenceKey() { - return LAST_OPENED_TAB_P_KEY + tabActivity.getClass().getName(); - } -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/history/HistoryDragProcessor.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/history/HistoryDragProcessor.java deleted file mode 100644 index d9a49fd5..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/history/HistoryDragProcessor.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2009-2011. Created by serso aka se.solovyev. - * For more information, please, contact se.solovyev@gmail.com - */ - -package org.solovyev.android.history; - -import android.util.Log; -import android.view.MotionEvent; -import org.jetbrains.annotations.NotNull; -import org.solovyev.android.view.drag.DragButton; -import org.solovyev.android.view.drag.DragDirection; -import org.solovyev.android.view.drag.SimpleOnDragListener; -import org.solovyev.common.history.HistoryAction; -import org.solovyev.common.history.HistoryControl; -import org.solovyev.common.math.Point2d; - -/** -* User: serso -* Date: 9/16/11 -* Time: 11:36 PM -*/ -public class HistoryDragProcessor implements SimpleOnDragListener.DragProcessor { - - @NotNull - private final HistoryControl historyControl; - - public HistoryDragProcessor(@NotNull HistoryControl historyControl) { - this.historyControl = historyControl; - } - - @Override - public boolean processDragEvent(@NotNull DragDirection dragDirection, @NotNull DragButton dragButton, @NotNull Point2d startPoint2d, @NotNull MotionEvent motionEvent) { - boolean result = false; - - Log.d(String.valueOf(dragButton.getId()), "History on drag event start: " + dragDirection); - - final HistoryAction historyAction; - if ( dragDirection == DragDirection.up ) { - historyAction = HistoryAction.undo; - } else if ( dragDirection == DragDirection.down ) { - historyAction = HistoryAction.redo; - } else { - historyAction = null; - } - - if (historyAction != null) { - result = true; - historyControl.doHistoryAction(historyAction); - } - - return result; - } -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/AbstractEnumPickerDialogPreference.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/AbstractEnumPickerDialogPreference.java deleted file mode 100644 index 3ed7a8ed..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/AbstractEnumPickerDialogPreference.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.solovyev.android.prefs; - -import android.content.Context; -import android.util.AttributeSet; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.solovyev.android.Labeled; -import org.solovyev.android.LabeledFormatter; -import org.solovyev.android.view.ListRange; -import org.solovyev.android.view.Picker; -import org.solovyev.common.text.EnumMapper; - -import java.util.Arrays; - -/** - * User: serso - * Date: 8/10/12 - * Time: 2:02 AM - */ -public abstract class AbstractEnumPickerDialogPreference extends AbstractPickerDialogPreference { - - @NotNull - private final Class enumClass; - - protected AbstractEnumPickerDialogPreference(Context context, - AttributeSet attrs, - @Nullable String defaultStringValue, - boolean needValueText, - @NotNull Class enumClass) { - super(context, attrs, defaultStringValue, needValueText, new EnumMapper(enumClass)); - this.enumClass = enumClass; - } - - @NotNull - @Override - protected Picker.Range createRange(@NotNull T selected) { - return new ListRange(Arrays.asList(enumClass.getEnumConstants()), selected, new LabeledFormatter(getContext())); - } -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/AbstractPickerDialogPreference.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/AbstractPickerDialogPreference.java deleted file mode 100644 index 66ef429e..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/AbstractPickerDialogPreference.java +++ /dev/null @@ -1,62 +0,0 @@ -package org.solovyev.android.prefs; - -import android.content.Context; -import android.util.AttributeSet; -import android.view.Gravity; -import android.view.View; -import android.widget.LinearLayout; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.solovyev.android.view.Picker; -import org.solovyev.common.text.Mapper; - -/** - * User: serso - * Date: 8/10/12 - * Time: 1:58 AM - */ -public abstract class AbstractPickerDialogPreference extends AbstractDialogPreference implements Picker.OnChangedListener { - - - protected AbstractPickerDialogPreference(Context context, - AttributeSet attrs, - @Nullable String defaultStringValue, - boolean needValueText, - @NotNull Mapper mapper) { - super(context, attrs, defaultStringValue, needValueText, mapper); - } - - @Override - protected LinearLayout.LayoutParams getParams() { - final LinearLayout.LayoutParams result = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); - - result.gravity = Gravity.CENTER; - - return result; - } - - @NotNull - @Override - protected View createPreferenceView(@NotNull Context context) { - final Picker result = new Picker(context); - - result.setOnChangeListener(this); - - return result; - } - - @Override - protected void initPreferenceView(@NotNull View v, @Nullable T value) { - if (value != null) { - ((Picker) v).setRange(createRange(value)); - } - } - - @NotNull - protected abstract Picker.Range createRange(@NotNull T selected); - - @Override - public void onChanged(@NotNull Picker picker, @NotNull T o) { - persistValue(o); - } -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/DoublePickerDialogPreference.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/DoublePickerDialogPreference.java deleted file mode 100644 index f8c5ee8d..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/DoublePickerDialogPreference.java +++ /dev/null @@ -1,67 +0,0 @@ -package org.solovyev.android.prefs; - -import android.content.Context; -import android.util.AttributeSet; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.solovyev.android.view.DoubleRange; -import org.solovyev.android.view.NumberRange; -import org.solovyev.common.interval.Interval; -import org.solovyev.common.text.Formatter; -import org.solovyev.common.text.NumberIntervalMapper; - -import java.text.DecimalFormat; - -/** - * User: serso - * Date: 8/10/12 - * Time: 1:02 AM - */ -public class DoublePickerDialogPreference extends NumberPickerDialogPreference { - - @NotNull - private static final Formatter simpleFormatter = new DoubleFormatter(2); - - @NotNull - @Override - protected Double getDefaultStep() { - return 1d; - } - - @NotNull - @Override - protected NumberRange createRange(@NotNull Interval boundaries, @NotNull Double step, @NotNull Double selected) { - return DoubleRange.newInstance(boundaries.getLeftLimit(), boundaries.getRightLimit(), step, selected, simpleFormatter); - } - - public DoublePickerDialogPreference(Context context, AttributeSet attrs) { - super(context, attrs, new NumberIntervalMapper(Double.class)); - } - - private static class DoubleFormatter implements Formatter { - - @NotNull - private final DecimalFormat df; - - private DoubleFormatter(int numberOfDecimalDigits) { - final StringBuilder sb = new StringBuilder("#.#"); - for (int i = 1; i < numberOfDecimalDigits; i++) { - sb.append("#"); - } - - this.df = new DecimalFormat(sb.toString()); - } - - @Override - public String formatValue(@Nullable Double value) throws IllegalArgumentException { - - if (value == null) { - return "null"; - } else { - synchronized (df) { - return df.format(value); - } - } - } - } -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/FloatRangeSeekBarPreference.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/FloatRangeSeekBarPreference.java deleted file mode 100644 index cfb11a47..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/FloatRangeSeekBarPreference.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2009-2011. Created by serso aka se.solovyev. - * For more information, please, contact se.solovyev@gmail.com - * or visit http://se.solovyev.org - */ - -package org.solovyev.android.prefs; - -import android.content.Context; -import android.util.AttributeSet; -import org.jetbrains.annotations.NotNull; -import org.solovyev.common.text.NumberIntervalMapper; - -/** - * User: serso - * Date: 9/21/11 - * Time: 11:41 PM - */ -public class FloatRangeSeekBarPreference extends RangeSeekBarPreference { - - public FloatRangeSeekBarPreference(@NotNull Context context, AttributeSet attrs) { - super(context, attrs, new NumberIntervalMapper(Float.class)); - } - - @NotNull - @Override - protected Float getDefaultStep() { - return 1f; - } - - @NotNull - @Override - protected Float add(@NotNull Float l, @NotNull Float r) { - return l + r; - } -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/IntegerPickerDialogPreference.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/IntegerPickerDialogPreference.java deleted file mode 100644 index d7ba7f8e..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/IntegerPickerDialogPreference.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2009-2011. Created by serso aka se.solovyev. - * For more information, please, contact se.solovyev@gmail.com - * or visit http://se.solovyev.org - */ - -package org.solovyev.android.prefs; - -import android.content.Context; -import android.util.AttributeSet; -import org.jetbrains.annotations.NotNull; -import org.solovyev.android.view.IntegerRange; -import org.solovyev.android.view.NumberRange; -import org.solovyev.common.interval.Interval; -import org.solovyev.common.text.NumberIntervalMapper; - -/** - * User: serso - * Date: 9/26/11 - * Time: 10:31 PM - */ -public class IntegerPickerDialogPreference extends NumberPickerDialogPreference{ - - public IntegerPickerDialogPreference(Context context, AttributeSet attrs) { - super(context, attrs, new NumberIntervalMapper(Integer.class)); - } - - @NotNull - @Override - protected Integer getDefaultStep() { - return 1; - } - - @NotNull - @Override - protected NumberRange createRange(@NotNull Interval boundaries, @NotNull Integer step, @NotNull Integer selected) { - return IntegerRange.newInstance(boundaries.getLeftLimit(), boundaries.getRightLimit(), step, selected); - } -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/IntegerRangeSeekBarPreference.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/IntegerRangeSeekBarPreference.java deleted file mode 100644 index 9f948018..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/IntegerRangeSeekBarPreference.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2009-2011. Created by serso aka se.solovyev. - * For more information, please, contact se.solovyev@gmail.com - * or visit http://se.solovyev.org - */ - -package org.solovyev.android.prefs; - -import android.content.Context; -import android.util.AttributeSet; -import org.jetbrains.annotations.NotNull; -import org.solovyev.common.text.NumberIntervalMapper; - -/** - * User: serso - * Date: 9/19/11 - * Time: 10:04 PM - */ -public class IntegerRangeSeekBarPreference extends RangeSeekBarPreference { - - public IntegerRangeSeekBarPreference(@NotNull Context context, AttributeSet attrs) { - super(context, attrs, new NumberIntervalMapper(Integer.class)); - } - - @NotNull - @Override - protected Integer getDefaultStep() { - return 1; - } - - @NotNull - @Override - protected Integer add(@NotNull Integer l, @NotNull Integer r) { - return l + r; - } -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/MultiSelectListPreference.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/MultiSelectListPreference.java deleted file mode 100644 index 3180fdda..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/MultiSelectListPreference.java +++ /dev/null @@ -1,196 +0,0 @@ -package org.solovyev.android.prefs; - - -import android.app.AlertDialog.Builder; -import android.content.Context; -import android.content.DialogInterface; -import android.content.res.TypedArray; -import android.preference.ListPreference; -import android.preference.Preference; -import android.util.AttributeSet; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.solovyev.android.view.R; -import org.solovyev.common.text.CollectionTransformations; -import org.solovyev.common.text.StringMapper; -import org.solovyev.common.text.StringUtils; - -import java.util.ArrayList; -import java.util.List; - -/** - * A {@link Preference} that displays a list of entries as - * a dialog and allows multiple selections - *

- * This preference will store a string into the SharedPreferences. This string will be the values selected - * from the {@link #setEntryValues(CharSequence[])} array. - *

- */ -public class MultiSelectListPreference extends ListPreference { - - @NotNull - private static final String DEFAULT_SEPARATOR = ";"; - - @NotNull - private final org.solovyev.common.text.Mapper> mapper; - - private boolean[] checkedIndices; - - /* - ********************************************************************** - * - * CONSTRUCTORS - * - ********************************************************************** - */ - - public MultiSelectListPreference(Context context) { - this(context, null); - } - - public MultiSelectListPreference(Context context, @Nullable AttributeSet attrs) { - super(context, attrs); - - String separator = DEFAULT_SEPARATOR; - - final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MultiSelectListPreference); - for (int i = 0; i < a.getIndexCount(); i++) { - int attr = a.getIndex(i); - - final String attrValue = a.getString(attr); - - if (!StringUtils.isEmpty(attrValue)) { - switch (attr) { - case R.styleable.MultiSelectListPreference_separator: - separator = attrValue; - break; - } - } - } - - this.mapper = new Mapper(separator); - - this.checkedIndices = new boolean[getEntries().length]; - } - - @Override - public void setEntries(@NotNull CharSequence[] entries) { - super.setEntries(entries); - - checkedIndices = new boolean[entries.length]; - } - - @Override - protected void onPrepareDialogBuilder(@NotNull Builder builder) { - final CharSequence[] entries = getEntries(); - final CharSequence[] entryValues = getEntryValues(); - - if (entries == null || entryValues == null || entries.length != entryValues.length) { - throw new IllegalStateException("ListPreference requires an entries array and an entryValues array which are both the same length"); - } - - restoreCheckedEntries(); - - builder.setMultiChoiceItems(entries, checkedIndices, - new DialogInterface.OnMultiChoiceClickListener() { - public void onClick(DialogInterface dialog, int which, boolean value) { - checkedIndices[which] = value; - } - }); - } - - - private void restoreCheckedEntries() { - final CharSequence[] entryValues = getEntryValues(); - - final List values = mapper.parseValue(getValue()); - if (values != null) { - for (String value : values) { - for (int i = 0; i < entryValues.length; i++) { - final CharSequence entry = entryValues[i]; - if (entry.equals(value)) { - checkedIndices[i] = true; - break; - } - } - } - } - } - - @Override - protected void onDialogClosed(boolean positiveResult) { - final CharSequence[] entryValues = getEntryValues(); - if (positiveResult && entryValues != null) { - - final List checkedValues = new ArrayList(); - for (int i = 0; i < entryValues.length; i++) { - if (checkedIndices[i]) { - checkedValues.add(entryValues[i].toString()); - } - } - - - final String value = mapper.formatValue(checkedValues); - if (callChangeListener(value)) { - setValue(value); - } - } - } - - public static class Mapper implements org.solovyev.common.text.Mapper> { - - @NotNull - private final String separator; - - public Mapper(@NotNull String separator) { - this.separator = separator; - } - - @Override - public String formatValue(@Nullable List value) throws IllegalArgumentException { - return CollectionTransformations.formatValue(value, separator, StringMapper.getInstance()); - } - - @Override - public List parseValue(@Nullable String value) throws IllegalArgumentException { - return CollectionTransformations.split(value, separator, StringMapper.getInstance()); - } - } - - @NotNull - public static org.solovyev.common.text.Mapper> newListMapper(@NotNull org.solovyev.common.text.Mapper nestedMapper) { - return new ListMapper(DEFAULT_SEPARATOR, nestedMapper); - } - - @NotNull - public static org.solovyev.common.text.Mapper> newListMapper(@NotNull org.solovyev.common.text.Mapper nestedMapper, - @NotNull String separator) { - return new ListMapper(separator, nestedMapper); - } - - - private static class ListMapper implements org.solovyev.common.text.Mapper> { - - @NotNull - private final String separator; - - @NotNull - private final org.solovyev.common.text.Mapper nestedMapper; - - public ListMapper(@NotNull String separator, @NotNull org.solovyev.common.text.Mapper nestedMapper) { - this.separator = separator; - this.nestedMapper = nestedMapper; - } - - @Override - public String formatValue(@Nullable List value) throws IllegalArgumentException { - return CollectionTransformations.formatValue(value, separator, nestedMapper); - } - - @Override - public List parseValue(@Nullable String value) throws IllegalArgumentException { - return CollectionTransformations.split(value, separator, nestedMapper); - } - } -} - diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/NumberPickerDialogPreference.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/NumberPickerDialogPreference.java deleted file mode 100644 index 91721331..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/NumberPickerDialogPreference.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.solovyev.android.prefs; - -import android.content.Context; -import android.util.AttributeSet; -import org.jetbrains.annotations.NotNull; -import org.solovyev.android.view.NumberRange; -import org.solovyev.android.view.Picker; -import org.solovyev.common.interval.Interval; -import org.solovyev.common.text.NumberIntervalMapper; - -/** - * User: serso - * Date: 8/10/12 - * Time: 12:57 AM - */ -public abstract class NumberPickerDialogPreference> extends AbstractPickerDialogPreference { - - @NotNull - private final Interval boundaries; - - @NotNull - private final N step; - - protected NumberPickerDialogPreference(Context context, - AttributeSet attrs, - @NotNull NumberIntervalMapper mapper) { - super(context, attrs, null, false, mapper.getMapper()); - - //noinspection ConstantConditions - boundaries = mapper.parseValue(attrs.getAttributeValue(AbstractDialogPreference.localNameSpace, "boundaries")); - - final String stringStep = attrs.getAttributeValue(AbstractDialogPreference.localNameSpace, "step"); - if (stringStep == null) { - step = getDefaultStep(); - } else { - step = mapper.getMapper().parseValue(stringStep); - } - } - - @NotNull - protected abstract N getDefaultStep(); - - @NotNull - @Override - protected Picker.Range createRange(@NotNull N selected) { - return createRange(boundaries, step, selected); - } - - @NotNull - protected abstract NumberRange createRange(@NotNull Interval boundaries, @NotNull N step, @NotNull N selected); - -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/RangeSeekBarPreference.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/RangeSeekBarPreference.java deleted file mode 100644 index 0abc8de4..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/prefs/RangeSeekBarPreference.java +++ /dev/null @@ -1,92 +0,0 @@ -package org.solovyev.android.prefs; - -import android.content.Context; -import android.util.AttributeSet; -import android.view.View; -import android.widget.LinearLayout; -import org.jetbrains.annotations.NotNull; -import org.solovyev.android.view.AbstractRangeSeekBar; -import org.solovyev.android.view.NumberRangeSeekBar; -import org.solovyev.common.interval.Interval; -import org.solovyev.common.interval.IntervalImpl; -import org.solovyev.common.text.NumberIntervalMapper; - -/** - * User: serso - * Date: 9/19/11 - * Time: 12:27 PM - */ -public abstract class RangeSeekBarPreference> extends AbstractDialogPreference> implements AbstractRangeSeekBar.OnRangeSeekBarChangeListener { - - @NotNull - private final Interval boundaries; - - @NotNull - private final T step; - - public RangeSeekBarPreference(@NotNull Context context, AttributeSet attrs, @NotNull NumberIntervalMapper mapper) { - super(context, attrs, null, true, mapper); - - //noinspection ConstantConditions - boundaries = mapper.parseValue(attrs.getAttributeValue(AbstractDialogPreference.localNameSpace, "boundaries")); - - final String stepValue = attrs.getAttributeValue(AbstractDialogPreference.localNameSpace, "step"); - if ( stepValue == null ) { - step = getDefaultStep(); - } else { - step = mapper.getMapper().parseValue(stepValue); - } - - } - - @NotNull - protected abstract T getDefaultStep(); - - @NotNull - protected View createPreferenceView(@NotNull Context context) { - int count = 0; - for ( T t = boundaries.getLeftLimit(); t.compareTo(boundaries.getRightLimit()) <= 0; t = add(t, step) ) { - count += 1; - } - final NumberRangeSeekBar result = new NumberRangeSeekBar(boundaries, count, context); - - result.setNotifyWhileDragging(true); - result.setOnRangeSeekBarChangeListener(this); - - return result; - } - - @NotNull - protected abstract T add(@NotNull T l, @NotNull T r); - - @Override - protected LinearLayout.LayoutParams getParams() { - return null; - } - - @Override - protected void initPreferenceView(@NotNull View v, Interval value) { - if (value != null) { - ((NumberRangeSeekBar) v).setSelectedMinValue(value.getLeftLimit()); - ((NumberRangeSeekBar) v).setSelectedMaxValue(value.getRightLimit()); - setValueText(value); - } - } - - @Override - public void rangeSeekBarValuesChanged(T minValue, T maxValue, boolean changeComplete) { - final Interval interval = IntervalImpl.newClosed(minValue, maxValue); - - if (changeComplete) { - persistValue(interval); - } - - setValueText(interval); - } - - private void setValueText(@NotNull Interval interval) { - final String t = String.valueOf(interval); - final String valueText = getValueText(); - updateValueText(valueText == null ? t : t.concat(valueText)); - } -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/AbstractAlertDialogBuilder.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/AbstractAlertDialogBuilder.java deleted file mode 100644 index 63d34a29..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/AbstractAlertDialogBuilder.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.solovyev.android.view; - -import android.app.AlertDialog; -import android.content.Context; -import org.jetbrains.annotations.NotNull; - -/** - * User: serso - * Date: 8/2/12 - * Time: 4:25 PM - */ -public abstract class AbstractAlertDialogBuilder implements DialogBuilder { - - @NotNull - private Context context; - - protected AbstractAlertDialogBuilder(@NotNull Context context) { - this.context = context; - } - - @NotNull - protected Context getContext() { - return context; - } -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/AbstractRangeSeekBar.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/AbstractRangeSeekBar.java deleted file mode 100644 index 17871f26..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/AbstractRangeSeekBar.java +++ /dev/null @@ -1,421 +0,0 @@ -package org.solovyev.android.view; - -/** - * User: serso - * Date: 9/19/11 - * Time: 3:30 PM - */ - -import android.content.Context; -import android.graphics.*; -import android.graphics.Paint.Style; -import android.view.MotionEvent; -import android.widget.ImageView; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.solovyev.common.Converter; -import org.solovyev.common.math.LinearNormalizer; -import org.solovyev.common.math.Normalizer; - -/** - * Widget that lets users select a minimum and maximum value on a given numerical range. - * The range value types can be one of Long, Double, Integer, Float, Short, Byte or BigDecimal. - * - * @param The Number type of the range values. One of Long, Double, Integer, Float, Short, Byte or BigDecimal. - * @author Stephan Tittel (stephan.tittel@kom.tu-darmstadt.de) - */ -public abstract class AbstractRangeSeekBar extends ImageView { - - @NotNull - private final Paint paint = new Paint(); - - @NotNull - private final ThumbContainer tc; - - @NotNull - private final Converter toDoubleConverter; - - @NotNull - private final Converter toTConverter; - - @NotNull - private final T minValue, maxValue; - - @NotNull - private final Normalizer fromValueNormalizer; - - @NotNull - private final Normalizer fromScreenNormalizer; - - private double normalizedMinValue = 0d; - - private double normalizedMaxValue = 1d; - - private Thumb pressedThumb = null; - - private boolean notifyWhileDragging = false; - - - @Nullable - private OnRangeSeekBarChangeListener listener; - - /** - * Creates a new RangeSeekBar. - * - * @param minValue The minimum value of the selectable range. - * @param maxValue The maximum value of the selectable range. - * @param steps number of steps to be used in range seek bar - * @param context parent context - * @throws IllegalArgumentException Will be thrown if min/max value types are not one of Long, Double, Integer, Float, Short, Byte or BigDecimal. - */ - public AbstractRangeSeekBar(@NotNull T minValue, @NotNull T maxValue, @Nullable Integer steps, Context context) throws IllegalArgumentException { - super(context); - - this.minValue = minValue; - this.maxValue = maxValue; - - this.toDoubleConverter = getToDoubleConverter(); - this.toTConverter = getToTConverter(); - - fromValueNormalizer = new LinearNormalizer(toDoubleConverter.convert(minValue), toDoubleConverter.convert(maxValue)); - - tc = new ThumbContainer(); - - fromScreenNormalizer = new Normalizer() { - @Override - public double normalize(double value) { - int width = getWidth(); - if (width <= 2 * tc.padding) { - // prevent division by zero, simply return 0. - return 0d; - } else { - double result = (value - tc.padding) / (width - 2 * tc.padding); - return Math.min(1d, Math.max(0d, result)); - } - } - - @Override - public double denormalize(double value) { - return (float) (tc.padding + value * (getWidth() - 2 * tc.padding)); - } - }; - } - - @NotNull - protected abstract Converter getToTConverter(); - - @NotNull - protected abstract Converter getToDoubleConverter(); - - public boolean isNotifyWhileDragging() { - return notifyWhileDragging; - } - - /** - * Should the widget notify the listener callback while the user is still dragging a thumb? Default is false. - * - * @param flag - */ - public void setNotifyWhileDragging(boolean flag) { - this.notifyWhileDragging = flag; - } - - /** - * Returns the absolute minimum value of the range that has been set at construction time. - * - * @return The absolute minimum value of the range. - */ - @NotNull - public T getMinValue() { - return minValue; - } - - /** - * Returns the absolute maximum value of the range that has been set at construction time. - * - * @return The absolute maximum value of the range. - */ - @NotNull - public T getMaxValue() { - return maxValue; - } - - /** - * Returns the currently selected min value. - * - * @return The currently selected min value. - */ - public T getSelectedMinValue() { - return denormalizeValue(normalizedMinValue); - } - - /** - * Sets the currently selected minimum value. The widget will be invalidated and redrawn. - * - * @param value The Number value to set the minimum value to. Will be clamped to given absolute minimum/maximum range. - */ - public void setSelectedMinValue(@NotNull T value) { - setNormalizedMinValue(normalizeValue(value)); - } - - /** - * Returns the currently selected max value. - * - * @return The currently selected max value. - */ - public T getSelectedMaxValue() { - return denormalizeValue(normalizedMaxValue); - } - - /** - * Sets the currently selected maximum value. The widget will be invalidated and redrawn. - * - * @param value The Number value to set the maximum value to. Will be clamped to given absolute minimum/maximum range. - */ - public void setSelectedMaxValue(@NotNull T value) { - setNormalizedMaxValue(normalizeValue(value)); - } - - /** - * Registers given listener callback to notify about changed selected values. - * - * @param listener The listener to notify about changed selected values. - */ - public void setOnRangeSeekBarChangeListener(OnRangeSeekBarChangeListener listener) { - this.listener = listener; - } - - /** - * Handles thumb selection and movement. Notifies listener callback on certain events. - */ - @Override - public boolean onTouchEvent(MotionEvent event) { - switch (event.getAction()) { - case MotionEvent.ACTION_DOWN: - pressedThumb = evalPressedThumb(event.getX()); - invalidate(); - break; - case MotionEvent.ACTION_MOVE: - if (pressedThumb != null) { - - double value = convertToNormalizedValue(event.getX()); - - if (Thumb.MIN.equals(pressedThumb)) { - setNormalizedMinValue(value); - } else if (Thumb.MAX.equals(pressedThumb)) { - setNormalizedMaxValue(value); - } - - if (notifyWhileDragging && listener != null) { - listener.rangeSeekBarValuesChanged(getSelectedMinValue(), getSelectedMaxValue(), false); - } - } - break; - case MotionEvent.ACTION_UP: - case MotionEvent.ACTION_CANCEL: - pressedThumb = null; - invalidate(); - if (listener != null) { - listener.rangeSeekBarValuesChanged(getSelectedMinValue(), getSelectedMaxValue(), true); - } - break; - } - return true; - } - - /** - * Ensures correct size of the widget. - */ - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - int width = 200; - if (MeasureSpec.UNSPECIFIED != MeasureSpec.getMode(widthMeasureSpec)) { - width = MeasureSpec.getSize(widthMeasureSpec); - } - - int height = tc.thumbImage.getHeight(); - if (MeasureSpec.UNSPECIFIED != MeasureSpec.getMode(heightMeasureSpec)) { - height = Math.min(height, MeasureSpec.getSize(heightMeasureSpec)); - } - setMeasuredDimension(width, height); - } - - /** - * Draws the widget on the given canvas. - */ - @Override - protected void onDraw(Canvas canvas) { - super.onDraw(canvas); - // draw seek bar background line - final RectF rect = tc.getRect(); - paint.setStyle(Style.FILL); - paint.setColor(Color.GRAY); - canvas.drawRect(rect, paint); - // draw seek bar active range line - rect.left = convertToScreenValue(normalizedMinValue); - rect.right = convertToScreenValue(normalizedMaxValue); - // orange color - paint.setColor(Color.rgb(255, 165, 0)); - canvas.drawRect(rect, paint); - - // draw minimum thumb - drawThumb(convertToScreenValue(normalizedMinValue), Thumb.MIN == pressedThumb, canvas); - - // draw maximum thumb - drawThumb(convertToScreenValue(normalizedMaxValue), Thumb.MAX == pressedThumb, canvas); - } - - /** - * Draws the "normal" resp. "pressed" thumb image on specified x-coordinate. - * - * @param normalizedToScreenValue The x-coordinate in screen space where to draw the image. - * @param pressed Is the thumb currently in "pressed" state? - * @param canvas The canvas to draw upon. - */ - private void drawThumb(float normalizedToScreenValue, boolean pressed, Canvas canvas) { - canvas.drawBitmap(tc.getImage(pressed), normalizedToScreenValue - tc.thumbHalfWidth, (float) ((0.5f * getHeight()) - tc.thumbHalfHeight), paint); - } - - /** - * Decides which (if any) thumb is touched by the given x-coordinate. - * - * @param touchX The x-coordinate of a touch event in screen space. - * @return The pressed thumb or null if none has been touched. - */ - private Thumb evalPressedThumb(float touchX) { - Thumb result = null; - boolean minThumbPressed = isInThumbRange(touchX, normalizedMinValue); - boolean maxThumbPressed = isInThumbRange(touchX, normalizedMaxValue); - if (minThumbPressed && maxThumbPressed) { - // if both thumbs are pressed (they lie on top of each other), choose the one with more room to drag. this avoids "stalling" the thumbs in a corner, not being able to drag them apart anymore. - result = (touchX / getWidth() > 0.5f) ? Thumb.MIN : Thumb.MAX; - } else if (minThumbPressed) { - result = Thumb.MIN; - } else if (maxThumbPressed) { - result = Thumb.MAX; - } - return result; - } - - /** - * Decides if given x-coordinate in screen space needs to be interpreted as "within" the normalized thumb x-coordinate. - * - * @param touchX The x-coordinate in screen space to check. - * @param normalizedThumbValue The normalized x-coordinate of the thumb to check. - * @return true if x-coordinate is in thumb range, false otherwise. - */ - private boolean isInThumbRange(float touchX, double normalizedThumbValue) { - return Math.abs(touchX - convertToScreenValue(normalizedThumbValue)) <= tc.thumbHalfWidth; - } - - /** - * Sets normalized min value to value so that 0 <= value <= normalized max value <= 1. - * The View will get invalidated when calling this method. - * - * @param value The new normalized min value to set. - */ - private void setNormalizedMinValue(double value) { - normalizedMinValue = Math.max(0d, Math.min(1d, Math.min(value, normalizedMaxValue))); - invalidate(); - } - - /** - * Sets normalized max value to value so that 0 <= normalized min value <= value <= 1. - * The View will get invalidated when calling this method. - * - * @param value The new normalized max value to set. - */ - private void setNormalizedMaxValue(double value) { - normalizedMaxValue = Math.max(0d, Math.min(1d, Math.max(value, normalizedMinValue))); - invalidate(); - } - - /** - * Converts a normalized value to a Number object in the value space between absolute minimum and maximum. - * - * @param normalized - * @return - */ - @SuppressWarnings("unchecked") - private T denormalizeValue(double normalized) { - return toTConverter.convert(fromValueNormalizer.denormalize(normalized)); - } - - /** - * Converts the given Number value to a normalized double. - * - * @param value The Number value to normalize. - * @return The normalized double. - */ - private double normalizeValue(T value) { - return fromValueNormalizer.normalize(toDoubleConverter.convert(value)); - } - - /** - * Converts a normalized value into screen space. - * - * @param normalizedValue The normalized value to convert. - * @return The converted value in screen space. - */ - private float convertToScreenValue(double normalizedValue) { - return (float)this.fromScreenNormalizer.denormalize(normalizedValue); - } - - /** - * Converts screen space x-coordinates into normalized values. - * - * @param screenValue The x-coordinate in screen space to convert. - * @return The normalized value. - */ - private double convertToNormalizedValue(float screenValue) { - return this.fromScreenNormalizer.normalize(screenValue); - } - - /** - * Callback listener interface to notify about changed range values. - * - * @param The Number type the RangeSeekBar has been declared with. - * @author Stephan Tittel (stephan.tittel@kom.tu-darmstadt.de) - */ - public interface OnRangeSeekBarChangeListener { - - void rangeSeekBarValuesChanged(T minValue, T maxValue, boolean changeComplete); - - } - - /** - * Thumb constants (min and max). - * - * @author Stephan Tittel (stephan.tittel@kom.tu-darmstadt.de) - */ - private static enum Thumb { - MIN, MAX - } - - private class ThumbContainer { - @NotNull - private final Bitmap thumbImage = BitmapFactory.decodeResource(getResources(), R.drawable.seek_thumb_normal); - - @NotNull - private final Bitmap thumbPressedImage = BitmapFactory.decodeResource(getResources(), R.drawable.seek_thumb_pressed); - - private final float thumbWidth = thumbImage.getWidth(); - - private final float thumbHalfWidth = 0.5f * thumbWidth; - - private final float thumbHalfHeight = 0.5f * thumbImage.getHeight(); - - private final float lineHeight = 0.3f * thumbHalfHeight; - - private final float padding = thumbHalfWidth; - - public RectF getRect() { - return new RectF(padding, 0.5f * (getHeight() - lineHeight), getWidth() - padding, 0.5f * (getHeight() + lineHeight)); - } - - public Bitmap getImage(boolean pressed) { - return pressed ? thumbPressedImage : thumbImage; - } - } - -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ActivityViewBuilder.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ActivityViewBuilder.java deleted file mode 100644 index 71d94fb5..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ActivityViewBuilder.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.solovyev.android.view; - -import android.app.Activity; -import org.jetbrains.annotations.NotNull; - -/** - * User: serso - * Date: 4/19/12 - * Time: 4:23 PM - */ -public interface ActivityViewBuilder { - - void buildView(@NotNull Activity activity); -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/AndroidViewUtils.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/AndroidViewUtils.java deleted file mode 100644 index 1ffd3fde..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/AndroidViewUtils.java +++ /dev/null @@ -1,93 +0,0 @@ -package org.solovyev.android.view; - -import android.graphics.Canvas; -import android.graphics.drawable.Drawable; -import android.view.View; -import android.widget.Button; -import android.widget.ImageButton; -import android.widget.TextView; -import org.jetbrains.annotations.NotNull; - -/** - * User: serso - * Date: 11/3/12 - * Time: 10:49 PM - */ -public final class AndroidViewUtils { - - private AndroidViewUtils() { - throw new AssertionError(); - } - - public static boolean drawDrawables(Canvas canvas, @NotNull TextView textView) { - final int compoundPaddingLeft = textView.getCompoundPaddingLeft(); - final int compoundPaddingTop = textView.getCompoundPaddingTop(); - final int compoundPaddingRight = textView.getCompoundPaddingRight(); - final int compoundPaddingBottom = textView.getCompoundPaddingBottom(); - - final int scrollX = textView.getScrollX(); - final int scrollY = textView.getScrollY(); - - final int right = textView.getRight(); - final int left = textView.getLeft(); - final int bottom = textView.getBottom(); - final int top = textView.getTop(); - - final Drawable[] drawables = textView.getCompoundDrawables(); - if (drawables != null) { - - int vspace = bottom - top - compoundPaddingBottom - compoundPaddingTop; - int hspace = right - left - compoundPaddingRight - compoundPaddingLeft; - - Drawable topDr = drawables[1]; - // IMPORTANT: The coordinates computed are also used in invalidateDrawable() - // Make sure to update invalidateDrawable() when changing this code. - if (topDr != null) { - canvas.save(); - canvas.translate(scrollX + compoundPaddingLeft + (hspace - topDr.getBounds().width()) / 2, - scrollY + textView.getPaddingTop() + vspace / 2); - topDr.draw(canvas); - canvas.restore(); - return true; - } - } - - return false; - } - - public static void applyButtonDef(@NotNull Button button, @NotNull ButtonDef buttonDef) { - button.setText(buttonDef.getText()); - - final Integer drawableResId = buttonDef.getDrawableResId(); - if ( drawableResId != null ) { - button.setPadding(0, 0, 0, 0); - - final Drawable drawable = button.getContext().getResources().getDrawable(drawableResId); - button.setCompoundDrawablesWithIntrinsicBounds(null, drawable, null, null); - button.setCompoundDrawablePadding(0); - } - - applyViewDef(button, buttonDef); - } - - public static void applyButtonDef(@NotNull ImageButton imageButton, @NotNull ButtonDef buttonDef) { - final Integer drawableResId = buttonDef.getDrawableResId(); - if ( drawableResId != null ) { - imageButton.setImageDrawable(imageButton.getContext().getResources().getDrawable(drawableResId)); - } - - applyViewDef(imageButton, buttonDef); - } - - public static void applyViewDef(@NotNull View view, @NotNull ViewDef viewDef) { - final Integer backgroundResId = viewDef.getBackgroundResId(); - if (backgroundResId != null) { - view.setBackgroundResource(backgroundResId); - } - - final String tag = viewDef.getTag(); - if ( tag != null ) { - view.setTag(tag); - } - } -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/AutoResizeTextView.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/AutoResizeTextView.java deleted file mode 100644 index f9ca5cb3..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/AutoResizeTextView.java +++ /dev/null @@ -1,301 +0,0 @@ -/* - * Copyright (c) 2009-2011. Created by serso aka se.solovyev. - * For more information, please, contact se.solovyev@gmail.com - * or visit http://se.solovyev.org - */ - -package org.solovyev.android.view; - -import android.content.Context; -import android.graphics.Canvas; -import android.text.Editable; -import android.text.Layout.Alignment; -import android.text.StaticLayout; -import android.text.TextPaint; -import android.util.AttributeSet; -import android.util.Log; -import android.widget.TextView; - -/** - * Text view that auto adjusts text size to fit within the view. - * If the text size equals the minimum text size and still does not - * fit, append with an ellipsis. - * - * @author Chase Colburn - * @since Apr 4, 2011 - */ -public class AutoResizeTextView extends TextView { - - // Minimum text size for this text view - public static final float MIN_TEXT_SIZE = 20; - - private float initialTextSize = 100; - - // Interface for resize notifications - public interface OnTextResizeListener { - public void onTextResize(TextView textView, float oldSize, float newSize); - } - - // Off screen canvas for text size rendering - private static final Canvas textResizeCanvas = new Canvas(); - - // Our ellipse string - private static final String ellipsis = "..."; - - // Registered resize listener - private OnTextResizeListener textResizeListener; - - // Flag for text and/or size changes to force a resize - private boolean needsResize = false; - - // Lower bounds for text size - private float minTextSize = MIN_TEXT_SIZE; - - // Text view line spacing multiplier - private float spacingMult = 1.0f; - - // Text view additional line spacing - private float spacingAdd = 0.0f; - - // Add ellipsis to text that overflows at the smallest text size - private boolean addEllipsis = true; - - // Default constructor override - public AutoResizeTextView(Context context) { - super(context); - } - - // Default constructor when inflating from XML file - public AutoResizeTextView(Context context, AttributeSet attrs) { - super(context, attrs); - } - - // Default constructor override - public AutoResizeTextView(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - } - - /** - * When text changes, set the force resize flag to true and resetInterpreter the text size. - */ - @Override - protected void onTextChanged(final CharSequence text, final int start, final int before, final int after) { - needsResize = true; - // Since this view may be reused, it is good to resetInterpreter the text size - } - - /** - * If the text view size changed, set the force resize flag to true - */ - @Override - protected void onSizeChanged(int w, int h, int oldw, int oldh) { - if (w != oldw || h != oldh) { - needsResize = true; - } - } - - /** - * Register listener to receive resize notifications - * - * @param listener - */ - public void setOnResizeListener(OnTextResizeListener listener) { - textResizeListener = listener; - } - - /** - * Override the set text size to update our internal reference values - */ - @Override - public void setTextSize(int unit, float size) { - super.setTextSize(unit, size); - } - - /** - * Override the set line spacing to update our internal reference values - */ - @Override - public void setLineSpacing(float add, float mult) { - super.setLineSpacing(add, mult); - spacingMult = mult; - spacingAdd = add; - } - - /** - * Set the lower text size limit and invalidate the view - * - * @param minTextSize - */ - public void setMinTextSize(float minTextSize) { - this.minTextSize = minTextSize; - requestLayout(); - invalidate(); - } - - /** - * Return lower text size limit - * - * @return - */ - public float getMinTextSize() { - return minTextSize; - } - - /** - * Set flag to add ellipsis to text that overflows at the smallest text size - * - * @param addEllipsis - */ - public void setAddEllipsis(boolean addEllipsis) { - this.addEllipsis = addEllipsis; - } - - /** - * Return flag to add ellipsis to text that overflows at the smallest text size - * - * @return - */ - public boolean getAddEllipsis() { - return addEllipsis; - } - - - /** - * Resize text after measuring - */ - @Override - protected void onLayout(boolean changed, int left, int top, int right, int bottom) { - if (changed || needsResize) { - int widthLimit = (right - left) - getCompoundPaddingLeft() - getCompoundPaddingRight(); - int heightLimit = (bottom - top) - getCompoundPaddingBottom() - getCompoundPaddingTop(); - resizeText(widthLimit, heightLimit, getText()); - } - super.onLayout(changed, left, top, right, bottom); - } - - /** - * Resize the text size with default width and height - */ - public void resizeText() { - resizeText(getText()); - } - - private void resizeText(final CharSequence text) { - int heightLimit = getHeight() - getPaddingBottom() - getPaddingTop(); - int widthLimit = getWidth() - getPaddingLeft() - getPaddingRight(); - resizeText(widthLimit, heightLimit, text); - } - - /** - * Resize the text size with specified width and height - * - * @param width - * @param height - * @param text - */ - private void resizeText(int width, int height, CharSequence text) { - Log.d(this.getClass().getName(), "Resizing: w=" + width + ", h=" + height + ", text='" + text + "'"); - - // Do not resize if the view does not have dimensions or there is no text - if (text == null || text.length() == 0 || height <= 0 || width <= 0) { - return; - } - - // Get the text view's paint object - TextPaint textPaint = getPaint(); - - // Store the current text size - float oldTextSize = textPaint.getTextSize(); - Log.d(this.getClass().getName(), "Old text size: " + oldTextSize); - - // If there is a max text size set, use the lesser of that and the default text size - // todo serso: +2 is a workaround => to be checked boundary constraints - float newTextSize = initialTextSize + 2; - - int newTextHeight; - - if (text instanceof Editable) { - ((Editable) text).append("|"); - } - - try { - - // Get the required text height - newTextHeight = getTextRect(text, textPaint, width, newTextSize); - - logDimensions(newTextSize, newTextHeight); - if (newTextHeight > height) { - // Until we either fit within our text view or we had reached our min text size, incrementally try smaller sizes - while (newTextHeight > height) { - if (newTextSize <= minTextSize) { - break; - } - newTextSize = Math.max(newTextSize - 1, minTextSize); - newTextHeight = getTextRect(text, textPaint, width, newTextSize); - logDimensions(newTextSize, newTextHeight); - } - } else { - while (newTextHeight < height) { - if (newTextSize <= minTextSize) { - break; - } - newTextSize = Math.max(newTextSize + 1, minTextSize); - newTextHeight = getTextRect(text, textPaint, width, newTextSize); - logDimensions(newTextSize, newTextHeight); - } - } - } finally { - if (text instanceof Editable) { - ((Editable) text).delete(text.length() - 1, text.length()); - } - } - - initialTextSize = newTextSize; - - // If we had reached our minimum text size and still don't fit, append an ellipsis - if (addEllipsis && newTextSize == minTextSize && newTextHeight > height) { - // Draw using a static layout - StaticLayout layout = new StaticLayout(text, textPaint, width, Alignment.ALIGN_NORMAL, spacingMult, spacingAdd, false); - layout.draw(textResizeCanvas); - int lastLine = layout.getLineForVertical(height) - 1; - int start = layout.getLineStart(lastLine); - int end = layout.getLineEnd(lastLine); - float lineWidth = layout.getLineWidth(lastLine); - float ellipseWidth = textPaint.measureText(ellipsis); - - // Trim characters off until we have enough room to draw the ellipsis - while (width < lineWidth + ellipseWidth) { - lineWidth = textPaint.measureText(text.subSequence(start, --end + 1).toString()); - } - setText(text.subSequence(0, end) + ellipsis); - - } - - // Some devices try to auto adjust line spacing, so force default line spacing - // and invalidate the layout as a side effect - textPaint.setTextSize(newTextSize); - setLineSpacing(spacingAdd, spacingMult); - - // Notify the listener if registered - if (textResizeListener != null) { - textResizeListener.onTextResize(this, oldTextSize, newTextSize); - } - - // Reset force resize flag - needsResize = false; - } - - private void logDimensions(float newTextSize, int newTextHeight) { - Log.d(this.getClass().getName(), "Nex text size: " + newTextSize + ", new text height: " + newTextHeight); - } - - // Set the text size of the text paint object and use a static layout to render text off screen before measuring - private int getTextRect(CharSequence source, TextPaint paint, int width, float textSize) { - // Update the text paint object - paint.setTextSize(textSize); - // Draw using a static layout - StaticLayout layout = new StaticLayout(source, paint, width, Alignment.ALIGN_NORMAL, spacingMult, spacingAdd, false); - layout.draw(textResizeCanvas); - return layout.getHeight(); - } -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ButtonDef.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ButtonDef.java deleted file mode 100644 index 3ffec7ee..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ButtonDef.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.solovyev.android.view; - -import org.jetbrains.annotations.Nullable; - -/** - * User: serso - * Date: 11/4/12 - * Time: 11:52 PM - */ -public interface ButtonDef extends ViewDef { - - @Nullable - Integer getDrawableResId(); - - @Nullable - CharSequence getText(); -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ColorButton.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ColorButton.java deleted file mode 100644 index cdeb541d..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ColorButton.java +++ /dev/null @@ -1,232 +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. - */ - -/* - * Copyright (c) 2009-2011. Created by serso aka se.solovyev. - * For more information, please, contact se.solovyev@gmail.com - */ - -package org.solovyev.android.view; - -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.Vibrator; -import android.preference.PreferenceManager; -import android.util.AttributeSet; -import android.view.MotionEvent; -import android.widget.Button; -import org.jetbrains.annotations.NotNull; -import org.solovyev.android.FontSizeAdjuster; -import org.solovyev.common.math.Point2d; -import org.solovyev.common.text.StringUtils; - -/** - * NOTE: copied from com.android.calculator2.ColorButton - */ - -/** - * Button with click-animation effect. - */ -public class ColorButton extends Button { - - private int magicFlameColour; - private boolean drawMagicFlame = true; - - private static final int CLICK_FEEDBACK_INTERVAL = 10; - private static final int CLICK_FEEDBACK_DURATION = 350; - - @NotNull - private Point2d textPosition; - private long animationStart; - private Paint feedbackPaint; - - @NotNull - private final OnClickListenerVibrator onClickListener; - - private static final float H_TEXT_POSITION_DEFAULT_VALUE = 0.5f; - - private float hTextPosition = H_TEXT_POSITION_DEFAULT_VALUE; - - private boolean showText = true; - - public ColorButton(Context context, AttributeSet attrs) { - this(context, attrs, true); - } - - public ColorButton(Context context, AttributeSet attrs, boolean init) { - super(context, attrs); - - TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DragButton); - final int N = a.getIndexCount(); - for (int i = 0; i < N; i++) { - int attr = a.getIndex(i); - - final String attrValue = a.getString(attr); - - if (!StringUtils.isEmpty(attrValue)) { - switch (attr) { - case R.styleable.DragButton_hTextPosition: - this.hTextPosition = Float.valueOf(attrValue); - break; - } - } - } - - if (init) { - init(context); - } - - this.onClickListener = new OnClickListenerVibrator((Vibrator)context.getSystemService(Context.VIBRATOR_SERVICE), PreferenceManager.getDefaultSharedPreferences(context)); - } - - protected void init(Context context) { - final Resources resources = getResources(); - - magicFlameColour = resources.getColor(R.color.magic_flame); - feedbackPaint = new Paint(); - feedbackPaint.setStyle(Style.STROKE); - feedbackPaint.setStrokeWidth(2); - - // applying textColor property on the paint (now it is not possible to set paint color through the xml) - getPaint().setColor(getCurrentTextColor()); - - animationStart = -1; - - if (context instanceof FontSizeAdjuster) { - ((FontSizeAdjuster) context).adjustFontSize(this); - } - } - - - @Override - public void onSizeChanged(int w, int h, int oldW, int oldH) { - measureText(); - } - - protected void measureText() { - Paint paint = getPaint(); - - if (getText() != null) { - textPosition = getTextPosition(paint, getText()); - } - } - - private Point2d getTextPosition(@NotNull Paint paint, @NotNull CharSequence text) { - final Point2d result = new Point2d(); - - result.setX(hTextPosition * getWidth() - 0.5f * paint.measureText(text.toString())); - - float height = getHeight() - paint.ascent() - paint.descent(); - - result.setY(height / 2); - - return result; - } - - @Override - protected void onTextChanged(CharSequence text, int start, int before, int after) { - measureText(); - } - - public void drawMagicFlame(int duration, Canvas canvas) { - int alpha = 255 - 255 * duration / CLICK_FEEDBACK_DURATION; - int color = magicFlameColour | (alpha << 24); - - feedbackPaint.setColor(color); - canvas.drawRect(1, 1, getWidth() - 1, getHeight() - 1, feedbackPaint); - } - - @Override - public void onDraw(Canvas canvas) { - if (drawMagicFlame) { - if (animationStart != -1) { - int animDuration = (int) (System.currentTimeMillis() - animationStart); - - if (animDuration >= CLICK_FEEDBACK_DURATION) { - animationStart = -1; - } else { - drawMagicFlame(animDuration, canvas); - postInvalidateDelayed(CLICK_FEEDBACK_INTERVAL); - } - } - } - - CharSequence text = getText(); - if ( !StringUtils.isEmpty(text) && textPosition != null) { - if (showText) { - canvas.drawText(text, 0, text.length(), textPosition.getX(), textPosition.getY(), getPaint()); - } - } else { - AndroidViewUtils.drawDrawables(canvas, this); - } - } - - public void animateClickFeedback() { - animationStart = System.currentTimeMillis(); - invalidate(); - } - - @Override - public boolean performClick() { - vibrate(); - return super.performClick(); - } - - @Override - public boolean performLongClick() { - vibrate(); - return super.performLongClick(); - } - - private void vibrate() { - this.onClickListener.onClick(this); - } - - @Override - public boolean onTouchEvent(MotionEvent event) { - boolean result = super.onTouchEvent(event); - - if (this.drawMagicFlame) { - switch (event.getAction()) { - case MotionEvent.ACTION_UP: - animateClickFeedback(); - break; - case MotionEvent.ACTION_DOWN: - case MotionEvent.ACTION_CANCEL: - invalidate(); - break; - } - } - - return result; - } - - public void setDrawMagicFlame(boolean drawMagicFlame) { - this.drawMagicFlame = drawMagicFlame; - } - - public boolean isShowText() { - return showText; - } - - public void setShowText(boolean showText) { - this.showText = showText; - } -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ColorPickerDialog.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ColorPickerDialog.java deleted file mode 100644 index 7fec311e..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ColorPickerDialog.java +++ /dev/null @@ -1,234 +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 org.solovyev.android.view; - -import android.os.Bundle; -import android.app.Dialog; -import android.content.Context; -import android.graphics.*; -import android.view.MotionEvent; -import android.view.View; - -public class ColorPickerDialog extends Dialog { - - public interface OnColorChangedListener { - void colorChanged(int color); - } - - private OnColorChangedListener mListener; - private int mInitialColor; - - private static class ColorPickerView extends View { - private Paint mPaint; - private Paint mCenterPaint; - private final int[] mColors; - private OnColorChangedListener mListener; - - ColorPickerView(Context c, OnColorChangedListener l, int color) { - super(c); - mListener = l; - mColors = new int[]{ - 0xFFFF0000, 0xFFFF00FF, 0xFF0000FF, 0xFF00FFFF, 0xFF00FF00, - 0xFFFFFF00, 0xFFFF0000 - }; - Shader s = new SweepGradient(0, 0, mColors, null); - - mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); - mPaint.setShader(s); - mPaint.setStyle(Paint.Style.STROKE); - mPaint.setStrokeWidth(32); - - mCenterPaint = new Paint(Paint.ANTI_ALIAS_FLAG); - mCenterPaint.setColor(color); - mCenterPaint.setStrokeWidth(5); - } - - private boolean mTrackingCenter; - private boolean mHighlightCenter; - - @Override - protected void onDraw(Canvas canvas) { - float r = CENTER_X - mPaint.getStrokeWidth() * 0.5f; - - canvas.translate(CENTER_X, CENTER_X); - - canvas.drawOval(new RectF(-r, -r, r, r), mPaint); - canvas.drawCircle(0, 0, CENTER_RADIUS, mCenterPaint); - - if (mTrackingCenter) { - int c = mCenterPaint.getColor(); - mCenterPaint.setStyle(Paint.Style.STROKE); - - if (mHighlightCenter) { - mCenterPaint.setAlpha(0xFF); - } else { - mCenterPaint.setAlpha(0x80); - } - canvas.drawCircle(0, 0, - CENTER_RADIUS + mCenterPaint.getStrokeWidth(), - mCenterPaint); - - mCenterPaint.setStyle(Paint.Style.FILL); - mCenterPaint.setColor(c); - } - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - setMeasuredDimension(CENTER_X * 2, CENTER_Y * 2); - } - - private static final int CENTER_X = 100; - private static final int CENTER_Y = 100; - private static final int CENTER_RADIUS = 32; - - private int floatToByte(float x) { - int n = java.lang.Math.round(x); - return n; - } - - private int pinToByte(int n) { - if (n < 0) { - n = 0; - } else if (n > 255) { - n = 255; - } - return n; - } - - private int ave(int s, int d, float p) { - return s + java.lang.Math.round(p * (d - s)); - } - - private int interpColor(int colors[], float unit) { - if (unit <= 0) { - return colors[0]; - } - if (unit >= 1) { - return colors[colors.length - 1]; - } - - float p = unit * (colors.length - 1); - int i = (int) p; - p -= i; - - // now p is just the fractional part [0...1) and i is the index - int c0 = colors[i]; - int c1 = colors[i + 1]; - int a = ave(Color.alpha(c0), Color.alpha(c1), p); - int r = ave(Color.red(c0), Color.red(c1), p); - int g = ave(Color.green(c0), Color.green(c1), p); - int b = ave(Color.blue(c0), Color.blue(c1), p); - - return Color.argb(a, r, g, b); - } - - private int rotateColor(int color, float rad) { - float deg = rad * 180 / 3.1415927f; - int r = Color.red(color); - int g = Color.green(color); - int b = Color.blue(color); - - ColorMatrix cm = new ColorMatrix(); - ColorMatrix tmp = new ColorMatrix(); - - cm.setRGB2YUV(); - tmp.setRotate(0, deg); - cm.postConcat(tmp); - tmp.setYUV2RGB(); - cm.postConcat(tmp); - - final float[] a = cm.getArray(); - - int ir = floatToByte(a[0] * r + a[1] * g + a[2] * b); - int ig = floatToByte(a[5] * r + a[6] * g + a[7] * b); - int ib = floatToByte(a[10] * r + a[11] * g + a[12] * b); - - return Color.argb(Color.alpha(color), pinToByte(ir), - pinToByte(ig), pinToByte(ib)); - } - - private static final float PI = 3.1415926f; - - @Override - public boolean onTouchEvent(MotionEvent event) { - float x = event.getX() - CENTER_X; - float y = event.getY() - CENTER_Y; - boolean inCenter = java.lang.Math.sqrt(x * x + y * y) <= CENTER_RADIUS; - - switch (event.getAction()) { - case MotionEvent.ACTION_DOWN: - mTrackingCenter = inCenter; - if (inCenter) { - mHighlightCenter = true; - invalidate(); - break; - } - case MotionEvent.ACTION_MOVE: - if (mTrackingCenter) { - if (mHighlightCenter != inCenter) { - mHighlightCenter = inCenter; - invalidate(); - } - } else { - float angle = (float) java.lang.Math.atan2(y, x); - // need to turn angle [-PI ... PI] into unit [0....1] - float unit = angle / (2 * PI); - if (unit < 0) { - unit += 1; - } - mCenterPaint.setColor(interpColor(mColors, unit)); - invalidate(); - } - break; - case MotionEvent.ACTION_UP: - if (mTrackingCenter) { - if (inCenter) { - mListener.colorChanged(mCenterPaint.getColor()); - } - mTrackingCenter = false; // so we draw w/o halo - invalidate(); - } - break; - } - return true; - } - } - - public ColorPickerDialog(Context context, - OnColorChangedListener listener, - int initialColor) { - super(context); - - mListener = listener; - mInitialColor = initialColor; - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - OnColorChangedListener l = new OnColorChangedListener() { - public void colorChanged(int color) { - mListener.colorChanged(color); - dismiss(); - } - }; - - setContentView(new ColorPickerView(getContext(), l, mInitialColor)); - setTitle("Pick a Color"); - } -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ConfirmationDialogBuilder.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ConfirmationDialogBuilder.java deleted file mode 100644 index 897289a4..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ConfirmationDialogBuilder.java +++ /dev/null @@ -1,104 +0,0 @@ -package org.solovyev.android.view; - -import org.solovyev.android.ActivityDestroyerController; -import android.app.Activity; -import android.app.AlertDialog; -import android.content.Context; -import android.content.DialogInterface; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.solovyev.android.DialogOnActivityDestroyedListener; -import org.solovyev.android.view.R; - -/** - * User: serso - * Date: 4/29/12 - * Time: 1:25 PM - */ -public class ConfirmationDialogBuilder implements DialogBuilder { - - @NotNull - private final Context context; - - private final int messageResId; - - private int titleResId = R.string.c_confirmation; - - private int positiveButtonTextResId = android.R.string.ok; - - private int negativeButtonTextResId = android.R.string.cancel; - - @Nullable - private DialogInterface.OnClickListener positiveHandler; - - @Nullable - private DialogInterface.OnClickListener negativeHandler; - - public ConfirmationDialogBuilder(@NotNull Context context, int messageResId) { - this.context = context; - this.messageResId = messageResId; - } - - @NotNull - public ConfirmationDialogBuilder setTitleResId(int titleResId) { - this.titleResId = titleResId; - return this; - } - - @NotNull - public ConfirmationDialogBuilder setPositiveButtonTextResId(int positiveButtonTextResId) { - this.positiveButtonTextResId = positiveButtonTextResId; - return this; - } - - @NotNull - public ConfirmationDialogBuilder setNegativeButtonTextResId(int negativeButtonTextResId) { - this.negativeButtonTextResId = negativeButtonTextResId; - return this; - } - - @NotNull - public ConfirmationDialogBuilder setPositiveHandler(@Nullable DialogInterface.OnClickListener positiveHandler) { - this.positiveHandler = positiveHandler; - return this; - } - - @NotNull - public ConfirmationDialogBuilder setNegativeHandler(@Nullable DialogInterface.OnClickListener negativeHandler) { - this.negativeHandler = negativeHandler; - return this; - } - - @NotNull - @Override - public AlertDialog build() { - AlertDialog.Builder builder = new AlertDialog.Builder(context); - - builder.setTitle(titleResId); - builder.setMessage(messageResId); - builder.setPositiveButton(positiveButtonTextResId, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - if ( positiveHandler != null ) { - positiveHandler.onClick(dialog, which); - } - } - }); - - builder.setNegativeButton(negativeButtonTextResId, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - if ( negativeHandler != null ) { - negativeHandler.onClick(dialog, which); - } - } - }); - - - final AlertDialog result = builder.create(); - if ( context instanceof Activity) { - ActivityDestroyerController.getInstance().put((Activity)context, new DialogOnActivityDestroyedListener(result)); - } - return result; - } -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/DataActivityViewBuilder.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/DataActivityViewBuilder.java deleted file mode 100644 index b9de4257..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/DataActivityViewBuilder.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.solovyev.android.view; - -import org.jetbrains.annotations.NotNull; - -/** - * User: serso - * Date: 4/20/12 - * Time: 12:01 AM - */ -public interface DataActivityViewBuilder extends ActivityViewBuilder { - - void setData(@NotNull D data); -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/DialogBuilder.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/DialogBuilder.java deleted file mode 100644 index 59f3b592..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/DialogBuilder.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.solovyev.android.view; - -import android.content.DialogInterface; -import org.solovyev.common.Builder; - -/** - * User: serso - * Date: 4/29/12 - * Time: 1:24 PM - */ -public interface DialogBuilder extends Builder { -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/DoubleRange.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/DoubleRange.java deleted file mode 100644 index 00f47c63..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/DoubleRange.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.solovyev.android.view; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.solovyev.common.text.Formatter; - -/** - * User: serso - * Date: 8/10/12 - * Time: 12:51 AM - */ -public class DoubleRange extends NumberRange { - - public DoubleRange(@NotNull Double min, - @NotNull Double max, - @NotNull Double step, - int startPosition, - @Nullable Formatter formatter) { - super(min, max, step, startPosition, formatter); - } - - @NotNull - public static NumberRange newInstance(@NotNull Double min, - @NotNull Double max, - @NotNull Double step, - @NotNull Double selected, - @Nullable Formatter formatter) { - if (selected < min || selected > max) { - throw new IllegalArgumentException("Selected value: " + selected + " should be >= " + min + " and <= " + max + "!"); - } - - int startPosition = 0; - for ( double i = min; i < selected; i += step ) { - startPosition += 1; - } - - return new DoubleRange(min, max, step, startPosition, formatter); - } - - @Override - protected int getCount(@NotNull Double min, @NotNull Double max, @NotNull Double step) { - int result = (int) ((max - min) / step); - return result + 1; - } - - @NotNull - @Override - protected Double getValueAt(int position, @NotNull Double min, @NotNull Double max, @NotNull Double step) { - return min + position * step; - } -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/Grayable.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/Grayable.java deleted file mode 100644 index 418b69d1..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/Grayable.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.solovyev.android.view; - -/** - * User: serso - * Date: 4/19/12 - * Time: 12:50 AM - */ -public interface Grayable { - - void grayOut(); - - void grayIn(); -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/GrayableImpl.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/GrayableImpl.java deleted file mode 100644 index 79072fa1..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/GrayableImpl.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.solovyev.android.view; - -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.RectF; -import android.view.View; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -/** - * User: serso - * Date: 4/19/12 - * Time: 12:51 AM - */ -public class GrayableImpl implements ViewGrayable { - - @Nullable - private Paint paint; - - @Override - public void grayOut() { - paint = new Paint(); - paint.setARGB(180, 75, 75, 75); - } - - @Override - public void grayIn() { - paint = null; - } - - @Override - public void dispatchDraw(@NotNull View view, @NotNull Canvas canvas) { - final Paint localPaint = paint; - if (localPaint != null) { - final RectF drawRect = new RectF(); - drawRect.set(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight()); - - canvas.drawRoundRect(drawRect, 5, 5, localPaint); - } - } -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/GrayableRelativeLayout.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/GrayableRelativeLayout.java deleted file mode 100644 index 65493039..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/GrayableRelativeLayout.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.solovyev.android.view; - -import android.content.Context; -import android.graphics.Canvas; -import android.util.AttributeSet; -import android.widget.RelativeLayout; -import org.jetbrains.annotations.NotNull; - -/** - * User: serso - * Date: 4/19/12 - * Time: 12:34 AM - */ -public class GrayableRelativeLayout extends RelativeLayout implements Grayable { - - @NotNull - private ViewGrayable grayable = new GrayableImpl(); - - public GrayableRelativeLayout(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public GrayableRelativeLayout(Context context) { - super(context); - } - - @Override - public void grayOut() { - grayable.grayOut(); - } - - @Override - public void grayIn() { - grayable.grayIn(); - } - - @Override - protected void dispatchDraw(Canvas canvas) { - super.dispatchDraw(canvas); - - this.grayable.dispatchDraw(this, canvas); - } -} - diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/GrayableView.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/GrayableView.java deleted file mode 100644 index a825fecb..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/GrayableView.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.solovyev.android.view; - -/** - * User: serso - * Date: 4/19/12 - * Time: 12:53 AM - */ -public interface GrayableView extends Grayable { -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/IntegerRange.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/IntegerRange.java deleted file mode 100644 index 37dd8ce2..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/IntegerRange.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.solovyev.android.view; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.solovyev.common.text.Formatter; - -/** - * User: serso - * Date: 8/10/12 - * Time: 12:08 AM - */ -public class IntegerRange extends NumberRange { - - public IntegerRange(@NotNull Integer min, - @NotNull Integer max, - @NotNull Integer step, - int startPosition, - @Nullable Formatter formatter) { - super(min, max, step, startPosition, formatter); - } - - @NotNull - public static NumberRange newInstance(@NotNull Integer min, @NotNull Integer max, @NotNull Integer step, @NotNull Integer selected) { - if (selected < min || selected > max) { - throw new IllegalArgumentException("Selected value: " + selected + " should be >= " + min + " and <= " + max + "!"); - } - - int startPosition = 0; - for ( int i = min; i < selected; i += step ) { - startPosition += 1; - } - - return new IntegerRange(min, max, step, startPosition, null); - } - - @Override - protected int getCount(@NotNull Integer min, @NotNull Integer max, @NotNull Integer step) { - // (4 - 0)/1 + 1= 5 - // (4 - 0)/2 + 1 = 3 - // (4 - 1)/2 + 1 = 2 - return (max - min) / step + 1; - } - - @NotNull - @Override - protected Integer getValueAt(int position, @NotNull Integer min, @NotNull Integer max, @NotNull Integer step) { - return min + position * step; - } -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ListRange.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ListRange.java deleted file mode 100644 index 26375c74..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ListRange.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.solovyev.android.view; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.solovyev.common.text.Formatter; - -import java.util.List; - -/** - * User: serso - * Date: 8/10/12 - * Time: 1:55 AM - */ -public class ListRange implements Picker.Range { - - @NotNull - private List elements; - - private int startPosition; - - @Nullable - private Formatter formatter; - - public ListRange(@NotNull List elements, @Nullable T selected) { - this.elements = elements; - this.startPosition = elements.indexOf(selected); - if ( this.startPosition < 0 ) { - this.startPosition = 0; - } - this.formatter = null; - } - - public ListRange(@NotNull List elements, @Nullable T selected, @Nullable Formatter formatter) { - this(elements, selected); - this.formatter = formatter; - } - - @Override - public int getStartPosition() { - return this.startPosition; - } - - @Override - public int getCount() { - return this.elements.size(); - } - - @NotNull - @Override - public String getStringValueAt(int position) { - final T value = getValueAt(position); - return formatter == null ? value.toString() : formatter.formatValue(value); - } - - @NotNull - @Override - public T getValueAt(int position) { - return this.elements.get(position); - } -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ListViewBuilder.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ListViewBuilder.java deleted file mode 100644 index c9e5037d..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ListViewBuilder.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.solovyev.android.view; - -import android.content.Context; -import android.widget.ListAdapter; -import android.widget.ListView; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -/** - * User: serso - * Date: 4/26/12 - * Time: 1:05 PM - */ -public class ListViewBuilder implements ViewBuilder { - - @Nullable - private Integer layoutId; - - @NotNull - private ListAdapter listAdapter; - - private ListViewBuilder() { - } - - @NotNull - public static ViewBuilder newInstance(@NotNull ListAdapter listAdapter) { - final ListViewBuilder result = new ListViewBuilder(); - - result.layoutId = null; - result.listAdapter = listAdapter; - - return result; - } - - @NotNull - public static ViewBuilder newInstance(int layoutId, @NotNull ListAdapter listAdapter) { - final ListViewBuilder result = new ListViewBuilder(); - - result.layoutId = layoutId; - result.listAdapter = listAdapter; - - return result; - } - - @NotNull - @Override - public ListView build(@NotNull Context context) { - final ListView result; - if (layoutId != null) { - result = ViewFromLayoutBuilder.newInstance(layoutId).build(context); - } else { - result = new ListView(context); - } - - result.setAdapter(listAdapter); - - return result; - } -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/NumberRange.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/NumberRange.java deleted file mode 100644 index eb4cce91..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/NumberRange.java +++ /dev/null @@ -1,83 +0,0 @@ -package org.solovyev.android.view; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.solovyev.common.text.Formatter; - -/** - * User: serso - * Date: 8/9/12 - * Time: 11:44 PM - */ -public abstract class NumberRange> implements Picker.Range { - - @Nullable - private Formatter formatter; - - @NotNull - private final N min; - - @NotNull - private final N max; - - @NotNull - private final N step; - - private final int startPosition; - - private int count = -1; - - public NumberRange(@NotNull N min, - @NotNull N max, - @NotNull N step, - int startPosition, - @Nullable Formatter formatter) { - assert min.compareTo(max) <= 0; - - this.min = min; - this.max = max; - this.step = step; - this.startPosition = startPosition; - this.formatter = formatter; - } - - @Override - public int getStartPosition() { - if ( this.startPosition < getCount() ) { - return this.startPosition; - } else { - return getCount() - 1; - } - } - - @Override - public int getCount() { - if (count == -1) { - count = getCount(min, max, step); - } - return count; - } - - protected abstract int getCount(@NotNull N min, @NotNull N max, @NotNull N step); - - @NotNull - @Override - public String getStringValueAt(int position) { - int count = getCount(); - if (position < 0 || position >= count) { - throw new IllegalArgumentException("Position " + position + " must be >= 0 and < " + count + "!"); - } - - final N number = getValueAt(position, min, max, step); - return formatter == null ? number.toString() : formatter.formatValue(number); - } - - @NotNull - @Override - public N getValueAt(int position) { - return getValueAt(position, min, max, step); - } - - @NotNull - protected abstract N getValueAt(int position, @NotNull N min, @NotNull N max, @NotNull N step); -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/NumberRangeSeekBar.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/NumberRangeSeekBar.java deleted file mode 100644 index 42c728a0..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/NumberRangeSeekBar.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.solovyev.android.view; - -import android.content.Context; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.solovyev.common.Converter; -import org.solovyev.common.interval.Interval; -import org.solovyev.common.math.NumberValuer; - -/** - * User: serso - * Date: 9/19/11 - * Time: 4:26 PM - */ -public class NumberRangeSeekBar> extends AbstractRangeSeekBar { - - @NotNull - private final NumberType numberType; - - - public NumberRangeSeekBar(@NotNull Interval boundaries, @Nullable Integer steps, Context context) throws IllegalArgumentException { - this(boundaries.getLeftLimit(), boundaries.getRightLimit(), steps, context); - } - - /** - * Creates a new RangeSeekBar. - * - * @param minValue The minimum value of the selectable range. - * @param maxValue The maximum value of the selectable range. - * @param steps number of steps of range - * @param context parent context - * @throws IllegalArgumentException Will be thrown if min/max value types are not one of Long, Double, Integer, Float, Short, Byte or BigDecimal. - */ - public NumberRangeSeekBar(@NotNull T minValue, @NotNull T maxValue, @Nullable Integer steps, Context context) throws IllegalArgumentException { - super(minValue, maxValue, steps, context); - - numberType = NumberType.fromNumber(minValue); - - } - - @NotNull - @Override - protected Converter getToTConverter() { - return new Converter() { - @NotNull - @Override - public T convert(@NotNull Double value) { - return (T) numberType.toNumber(value); - } - }; - } - - @NotNull - @Override - protected Converter getToDoubleConverter() { - return new NumberValuer(); - } - - -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/NumberType.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/NumberType.java deleted file mode 100644 index c1cadc1f..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/NumberType.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2009-2011. Created by serso aka se.solovyev. - * For more information, please, contact se.solovyev@gmail.com - * or visit http://se.solovyev.org - */ - -package org.solovyev.android.view; - -import org.jetbrains.annotations.NotNull; - -import java.math.BigDecimal; - -/** - * Utility enumeration used to convert between Numbers and doubles. - * - * @author Stephan Tittel (stephan.tittel@kom.tu-darmstadt.de) - */ -enum NumberType { - - LONG(Long.class), - DOUBLE(Double.class), - INTEGER(Integer.class), - FLOAT(Float.class), - SHORT(Short.class), - BYTE(Byte.class), - BIG_DECIMAL(BigDecimal.class); - - @NotNull - private final Class underlyingClass; - - NumberType(@NotNull Class underlyingClass) { - this.underlyingClass = underlyingClass; - } - - @NotNull - public static NumberType fromNumber(E value) throws IllegalArgumentException { - - for (NumberType numberType : NumberType.values()) { - if (numberType.underlyingClass.isInstance(value)) { - return numberType; - } - } - - throw new IllegalArgumentException("Number class '" + value.getClass().getName() + "' is not supported"); - } - - public T toNumber(double value) { - - switch (this) { - case LONG: - return (T)new Long((long) value); - case DOUBLE: - return (T)new Double(value); - case INTEGER: - return (T)new Integer((int) value); - case FLOAT: - return (T)new Float((float) value); - case SHORT: - return (T)new Short((short) value); - case BYTE: - return (T)new Byte((byte) value); - case BIG_DECIMAL: - return (T)new BigDecimal(value); - } - - throw new InstantiationError("can't convert " + this + " to a Number object"); - } -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/OnClickListenerVibrator.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/OnClickListenerVibrator.java deleted file mode 100644 index 778e0040..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/OnClickListenerVibrator.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2009-2011. Created by serso aka se.solovyev. - * For more information, please, contact se.solovyev@gmail.com - * or visit http://se.solovyev.org - */ - -package org.solovyev.android.view; - -import android.content.SharedPreferences; -import android.os.Vibrator; -import android.view.View; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -/** -* User: serso -* Date: 10/26/11 -* Time: 11:25 PM -*/ -public class OnClickListenerVibrator implements View.OnClickListener { - - private static final float VIBRATION_TIME_SCALE = 1.0f; - - @NotNull - private VibratorContainer vibrator; - - public OnClickListenerVibrator(@Nullable Vibrator vibrator, - @NotNull SharedPreferences preferences) { - this.vibrator = new VibratorContainer(vibrator, preferences, VIBRATION_TIME_SCALE); - } - - @Override - public void onClick(View v) { - vibrator.vibrate(); - } -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/Picker.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/Picker.java deleted file mode 100644 index df585b85..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/Picker.java +++ /dev/null @@ -1,283 +0,0 @@ -/* - * Copyright (c) 2009-2011. Created by serso aka se.solovyev. - * For more information, please, contact se.solovyev@gmail.com - * or visit http://se.solovyev.org - */ - -package org.solovyev.android.view; - -/** - * User: serso - * Date: 9/18/11 - * Time: 10:03 PM - */ -/* - * 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. - */ - - -import android.content.Context; -import android.content.res.TypedArray; -import android.os.Handler; -import android.util.AttributeSet; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.LinearLayout; -import android.widget.TextView; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -/** - * A view for selecting a number - *

- * For a dialog using this view, see {@link android.app.TimePickerDialog}. - */ -public class Picker extends LinearLayout { - - public static interface OnChangedListener { - void onChanged(@NotNull Picker picker, @NotNull T value); - } - - public static interface Range { - - int getStartPosition(); - - int getCount(); - - @NotNull - String getStringValueAt(int position); - - @NotNull - T getValueAt(int position); - } - - - @NotNull - private final Handler uiHandler = new Handler(); - - @NotNull - private final Runnable runnable = new Runnable() { - public void run() { - if (increment) { - changeCurrent(current + 1); - uiHandler.postDelayed(this, speed); - } else if (decrement) { - changeCurrent(current - 1); - uiHandler.postDelayed(this, speed); - } - } - }; - - @NotNull - private final TextView text; - - @NotNull - private Range range; - - /** - * Current value of this NumberPicker - */ - private int current; - - - @Nullable - private OnChangedListener onChangedListener; - - private long speed = 300; - - private boolean increment; - - private boolean decrement; - - @NotNull - private final PickerButton incrementButton; - - @NotNull - private final PickerButton decrementButton; - - /** - * Create a new number picker - * - * @param context the application environment - */ - public Picker(Context context) { - this(context, null); - } - - /** - * Create a new number picker - * - * @param context the application environment - * @param attrs a collection of attributes - */ - public Picker(Context context, @Nullable AttributeSet attrs) { - super(context, attrs); - - TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.Picker); - - final int orientation = a.getInt(R.styleable.Picker_orientation, VERTICAL); - - setOrientation(orientation); - - // INFLATING LAYOUT - final LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); - if (orientation == HORIZONTAL) { - inflater.inflate(R.layout.number_picker_horizontal, this, true); - } else { - inflater.inflate(R.layout.number_picker, this, true); - } - - final OnClickListener clickListener = new OnClickListener() { - public void onClick(View v) { - // now perform the increment/decrement - if (R.id.increment == v.getId()) { - changeCurrent(current + 1); - } else if (R.id.decrement == v.getId()) { - changeCurrent(current - 1); - } - } - }; - - final OnLongClickListener longClickListener = new OnLongClickListener() { - /** - * We start the long click here but rely on the {@link PickerButton} - * to inform us when the long click has ended. - */ - public boolean onLongClick(View v) { - if (R.id.increment == v.getId()) { - increment = true; - uiHandler.post(runnable); - } else if (R.id.decrement == v.getId()) { - decrement = true; - uiHandler.post(runnable); - } - return true; - } - }; - - - incrementButton = (PickerButton) this.findViewById(R.id.increment); - incrementButton.setNumberPicker(this); - incrementButton.setOnClickListener(clickListener); - incrementButton.setOnLongClickListener(longClickListener); - - decrementButton = (PickerButton) this.findViewById(R.id.decrement); - decrementButton.setNumberPicker(this); - decrementButton.setOnClickListener(clickListener); - decrementButton.setOnLongClickListener(longClickListener); - - text = (TextView) this.findViewById(R.id.timepicker_input); - - if (!isEnabled()) { - setEnabled(false); - } - } - - /** - * Set the enabled state of this view. The interpretation of the enabled - * state varies by subclass. - * - * @param enabled True if this view is enabled, false otherwise. - */ - @Override - public void setEnabled(boolean enabled) { - super.setEnabled(enabled); - incrementButton.setEnabled(enabled); - decrementButton.setEnabled(enabled); - text.setEnabled(enabled); - } - - /** - * Set the callback that indicates the number has been adjusted by the user. - * - * @param listener the callback, should not be null. - */ - public void setOnChangeListener(OnChangedListener listener) { - this.onChangedListener = listener; - } - - public void setRange(@NotNull Range range) { - this.range = range; - this.current = range.getStartPosition(); - - updateView(); - } - - public void setCurrent(int current) { - if (current < 0 || current >= range.getCount()) { - throw new IllegalArgumentException( - "Current: " + current + " should be >= 0 and < " + range.getCount()); - } - this.current = current; - updateView(); - } - - /** - * Sets the speed at which the numbers will scroll when the +/- - * buttons are longpressed - * - * @param speed The speed (in milliseconds) at which the numbers will scroll - * default 300ms - */ - public void setSpeed(long speed) { - this.speed = speed; - } - - protected void changeCurrent(int current) { - - // Wrap around the values if we go past the start or end - if (current < 0) { - current = this.range.getCount() - 1; - } else if (current >= this.range.getCount()) { - current = 0; - } - - this.current = current; - - notifyChange(); - updateView(); - } - - private void notifyChange() { - if (onChangedListener != null) { - onChangedListener.onChanged(this, range.getValueAt(current)); - } - } - - private void updateView() { - text.setText(range.getStringValueAt(current)); - } - - /** - * @hide - */ - public void cancelIncrement() { - increment = false; - } - - /** - * @hide - */ - public void cancelDecrement() { - decrement = false; - } - - /** - * @return current position in Picker - */ - public int getCurrent() { - return current; - } -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/PickerButton.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/PickerButton.java deleted file mode 100644 index 959119f7..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/PickerButton.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (c) 2009-2011. Created by serso aka se.solovyev. - * For more information, please, contact se.solovyev@gmail.com - * or visit http://se.solovyev.org - */ - -package org.solovyev.android.view; - -/** - * User: serso - * Date: 9/18/11 - * Time: 10:04 PM - */ -/* - * 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. - */ - - -import android.content.Context; -import android.util.AttributeSet; -import android.view.KeyEvent; -import android.view.MotionEvent; -import android.widget.ImageButton; - -/** - * This class exists purely to cancel long click events, that got - * started in NumberPicker - */ -public class PickerButton extends ImageButton { - - private Picker numberPicker; - - public PickerButton(Context context, AttributeSet attrs, - int defStyle) { - super(context, attrs, defStyle); - } - - public PickerButton(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public PickerButton(Context context) { - super(context); - } - - public void setNumberPicker(Picker picker) { - numberPicker = picker; - } - - @Override - public boolean onTouchEvent(MotionEvent event) { - cancelLongPressIfRequired(event); - return super.onTouchEvent(event); - } - - @Override - public boolean onTrackballEvent(MotionEvent event) { - cancelLongPressIfRequired(event); - return super.onTrackballEvent(event); - } - - @Override - public boolean onKeyUp(int keyCode, KeyEvent event) { - if ((keyCode == KeyEvent.KEYCODE_DPAD_CENTER) - || (keyCode == KeyEvent.KEYCODE_ENTER)) { - cancelLongpress(); - } - return super.onKeyUp(keyCode, event); - } - - private void cancelLongPressIfRequired(MotionEvent event) { - if ((event.getAction() == MotionEvent.ACTION_CANCEL) - || (event.getAction() == MotionEvent.ACTION_UP)) { - cancelLongpress(); - } - } - - private void cancelLongpress() { - if (R.id.increment == getId()) { - numberPicker.cancelIncrement(); - } else if (R.id.decrement == getId()) { - numberPicker.cancelDecrement(); - } - } - - public void onWindowFocusChanged(boolean hasWindowFocus) { - super.onWindowFocusChanged(hasWindowFocus); - if (!hasWindowFocus) { - cancelLongpress(); - } - } - -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/TextViewBuilder.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/TextViewBuilder.java deleted file mode 100644 index a310f659..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/TextViewBuilder.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.solovyev.android.view; - -import android.content.Context; -import android.view.View; -import android.widget.TextView; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -/** - * User: serso - * Date: 4/19/12 - * Time: 11:50 PM - */ -public class TextViewBuilder implements UpdatableViewBuilder { - - private int textViewLayoutId; - - @Nullable - private String tag; - - private TextViewBuilder() { - } - - @NotNull - public static UpdatableViewBuilder newInstance(int textViewLayoutId, @Nullable String tag) { - final TextViewBuilder result = new TextViewBuilder(); - - result.textViewLayoutId = textViewLayoutId; - result.tag = tag; - - return result; - } - - @NotNull - @Override - public TextView build(@NotNull Context context) { - final TextView result = ViewFromLayoutBuilder.newInstance(textViewLayoutId).build(context); - - result.setTag(createViewTag()); - - return updateView(context, result); - } - - @NotNull - private String createViewTag() { - return tag == null ? this.getClass().getName() : tag; - } - - @NotNull - @Override - public TextView updateView(@NotNull Context context, @NotNull View view) { - if (createViewTag().equals(view.getTag())) { - return (TextView) view; - } else { - return build(context); - } - } -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/VibratorContainer.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/VibratorContainer.java deleted file mode 100644 index 88c1d449..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/VibratorContainer.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2009-2011. Created by serso aka se.solovyev. - * For more information, please, contact se.solovyev@gmail.com - * or visit http://se.solovyev.org - */ - -package org.solovyev.android.view; - -import android.content.SharedPreferences; -import android.os.Vibrator; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.solovyev.android.prefs.BooleanPreference; -import org.solovyev.android.prefs.NumberToStringPreference; -import org.solovyev.android.prefs.Preference; - -/** - * User: serso - * Date: 10/26/11 - * Time: 11:40 PM - */ -public class VibratorContainer implements SharedPreferences.OnSharedPreferenceChangeListener { - - public static class Preferences { - public static final Preference hapticFeedbackEnabled = new BooleanPreference("org.solovyev.android.calculator.CalculatorModel_haptic_feedback", false); - public static final Preference hapticFeedbackDuration = new NumberToStringPreference("org.solovyev.android.calculator.CalculatorActivity_calc_haptic_feedback_duration_key", 60L, Long.class); - } - - private final float vibrationTimeScale; - - @Nullable - private final Vibrator vibrator; - - private long time = 0; - - public VibratorContainer(@Nullable Vibrator vibrator, @NotNull SharedPreferences preferences, float vibrationTimeScale) { - this.vibrator = vibrator; - this.vibrationTimeScale = vibrationTimeScale; - - preferences.registerOnSharedPreferenceChangeListener(this); - onSharedPreferenceChanged(preferences, null); - - } - - public void vibrate() { - if (time > 0 && vibrator != null) { - vibrator.vibrate(time); - } - } - - @Override - public void onSharedPreferenceChanged(SharedPreferences preferences, @Nullable String key) { - if ( Preferences.hapticFeedbackEnabled.getPreference(preferences)) { - //noinspection ConstantConditions - this.time = getScaledValue(Preferences.hapticFeedbackDuration.getPreference(preferences)); - } else { - this.time = 0; - } - } - - private long getScaledValue(long vibrationTime) { - return (long) (vibrationTime * vibrationTimeScale); - } -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ViewDef.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ViewDef.java deleted file mode 100644 index b99c1470..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ViewDef.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.solovyev.android.view; - -import org.jetbrains.annotations.Nullable; - -/** - * User: serso - * Date: 11/4/12 - * Time: 11:59 PM - */ -public interface ViewDef { - - @Nullable - Float getLayoutWeight(); - - @Nullable - Integer getLayoutMarginLeft(); - - @Nullable - Integer getLayoutMarginRight(); - - @Nullable - String getTag(); - - @Nullable - Integer getBackgroundResId(); - -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ViewFromLayoutBuilder.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ViewFromLayoutBuilder.java deleted file mode 100644 index c51a7d90..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ViewFromLayoutBuilder.java +++ /dev/null @@ -1,64 +0,0 @@ -package org.solovyev.android.view; - -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -/** - * User: serso - * Date: 4/18/12 - * Time: 12:57 AM - */ -public class ViewFromLayoutBuilder implements ViewBuilder { - - private final int layoutId; - - private final int viewId; - - private final boolean wholeLayout; - - @Nullable - private LayoutInflater layoutInflater; - - private ViewFromLayoutBuilder(int layoutId, int viewId, boolean wholeLayout) { - this.layoutId = layoutId; - this.viewId = viewId; - this.wholeLayout = wholeLayout; - } - - @NotNull - public static ViewFromLayoutBuilder newInstance(int layoutId, int viewId) { - return new ViewFromLayoutBuilder(layoutId, viewId, false); - } - - @NotNull - public static ViewFromLayoutBuilder newInstance(int layoutId) { - return new ViewFromLayoutBuilder(layoutId, 0, true); - } - - public void setLayoutInflater(@Nullable LayoutInflater layoutInflater) { - this.layoutInflater = layoutInflater; - } - - @NotNull - @Override - public V build(@NotNull Context context) { - - LayoutInflater li = layoutInflater; - if (li == null) { - li = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - } - - if (wholeLayout) { - // if whole layout - just return view - return (V)li.inflate(layoutId, null); - } else { - // else try to find view by id - final ViewGroup itemView = (ViewGroup) li.inflate(layoutId, null); - return (V)itemView.findViewById(viewId); - } - } -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ViewGrayable.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ViewGrayable.java deleted file mode 100644 index ef2af036..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/ViewGrayable.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.solovyev.android.view; - -import android.graphics.Canvas; -import android.view.View; -import org.jetbrains.annotations.NotNull; - -/** - * User: serso - * Date: 4/19/12 - * Time: 12:55 AM - */ -public interface ViewGrayable extends Grayable { - - void dispatchDraw(@NotNull View view, @NotNull Canvas canvas); -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DirectionDragButton.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DirectionDragButton.java deleted file mode 100644 index 4b31252b..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DirectionDragButton.java +++ /dev/null @@ -1,462 +0,0 @@ -/* - * Copyright (c) 2009-2011. Created by serso aka se.solovyev. - * For more information, please, contact se.solovyev@gmail.com - */ - -package org.solovyev.android.view.drag; - -import android.content.Context; -import android.content.res.Resources; -import android.content.res.TypedArray; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; -import android.text.TextPaint; -import android.util.AttributeSet; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.solovyev.android.view.R; -import org.solovyev.common.math.Point2d; -import org.solovyev.common.text.CollectionTransformations; -import org.solovyev.common.text.NumberParser; -import org.solovyev.common.text.StringUtils; - -import java.util.EnumMap; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * User: serso - * Date: 7/17/11 - * Time: 10:25 PM - */ -public class DirectionDragButton extends DragButton { - - @NotNull - private final static Float DEFAULT_DIRECTION_TEXT_SCALE_FLOAT = 0.33f; - - @NotNull - private final static Integer DEFAULT_DIRECTION_TEXT_ALPHA = 140; - - private final static int DEFAULT_DIRECTION_TEXT_COLOR = Color.WHITE; - - @NotNull - private final static String DEFAULT_DIRECTION_TEXT_SCALE = "0.33;0.33;0.33;0.33"; - - protected static class DirectionTextData { - - @NotNull - private final GuiDragDirection guiDragDirection; - - @NotNull - private String text; - - @NotNull - private Point2d position; - - @NotNull - private TextPaint paint; - - @NotNull - private Float textScale = 0.5f; - - private boolean showText = true; - - private DirectionTextData(@NotNull GuiDragDirection guiDragDirection, @NotNull String text) { - this.guiDragDirection = guiDragDirection; - this.text = text; - } - - @NotNull - public GuiDragDirection getGuiDragDirection() { - return guiDragDirection; - } - - @NotNull - public String getText() { - return text; - } - - public void setText(@NotNull String text) { - this.text = text; - } - - @NotNull - public Point2d getPosition() { - return position; - } - - public void setPosition(@NotNull Point2d position) { - this.position = position; - } - - @NotNull - public TextPaint getPaint() { - return paint; - } - - public void setPaint(@NotNull TextPaint paint) { - this.paint = paint; - } - - @NotNull - public Float getTextScale() { - return textScale; - } - - public void setTextScale(@NotNull Float textScale) { - this.textScale = textScale; - } - - public boolean isShowText() { - return showText; - } - - public void setShowText(boolean showText) { - this.showText = showText; - } - } - - protected static enum GuiDragDirection { - up(DragDirection.up, 0) { - @Override - public int getAttributeId() { - return R.styleable.DirectionDragButton_textUp; - } - - @NotNull - @Override - public Point2d getTextPosition(@NotNull Paint paint, @NotNull Paint basePaint, @NotNull CharSequence text, CharSequence baseText, int w, int h) { - return getUpDownTextPosition(paint, basePaint, text, baseText, 1, w, h); - } - }, - down(DragDirection.down, 2) { - @Override - public int getAttributeId() { - return R.styleable.DirectionDragButton_textDown; - } - - @NotNull - @Override - public Point2d getTextPosition(@NotNull Paint paint, @NotNull Paint basePaint, @NotNull CharSequence text, CharSequence baseText, int w, int h) { - return getUpDownTextPosition(paint, basePaint, text, baseText, -1, w, h); - } - }, - left(DragDirection.left, 3) { - @Override - public int getAttributeId() { - return R.styleable.DirectionDragButton_textLeft; - } - - @NotNull - @Override - public Point2d getTextPosition(@NotNull Paint paint, @NotNull Paint basePaint, @NotNull CharSequence text, CharSequence baseText, int w, int h) { - return getLeftRightTextPosition(paint, basePaint, text, baseText, w, h, true); - } - }, - - right(DragDirection.right, 1) { - @Override - public int getAttributeId() { - return R.styleable.DirectionDragButton_textRight; - } - - @NotNull - @Override - public Point2d getTextPosition(@NotNull Paint paint, @NotNull Paint basePaint, @NotNull CharSequence text, CharSequence baseText, int w, int h) { - return getLeftRightTextPosition(paint, basePaint, text, baseText, w, h, false); - } - }; - - @NotNull - private final DragDirection dragDirection; - - private final int attributePosition; - - GuiDragDirection(@NotNull DragDirection dragDirection, int attributePosition) { - this.dragDirection = dragDirection; - this.attributePosition = attributePosition; - } - - public abstract int getAttributeId(); - - public int getAttributePosition() { - return attributePosition; - } - - @NotNull - public abstract Point2d getTextPosition(@NotNull Paint paint, @NotNull Paint basePaint, @NotNull CharSequence text, CharSequence baseText, int w, int h); - - @NotNull - private static Point2d getLeftRightTextPosition(@NotNull Paint paint, @NotNull Paint basePaint, CharSequence text, @NotNull CharSequence baseText, int w, int h, boolean left) { - final Point2d result = new Point2d(); - - if (left) { - float width = paint.measureText(" "); - result.setX(width); - } else { - float width = paint.measureText(text.toString() + " "); - result.setX(w - width); - } - - float selfHeight = paint.ascent() + paint.descent(); - - basePaint.measureText(StringUtils.getNotEmpty(baseText, "|")); - - result.setY(h / 2 - selfHeight / 2); - - return result; - } - - @NotNull - private static Point2d getUpDownTextPosition(@NotNull Paint paint, @NotNull Paint basePaint, @NotNull CharSequence text, CharSequence baseText, float direction, int w, int h) { - final Point2d result = new Point2d(); - - float width = paint.measureText(text.toString() + " "); - result.setX(w - width); - - float selfHeight = paint.ascent() + paint.descent(); - - basePaint.measureText(StringUtils.getNotEmpty(baseText, "|")); - - if (direction < 0) { - result.setY(h / 2 + h / 3 - selfHeight / 2); - } else { - result.setY(h / 2 - h / 3 - selfHeight / 2); - } - - return result; - } - - @Nullable - public static GuiDragDirection valueOf(@NotNull DragDirection dragDirection) { - for (GuiDragDirection guiDragDirection : values()) { - if (guiDragDirection.dragDirection == dragDirection) { - return guiDragDirection; - } - } - return null; - } - } - - @NotNull - private final Map directionTextDataMap = new EnumMap(GuiDragDirection.class); - - @NotNull - private String directionTextScale = DEFAULT_DIRECTION_TEXT_SCALE; - - @NotNull - private Integer directionTextAlpha = DEFAULT_DIRECTION_TEXT_ALPHA; - - private int directionTextColor = DEFAULT_DIRECTION_TEXT_COLOR; - - private boolean initialized = false; - - public DirectionDragButton(Context context, @NotNull AttributeSet attrs) { - super(context, attrs); - init(context, attrs); - } - - public DirectionDragButton(Context context, @NotNull DirectionDragButtonDef directionDragButtonDef) { - super(context, directionDragButtonDef); - init(context, directionDragButtonDef); - } - - private void init(@NotNull Context context, - @NotNull DirectionDragButtonDef directionDragButtonDef) { - for (GuiDragDirection guiDragDirection : GuiDragDirection.values()) { - final CharSequence directionText = directionDragButtonDef.getText(guiDragDirection.dragDirection); - this.directionTextDataMap.put(guiDragDirection, new DirectionTextData(guiDragDirection, StringUtils.getNotEmpty(directionText, ""))); - } - - this.initialized = true; - } - - public void applyDef(@NotNull DirectionDragButtonDef directionDragButtonDef) { - super.applyDef(directionDragButtonDef); - - for (GuiDragDirection guiDragDirection : GuiDragDirection.values()) { - final CharSequence directionText = directionDragButtonDef.getText(guiDragDirection.dragDirection); - this.directionTextDataMap.put(guiDragDirection, new DirectionTextData(guiDragDirection, StringUtils.getNotEmpty(directionText, ""))); - } - } - - private void init(@NotNull Context context, @NotNull AttributeSet attrs) { - - TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DirectionDragButton); - - for (int i = 0; i < a.getIndexCount(); i++) { - int attr = a.getIndex(i); - - if (a.hasValue(attr)) { - switch (attr) { - case R.styleable.DirectionDragButton_directionTextColor: - this.directionTextColor = a.getColor(attr, DEFAULT_DIRECTION_TEXT_COLOR); - break; - case R.styleable.DirectionDragButton_directionTextScale: - this.directionTextScale = a.getString(attr); - break; - case R.styleable.DirectionDragButton_directionTextAlpha: - this.directionTextAlpha = a.getInt(attr, DEFAULT_DIRECTION_TEXT_ALPHA); - break; - default: - // try drag direction text - for (GuiDragDirection guiDragDirection : GuiDragDirection.values()) { - if (guiDragDirection.getAttributeId() == attr) { - this.directionTextDataMap.put(guiDragDirection, new DirectionTextData(guiDragDirection, a.getString(attr))); - break; - } - } - break; - } - } - } - - for (Map.Entry entry : getDirectionTextScales().entrySet()) { - final DirectionTextData dtd = directionTextDataMap.get(entry.getKey()); - if (dtd != null) { - dtd.setTextScale(entry.getValue()); - } - } - - initialized = true; - } - - @Override - public void onSizeChanged(int w, int h, int oldW, int oldH) { - measureText(); - } - - @Override - protected void onTextChanged(CharSequence text, int start, int before, int after) { - measureText(); - } - - protected void measureText() { - - if (initialized) { - final Paint basePaint = getPaint(); - final Resources resources = getResources(); - - for (DirectionTextData directionTextData : directionTextDataMap.values()) { - initDirectionTextPaint(basePaint, directionTextData, resources); - - final GuiDragDirection guiDragDirection = directionTextData.getGuiDragDirection(); - final String directionText = directionTextData.getText(); - final Paint directionPaint = directionTextData.getPaint(); - - directionTextData.setPosition(guiDragDirection.getTextPosition(directionPaint, basePaint, directionText, getText(), getWidth(), getHeight())); - } - } - } - - - @Override - public void onDraw(Canvas canvas) { - super.onDraw(canvas); - - final TextPaint paint = getPaint(); - final Resources resources = getResources(); - - for (DirectionTextData directionTextData : directionTextDataMap.values()) { - if (directionTextData.isShowText()) { - initDirectionTextPaint(paint, directionTextData, resources); - final String text = directionTextData.getText(); - final Point2d position = directionTextData.getPosition(); - canvas.drawText(text, 0, text.length(), position.getX(), position.getY(), directionTextData.getPaint()); - } - } - } - - protected void initDirectionTextPaint(@NotNull Paint basePaint, - @NotNull DirectionTextData directionTextData, - @NotNull Resources resources) { - final TextPaint directionTextPaint = new TextPaint(basePaint); - - directionTextPaint.setColor(directionTextColor); - directionTextPaint.setAlpha(getDirectionTextAlpha()); - directionTextPaint.setTextSize(basePaint.getTextSize() * directionTextData.getTextScale()); - - directionTextData.setPaint(directionTextPaint); - } - - protected int getDirectionTextAlpha() { - return directionTextAlpha; - } - - @SuppressWarnings("UnusedDeclaration") - @Nullable - public String getTextUp() { - return getText(GuiDragDirection.up); - } - - @SuppressWarnings("UnusedDeclaration") - @Nullable - public String getTextDown() { - return getText(GuiDragDirection.down); - } - - @Nullable - public String getText(@NotNull DragDirection direction) { - final GuiDragDirection guiDragDirection = GuiDragDirection.valueOf(direction); - return guiDragDirection == null ? null : getText(guiDragDirection); - } - - @SuppressWarnings("UnusedDeclaration") - public void showDirectionText(boolean showDirectionText, @NotNull DragDirection direction) { - final GuiDragDirection guiDragDirection = GuiDragDirection.valueOf(direction); - final DirectionTextData directionTextData = this.directionTextDataMap.get(guiDragDirection); - if ( directionTextData != null ) { - directionTextData.setShowText(showDirectionText); - } - } - - @Nullable - private String getText(@NotNull GuiDragDirection direction) { - DirectionTextData directionTextData = this.directionTextDataMap.get(direction); - if ( directionTextData == null ) { - return null; - } else { - if ( directionTextData.isShowText() ) { - return directionTextData.getText(); - } else { - return null; - } - } - } - - - @NotNull - public String getDirectionTextScale() { - return directionTextScale; - } - - @NotNull - private Map getDirectionTextScales() { - final List scales = CollectionTransformations.split(getDirectionTextScale(), ";", NumberParser.getParser(Float.class)); - - final Map result = new HashMap(); - for (GuiDragDirection guiDragDirection : GuiDragDirection.values()) { - result.put(guiDragDirection, DEFAULT_DIRECTION_TEXT_SCALE_FLOAT); - } - - if (scales.size() == 1) { - final Float scale = scales.get(0); - for (Map.Entry entry : result.entrySet()) { - entry.setValue(scale); - } - } else { - for (int i = 0; i < scales.size(); i++) { - for (GuiDragDirection guiDragDirection : GuiDragDirection.values()) { - if (guiDragDirection.getAttributePosition() == i) { - result.put(guiDragDirection, scales.get(i)); - } - } - } - } - - return result; - } - -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DirectionDragButtonDef.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DirectionDragButtonDef.java deleted file mode 100644 index 1e7767fb..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DirectionDragButtonDef.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.solovyev.android.view.drag; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -/** - * User: serso - * Date: 11/3/12 - * Time: 1:51 PM - */ -public interface DirectionDragButtonDef extends DragButtonDef { - - @Nullable - CharSequence getText(@NotNull DragDirection dragDirection); -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DirectionDragButtonDefImpl.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DirectionDragButtonDefImpl.java deleted file mode 100644 index 9f32e082..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DirectionDragButtonDefImpl.java +++ /dev/null @@ -1,175 +0,0 @@ -package org.solovyev.android.view.drag; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.EnumMap; -import java.util.Map; - -/** - * User: serso - * Date: 11/3/12 - * Time: 1:57 PM - */ -public class DirectionDragButtonDefImpl implements DirectionDragButtonDef { - - @Nullable - private CharSequence text; - - private Map directionsTexts = new EnumMap(DragDirection.class); - - @Nullable - private Integer backgroundResId; - - @Nullable - private Integer drawableResId; - - @Nullable - private String tag; - - @Nullable - private Float weight; - - @Nullable - private Integer layoutMarginLeft; - - @Nullable - private Integer layoutMarginRight; - - private DirectionDragButtonDefImpl() { - } - - @NotNull - public static DirectionDragButtonDefImpl newInstance(@Nullable CharSequence text) { - return newInstance(text, null, null, null, null); - } - - @NotNull - public static DirectionDragButtonDefImpl newInstance(@Nullable CharSequence text, - @Nullable CharSequence up, - @Nullable CharSequence right, - @Nullable CharSequence down, - @Nullable CharSequence left) { - return newInstance(text, up, right, down, left, null); - } - - @NotNull - public static DirectionDragButtonDefImpl newInstance(@Nullable CharSequence text, - @Nullable CharSequence up, - @Nullable CharSequence right, - @Nullable CharSequence down, - @Nullable CharSequence left, - @Nullable Integer backgroundColor) { - final DirectionDragButtonDefImpl result = new DirectionDragButtonDefImpl(); - - result.text = text; - result.directionsTexts.put(DragDirection.up, up); - result.directionsTexts.put(DragDirection.right, right); - result.directionsTexts.put(DragDirection.down, down); - result.directionsTexts.put(DragDirection.left, left); - - result.backgroundResId = backgroundColor; - - return result; - } - - @NotNull - public static DirectionDragButtonDefImpl newDrawableInstance(@NotNull Integer drawableResId) { - return newDrawableInstance(drawableResId, null); - } - - @NotNull - public static DirectionDragButtonDefImpl newDrawableInstance(@NotNull Integer drawableResId, @Nullable Integer backgroundColor) { - final DirectionDragButtonDefImpl result = new DirectionDragButtonDefImpl(); - - result.drawableResId = drawableResId; - result.backgroundResId = backgroundColor; - - return result; - - } - - @Nullable - @Override - public CharSequence getText(@NotNull DragDirection dragDirection) { - return directionsTexts.get(dragDirection); - } - - @Nullable - @Override - public Float getLayoutWeight() { - return this.weight; - } - - @Nullable - @Override - public Integer getLayoutMarginLeft() { - return this.layoutMarginLeft; - } - - @Nullable - @Override - public Integer getLayoutMarginRight() { - return this.layoutMarginRight; - } - - @Nullable - @Override - public Integer getDrawableResId() { - return this.drawableResId; - } - - @Nullable - @Override - public String getTag() { - return tag; - } - - @Nullable - @Override - public Integer getBackgroundResId() { - return this.backgroundResId; - } - - @Nullable - @Override - public CharSequence getText() { - return text; - } - - public void setWeight(@Nullable Float weight) { - this.weight = weight; - } - - public void setLayoutMarginRight(@Nullable Integer layoutMarginRight) { - this.layoutMarginRight = layoutMarginRight; - } - - public void setLayoutMarginLeft(@Nullable Integer layoutMarginLeft) { - this.layoutMarginLeft = layoutMarginLeft; - } - - public void setBackgroundResId(int backgroundResId) { - this.backgroundResId = backgroundResId; - } - - public void setTag(@Nullable String tag) { - this.tag = tag; - } - - public void setText(@Nullable CharSequence text) { - this.text = text; - } - - public void setBackgroundResId(@Nullable Integer backgroundResId) { - this.backgroundResId = backgroundResId; - } - - public void setDrawableResId(@Nullable Integer drawableResId) { - this.drawableResId = drawableResId; - } - - public void setDirectionText(@NotNull DragDirection key, @Nullable CharSequence text) { - directionsTexts.put(key, text); - } -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DragButton.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DragButton.java deleted file mode 100644 index 27872469..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DragButton.java +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Copyright (c) 2009-2011. Created by serso aka se.solovyev. - * For more information, please, contact se.solovyev@gmail.com - */ - -package org.solovyev.android.view.drag; - -import android.content.Context; -import android.graphics.Canvas; -import android.os.Handler; -import android.util.AttributeSet; -import android.util.Log; -import android.view.MotionEvent; -import android.view.View; -import android.widget.Button; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.solovyev.android.view.AndroidViewUtils; -import org.solovyev.common.math.Point2d; -import org.solovyev.common.text.StringUtils; - -public class DragButton extends Button { - - @Nullable - private Point2d startPoint = null; - - @Nullable - private org.solovyev.android.view.drag.OnDragListener onDragListener; - - @NotNull - private DragButton.OnTouchListenerImpl onTouchListener; - - private boolean showText = true; - - @NotNull - private final Handler uiHandler = new Handler(); - - @Nullable - private CharSequence textBackup; - - public DragButton(@NotNull Context context, @NotNull AttributeSet attrs) { - super(context, attrs); - setOnTouchListener(new OnTouchListenerImpl()); - } - - public DragButton(@NotNull Context context, @NotNull DragButtonDef dragButtonDef) { - super(context); - - setOnTouchListener(new OnTouchListenerImpl()); - - setText(dragButtonDef.getText()); - } - - public void setOnDragListener(@Nullable org.solovyev.android.view.drag.OnDragListener onDragListener) { - this.onDragListener = onDragListener; - } - - @Nullable - public org.solovyev.android.view.drag.OnDragListener getOnDragListener() { - return onDragListener; - } - - public void applyDef(@NotNull DragButtonDef buttonDef) { - AndroidViewUtils.applyButtonDef(this, buttonDef); - } - - @Override - public void setOnTouchListener(OnTouchListener l) { - if (l instanceof OnTouchListenerImpl) { - this.onTouchListener = (OnTouchListenerImpl) l; - super.setOnTouchListener(l); - } else { - this.onTouchListener.nestedOnTouchListener = l; - } - } - - /** - * OnTouchListener implementation that fires onDrag() - * - * @author serso - */ - private final class OnTouchListenerImpl implements OnTouchListener { - - @Nullable - private OnTouchListener nestedOnTouchListener; - - @Override - public boolean onTouch(@NotNull View v, @NotNull MotionEvent event) { - // processing on touch event - - boolean consumed = false; - - // in order to avoid possible NPEs - final Point2d localStartPoint = startPoint; - final org.solovyev.android.view.drag.OnDragListener localOnDragListener = onDragListener; - - if (localOnDragListener != null) { - // only if onDrag() listener specified - - Log.d(String.valueOf(getId()), "onTouch() for: " + getId() + " . Motion event: " + event); - - switch (event.getAction()) { - case MotionEvent.ACTION_DOWN: - // start tracking: set start point - startPoint = new Point2d(event.getX(), event.getY()); - break; - - case MotionEvent.ACTION_UP: - // stop tracking - - if (localStartPoint != null) { - consumed = localOnDragListener.onDrag(DragButton.this, new DragEvent(localStartPoint, event)); - - if (consumed) { - if (localOnDragListener.isSuppressOnClickEvent()) { - // prevent on click action - v.setPressed(false); - } - } - } - - startPoint = null; - break; - } - } - - if (nestedOnTouchListener != null && !consumed) { - return nestedOnTouchListener.onTouch(v, event); - } else { - return consumed; - } - } - } - - @Override - protected void onDraw(Canvas canvas) { - CharSequence text = getText(); - if (!StringUtils.isEmpty(text)) { - super.onDraw(canvas); - } else { - if (!AndroidViewUtils.drawDrawables(canvas, this)) { - super.onDraw(canvas); - } - } - } - - - public boolean isShowText() { - return showText; - } - - public void setShowText(boolean showText) { - if (this.showText != showText) { - if ( showText ) { - setText(textBackup); - textBackup = null; - } else { - textBackup = this.getText(); - setText(null); - } - this.showText = showText; - } - } -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DragButtonDef.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DragButtonDef.java deleted file mode 100644 index 7c22ec7e..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DragButtonDef.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.solovyev.android.view.drag; - -import org.solovyev.android.view.ButtonDef; - -/** - * User: serso - * Date: 11/3/12 - * Time: 1:51 PM - */ -public interface DragButtonDef extends ButtonDef { -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DragDirection.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DragDirection.java deleted file mode 100644 index 501142c5..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DragDirection.java +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Copyright (c) 2009-2011. Created by serso aka se.solovyev. - * For more information, please, contact se.solovyev@gmail.com - */ - -package org.solovyev.android.view.drag; - -public enum DragDirection { - - up, - down, - left, - right; -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DragEvent.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DragEvent.java deleted file mode 100644 index 6445a418..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DragEvent.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2009-2011. Created by serso aka se.solovyev. - * For more information, please, contact se.solovyev@gmail.com - */ - -package org.solovyev.android.view.drag; - -import android.view.MotionEvent; -import org.jetbrains.annotations.NotNull; -import org.solovyev.common.math.Point2d; - -public class DragEvent { - - @NotNull - private final Point2d startPoint; - - @NotNull - private final MotionEvent motionEvent; - - public DragEvent(@NotNull Point2d startPoint, @NotNull MotionEvent motionEvent) { - this.startPoint = startPoint; - this.motionEvent = motionEvent; - } - - /** - * @return motion event started at start point - */ - @NotNull - public MotionEvent getMotionEvent() { - return motionEvent; - } - - /** - * @return start point of dragging - */ - @NotNull - public Point2d getStartPoint() { - return startPoint; - } - - -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DragPreferencesChangeListener.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DragPreferencesChangeListener.java deleted file mode 100644 index a8ec5d24..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/DragPreferencesChangeListener.java +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright (c) 2009-2011. Created by serso aka se.solovyev. - * For more information, please, contact se.solovyev@gmail.com - */ - -package org.solovyev.android.view.drag; - -import org.jetbrains.annotations.NotNull; - -import java.util.EventListener; - -/** - * User: serso - * Date: 9/18/11 - * Time: 8:48 PM - */ -public interface DragPreferencesChangeListener extends EventListener{ - - void onDragPreferencesChange(@NotNull SimpleOnDragListener.Preferences preferences ); -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/OnDragListener.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/OnDragListener.java deleted file mode 100644 index b4fd07ce..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/OnDragListener.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2009-2011. Created by serso aka se.solovyev. - * For more information, please, contact se.solovyev@gmail.com - */ - -package org.solovyev.android.view.drag; - -import org.jetbrains.annotations.NotNull; - -import java.util.EventListener; - - -public interface OnDragListener extends EventListener{ - - /** - * - * @return 'true': if drag event has taken place (i.e. onDrag() method returned true) then click action will be suppresed - */ - boolean isSuppressOnClickEvent(); - - /** - * @param dragButton drag button object for which onDrag listener was set - * @param event drag event - * - * @return 'true' if drag event occurred, 'false' otherwise - */ - boolean onDrag(@NotNull DragButton dragButton, @NotNull DragEvent event); - -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/OnDragListenerWrapper.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/OnDragListenerWrapper.java deleted file mode 100644 index 94513e3d..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/OnDragListenerWrapper.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2009-2011. Created by serso aka se.solovyev. - * For more information, please, contact se.solovyev@gmail.com - * or visit http://se.solovyev.org - */ - -package org.solovyev.android.view.drag; - -import org.jetbrains.annotations.NotNull; - -/** -* User: serso -* Date: 10/26/11 -* Time: 10:37 PM -*/ -public class OnDragListenerWrapper implements OnDragListener { - - @NotNull - private final OnDragListener onDragListener; - - public OnDragListenerWrapper(@NotNull OnDragListener onDragListener) { - this.onDragListener = onDragListener; - } - - @Override - public boolean isSuppressOnClickEvent() { - return this.onDragListener.isSuppressOnClickEvent(); - } - - @Override - public boolean onDrag(@NotNull DragButton dragButton, @NotNull DragEvent event) { - return this.onDragListener.onDrag(dragButton, event); - } -} diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/SimpleOnDragListener.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/SimpleOnDragListener.java deleted file mode 100644 index cec8a3fc..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/drag/SimpleOnDragListener.java +++ /dev/null @@ -1,327 +0,0 @@ -/* - * Copyright (c) 2009-2011. Created by serso aka se.solovyev. - * For more information, please, contact se.solovyev@gmail.com - */ - -package org.solovyev.android.view.drag; - -import android.content.Context; -import android.content.SharedPreferences; -import android.util.Log; -import android.view.MotionEvent; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.solovyev.android.view.R; -import org.solovyev.common.MutableObject; -import org.solovyev.common.interval.Interval; -import org.solovyev.common.interval.IntervalImpl; -import org.solovyev.common.math.MathUtils; -import org.solovyev.common.math.Point2d; -import org.solovyev.common.text.Mapper; -import org.solovyev.common.text.NumberIntervalMapper; - -import java.util.HashMap; -import java.util.Map; - -public class SimpleOnDragListener implements OnDragListener, DragPreferencesChangeListener { - - @NotNull - public static final Point2d axis = new Point2d(0, 1); - - @NotNull - private DragProcessor dragProcessor; - - @NotNull - private Preferences preferences; - - public SimpleOnDragListener(@NotNull Preferences preferences) { - this.preferences = preferences; - } - - public SimpleOnDragListener(@NotNull DragProcessor dragProcessor, @NotNull Preferences preferences) { - this.dragProcessor = dragProcessor; - this.preferences = preferences; - } - - @Override - public boolean onDrag(@NotNull DragButton dragButton, @NotNull DragEvent event) { - boolean result = false; - - logDragEvent(dragButton, event); - - final Point2d startPoint = event.getStartPoint(); - final MotionEvent motionEvent = event.getMotionEvent(); - - // init end point - final Point2d endPoint = new Point2d(motionEvent.getX(), motionEvent.getY()); - - final float distance = MathUtils.getDistance(startPoint, endPoint); - - final MutableObject right = new MutableObject(); - final double angle = Math.toDegrees(MathUtils.getAngle(startPoint, MathUtils.sum(startPoint, axis), endPoint, right)); - Log.d(String.valueOf(dragButton.getId()), "Angle: " + angle); - Log.d(String.valueOf(dragButton.getId()), "Is right?: " + right.getObject()); - - final double duration = motionEvent.getEventTime() - motionEvent.getDownTime(); - - final Preference distancePreferences = preferences.getPreferencesMap().get(PreferenceType.distance); - final Preference anglePreferences = preferences.getPreferencesMap().get(PreferenceType.angle); - - DragDirection direction = null; - for (Map.Entry directionEntry : distancePreferences.getDirectionPreferences().entrySet()) { - - Log.d(String.valueOf(dragButton.getId()), "Drag direction: " + directionEntry.getKey()); - Log.d(String.valueOf(dragButton.getId()), "Trying direction interval: " + directionEntry.getValue().getInterval()); - - if (directionEntry.getValue().getInterval().contains(distance)) { - final DragPreference anglePreference = anglePreferences.getDirectionPreferences().get(directionEntry.getKey()); - - Log.d(String.valueOf(dragButton.getId()), "Trying angle interval: " + anglePreference.getInterval()); - - if (directionEntry.getKey() == DragDirection.left && right.getObject()) { - } else if (directionEntry.getKey() == DragDirection.right && !right.getObject()) { - } else { - if (anglePreference.getInterval().contains((float) angle)) { - direction = directionEntry.getKey(); - Log.d(String.valueOf(dragButton.getId()), "MATCH! Direction: " + direction); - break; - } - } - } - - } - - if (direction != null) { - final Preference durationPreferences = preferences.getPreferencesMap().get(PreferenceType.duration); - - final DragPreference durationDragPreferences = durationPreferences.getDirectionPreferences().get(direction); - - Log.d(String.valueOf(dragButton.getId()), "Trying time interval: " + durationDragPreferences.getInterval()); - if (durationDragPreferences.getInterval().contains((float) duration)) { - Log.d(String.valueOf(dragButton.getId()), "MATCH!"); - result = dragProcessor.processDragEvent(direction, dragButton, startPoint, motionEvent); - } - } - - return result; - } - - @Override - public boolean isSuppressOnClickEvent() { - return true; - } - - private void logDragEvent(@NotNull DragButton dragButton, @NotNull DragEvent event) { - final Point2d startPoint = event.getStartPoint(); - final MotionEvent motionEvent = event.getMotionEvent(); - final Point2d endPoint = new Point2d(motionEvent.getX(), motionEvent.getY()); - - Log.d(String.valueOf(dragButton.getId()), "Start point: " + startPoint + ", End point: " + endPoint); - Log.d(String.valueOf(dragButton.getId()), "Distance: " + MathUtils.getDistance(startPoint, endPoint)); - final MutableObject right = new MutableObject(); - Log.d(String.valueOf(dragButton.getId()), "Angle: " + Math.toDegrees(MathUtils.getAngle(startPoint, MathUtils.sum(startPoint, axis), endPoint, right))); - Log.d(String.valueOf(dragButton.getId()), "Is right angle? " + right); - Log.d(String.valueOf(dragButton.getId()), "Axis: " + axis + " Vector: " + MathUtils.subtract(endPoint, startPoint)); - Log.d(String.valueOf(dragButton.getId()), "Total time: " + (motionEvent.getEventTime() - motionEvent.getDownTime()) + " ms"); - } - - @NotNull - public DragProcessor getDragProcessor() { - return dragProcessor; - } - - public void setDragProcessor(@NotNull DragProcessor dragProcessor) { - this.dragProcessor = dragProcessor; - } - - @Override - public void onDragPreferencesChange(@NotNull Preferences preferences) { - this.preferences = preferences; - } - - public interface DragProcessor { - - boolean processDragEvent(@NotNull DragDirection dragDirection, @NotNull DragButton dragButton, @NotNull Point2d startPoint2d, @NotNull MotionEvent motionEvent); - } - - // todo serso: currently we do not use direction - public static String getPreferenceId(@NotNull PreferenceType preferenceType, @NotNull DragDirection direction) { - return "org.solovyev.android.calculator.DragButtonCalibrationActivity" + "_" + preferenceType.name() /*+ "_" + direction.name()*/; - } - - @NotNull - public static Preferences getDefaultPreferences(@NotNull Context context) { - return getPreferences0(null, context); - } - - @NotNull - public static Preferences getPreferences(@NotNull final SharedPreferences preferences, @NotNull Context context) { - return getPreferences0(preferences, context); - } - - @NotNull - private static Preferences getPreferences0(@Nullable final SharedPreferences preferences, @NotNull Context context) { - - final Mapper> mapper = new NumberIntervalMapper(Float.class); - - final Preferences result = new Preferences(); - - for (PreferenceType preferenceType : PreferenceType.values()) { - for (DragDirection dragDirection : DragDirection.values()) { - - final String preferenceId = getPreferenceId(preferenceType, dragDirection); - - final String defaultValue; - switch (preferenceType) { - case angle: - defaultValue = context.getResources().getString(R.string.p_drag_angle); - break; - case distance: - defaultValue = context.getResources().getString(R.string.p_drag_distance); - break; - case duration: - defaultValue = context.getResources().getString(R.string.p_drag_duration); - break; - default: - defaultValue = null; - Log.e(SimpleOnDragListener.class.getName(), "New preference type added: default preferences should be defined. Preference id: " + preferenceId); - } - - final String value = preferences == null ? defaultValue : preferences.getString(preferenceId, defaultValue); - - if (value != null) { - final Interval intervalPref = transformInterval(preferenceType, dragDirection, mapper.parseValue(value)); - - Log.d(SimpleOnDragListener.class.getName(), "Preference loaded for " + dragDirection +". Id: " + preferenceId + ", value: " + intervalPref.toString()); - - final DragPreference directionPreference = new DragPreference(dragDirection, intervalPref); - - Preference preference = result.getPreferencesMap().get(preferenceType); - if (preference == null) { - preference = new Preference(preferenceType); - result.getPreferencesMap().put(preferenceType, preference); - } - - preference.getDirectionPreferences().put(dragDirection, directionPreference); - } - } - } - - return result; - } - - @NotNull - public static Interval transformInterval(@NotNull PreferenceType preferenceType, - @NotNull DragDirection dragDirection, - @NotNull Interval interval) { - - if (preferenceType == PreferenceType.angle) { - final Float leftLimit = interval.getLeftLimit(); - final Float rightLimit = interval.getRightLimit(); - - if (leftLimit != null && rightLimit != null) { - final Float newLeftLimit; - final Float newRightLimit; - - if (dragDirection == DragDirection.up) { - newLeftLimit = 180f - rightLimit; - newRightLimit = 180f - leftLimit; - } else if (dragDirection == DragDirection.left) { - newLeftLimit = 90f - rightLimit; - newRightLimit = 90f + rightLimit; - } else if (dragDirection == DragDirection.right) { - newLeftLimit = 90f - rightLimit; - newRightLimit = 90f + rightLimit; - } else { - newLeftLimit = leftLimit; - newRightLimit = rightLimit; - } - - return IntervalImpl.newClosed(newLeftLimit, newRightLimit); - } - } - - return interval; - } - - - public static enum PreferenceType { - angle, - distance, - duration - } - - public static class DragPreference { - - @NotNull - private DragDirection direction; - - @NotNull - private Interval interval; - - - public DragPreference(@NotNull DragDirection direction, @NotNull Interval interval) { - this.direction = direction; - this.interval = interval; - } - - @NotNull - public DragDirection getDirection() { - return direction; - } - - public void setDirection(@NotNull DragDirection direction) { - this.direction = direction; - } - - @NotNull - public Interval getInterval() { - return interval; - } - - public void setInterval(@NotNull Interval interval) { - this.interval = interval; - } - } - - public static class Preference { - - @NotNull - private PreferenceType preferenceType; - - @NotNull - private Map directionPreferences = new HashMap(); - - - public Preference(@NotNull PreferenceType preferenceType) { - this.preferenceType = preferenceType; - } - - @NotNull - public PreferenceType getPreferenceType() { - return preferenceType; - } - - public void setPreferenceType(@NotNull PreferenceType preferenceType) { - this.preferenceType = preferenceType; - } - - @NotNull - public Map getDirectionPreferences() { - return directionPreferences; - } - - public void setDirectionPreferences(@NotNull Map directionPreferences) { - this.directionPreferences = directionPreferences; - } - } - - public static class Preferences { - - private final Map preferencesMap = new HashMap(); - - public Map getPreferencesMap() { - return preferencesMap; - } - } -} \ No newline at end of file diff --git a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/scroll/ScrollViewState.java b/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/scroll/ScrollViewState.java deleted file mode 100644 index 03150983..00000000 --- a/android-app/gen-external-apklibs/org.solovyev.android_android-common-view_1.0.6/src/org/solovyev/android/view/scroll/ScrollViewState.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.solovyev.android.view.scroll; - -import android.os.Bundle; -import android.widget.ScrollView; -import org.jetbrains.annotations.NotNull; - -import java.io.Serializable; - -/** - * User: serso - * Date: 8/5/12 - * Time: 2:09 AM - */ -public class ScrollViewState implements Serializable { - - @NotNull - private static final String SCROLL_VIEW_STATE = "scroll_view_state"; - - private int scrollX = 0; - - private int scrollY = 0; - - public ScrollViewState() { - } - - public ScrollViewState(@NotNull ScrollView scrollView) { - this.scrollX = scrollView.getScrollX(); - this.scrollY = scrollView.getScrollY(); - } - - public void restoreState(@NotNull final ScrollView scrollView) { - scrollView.post(new Runnable() { - @Override - public void run() { - scrollView.scrollTo(scrollX, scrollY); - } - }); - - } - - public static void saveState(@NotNull Bundle out, @NotNull final ScrollView scrollView) { - out.putSerializable(SCROLL_VIEW_STATE, new ScrollViewState(scrollView)); - } - - public static void restoreState(@NotNull Bundle in, @NotNull final ScrollView scrollView) { - final Object o = in.getSerializable(SCROLL_VIEW_STATE); - if (o instanceof ScrollViewState) { - ((ScrollViewState) o).restoreState(scrollView); - } - } -} From c2662e7537f916cc22ee9e921a220d0865942594 Mon Sep 17 00:00:00 2001 From: Sergey Solovyev Date: Sat, 1 Dec 2012 17:46:16 +0400 Subject: [PATCH 08/14] changes --- android-app-core/pom.xml | 29 ++++++++ .../res/drawable-hdpi/ab_add.png | Bin .../res/drawable-hdpi/ab_icon.png | Bin .../res/drawable-hdpi/ab_icon_long.png | Bin .../res/drawable-hdpi/ab_settings.png | Bin .../res/drawable-hdpi/icon.png | Bin .../res/drawable-hdpi/icon_onscreen.png | Bin .../res/drawable-hdpi/kb_copy.png | Bin .../res/drawable-hdpi/kb_delete.png | Bin .../res/drawable-hdpi/kb_facebook.png | Bin .../res/drawable-hdpi/kb_heart.png | Bin .../res/drawable-hdpi/kb_logo.png | Bin .../res/drawable-hdpi/kb_paste.png | Bin .../res/drawable-hdpi/kb_settings.png | Bin .../res/drawable-hdpi/logo.png | Bin .../res/drawable-ldpi/ab_add.png | Bin .../res/drawable-ldpi/ab_icon.png | Bin .../res/drawable-ldpi/ab_settings.png | Bin .../res/drawable-ldpi/icon.png | Bin .../res/drawable-ldpi/icon_onscreen.png | Bin .../res/drawable-ldpi/kb_copy.png | Bin .../res/drawable-ldpi/kb_delete.png | Bin .../res/drawable-ldpi/kb_facebook.png | Bin .../res/drawable-ldpi/kb_heart.png | Bin .../res/drawable-ldpi/kb_logo.png | Bin .../res/drawable-ldpi/kb_paste.png | Bin .../res/drawable-ldpi/kb_settings.png | Bin .../res/drawable-ldpi/logo.png | Bin .../res/drawable-mdpi/ab_add.png | Bin .../res/drawable-mdpi/ab_icon.png | Bin .../res/drawable-mdpi/ab_settings.png | Bin .../res/drawable-mdpi/icon.png | Bin .../res/drawable-mdpi/icon_onscreen.png | Bin .../res/drawable-mdpi/kb_copy.png | Bin .../res/drawable-mdpi/kb_delete.png | Bin .../res/drawable-mdpi/kb_facebook.png | Bin .../res/drawable-mdpi/kb_heart.png | Bin .../res/drawable-mdpi/kb_logo.png | Bin .../res/drawable-mdpi/kb_paste.png | Bin .../res/drawable-mdpi/kb_settings.png | Bin .../res/drawable-mdpi/logo.png | Bin .../cpp_onscreen_button_close.png | Bin .../cpp_onscreen_button_fold.png | Bin .../cpp_onscreen_button_minimize.png | Bin .../cpp_onscreen_header_logo.png | Bin ...efault_abs__ab_transparent_dark_holo.9.png | Bin ..._abs__btn_cab_done_default_holo_dark.9.png | Bin ..._abs__btn_cab_done_focused_holo_dark.9.png | Bin ..._abs__btn_cab_done_pressed_holo_dark.9.png | Bin .../default_abs__list_focused_holo.9.png | Bin .../default_abs__list_longpressed_holo.9.png | Bin .../default_abs__list_pressed_holo_dark.9.png | Bin ...lt_abs__spinner_ab_focused_holo_dark.9.png | Bin ...lt_abs__spinner_ab_pressed_holo_dark.9.png | Bin ...fault_abs__tab_selected_focused_holo.9.png | Bin .../default_abs__tab_selected_holo.9.png | Bin ...fault_abs__tab_selected_pressed_holo.9.png | Bin ...ult_abs__tab_unselected_pressed_holo.9.png | Bin ...o_blue_abs__ab_transparent_dark_holo.9.png | Bin .../metro_blue_abs__list_focused_holo.9.png | Bin ...tro_blue_abs__list_pressed_holo_dark.9.png | Bin ..._blue_abs__tab_selected_focused_holo.9.png | Bin .../metro_blue_abs__tab_selected_holo.9.png | Bin ..._blue_abs__tab_selected_pressed_holo.9.png | Bin ...lue_abs__tab_unselected_pressed_holo.9.png | Bin .../res/drawable-nodpi/widget_preview.png | Bin .../res/drawable-xhdpi/ab_add.png | Bin .../res/drawable-xhdpi/ab_icon.png | Bin .../res/drawable-xhdpi/ab_settings.png | Bin .../drawable-xhdpi/ic_menu_preferences.png | Bin .../res/drawable-xhdpi/icon.png | Bin .../res/drawable-xhdpi/icon_onscreen.png | Bin .../res/drawable-xhdpi/kb_copy.png | Bin .../res/drawable-xhdpi/kb_delete.png | Bin .../res/drawable-xhdpi/kb_facebook.png | Bin .../res/drawable-xhdpi/kb_heart.png | Bin .../res/drawable-xhdpi/kb_logo.png | Bin .../res/drawable-xhdpi/kb_paste.png | Bin .../res/drawable-xhdpi/kb_settings.png | Bin .../res/drawable-xhdpi/logo.png | Bin .../res/drawable-xlarge-hdpi/kb_copy.png | Bin .../res/drawable-xlarge-hdpi/kb_delete.png | Bin .../res/drawable-xlarge-hdpi/kb_facebook.png | Bin .../res/drawable-xlarge-hdpi/kb_heart.png | Bin .../res/drawable-xlarge-hdpi/kb_logo.png | Bin .../res/drawable-xlarge-hdpi/kb_paste.png | Bin .../res/drawable-xlarge-hdpi/kb_settings.png | Bin .../res/drawable/blue_button.xml | 0 .../res/drawable/blue_button_dark.xml | 0 .../res/drawable/blue_button_dark_shape.xml | 0 .../res/drawable/blue_button_shape.xml | 0 .../default_abs__btn_cab_done_holo_dark.xml | 0 ...default_abs__item_background_holo_dark.xml | 0 ...lector_background_transition_holo_dark.xml | 0 .../default_abs__list_selector_holo_dark.xml | 0 .../default_abs__spinner_ab_holo_dark.xml | 0 .../default_abs__tab_indicator_ab_holo.xml | 0 .../res/drawable/gray_button.xml | 0 .../res/drawable/gray_button_dark.xml | 0 .../res/drawable/gray_button_dark_shape.xml | 0 .../res/drawable/gray_button_shape.xml | 0 .../metro_blue_abs__tab_indicator_ab_holo.xml | 0 .../res/drawable/metro_blue_button.xml | 0 .../res/drawable/metro_blue_button_shape.xml | 0 .../res/drawable/metro_blue_list_item.xml | 0 .../res/drawable/metro_button_dark.xml | 0 .../res/drawable/metro_button_dark_shape.xml | 0 .../res/drawable/metro_button_green.xml | 0 .../res/drawable/metro_button_green_shape.xml | 0 .../res/drawable/metro_button_light.xml | 0 .../res/drawable/metro_button_light_shape.xml | 0 .../res/drawable/metro_button_pressed.xml | 0 .../res/drawable/metro_button_purple.xml | 0 .../drawable/metro_button_purple_shape.xml | 0 .../res/drawable/metro_green_list_item.xml | 0 .../res/drawable/metro_purple_list_item.xml | 0 .../res/drawable/pane_background.xml | 0 .../res/drawable/violet_button.xml | 0 .../res/drawable/violet_button_dark.xml | 0 .../res/drawable/violet_button_dark_shape.xml | 0 .../res/drawable/violet_button_shape.xml | 0 .../res/layout/main_calculator.xml | 5 ++ .../res/layout/main_calculator_mobile.xml | 5 ++ .../res/values-es/text_about.xml | 0 .../res/values-es/text_functions.xml | 0 .../res/values-es/text_help.xml | 0 .../res/values-es/text_operators.xml | 0 .../res/values-es/text_strings.xml | 0 .../res/values-es/text_vars.xml | 0 .../res/values-it/text_about.xml | 0 .../res/values-it/text_functions.xml | 0 .../res/values-it/text_help.xml | 0 .../res/values-it/text_operators.xml | 0 .../res/values-it/text_strings.xml | 0 .../res/values-it/text_vars.xml | 0 .../res/values-ru/text_about.xml | 0 .../res/values-ru/text_functions.xml | 0 .../res/values-ru/text_help.xml | 0 .../res/values-ru/text_operators.xml | 0 .../res/values-ru/text_preferences.xml | 0 .../res/values-ru/text_strings.xml | 0 .../res/values-ru/text_vars.xml | 0 .../res/values-uk/text_about.xml | 0 .../res/values-uk/text_functions.xml | 0 .../res/values-uk/text_help.xml | 0 .../res/values-uk/text_operators.xml | 0 .../res/values-uk/text_preferences.xml | 0 .../res/values-uk/text_strings.xml | 0 .../res/values-uk/text_vars.xml | 0 .../res/values-zh-rtw/text_about.xml | 0 .../res/values-zh-rtw/text_functions.xml | 0 .../res/values-zh-rtw/text_help.xml | 0 .../res/values-zh-rtw/text_operators.xml | 0 .../res/values-zh-rtw/text_preferences.xml | 0 .../res/values-zh-rtw/text_strings.xml | 0 .../res/values-zh-rtw/text_vars.xml | 0 .../res/values/attributes.xml | 0 android-app-core/res/values/colors.xml | 16 +++++ .../res/values/dimens.xml | 5 -- android-app-core/res/values/ids.xml | 36 ++++++++++ android-app-core/res/values/preferences.xml | 5 ++ .../res/values/styles.xml | 8 --- .../res/values/text_about.xml | 0 .../res/values/text_functions.xml | 0 .../res/values/text_help.xml | 0 .../res/values/text_operators.xml | 0 .../res/values/text_preferences.xml | 0 .../res/values/text_strings.xml | 0 .../res/values/text_vars.xml | 0 .../res/values/theme_gray.xml | 5 -- .../res/values/theme_light_blue.xml | 0 .../res/values/theme_metro_blue.xml | 15 ---- .../res/values/theme_metro_green.xml | 0 .../res/values/theme_metro_purple.xml | 0 .../res/values/theme_violet.xml | 0 .../org/solovyev/android/calculator/App.java | 66 ++++++++++++++++++ .../android/calculator/CalculatorButtons.java | 5 +- .../calculator/CalculatorPreferences.java | 0 .../calculator/DigitButtonDragProcessor.java | 0 .../ParcelableCalculatorDisplayViewState.java | 0 .../ParcelableCalculatorEditorViewState.java | 0 .../android/calculator/UiThreadExecutor.java | 35 ++++++++++ .../AndroidExternalListenersContainer.java | 19 +---- ...efaultExternalCalculatorIntentHandler.java | 0 .../ExternalCalculatorIntentHandler.java | 0 .../ExternalCalculatorStateUpdater.java | 0 .../model/AndroidCalculatorEngine.java | 12 +--- .../model/AndroidMathEntityDao.java | 4 +- .../calculator/plot/GraphLineColor.java | 0 .../calculator/view/AngleUnitsButton.java | 2 +- .../calculator/view/NumeralBasesButton.java | 2 +- .../res/layout/widget_app_button.xml | 0 .../res/layout/widget_clear_button.xml | 0 .../res/layout/widget_copy_button.xml | 0 .../res/layout/widget_display.xml | 0 .../res/layout/widget_division_button.xml | 0 .../res/layout/widget_dot_button.xml | 0 .../res/layout/widget_editor.xml | 0 .../res/layout/widget_eight_digit_button.xml | 0 .../res/layout/widget_equals_button.xml | 0 .../res/layout/widget_erase_button.xml | 0 .../res/layout/widget_five_digit_button.xml | 0 .../res/layout/widget_four_digit_button.xml | 0 .../res/layout/widget_functions_button.xml | 0 .../res/layout/widget_history_button.xml | 0 .../res/layout/widget_keyboard.xml | 0 .../res/layout/widget_layout.xml | 0 .../res/layout/widget_left_button.xml | 0 .../res/layout/widget_like_button.xml | 0 .../layout/widget_multiplication_button.xml | 0 .../res/layout/widget_nine_digit_button.xml | 0 .../res/layout/widget_one_digit_button.xml | 0 .../res/layout/widget_paste_button.xml | 0 .../res/layout/widget_percent_button.xml | 0 .../res/layout/widget_plus_button.xml | 0 .../res/layout/widget_power_button.xml | 0 .../res/layout/widget_right_button.xml | 0 .../layout/widget_round_brackets_button.xml | 0 .../res/layout/widget_settings_button.xml | 0 .../res/layout/widget_seven_digit_button.xml | 0 .../res/layout/widget_six_digit_button.xml | 0 .../res/layout/widget_subtraction_button.xml | 0 .../res/layout/widget_three_digit_button.xml | 0 .../res/layout/widget_two_digit_button.xml | 0 .../res/layout/widget_vars_button.xml | 0 .../res/layout/widget_zero_digit_button.xml | 0 android-app-widget/res/values/colors.xml | 4 ++ android-app-widget/res/values/dimens.xml | 7 ++ android-app-widget/res/values/styles.xml | 32 +++++++++ .../AbstractCalculatorWidgetProvider.java | 1 - ...CalculatorWidgetConfigurationActivity.java | 0 .../widget/CalculatorWidgetIntentHandler.java | 0 .../widget/CalculatorWidgetProvider.java | 0 .../widget/CalculatorWidgetProvider3x4.java | 0 .../widget/CalculatorWidgetProvider4x4.java | 0 .../widget/CalculatorWidgetProvider4x5.java | 0 .../calculator/widget/WidgetButton.java | 3 +- android-app/res/values/colors.xml | 22 ------ android-app/res/values/preferences.xml | 2 - .../CalculatorActivityLauncher.java | 30 +++++++- .../calculator/CalculatorApplication.java | 2 + .../calculator/CalculatorEventType.java | 5 +- .../org/solovyev/common/DelayedExecutor.java | 16 +++++ 243 files changed, 303 insertions(+), 95 deletions(-) rename {android-app => android-app-core}/res/drawable-hdpi/ab_add.png (100%) rename {android-app => android-app-core}/res/drawable-hdpi/ab_icon.png (100%) rename {android-app => android-app-core}/res/drawable-hdpi/ab_icon_long.png (100%) rename {android-app => android-app-core}/res/drawable-hdpi/ab_settings.png (100%) rename {android-app => android-app-core}/res/drawable-hdpi/icon.png (100%) rename {android-app => android-app-core}/res/drawable-hdpi/icon_onscreen.png (100%) rename {android-app => android-app-core}/res/drawable-hdpi/kb_copy.png (100%) rename {android-app => android-app-core}/res/drawable-hdpi/kb_delete.png (100%) rename {android-app => android-app-core}/res/drawable-hdpi/kb_facebook.png (100%) rename {android-app => android-app-core}/res/drawable-hdpi/kb_heart.png (100%) rename {android-app => android-app-core}/res/drawable-hdpi/kb_logo.png (100%) rename {android-app => android-app-core}/res/drawable-hdpi/kb_paste.png (100%) rename {android-app => android-app-core}/res/drawable-hdpi/kb_settings.png (100%) rename {android-app => android-app-core}/res/drawable-hdpi/logo.png (100%) rename {android-app => android-app-core}/res/drawable-ldpi/ab_add.png (100%) rename {android-app => android-app-core}/res/drawable-ldpi/ab_icon.png (100%) rename {android-app => android-app-core}/res/drawable-ldpi/ab_settings.png (100%) rename {android-app => android-app-core}/res/drawable-ldpi/icon.png (100%) rename {android-app => android-app-core}/res/drawable-ldpi/icon_onscreen.png (100%) rename {android-app => android-app-core}/res/drawable-ldpi/kb_copy.png (100%) rename {android-app => android-app-core}/res/drawable-ldpi/kb_delete.png (100%) rename {android-app => android-app-core}/res/drawable-ldpi/kb_facebook.png (100%) rename {android-app => android-app-core}/res/drawable-ldpi/kb_heart.png (100%) rename {android-app => android-app-core}/res/drawable-ldpi/kb_logo.png (100%) rename {android-app => android-app-core}/res/drawable-ldpi/kb_paste.png (100%) rename {android-app => android-app-core}/res/drawable-ldpi/kb_settings.png (100%) rename {android-app => android-app-core}/res/drawable-ldpi/logo.png (100%) rename {android-app => android-app-core}/res/drawable-mdpi/ab_add.png (100%) rename {android-app => android-app-core}/res/drawable-mdpi/ab_icon.png (100%) rename {android-app => android-app-core}/res/drawable-mdpi/ab_settings.png (100%) rename {android-app => android-app-core}/res/drawable-mdpi/icon.png (100%) rename {android-app => android-app-core}/res/drawable-mdpi/icon_onscreen.png (100%) rename {android-app => android-app-core}/res/drawable-mdpi/kb_copy.png (100%) rename {android-app => android-app-core}/res/drawable-mdpi/kb_delete.png (100%) rename {android-app => android-app-core}/res/drawable-mdpi/kb_facebook.png (100%) rename {android-app => android-app-core}/res/drawable-mdpi/kb_heart.png (100%) rename {android-app => android-app-core}/res/drawable-mdpi/kb_logo.png (100%) rename {android-app => android-app-core}/res/drawable-mdpi/kb_paste.png (100%) rename {android-app => android-app-core}/res/drawable-mdpi/kb_settings.png (100%) rename {android-app => android-app-core}/res/drawable-mdpi/logo.png (100%) rename {android-app => android-app-core}/res/drawable-nodpi/cpp_onscreen_button_close.png (100%) rename {android-app => android-app-core}/res/drawable-nodpi/cpp_onscreen_button_fold.png (100%) rename {android-app => android-app-core}/res/drawable-nodpi/cpp_onscreen_button_minimize.png (100%) rename {android-app => android-app-core}/res/drawable-nodpi/cpp_onscreen_header_logo.png (100%) rename {android-app => android-app-core}/res/drawable-nodpi/default_abs__ab_transparent_dark_holo.9.png (100%) rename {android-app => android-app-core}/res/drawable-nodpi/default_abs__btn_cab_done_default_holo_dark.9.png (100%) rename {android-app => android-app-core}/res/drawable-nodpi/default_abs__btn_cab_done_focused_holo_dark.9.png (100%) rename {android-app => android-app-core}/res/drawable-nodpi/default_abs__btn_cab_done_pressed_holo_dark.9.png (100%) rename {android-app => android-app-core}/res/drawable-nodpi/default_abs__list_focused_holo.9.png (100%) rename {android-app => android-app-core}/res/drawable-nodpi/default_abs__list_longpressed_holo.9.png (100%) rename {android-app => android-app-core}/res/drawable-nodpi/default_abs__list_pressed_holo_dark.9.png (100%) rename {android-app => android-app-core}/res/drawable-nodpi/default_abs__spinner_ab_focused_holo_dark.9.png (100%) rename {android-app => android-app-core}/res/drawable-nodpi/default_abs__spinner_ab_pressed_holo_dark.9.png (100%) rename {android-app => android-app-core}/res/drawable-nodpi/default_abs__tab_selected_focused_holo.9.png (100%) rename {android-app => android-app-core}/res/drawable-nodpi/default_abs__tab_selected_holo.9.png (100%) rename {android-app => android-app-core}/res/drawable-nodpi/default_abs__tab_selected_pressed_holo.9.png (100%) rename {android-app => android-app-core}/res/drawable-nodpi/default_abs__tab_unselected_pressed_holo.9.png (100%) rename {android-app => android-app-core}/res/drawable-nodpi/metro_blue_abs__ab_transparent_dark_holo.9.png (100%) rename {android-app => android-app-core}/res/drawable-nodpi/metro_blue_abs__list_focused_holo.9.png (100%) rename {android-app => android-app-core}/res/drawable-nodpi/metro_blue_abs__list_pressed_holo_dark.9.png (100%) rename {android-app => android-app-core}/res/drawable-nodpi/metro_blue_abs__tab_selected_focused_holo.9.png (100%) rename {android-app => android-app-core}/res/drawable-nodpi/metro_blue_abs__tab_selected_holo.9.png (100%) rename {android-app => android-app-core}/res/drawable-nodpi/metro_blue_abs__tab_selected_pressed_holo.9.png (100%) rename {android-app => android-app-core}/res/drawable-nodpi/metro_blue_abs__tab_unselected_pressed_holo.9.png (100%) rename {android-app => android-app-core}/res/drawable-nodpi/widget_preview.png (100%) rename {android-app => android-app-core}/res/drawable-xhdpi/ab_add.png (100%) rename {android-app => android-app-core}/res/drawable-xhdpi/ab_icon.png (100%) rename {android-app => android-app-core}/res/drawable-xhdpi/ab_settings.png (100%) rename {android-app => android-app-core}/res/drawable-xhdpi/ic_menu_preferences.png (100%) rename {android-app => android-app-core}/res/drawable-xhdpi/icon.png (100%) rename {android-app => android-app-core}/res/drawable-xhdpi/icon_onscreen.png (100%) rename {android-app => android-app-core}/res/drawable-xhdpi/kb_copy.png (100%) rename {android-app => android-app-core}/res/drawable-xhdpi/kb_delete.png (100%) rename {android-app => android-app-core}/res/drawable-xhdpi/kb_facebook.png (100%) rename {android-app => android-app-core}/res/drawable-xhdpi/kb_heart.png (100%) rename {android-app => android-app-core}/res/drawable-xhdpi/kb_logo.png (100%) rename {android-app => android-app-core}/res/drawable-xhdpi/kb_paste.png (100%) rename {android-app => android-app-core}/res/drawable-xhdpi/kb_settings.png (100%) rename {android-app => android-app-core}/res/drawable-xhdpi/logo.png (100%) rename {android-app => android-app-core}/res/drawable-xlarge-hdpi/kb_copy.png (100%) rename {android-app => android-app-core}/res/drawable-xlarge-hdpi/kb_delete.png (100%) rename {android-app => android-app-core}/res/drawable-xlarge-hdpi/kb_facebook.png (100%) rename {android-app => android-app-core}/res/drawable-xlarge-hdpi/kb_heart.png (100%) rename {android-app => android-app-core}/res/drawable-xlarge-hdpi/kb_logo.png (100%) rename {android-app => android-app-core}/res/drawable-xlarge-hdpi/kb_paste.png (100%) rename {android-app => android-app-core}/res/drawable-xlarge-hdpi/kb_settings.png (100%) rename {android-app => android-app-core}/res/drawable/blue_button.xml (100%) rename {android-app => android-app-core}/res/drawable/blue_button_dark.xml (100%) rename {android-app => android-app-core}/res/drawable/blue_button_dark_shape.xml (100%) rename {android-app => android-app-core}/res/drawable/blue_button_shape.xml (100%) rename {android-app => android-app-core}/res/drawable/default_abs__btn_cab_done_holo_dark.xml (100%) rename {android-app => android-app-core}/res/drawable/default_abs__item_background_holo_dark.xml (100%) rename {android-app => android-app-core}/res/drawable/default_abs__list_selector_background_transition_holo_dark.xml (100%) rename {android-app => android-app-core}/res/drawable/default_abs__list_selector_holo_dark.xml (100%) rename {android-app => android-app-core}/res/drawable/default_abs__spinner_ab_holo_dark.xml (100%) rename {android-app => android-app-core}/res/drawable/default_abs__tab_indicator_ab_holo.xml (100%) rename {android-app => android-app-core}/res/drawable/gray_button.xml (100%) rename {android-app => android-app-core}/res/drawable/gray_button_dark.xml (100%) rename {android-app => android-app-core}/res/drawable/gray_button_dark_shape.xml (100%) rename {android-app => android-app-core}/res/drawable/gray_button_shape.xml (100%) rename {android-app => android-app-core}/res/drawable/metro_blue_abs__tab_indicator_ab_holo.xml (100%) rename {android-app => android-app-core}/res/drawable/metro_blue_button.xml (100%) rename {android-app => android-app-core}/res/drawable/metro_blue_button_shape.xml (100%) rename {android-app => android-app-core}/res/drawable/metro_blue_list_item.xml (100%) rename {android-app => android-app-core}/res/drawable/metro_button_dark.xml (100%) rename {android-app => android-app-core}/res/drawable/metro_button_dark_shape.xml (100%) rename {android-app => android-app-core}/res/drawable/metro_button_green.xml (100%) rename {android-app => android-app-core}/res/drawable/metro_button_green_shape.xml (100%) rename {android-app => android-app-core}/res/drawable/metro_button_light.xml (100%) rename {android-app => android-app-core}/res/drawable/metro_button_light_shape.xml (100%) rename {android-app => android-app-core}/res/drawable/metro_button_pressed.xml (100%) rename {android-app => android-app-core}/res/drawable/metro_button_purple.xml (100%) rename {android-app => android-app-core}/res/drawable/metro_button_purple_shape.xml (100%) rename {android-app => android-app-core}/res/drawable/metro_green_list_item.xml (100%) rename {android-app => android-app-core}/res/drawable/metro_purple_list_item.xml (100%) rename {android-app => android-app-core}/res/drawable/pane_background.xml (100%) rename {android-app => android-app-core}/res/drawable/violet_button.xml (100%) rename {android-app => android-app-core}/res/drawable/violet_button_dark.xml (100%) rename {android-app => android-app-core}/res/drawable/violet_button_dark_shape.xml (100%) rename {android-app => android-app-core}/res/drawable/violet_button_shape.xml (100%) create mode 100644 android-app-core/res/layout/main_calculator.xml create mode 100644 android-app-core/res/layout/main_calculator_mobile.xml rename {android-app => android-app-core}/res/values-es/text_about.xml (100%) rename {android-app => android-app-core}/res/values-es/text_functions.xml (100%) rename {android-app => android-app-core}/res/values-es/text_help.xml (100%) rename {android-app => android-app-core}/res/values-es/text_operators.xml (100%) rename {android-app => android-app-core}/res/values-es/text_strings.xml (100%) rename {android-app => android-app-core}/res/values-es/text_vars.xml (100%) rename {android-app => android-app-core}/res/values-it/text_about.xml (100%) rename {android-app => android-app-core}/res/values-it/text_functions.xml (100%) rename {android-app => android-app-core}/res/values-it/text_help.xml (100%) rename {android-app => android-app-core}/res/values-it/text_operators.xml (100%) rename {android-app => android-app-core}/res/values-it/text_strings.xml (100%) rename {android-app => android-app-core}/res/values-it/text_vars.xml (100%) rename {android-app => android-app-core}/res/values-ru/text_about.xml (100%) rename {android-app => android-app-core}/res/values-ru/text_functions.xml (100%) rename {android-app => android-app-core}/res/values-ru/text_help.xml (100%) rename {android-app => android-app-core}/res/values-ru/text_operators.xml (100%) rename {android-app => android-app-core}/res/values-ru/text_preferences.xml (100%) rename {android-app => android-app-core}/res/values-ru/text_strings.xml (100%) rename {android-app => android-app-core}/res/values-ru/text_vars.xml (100%) rename {android-app => android-app-core}/res/values-uk/text_about.xml (100%) rename {android-app => android-app-core}/res/values-uk/text_functions.xml (100%) rename {android-app => android-app-core}/res/values-uk/text_help.xml (100%) rename {android-app => android-app-core}/res/values-uk/text_operators.xml (100%) rename {android-app => android-app-core}/res/values-uk/text_preferences.xml (100%) rename {android-app => android-app-core}/res/values-uk/text_strings.xml (100%) rename {android-app => android-app-core}/res/values-uk/text_vars.xml (100%) rename {android-app => android-app-core}/res/values-zh-rtw/text_about.xml (100%) rename {android-app => android-app-core}/res/values-zh-rtw/text_functions.xml (100%) rename {android-app => android-app-core}/res/values-zh-rtw/text_help.xml (100%) rename {android-app => android-app-core}/res/values-zh-rtw/text_operators.xml (100%) rename {android-app => android-app-core}/res/values-zh-rtw/text_preferences.xml (100%) rename {android-app => android-app-core}/res/values-zh-rtw/text_strings.xml (100%) rename {android-app => android-app-core}/res/values-zh-rtw/text_vars.xml (100%) rename {android-app => android-app-core}/res/values/attributes.xml (100%) create mode 100644 android-app-core/res/values/colors.xml rename {android-app => android-app-core}/res/values/dimens.xml (83%) create mode 100644 android-app-core/res/values/ids.xml create mode 100644 android-app-core/res/values/preferences.xml rename {android-app => android-app-core}/res/values/styles.xml (91%) rename {android-app => android-app-core}/res/values/text_about.xml (100%) rename {android-app => android-app-core}/res/values/text_functions.xml (100%) rename {android-app => android-app-core}/res/values/text_help.xml (100%) rename {android-app => android-app-core}/res/values/text_operators.xml (100%) rename {android-app => android-app-core}/res/values/text_preferences.xml (100%) rename {android-app => android-app-core}/res/values/text_strings.xml (100%) rename {android-app => android-app-core}/res/values/text_vars.xml (100%) rename {android-app => android-app-core}/res/values/theme_gray.xml (97%) rename {android-app => android-app-core}/res/values/theme_light_blue.xml (100%) rename {android-app => android-app-core}/res/values/theme_metro_blue.xml (78%) rename {android-app => android-app-core}/res/values/theme_metro_green.xml (100%) rename {android-app => android-app-core}/res/values/theme_metro_purple.xml (100%) rename {android-app => android-app-core}/res/values/theme_violet.xml (100%) create mode 100644 android-app-core/src/main/java/org/solovyev/android/calculator/App.java rename {android-app => android-app-core}/src/main/java/org/solovyev/android/calculator/CalculatorButtons.java (97%) rename {android-app => android-app-core}/src/main/java/org/solovyev/android/calculator/CalculatorPreferences.java (100%) rename {android-app => android-app-core}/src/main/java/org/solovyev/android/calculator/DigitButtonDragProcessor.java (100%) rename {android-app => android-app-core}/src/main/java/org/solovyev/android/calculator/ParcelableCalculatorDisplayViewState.java (100%) rename {android-app => android-app-core}/src/main/java/org/solovyev/android/calculator/ParcelableCalculatorEditorViewState.java (100%) create mode 100644 android-app-core/src/main/java/org/solovyev/android/calculator/UiThreadExecutor.java rename {android-app => android-app-core}/src/main/java/org/solovyev/android/calculator/external/AndroidExternalListenersContainer.java (81%) rename {android-app => android-app-core}/src/main/java/org/solovyev/android/calculator/external/DefaultExternalCalculatorIntentHandler.java (100%) rename {android-app => android-app-core}/src/main/java/org/solovyev/android/calculator/external/ExternalCalculatorIntentHandler.java (100%) rename {android-app => android-app-core}/src/main/java/org/solovyev/android/calculator/external/ExternalCalculatorStateUpdater.java (100%) rename {android-app => android-app-core}/src/main/java/org/solovyev/android/calculator/model/AndroidCalculatorEngine.java (94%) rename {android-app => android-app-core}/src/main/java/org/solovyev/android/calculator/model/AndroidMathEntityDao.java (93%) rename {android-app => android-app-core}/src/main/java/org/solovyev/android/calculator/plot/GraphLineColor.java (100%) rename {android-app => android-app-core}/src/main/java/org/solovyev/android/calculator/view/AngleUnitsButton.java (96%) rename {android-app => android-app-core}/src/main/java/org/solovyev/android/calculator/view/NumeralBasesButton.java (96%) rename {android-app => android-app-widget}/res/layout/widget_app_button.xml (100%) rename {android-app => android-app-widget}/res/layout/widget_clear_button.xml (100%) rename {android-app => android-app-widget}/res/layout/widget_copy_button.xml (100%) rename {android-app => android-app-widget}/res/layout/widget_display.xml (100%) rename {android-app => android-app-widget}/res/layout/widget_division_button.xml (100%) rename {android-app => android-app-widget}/res/layout/widget_dot_button.xml (100%) rename {android-app => android-app-widget}/res/layout/widget_editor.xml (100%) rename {android-app => android-app-widget}/res/layout/widget_eight_digit_button.xml (100%) rename {android-app => android-app-widget}/res/layout/widget_equals_button.xml (100%) rename {android-app => android-app-widget}/res/layout/widget_erase_button.xml (100%) rename {android-app => android-app-widget}/res/layout/widget_five_digit_button.xml (100%) rename {android-app => android-app-widget}/res/layout/widget_four_digit_button.xml (100%) rename {android-app => android-app-widget}/res/layout/widget_functions_button.xml (100%) rename {android-app => android-app-widget}/res/layout/widget_history_button.xml (100%) rename {android-app => android-app-widget}/res/layout/widget_keyboard.xml (100%) rename {android-app => android-app-widget}/res/layout/widget_layout.xml (100%) rename {android-app => android-app-widget}/res/layout/widget_left_button.xml (100%) rename {android-app => android-app-widget}/res/layout/widget_like_button.xml (100%) rename {android-app => android-app-widget}/res/layout/widget_multiplication_button.xml (100%) rename {android-app => android-app-widget}/res/layout/widget_nine_digit_button.xml (100%) rename {android-app => android-app-widget}/res/layout/widget_one_digit_button.xml (100%) rename {android-app => android-app-widget}/res/layout/widget_paste_button.xml (100%) rename {android-app => android-app-widget}/res/layout/widget_percent_button.xml (100%) rename {android-app => android-app-widget}/res/layout/widget_plus_button.xml (100%) rename {android-app => android-app-widget}/res/layout/widget_power_button.xml (100%) rename {android-app => android-app-widget}/res/layout/widget_right_button.xml (100%) rename {android-app => android-app-widget}/res/layout/widget_round_brackets_button.xml (100%) rename {android-app => android-app-widget}/res/layout/widget_settings_button.xml (100%) rename {android-app => android-app-widget}/res/layout/widget_seven_digit_button.xml (100%) rename {android-app => android-app-widget}/res/layout/widget_six_digit_button.xml (100%) rename {android-app => android-app-widget}/res/layout/widget_subtraction_button.xml (100%) rename {android-app => android-app-widget}/res/layout/widget_three_digit_button.xml (100%) rename {android-app => android-app-widget}/res/layout/widget_two_digit_button.xml (100%) rename {android-app => android-app-widget}/res/layout/widget_vars_button.xml (100%) rename {android-app => android-app-widget}/res/layout/widget_zero_digit_button.xml (100%) create mode 100644 android-app-widget/res/values/colors.xml create mode 100644 android-app-widget/res/values/dimens.xml create mode 100644 android-app-widget/res/values/styles.xml rename {android-app => android-app-widget}/src/main/java/org/solovyev/android/calculator/widget/AbstractCalculatorWidgetProvider.java (99%) rename {android-app => android-app-widget}/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetConfigurationActivity.java (100%) rename {android-app => android-app-widget}/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetIntentHandler.java (100%) rename {android-app => android-app-widget}/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider.java (100%) rename {android-app => android-app-widget}/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider3x4.java (100%) rename {android-app => android-app-widget}/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider4x4.java (100%) rename {android-app => android-app-widget}/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider4x5.java (100%) rename {android-app => android-app-widget}/src/main/java/org/solovyev/android/calculator/widget/WidgetButton.java (99%) delete mode 100644 android-app/res/values/colors.xml create mode 100644 core/src/main/java/org/solovyev/common/DelayedExecutor.java diff --git a/android-app-core/pom.xml b/android-app-core/pom.xml index 6099e3b9..20d03dc7 100644 --- a/android-app-core/pom.xml +++ b/android-app-core/pom.xml @@ -17,10 +17,39 @@ apklib + org.solovyev.android calculatorpp-core + + + org.solovyev + common-core + + + + org.solovyev + common-text + + + + org.solovyev.android + android-common-all + apklib + + + + org.solovyev + jscl + + + + com.actionbarsherlock + library + apklib + + diff --git a/android-app/res/drawable-hdpi/ab_add.png b/android-app-core/res/drawable-hdpi/ab_add.png similarity index 100% rename from android-app/res/drawable-hdpi/ab_add.png rename to android-app-core/res/drawable-hdpi/ab_add.png diff --git a/android-app/res/drawable-hdpi/ab_icon.png b/android-app-core/res/drawable-hdpi/ab_icon.png similarity index 100% rename from android-app/res/drawable-hdpi/ab_icon.png rename to android-app-core/res/drawable-hdpi/ab_icon.png diff --git a/android-app/res/drawable-hdpi/ab_icon_long.png b/android-app-core/res/drawable-hdpi/ab_icon_long.png similarity index 100% rename from android-app/res/drawable-hdpi/ab_icon_long.png rename to android-app-core/res/drawable-hdpi/ab_icon_long.png diff --git a/android-app/res/drawable-hdpi/ab_settings.png b/android-app-core/res/drawable-hdpi/ab_settings.png similarity index 100% rename from android-app/res/drawable-hdpi/ab_settings.png rename to android-app-core/res/drawable-hdpi/ab_settings.png diff --git a/android-app/res/drawable-hdpi/icon.png b/android-app-core/res/drawable-hdpi/icon.png similarity index 100% rename from android-app/res/drawable-hdpi/icon.png rename to android-app-core/res/drawable-hdpi/icon.png diff --git a/android-app/res/drawable-hdpi/icon_onscreen.png b/android-app-core/res/drawable-hdpi/icon_onscreen.png similarity index 100% rename from android-app/res/drawable-hdpi/icon_onscreen.png rename to android-app-core/res/drawable-hdpi/icon_onscreen.png diff --git a/android-app/res/drawable-hdpi/kb_copy.png b/android-app-core/res/drawable-hdpi/kb_copy.png similarity index 100% rename from android-app/res/drawable-hdpi/kb_copy.png rename to android-app-core/res/drawable-hdpi/kb_copy.png diff --git a/android-app/res/drawable-hdpi/kb_delete.png b/android-app-core/res/drawable-hdpi/kb_delete.png similarity index 100% rename from android-app/res/drawable-hdpi/kb_delete.png rename to android-app-core/res/drawable-hdpi/kb_delete.png diff --git a/android-app/res/drawable-hdpi/kb_facebook.png b/android-app-core/res/drawable-hdpi/kb_facebook.png similarity index 100% rename from android-app/res/drawable-hdpi/kb_facebook.png rename to android-app-core/res/drawable-hdpi/kb_facebook.png diff --git a/android-app/res/drawable-hdpi/kb_heart.png b/android-app-core/res/drawable-hdpi/kb_heart.png similarity index 100% rename from android-app/res/drawable-hdpi/kb_heart.png rename to android-app-core/res/drawable-hdpi/kb_heart.png diff --git a/android-app/res/drawable-hdpi/kb_logo.png b/android-app-core/res/drawable-hdpi/kb_logo.png similarity index 100% rename from android-app/res/drawable-hdpi/kb_logo.png rename to android-app-core/res/drawable-hdpi/kb_logo.png diff --git a/android-app/res/drawable-hdpi/kb_paste.png b/android-app-core/res/drawable-hdpi/kb_paste.png similarity index 100% rename from android-app/res/drawable-hdpi/kb_paste.png rename to android-app-core/res/drawable-hdpi/kb_paste.png diff --git a/android-app/res/drawable-hdpi/kb_settings.png b/android-app-core/res/drawable-hdpi/kb_settings.png similarity index 100% rename from android-app/res/drawable-hdpi/kb_settings.png rename to android-app-core/res/drawable-hdpi/kb_settings.png diff --git a/android-app/res/drawable-hdpi/logo.png b/android-app-core/res/drawable-hdpi/logo.png similarity index 100% rename from android-app/res/drawable-hdpi/logo.png rename to android-app-core/res/drawable-hdpi/logo.png diff --git a/android-app/res/drawable-ldpi/ab_add.png b/android-app-core/res/drawable-ldpi/ab_add.png similarity index 100% rename from android-app/res/drawable-ldpi/ab_add.png rename to android-app-core/res/drawable-ldpi/ab_add.png diff --git a/android-app/res/drawable-ldpi/ab_icon.png b/android-app-core/res/drawable-ldpi/ab_icon.png similarity index 100% rename from android-app/res/drawable-ldpi/ab_icon.png rename to android-app-core/res/drawable-ldpi/ab_icon.png diff --git a/android-app/res/drawable-ldpi/ab_settings.png b/android-app-core/res/drawable-ldpi/ab_settings.png similarity index 100% rename from android-app/res/drawable-ldpi/ab_settings.png rename to android-app-core/res/drawable-ldpi/ab_settings.png diff --git a/android-app/res/drawable-ldpi/icon.png b/android-app-core/res/drawable-ldpi/icon.png similarity index 100% rename from android-app/res/drawable-ldpi/icon.png rename to android-app-core/res/drawable-ldpi/icon.png diff --git a/android-app/res/drawable-ldpi/icon_onscreen.png b/android-app-core/res/drawable-ldpi/icon_onscreen.png similarity index 100% rename from android-app/res/drawable-ldpi/icon_onscreen.png rename to android-app-core/res/drawable-ldpi/icon_onscreen.png diff --git a/android-app/res/drawable-ldpi/kb_copy.png b/android-app-core/res/drawable-ldpi/kb_copy.png similarity index 100% rename from android-app/res/drawable-ldpi/kb_copy.png rename to android-app-core/res/drawable-ldpi/kb_copy.png diff --git a/android-app/res/drawable-ldpi/kb_delete.png b/android-app-core/res/drawable-ldpi/kb_delete.png similarity index 100% rename from android-app/res/drawable-ldpi/kb_delete.png rename to android-app-core/res/drawable-ldpi/kb_delete.png diff --git a/android-app/res/drawable-ldpi/kb_facebook.png b/android-app-core/res/drawable-ldpi/kb_facebook.png similarity index 100% rename from android-app/res/drawable-ldpi/kb_facebook.png rename to android-app-core/res/drawable-ldpi/kb_facebook.png diff --git a/android-app/res/drawable-ldpi/kb_heart.png b/android-app-core/res/drawable-ldpi/kb_heart.png similarity index 100% rename from android-app/res/drawable-ldpi/kb_heart.png rename to android-app-core/res/drawable-ldpi/kb_heart.png diff --git a/android-app/res/drawable-ldpi/kb_logo.png b/android-app-core/res/drawable-ldpi/kb_logo.png similarity index 100% rename from android-app/res/drawable-ldpi/kb_logo.png rename to android-app-core/res/drawable-ldpi/kb_logo.png diff --git a/android-app/res/drawable-ldpi/kb_paste.png b/android-app-core/res/drawable-ldpi/kb_paste.png similarity index 100% rename from android-app/res/drawable-ldpi/kb_paste.png rename to android-app-core/res/drawable-ldpi/kb_paste.png diff --git a/android-app/res/drawable-ldpi/kb_settings.png b/android-app-core/res/drawable-ldpi/kb_settings.png similarity index 100% rename from android-app/res/drawable-ldpi/kb_settings.png rename to android-app-core/res/drawable-ldpi/kb_settings.png diff --git a/android-app/res/drawable-ldpi/logo.png b/android-app-core/res/drawable-ldpi/logo.png similarity index 100% rename from android-app/res/drawable-ldpi/logo.png rename to android-app-core/res/drawable-ldpi/logo.png diff --git a/android-app/res/drawable-mdpi/ab_add.png b/android-app-core/res/drawable-mdpi/ab_add.png similarity index 100% rename from android-app/res/drawable-mdpi/ab_add.png rename to android-app-core/res/drawable-mdpi/ab_add.png diff --git a/android-app/res/drawable-mdpi/ab_icon.png b/android-app-core/res/drawable-mdpi/ab_icon.png similarity index 100% rename from android-app/res/drawable-mdpi/ab_icon.png rename to android-app-core/res/drawable-mdpi/ab_icon.png diff --git a/android-app/res/drawable-mdpi/ab_settings.png b/android-app-core/res/drawable-mdpi/ab_settings.png similarity index 100% rename from android-app/res/drawable-mdpi/ab_settings.png rename to android-app-core/res/drawable-mdpi/ab_settings.png diff --git a/android-app/res/drawable-mdpi/icon.png b/android-app-core/res/drawable-mdpi/icon.png similarity index 100% rename from android-app/res/drawable-mdpi/icon.png rename to android-app-core/res/drawable-mdpi/icon.png diff --git a/android-app/res/drawable-mdpi/icon_onscreen.png b/android-app-core/res/drawable-mdpi/icon_onscreen.png similarity index 100% rename from android-app/res/drawable-mdpi/icon_onscreen.png rename to android-app-core/res/drawable-mdpi/icon_onscreen.png diff --git a/android-app/res/drawable-mdpi/kb_copy.png b/android-app-core/res/drawable-mdpi/kb_copy.png similarity index 100% rename from android-app/res/drawable-mdpi/kb_copy.png rename to android-app-core/res/drawable-mdpi/kb_copy.png diff --git a/android-app/res/drawable-mdpi/kb_delete.png b/android-app-core/res/drawable-mdpi/kb_delete.png similarity index 100% rename from android-app/res/drawable-mdpi/kb_delete.png rename to android-app-core/res/drawable-mdpi/kb_delete.png diff --git a/android-app/res/drawable-mdpi/kb_facebook.png b/android-app-core/res/drawable-mdpi/kb_facebook.png similarity index 100% rename from android-app/res/drawable-mdpi/kb_facebook.png rename to android-app-core/res/drawable-mdpi/kb_facebook.png diff --git a/android-app/res/drawable-mdpi/kb_heart.png b/android-app-core/res/drawable-mdpi/kb_heart.png similarity index 100% rename from android-app/res/drawable-mdpi/kb_heart.png rename to android-app-core/res/drawable-mdpi/kb_heart.png diff --git a/android-app/res/drawable-mdpi/kb_logo.png b/android-app-core/res/drawable-mdpi/kb_logo.png similarity index 100% rename from android-app/res/drawable-mdpi/kb_logo.png rename to android-app-core/res/drawable-mdpi/kb_logo.png diff --git a/android-app/res/drawable-mdpi/kb_paste.png b/android-app-core/res/drawable-mdpi/kb_paste.png similarity index 100% rename from android-app/res/drawable-mdpi/kb_paste.png rename to android-app-core/res/drawable-mdpi/kb_paste.png diff --git a/android-app/res/drawable-mdpi/kb_settings.png b/android-app-core/res/drawable-mdpi/kb_settings.png similarity index 100% rename from android-app/res/drawable-mdpi/kb_settings.png rename to android-app-core/res/drawable-mdpi/kb_settings.png diff --git a/android-app/res/drawable-mdpi/logo.png b/android-app-core/res/drawable-mdpi/logo.png similarity index 100% rename from android-app/res/drawable-mdpi/logo.png rename to android-app-core/res/drawable-mdpi/logo.png diff --git a/android-app/res/drawable-nodpi/cpp_onscreen_button_close.png b/android-app-core/res/drawable-nodpi/cpp_onscreen_button_close.png similarity index 100% rename from android-app/res/drawable-nodpi/cpp_onscreen_button_close.png rename to android-app-core/res/drawable-nodpi/cpp_onscreen_button_close.png diff --git a/android-app/res/drawable-nodpi/cpp_onscreen_button_fold.png b/android-app-core/res/drawable-nodpi/cpp_onscreen_button_fold.png similarity index 100% rename from android-app/res/drawable-nodpi/cpp_onscreen_button_fold.png rename to android-app-core/res/drawable-nodpi/cpp_onscreen_button_fold.png diff --git a/android-app/res/drawable-nodpi/cpp_onscreen_button_minimize.png b/android-app-core/res/drawable-nodpi/cpp_onscreen_button_minimize.png similarity index 100% rename from android-app/res/drawable-nodpi/cpp_onscreen_button_minimize.png rename to android-app-core/res/drawable-nodpi/cpp_onscreen_button_minimize.png diff --git a/android-app/res/drawable-nodpi/cpp_onscreen_header_logo.png b/android-app-core/res/drawable-nodpi/cpp_onscreen_header_logo.png similarity index 100% rename from android-app/res/drawable-nodpi/cpp_onscreen_header_logo.png rename to android-app-core/res/drawable-nodpi/cpp_onscreen_header_logo.png diff --git a/android-app/res/drawable-nodpi/default_abs__ab_transparent_dark_holo.9.png b/android-app-core/res/drawable-nodpi/default_abs__ab_transparent_dark_holo.9.png similarity index 100% rename from android-app/res/drawable-nodpi/default_abs__ab_transparent_dark_holo.9.png rename to android-app-core/res/drawable-nodpi/default_abs__ab_transparent_dark_holo.9.png diff --git a/android-app/res/drawable-nodpi/default_abs__btn_cab_done_default_holo_dark.9.png b/android-app-core/res/drawable-nodpi/default_abs__btn_cab_done_default_holo_dark.9.png similarity index 100% rename from android-app/res/drawable-nodpi/default_abs__btn_cab_done_default_holo_dark.9.png rename to android-app-core/res/drawable-nodpi/default_abs__btn_cab_done_default_holo_dark.9.png diff --git a/android-app/res/drawable-nodpi/default_abs__btn_cab_done_focused_holo_dark.9.png b/android-app-core/res/drawable-nodpi/default_abs__btn_cab_done_focused_holo_dark.9.png similarity index 100% rename from android-app/res/drawable-nodpi/default_abs__btn_cab_done_focused_holo_dark.9.png rename to android-app-core/res/drawable-nodpi/default_abs__btn_cab_done_focused_holo_dark.9.png diff --git a/android-app/res/drawable-nodpi/default_abs__btn_cab_done_pressed_holo_dark.9.png b/android-app-core/res/drawable-nodpi/default_abs__btn_cab_done_pressed_holo_dark.9.png similarity index 100% rename from android-app/res/drawable-nodpi/default_abs__btn_cab_done_pressed_holo_dark.9.png rename to android-app-core/res/drawable-nodpi/default_abs__btn_cab_done_pressed_holo_dark.9.png diff --git a/android-app/res/drawable-nodpi/default_abs__list_focused_holo.9.png b/android-app-core/res/drawable-nodpi/default_abs__list_focused_holo.9.png similarity index 100% rename from android-app/res/drawable-nodpi/default_abs__list_focused_holo.9.png rename to android-app-core/res/drawable-nodpi/default_abs__list_focused_holo.9.png diff --git a/android-app/res/drawable-nodpi/default_abs__list_longpressed_holo.9.png b/android-app-core/res/drawable-nodpi/default_abs__list_longpressed_holo.9.png similarity index 100% rename from android-app/res/drawable-nodpi/default_abs__list_longpressed_holo.9.png rename to android-app-core/res/drawable-nodpi/default_abs__list_longpressed_holo.9.png diff --git a/android-app/res/drawable-nodpi/default_abs__list_pressed_holo_dark.9.png b/android-app-core/res/drawable-nodpi/default_abs__list_pressed_holo_dark.9.png similarity index 100% rename from android-app/res/drawable-nodpi/default_abs__list_pressed_holo_dark.9.png rename to android-app-core/res/drawable-nodpi/default_abs__list_pressed_holo_dark.9.png diff --git a/android-app/res/drawable-nodpi/default_abs__spinner_ab_focused_holo_dark.9.png b/android-app-core/res/drawable-nodpi/default_abs__spinner_ab_focused_holo_dark.9.png similarity index 100% rename from android-app/res/drawable-nodpi/default_abs__spinner_ab_focused_holo_dark.9.png rename to android-app-core/res/drawable-nodpi/default_abs__spinner_ab_focused_holo_dark.9.png diff --git a/android-app/res/drawable-nodpi/default_abs__spinner_ab_pressed_holo_dark.9.png b/android-app-core/res/drawable-nodpi/default_abs__spinner_ab_pressed_holo_dark.9.png similarity index 100% rename from android-app/res/drawable-nodpi/default_abs__spinner_ab_pressed_holo_dark.9.png rename to android-app-core/res/drawable-nodpi/default_abs__spinner_ab_pressed_holo_dark.9.png diff --git a/android-app/res/drawable-nodpi/default_abs__tab_selected_focused_holo.9.png b/android-app-core/res/drawable-nodpi/default_abs__tab_selected_focused_holo.9.png similarity index 100% rename from android-app/res/drawable-nodpi/default_abs__tab_selected_focused_holo.9.png rename to android-app-core/res/drawable-nodpi/default_abs__tab_selected_focused_holo.9.png diff --git a/android-app/res/drawable-nodpi/default_abs__tab_selected_holo.9.png b/android-app-core/res/drawable-nodpi/default_abs__tab_selected_holo.9.png similarity index 100% rename from android-app/res/drawable-nodpi/default_abs__tab_selected_holo.9.png rename to android-app-core/res/drawable-nodpi/default_abs__tab_selected_holo.9.png diff --git a/android-app/res/drawable-nodpi/default_abs__tab_selected_pressed_holo.9.png b/android-app-core/res/drawable-nodpi/default_abs__tab_selected_pressed_holo.9.png similarity index 100% rename from android-app/res/drawable-nodpi/default_abs__tab_selected_pressed_holo.9.png rename to android-app-core/res/drawable-nodpi/default_abs__tab_selected_pressed_holo.9.png diff --git a/android-app/res/drawable-nodpi/default_abs__tab_unselected_pressed_holo.9.png b/android-app-core/res/drawable-nodpi/default_abs__tab_unselected_pressed_holo.9.png similarity index 100% rename from android-app/res/drawable-nodpi/default_abs__tab_unselected_pressed_holo.9.png rename to android-app-core/res/drawable-nodpi/default_abs__tab_unselected_pressed_holo.9.png diff --git a/android-app/res/drawable-nodpi/metro_blue_abs__ab_transparent_dark_holo.9.png b/android-app-core/res/drawable-nodpi/metro_blue_abs__ab_transparent_dark_holo.9.png similarity index 100% rename from android-app/res/drawable-nodpi/metro_blue_abs__ab_transparent_dark_holo.9.png rename to android-app-core/res/drawable-nodpi/metro_blue_abs__ab_transparent_dark_holo.9.png diff --git a/android-app/res/drawable-nodpi/metro_blue_abs__list_focused_holo.9.png b/android-app-core/res/drawable-nodpi/metro_blue_abs__list_focused_holo.9.png similarity index 100% rename from android-app/res/drawable-nodpi/metro_blue_abs__list_focused_holo.9.png rename to android-app-core/res/drawable-nodpi/metro_blue_abs__list_focused_holo.9.png diff --git a/android-app/res/drawable-nodpi/metro_blue_abs__list_pressed_holo_dark.9.png b/android-app-core/res/drawable-nodpi/metro_blue_abs__list_pressed_holo_dark.9.png similarity index 100% rename from android-app/res/drawable-nodpi/metro_blue_abs__list_pressed_holo_dark.9.png rename to android-app-core/res/drawable-nodpi/metro_blue_abs__list_pressed_holo_dark.9.png diff --git a/android-app/res/drawable-nodpi/metro_blue_abs__tab_selected_focused_holo.9.png b/android-app-core/res/drawable-nodpi/metro_blue_abs__tab_selected_focused_holo.9.png similarity index 100% rename from android-app/res/drawable-nodpi/metro_blue_abs__tab_selected_focused_holo.9.png rename to android-app-core/res/drawable-nodpi/metro_blue_abs__tab_selected_focused_holo.9.png diff --git a/android-app/res/drawable-nodpi/metro_blue_abs__tab_selected_holo.9.png b/android-app-core/res/drawable-nodpi/metro_blue_abs__tab_selected_holo.9.png similarity index 100% rename from android-app/res/drawable-nodpi/metro_blue_abs__tab_selected_holo.9.png rename to android-app-core/res/drawable-nodpi/metro_blue_abs__tab_selected_holo.9.png diff --git a/android-app/res/drawable-nodpi/metro_blue_abs__tab_selected_pressed_holo.9.png b/android-app-core/res/drawable-nodpi/metro_blue_abs__tab_selected_pressed_holo.9.png similarity index 100% rename from android-app/res/drawable-nodpi/metro_blue_abs__tab_selected_pressed_holo.9.png rename to android-app-core/res/drawable-nodpi/metro_blue_abs__tab_selected_pressed_holo.9.png diff --git a/android-app/res/drawable-nodpi/metro_blue_abs__tab_unselected_pressed_holo.9.png b/android-app-core/res/drawable-nodpi/metro_blue_abs__tab_unselected_pressed_holo.9.png similarity index 100% rename from android-app/res/drawable-nodpi/metro_blue_abs__tab_unselected_pressed_holo.9.png rename to android-app-core/res/drawable-nodpi/metro_blue_abs__tab_unselected_pressed_holo.9.png diff --git a/android-app/res/drawable-nodpi/widget_preview.png b/android-app-core/res/drawable-nodpi/widget_preview.png similarity index 100% rename from android-app/res/drawable-nodpi/widget_preview.png rename to android-app-core/res/drawable-nodpi/widget_preview.png diff --git a/android-app/res/drawable-xhdpi/ab_add.png b/android-app-core/res/drawable-xhdpi/ab_add.png similarity index 100% rename from android-app/res/drawable-xhdpi/ab_add.png rename to android-app-core/res/drawable-xhdpi/ab_add.png diff --git a/android-app/res/drawable-xhdpi/ab_icon.png b/android-app-core/res/drawable-xhdpi/ab_icon.png similarity index 100% rename from android-app/res/drawable-xhdpi/ab_icon.png rename to android-app-core/res/drawable-xhdpi/ab_icon.png diff --git a/android-app/res/drawable-xhdpi/ab_settings.png b/android-app-core/res/drawable-xhdpi/ab_settings.png similarity index 100% rename from android-app/res/drawable-xhdpi/ab_settings.png rename to android-app-core/res/drawable-xhdpi/ab_settings.png diff --git a/android-app/res/drawable-xhdpi/ic_menu_preferences.png b/android-app-core/res/drawable-xhdpi/ic_menu_preferences.png similarity index 100% rename from android-app/res/drawable-xhdpi/ic_menu_preferences.png rename to android-app-core/res/drawable-xhdpi/ic_menu_preferences.png diff --git a/android-app/res/drawable-xhdpi/icon.png b/android-app-core/res/drawable-xhdpi/icon.png similarity index 100% rename from android-app/res/drawable-xhdpi/icon.png rename to android-app-core/res/drawable-xhdpi/icon.png diff --git a/android-app/res/drawable-xhdpi/icon_onscreen.png b/android-app-core/res/drawable-xhdpi/icon_onscreen.png similarity index 100% rename from android-app/res/drawable-xhdpi/icon_onscreen.png rename to android-app-core/res/drawable-xhdpi/icon_onscreen.png diff --git a/android-app/res/drawable-xhdpi/kb_copy.png b/android-app-core/res/drawable-xhdpi/kb_copy.png similarity index 100% rename from android-app/res/drawable-xhdpi/kb_copy.png rename to android-app-core/res/drawable-xhdpi/kb_copy.png diff --git a/android-app/res/drawable-xhdpi/kb_delete.png b/android-app-core/res/drawable-xhdpi/kb_delete.png similarity index 100% rename from android-app/res/drawable-xhdpi/kb_delete.png rename to android-app-core/res/drawable-xhdpi/kb_delete.png diff --git a/android-app/res/drawable-xhdpi/kb_facebook.png b/android-app-core/res/drawable-xhdpi/kb_facebook.png similarity index 100% rename from android-app/res/drawable-xhdpi/kb_facebook.png rename to android-app-core/res/drawable-xhdpi/kb_facebook.png diff --git a/android-app/res/drawable-xhdpi/kb_heart.png b/android-app-core/res/drawable-xhdpi/kb_heart.png similarity index 100% rename from android-app/res/drawable-xhdpi/kb_heart.png rename to android-app-core/res/drawable-xhdpi/kb_heart.png diff --git a/android-app/res/drawable-xhdpi/kb_logo.png b/android-app-core/res/drawable-xhdpi/kb_logo.png similarity index 100% rename from android-app/res/drawable-xhdpi/kb_logo.png rename to android-app-core/res/drawable-xhdpi/kb_logo.png diff --git a/android-app/res/drawable-xhdpi/kb_paste.png b/android-app-core/res/drawable-xhdpi/kb_paste.png similarity index 100% rename from android-app/res/drawable-xhdpi/kb_paste.png rename to android-app-core/res/drawable-xhdpi/kb_paste.png diff --git a/android-app/res/drawable-xhdpi/kb_settings.png b/android-app-core/res/drawable-xhdpi/kb_settings.png similarity index 100% rename from android-app/res/drawable-xhdpi/kb_settings.png rename to android-app-core/res/drawable-xhdpi/kb_settings.png diff --git a/android-app/res/drawable-xhdpi/logo.png b/android-app-core/res/drawable-xhdpi/logo.png similarity index 100% rename from android-app/res/drawable-xhdpi/logo.png rename to android-app-core/res/drawable-xhdpi/logo.png diff --git a/android-app/res/drawable-xlarge-hdpi/kb_copy.png b/android-app-core/res/drawable-xlarge-hdpi/kb_copy.png similarity index 100% rename from android-app/res/drawable-xlarge-hdpi/kb_copy.png rename to android-app-core/res/drawable-xlarge-hdpi/kb_copy.png diff --git a/android-app/res/drawable-xlarge-hdpi/kb_delete.png b/android-app-core/res/drawable-xlarge-hdpi/kb_delete.png similarity index 100% rename from android-app/res/drawable-xlarge-hdpi/kb_delete.png rename to android-app-core/res/drawable-xlarge-hdpi/kb_delete.png diff --git a/android-app/res/drawable-xlarge-hdpi/kb_facebook.png b/android-app-core/res/drawable-xlarge-hdpi/kb_facebook.png similarity index 100% rename from android-app/res/drawable-xlarge-hdpi/kb_facebook.png rename to android-app-core/res/drawable-xlarge-hdpi/kb_facebook.png diff --git a/android-app/res/drawable-xlarge-hdpi/kb_heart.png b/android-app-core/res/drawable-xlarge-hdpi/kb_heart.png similarity index 100% rename from android-app/res/drawable-xlarge-hdpi/kb_heart.png rename to android-app-core/res/drawable-xlarge-hdpi/kb_heart.png diff --git a/android-app/res/drawable-xlarge-hdpi/kb_logo.png b/android-app-core/res/drawable-xlarge-hdpi/kb_logo.png similarity index 100% rename from android-app/res/drawable-xlarge-hdpi/kb_logo.png rename to android-app-core/res/drawable-xlarge-hdpi/kb_logo.png diff --git a/android-app/res/drawable-xlarge-hdpi/kb_paste.png b/android-app-core/res/drawable-xlarge-hdpi/kb_paste.png similarity index 100% rename from android-app/res/drawable-xlarge-hdpi/kb_paste.png rename to android-app-core/res/drawable-xlarge-hdpi/kb_paste.png diff --git a/android-app/res/drawable-xlarge-hdpi/kb_settings.png b/android-app-core/res/drawable-xlarge-hdpi/kb_settings.png similarity index 100% rename from android-app/res/drawable-xlarge-hdpi/kb_settings.png rename to android-app-core/res/drawable-xlarge-hdpi/kb_settings.png diff --git a/android-app/res/drawable/blue_button.xml b/android-app-core/res/drawable/blue_button.xml similarity index 100% rename from android-app/res/drawable/blue_button.xml rename to android-app-core/res/drawable/blue_button.xml diff --git a/android-app/res/drawable/blue_button_dark.xml b/android-app-core/res/drawable/blue_button_dark.xml similarity index 100% rename from android-app/res/drawable/blue_button_dark.xml rename to android-app-core/res/drawable/blue_button_dark.xml diff --git a/android-app/res/drawable/blue_button_dark_shape.xml b/android-app-core/res/drawable/blue_button_dark_shape.xml similarity index 100% rename from android-app/res/drawable/blue_button_dark_shape.xml rename to android-app-core/res/drawable/blue_button_dark_shape.xml diff --git a/android-app/res/drawable/blue_button_shape.xml b/android-app-core/res/drawable/blue_button_shape.xml similarity index 100% rename from android-app/res/drawable/blue_button_shape.xml rename to android-app-core/res/drawable/blue_button_shape.xml diff --git a/android-app/res/drawable/default_abs__btn_cab_done_holo_dark.xml b/android-app-core/res/drawable/default_abs__btn_cab_done_holo_dark.xml similarity index 100% rename from android-app/res/drawable/default_abs__btn_cab_done_holo_dark.xml rename to android-app-core/res/drawable/default_abs__btn_cab_done_holo_dark.xml diff --git a/android-app/res/drawable/default_abs__item_background_holo_dark.xml b/android-app-core/res/drawable/default_abs__item_background_holo_dark.xml similarity index 100% rename from android-app/res/drawable/default_abs__item_background_holo_dark.xml rename to android-app-core/res/drawable/default_abs__item_background_holo_dark.xml diff --git a/android-app/res/drawable/default_abs__list_selector_background_transition_holo_dark.xml b/android-app-core/res/drawable/default_abs__list_selector_background_transition_holo_dark.xml similarity index 100% rename from android-app/res/drawable/default_abs__list_selector_background_transition_holo_dark.xml rename to android-app-core/res/drawable/default_abs__list_selector_background_transition_holo_dark.xml diff --git a/android-app/res/drawable/default_abs__list_selector_holo_dark.xml b/android-app-core/res/drawable/default_abs__list_selector_holo_dark.xml similarity index 100% rename from android-app/res/drawable/default_abs__list_selector_holo_dark.xml rename to android-app-core/res/drawable/default_abs__list_selector_holo_dark.xml diff --git a/android-app/res/drawable/default_abs__spinner_ab_holo_dark.xml b/android-app-core/res/drawable/default_abs__spinner_ab_holo_dark.xml similarity index 100% rename from android-app/res/drawable/default_abs__spinner_ab_holo_dark.xml rename to android-app-core/res/drawable/default_abs__spinner_ab_holo_dark.xml diff --git a/android-app/res/drawable/default_abs__tab_indicator_ab_holo.xml b/android-app-core/res/drawable/default_abs__tab_indicator_ab_holo.xml similarity index 100% rename from android-app/res/drawable/default_abs__tab_indicator_ab_holo.xml rename to android-app-core/res/drawable/default_abs__tab_indicator_ab_holo.xml diff --git a/android-app/res/drawable/gray_button.xml b/android-app-core/res/drawable/gray_button.xml similarity index 100% rename from android-app/res/drawable/gray_button.xml rename to android-app-core/res/drawable/gray_button.xml diff --git a/android-app/res/drawable/gray_button_dark.xml b/android-app-core/res/drawable/gray_button_dark.xml similarity index 100% rename from android-app/res/drawable/gray_button_dark.xml rename to android-app-core/res/drawable/gray_button_dark.xml diff --git a/android-app/res/drawable/gray_button_dark_shape.xml b/android-app-core/res/drawable/gray_button_dark_shape.xml similarity index 100% rename from android-app/res/drawable/gray_button_dark_shape.xml rename to android-app-core/res/drawable/gray_button_dark_shape.xml diff --git a/android-app/res/drawable/gray_button_shape.xml b/android-app-core/res/drawable/gray_button_shape.xml similarity index 100% rename from android-app/res/drawable/gray_button_shape.xml rename to android-app-core/res/drawable/gray_button_shape.xml diff --git a/android-app/res/drawable/metro_blue_abs__tab_indicator_ab_holo.xml b/android-app-core/res/drawable/metro_blue_abs__tab_indicator_ab_holo.xml similarity index 100% rename from android-app/res/drawable/metro_blue_abs__tab_indicator_ab_holo.xml rename to android-app-core/res/drawable/metro_blue_abs__tab_indicator_ab_holo.xml diff --git a/android-app/res/drawable/metro_blue_button.xml b/android-app-core/res/drawable/metro_blue_button.xml similarity index 100% rename from android-app/res/drawable/metro_blue_button.xml rename to android-app-core/res/drawable/metro_blue_button.xml diff --git a/android-app/res/drawable/metro_blue_button_shape.xml b/android-app-core/res/drawable/metro_blue_button_shape.xml similarity index 100% rename from android-app/res/drawable/metro_blue_button_shape.xml rename to android-app-core/res/drawable/metro_blue_button_shape.xml diff --git a/android-app/res/drawable/metro_blue_list_item.xml b/android-app-core/res/drawable/metro_blue_list_item.xml similarity index 100% rename from android-app/res/drawable/metro_blue_list_item.xml rename to android-app-core/res/drawable/metro_blue_list_item.xml diff --git a/android-app/res/drawable/metro_button_dark.xml b/android-app-core/res/drawable/metro_button_dark.xml similarity index 100% rename from android-app/res/drawable/metro_button_dark.xml rename to android-app-core/res/drawable/metro_button_dark.xml diff --git a/android-app/res/drawable/metro_button_dark_shape.xml b/android-app-core/res/drawable/metro_button_dark_shape.xml similarity index 100% rename from android-app/res/drawable/metro_button_dark_shape.xml rename to android-app-core/res/drawable/metro_button_dark_shape.xml diff --git a/android-app/res/drawable/metro_button_green.xml b/android-app-core/res/drawable/metro_button_green.xml similarity index 100% rename from android-app/res/drawable/metro_button_green.xml rename to android-app-core/res/drawable/metro_button_green.xml diff --git a/android-app/res/drawable/metro_button_green_shape.xml b/android-app-core/res/drawable/metro_button_green_shape.xml similarity index 100% rename from android-app/res/drawable/metro_button_green_shape.xml rename to android-app-core/res/drawable/metro_button_green_shape.xml diff --git a/android-app/res/drawable/metro_button_light.xml b/android-app-core/res/drawable/metro_button_light.xml similarity index 100% rename from android-app/res/drawable/metro_button_light.xml rename to android-app-core/res/drawable/metro_button_light.xml diff --git a/android-app/res/drawable/metro_button_light_shape.xml b/android-app-core/res/drawable/metro_button_light_shape.xml similarity index 100% rename from android-app/res/drawable/metro_button_light_shape.xml rename to android-app-core/res/drawable/metro_button_light_shape.xml diff --git a/android-app/res/drawable/metro_button_pressed.xml b/android-app-core/res/drawable/metro_button_pressed.xml similarity index 100% rename from android-app/res/drawable/metro_button_pressed.xml rename to android-app-core/res/drawable/metro_button_pressed.xml diff --git a/android-app/res/drawable/metro_button_purple.xml b/android-app-core/res/drawable/metro_button_purple.xml similarity index 100% rename from android-app/res/drawable/metro_button_purple.xml rename to android-app-core/res/drawable/metro_button_purple.xml diff --git a/android-app/res/drawable/metro_button_purple_shape.xml b/android-app-core/res/drawable/metro_button_purple_shape.xml similarity index 100% rename from android-app/res/drawable/metro_button_purple_shape.xml rename to android-app-core/res/drawable/metro_button_purple_shape.xml diff --git a/android-app/res/drawable/metro_green_list_item.xml b/android-app-core/res/drawable/metro_green_list_item.xml similarity index 100% rename from android-app/res/drawable/metro_green_list_item.xml rename to android-app-core/res/drawable/metro_green_list_item.xml diff --git a/android-app/res/drawable/metro_purple_list_item.xml b/android-app-core/res/drawable/metro_purple_list_item.xml similarity index 100% rename from android-app/res/drawable/metro_purple_list_item.xml rename to android-app-core/res/drawable/metro_purple_list_item.xml diff --git a/android-app/res/drawable/pane_background.xml b/android-app-core/res/drawable/pane_background.xml similarity index 100% rename from android-app/res/drawable/pane_background.xml rename to android-app-core/res/drawable/pane_background.xml diff --git a/android-app/res/drawable/violet_button.xml b/android-app-core/res/drawable/violet_button.xml similarity index 100% rename from android-app/res/drawable/violet_button.xml rename to android-app-core/res/drawable/violet_button.xml diff --git a/android-app/res/drawable/violet_button_dark.xml b/android-app-core/res/drawable/violet_button_dark.xml similarity index 100% rename from android-app/res/drawable/violet_button_dark.xml rename to android-app-core/res/drawable/violet_button_dark.xml diff --git a/android-app/res/drawable/violet_button_dark_shape.xml b/android-app-core/res/drawable/violet_button_dark_shape.xml similarity index 100% rename from android-app/res/drawable/violet_button_dark_shape.xml rename to android-app-core/res/drawable/violet_button_dark_shape.xml diff --git a/android-app/res/drawable/violet_button_shape.xml b/android-app-core/res/drawable/violet_button_shape.xml similarity index 100% rename from android-app/res/drawable/violet_button_shape.xml rename to android-app-core/res/drawable/violet_button_shape.xml diff --git a/android-app-core/res/layout/main_calculator.xml b/android-app-core/res/layout/main_calculator.xml new file mode 100644 index 00000000..db7c950f --- /dev/null +++ b/android-app-core/res/layout/main_calculator.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android-app-core/res/layout/main_calculator_mobile.xml b/android-app-core/res/layout/main_calculator_mobile.xml new file mode 100644 index 00000000..db7c950f --- /dev/null +++ b/android-app-core/res/layout/main_calculator_mobile.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android-app/res/values-es/text_about.xml b/android-app-core/res/values-es/text_about.xml similarity index 100% rename from android-app/res/values-es/text_about.xml rename to android-app-core/res/values-es/text_about.xml diff --git a/android-app/res/values-es/text_functions.xml b/android-app-core/res/values-es/text_functions.xml similarity index 100% rename from android-app/res/values-es/text_functions.xml rename to android-app-core/res/values-es/text_functions.xml diff --git a/android-app/res/values-es/text_help.xml b/android-app-core/res/values-es/text_help.xml similarity index 100% rename from android-app/res/values-es/text_help.xml rename to android-app-core/res/values-es/text_help.xml diff --git a/android-app/res/values-es/text_operators.xml b/android-app-core/res/values-es/text_operators.xml similarity index 100% rename from android-app/res/values-es/text_operators.xml rename to android-app-core/res/values-es/text_operators.xml diff --git a/android-app/res/values-es/text_strings.xml b/android-app-core/res/values-es/text_strings.xml similarity index 100% rename from android-app/res/values-es/text_strings.xml rename to android-app-core/res/values-es/text_strings.xml diff --git a/android-app/res/values-es/text_vars.xml b/android-app-core/res/values-es/text_vars.xml similarity index 100% rename from android-app/res/values-es/text_vars.xml rename to android-app-core/res/values-es/text_vars.xml diff --git a/android-app/res/values-it/text_about.xml b/android-app-core/res/values-it/text_about.xml similarity index 100% rename from android-app/res/values-it/text_about.xml rename to android-app-core/res/values-it/text_about.xml diff --git a/android-app/res/values-it/text_functions.xml b/android-app-core/res/values-it/text_functions.xml similarity index 100% rename from android-app/res/values-it/text_functions.xml rename to android-app-core/res/values-it/text_functions.xml diff --git a/android-app/res/values-it/text_help.xml b/android-app-core/res/values-it/text_help.xml similarity index 100% rename from android-app/res/values-it/text_help.xml rename to android-app-core/res/values-it/text_help.xml diff --git a/android-app/res/values-it/text_operators.xml b/android-app-core/res/values-it/text_operators.xml similarity index 100% rename from android-app/res/values-it/text_operators.xml rename to android-app-core/res/values-it/text_operators.xml diff --git a/android-app/res/values-it/text_strings.xml b/android-app-core/res/values-it/text_strings.xml similarity index 100% rename from android-app/res/values-it/text_strings.xml rename to android-app-core/res/values-it/text_strings.xml diff --git a/android-app/res/values-it/text_vars.xml b/android-app-core/res/values-it/text_vars.xml similarity index 100% rename from android-app/res/values-it/text_vars.xml rename to android-app-core/res/values-it/text_vars.xml diff --git a/android-app/res/values-ru/text_about.xml b/android-app-core/res/values-ru/text_about.xml similarity index 100% rename from android-app/res/values-ru/text_about.xml rename to android-app-core/res/values-ru/text_about.xml diff --git a/android-app/res/values-ru/text_functions.xml b/android-app-core/res/values-ru/text_functions.xml similarity index 100% rename from android-app/res/values-ru/text_functions.xml rename to android-app-core/res/values-ru/text_functions.xml diff --git a/android-app/res/values-ru/text_help.xml b/android-app-core/res/values-ru/text_help.xml similarity index 100% rename from android-app/res/values-ru/text_help.xml rename to android-app-core/res/values-ru/text_help.xml diff --git a/android-app/res/values-ru/text_operators.xml b/android-app-core/res/values-ru/text_operators.xml similarity index 100% rename from android-app/res/values-ru/text_operators.xml rename to android-app-core/res/values-ru/text_operators.xml diff --git a/android-app/res/values-ru/text_preferences.xml b/android-app-core/res/values-ru/text_preferences.xml similarity index 100% rename from android-app/res/values-ru/text_preferences.xml rename to android-app-core/res/values-ru/text_preferences.xml diff --git a/android-app/res/values-ru/text_strings.xml b/android-app-core/res/values-ru/text_strings.xml similarity index 100% rename from android-app/res/values-ru/text_strings.xml rename to android-app-core/res/values-ru/text_strings.xml diff --git a/android-app/res/values-ru/text_vars.xml b/android-app-core/res/values-ru/text_vars.xml similarity index 100% rename from android-app/res/values-ru/text_vars.xml rename to android-app-core/res/values-ru/text_vars.xml diff --git a/android-app/res/values-uk/text_about.xml b/android-app-core/res/values-uk/text_about.xml similarity index 100% rename from android-app/res/values-uk/text_about.xml rename to android-app-core/res/values-uk/text_about.xml diff --git a/android-app/res/values-uk/text_functions.xml b/android-app-core/res/values-uk/text_functions.xml similarity index 100% rename from android-app/res/values-uk/text_functions.xml rename to android-app-core/res/values-uk/text_functions.xml diff --git a/android-app/res/values-uk/text_help.xml b/android-app-core/res/values-uk/text_help.xml similarity index 100% rename from android-app/res/values-uk/text_help.xml rename to android-app-core/res/values-uk/text_help.xml diff --git a/android-app/res/values-uk/text_operators.xml b/android-app-core/res/values-uk/text_operators.xml similarity index 100% rename from android-app/res/values-uk/text_operators.xml rename to android-app-core/res/values-uk/text_operators.xml diff --git a/android-app/res/values-uk/text_preferences.xml b/android-app-core/res/values-uk/text_preferences.xml similarity index 100% rename from android-app/res/values-uk/text_preferences.xml rename to android-app-core/res/values-uk/text_preferences.xml diff --git a/android-app/res/values-uk/text_strings.xml b/android-app-core/res/values-uk/text_strings.xml similarity index 100% rename from android-app/res/values-uk/text_strings.xml rename to android-app-core/res/values-uk/text_strings.xml diff --git a/android-app/res/values-uk/text_vars.xml b/android-app-core/res/values-uk/text_vars.xml similarity index 100% rename from android-app/res/values-uk/text_vars.xml rename to android-app-core/res/values-uk/text_vars.xml diff --git a/android-app/res/values-zh-rtw/text_about.xml b/android-app-core/res/values-zh-rtw/text_about.xml similarity index 100% rename from android-app/res/values-zh-rtw/text_about.xml rename to android-app-core/res/values-zh-rtw/text_about.xml diff --git a/android-app/res/values-zh-rtw/text_functions.xml b/android-app-core/res/values-zh-rtw/text_functions.xml similarity index 100% rename from android-app/res/values-zh-rtw/text_functions.xml rename to android-app-core/res/values-zh-rtw/text_functions.xml diff --git a/android-app/res/values-zh-rtw/text_help.xml b/android-app-core/res/values-zh-rtw/text_help.xml similarity index 100% rename from android-app/res/values-zh-rtw/text_help.xml rename to android-app-core/res/values-zh-rtw/text_help.xml diff --git a/android-app/res/values-zh-rtw/text_operators.xml b/android-app-core/res/values-zh-rtw/text_operators.xml similarity index 100% rename from android-app/res/values-zh-rtw/text_operators.xml rename to android-app-core/res/values-zh-rtw/text_operators.xml diff --git a/android-app/res/values-zh-rtw/text_preferences.xml b/android-app-core/res/values-zh-rtw/text_preferences.xml similarity index 100% rename from android-app/res/values-zh-rtw/text_preferences.xml rename to android-app-core/res/values-zh-rtw/text_preferences.xml diff --git a/android-app/res/values-zh-rtw/text_strings.xml b/android-app-core/res/values-zh-rtw/text_strings.xml similarity index 100% rename from android-app/res/values-zh-rtw/text_strings.xml rename to android-app-core/res/values-zh-rtw/text_strings.xml diff --git a/android-app/res/values-zh-rtw/text_vars.xml b/android-app-core/res/values-zh-rtw/text_vars.xml similarity index 100% rename from android-app/res/values-zh-rtw/text_vars.xml rename to android-app-core/res/values-zh-rtw/text_vars.xml diff --git a/android-app/res/values/attributes.xml b/android-app-core/res/values/attributes.xml similarity index 100% rename from android-app/res/values/attributes.xml rename to android-app-core/res/values/attributes.xml diff --git a/android-app-core/res/values/colors.xml b/android-app-core/res/values/colors.xml new file mode 100644 index 00000000..41d417dc --- /dev/null +++ b/android-app-core/res/values/colors.xml @@ -0,0 +1,16 @@ + + + #ffffffff + #ff393939 + #ffffffff + #ffffff99 + #ffffffff + #ffffff99 + #ff000000 + #ff1f1f1f + #ff1f1f1f + #10648c + #088e3a + #651456 + #393939 + \ No newline at end of file diff --git a/android-app/res/values/dimens.xml b/android-app-core/res/values/dimens.xml similarity index 83% rename from android-app/res/values/dimens.xml rename to android-app-core/res/values/dimens.xml index c35ce931..340956d2 100644 --- a/android-app/res/values/dimens.xml +++ b/android-app-core/res/values/dimens.xml @@ -20,11 +20,6 @@ 20sp 15sp - 25sp - 20dp - 25sp - 6dp - 20sp 10dp diff --git a/android-app-core/res/values/ids.xml b/android-app-core/res/values/ids.xml new file mode 100644 index 00000000..bc3359c4 --- /dev/null +++ b/android-app-core/res/values/ids.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android-app-core/res/values/preferences.xml b/android-app-core/res/values/preferences.xml new file mode 100644 index 00000000..8445b05b --- /dev/null +++ b/android-app-core/res/values/preferences.xml @@ -0,0 +1,5 @@ + + + org.solovyev.android.calculator.CalculatorModel_functions + org.solovyev.android.calculator.CalculatorModel_vars + \ No newline at end of file diff --git a/android-app/res/values/styles.xml b/android-app-core/res/values/styles.xml similarity index 91% rename from android-app/res/values/styles.xml rename to android-app-core/res/values/styles.xml index 1f3f554b..83c17c25 100644 --- a/android-app/res/values/styles.xml +++ b/android-app-core/res/values/styles.xml @@ -70,18 +70,10 @@ @dimen/cpp_display_text_size - - - - - - - - @@ -20,26 +16,15 @@ @dimen/cpp_onscreen_header_button_text_size - - - - - + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android-app/src/main/java/org/solovyev/android/calculator/widget/AbstractCalculatorWidgetProvider.java b/android-app-widget/src/main/java/org/solovyev/android/calculator/widget/AbstractCalculatorWidgetProvider.java similarity index 99% rename from android-app/src/main/java/org/solovyev/android/calculator/widget/AbstractCalculatorWidgetProvider.java rename to android-app-widget/src/main/java/org/solovyev/android/calculator/widget/AbstractCalculatorWidgetProvider.java index b0d0a930..75ef8b5e 100644 --- a/android-app/src/main/java/org/solovyev/android/calculator/widget/AbstractCalculatorWidgetProvider.java +++ b/android-app-widget/src/main/java/org/solovyev/android/calculator/widget/AbstractCalculatorWidgetProvider.java @@ -14,7 +14,6 @@ import org.solovyev.android.calculator.CalculatorButtons; import org.solovyev.android.calculator.CalculatorDisplayViewState; import org.solovyev.android.calculator.CalculatorEditorViewState; import org.solovyev.android.calculator.Locator; -import org.solovyev.android.calculator.R; import org.solovyev.android.calculator.external.ExternalCalculatorIntentHandler; import org.solovyev.android.calculator.external.ExternalCalculatorStateUpdater; diff --git a/android-app/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetConfigurationActivity.java b/android-app-widget/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetConfigurationActivity.java similarity index 100% rename from android-app/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetConfigurationActivity.java rename to android-app-widget/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetConfigurationActivity.java diff --git a/android-app/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetIntentHandler.java b/android-app-widget/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetIntentHandler.java similarity index 100% rename from android-app/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetIntentHandler.java rename to android-app-widget/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetIntentHandler.java diff --git a/android-app/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider.java b/android-app-widget/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider.java similarity index 100% rename from android-app/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider.java rename to android-app-widget/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider.java diff --git a/android-app/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider3x4.java b/android-app-widget/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider3x4.java similarity index 100% rename from android-app/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider3x4.java rename to android-app-widget/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider3x4.java diff --git a/android-app/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider4x4.java b/android-app-widget/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider4x4.java similarity index 100% rename from android-app/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider4x4.java rename to android-app-widget/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider4x4.java diff --git a/android-app/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider4x5.java b/android-app-widget/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider4x5.java similarity index 100% rename from android-app/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider4x5.java rename to android-app-widget/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider4x5.java diff --git a/android-app/src/main/java/org/solovyev/android/calculator/widget/WidgetButton.java b/android-app-widget/src/main/java/org/solovyev/android/calculator/widget/WidgetButton.java similarity index 99% rename from android-app/src/main/java/org/solovyev/android/calculator/widget/WidgetButton.java rename to android-app-widget/src/main/java/org/solovyev/android/calculator/widget/WidgetButton.java index 32c863e9..bff1977e 100644 --- a/android-app/src/main/java/org/solovyev/android/calculator/widget/WidgetButton.java +++ b/android-app-widget/src/main/java/org/solovyev/android/calculator/widget/WidgetButton.java @@ -3,9 +3,8 @@ package org.solovyev.android.calculator.widget; import android.content.Context; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.solovyev.android.calculator.Locator; import org.solovyev.android.calculator.CalculatorSpecialButton; -import org.solovyev.android.calculator.R; +import org.solovyev.android.calculator.Locator; import java.util.HashMap; import java.util.Map; diff --git a/android-app/res/values/colors.xml b/android-app/res/values/colors.xml deleted file mode 100644 index 13e555d2..00000000 --- a/android-app/res/values/colors.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - #ffffffff - #ffffff99 - #ffffffff - #ffffffff - #ff393939 - #ff707070 - #ffffff99 - #ff000000 - #ff1f1f1f - #ff1f1f1f - #10648c - #088e3a - #651456 - #393939 - \ No newline at end of file diff --git a/android-app/res/values/preferences.xml b/android-app/res/values/preferences.xml index 2d76a425..c5fe7155 100644 --- a/android-app/res/values/preferences.xml +++ b/android-app/res/values/preferences.xml @@ -41,8 +41,6 @@ calculation.output.science_notation false - org.solovyev.android.calculator.CalculatorModel_functions - org.solovyev.android.calculator.CalculatorModel_vars org.solovyev.android.calculator.CalculatorModel_history org.solovyev.android.calculator.CalculatorActivity_angle_units diff --git a/android-app/src/main/java/org/solovyev/android/calculator/CalculatorActivityLauncher.java b/android-app/src/main/java/org/solovyev/android/calculator/CalculatorActivityLauncher.java index 164882cd..27235789 100644 --- a/android-app/src/main/java/org/solovyev/android/calculator/CalculatorActivityLauncher.java +++ b/android-app/src/main/java/org/solovyev/android/calculator/CalculatorActivityLauncher.java @@ -10,6 +10,7 @@ import jscl.math.Generic; import jscl.math.function.Constant; import org.achartengine.ChartFactory; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.solovyev.android.calculator.about.CalculatorAboutActivity; import org.solovyev.android.calculator.function.FunctionEditDialogFragment; import org.solovyev.android.calculator.help.CalculatorHelpActivity; @@ -28,9 +29,12 @@ import java.util.List; * Date: 11/2/11 * Time: 2:18 PM */ -public class CalculatorActivityLauncher { +public final class CalculatorActivityLauncher implements CalculatorEventListener { - public static void showHistory(@NotNull final Context context) { + public CalculatorActivityLauncher() { + } + + public static void showHistory(@NotNull final Context context) { showHistory(context, false); } @@ -166,4 +170,26 @@ public class CalculatorActivityLauncher { CalculatorMessagesDialog.showDialogForMessages(messages, context); } } + + @Override + public void onCalculatorEvent(@NotNull CalculatorEventData calculatorEventData, @NotNull CalculatorEventType calculatorEventType, @Nullable Object data) { + switch (calculatorEventType){ + case show_create_var_dialog: + App.getInstance().getUiThreadExecutor().execute(new Runnable() { + @Override + public void run() { + CalculatorActivityLauncher.createVar(App.getInstance().getApplication(), Locator.getInstance().getDisplay()); + } + }); + break; + case show_create_function_dialog: + App.getInstance().getUiThreadExecutor().execute(new Runnable() { + @Override + public void run() { + CalculatorActivityLauncher.createFunction(App.getInstance().getApplication(), Locator.getInstance().getDisplay()); + } + }); + break; + } + } } diff --git a/android-app/src/main/java/org/solovyev/android/calculator/CalculatorApplication.java b/android-app/src/main/java/org/solovyev/android/calculator/CalculatorApplication.java index def27e3a..97420fa0 100644 --- a/android-app/src/main/java/org/solovyev/android/calculator/CalculatorApplication.java +++ b/android-app/src/main/java/org/solovyev/android/calculator/CalculatorApplication.java @@ -75,6 +75,8 @@ public class CalculatorApplication extends android.app.Application { public void onCreate() { ACRA.init(this); + App.getInstance().init(this); + final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); CalculatorPreferences.setDefaultValues(preferences); diff --git a/core/src/main/java/org/solovyev/android/calculator/CalculatorEventType.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorEventType.java index 8ab0f3ad..1b9a0b31 100644 --- a/core/src/main/java/org/solovyev/android/calculator/CalculatorEventType.java +++ b/core/src/main/java/org/solovyev/android/calculator/CalculatorEventType.java @@ -153,7 +153,10 @@ public enum CalculatorEventType { show_settings, show_settings_detached, - show_like_dialog; + show_like_dialog, + + show_create_var_dialog, + show_create_function_dialog; public boolean isOfType(@NotNull CalculatorEventType... types) { for (CalculatorEventType type : types) { diff --git a/core/src/main/java/org/solovyev/common/DelayedExecutor.java b/core/src/main/java/org/solovyev/common/DelayedExecutor.java new file mode 100644 index 00000000..46aec463 --- /dev/null +++ b/core/src/main/java/org/solovyev/common/DelayedExecutor.java @@ -0,0 +1,16 @@ +package org.solovyev.common; + +import org.jetbrains.annotations.NotNull; + +import java.util.concurrent.Executor; +import java.util.concurrent.TimeUnit; + +/** + * User: serso + * Date: 12/1/12 + * Time: 4:10 PM + */ +public interface DelayedExecutor extends Executor { + + void execute(@NotNull Runnable command, long delay, @NotNull TimeUnit delayUnit); +} From 2747b26506bfa39de52c54996e0ef6e54fd94f6f Mon Sep 17 00:00:00 2001 From: Sergey Solovyev Date: Sat, 1 Dec 2012 18:46:36 +0400 Subject: [PATCH 09/14] changes --- .../res/layout/unit_converter.xml | 0 .../res/layout/widget_app_button.xml | 0 .../res/layout/widget_clear_button.xml | 0 .../res/layout/widget_copy_button.xml | 0 .../res/layout/widget_division_button.xml | 0 .../res/layout/widget_dot_button.xml | 0 .../res/layout/widget_eight_digit_button.xml | 0 .../res/layout/widget_equals_button.xml | 0 .../res/layout/widget_erase_button.xml | 0 .../res/layout/widget_five_digit_button.xml | 0 .../res/layout/widget_four_digit_button.xml | 0 .../res/layout/widget_functions_button.xml | 0 .../res/layout/widget_history_button.xml | 0 .../res/layout/widget_keyboard.xml | 0 .../res/layout/widget_left_button.xml | 0 .../res/layout/widget_like_button.xml | 0 .../layout/widget_multiplication_button.xml | 0 .../res/layout/widget_nine_digit_button.xml | 0 .../res/layout/widget_one_digit_button.xml | 0 .../res/layout/widget_paste_button.xml | 0 .../res/layout/widget_percent_button.xml | 0 .../res/layout/widget_plus_button.xml | 0 .../res/layout/widget_power_button.xml | 0 .../res/layout/widget_right_button.xml | 0 .../layout/widget_round_brackets_button.xml | 0 .../res/layout/widget_settings_button.xml | 0 .../res/layout/widget_seven_digit_button.xml | 0 .../res/layout/widget_six_digit_button.xml | 0 .../res/layout/widget_subtraction_button.xml | 0 .../res/layout/widget_three_digit_button.xml | 0 .../res/layout/widget_two_digit_button.xml | 0 .../res/layout/widget_vars_button.xml | 0 .../res/layout/widget_zero_digit_button.xml | 0 android-app-core/res/values/dimens.xml | 2 + android-app-core/res/values/styles.xml | 18 ++++++++ .../AndroidCalculatorDisplayView.java | 1 + .../AndroidCalculatorEditorView.java | 0 .../android/calculator/CalculatorButton.java | 27 ++++++----- .../calculator/CalculatorDisplayMenuItem.java | 5 ++- .../CalculatorDisplayOnClickListener.java | 2 +- .../calculator/ConversionMenuItem.java | 0 .../android/calculator/plot/PlotInput.java | 42 +++++++++++++++++ .../view/NumeralBaseConverterDialog.java | 4 +- .../calculator/view/TextHighlighter.java | 0 .../view/UnitConverterViewBuilder.java | 5 +-- android-app-onscreen/AndroidManifest.xml | 6 +++ android-app-onscreen/pom.xml | 45 +++++++++++++++++++ .../res/layout/onscreen_display.xml | 0 .../res/layout/onscreen_editor.xml | 0 .../res/layout/onscreen_footer.xml | 0 .../res/layout/onscreen_header.xml | 0 .../res/layout/onscreen_keyboard.xml | 0 .../res/layout/onscreen_layout.xml | 2 +- android-app-onscreen/res/values/colors.xml | 4 ++ android-app-onscreen/res/values/styles.xml | 8 ++++ .../CalculatorOnscreenBroadcastReceiver.java | 0 .../onscreen/CalculatorOnscreenService.java | 3 +- .../onscreen/CalculatorOnscreenView.java | 6 +-- .../onscreen/CalculatorOnscreenViewDef.java | 0 .../onscreen/OnscreenViewListener.java | 0 android-app-widget/res/values/dimens.xml | 1 - android-app-widget/res/values/styles.xml | 17 +------ .../AbstractCalculatorWidgetProvider.java | 7 +-- .../widget/CalculatorWidgetIntentHandler.java | 3 +- android-app/pom.xml | 6 +++ .../android/calculator/AndroidCalculator.java | 17 ------- .../CalculatorActivityLauncher.java | 40 +++++++++++++++++ .../calculator/CalculatorEventType.java | 8 +++- pom.xml | 8 ++++ 69 files changed, 219 insertions(+), 68 deletions(-) rename {android-app => android-app-core}/res/layout/unit_converter.xml (100%) rename {android-app-widget => android-app-core}/res/layout/widget_app_button.xml (100%) rename {android-app-widget => android-app-core}/res/layout/widget_clear_button.xml (100%) rename {android-app-widget => android-app-core}/res/layout/widget_copy_button.xml (100%) rename {android-app-widget => android-app-core}/res/layout/widget_division_button.xml (100%) rename {android-app-widget => android-app-core}/res/layout/widget_dot_button.xml (100%) rename {android-app-widget => android-app-core}/res/layout/widget_eight_digit_button.xml (100%) rename {android-app-widget => android-app-core}/res/layout/widget_equals_button.xml (100%) rename {android-app-widget => android-app-core}/res/layout/widget_erase_button.xml (100%) rename {android-app-widget => android-app-core}/res/layout/widget_five_digit_button.xml (100%) rename {android-app-widget => android-app-core}/res/layout/widget_four_digit_button.xml (100%) rename {android-app-widget => android-app-core}/res/layout/widget_functions_button.xml (100%) rename {android-app-widget => android-app-core}/res/layout/widget_history_button.xml (100%) rename {android-app-widget => android-app-core}/res/layout/widget_keyboard.xml (100%) rename {android-app-widget => android-app-core}/res/layout/widget_left_button.xml (100%) rename {android-app-widget => android-app-core}/res/layout/widget_like_button.xml (100%) rename {android-app-widget => android-app-core}/res/layout/widget_multiplication_button.xml (100%) rename {android-app-widget => android-app-core}/res/layout/widget_nine_digit_button.xml (100%) rename {android-app-widget => android-app-core}/res/layout/widget_one_digit_button.xml (100%) rename {android-app-widget => android-app-core}/res/layout/widget_paste_button.xml (100%) rename {android-app-widget => android-app-core}/res/layout/widget_percent_button.xml (100%) rename {android-app-widget => android-app-core}/res/layout/widget_plus_button.xml (100%) rename {android-app-widget => android-app-core}/res/layout/widget_power_button.xml (100%) rename {android-app-widget => android-app-core}/res/layout/widget_right_button.xml (100%) rename {android-app-widget => android-app-core}/res/layout/widget_round_brackets_button.xml (100%) rename {android-app-widget => android-app-core}/res/layout/widget_settings_button.xml (100%) rename {android-app-widget => android-app-core}/res/layout/widget_seven_digit_button.xml (100%) rename {android-app-widget => android-app-core}/res/layout/widget_six_digit_button.xml (100%) rename {android-app-widget => android-app-core}/res/layout/widget_subtraction_button.xml (100%) rename {android-app-widget => android-app-core}/res/layout/widget_three_digit_button.xml (100%) rename {android-app-widget => android-app-core}/res/layout/widget_two_digit_button.xml (100%) rename {android-app-widget => android-app-core}/res/layout/widget_vars_button.xml (100%) rename {android-app-widget => android-app-core}/res/layout/widget_zero_digit_button.xml (100%) rename {android-app => android-app-core}/src/main/java/org/solovyev/android/calculator/AndroidCalculatorDisplayView.java (99%) rename {android-app => android-app-core}/src/main/java/org/solovyev/android/calculator/AndroidCalculatorEditorView.java (100%) rename android-app-widget/src/main/java/org/solovyev/android/calculator/widget/WidgetButton.java => android-app-core/src/main/java/org/solovyev/android/calculator/CalculatorButton.java (75%) rename {android-app => android-app-core}/src/main/java/org/solovyev/android/calculator/CalculatorDisplayMenuItem.java (94%) rename {android-app => android-app-core}/src/main/java/org/solovyev/android/calculator/CalculatorDisplayOnClickListener.java (90%) rename {android-app => android-app-core}/src/main/java/org/solovyev/android/calculator/ConversionMenuItem.java (100%) create mode 100644 android-app-core/src/main/java/org/solovyev/android/calculator/plot/PlotInput.java rename {android-app => android-app-core}/src/main/java/org/solovyev/android/calculator/view/NumeralBaseConverterDialog.java (96%) rename {android-app => android-app-core}/src/main/java/org/solovyev/android/calculator/view/TextHighlighter.java (100%) rename {android-app => android-app-core}/src/main/java/org/solovyev/android/calculator/view/UnitConverterViewBuilder.java (96%) create mode 100644 android-app-onscreen/AndroidManifest.xml create mode 100644 android-app-onscreen/pom.xml rename {android-app => android-app-onscreen}/res/layout/onscreen_display.xml (100%) rename {android-app => android-app-onscreen}/res/layout/onscreen_editor.xml (100%) rename {android-app => android-app-onscreen}/res/layout/onscreen_footer.xml (100%) rename {android-app => android-app-onscreen}/res/layout/onscreen_header.xml (100%) rename {android-app => android-app-onscreen}/res/layout/onscreen_keyboard.xml (100%) rename {android-app => android-app-onscreen}/res/layout/onscreen_layout.xml (95%) create mode 100644 android-app-onscreen/res/values/colors.xml create mode 100644 android-app-onscreen/res/values/styles.xml rename {android-app => android-app-onscreen}/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenBroadcastReceiver.java (100%) rename {android-app => android-app-onscreen}/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenService.java (98%) rename {android-app => android-app-onscreen}/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenView.java (98%) rename {android-app => android-app-onscreen}/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenViewDef.java (100%) rename {android-app => android-app-onscreen}/src/main/java/org/solovyev/android/calculator/onscreen/OnscreenViewListener.java (100%) diff --git a/android-app/res/layout/unit_converter.xml b/android-app-core/res/layout/unit_converter.xml similarity index 100% rename from android-app/res/layout/unit_converter.xml rename to android-app-core/res/layout/unit_converter.xml diff --git a/android-app-widget/res/layout/widget_app_button.xml b/android-app-core/res/layout/widget_app_button.xml similarity index 100% rename from android-app-widget/res/layout/widget_app_button.xml rename to android-app-core/res/layout/widget_app_button.xml diff --git a/android-app-widget/res/layout/widget_clear_button.xml b/android-app-core/res/layout/widget_clear_button.xml similarity index 100% rename from android-app-widget/res/layout/widget_clear_button.xml rename to android-app-core/res/layout/widget_clear_button.xml diff --git a/android-app-widget/res/layout/widget_copy_button.xml b/android-app-core/res/layout/widget_copy_button.xml similarity index 100% rename from android-app-widget/res/layout/widget_copy_button.xml rename to android-app-core/res/layout/widget_copy_button.xml diff --git a/android-app-widget/res/layout/widget_division_button.xml b/android-app-core/res/layout/widget_division_button.xml similarity index 100% rename from android-app-widget/res/layout/widget_division_button.xml rename to android-app-core/res/layout/widget_division_button.xml diff --git a/android-app-widget/res/layout/widget_dot_button.xml b/android-app-core/res/layout/widget_dot_button.xml similarity index 100% rename from android-app-widget/res/layout/widget_dot_button.xml rename to android-app-core/res/layout/widget_dot_button.xml diff --git a/android-app-widget/res/layout/widget_eight_digit_button.xml b/android-app-core/res/layout/widget_eight_digit_button.xml similarity index 100% rename from android-app-widget/res/layout/widget_eight_digit_button.xml rename to android-app-core/res/layout/widget_eight_digit_button.xml diff --git a/android-app-widget/res/layout/widget_equals_button.xml b/android-app-core/res/layout/widget_equals_button.xml similarity index 100% rename from android-app-widget/res/layout/widget_equals_button.xml rename to android-app-core/res/layout/widget_equals_button.xml diff --git a/android-app-widget/res/layout/widget_erase_button.xml b/android-app-core/res/layout/widget_erase_button.xml similarity index 100% rename from android-app-widget/res/layout/widget_erase_button.xml rename to android-app-core/res/layout/widget_erase_button.xml diff --git a/android-app-widget/res/layout/widget_five_digit_button.xml b/android-app-core/res/layout/widget_five_digit_button.xml similarity index 100% rename from android-app-widget/res/layout/widget_five_digit_button.xml rename to android-app-core/res/layout/widget_five_digit_button.xml diff --git a/android-app-widget/res/layout/widget_four_digit_button.xml b/android-app-core/res/layout/widget_four_digit_button.xml similarity index 100% rename from android-app-widget/res/layout/widget_four_digit_button.xml rename to android-app-core/res/layout/widget_four_digit_button.xml diff --git a/android-app-widget/res/layout/widget_functions_button.xml b/android-app-core/res/layout/widget_functions_button.xml similarity index 100% rename from android-app-widget/res/layout/widget_functions_button.xml rename to android-app-core/res/layout/widget_functions_button.xml diff --git a/android-app-widget/res/layout/widget_history_button.xml b/android-app-core/res/layout/widget_history_button.xml similarity index 100% rename from android-app-widget/res/layout/widget_history_button.xml rename to android-app-core/res/layout/widget_history_button.xml diff --git a/android-app-widget/res/layout/widget_keyboard.xml b/android-app-core/res/layout/widget_keyboard.xml similarity index 100% rename from android-app-widget/res/layout/widget_keyboard.xml rename to android-app-core/res/layout/widget_keyboard.xml diff --git a/android-app-widget/res/layout/widget_left_button.xml b/android-app-core/res/layout/widget_left_button.xml similarity index 100% rename from android-app-widget/res/layout/widget_left_button.xml rename to android-app-core/res/layout/widget_left_button.xml diff --git a/android-app-widget/res/layout/widget_like_button.xml b/android-app-core/res/layout/widget_like_button.xml similarity index 100% rename from android-app-widget/res/layout/widget_like_button.xml rename to android-app-core/res/layout/widget_like_button.xml diff --git a/android-app-widget/res/layout/widget_multiplication_button.xml b/android-app-core/res/layout/widget_multiplication_button.xml similarity index 100% rename from android-app-widget/res/layout/widget_multiplication_button.xml rename to android-app-core/res/layout/widget_multiplication_button.xml diff --git a/android-app-widget/res/layout/widget_nine_digit_button.xml b/android-app-core/res/layout/widget_nine_digit_button.xml similarity index 100% rename from android-app-widget/res/layout/widget_nine_digit_button.xml rename to android-app-core/res/layout/widget_nine_digit_button.xml diff --git a/android-app-widget/res/layout/widget_one_digit_button.xml b/android-app-core/res/layout/widget_one_digit_button.xml similarity index 100% rename from android-app-widget/res/layout/widget_one_digit_button.xml rename to android-app-core/res/layout/widget_one_digit_button.xml diff --git a/android-app-widget/res/layout/widget_paste_button.xml b/android-app-core/res/layout/widget_paste_button.xml similarity index 100% rename from android-app-widget/res/layout/widget_paste_button.xml rename to android-app-core/res/layout/widget_paste_button.xml diff --git a/android-app-widget/res/layout/widget_percent_button.xml b/android-app-core/res/layout/widget_percent_button.xml similarity index 100% rename from android-app-widget/res/layout/widget_percent_button.xml rename to android-app-core/res/layout/widget_percent_button.xml diff --git a/android-app-widget/res/layout/widget_plus_button.xml b/android-app-core/res/layout/widget_plus_button.xml similarity index 100% rename from android-app-widget/res/layout/widget_plus_button.xml rename to android-app-core/res/layout/widget_plus_button.xml diff --git a/android-app-widget/res/layout/widget_power_button.xml b/android-app-core/res/layout/widget_power_button.xml similarity index 100% rename from android-app-widget/res/layout/widget_power_button.xml rename to android-app-core/res/layout/widget_power_button.xml diff --git a/android-app-widget/res/layout/widget_right_button.xml b/android-app-core/res/layout/widget_right_button.xml similarity index 100% rename from android-app-widget/res/layout/widget_right_button.xml rename to android-app-core/res/layout/widget_right_button.xml diff --git a/android-app-widget/res/layout/widget_round_brackets_button.xml b/android-app-core/res/layout/widget_round_brackets_button.xml similarity index 100% rename from android-app-widget/res/layout/widget_round_brackets_button.xml rename to android-app-core/res/layout/widget_round_brackets_button.xml diff --git a/android-app-widget/res/layout/widget_settings_button.xml b/android-app-core/res/layout/widget_settings_button.xml similarity index 100% rename from android-app-widget/res/layout/widget_settings_button.xml rename to android-app-core/res/layout/widget_settings_button.xml diff --git a/android-app-widget/res/layout/widget_seven_digit_button.xml b/android-app-core/res/layout/widget_seven_digit_button.xml similarity index 100% rename from android-app-widget/res/layout/widget_seven_digit_button.xml rename to android-app-core/res/layout/widget_seven_digit_button.xml diff --git a/android-app-widget/res/layout/widget_six_digit_button.xml b/android-app-core/res/layout/widget_six_digit_button.xml similarity index 100% rename from android-app-widget/res/layout/widget_six_digit_button.xml rename to android-app-core/res/layout/widget_six_digit_button.xml diff --git a/android-app-widget/res/layout/widget_subtraction_button.xml b/android-app-core/res/layout/widget_subtraction_button.xml similarity index 100% rename from android-app-widget/res/layout/widget_subtraction_button.xml rename to android-app-core/res/layout/widget_subtraction_button.xml diff --git a/android-app-widget/res/layout/widget_three_digit_button.xml b/android-app-core/res/layout/widget_three_digit_button.xml similarity index 100% rename from android-app-widget/res/layout/widget_three_digit_button.xml rename to android-app-core/res/layout/widget_three_digit_button.xml diff --git a/android-app-widget/res/layout/widget_two_digit_button.xml b/android-app-core/res/layout/widget_two_digit_button.xml similarity index 100% rename from android-app-widget/res/layout/widget_two_digit_button.xml rename to android-app-core/res/layout/widget_two_digit_button.xml diff --git a/android-app-widget/res/layout/widget_vars_button.xml b/android-app-core/res/layout/widget_vars_button.xml similarity index 100% rename from android-app-widget/res/layout/widget_vars_button.xml rename to android-app-core/res/layout/widget_vars_button.xml diff --git a/android-app-widget/res/layout/widget_zero_digit_button.xml b/android-app-core/res/layout/widget_zero_digit_button.xml similarity index 100% rename from android-app-widget/res/layout/widget_zero_digit_button.xml rename to android-app-core/res/layout/widget_zero_digit_button.xml diff --git a/android-app-core/res/values/dimens.xml b/android-app-core/res/values/dimens.xml index 340956d2..d5674683 100644 --- a/android-app-core/res/values/dimens.xml +++ b/android-app-core/res/values/dimens.xml @@ -26,4 +26,6 @@ 5dp 3dp + + 20dp \ No newline at end of file diff --git a/android-app-core/res/values/styles.xml b/android-app-core/res/values/styles.xml index 83c17c25..3dd2ecce 100644 --- a/android-app-core/res/values/styles.xml +++ b/android-app-core/res/values/styles.xml @@ -87,4 +87,22 @@ @color/cpp_default_text_color + + + + + + + + + + \ No newline at end of file diff --git a/android-app/src/main/java/org/solovyev/android/calculator/AndroidCalculatorDisplayView.java b/android-app-core/src/main/java/org/solovyev/android/calculator/AndroidCalculatorDisplayView.java similarity index 99% rename from android-app/src/main/java/org/solovyev/android/calculator/AndroidCalculatorDisplayView.java rename to android-app-core/src/main/java/org/solovyev/android/calculator/AndroidCalculatorDisplayView.java index 0c122bce..d35fdd4b 100644 --- a/android-app/src/main/java/org/solovyev/android/calculator/AndroidCalculatorDisplayView.java +++ b/android-app-core/src/main/java/org/solovyev/android/calculator/AndroidCalculatorDisplayView.java @@ -15,6 +15,7 @@ import android.util.AttributeSet; import android.util.TypedValue; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.solovyev.android.calculator.core.R; import org.solovyev.android.calculator.text.TextProcessor; import org.solovyev.android.calculator.view.TextHighlighter; import org.solovyev.android.view.AutoResizeTextView; diff --git a/android-app/src/main/java/org/solovyev/android/calculator/AndroidCalculatorEditorView.java b/android-app-core/src/main/java/org/solovyev/android/calculator/AndroidCalculatorEditorView.java similarity index 100% rename from android-app/src/main/java/org/solovyev/android/calculator/AndroidCalculatorEditorView.java rename to android-app-core/src/main/java/org/solovyev/android/calculator/AndroidCalculatorEditorView.java diff --git a/android-app-widget/src/main/java/org/solovyev/android/calculator/widget/WidgetButton.java b/android-app-core/src/main/java/org/solovyev/android/calculator/CalculatorButton.java similarity index 75% rename from android-app-widget/src/main/java/org/solovyev/android/calculator/widget/WidgetButton.java rename to android-app-core/src/main/java/org/solovyev/android/calculator/CalculatorButton.java index bff1977e..f20a5555 100644 --- a/android-app-widget/src/main/java/org/solovyev/android/calculator/widget/WidgetButton.java +++ b/android-app-core/src/main/java/org/solovyev/android/calculator/CalculatorButton.java @@ -1,10 +1,9 @@ -package org.solovyev.android.calculator.widget; +package org.solovyev.android.calculator; import android.content.Context; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.solovyev.android.calculator.CalculatorSpecialButton; -import org.solovyev.android.calculator.Locator; +import org.solovyev.android.calculator.core.R; import java.util.HashMap; import java.util.Map; @@ -14,7 +13,7 @@ import java.util.Map; * Date: 10/20/12 * Time: 12:05 AM */ -public enum WidgetButton { +public enum CalculatorButton { /*digits*/ one(R.id.oneDigitButton, "1"), @@ -69,24 +68,24 @@ public enum WidgetButton { private final String onLongClickText; @NotNull - private static Map buttonsByIds = new HashMap(); + private static Map buttonsByIds = new HashMap(); - WidgetButton(int buttonId, @NotNull CalculatorSpecialButton onClickButton, @Nullable CalculatorSpecialButton onLongClickButton) { + CalculatorButton(int buttonId, @NotNull CalculatorSpecialButton onClickButton, @Nullable CalculatorSpecialButton onLongClickButton) { this(buttonId, onClickButton.getActionCode(), onLongClickButton == null ? null : onLongClickButton.getActionCode()); } - WidgetButton(int buttonId, @NotNull CalculatorSpecialButton onClickButton) { + CalculatorButton(int buttonId, @NotNull CalculatorSpecialButton onClickButton) { this(buttonId, onClickButton, null); } - WidgetButton(int buttonId, @NotNull String onClickText, @Nullable String onLongClickText) { + CalculatorButton(int buttonId, @NotNull String onClickText, @Nullable String onLongClickText) { this.buttonId = buttonId; this.onClickText = onClickText; this.onLongClickText = onLongClickText; } - WidgetButton(int buttonId, @NotNull String onClickText) { + CalculatorButton(int buttonId, @NotNull String onClickText) { this(buttonId, onClickText, null); } @@ -103,7 +102,7 @@ public enum WidgetButton { } @Nullable - public static WidgetButton getById(int buttonId) { + public static CalculatorButton getById(int buttonId) { initButtonsByIdsMap(); return buttonsByIds.get(buttonId); @@ -113,11 +112,11 @@ public enum WidgetButton { if ( buttonsByIds.isEmpty() ) { // if not initialized - final WidgetButton[] widgetButtons = values(); + final CalculatorButton[] calculatorButtons = values(); - final Map localButtonsByIds = new HashMap(widgetButtons.length); - for (WidgetButton widgetButton : widgetButtons) { - localButtonsByIds.put(widgetButton.getButtonId(), widgetButton); + final Map localButtonsByIds = new HashMap(calculatorButtons.length); + for (CalculatorButton calculatorButton : calculatorButtons) { + localButtonsByIds.put(calculatorButton.getButtonId(), calculatorButton); } buttonsByIds = localButtonsByIds; diff --git a/android-app/src/main/java/org/solovyev/android/calculator/CalculatorDisplayMenuItem.java b/android-app-core/src/main/java/org/solovyev/android/calculator/CalculatorDisplayMenuItem.java similarity index 94% rename from android-app/src/main/java/org/solovyev/android/calculator/CalculatorDisplayMenuItem.java rename to android-app-core/src/main/java/org/solovyev/android/calculator/CalculatorDisplayMenuItem.java index 00d6ff48..136040ce 100644 --- a/android-app/src/main/java/org/solovyev/android/calculator/CalculatorDisplayMenuItem.java +++ b/android-app-core/src/main/java/org/solovyev/android/calculator/CalculatorDisplayMenuItem.java @@ -4,7 +4,9 @@ import android.content.Context; import jscl.math.Generic; import jscl.math.function.Constant; import org.jetbrains.annotations.NotNull; +import org.solovyev.android.calculator.core.R; import org.solovyev.android.calculator.jscl.JsclOperation; +import org.solovyev.android.calculator.plot.PlotInput; import org.solovyev.android.calculator.view.NumeralBaseConverterDialog; import org.solovyev.android.menu.LabeledMenuItem; import org.solovyev.common.collections.CollectionsUtils; @@ -82,7 +84,8 @@ public enum CalculatorDisplayMenuItem implements LabeledMenuItem + \ No newline at end of file diff --git a/android-app-onscreen/pom.xml b/android-app-onscreen/pom.xml new file mode 100644 index 00000000..27b7e988 --- /dev/null +++ b/android-app-onscreen/pom.xml @@ -0,0 +1,45 @@ + + + 4.0.0 + + + org.solovyev.android + calculatorpp-parent + 1.5.3-SNAPSHOT + + + org.solovyev.android + calculatorpp-android-app-onscreen + 1.5.3-SNAPSHOT + Calculator++ Application Onscreen + apklib + + + + + org.solovyev.android + calculatorpp-core + + + + org.solovyev.android + calculatorpp-android-app-core + apklib + + + + + + + + + com.jayway.maven.plugins.android.generation2 + android-maven-plugin + + + + + + diff --git a/android-app/res/layout/onscreen_display.xml b/android-app-onscreen/res/layout/onscreen_display.xml similarity index 100% rename from android-app/res/layout/onscreen_display.xml rename to android-app-onscreen/res/layout/onscreen_display.xml diff --git a/android-app/res/layout/onscreen_editor.xml b/android-app-onscreen/res/layout/onscreen_editor.xml similarity index 100% rename from android-app/res/layout/onscreen_editor.xml rename to android-app-onscreen/res/layout/onscreen_editor.xml diff --git a/android-app/res/layout/onscreen_footer.xml b/android-app-onscreen/res/layout/onscreen_footer.xml similarity index 100% rename from android-app/res/layout/onscreen_footer.xml rename to android-app-onscreen/res/layout/onscreen_footer.xml diff --git a/android-app/res/layout/onscreen_header.xml b/android-app-onscreen/res/layout/onscreen_header.xml similarity index 100% rename from android-app/res/layout/onscreen_header.xml rename to android-app-onscreen/res/layout/onscreen_header.xml diff --git a/android-app/res/layout/onscreen_keyboard.xml b/android-app-onscreen/res/layout/onscreen_keyboard.xml similarity index 100% rename from android-app/res/layout/onscreen_keyboard.xml rename to android-app-onscreen/res/layout/onscreen_keyboard.xml diff --git a/android-app/res/layout/onscreen_layout.xml b/android-app-onscreen/res/layout/onscreen_layout.xml similarity index 95% rename from android-app/res/layout/onscreen_layout.xml rename to android-app-onscreen/res/layout/onscreen_layout.xml index 328b38b8..1593b4ec 100644 --- a/android-app/res/layout/onscreen_layout.xml +++ b/android-app-onscreen/res/layout/onscreen_layout.xml @@ -2,7 +2,7 @@ + style="@style/cpp_onscreen_main_layout_style"> diff --git a/android-app-onscreen/res/values/colors.xml b/android-app-onscreen/res/values/colors.xml new file mode 100644 index 00000000..b514ada9 --- /dev/null +++ b/android-app-onscreen/res/values/colors.xml @@ -0,0 +1,4 @@ + + + #ff707070 + \ No newline at end of file diff --git a/android-app-onscreen/res/values/styles.xml b/android-app-onscreen/res/values/styles.xml new file mode 100644 index 00000000..8f842ce2 --- /dev/null +++ b/android-app-onscreen/res/values/styles.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/android-app/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenBroadcastReceiver.java b/android-app-onscreen/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenBroadcastReceiver.java similarity index 100% rename from android-app/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenBroadcastReceiver.java rename to android-app-onscreen/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenBroadcastReceiver.java diff --git a/android-app/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenService.java b/android-app-onscreen/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenService.java similarity index 98% rename from android-app/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenService.java rename to android-app-onscreen/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenService.java index d37af37f..315793b2 100644 --- a/android-app/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenService.java +++ b/android-app-onscreen/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenService.java @@ -15,7 +15,6 @@ import org.solovyev.android.AndroidUtils; import org.solovyev.android.calculator.CalculatorDisplayViewState; import org.solovyev.android.calculator.CalculatorEditorViewState; import org.solovyev.android.calculator.Locator; -import org.solovyev.android.calculator.R; import org.solovyev.android.calculator.external.*; /** @@ -112,7 +111,7 @@ public class CalculatorOnscreenService extends Service implements ExternalCalcul @NotNull private static String getCursorColor(@NotNull Context context) { if (cursorColor == null) { - cursorColor = Integer.toHexString(context.getResources().getColor(R.color.cpp_widget_cursor_color)).substring(2); + cursorColor = Integer.toHexString(context.getResources().getColor(R.color.cpp_onscreen_cursor_color)).substring(2); } return cursorColor; } diff --git a/android-app/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenView.java b/android-app-onscreen/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenView.java similarity index 98% rename from android-app/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenView.java rename to android-app-onscreen/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenView.java index dd29ca24..8bd0c2e5 100644 --- a/android-app/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenView.java +++ b/android-app-onscreen/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenView.java @@ -10,7 +10,7 @@ import android.widget.ImageView; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.solovyev.android.calculator.*; -import org.solovyev.android.calculator.widget.WidgetButton; +import org.solovyev.android.calculator.CalculatorButton; /** * User: serso @@ -153,14 +153,14 @@ public class CalculatorOnscreenView { private void init() { if (!initialized) { - for (final WidgetButton widgetButton : WidgetButton.values()) { + for (final CalculatorButton widgetButton : CalculatorButton.values()) { final View button = root.findViewById(widgetButton.getButtonId()); if (button != null) { button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { widgetButton.onClick(context); - if ( widgetButton == WidgetButton.app ) { + if ( widgetButton == CalculatorButton.app ) { minimize(); } } diff --git a/android-app/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenViewDef.java b/android-app-onscreen/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenViewDef.java similarity index 100% rename from android-app/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenViewDef.java rename to android-app-onscreen/src/main/java/org/solovyev/android/calculator/onscreen/CalculatorOnscreenViewDef.java diff --git a/android-app/src/main/java/org/solovyev/android/calculator/onscreen/OnscreenViewListener.java b/android-app-onscreen/src/main/java/org/solovyev/android/calculator/onscreen/OnscreenViewListener.java similarity index 100% rename from android-app/src/main/java/org/solovyev/android/calculator/onscreen/OnscreenViewListener.java rename to android-app-onscreen/src/main/java/org/solovyev/android/calculator/onscreen/OnscreenViewListener.java diff --git a/android-app-widget/res/values/dimens.xml b/android-app-widget/res/values/dimens.xml index 744d6015..3915feed 100644 --- a/android-app-widget/res/values/dimens.xml +++ b/android-app-widget/res/values/dimens.xml @@ -1,7 +1,6 @@ 25sp - 20dp 25sp 6dp \ No newline at end of file diff --git a/android-app-widget/res/values/styles.xml b/android-app-widget/res/values/styles.xml index 00f79aeb..95b2a8f0 100644 --- a/android-app-widget/res/values/styles.xml +++ b/android-app-widget/res/values/styles.xml @@ -1,5 +1,6 @@ + - - - - - - - - \ No newline at end of file diff --git a/android-app-widget/src/main/java/org/solovyev/android/calculator/widget/AbstractCalculatorWidgetProvider.java b/android-app-widget/src/main/java/org/solovyev/android/calculator/widget/AbstractCalculatorWidgetProvider.java index 75ef8b5e..9412c797 100644 --- a/android-app-widget/src/main/java/org/solovyev/android/calculator/widget/AbstractCalculatorWidgetProvider.java +++ b/android-app-widget/src/main/java/org/solovyev/android/calculator/widget/AbstractCalculatorWidgetProvider.java @@ -10,10 +10,7 @@ import android.text.Html; import android.widget.RemoteViews; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.solovyev.android.calculator.CalculatorButtons; -import org.solovyev.android.calculator.CalculatorDisplayViewState; -import org.solovyev.android.calculator.CalculatorEditorViewState; -import org.solovyev.android.calculator.Locator; +import org.solovyev.android.calculator.*; import org.solovyev.android.calculator.external.ExternalCalculatorIntentHandler; import org.solovyev.android.calculator.external.ExternalCalculatorStateUpdater; @@ -113,7 +110,7 @@ abstract class AbstractCalculatorWidgetProvider extends AppWidgetProvider implem for (int appWidgetId : appWidgetIds) { final RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout); - for (WidgetButton button : WidgetButton.values()) { + for (CalculatorButton button : CalculatorButton.values()) { final Intent onButtonClickIntent = new Intent(context, getComponentClass()); onButtonClickIntent.setAction(BUTTON_PRESSED_ACTION); onButtonClickIntent.putExtra(BUTTON_ID_EXTRA, button.getButtonId()); diff --git a/android-app-widget/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetIntentHandler.java b/android-app-widget/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetIntentHandler.java index 0d58cbc1..a1a6095d 100644 --- a/android-app-widget/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetIntentHandler.java +++ b/android-app-widget/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetIntentHandler.java @@ -3,6 +3,7 @@ package org.solovyev.android.calculator.widget; import android.content.Context; import android.content.Intent; import org.jetbrains.annotations.NotNull; +import org.solovyev.android.calculator.CalculatorButton; import org.solovyev.android.calculator.Locator; import org.solovyev.android.calculator.external.DefaultExternalCalculatorIntentHandler; import org.solovyev.android.calculator.external.ExternalCalculatorStateUpdater; @@ -25,7 +26,7 @@ public class CalculatorWidgetIntentHandler extends DefaultExternalCalculatorInte if (AbstractCalculatorWidgetProvider.BUTTON_PRESSED_ACTION.equals(intent.getAction())) { final int buttonId = intent.getIntExtra(AbstractCalculatorWidgetProvider.BUTTON_ID_EXTRA, 0); - final WidgetButton button = WidgetButton.getById(buttonId); + final CalculatorButton button = CalculatorButton.getById(buttonId); if (button != null) { button.onClick(context); } diff --git a/android-app/pom.xml b/android-app/pom.xml index 40283d01..3f1d027f 100644 --- a/android-app/pom.xml +++ b/android-app/pom.xml @@ -35,6 +35,12 @@ apklib + + org.solovyev.android + calculatorpp-android-app-onscreen + apklib + + org.solovyev common-core diff --git a/android-app/src/main/java/org/solovyev/android/calculator/AndroidCalculator.java b/android-app/src/main/java/org/solovyev/android/calculator/AndroidCalculator.java index 943aeed8..9fc3d854 100644 --- a/android-app/src/main/java/org/solovyev/android/calculator/AndroidCalculator.java +++ b/android-app/src/main/java/org/solovyev/android/calculator/AndroidCalculator.java @@ -1,14 +1,10 @@ package org.solovyev.android.calculator; import android.app.Activity; -import android.app.AlertDialog; import android.app.Application; import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.TextView; import jscl.NumeralBase; import jscl.math.Generic; import org.jetbrains.annotations.NotNull; @@ -40,19 +36,6 @@ public class AndroidCalculator implements Calculator, CalculatorEventListener, S PreferenceManager.getDefaultSharedPreferences(application).registerOnSharedPreferenceChangeListener(this); } - public static void showEvaluationError(@NotNull Context context, @NotNull final String errorMessage) { - final LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); - - final View errorMessageView = layoutInflater.inflate(R.layout.display_error_message, null); - ((TextView) errorMessageView.findViewById(R.id.error_message_text_view)).setText(errorMessage); - - final AlertDialog.Builder builder = new AlertDialog.Builder(context) - .setPositiveButton(R.string.c_cancel, null) - .setView(errorMessageView); - - builder.create().show(); - } - public void init(@NotNull final Activity activity) { setEditor(activity); setDisplay(activity); diff --git a/android-app/src/main/java/org/solovyev/android/calculator/CalculatorActivityLauncher.java b/android-app/src/main/java/org/solovyev/android/calculator/CalculatorActivityLauncher.java index 27235789..dd2d2cfe 100644 --- a/android-app/src/main/java/org/solovyev/android/calculator/CalculatorActivityLauncher.java +++ b/android-app/src/main/java/org/solovyev/android/calculator/CalculatorActivityLauncher.java @@ -1,10 +1,15 @@ package org.solovyev.android.calculator; +import android.app.Activity; +import android.app.AlertDialog; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.net.Uri; import android.preference.PreferenceManager; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.TextView; import com.actionbarsherlock.app.SherlockFragmentActivity; import jscl.math.Generic; import jscl.math.function.Constant; @@ -18,6 +23,7 @@ import org.solovyev.android.calculator.history.CalculatorHistoryActivity; import org.solovyev.android.calculator.math.edit.*; import org.solovyev.android.calculator.plot.CalculatorPlotActivity; import org.solovyev.android.calculator.plot.CalculatorPlotFragment; +import org.solovyev.android.calculator.plot.PlotInput; import org.solovyev.common.msg.Message; import org.solovyev.common.msg.MessageType; import org.solovyev.common.text.StringUtils; @@ -190,6 +196,40 @@ public final class CalculatorActivityLauncher implements CalculatorEventListener } }); break; + case plot_graph: + final PlotInput plotInput = (PlotInput) data; + assert plotInput != null; + App.getInstance().getUiThreadExecutor().execute(new Runnable() { + @Override + public void run() { + plotGraph(App.getInstance().getApplication(), plotInput.getFunction(), plotInput.getConstant()); + } + }); + break; + case show_evaluation_error: + final String errorMessage = (String) data; + if (errorMessage != null) { + App.getInstance().getUiThreadExecutor().execute(new Runnable() { + @Override + public void run() { + showEvaluationError(App.getInstance().getApplication(), errorMessage); + } + }); + } + break; } } + + public static void showEvaluationError(@NotNull Context context, @NotNull final String errorMessage) { + final LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); + + final View errorMessageView = layoutInflater.inflate(R.layout.display_error_message, null); + ((TextView) errorMessageView.findViewById(R.id.error_message_text_view)).setText(errorMessage); + + final AlertDialog.Builder builder = new AlertDialog.Builder(context) + .setPositiveButton(R.string.c_cancel, null) + .setView(errorMessageView); + + builder.create().show(); + } } diff --git a/core/src/main/java/org/solovyev/android/calculator/CalculatorEventType.java b/core/src/main/java/org/solovyev/android/calculator/CalculatorEventType.java index 1b9a0b31..306e0ad2 100644 --- a/core/src/main/java/org/solovyev/android/calculator/CalculatorEventType.java +++ b/core/src/main/java/org/solovyev/android/calculator/CalculatorEventType.java @@ -156,7 +156,13 @@ public enum CalculatorEventType { show_like_dialog, show_create_var_dialog, - show_create_function_dialog; + show_create_function_dialog, + + //org.solovyev.android.calculator.plot.PlotInput + plot_graph, + + //String + show_evaluation_error; public boolean isOfType(@NotNull CalculatorEventType... types) { for (CalculatorEventType type : types) { diff --git a/pom.xml b/pom.xml index 3808b754..64858624 100644 --- a/pom.xml +++ b/pom.xml @@ -26,6 +26,7 @@ android-app android-app-core android-app-widget + android-app-onscreen android-app-test core @@ -59,6 +60,13 @@ apklib + + org.solovyev.android + calculatorpp-android-app-onscreen + 1.5.3-SNAPSHOT + apklib + + org.solovyev common-core From 19818c510e5f24ac57d95cf0b53c44d695406910 Mon Sep 17 00:00:00 2001 From: Sergey Solovyev Date: Sat, 1 Dec 2012 18:54:21 +0400 Subject: [PATCH 10/14] changes --- ...p_button.xml => cpp_simple_app_button.xml} | 2 +- ...button.xml => cpp_simple_clear_button.xml} | 2 +- ..._button.xml => cpp_simple_copy_button.xml} | 2 +- ...ton.xml => cpp_simple_division_button.xml} | 2 +- ...t_button.xml => cpp_simple_dot_button.xml} | 0 ....xml => cpp_simple_eight_digit_button.xml} | 2 +- ...utton.xml => cpp_simple_equals_button.xml} | 2 +- ...button.xml => cpp_simple_erase_button.xml} | 2 +- ...n.xml => cpp_simple_five_digit_button.xml} | 2 +- ...n.xml => cpp_simple_four_digit_button.xml} | 2 +- ...on.xml => cpp_simple_functions_button.xml} | 2 +- ...tton.xml => cpp_simple_history_button.xml} | 2 +- .../res/layout/cpp_simple_keyboard.xml | 74 +++++++++++++++++++ ..._button.xml => cpp_simple_left_button.xml} | 2 +- ..._button.xml => cpp_simple_like_button.xml} | 2 +- ...l => cpp_simple_multiplication_button.xml} | 2 +- ...n.xml => cpp_simple_nine_digit_button.xml} | 2 +- ...on.xml => cpp_simple_one_digit_button.xml} | 2 +- ...button.xml => cpp_simple_paste_button.xml} | 2 +- ...tton.xml => cpp_simple_percent_button.xml} | 2 +- ..._button.xml => cpp_simple_plus_button.xml} | 2 +- ...button.xml => cpp_simple_power_button.xml} | 2 +- ...button.xml => cpp_simple_right_button.xml} | 2 +- ...l => cpp_simple_round_brackets_button.xml} | 2 +- ...ton.xml => cpp_simple_settings_button.xml} | 2 +- ....xml => cpp_simple_seven_digit_button.xml} | 2 +- ...on.xml => cpp_simple_six_digit_button.xml} | 2 +- ....xml => cpp_simple_subtraction_button.xml} | 2 +- ....xml => cpp_simple_three_digit_button.xml} | 2 +- ...on.xml => cpp_simple_two_digit_button.xml} | 2 +- ..._button.xml => cpp_simple_vars_button.xml} | 2 +- ...n.xml => cpp_simple_zero_digit_button.xml} | 2 +- .../res/layout/widget_keyboard.xml | 74 ------------------- android-app-core/res/values/styles.xml | 8 +- .../res/layout/onscreen_keyboard.xml | 40 +++++----- .../res/layout/onscreen_layout.xml | 2 +- .../res/layout/widget_layout.xml | 4 +- 37 files changed, 131 insertions(+), 131 deletions(-) rename android-app-core/res/layout/{widget_app_button.xml => cpp_simple_app_button.xml} (85%) rename android-app-core/res/layout/{widget_clear_button.xml => cpp_simple_clear_button.xml} (85%) rename android-app-core/res/layout/{widget_copy_button.xml => cpp_simple_copy_button.xml} (85%) rename android-app-core/res/layout/{widget_division_button.xml => cpp_simple_division_button.xml} (82%) rename android-app-core/res/layout/{widget_dot_button.xml => cpp_simple_dot_button.xml} (100%) rename android-app-core/res/layout/{widget_eight_digit_button.xml => cpp_simple_eight_digit_button.xml} (84%) rename android-app-core/res/layout/{widget_equals_button.xml => cpp_simple_equals_button.xml} (84%) rename android-app-core/res/layout/{widget_erase_button.xml => cpp_simple_erase_button.xml} (85%) rename android-app-core/res/layout/{widget_five_digit_button.xml => cpp_simple_five_digit_button.xml} (84%) rename android-app-core/res/layout/{widget_four_digit_button.xml => cpp_simple_four_digit_button.xml} (84%) rename android-app-core/res/layout/{widget_functions_button.xml => cpp_simple_functions_button.xml} (85%) rename android-app-core/res/layout/{widget_history_button.xml => cpp_simple_history_button.xml} (86%) create mode 100644 android-app-core/res/layout/cpp_simple_keyboard.xml rename android-app-core/res/layout/{widget_left_button.xml => cpp_simple_left_button.xml} (84%) rename android-app-core/res/layout/{widget_like_button.xml => cpp_simple_like_button.xml} (85%) rename android-app-core/res/layout/{widget_multiplication_button.xml => cpp_simple_multiplication_button.xml} (83%) rename android-app-core/res/layout/{widget_nine_digit_button.xml => cpp_simple_nine_digit_button.xml} (84%) rename android-app-core/res/layout/{widget_one_digit_button.xml => cpp_simple_one_digit_button.xml} (84%) rename android-app-core/res/layout/{widget_paste_button.xml => cpp_simple_paste_button.xml} (85%) rename android-app-core/res/layout/{widget_percent_button.xml => cpp_simple_percent_button.xml} (82%) rename android-app-core/res/layout/{widget_plus_button.xml => cpp_simple_plus_button.xml} (82%) rename android-app-core/res/layout/{widget_power_button.xml => cpp_simple_power_button.xml} (82%) rename android-app-core/res/layout/{widget_right_button.xml => cpp_simple_right_button.xml} (84%) rename android-app-core/res/layout/{widget_round_brackets_button.xml => cpp_simple_round_brackets_button.xml} (84%) rename android-app-core/res/layout/{widget_settings_button.xml => cpp_simple_settings_button.xml} (85%) rename android-app-core/res/layout/{widget_seven_digit_button.xml => cpp_simple_seven_digit_button.xml} (72%) rename android-app-core/res/layout/{widget_six_digit_button.xml => cpp_simple_six_digit_button.xml} (84%) rename android-app-core/res/layout/{widget_subtraction_button.xml => cpp_simple_subtraction_button.xml} (82%) rename android-app-core/res/layout/{widget_three_digit_button.xml => cpp_simple_three_digit_button.xml} (84%) rename android-app-core/res/layout/{widget_two_digit_button.xml => cpp_simple_two_digit_button.xml} (84%) rename android-app-core/res/layout/{widget_vars_button.xml => cpp_simple_vars_button.xml} (85%) rename android-app-core/res/layout/{widget_zero_digit_button.xml => cpp_simple_zero_digit_button.xml} (84%) delete mode 100644 android-app-core/res/layout/widget_keyboard.xml diff --git a/android-app-core/res/layout/widget_app_button.xml b/android-app-core/res/layout/cpp_simple_app_button.xml similarity index 85% rename from android-app-core/res/layout/widget_app_button.xml rename to android-app-core/res/layout/cpp_simple_app_button.xml index 1149f1e2..754fccce 100644 --- a/android-app-core/res/layout/widget_app_button.xml +++ b/android-app-core/res/layout/cpp_simple_app_button.xml @@ -9,5 +9,5 @@ \ No newline at end of file diff --git a/android-app-core/res/layout/widget_clear_button.xml b/android-app-core/res/layout/cpp_simple_clear_button.xml similarity index 85% rename from android-app-core/res/layout/widget_clear_button.xml rename to android-app-core/res/layout/cpp_simple_clear_button.xml index 8715b738..9e5a9e7b 100644 --- a/android-app-core/res/layout/widget_clear_button.xml +++ b/android-app-core/res/layout/cpp_simple_clear_button.xml @@ -10,4 +10,4 @@ a:id="@+id/clearButton" a:text="@string/c_clear" a:textStyle="bold" - style="@style/widget_metro_control_button_style"/> \ No newline at end of file + style="@style/cpp_simple_metro_control_button_style"/> \ No newline at end of file diff --git a/android-app-core/res/layout/widget_copy_button.xml b/android-app-core/res/layout/cpp_simple_copy_button.xml similarity index 85% rename from android-app-core/res/layout/widget_copy_button.xml rename to android-app-core/res/layout/cpp_simple_copy_button.xml index eac06ff0..4c383d47 100644 --- a/android-app-core/res/layout/widget_copy_button.xml +++ b/android-app-core/res/layout/cpp_simple_copy_button.xml @@ -9,5 +9,5 @@ \ No newline at end of file diff --git a/android-app-core/res/layout/widget_division_button.xml b/android-app-core/res/layout/cpp_simple_division_button.xml similarity index 82% rename from android-app-core/res/layout/widget_division_button.xml rename to android-app-core/res/layout/cpp_simple_division_button.xml index 1a99c28b..24e67794 100644 --- a/android-app-core/res/layout/widget_division_button.xml +++ b/android-app-core/res/layout/cpp_simple_division_button.xml @@ -9,4 +9,4 @@