From bf0aa44f4f6fd817702143f1fdaed0a2217f7b68 Mon Sep 17 00:00:00 2001 From: Sergey Solovyev Date: Sat, 20 Oct 2012 16:22:25 +0400 Subject: [PATCH] Calculator++ widget --- .../calculator/CalculatorButtonActions.java | 38 +- .../CalculatorDisplayViewState.java | 4 +- .../CalculatorDisplayViewStateImpl.java | 26 +- .../calculator/CalculatorEditorImpl.java | 620 ++++++++--------- .../calculator/CalculatorEditorViewState.java | 34 +- .../calculator/CalculatorEventType.java | 295 ++++---- .../calculator/CalculatorKeyboardImpl.java | 266 ++++---- .../calculator/CalculatorNotifier.java | 2 + .../calculator/CalculatorSpecialButton.java | 155 +++++ .../calculator/DummyCalculatorNotifier.java | 4 + .../ListCalculatorEventContainer.java | 1 + .../CalculatorDisplayViewStateImplTest.java | 23 + .../CalculatorEditorViewStateImplTest.java | 21 + .../calculator/CalculatorTestUtils.java | 37 +- calculatorpp/AndroidManifest.xml | 155 ++--- calculatorpp/misc/res/widget.png | Bin 0 -> 58263 bytes calculatorpp/res/drawable-hdpi/kb_logo.png | Bin 0 -> 3977 bytes .../res/drawable-hdpi/kb_settings.png | Bin 0 -> 1141 bytes .../res/drawable-hdpi/logo_square.png | Bin 0 -> 18608 bytes calculatorpp/res/drawable-ldpi/kb_logo.png | Bin 0 -> 3349 bytes .../res/drawable-ldpi/kb_settings.png | Bin 0 -> 590 bytes calculatorpp/res/drawable-mdpi/kb_logo.png | Bin 0 -> 3441 bytes .../res/drawable-mdpi/kb_settings.png | Bin 0 -> 868 bytes .../res/drawable-nodpi/widget_preview.png | Bin 0 -> 24127 bytes .../drawable-xhdpi/ic_menu_preferences.png | Bin 0 -> 2519 bytes calculatorpp/res/drawable-xhdpi/kb_logo.png | Bin 0 -> 3989 bytes .../res/drawable-xhdpi/kb_settings.png | Bin 0 -> 1711 bytes .../res/drawable-xlarge-hdpi/kb_logo.png | Bin 0 -> 3989 bytes .../res/drawable-xlarge-hdpi/kb_settings.png | Bin 0 -> 1711 bytes calculatorpp/res/layout/calc_copy_button.xml | 26 +- calculatorpp/res/layout/calc_dot_button.xml | 2 +- calculatorpp/res/layout/widget_app_button.xml | 13 + .../res/layout/widget_clear_button.xml | 26 +- .../res/layout/widget_copy_button.xml | 25 +- calculatorpp/res/layout/widget_display.xml | 33 +- .../res/layout/widget_division_button.xml | 24 +- calculatorpp/res/layout/widget_dot_button.xml | 22 +- calculatorpp/res/layout/widget_editor.xml | 46 +- .../res/layout/widget_eight_digit_button.xml | 24 +- .../res/layout/widget_equals_button.xml | 24 +- .../res/layout/widget_erase_button.xml | 25 +- .../res/layout/widget_five_digit_button.xml | 22 +- .../res/layout/widget_four_digit_button.xml | 22 +- .../res/layout/widget_functions_button.xml | 26 +- .../res/layout/widget_history_button.xml | 22 +- calculatorpp/res/layout/widget_keyboard.xml | 141 ++-- calculatorpp/res/layout/widget_layout.xml | 70 +- .../res/layout/widget_left_button.xml | 24 +- .../res/layout/widget_like_button.xml | 13 + .../layout/widget_multiplication_button.xml | 24 +- .../res/layout/widget_nine_digit_button.xml | 24 +- .../res/layout/widget_one_digit_button.xml | 24 +- .../res/layout/widget_paste_button.xml | 25 +- .../res/layout/widget_percent_button.xml | 12 + .../res/layout/widget_plus_button.xml | 22 +- .../res/layout/widget_power_button.xml | 12 + .../res/layout/widget_right_button.xml | 24 +- .../layout/widget_round_brackets_button.xml | 24 +- .../res/layout/widget_settings_button.xml | 13 + .../res/layout/widget_seven_digit_button.xml | 12 +- .../res/layout/widget_six_digit_button.xml | 24 +- .../res/layout/widget_subtraction_button.xml | 22 +- .../res/layout/widget_three_digit_button.xml | 24 +- .../res/layout/widget_two_digit_button.xml | 24 +- .../res/layout/widget_vars_button.xml | 26 +- .../res/layout/widget_zero_digit_button.xml | 24 +- calculatorpp/res/values/colors.xml | 1 + calculatorpp/res/values/dimens.xml | 44 +- calculatorpp/res/values/styles.xml | 8 + calculatorpp/res/values/theme_default.xml | 4 + calculatorpp/res/values/theme_metro_blue.xml | 16 + calculatorpp/res/values/theme_metro_green.xml | 19 +- .../res/values/theme_metro_purple.xml | 18 +- .../res/xml/calculator_widget_info.xml | 18 +- .../org/solovyev/android/AndroidUtils2.java | 75 +- .../android/calculator/AndroidCalculator.java | 409 +++++------ .../AndroidCalculatorEditorView.java | 61 +- .../calculator/AndroidCalculatorNotifier.java | 30 +- .../calculator/CalculatorActivity.java | 638 +++++++++--------- .../CalculatorActivityLauncher.java | 223 +++--- .../calculator/CalculatorApplication.java | 18 +- .../widget/CalculatorWidgetController.java | 11 - .../widget/CalculatorWidgetHelper.java | 65 ++ .../widget/CalculatorWidgetProvider.java | 245 +++++-- .../calculator/widget/WidgetButton.java | 94 +++ 85 files changed, 2708 insertions(+), 1960 deletions(-) create mode 100644 calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorSpecialButton.java create mode 100644 calculatorpp-core/src/test/java/org/solovyev/android/calculator/CalculatorDisplayViewStateImplTest.java create mode 100644 calculatorpp-core/src/test/java/org/solovyev/android/calculator/CalculatorEditorViewStateImplTest.java create mode 100644 calculatorpp/misc/res/widget.png create mode 100644 calculatorpp/res/drawable-hdpi/kb_logo.png create mode 100644 calculatorpp/res/drawable-hdpi/kb_settings.png create mode 100644 calculatorpp/res/drawable-hdpi/logo_square.png create mode 100644 calculatorpp/res/drawable-ldpi/kb_logo.png create mode 100644 calculatorpp/res/drawable-ldpi/kb_settings.png create mode 100644 calculatorpp/res/drawable-mdpi/kb_logo.png create mode 100644 calculatorpp/res/drawable-mdpi/kb_settings.png create mode 100644 calculatorpp/res/drawable-nodpi/widget_preview.png create mode 100755 calculatorpp/res/drawable-xhdpi/ic_menu_preferences.png create mode 100644 calculatorpp/res/drawable-xhdpi/kb_logo.png create mode 100644 calculatorpp/res/drawable-xhdpi/kb_settings.png create mode 100644 calculatorpp/res/drawable-xlarge-hdpi/kb_logo.png create mode 100644 calculatorpp/res/drawable-xlarge-hdpi/kb_settings.png create mode 100644 calculatorpp/res/layout/widget_app_button.xml create mode 100644 calculatorpp/res/layout/widget_like_button.xml create mode 100644 calculatorpp/res/layout/widget_percent_button.xml create mode 100644 calculatorpp/res/layout/widget_power_button.xml create mode 100644 calculatorpp/res/layout/widget_settings_button.xml delete 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/CalculatorWidgetHelper.java create mode 100644 calculatorpp/src/main/java/org/solovyev/android/calculator/widget/WidgetButton.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 index 654f5e32..4528d255 100644 --- a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorButtonActions.java +++ b/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorButtonActions.java @@ -1,25 +1,13 @@ -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 = "◀"; -} +package org.solovyev.android.calculator; + +/** + * User: Solovyev_S + * Date: 19.10.12 + * Time: 17:31 + */ +public final class CalculatorButtonActions { + + private CalculatorButtonActions() { + throw new AssertionError(); + } +} diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorDisplayViewState.java b/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorDisplayViewState.java index 2fdc83b3..d6794d4b 100644 --- a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorDisplayViewState.java +++ b/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorDisplayViewState.java @@ -5,12 +5,14 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.solovyev.android.calculator.jscl.JsclOperation; +import java.io.Serializable; + /** * User: serso * Date: 9/20/12 * Time: 9:50 PM */ -public interface CalculatorDisplayViewState { +public interface CalculatorDisplayViewState extends Serializable { @NotNull String getText(); diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorDisplayViewStateImpl.java b/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorDisplayViewStateImpl.java index ac13a9bc..3772656a 100644 --- a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorDisplayViewStateImpl.java +++ b/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorDisplayViewStateImpl.java @@ -13,11 +13,19 @@ import org.solovyev.common.text.StringUtils; */ public class CalculatorDisplayViewStateImpl implements CalculatorDisplayViewState { + /* + ********************************************************************** + * + * FIELDS + * + ********************************************************************** + */ + @NotNull private JsclOperation operation = JsclOperation.numeric; @Nullable - private Generic result; + private transient Generic result; @Nullable private String stringResult = ""; @@ -29,6 +37,14 @@ public class CalculatorDisplayViewStateImpl implements CalculatorDisplayViewStat private int selection = 0; + /* + ********************************************************************** + * + * CONSTRUCTORS + * + ********************************************************************** + */ + private CalculatorDisplayViewStateImpl() { } @@ -62,6 +78,14 @@ public class CalculatorDisplayViewStateImpl implements CalculatorDisplayViewStat return calculatorDisplayState; } + /* + ********************************************************************** + * + * METHODS + * + ********************************************************************** + */ + @NotNull @Override public String getText() { diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEditorImpl.java b/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEditorImpl.java index 4636f8c2..64b344ff 100644 --- a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEditorImpl.java +++ b/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEditorImpl.java @@ -1,309 +1,311 @@ -package org.solovyev.android.calculator; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.solovyev.android.calculator.history.CalculatorHistoryState; -import org.solovyev.android.calculator.history.EditorHistoryState; -import org.solovyev.common.gui.CursorControl; -import org.solovyev.common.text.StringUtils; - -/** - * User: Solovyev_S - * Date: 21.09.12 - * Time: 11:53 - */ -public class CalculatorEditorImpl implements CalculatorEditor { - - @Nullable - private CalculatorEditorView view; - - @NotNull - private final Object viewLock = new Object(); - - @NotNull - private CalculatorEditorViewState lastViewState = CalculatorEditorViewStateImpl.newDefaultInstance(); - - @NotNull - private final Calculator calculator; - - @NotNull - private final CalculatorEventHolder lastEventHolder; - - @NotNull - private final CursorControlAdapter cursorControlAdapter = new CursorControlAdapter(this); - - public CalculatorEditorImpl(@NotNull Calculator calculator) { - this.calculator = calculator; - this.calculator.addCalculatorEventListener(this); - this.lastEventHolder = new CalculatorEventHolder(CalculatorUtils.createFirstEventDataId()); - } - - @Override - public void setView(@Nullable CalculatorEditorView view) { - synchronized (viewLock) { - this.view = view; - - if ( view != null ) { - view.setState(lastViewState); - } - } - } - - @NotNull - @Override - public CalculatorEditorViewState getViewState() { - return lastViewState; - } - - @Override - public void updateViewState() { - setViewState(this.lastViewState, false); - } - - @Override - public void setViewState(@NotNull CalculatorEditorViewState newViewState) { - setViewState(newViewState, true); - } - - private void setViewState(@NotNull CalculatorEditorViewState newViewState, boolean fireEvent) { - synchronized (viewLock) { - final CalculatorEditorViewState oldViewState = this.lastViewState; - - this.lastViewState = newViewState; - if (this.view != null) { - this.view.setState(newViewState); - } - - if (fireEvent) { - calculator.fireCalculatorEvent(CalculatorEventType.editor_state_changed, new CalculatorEditorChangeEventDataImpl(oldViewState, newViewState)); - } - } - } - - @Override - public void onCalculatorEvent(@NotNull CalculatorEventData calculatorEventData, - @NotNull CalculatorEventType calculatorEventType, - @Nullable Object data) { - final CalculatorEventHolder.Result result = lastEventHolder.apply(calculatorEventData); - - if (result.isNewAfter()) { - switch (calculatorEventType) { - case use_history_state: - final CalculatorHistoryState calculatorHistoryState = (CalculatorHistoryState)data; - final EditorHistoryState editorState = calculatorHistoryState.getEditorState(); - this.setText(StringUtils.getNotEmpty(editorState.getText(), ""), editorState.getCursorPosition()); - break; - } - } - } - - /* - ********************************************************************** - * - * SELECTION - * - ********************************************************************** - */ - - @NotNull - private CalculatorEditorViewState newSelectionViewState(int newSelection) { - if (this.lastViewState.getSelection() != newSelection) { - final CalculatorEditorViewState result = CalculatorEditorViewStateImpl.newSelection(this.lastViewState, newSelection); - setViewState(result, false); - return result; - } else { - return this.lastViewState; - } - } - - @NotNull - public CalculatorEditorViewState setCursorOnStart() { - synchronized (viewLock) { - return newSelectionViewState(0); - } - } - - - @NotNull - public CalculatorEditorViewState setCursorOnEnd() { - synchronized (viewLock) { - return newSelectionViewState(this.lastViewState.getText().length()); - } - } - - @NotNull - public CalculatorEditorViewState moveCursorLeft() { - synchronized (viewLock) { - if (this.lastViewState.getSelection() > 0) { - return newSelectionViewState(this.lastViewState.getSelection() - 1); - } else { - return this.lastViewState; - } - } - } - - @NotNull - public CalculatorEditorViewState moveCursorRight() { - synchronized (viewLock) { - if (this.lastViewState.getSelection() < this.lastViewState.getText().length()) { - return newSelectionViewState(this.lastViewState.getSelection() + 1); - } else { - return this.lastViewState; - } - } - } - - @NotNull - @Override - public CursorControl asCursorControl() { - return cursorControlAdapter; - } - - /* - ********************************************************************** - * - * EDITOR ACTIONS - * - ********************************************************************** - */ - - @NotNull - @Override - public CalculatorEditorViewState erase() { - synchronized (viewLock) { - int selection = this.lastViewState.getSelection(); - final String text = this.lastViewState.getText(); - if (selection > 0 && text.length() > 0 && selection <= text.length()) { - final StringBuilder newText = new StringBuilder(text.length() - 1); - newText.append(text.substring(0, selection - 1)).append(text.substring(selection, text.length())); - - final CalculatorEditorViewState result = CalculatorEditorViewStateImpl.newInstance(newText.toString(), selection - 1); - setViewState(result); - return result; - } else { - return this.lastViewState; - } - } - } - - @NotNull - @Override - public CalculatorEditorViewState clear() { - synchronized (viewLock) { - return setText(""); - } - } - - @NotNull - @Override - public CalculatorEditorViewState setText(@NotNull String text) { - synchronized (viewLock) { - final CalculatorEditorViewState result = CalculatorEditorViewStateImpl.newInstance(text, text.length()); - setViewState(result); - return result; - } - } - - @NotNull - @Override - public CalculatorEditorViewState setText(@NotNull String text, int selection) { - synchronized (viewLock) { - selection = correctSelection(selection, text); - - final CalculatorEditorViewState result = CalculatorEditorViewStateImpl.newInstance(text, selection); - setViewState(result); - return result; - } - } - - @NotNull - @Override - public CalculatorEditorViewState insert(@NotNull String text) { - synchronized (viewLock) { - return insert(text, 0); - } - } - - @NotNull - @Override - public CalculatorEditorViewState insert(@NotNull String text, int selectionOffset) { - synchronized (viewLock) { - final int selection = this.lastViewState.getSelection(); - final String oldText = this.lastViewState.getText(); - - int newTextLength = text.length() + oldText.length(); - final StringBuilder newText = new StringBuilder(newTextLength); - - newText.append(oldText.substring(0, selection)); - newText.append(text); - newText.append(oldText.substring(selection)); - - int newSelection = correctSelection(text.length() + selection + selectionOffset, newTextLength); - final CalculatorEditorViewState result = CalculatorEditorViewStateImpl.newInstance(newText.toString(), newSelection); - setViewState(result); - return result; - } - } - - @NotNull - @Override - public CalculatorEditorViewState moveSelection(int offset) { - synchronized (viewLock) { - int selection = this.lastViewState.getSelection() + offset; - - return setSelection(selection); - } - } - - @NotNull - @Override - public CalculatorEditorViewState setSelection(int selection) { - synchronized (viewLock) { - selection = correctSelection(selection, this.lastViewState.getText()); - - final CalculatorEditorViewState result = CalculatorEditorViewStateImpl.newSelection(this.lastViewState, selection); - setViewState(result, false); - return result; - } - } - - private int correctSelection(int selection, @NotNull String text) { - return correctSelection(selection, text.length()); - } - - private int correctSelection(int selection, int textLength) { - int result = Math.max(selection, 0); - result = Math.min(result, textLength); - return result; - } - - private static final class CursorControlAdapter implements CursorControl { - - @NotNull - private final CalculatorEditor calculatorEditor; - - private CursorControlAdapter(@NotNull CalculatorEditor calculatorEditor) { - this.calculatorEditor = calculatorEditor; - } - - @Override - public void setCursorOnStart() { - this.calculatorEditor.setCursorOnStart(); - } - - @Override - public void setCursorOnEnd() { - this.calculatorEditor.setCursorOnEnd(); - } - - @Override - public void moveCursorLeft() { - this.calculatorEditor.moveCursorLeft(); - } - - @Override - public void moveCursorRight() { - this.calculatorEditor.moveCursorRight(); - } - } -} +package org.solovyev.android.calculator; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.solovyev.android.calculator.history.CalculatorHistoryState; +import org.solovyev.android.calculator.history.EditorHistoryState; +import org.solovyev.common.gui.CursorControl; +import org.solovyev.common.text.StringUtils; + +/** + * User: Solovyev_S + * Date: 21.09.12 + * Time: 11:53 + */ +public class CalculatorEditorImpl implements CalculatorEditor { + + @Nullable + private CalculatorEditorView view; + + @NotNull + private final Object viewLock = new Object(); + + @NotNull + private CalculatorEditorViewState lastViewState = CalculatorEditorViewStateImpl.newDefaultInstance(); + + @NotNull + private final Calculator calculator; + + @NotNull + private final CalculatorEventHolder lastEventHolder; + + @NotNull + private final CursorControlAdapter cursorControlAdapter = new CursorControlAdapter(this); + + public CalculatorEditorImpl(@NotNull Calculator calculator) { + this.calculator = calculator; + this.calculator.addCalculatorEventListener(this); + this.lastEventHolder = new CalculatorEventHolder(CalculatorUtils.createFirstEventDataId()); + } + + @Override + public void setView(@Nullable CalculatorEditorView view) { + synchronized (viewLock) { + this.view = view; + + if ( view != null ) { + view.setState(lastViewState); + } + } + } + + @NotNull + @Override + public CalculatorEditorViewState getViewState() { + return lastViewState; + } + + @Override + public void updateViewState() { + setViewState(this.lastViewState, false); + } + + @Override + public void setViewState(@NotNull CalculatorEditorViewState newViewState) { + setViewState(newViewState, true); + } + + private void setViewState(@NotNull CalculatorEditorViewState newViewState, boolean majorChanges) { + synchronized (viewLock) { + final CalculatorEditorViewState oldViewState = this.lastViewState; + + this.lastViewState = newViewState; + if (this.view != null) { + this.view.setState(newViewState); + } + + if (majorChanges) { + calculator.fireCalculatorEvent(CalculatorEventType.editor_state_changed, new CalculatorEditorChangeEventDataImpl(oldViewState, newViewState)); + } else { + calculator.fireCalculatorEvent(CalculatorEventType.editor_state_changed_light, new CalculatorEditorChangeEventDataImpl(oldViewState, newViewState)); + } + } + } + + @Override + public void onCalculatorEvent(@NotNull CalculatorEventData calculatorEventData, + @NotNull CalculatorEventType calculatorEventType, + @Nullable Object data) { + final CalculatorEventHolder.Result result = lastEventHolder.apply(calculatorEventData); + + if (result.isNewAfter()) { + switch (calculatorEventType) { + case use_history_state: + final CalculatorHistoryState calculatorHistoryState = (CalculatorHistoryState)data; + final EditorHistoryState editorState = calculatorHistoryState.getEditorState(); + this.setText(StringUtils.getNotEmpty(editorState.getText(), ""), editorState.getCursorPosition()); + break; + } + } + } + + /* + ********************************************************************** + * + * SELECTION + * + ********************************************************************** + */ + + @NotNull + private CalculatorEditorViewState newSelectionViewState(int newSelection) { + if (this.lastViewState.getSelection() != newSelection) { + final CalculatorEditorViewState result = CalculatorEditorViewStateImpl.newSelection(this.lastViewState, newSelection); + setViewState(result, false); + return result; + } else { + return this.lastViewState; + } + } + + @NotNull + public CalculatorEditorViewState setCursorOnStart() { + synchronized (viewLock) { + return newSelectionViewState(0); + } + } + + + @NotNull + public CalculatorEditorViewState setCursorOnEnd() { + synchronized (viewLock) { + return newSelectionViewState(this.lastViewState.getText().length()); + } + } + + @NotNull + public CalculatorEditorViewState moveCursorLeft() { + synchronized (viewLock) { + if (this.lastViewState.getSelection() > 0) { + return newSelectionViewState(this.lastViewState.getSelection() - 1); + } else { + return this.lastViewState; + } + } + } + + @NotNull + public CalculatorEditorViewState moveCursorRight() { + synchronized (viewLock) { + if (this.lastViewState.getSelection() < this.lastViewState.getText().length()) { + return newSelectionViewState(this.lastViewState.getSelection() + 1); + } else { + return this.lastViewState; + } + } + } + + @NotNull + @Override + public CursorControl asCursorControl() { + return cursorControlAdapter; + } + + /* + ********************************************************************** + * + * EDITOR ACTIONS + * + ********************************************************************** + */ + + @NotNull + @Override + public CalculatorEditorViewState erase() { + synchronized (viewLock) { + int selection = this.lastViewState.getSelection(); + final String text = this.lastViewState.getText(); + if (selection > 0 && text.length() > 0 && selection <= text.length()) { + final StringBuilder newText = new StringBuilder(text.length() - 1); + newText.append(text.substring(0, selection - 1)).append(text.substring(selection, text.length())); + + final CalculatorEditorViewState result = CalculatorEditorViewStateImpl.newInstance(newText.toString(), selection - 1); + setViewState(result); + return result; + } else { + return this.lastViewState; + } + } + } + + @NotNull + @Override + public CalculatorEditorViewState clear() { + synchronized (viewLock) { + return setText(""); + } + } + + @NotNull + @Override + public CalculatorEditorViewState setText(@NotNull String text) { + synchronized (viewLock) { + final CalculatorEditorViewState result = CalculatorEditorViewStateImpl.newInstance(text, text.length()); + setViewState(result); + return result; + } + } + + @NotNull + @Override + public CalculatorEditorViewState setText(@NotNull String text, int selection) { + synchronized (viewLock) { + selection = correctSelection(selection, text); + + final CalculatorEditorViewState result = CalculatorEditorViewStateImpl.newInstance(text, selection); + setViewState(result); + return result; + } + } + + @NotNull + @Override + public CalculatorEditorViewState insert(@NotNull String text) { + synchronized (viewLock) { + return insert(text, 0); + } + } + + @NotNull + @Override + public CalculatorEditorViewState insert(@NotNull String text, int selectionOffset) { + synchronized (viewLock) { + final int selection = this.lastViewState.getSelection(); + final String oldText = this.lastViewState.getText(); + + int newTextLength = text.length() + oldText.length(); + final StringBuilder newText = new StringBuilder(newTextLength); + + newText.append(oldText.substring(0, selection)); + newText.append(text); + newText.append(oldText.substring(selection)); + + int newSelection = correctSelection(text.length() + selection + selectionOffset, newTextLength); + final CalculatorEditorViewState result = CalculatorEditorViewStateImpl.newInstance(newText.toString(), newSelection); + setViewState(result); + return result; + } + } + + @NotNull + @Override + public CalculatorEditorViewState moveSelection(int offset) { + synchronized (viewLock) { + int selection = this.lastViewState.getSelection() + offset; + + return setSelection(selection); + } + } + + @NotNull + @Override + public CalculatorEditorViewState setSelection(int selection) { + synchronized (viewLock) { + selection = correctSelection(selection, this.lastViewState.getText()); + + final CalculatorEditorViewState result = CalculatorEditorViewStateImpl.newSelection(this.lastViewState, selection); + setViewState(result, false); + return result; + } + } + + private int correctSelection(int selection, @NotNull String text) { + return correctSelection(selection, text.length()); + } + + private int correctSelection(int selection, int textLength) { + int result = Math.max(selection, 0); + result = Math.min(result, textLength); + return result; + } + + private static final class CursorControlAdapter implements CursorControl { + + @NotNull + private final CalculatorEditor calculatorEditor; + + private CursorControlAdapter(@NotNull CalculatorEditor calculatorEditor) { + this.calculatorEditor = calculatorEditor; + } + + @Override + public void setCursorOnStart() { + this.calculatorEditor.setCursorOnStart(); + } + + @Override + public void setCursorOnEnd() { + this.calculatorEditor.setCursorOnEnd(); + } + + @Override + public void moveCursorLeft() { + this.calculatorEditor.moveCursorLeft(); + } + + @Override + public void moveCursorRight() { + this.calculatorEditor.moveCursorRight(); + } + } +} diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEditorViewState.java b/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEditorViewState.java index 1189957e..fdfe79d6 100644 --- a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEditorViewState.java +++ b/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorEditorViewState.java @@ -1,16 +1,18 @@ -package org.solovyev.android.calculator; - -import org.jetbrains.annotations.NotNull; - -/** - * User: Solovyev_S - * Date: 21.09.12 - * Time: 11:48 - */ -public interface CalculatorEditorViewState { - - @NotNull - String getText(); - - int getSelection(); -} +package org.solovyev.android.calculator; + +import org.jetbrains.annotations.NotNull; + +import java.io.Serializable; + +/** + * User: Solovyev_S + * Date: 21.09.12 + * Time: 11:48 + */ +public interface CalculatorEditorViewState extends Serializable { + + @NotNull + String getText(); + + int getSelection(); +} 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 12af91ab..34a71f50 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 @@ -1,141 +1,154 @@ -package org.solovyev.android.calculator; - -import org.jetbrains.annotations.NotNull; - -/** - * User: Solovyev_S - * Date: 20.09.12 - * Time: 16:40 - */ -public enum CalculatorEventType { - - /* - ********************************************************************** - * - * CALCULATION - * org.solovyev.android.calculator.CalculatorEvaluationEventData - * - ********************************************************************** - */ - - - // @NotNull CalculatorEditorViewState - manual_calculation_requested, - - // @NotNull org.solovyev.android.calculator.CalculatorOutput - calculation_result, - - calculation_cancelled, - - // @NotNull org.solovyev.android.calculator.CalculatorFailure - calculation_failed, - - /* - ********************************************************************** - * - * CONVERSION - * CalculatorConversionEventData - * - ********************************************************************** - */ - conversion_started, - - // @NotNull String conversion result - conversion_result, - - // @NotNull ConversionFailure - conversion_failed, - - conversion_finished, - - /* - ********************************************************************** - * - * EDITOR - * - ********************************************************************** - */ - - // @NotNull org.solovyev.android.calculator.CalculatorEditorChangeEventData - editor_state_changed, - - // @NotNull CalculatorDisplayChangeEventData - display_state_changed, - - /* - ********************************************************************** - * - * ENGINE - * - ********************************************************************** - */ - - engine_preferences_changed, - - /* - ********************************************************************** - * - * HISTORY - * - ********************************************************************** - */ - - // @NotNull CalculatorHistoryState - history_state_added, - - // @NotNull CalculatorHistoryState - use_history_state, - - clear_history_requested, - - show_history, - - /* - ********************************************************************** - * - * MATH ENTITIES - * - ********************************************************************** - */ - - // @NotNull IConstant - use_constant, - - // @NotNull Function - use_function, - - // @NotNull Operator - use_operator, - - // @NotNull IConstant - constant_added, - - // @NotNull Change - constant_changed, - - // @NotNull IConstant - constant_removed, - - /* - ********************************************************************** - * - * OTHER - * - ********************************************************************** - */ - - show_functions, - show_vars, - show_operators; - - public boolean isOfType(@NotNull CalculatorEventType... types) { - for (CalculatorEventType type : types) { - if ( this == type ) { - return true; - } - } - - return false; - } - -} +package org.solovyev.android.calculator; + +import org.jetbrains.annotations.NotNull; + +/** + * User: Solovyev_S + * Date: 20.09.12 + * Time: 16:40 + */ +public enum CalculatorEventType { + + /* + ********************************************************************** + * + * CALCULATION + * org.solovyev.android.calculator.CalculatorEvaluationEventData + * + ********************************************************************** + */ + + + // @NotNull CalculatorEditorViewState + manual_calculation_requested, + + // @NotNull org.solovyev.android.calculator.CalculatorOutput + calculation_result, + + calculation_cancelled, + + // @NotNull org.solovyev.android.calculator.CalculatorFailure + calculation_failed, + + /* + ********************************************************************** + * + * CONVERSION + * CalculatorConversionEventData + * + ********************************************************************** + */ + conversion_started, + + // @NotNull String conversion result + conversion_result, + + // @NotNull ConversionFailure + conversion_failed, + + conversion_finished, + + /* + ********************************************************************** + * + * EDITOR + * + ********************************************************************** + */ + + // @NotNull org.solovyev.android.calculator.CalculatorEditorChangeEventData + editor_state_changed, + editor_state_changed_light, + + // @NotNull CalculatorDisplayChangeEventData + display_state_changed, + + /* + ********************************************************************** + * + * ENGINE + * + ********************************************************************** + */ + + engine_preferences_changed, + + /* + ********************************************************************** + * + * HISTORY + * + ********************************************************************** + */ + + // @NotNull CalculatorHistoryState + history_state_added, + + // @NotNull CalculatorHistoryState + use_history_state, + + clear_history_requested, + + /* + ********************************************************************** + * + * MATH ENTITIES + * + ********************************************************************** + */ + + // @NotNull IConstant + use_constant, + + // @NotNull Function + use_function, + + // @NotNull Operator + use_operator, + + // @NotNull IConstant + constant_added, + + // @NotNull Change + constant_changed, + + // @NotNull IConstant + constant_removed, + + /* + ********************************************************************** + * + * OTHER + * + ********************************************************************** + */ + show_history, + show_history_detached, + + show_functions, + show_functions_detached, + + show_vars, + show_vars_detached, + + open_app, + + show_operators, + show_operators_detached, + + show_settings, + show_settings_detached, + + show_like_dialog; + + public boolean isOfType(@NotNull CalculatorEventType... types) { + for (CalculatorEventType type : types) { + if ( this == type ) { + return true; + } + } + + return false; + } + +} 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 9701095c..62631536 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,142 +1,124 @@ -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(); - } -} +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; + + final CalculatorSpecialButton button = CalculatorSpecialButton.getByActionCode(text); + if ( button != null ) { + button.onClick(this); + result = true; + } + + 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-core/src/main/java/org/solovyev/android/calculator/CalculatorNotifier.java b/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorNotifier.java index fcc210f2..a5ad21cf 100644 --- a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorNotifier.java +++ b/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorNotifier.java @@ -19,4 +19,6 @@ public interface CalculatorNotifier { void showMessage(@NotNull Integer messageCode, @NotNull MessageType messageType, @NotNull List parameters); void showMessage(@NotNull Integer messageCode, @NotNull MessageType messageType, @Nullable Object... parameters); + + void showDebugMessage(@Nullable String tag, @NotNull String message); } diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorSpecialButton.java b/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorSpecialButton.java new file mode 100644 index 00000000..41bde78d --- /dev/null +++ b/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorSpecialButton.java @@ -0,0 +1,155 @@ +package org.solovyev.android.calculator; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * User: serso + * Date: 10/20/12 + * Time: 2:05 PM + */ +public enum CalculatorSpecialButton { + + history("history") { + @Override + public void onClick(@NotNull CalculatorKeyboard keyboard) { + CalculatorLocatorImpl.getInstance().getCalculator().fireCalculatorEvent(CalculatorEventType.show_history, null); + } + }, + history_detached("history_detached") { + @Override + public void onClick(@NotNull CalculatorKeyboard keyboard) { + CalculatorLocatorImpl.getInstance().getCalculator().fireCalculatorEvent(CalculatorEventType.show_history_detached, null); + } + }, + cursor_right("▶") { + @Override + public void onClick(@NotNull CalculatorKeyboard keyboard) { + keyboard.moveCursorRight(); + } + }, + cursor_left("◀") { + @Override + public void onClick(@NotNull CalculatorKeyboard keyboard) { + keyboard.moveCursorLeft(); + } + }, + settings("settings") { + @Override + public void onClick(@NotNull CalculatorKeyboard keyboard) { + CalculatorLocatorImpl.getInstance().getCalculator().fireCalculatorEvent(CalculatorEventType.show_settings, null); + } + }, + + settings_detached("settings_detached") { + @Override + public void onClick(@NotNull CalculatorKeyboard keyboard) { + CalculatorLocatorImpl.getInstance().getCalculator().fireCalculatorEvent(CalculatorEventType.show_settings_detached, null); + } + }, + + like("like") { + @Override + public void onClick(@NotNull CalculatorKeyboard keyboard) { + CalculatorLocatorImpl.getInstance().getCalculator().fireCalculatorEvent(CalculatorEventType.show_like_dialog, null); + } + }, + erase("erase") { + @Override + public void onClick(@NotNull CalculatorKeyboard keyboard) { + CalculatorLocatorImpl.getInstance().getEditor().erase(); + } + }, + paste("paste") { + @Override + public void onClick(@NotNull CalculatorKeyboard keyboard) { + keyboard.pasteButtonPressed(); + } + }, + copy("copy") { + @Override + public void onClick(@NotNull CalculatorKeyboard keyboard) { + keyboard.copyButtonPressed(); + } + }, + equals("=") { + @Override + public void onClick(@NotNull CalculatorKeyboard keyboard) { + CalculatorLocatorImpl.getInstance().getCalculator().evaluate(); + } + }, + clear("clear") { + @Override + public void onClick(@NotNull CalculatorKeyboard keyboard) { + keyboard.clearButtonPressed(); + } + }, + functions("functions") { + @Override + public void onClick(@NotNull CalculatorKeyboard keyboard) { + CalculatorLocatorImpl.getInstance().getCalculator().fireCalculatorEvent(CalculatorEventType.show_functions, null); + } + }, + functions_detached("functions_detached") { + @Override + public void onClick(@NotNull CalculatorKeyboard keyboard) { + CalculatorLocatorImpl.getInstance().getCalculator().fireCalculatorEvent(CalculatorEventType.show_functions_detached, null); + } + }, + open_app("open_app") { + @Override + public void onClick(@NotNull CalculatorKeyboard keyboard) { + CalculatorLocatorImpl.getInstance().getCalculator().fireCalculatorEvent(CalculatorEventType.open_app, null); + } + }, + vars("vars") { + @Override + public void onClick(@NotNull CalculatorKeyboard keyboard) { + CalculatorLocatorImpl.getInstance().getCalculator().fireCalculatorEvent(CalculatorEventType.show_vars, null); + } + }, + vars_detached("vars_detached") { + @Override + public void onClick(@NotNull CalculatorKeyboard keyboard) { + CalculatorLocatorImpl.getInstance().getCalculator().fireCalculatorEvent(CalculatorEventType.show_vars_detached, null); + } + }, + operators("operators") { + @Override + public void onClick(@NotNull CalculatorKeyboard keyboard) { + CalculatorLocatorImpl.getInstance().getCalculator().fireCalculatorEvent(CalculatorEventType.show_operators, null); + } + }, + + operators_detached("operators_detached") { + @Override + public void onClick(@NotNull CalculatorKeyboard keyboard) { + CalculatorLocatorImpl.getInstance().getCalculator().fireCalculatorEvent(CalculatorEventType.show_operators_detached, null); + } + }; + + @NotNull + private final String actionCode; + + CalculatorSpecialButton(@NotNull String actionCode) { + this.actionCode = actionCode; + } + + @NotNull + public String getActionCode() { + return actionCode; + } + + @Nullable + public static CalculatorSpecialButton getByActionCode(@NotNull String actionCode) { + for (CalculatorSpecialButton button : values()) { + if (button.getActionCode().equals(actionCode)) { + return button; + } + } + + return null; + } + + public abstract void onClick(@NotNull CalculatorKeyboard keyboard); +} diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/DummyCalculatorNotifier.java b/calculatorpp-core/src/main/java/org/solovyev/android/calculator/DummyCalculatorNotifier.java index 8de3c080..d18c0dcd 100644 --- a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/DummyCalculatorNotifier.java +++ b/calculatorpp-core/src/main/java/org/solovyev/android/calculator/DummyCalculatorNotifier.java @@ -25,4 +25,8 @@ public class DummyCalculatorNotifier implements CalculatorNotifier { @Override public void showMessage(@NotNull Integer messageCode, @NotNull MessageType messageType, @Nullable Object... parameters) { } + + @Override + public void showDebugMessage(@Nullable String tag, @NotNull String message) { + } } diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/ListCalculatorEventContainer.java b/calculatorpp-core/src/main/java/org/solovyev/android/calculator/ListCalculatorEventContainer.java index 2af49a0e..f977eedf 100644 --- a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/ListCalculatorEventContainer.java +++ b/calculatorpp-core/src/main/java/org/solovyev/android/calculator/ListCalculatorEventContainer.java @@ -42,6 +42,7 @@ public class ListCalculatorEventContainer implements CalculatorEventContainer { final CalculatorLogger logger = CalculatorLocatorImpl.getInstance().getLogger(); for (CalculatorEvent e : calculatorEvents) { + CalculatorLocatorImpl.getInstance().getLogger().debug(TAG, "Event fired: " + e.getCalculatorEventType()); for (CalculatorEventListener listener : listeners) { /*long startTime = System.currentTimeMillis();*/ listener.onCalculatorEvent(e.getCalculatorEventData(), e.getCalculatorEventType(), e.getData()); diff --git a/calculatorpp-core/src/test/java/org/solovyev/android/calculator/CalculatorDisplayViewStateImplTest.java b/calculatorpp-core/src/test/java/org/solovyev/android/calculator/CalculatorDisplayViewStateImplTest.java new file mode 100644 index 00000000..15dbbb73 --- /dev/null +++ b/calculatorpp-core/src/test/java/org/solovyev/android/calculator/CalculatorDisplayViewStateImplTest.java @@ -0,0 +1,23 @@ +package org.solovyev.android.calculator; + +import jscl.math.Expression; +import org.junit.Test; +import org.solovyev.android.calculator.jscl.JsclOperation; + +/** + * User: serso + * Date: 10/20/12 + * Time: 12:24 PM + */ +public class CalculatorDisplayViewStateImplTest { + + @Test + public void testSerializable() throws Exception { + CalculatorTestUtils.testSerialization(CalculatorDisplayViewStateImpl.newValidState(JsclOperation.numeric, null, "test", 3)); + CalculatorTestUtils.testSerialization(CalculatorDisplayViewStateImpl.newValidState(JsclOperation.numeric, Expression.valueOf("3"), "test", 3)); + CalculatorTestUtils.testSerialization(CalculatorDisplayViewStateImpl.newValidState(JsclOperation.simplify, Expression.valueOf("3+3"), "test", 3)); + CalculatorTestUtils.testSerialization(CalculatorDisplayViewStateImpl.newDefaultInstance()); + CalculatorTestUtils.testSerialization(CalculatorDisplayViewStateImpl.newErrorState(JsclOperation.numeric, "ertert")); + } + +} diff --git a/calculatorpp-core/src/test/java/org/solovyev/android/calculator/CalculatorEditorViewStateImplTest.java b/calculatorpp-core/src/test/java/org/solovyev/android/calculator/CalculatorEditorViewStateImplTest.java new file mode 100644 index 00000000..c23b4323 --- /dev/null +++ b/calculatorpp-core/src/test/java/org/solovyev/android/calculator/CalculatorEditorViewStateImplTest.java @@ -0,0 +1,21 @@ +package org.solovyev.android.calculator; + +import junit.framework.Assert; +import org.junit.Test; + +/** + * User: serso + * Date: 10/20/12 + * Time: 12:31 PM + */ +public class CalculatorEditorViewStateImplTest { + + @Test + public void testSerialization() throws Exception { + CalculatorTestUtils.testSerialization(CalculatorEditorViewStateImpl.newDefaultInstance()); + + CalculatorEditorViewState out = CalculatorTestUtils.testSerialization(CalculatorEditorViewStateImpl.newInstance("treter", 2)); + Assert.assertEquals(2, out.getSelection()); + Assert.assertEquals("treter", out.getText()); + } +} diff --git a/calculatorpp-core/src/test/java/org/solovyev/android/calculator/CalculatorTestUtils.java b/calculatorpp-core/src/test/java/org/solovyev/android/calculator/CalculatorTestUtils.java index 09055b37..e881f69e 100644 --- a/calculatorpp-core/src/test/java/org/solovyev/android/calculator/CalculatorTestUtils.java +++ b/calculatorpp-core/src/test/java/org/solovyev/android/calculator/CalculatorTestUtils.java @@ -8,6 +8,7 @@ import org.mockito.Mockito; import org.solovyev.android.calculator.history.CalculatorHistory; import org.solovyev.android.calculator.jscl.JsclOperation; +import java.io.*; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -41,7 +42,7 @@ public class CalculatorTestUtils { } public static void assertEval(@NotNull String expected, @NotNull String expression) { - assertEval(expected, expression, JsclOperation.numeric); + assertEval(expected, expression, JsclOperation.numeric); } public static void assertEval(@NotNull String expected, @NotNull String expression, @NotNull JsclOperation operation) { @@ -57,8 +58,8 @@ public class CalculatorTestUtils { calculatorEventListener.setCalculatorEventData(calculator.evaluate(operation, expression)); if (latch.await(TIMEOUT, TimeUnit.SECONDS)) { - Assert.assertNotNull(calculatorEventListener.getResult()); - Assert.assertEquals(expected, calculatorEventListener.getResult().getText()); + Assert.assertNotNull(calculatorEventListener.getResult()); + Assert.assertEquals(expected, calculatorEventListener.getResult().getText()); } else { Assert.fail("Too long wait for: " + expression); } @@ -74,7 +75,33 @@ public class CalculatorTestUtils { assertError(expression, JsclOperation.numeric); } - private static final class TestCalculatorEventListener implements CalculatorEventListener { + public static S testSerialization(@NotNull S serializable) throws IOException, ClassNotFoundException { + final ByteArrayOutputStream out = new ByteArrayOutputStream(); + + ObjectOutputStream oos = null; + try { + oos = new ObjectOutputStream(out); + oos.writeObject(serializable); + } finally { + if (oos != null) { + oos.close(); + } + } + + byte[] serialized = out.toByteArray(); + + Assert.assertTrue(serialized.length > 0); + + + final ObjectInputStream resultStream = new ObjectInputStream(new ByteArrayInputStream(out.toByteArray())); + final S result = (S) resultStream.readObject(); + + Assert.assertNotNull(result); + + return result; + } + + private static final class TestCalculatorEventListener implements CalculatorEventListener { @Nullable private CalculatorEventData calculatorEventData; @@ -95,7 +122,7 @@ public class CalculatorTestUtils { @Override public void onCalculatorEvent(@NotNull CalculatorEventData calculatorEventData, @NotNull CalculatorEventType calculatorEventType, @Nullable Object data) { - if ( this.calculatorEventData != null && calculatorEventData.isSameSequence(this.calculatorEventData) ) { + if (this.calculatorEventData != null && calculatorEventData.isSameSequence(this.calculatorEventData)) { if (calculatorEventType == CalculatorEventType.display_state_changed) { final CalculatorDisplayChangeEventData displayChange = (CalculatorDisplayChangeEventData) data; diff --git a/calculatorpp/AndroidManifest.xml b/calculatorpp/AndroidManifest.xml index feff4416..03366405 100644 --- a/calculatorpp/AndroidManifest.xml +++ b/calculatorpp/AndroidManifest.xml @@ -1,77 +1,80 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/calculatorpp/misc/res/widget.png b/calculatorpp/misc/res/widget.png new file mode 100644 index 0000000000000000000000000000000000000000..ecd58e94b8b41e4bd10e784dd72f019de8d88843 GIT binary patch literal 58263 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 N002ovPDHLkV1h-YR6zg$ literal 0 HcmV?d00001 diff --git a/calculatorpp/res/drawable-hdpi/kb_logo.png b/calculatorpp/res/drawable-hdpi/kb_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d42f3b42fb31f9ae62db0f7e28afd7461421661f GIT binary patch literal 3977 zcmV;44|ed0P)Oz@Z0f2-7z;ux~O9+4z06=<WDR*FRcSTFz- zW=q650N5=6FiBTtNC2?60Km==3$g$R3;-}uh=nNt1bYBr$Ri_o0EC$U6h`t_Jn<{8 z5a%iY0C<_QJh>z}MS)ugEpZ1|S1ukX&Pf+56gFW3VVXcL!g-k)GJ!M?;PcD?0HBc- z5#WRK{dmp}uFlRjj{U%*%WZ25jX z{P*?XzTzZ-GF^d31o+^>%=Ap99M6&ogks$0k4OBs3;+Bb(;~!4V!2o<6ys46agIcq zjPo+3B8fthDa9qy|77CdEc*jK-!%ZRYCZvbku9iQV*~a}ClFY4z~c7+0P?$U!PF=S z1Au6Q;m>#f??3%Vpd|o+W=WE9003S@Bra6Svp>fO002awfhw>;8}z{#EWidF!3EsG z3;bXU&9EIRU@z1_9W=mEXoiz;4lcq~xDGvV5BgyU zp1~-*fe8db$Osc*A=-!mVv1NJjtCc-h4>-CNCXm#Bp}I%6j35eku^v$Qi@a{RY)E3 zJ#qp$hg?Rwkvqr$GJ^buyhkyVfwECO)C{#lxu`c9ghrwZ&}4KmnvWKso6vH!8a<3Q zq36)6Xb;+tK10Vaz~~qUGsJ8#F2=(`u{bOVlVi)VBCHIn#u~6ztOL7=^<&SmcLWlF zMZgI*1b0FpVIDz9SWH+>*hr`#93(Um+6gxa1B6k+CnA%mOSC4s5&6UzVlpv@SV$}* z))J2sFA#f(L&P^E5{W}HC%KRUNwK6<(h|}}(r!{C=`5+6G)NjFlgZj-YqAG9lq?`C z$c5yc>d>VnA`E_*3F2Qp##d8RZb=H01_mm@+|Cqnc9PsG(F5HIG_C zt)aG3uTh7n6Et<2In9F>NlT@zqLtGcXcuVrX|L#Xx)I%#9!{6gSJKPrN9dR61N3(c z4Tcqi$B1Vr8Jidf7-t!G7_XR2rWwr)$3XQ?}=hpK0&Z&W{| zep&sA23f;Q!%st`QJ}G3cbou<7-yIK2z4nfCCCtN2-XOGSWo##{8Q{ATurxr~;I`ytDs%xbip}RzP zziy}Qn4Z2~fSycmr`~zJ=lUFdFa1>gZThG6M+{g7vkW8#+YHVaJjFF}Z#*3@$J_By zLtVo_L#1JrVVB{Ak-5=4qt!-@Mh}c>#$4kh<88)m#-k<%CLtzEP3leVno>={htGUuD;o7bD)w_sX$S}eAxwzy?UvgBH(S?;#HZiQMoS*2K2 zT3xe7t(~nU*1N5{rxB;QPLocnp4Ml>u<^FZwyC!nu;thW+pe~4wtZn|Vi#w(#jeBd zlf9FDx_yoPJqHbk*$%56S{;6Kv~mM9!g3B(KJ}#RZ#@)!hR|78Dq|Iq-afF%KE1Brn_fm;Im z_u$xr8UFki1L{Ox>G0o)(&RAZ;=|I=wN2l97;cLaHH6leTB-XXa*h%dBOEvi`+x zi?=Txl?TadvyiL>SuF~-LZ;|cS}4~l2eM~nS7yJ>iOM;atDY;(?aZ^v+mJV$@1Ote z62cPUlD4IWOIIx&SmwQ~YB{nzae3Pc;}r!fhE@iwJh+OsDs9zItL;~pu715HdQEGA zUct(O!LkCy1<%NCg+}G`0PgpNm-?d@-hMgNe6^V+j6x$b<6@S<$+<4_1hi}Ti zncS4LsjI}fWY1>OX6feMEuLErma3QLmkw?X+1j)X-&VBk_4Y;EFPF_I+q;9dL%E~B zJh;4Nr^(LEJ3myURP{Rblsw%57T)g973R8o)DE9*xN#~;4_o$q%o z4K@u`jhx2fBXC4{U8Qn{*%*B$Ge=nny$HAYq{=vy|sI0 z_vss+H_qMky?OB#|JK!>IX&II^LlUh#rO5!7TtbwC;iULyV-Xq?ybB}ykGP{?LpZ? z-G|jbTmIbG@7#ZCz;~eY(cDM(28Dyq{*m>M4?_iynUBkc4TkHUI6gT!;y-fz>HMcd z&t%Ugo)`Y2{>!cx7B7DI)$7;J(U{Spm-3gBzioV_{p!H$8L!*M!p0uH$#^p{Ui4P` z?ZJ24cOCDe-w#jZd?0@)|7iKK^;6KN`;!@ylm7$*nDhK&GcDTy000JJOGiWi{{a60 z|De66lK=n!32;bRa{vGf6951U69E94oEQKA00(qQO+^RX3KR+e6QyPsjKfbC;0Fl|!GID`qatA920shp!eF9_kwik+7Y7>LRUbkFpwch7ZU71s0&O?S`O!=lfoQ?K5Ab?)cg zd*5rIi!Qq8qKipDS`|>$J~QhD&;!7U2+T|YRLty3k|dXII0Z&WeNU3aO8_hrkyU0k z0N`!_eYpY^0H;M{(9HG&IIOD2(los^t?n5a8A(+2aaG+$@+e8W9!MI=Q>yww2w{D# zR+}*`!^6@^@~cShnSgjxm_U&o8p6Cz zk$;fnF9nBIh>vkaE=Teh$!AqH=>+*jBo9u8d^waz9w+&9r!3z~^3y3Kf0E==ogyEr z>ZU0qe>#NlWG6T69Fpg!i2T_Q!un2ecUhJRfQ=$@o0*x2w3O}&nY^H#Bl(JRZg>5> zYPCAoIrof+%*_kvDFB}&Nn(xG&$4VCfQJACGm8Lxn5OB)vh^Lw1J)kO>2j!1*i@_4 z7EeTEZtg{ptU2c@ zA%rB3<68ibqz5pj6%mnHX4VfNCP@e2zE(R^Gb_j+C%MHr_vHlB`T;x-;9&rxNs`O~ zaBJ!P5&&=K#vp(n0DJ`CUI4EFsEUXJc(iWa*8vOzh(zQMklbbMrJdhH2&)^k-M5qc ztcczEDqS~bA%tD|p4@mXnPSi7?TMM$c?Y1~5?=#k{%w>DOYbrV zAhgOnPn~x~5q5?UwmRqbPLu)7?4+3;1278UW)ZnlL~hF0xNK%;iew1jOg?_m%+8qE zB>*NO^F?G{5xM{d&8!9>0&q@L_1!3n-e^OIVjmm{A#6_5bZ=d8bO06rm<_;_TUIFk8fRlOX{n+F;4gvTUK+Vh| zGrLmX$cd`HIu(svae(pOuenAz#AX(oSxho&GK8W+Mpff$HB9qJ{y7OH#_fp^!kUh? z(^;0qA%rdMoPQfAaY!{h)-feiwU^`<yzzj2si!G9u`pe$?zh};z j8PG)+U3Ae!7ahPqZQ)T~QXSJ300000NkvXXu0mjfG$d&h literal 0 HcmV?d00001 diff --git a/calculatorpp/res/drawable-hdpi/kb_settings.png b/calculatorpp/res/drawable-hdpi/kb_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..9bd4471f4b29341159f18f188c358454226c024a GIT binary patch literal 1141 zcmV-*1d98KP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iyu2 z3l=CDn_N)<00Z?&L_t(&-tC!Ph*eb-$Ny_?R#VpKSc+4OjZ8r(H5Hc7OVNWpWD$l& zYEM?wlTYG9_0nS!K_5_01wkc+4n6e{6=4xfT1pV64LPYz5Yo)(IL>%~y{rSf)7*3R z-E+^3$o<1%?{n_nYp=EU`q*n-sf{+;XydW~(C`~jt7=_q1>=*`q1!jV8 zb#KRjRZioIR3SPN8Se)61MAIfQqqaphD*9dQh#opOl`*`8PF$b5_nNkt+LYyj`}X( zPv6CVfG>da4Nl+;@EVPA8u%l4|Dh6t5179*$3Q*T=CKu6;p$SS7}@W~fF&(I37`-7 zyM*D8nG?V@KKK15<^de3!Upb_)a|-mElXl0eFQt49%i` z&qU5020DuZWV1~70^5PxfI|@soCfa5+YrzNd<{%RsMBs>Fx-f_81A4Gy#QQnuyFQm z571RWvj*G~c(Ec{8MY)}C4iNZPDSed^Jeyr&%065-I5-V)GO(zq(MnPo7uFFIV5Qy zg7%P^txG+HHzK{q)?m()z-WVUM}z3Q1UOkjyY94BB&iT^ID+|u!Byae64j^!XMxo| zeq*Fz52OgN)O~rq#AiR|<5vOaA_T_OCtK(Hi19m8;=p2mtjK=MY|!6#O6rX8^+*~3 z9`^UwBldG$iU3#oQ-m*r{^llgkZs-`aiNNEdx`)Z+3m0Zr-FV@lUmyE?UX-7xH(0D z8A;P6gck?>i%kk}#@kxNM$M!MFdZSly+MC}tbg!!UvP4ZO6D9(5nx=>LPnuAa-S^qa^m zY7|(Xo7?3P{o0&r?u*!zjP6Tw%?Iv_+^Gy700Y1cz*WE^*YzG?o1aK5z4LRb%(>px zBz;#D&U2|`=C}WHPgeIU#&wdG%`&zKTg+^4Sp7>XE&A>8_3@^7DHn*Utk+IU+F)jd%%`N6Z&DpHn>Y)st+GP*Y?DUa3?_gz^HE-W3K(y(Acuja zl~<|*A^L!?TA(rjyRuj@uVr>$@DX4rI1wUGW)%1|Nb(o%ZzZqy^Z`$M9cioq(<8v! zz=Oc@R#e}tmBQp*9&nSp-I|$=l#RdS|L|K7HEE-b%N+j#F&1_fO6BVk00000NkvXX Hu0mjfqLU5b literal 0 HcmV?d00001 diff --git a/calculatorpp/res/drawable-hdpi/logo_square.png b/calculatorpp/res/drawable-hdpi/logo_square.png new file mode 100644 index 0000000000000000000000000000000000000000..fb6a7ef88d96bddcd31eafd0471eb27163db2af5 GIT binary patch literal 18608 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 EU;J@%WB>pF literal 0 HcmV?d00001 diff --git a/calculatorpp/res/drawable-ldpi/kb_logo.png b/calculatorpp/res/drawable-ldpi/kb_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..bacb8afce287e67c42828022855c7fae80afa359 GIT binary patch literal 3349 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 literal 0 HcmV?d00001 diff --git a/calculatorpp/res/drawable-ldpi/kb_settings.png b/calculatorpp/res/drawable-ldpi/kb_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..5d53f1f3762495b0220c0d4dd3e9b92f5f66d8f5 GIT binary patch literal 590 zcmV-U0Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iyu2 z3l}EmI6xNw00GWPL_t(Y$K92|OH@%5#=m2u!hi+^Eer$&_d!C77Dnw7G6*4Dw+mXi zF<#cNSwGI>^U(?TIPeLWcd*Roy@cQ+ z@D5n&^aT_AZ8`WHa4-1M*PX(u#M_&hBn{;*N#?%~Bt7@JF6nC6-!-#i1stbPnnmD4 zxaBS|<@*%dwPlL3c5y33>)39@9s4$u!gaL{$&rN_T5kZZP#;Aw&Gw}D3m{uQ9Y zY5QD8@Hzw^xqma?_o4eM_}ucT`5o1|_@eUfUy-{Yf@pdQx4 zX4aIn=Z8tM>(JwGq#{Ua_$VY;P6BaxW+Y8Y+D}sQx1!-rBt;?}|Xb7nXUR|1`5K c#+^U=1BMbgD2a5M*Z=?k07*qoM6N<$g6*>c$p8QV literal 0 HcmV?d00001 diff --git a/calculatorpp/res/drawable-mdpi/kb_logo.png b/calculatorpp/res/drawable-mdpi/kb_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..4fdc810da4e0c6c53cc1bd4a50a0bf952c20e54f GIT binary patch literal 3441 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 T$MRU900000NkvXXu0mjfUbkyb literal 0 HcmV?d00001 diff --git a/calculatorpp/res/drawable-mdpi/kb_settings.png b/calculatorpp/res/drawable-mdpi/kb_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..e5fdb1c47955762ebb0adf82f69718e1f4740bed GIT binary patch literal 868 zcmV-q1DpJbP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iyu2 z3l|V5g4K=y00QJmL_t(o!|j(}XwFd>$G>Oq!tAe1^QTbSjk3_fL}Y}N3vnmK6?Z6H zxNyOZcA=CTH*QFzcBhHjYG!T}nutwk%+|JSwl$mg{kVDFIy-*vKkrMCQ>Sw}f1c<2 ze9!ae_mlp&zo`KQIg__ypa$3ilmh~G0k!_Qf&(!{n}O@V6QB<`2&@H$fG*$xa2O~l zsO3NvFdI0=%r*=R1Zz#e9AIZ&Y?K?4FFPFYAwqC+J^+*g4roaOVic(N{3t8hD}V*S*+8%_{D^n29vDjjq77II ztjzcn9)J_TJ@f2PU=MK0&dmbKZNA&0ARYnuEzk~>X7dDPz@rqFcL5uKO5h}L6KDo5 z1M4hWZhPl_;GcoL*|4z9JULW8WN}|@N~VLi?gsV&OMn+C{NX~VuP6dTt)zK2ci#Fd zNjD@NmvlfzSHBwe+L@ELTH zK1q6*%mdE3w3+Zwn$+44TmjZt;wb@^S@wLMA_-yj!sSwk+JYzW=TlaU-dURc7(7X+ zd<1CBsVtjSBZ0s~ijteETqmqHH0AVh;yuMCU?M}kPX{0l+{yQItj@eTo~ATMfg1xZ z7V5LC2DoNLDiaG|fKFh4Hp*R&fEpz2k+e$EB1^l@%YfY$YR%5Mui40S*)rkBEl??G uu~#*}N$Pjb^`^V`$Nr3d%iqyI+kOCa=rv^W*}Q)M0000-1 literal 0 HcmV?d00001 diff --git a/calculatorpp/res/drawable-nodpi/widget_preview.png b/calculatorpp/res/drawable-nodpi/widget_preview.png new file mode 100644 index 0000000000000000000000000000000000000000..f350e4c759dd893d44fd368a1520dfe04833786e GIT binary patch literal 24127 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 &W{cxXX2W3EJtRBKI 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 literal 0 HcmV?d00001 diff --git a/calculatorpp/res/drawable-xhdpi/ic_menu_preferences.png b/calculatorpp/res/drawable-xhdpi/ic_menu_preferences.png new file mode 100755 index 0000000000000000000000000000000000000000..057d8628b64b8ed9728b41946aa50708c936e26a GIT binary patch literal 2519 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 literal 0 HcmV?d00001 diff --git a/calculatorpp/res/drawable-xhdpi/kb_settings.png b/calculatorpp/res/drawable-xhdpi/kb_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..3e73705cedc109a491b46359f8338c41456664af GIT binary patch literal 1711 zcmV;g22lBlP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iyu2 z3l`J9Eyt z=gy3E|8U`)v-jD1ueH}&dp*vTDyX1>3M#0ef(pt6py+eo7G8HYTsaAM&V~2=CH0fk zM^d$lPx<}FhNv)DDOKNh?T`V@}tLML-IxXUIOZEyn&`luXYP21iD@WYy#SVbwFR> zPT+JqqMh%6aE~@%3vd_kx;?vW^YrO5CIrM!FvArRb^>UQLEHggZU>CW8xt-9Es?gv zz^G1TLc|b_2QIX;qa86|7LWt>#_V56f_?+)I$b4zQNhlqS@>qa*>6??rWG3N2r#ZQ z#lH&pwuA*^I_<}+20lqKUWg@WXvwAILA9i#CGc>$q&?oVbIvtNT52Aklaxe`^OC-l zw4|&m5FHp86zp1(-9HUXE?`Ut0w1Q3f=j@xv_3*EF7f8G4+2KouAPxIC@%kkxMQ`X z9Z~<@Id@*tDoJO9zHz9ilJqn%6nNQ=%Hg)&OeG)(ECBv8Uww_8$8phQ?+bDi~vug|>wPqNplu044JF*Yj|7?5DnbCNCv_q8P+LZgH0Ci}(3h%6XDpwDsR z3s=A(rA4^oJ?t0z5X(vhl5oAoiXR^POJqR!{(yw)*qD_BoK7%loiV{B-=i{6rM1-z)PG%-$+=9C}Q3G^~-UtoC$SwQqa%oD|ru_voope{v@?r~rBwG!Bxn69wLQlPKR-w#-xaQ@af zu5eriTnp?>7z~{RY9cAL_hJ@D7FspgGjL{#tnn9CoXvy*eSk$N@_%225uuGW$0EfG z7UB6{vqf-I!{mt79?qo*gyv@!4%=exHL*$>mp1@o3XC@vcm$Yjb%9}#_Flj=;Exn@ zUd*gc5TvMvS|vBhPWXPujM$+u!|&0+8!5!z_gm&wD3g>}u(+ortuRN2gzvXX`c%?J zN#992W4=A+-Cbv{>r_dzBS)S~aCA0FdeAx7kY!HLr^RcG0gt9|Xk2it9f<9z*{VXz$MvUHQj}3M#0ef(rhR_y<5@HSoY5Cx`$5002ovPDHLk FV1iGk6p;V` literal 0 HcmV?d00001 diff --git a/calculatorpp/res/drawable-xlarge-hdpi/kb_logo.png b/calculatorpp/res/drawable-xlarge-hdpi/kb_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..cd7e58a2be58e15809a75ee77574f238e553846e GIT binary patch literal 3989 zcmV;G4{GpOz@Z0f2-7z;ux~O9+4z06=<WDR*FRcSTFz- zW=q650N5=6FiBTtNC2?60Km==3$g$R3;-}uh=nNt1bYBr$Ri_o0EC$U6h`t_Jn<{8 z5a%iY0C<_QJh>z}MS)ugEpZ1|S1ukX&Pf+56gFW3VVXcL!g-k)GJ!M?;PcD?0HBc- z5#WRK{dmp}uFlRjj{U%*%WZ25jX z{P*?XzTzZ-GF^d31o+^>%=Ap99M6&ogks$0k4OBs3;+Bb(;~!4V!2o<6ys46agIcq zjPo+3B8fthDa9qy|77CdEc*jK-!%ZRYCZvbku9iQV*~a}ClFY4z~c7+0P?$U!PF=S z1Au6Q;m>#f??3%Vpd|o+W=WE9003S@Bra6Svp>fO002awfhw>;8}z{#EWidF!3EsG z3;bXU&9EIRU@z1_9W=mEXoiz;4lcq~xDGvV5BgyU zp1~-*fe8db$Osc*A=-!mVv1NJjtCc-h4>-CNCXm#Bp}I%6j35eku^v$Qi@a{RY)E3 zJ#qp$hg?Rwkvqr$GJ^buyhkyVfwECO)C{#lxu`c9ghrwZ&}4KmnvWKso6vH!8a<3Q zq36)6Xb;+tK10Vaz~~qUGsJ8#F2=(`u{bOVlVi)VBCHIn#u~6ztOL7=^<&SmcLWlF zMZgI*1b0FpVIDz9SWH+>*hr`#93(Um+6gxa1B6k+CnA%mOSC4s5&6UzVlpv@SV$}* z))J2sFA#f(L&P^E5{W}HC%KRUNwK6<(h|}}(r!{C=`5+6G)NjFlgZj-YqAG9lq?`C z$c5yc>d>VnA`E_*3F2Qp##d8RZb=H01_mm@+|Cqnc9PsG(F5HIG_C zt)aG3uTh7n6Et<2In9F>NlT@zqLtGcXcuVrX|L#Xx)I%#9!{6gSJKPrN9dR61N3(c z4Tcqi$B1Vr8Jidf7-t!G7_XR2rWwr)$3XQ?}=hpK0&Z&W{| zep&sA23f;Q!%st`QJ}G3cbou<7-yIK2z4nfCCCtN2-XOGSWo##{8Q{ATurxr~;I`ytDs%xbip}RzP zziy}Qn4Z2~fSycmr`~zJ=lUFdFa1>gZThG6M+{g7vkW8#+YHVaJjFF}Z#*3@$J_By zLtVo_L#1JrVVB{Ak-5=4qt!-@Mh}c>#$4kh<88)m#-k<%CLtzEP3leVno>={htGUuD;o7bD)w_sX$S}eAxwzy?UvgBH(S?;#HZiQMoS*2K2 zT3xe7t(~nU*1N5{rxB;QPLocnp4Ml>u<^FZwyC!nu;thW+pe~4wtZn|Vi#w(#jeBd zlf9FDx_yoPJqHbk*$%56S{;6Kv~mM9!g3B(KJ}#RZ#@)!hR|78Dq|Iq-afF%KE1Brn_fm;Im z_u$xr8UFki1L{Ox>G0o)(&RAZ;=|I=wN2l97;cLaHH6leTB-XXa*h%dBOEvi`+x zi?=Txl?TadvyiL>SuF~-LZ;|cS}4~l2eM~nS7yJ>iOM;atDY;(?aZ^v+mJV$@1Ote z62cPUlD4IWOIIx&SmwQ~YB{nzae3Pc;}r!fhE@iwJh+OsDs9zItL;~pu715HdQEGA zUct(O!LkCy1<%NCg+}G`0PgpNm-?d@-hMgNe6^V+j6x$b<6@S<$+<4_1hi}Ti zncS4LsjI}fWY1>OX6feMEuLErma3QLmkw?X+1j)X-&VBk_4Y;EFPF_I+q;9dL%E~B zJh;4Nr^(LEJ3myURP{Rblsw%57T)g973R8o)DE9*xN#~;4_o$q%o z4K@u`jhx2fBXC4{U8Qn{*%*B$Ge=nny$HAYq{=vy|sI0 z_vss+H_qMky?OB#|JK!>IX&II^LlUh#rO5!7TtbwC;iULyV-Xq?ybB}ykGP{?LpZ? z-G|jbTmIbG@7#ZCz;~eY(cDM(28Dyq{*m>M4?_iynUBkc4TkHUI6gT!;y-fz>HMcd z&t%Ugo)`Y2{>!cx7B7DI)$7;J(U{Spm-3gBzioV_{p!H$8L!*M!p0uH$#^p{Ui4P` z?ZJ24cOCDe-w#jZd?0@)|7iKK^;6KN`;!@ylm7$*nDhK&GcDTy000JJOGiWi{{a60 z|De66lK=n!32;bRa{vGf6951U69E94oEQKA00(qQO+^RX3KR+fGzr`8zW@LP$4Nv% zRCwC$T1{wNRTMtwzWe4G5o#I>U5Ip31Zk~S0;RS{MaiZZ6sZfb5ClaLY8Q%CszOzi zwul5O3SATxt%3!+a8ZgbLGV>@AJw7!xW!H`IMD(eMaMRP$%H=EMp!o+gkJsz<+jDKWbM9Ud z`Lj!-TPZ=BiXfunW0x;u9*sYkqRs7i5LH$0{r&lhcjsQY=A>*`XwJ*b59cl3A8Q() zsq00AnIFxU?CbSyu|%g?dY*_5Rp&kbhPC$9RS?%Ihd{UUv{RA=fGq$Jq-^{4MK?n*6T8zM?C_z`y*V=v6k zTs2)ToR%{b(;!Jz!5U+(rWFFJpoq}lbK^}vJLh(nN~O8B`WN|0M2;mSe7Cjsq1X>Z zRsBIkzK$hoRMqce^PE-Hk%ST-0f6mI$v5KuV^tkXa6JJ;elX1@DAwy=n4FyKD86d7 z+E9xr-(7`@K1u#2@BO|uD?z*h0F+itHL{ilLGVCdU*9*Krjd55)eZ?TZA$*)$(dyW z04U{^AgZbwWA+fy`Et1&=5{3*MWsnqok+V2j45G%Z*T7xT_nX!39yYsa?%(xoO-W~ z*i^zG5q&i}dTDUSjyrUT@t0KfOgto2^~Y5_`dd}4Br3vRZAXucjG&0PEVsYsH$?pD z+;&CGd?xb~kojGq&vQwDb8cJ4dx8s9l9^BCk^~|;k+Jph6XN`lP^;A<5&1jgbAg4^ zwp@}>uh)04K`6v?!s~eqg`w`n+Y=t2W2Pf>b91-AdPKEa z*-S*IMdS|=nO%;MhI0O4mQnKVP@Zh*ss*lADp4tl`c!ob0&GWPwu;Dx#+#xL1VLF< ve^u2{L>#x)mZ3m_0tE^bC{Un4fn4BU%95U$vrUpE00000NkvXXu0mjf6I*f} literal 0 HcmV?d00001 diff --git a/calculatorpp/res/drawable-xlarge-hdpi/kb_settings.png b/calculatorpp/res/drawable-xlarge-hdpi/kb_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..3e73705cedc109a491b46359f8338c41456664af GIT binary patch literal 1711 zcmV;g22lBlP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iyu2 z3l`J9Eyt z=gy3E|8U`)v-jD1ueH}&dp*vTDyX1>3M#0ef(pt6py+eo7G8HYTsaAM&V~2=CH0fk zM^d$lPx<}FhNv)DDOKNh?T`V@}tLML-IxXUIOZEyn&`luXYP21iD@WYy#SVbwFR> zPT+JqqMh%6aE~@%3vd_kx;?vW^YrO5CIrM!FvArRb^>UQLEHggZU>CW8xt-9Es?gv zz^G1TLc|b_2QIX;qa86|7LWt>#_V56f_?+)I$b4zQNhlqS@>qa*>6??rWG3N2r#ZQ z#lH&pwuA*^I_<}+20lqKUWg@WXvwAILA9i#CGc>$q&?oVbIvtNT52Aklaxe`^OC-l zw4|&m5FHp86zp1(-9HUXE?`Ut0w1Q3f=j@xv_3*EF7f8G4+2KouAPxIC@%kkxMQ`X z9Z~<@Id@*tDoJO9zHz9ilJqn%6nNQ=%Hg)&OeG)(ECBv8Uww_8$8phQ?+bDi~vug|>wPqNplu044JF*Yj|7?5DnbCNCv_q8P+LZgH0Ci}(3h%6XDpwDsR z3s=A(rA4^oJ?t0z5X(vhl5oAoiXR^POJqR!{(yw)*qD_BoK7%loiV{B-=i{6rM1-z)PG%-$+=9C}Q3G^~-UtoC$SwQqa%oD|ru_voope{v@?r~rBwG!Bxn69wLQlPKR-w#-xaQ@af zu5eriTnp?>7z~{RY9cAL_hJ@D7FspgGjL{#tnn9CoXvy*eSk$N@_%225uuGW$0EfG z7UB6{vqf-I!{mt79?qo*gyv@!4%=exHL*$>mp1@o3XC@vcm$Yjb%9}#_Flj=;Exn@ zUd*gc5TvMvS|vBhPWXPujM$+u!|&0+8!5!z_gm&wD3g>}u(+ortuRN2gzvXX`c%?J zN#992W4=A+-Cbv{>r_dzBS)S~aCA0FdeAx7kY!HLr^RcG0gt9|Xk2it9f<9z*{VXz$MvUHQj}3M#0ef(rhR_y<5@HSoY5Cx`$5002ovPDHLk FV1iGk6p;V` literal 0 HcmV?d00001 diff --git a/calculatorpp/res/layout/calc_copy_button.xml b/calculatorpp/res/layout/calc_copy_button.xml index 436572ce..f6d25037 100644 --- a/calculatorpp/res/layout/calc_copy_button.xml +++ b/calculatorpp/res/layout/calc_copy_button.xml @@ -1,14 +1,14 @@ - - - - - + + + + \ No newline at end of file diff --git a/calculatorpp/res/layout/calc_dot_button.xml b/calculatorpp/res/layout/calc_dot_button.xml index 17c989ef..848dcfc6 100644 --- a/calculatorpp/res/layout/calc_dot_button.xml +++ b/calculatorpp/res/layout/calc_dot_button.xml @@ -8,7 +8,7 @@ + + + + \ No newline at end of file diff --git a/calculatorpp/res/layout/widget_clear_button.xml b/calculatorpp/res/layout/widget_clear_button.xml index efb88b02..8715b738 100644 --- a/calculatorpp/res/layout/widget_clear_button.xml +++ b/calculatorpp/res/layout/widget_clear_button.xml @@ -1,13 +1,13 @@ - - - - -