From 42acacee322ef71c87fe9b5b46a3882914408ac9 Mon Sep 17 00:00:00 2001 From: serso Date: Fri, 19 Oct 2012 18:20:03 +0400 Subject: [PATCH 1/2] Widget implementation --- .../calculator/CalculatorButtonActions.java | 25 + .../calculator/CalculatorEventType.java | 16 +- .../android/calculator/CalculatorImpl.java | 6 +- .../calculator/CalculatorKeyboard.java | 50 +- .../calculator/CalculatorKeyboardImpl.java | 249 ++++--- calculatorpp/AndroidManifest.xml | 20 + calculatorpp/project.properties | 48 +- calculatorpp/res/layout/calc_left_button.xml | 32 +- calculatorpp/res/layout/calc_right_button.xml | 32 +- .../res/layout/widget_clear_button.xml | 13 + .../res/layout/widget_copy_button.xml | 12 + calculatorpp/res/layout/widget_display.xml | 17 + .../res/layout/widget_division_button.xml | 12 + calculatorpp/res/layout/widget_dot_button.xml | 12 + calculatorpp/res/layout/widget_editor.xml | 24 + .../res/layout/widget_eight_digit_button.xml | 12 + .../res/layout/widget_equals_button.xml | 12 + .../res/layout/widget_erase_button.xml | 12 + .../res/layout/widget_five_digit_button.xml | 11 + .../res/layout/widget_four_digit_button.xml | 11 + .../res/layout/widget_functions_button.xml | 13 + .../res/layout/widget_history_button.xml | 12 + calculatorpp/res/layout/widget_keyboard.xml | 69 ++ calculatorpp/res/layout/widget_layout.xml | 36 + .../res/layout/widget_left_button.xml | 12 + .../layout/widget_multiplication_button.xml | 12 + .../res/layout/widget_nine_digit_button.xml | 12 + .../res/layout/widget_one_digit_button.xml | 12 + .../res/layout/widget_paste_button.xml | 12 + .../res/layout/widget_plus_button.xml | 11 + .../res/layout/widget_right_button.xml | 12 + .../layout/widget_round_brackets_button.xml | 12 + .../res/layout/widget_seven_digit_button.xml | 6 + .../res/layout/widget_six_digit_button.xml | 12 + .../res/layout/widget_subtraction_button.xml | 11 + .../res/layout/widget_three_digit_button.xml | 12 + .../res/layout/widget_two_digit_button.xml | 12 + .../res/layout/widget_vars_button.xml | 13 + .../res/layout/widget_zero_digit_button.xml | 12 + .../res/xml/calculator_widget_info.xml | 10 + .../calculator/AbstractCalculatorHelper.java | 476 ++++++------- .../android/calculator/AndroidCalculator.java | 364 +++++----- .../calculator/CalculatorActivity.java | 635 +++++++++--------- .../calculator/DigitButtonDragProcessor.java | 74 +- .../view/NumeralBaseConverterDialog.java | 2 +- ...CalculatorWidgetConfigurationActivity.java | 11 + .../widget/CalculatorWidgetController.java | 11 + .../widget/CalculatorWidgetProvider.java | 46 ++ 48 files changed, 1599 insertions(+), 959 deletions(-) create mode 100644 calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorButtonActions.java create mode 100644 calculatorpp/res/layout/widget_clear_button.xml create mode 100644 calculatorpp/res/layout/widget_copy_button.xml create mode 100644 calculatorpp/res/layout/widget_display.xml create mode 100644 calculatorpp/res/layout/widget_division_button.xml create mode 100644 calculatorpp/res/layout/widget_dot_button.xml create mode 100644 calculatorpp/res/layout/widget_editor.xml create mode 100644 calculatorpp/res/layout/widget_eight_digit_button.xml create mode 100644 calculatorpp/res/layout/widget_equals_button.xml create mode 100644 calculatorpp/res/layout/widget_erase_button.xml create mode 100644 calculatorpp/res/layout/widget_five_digit_button.xml create mode 100644 calculatorpp/res/layout/widget_four_digit_button.xml create mode 100644 calculatorpp/res/layout/widget_functions_button.xml create mode 100644 calculatorpp/res/layout/widget_history_button.xml create mode 100644 calculatorpp/res/layout/widget_keyboard.xml create mode 100644 calculatorpp/res/layout/widget_layout.xml create mode 100644 calculatorpp/res/layout/widget_left_button.xml create mode 100644 calculatorpp/res/layout/widget_multiplication_button.xml create mode 100644 calculatorpp/res/layout/widget_nine_digit_button.xml create mode 100644 calculatorpp/res/layout/widget_one_digit_button.xml create mode 100644 calculatorpp/res/layout/widget_paste_button.xml create mode 100644 calculatorpp/res/layout/widget_plus_button.xml create mode 100644 calculatorpp/res/layout/widget_right_button.xml create mode 100644 calculatorpp/res/layout/widget_round_brackets_button.xml create mode 100644 calculatorpp/res/layout/widget_seven_digit_button.xml create mode 100644 calculatorpp/res/layout/widget_six_digit_button.xml create mode 100644 calculatorpp/res/layout/widget_subtraction_button.xml create mode 100644 calculatorpp/res/layout/widget_three_digit_button.xml create mode 100644 calculatorpp/res/layout/widget_two_digit_button.xml create mode 100644 calculatorpp/res/layout/widget_vars_button.xml create mode 100644 calculatorpp/res/layout/widget_zero_digit_button.xml create mode 100644 calculatorpp/res/xml/calculator_widget_info.xml create mode 100644 calculatorpp/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetConfigurationActivity.java create mode 100644 calculatorpp/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetController.java create mode 100644 calculatorpp/src/main/java/org/solovyev/android/calculator/widget/CalculatorWidgetProvider.java diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorButtonActions.java b/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorButtonActions.java new file mode 100644 index 00000000..654f5e32 --- /dev/null +++ b/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorButtonActions.java @@ -0,0 +1,25 @@ +package org.solovyev.android.calculator; + +/** + * User: Solovyev_S + * Date: 19.10.12 + * Time: 17:31 + */ +public final class CalculatorButtonActions { + + public static final String ERASE = "erase"; + public static final String PASTE = "paste"; + public static final String COPY = "copy"; + public static final String CLEAR = "clear"; + public static final String SHOW_FUNCTIONS = "functions"; + public static final String SHOW_VARS = "vars"; + public static final String SHOW_OPERATORS = "operators"; + + private CalculatorButtonActions() { + throw new AssertionError(); + } + + public static final String SHOW_HISTORY = "history"; + public static final String MOVE_CURSOR_RIGHT = "▶"; + public static final String MOVE_CURSOR_LEFT = "◀"; +} diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEventType.java b/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEventType.java index 6bb96dd0..12af91ab 100644 --- a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEventType.java +++ b/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEventType.java @@ -88,6 +88,8 @@ public enum CalculatorEventType { clear_history_requested, + show_history, + /* ********************************************************************** * @@ -112,7 +114,19 @@ public enum CalculatorEventType { constant_changed, // @NotNull IConstant - constant_removed; + constant_removed, + + /* + ********************************************************************** + * + * OTHER + * + ********************************************************************** + */ + + show_functions, + show_vars, + show_operators; public boolean isOfType(@NotNull CalculatorEventType... types) { for (CalculatorEventType type : types) { diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorImpl.java b/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorImpl.java index 0ae353da..20092c0a 100644 --- a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorImpl.java +++ b/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorImpl.java @@ -409,17 +409,17 @@ public class CalculatorImpl implements Calculator, CalculatorEventListener { case use_constant: final IConstant constant = (IConstant)data; - CalculatorLocatorImpl.getInstance().getKeyboard().digitButtonPressed(constant.getName()); + CalculatorLocatorImpl.getInstance().getKeyboard().buttonPressed(constant.getName()); break; case use_operator: final Operator operator = (Operator)data; - CalculatorLocatorImpl.getInstance().getKeyboard().digitButtonPressed(operator.getName()); + CalculatorLocatorImpl.getInstance().getKeyboard().buttonPressed(operator.getName()); break; case use_function: final Function function = (Function)data; - CalculatorLocatorImpl.getInstance().getKeyboard().digitButtonPressed(function.getName()); + CalculatorLocatorImpl.getInstance().getKeyboard().buttonPressed(function.getName()); break; } diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorKeyboard.java b/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorKeyboard.java index 9219ae1f..ff81371c 100644 --- a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorKeyboard.java +++ b/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorKeyboard.java @@ -1,25 +1,25 @@ -package org.solovyev.android.calculator; - -import org.jetbrains.annotations.Nullable; - -/** - * User: serso - * Date: 9/22/12 - * Time: 1:08 PM - */ -public interface CalculatorKeyboard { - - void digitButtonPressed(@Nullable String text); - - void roundBracketsButtonPressed(); - - void pasteButtonPressed(); - - void clearButtonPressed(); - - void copyButtonPressed(); - - void moveCursorLeft(); - - void moveCursorRight(); -} +package org.solovyev.android.calculator; + +import org.jetbrains.annotations.Nullable; + +/** + * User: serso + * Date: 9/22/12 + * Time: 1:08 PM + */ +public interface CalculatorKeyboard { + + void buttonPressed(@Nullable String text); + + void roundBracketsButtonPressed(); + + void pasteButtonPressed(); + + void clearButtonPressed(); + + void copyButtonPressed(); + + void moveCursorLeft(); + + void moveCursorRight(); +} diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorKeyboardImpl.java b/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorKeyboardImpl.java index 4a90ad1d..9701095c 100644 --- a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorKeyboardImpl.java +++ b/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorKeyboardImpl.java @@ -1,107 +1,142 @@ -package org.solovyev.android.calculator; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.solovyev.android.calculator.math.MathType; -import org.solovyev.common.text.StringUtils; - -/** - * User: serso - * Date: 9/22/12 - * Time: 1:08 PM - */ -public class CalculatorKeyboardImpl implements CalculatorKeyboard { - - @NotNull - private final Calculator calculator; - - public CalculatorKeyboardImpl(@NotNull Calculator calculator) { - this.calculator = calculator; - } - - @Override - public void digitButtonPressed(@Nullable final String text) { - - if (!StringUtils.isEmpty(text)) { - assert text != null; - - int cursorPositionOffset = 0; - final StringBuilder textToBeInserted = new StringBuilder(text); - - final MathType.Result mathType = MathType.getType(text, 0, false); - switch (mathType.getMathType()) { - case function: - textToBeInserted.append("()"); - cursorPositionOffset = -1; - break; - case operator: - textToBeInserted.append("()"); - cursorPositionOffset = -1; - break; - case comma: - textToBeInserted.append(" "); - break; - } - - if (cursorPositionOffset == 0) { - if (MathType.openGroupSymbols.contains(text)) { - cursorPositionOffset = -1; - } - } - - final CalculatorEditor editor = CalculatorLocatorImpl.getInstance().getEditor(); - editor.insert(textToBeInserted.toString(), cursorPositionOffset); - } - } - - @Override - public void roundBracketsButtonPressed() { - final CalculatorEditor editor = CalculatorLocatorImpl.getInstance().getEditor(); - CalculatorEditorViewState viewState = editor.getViewState(); - - final int cursorPosition = viewState.getSelection(); - final String oldText = viewState.getText(); - - final StringBuilder newText = new StringBuilder(oldText.length() + 2); - newText.append("("); - newText.append(oldText.substring(0, cursorPosition)); - newText.append(")"); - newText.append(oldText.substring(cursorPosition)); - editor.setText(newText.toString(), cursorPosition + 2); - } - - @Override - public void pasteButtonPressed() { - final String text = CalculatorLocatorImpl.getInstance().getClipboard().getText(); - if (text != null) { - CalculatorLocatorImpl.getInstance().getEditor().insert(text); - } - } - - @Override - public void clearButtonPressed() { - CalculatorLocatorImpl.getInstance().getEditor().clear(); - } - - @Override - public void copyButtonPressed() { - final CalculatorDisplayViewState displayViewState = CalculatorLocatorImpl.getInstance().getDisplay().getViewState(); - if (displayViewState.isValid()) { - final CharSequence text = displayViewState.getText(); - if (!StringUtils.isEmpty(text)) { - CalculatorLocatorImpl.getInstance().getClipboard().setText(text); - CalculatorLocatorImpl.getInstance().getNotifier().showMessage(CalculatorMessage.newInfoMessage(CalculatorMessages.result_copied)); - } - } - } - - @Override - public void moveCursorLeft() { - CalculatorLocatorImpl.getInstance().getEditor().moveCursorLeft(); - } - - @Override - public void moveCursorRight() { - CalculatorLocatorImpl.getInstance().getEditor().moveCursorRight(); - } -} +package org.solovyev.android.calculator; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.solovyev.android.calculator.math.MathType; +import org.solovyev.common.text.StringUtils; + +/** + * User: serso + * Date: 9/22/12 + * Time: 1:08 PM + */ +public class CalculatorKeyboardImpl implements CalculatorKeyboard { + + @NotNull + private final Calculator calculator; + + public CalculatorKeyboardImpl(@NotNull Calculator calculator) { + this.calculator = calculator; + } + + @Override + public void buttonPressed(@Nullable final String text) { + + if (!StringUtils.isEmpty(text)) { + assert text != null; + + // process special buttons + boolean processed = processSpecialButtons(text); + + if (!processed) { + int cursorPositionOffset = 0; + final StringBuilder textToBeInserted = new StringBuilder(text); + + final MathType.Result mathType = MathType.getType(text, 0, false); + switch (mathType.getMathType()) { + case function: + textToBeInserted.append("()"); + cursorPositionOffset = -1; + break; + case operator: + textToBeInserted.append("()"); + cursorPositionOffset = -1; + break; + case comma: + textToBeInserted.append(" "); + break; + } + + if (cursorPositionOffset == 0) { + if (MathType.openGroupSymbols.contains(text)) { + cursorPositionOffset = -1; + } + } + + final CalculatorEditor editor = CalculatorLocatorImpl.getInstance().getEditor(); + editor.insert(textToBeInserted.toString(), cursorPositionOffset); + } + } + } + + private boolean processSpecialButtons(@NotNull String text) { + boolean result = false; + + if (CalculatorButtonActions.MOVE_CURSOR_LEFT.equals(text)) { + this.moveCursorLeft(); + result = true; + } else if (CalculatorButtonActions.MOVE_CURSOR_RIGHT.equals(text)) { + this.moveCursorRight(); + result = true; + } else if (CalculatorButtonActions.SHOW_HISTORY.equals(text)) { + CalculatorLocatorImpl.getInstance().getCalculator().fireCalculatorEvent(CalculatorEventType.show_history, null); + } else if (CalculatorButtonActions.ERASE.equals(text)) { + CalculatorLocatorImpl.getInstance().getEditor().erase(); + } else if (CalculatorButtonActions.COPY.equals(text)) { + copyButtonPressed(); + } else if (CalculatorButtonActions.PASTE.equals(text)) { + pasteButtonPressed(); + } else if (CalculatorButtonActions.CLEAR.equals(text)) { + clearButtonPressed(); + } else if (CalculatorButtonActions.SHOW_FUNCTIONS.equals(text)) { + CalculatorLocatorImpl.getInstance().getCalculator().fireCalculatorEvent(CalculatorEventType.show_functions, null); + } else if (CalculatorButtonActions.SHOW_OPERATORS.equals(text)) { + CalculatorLocatorImpl.getInstance().getCalculator().fireCalculatorEvent(CalculatorEventType.show_operators, null); + } else if (CalculatorButtonActions.SHOW_VARS.equals(text)) { + CalculatorLocatorImpl.getInstance().getCalculator().fireCalculatorEvent(CalculatorEventType.show_vars, null); + } + + return result; + } + + @Override + public void roundBracketsButtonPressed() { + final CalculatorEditor editor = CalculatorLocatorImpl.getInstance().getEditor(); + CalculatorEditorViewState viewState = editor.getViewState(); + + final int cursorPosition = viewState.getSelection(); + final String oldText = viewState.getText(); + + final StringBuilder newText = new StringBuilder(oldText.length() + 2); + newText.append("("); + newText.append(oldText.substring(0, cursorPosition)); + newText.append(")"); + newText.append(oldText.substring(cursorPosition)); + editor.setText(newText.toString(), cursorPosition + 2); + } + + @Override + public void pasteButtonPressed() { + final String text = CalculatorLocatorImpl.getInstance().getClipboard().getText(); + if (text != null) { + CalculatorLocatorImpl.getInstance().getEditor().insert(text); + } + } + + @Override + public void clearButtonPressed() { + CalculatorLocatorImpl.getInstance().getEditor().clear(); + } + + @Override + public void copyButtonPressed() { + final CalculatorDisplayViewState displayViewState = CalculatorLocatorImpl.getInstance().getDisplay().getViewState(); + if (displayViewState.isValid()) { + final CharSequence text = displayViewState.getText(); + if (!StringUtils.isEmpty(text)) { + CalculatorLocatorImpl.getInstance().getClipboard().setText(text); + CalculatorLocatorImpl.getInstance().getNotifier().showMessage(CalculatorMessage.newInfoMessage(CalculatorMessages.result_copied)); + } + } + } + + @Override + public void moveCursorLeft() { + CalculatorLocatorImpl.getInstance().getEditor().moveCursorLeft(); + } + + @Override + public void moveCursorRight() { + CalculatorLocatorImpl.getInstance().getEditor().moveCursorRight(); + } +} diff --git a/calculatorpp/AndroidManifest.xml b/calculatorpp/AndroidManifest.xml index e21a643d..feff4416 100644 --- a/calculatorpp/AndroidManifest.xml +++ b/calculatorpp/AndroidManifest.xml @@ -37,9 +37,29 @@ + + + + + + + + + + + + + + + diff --git a/calculatorpp/project.properties b/calculatorpp/project.properties index 78b254f4..03180409 100644 --- a/calculatorpp/project.properties +++ b/calculatorpp/project.properties @@ -1,24 +1,24 @@ -# This file is automatically generated by Android Tools. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file must be checked in Version Control Systems. -# -# To customize properties used by the Ant build system use, -# "ant.properties", and override values to adapt the script to your -# project structure. - -# Project target. -target=android-15 -android.library.reference.1=gen-external-apklibs/org.solovyev.android_android-common-core_1.0.0 -android.library.reference.2=gen-external-apklibs/org.solovyev.android_android-common-ads_1.0.0 -android.library.reference.3=gen-external-apklibs/org.solovyev.android_billing_0.2 -android.library.reference.4=gen-external-apklibs/org.solovyev.android_android-common-db_1.0.0 -android.library.reference.5=gen-external-apklibs/org.solovyev.android_android-common-view_1.0.0 -android.library.reference.6=gen-external-apklibs/org.solovyev.android_android-common-preferences_1.0.0 -android.library.reference.7=gen-external-apklibs/org.solovyev.android_android-common-other_1.0.0 -android.library.reference.8=gen-external-apklibs/org.solovyev.android_android-common-menu_1.0.0 -android.library.reference.9=gen-external-apklibs/org.solovyev.android_android-common-sherlock_1.0.0 -android.library.reference.10=gen-external-apklibs/com.actionbarsherlock_library_4.1.0 -android.library.reference.11=gen-external-apklibs/org.solovyev.android_android-common-list_1.0.0 - - +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "ant.properties", and override values to adapt the script to your +# project structure. + +# Project target. +target=android-15 +android.library.reference.1=gen-external-apklibs/org.solovyev.android_android-common-core_1.0.0 +android.library.reference.2=gen-external-apklibs/org.solovyev.android_android-common-ads_1.0.0 +android.library.reference.3=gen-external-apklibs/org.solovyev.android_billing_0.2 +android.library.reference.4=gen-external-apklibs/org.solovyev.android_android-common-db_1.0.0 +android.library.reference.5=gen-external-apklibs/org.solovyev.android_android-common-view_1.0.0 +android.library.reference.6=gen-external-apklibs/org.solovyev.android_android-common-preferences_1.0.0 +android.library.reference.7=gen-external-apklibs/org.solovyev.android_android-common-other_1.0.0 +android.library.reference.8=gen-external-apklibs/org.solovyev.android_android-common-menu_1.0.0 +android.library.reference.9=gen-external-apklibs/org.solovyev.android_android-common-sherlock_1.0.0 +android.library.reference.10=gen-external-apklibs/com.actionbarsherlock_library_4.1.0 +android.library.reference.11=gen-external-apklibs/org.solovyev.android_android-common-list_1.0.0 + + diff --git a/calculatorpp/res/layout/calc_left_button.xml b/calculatorpp/res/layout/calc_left_button.xml index fb80b8e5..9ca3cfeb 100644 --- a/calculatorpp/res/layout/calc_left_button.xml +++ b/calculatorpp/res/layout/calc_left_button.xml @@ -1,16 +1,16 @@ - - - - - \ No newline at end of file + + + + + \ No newline at end of file diff --git a/calculatorpp/res/layout/calc_right_button.xml b/calculatorpp/res/layout/calc_right_button.xml index c51a0d3e..943ab992 100644 --- a/calculatorpp/res/layout/calc_right_button.xml +++ b/calculatorpp/res/layout/calc_right_button.xml @@ -1,16 +1,16 @@ - - - - - \ No newline at end of file + + + + + \ No newline at end of file diff --git a/calculatorpp/res/layout/widget_clear_button.xml b/calculatorpp/res/layout/widget_clear_button.xml new file mode 100644 index 00000000..efb88b02 --- /dev/null +++ b/calculatorpp/res/layout/widget_clear_button.xml @@ -0,0 +1,13 @@ + + + + +