Vibrator has been removed from the app

This commit is contained in:
serso 2016-01-08 12:37:28 +01:00
parent 0c78ac3322
commit 7774d87d97
24 changed files with 224 additions and 506 deletions

View File

@ -64,7 +64,7 @@ dependencies {
compile('ch.acra:acra:4.7.0') {
exclude group: 'org.json'
}
compile 'org.solovyev.android.views.dragbutton:drag-button:1.0@aar'
compile 'org.solovyev.android.views.dragbutton:drag-button:1.1@aar'
compile 'org.solovyev.android:android-common-lists:1.1.18@aar'
compile 'org.solovyev.android:android-common-core:1.1.18@aar'
compile 'org.solovyev.android:android-common-other:1.1.18@aar'

Binary file not shown.

Binary file not shown.

View File

@ -3,7 +3,6 @@
package="org.solovyev.android.calculator"
android:installLocation="auto">
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="com.android.vending.BILLING" />

View File

@ -1,105 +0,0 @@
/*
* Copyright 2013 serso aka se.solovyev
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Contact details
*
* Email: se.solovyev@gmail.com
* Site: http://se.solovyev.org
*/
package org.solovyev.android.calculator;
import android.app.Application;
import android.content.Context;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
/**
* User: serso
* Date: 11/18/12
* Time: 6:05 PM
*/
public class AndroidCalculatorKeyboard implements CalculatorKeyboard {
@Nonnull
private final CalculatorKeyboard calculatorKeyboard;
@Nonnull
private final Context context;
@android.support.annotation.Nullable
private org.solovyev.android.calculator.Vibrator vibrator;
public AndroidCalculatorKeyboard(@Nonnull Application application,
@Nonnull CalculatorKeyboard calculatorKeyboard) {
this.context = application;
this.calculatorKeyboard = calculatorKeyboard;
}
@Override
public boolean buttonPressed(@Nullable String text) {
App.getGa().onButtonPressed(text);
final boolean processed = calculatorKeyboard.buttonPressed(text);
if (processed) {
vibrate();
}
return processed;
}
private void vibrate() {
if (vibrator == null) {
vibrator = App.getVibrator();
}
vibrator.vibrate();
}
@Override
public void roundBracketsButtonPressed() {
vibrate();
calculatorKeyboard.roundBracketsButtonPressed();
}
@Override
public void pasteButtonPressed() {
vibrate();
calculatorKeyboard.pasteButtonPressed();
}
@Override
public void clearButtonPressed() {
vibrate();
calculatorKeyboard.clearButtonPressed();
}
@Override
public void copyButtonPressed() {
vibrate();
calculatorKeyboard.copyButtonPressed();
}
@Override
public void moveCursorLeft() {
vibrate();
calculatorKeyboard.moveCursorLeft();
}
@Override
public void moveCursorRight() {
vibrate();
calculatorKeyboard.moveCursorRight();
}
}

View File

@ -103,8 +103,6 @@ public final class App {
@Nullable
private static Boolean lg = null;
@Nonnull
private static volatile Vibrator vibrator;
@Nonnull
private static volatile ScreenMetrics screenMetrics;
private App() {
@ -150,7 +148,6 @@ public final class App {
}
});
App.broadcaster = new CalculatorBroadcaster(application, preferences);
App.vibrator = new Vibrator(application, preferences);
App.screenMetrics = new ScreenMetrics(application);
App.languages.init(App.preferences);
@ -273,11 +270,6 @@ public final class App {
return isLg() && Build.VERSION.SDK_INT == Build.VERSION_CODES.JELLY_BEAN;
}
@Nonnull
public static Vibrator getVibrator() {
return vibrator;
}
@Nonnull
public static ScreenMetrics getScreenMetrics() {
return screenMetrics;

View File

@ -312,7 +312,6 @@ public abstract class BaseUi implements SharedPreferences.OnSharedPreferenceChan
@Override
public boolean processDragEvent(@Nonnull DragDirection dragDirection, @Nonnull DragButton dragButton, @Nonnull PointF startPoint, @Nonnull MotionEvent motionEvent) {
if (dragDirection == DragDirection.down) {
App.getVibrator().vibrate();
Locator.getInstance().getCalculator().fireCalculatorEvent(CalculatorEventType.show_operators, null);
return true;
}

View File

@ -1,6 +1,7 @@
package org.solovyev.android.calculator;
import android.support.annotation.IdRes;
import android.view.HapticFeedbackConstants;
import android.view.View;
import android.widget.Button;
@ -31,47 +32,49 @@ final class ButtonOnClickListener implements View.OnClickListener {
case R.id.cpp_button_plus:
case R.id.cpp_button_right:
case R.id.cpp_button_round_brackets:
onClick(((Button) v).getText().toString());
onClick(v, ((Button) v).getText().toString());
break;
case R.id.cpp_button_clear:
onClick(CalculatorSpecialButton.clear);
onClick(v, CalculatorSpecialButton.clear);
break;
case R.id.cpp_button_functions:
onClick(CalculatorSpecialButton.functions);
onClick(v, CalculatorSpecialButton.functions);
break;
case R.id.cpp_button_history:
onClick(CalculatorSpecialButton.history);
onClick(v, CalculatorSpecialButton.history);
break;
case R.id.cpp_button_erase:
onClick(CalculatorSpecialButton.erase);
onClick(v, CalculatorSpecialButton.erase);
break;
case R.id.cpp_button_paste:
onClick(CalculatorSpecialButton.paste);
onClick(v, CalculatorSpecialButton.paste);
break;
case R.id.cpp_button_copy:
onClick(CalculatorSpecialButton.copy);
onClick(v, CalculatorSpecialButton.copy);
break;
case R.id.cpp_button_like:
onClick(CalculatorSpecialButton.like);
onClick(v, CalculatorSpecialButton.like);
break;
case R.id.cpp_button_operators:
onClick(CalculatorSpecialButton.operators);
onClick(v, CalculatorSpecialButton.operators);
break;
case R.id.cpp_button_vars:
onClick(CalculatorSpecialButton.vars);
onClick(v, CalculatorSpecialButton.vars);
break;
case R.id.cpp_button_equals:
onClick(CalculatorSpecialButton.equals);
onClick(v, CalculatorSpecialButton.equals);
break;
}
}
private void onClick(@Nonnull CalculatorSpecialButton b) {
onClick(b.getActionCode());
private void onClick(@Nonnull View v, @Nonnull CalculatorSpecialButton b) {
onClick(v, b.getActionCode());
}
private void onClick(@Nonnull String s) {
Locator.getInstance().getKeyboard().buttonPressed(s);
private void onClick(@Nonnull View v, @Nonnull String s) {
if (Locator.getInstance().getKeyboard().buttonPressed(s)) {
v.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
}
}
public void attachToViews(@Nonnull ViewsCache views) {

View File

@ -171,7 +171,7 @@ public class CalculatorApplication extends android.app.Application implements Sh
new AndroidCalculatorHistory(this, calculator),
new AndroidCalculatorLogger(),
new AndroidCalculatorPreferenceService(this),
new AndroidCalculatorKeyboard(this, new CalculatorKeyboardImpl()),
new CalculatorKeyboard(),
new AndroidCalculatorPlotter(this, new CalculatorPlotterImpl(calculator)),
editorTextProcessor);

View File

@ -138,14 +138,15 @@ public enum CalculatorButton {
}
}
public void onLongClick() {
public boolean onLongClick() {
if (onLongClickText != null) {
Locator.getInstance().getKeyboard().buttonPressed(onLongClickText);
return Locator.getInstance().getKeyboard().buttonPressed(onLongClickText);
}
return false;
}
public void onClick() {
Locator.getInstance().getKeyboard().buttonPressed(onClickText);
public boolean onClick() {
return Locator.getInstance().getKeyboard().buttonPressed(onClickText);
}
public int getButtonId() {

View File

@ -33,8 +33,7 @@ import android.util.TypedValue;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import jscl.AngleUnit;
import jscl.NumeralBase;
import org.solovyev.android.Views;
import org.solovyev.android.calculator.model.AndroidCalculatorEngine;
import org.solovyev.android.calculator.view.AngleUnitsButton;
@ -47,6 +46,9 @@ import org.solovyev.android.views.dragbutton.SimpleDragListener;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import jscl.AngleUnit;
import jscl.NumeralBase;
public final class CalculatorButtons {
private CalculatorButtons() {
@ -115,18 +117,13 @@ public final class CalculatorButtons {
private final DigitButtonDragProcessor upDownProcessor = new DigitButtonDragProcessor(getKeyboard());
@Override
public boolean processDragEvent(@Nonnull DragDirection dragDirection, @Nonnull DragButton dragButton, @Nonnull PointF startPoint, @Nonnull MotionEvent motionEvent) {
final boolean result;
if (dragDirection == DragDirection.left) {
App.getVibrator().vibrate();
public boolean processDragEvent(@Nonnull DragDirection direction, @Nonnull DragButton button, @Nonnull PointF startPoint, @Nonnull MotionEvent motionEvent) {
if (direction == DragDirection.left) {
getKeyboard().roundBracketsButtonPressed();
result = true;
} else {
result = upDownProcessor.processDragEvent(dragDirection, dragButton, startPoint, motionEvent);
return true;
}
return result;
return upDownProcessor.processDragEvent(direction, button, startPoint, motionEvent);
}
}
@ -144,18 +141,12 @@ public final class CalculatorButtons {
@Nonnull DragButton dragButton,
@Nonnull PointF startPoint,
@Nonnull MotionEvent motionEvent) {
boolean result = false;
if (dragDirection == DragDirection.up) {
App.getVibrator().vibrate();
Locator.getInstance().getCalculator().fireCalculatorEvent(CalculatorEventType.show_create_var_dialog, null, context);
result = true;
}/* else if (dragDirection == DragDirection.down) {
Locator.getInstance().getCalculator().fireCalculatorEvent(CalculatorEventType.show_create_matrix_dialog, null, context);
result = true;
}*/
return true;
}
return result;
return false;
}
}
@ -177,8 +168,6 @@ public final class CalculatorButtons {
@Nonnull DragButton dragButton,
@Nonnull PointF startPoint,
@Nonnull MotionEvent motionEvent) {
boolean result = false;
if (dragButton instanceof AngleUnitsButton) {
if (dragDirection != DragDirection.left) {
final String directionText = ((AngleUnitsButton) dragButton).getText(dragDirection);
@ -191,21 +180,19 @@ public final class CalculatorButtons {
final AngleUnit oldAngleUnits = AndroidCalculatorEngine.Preferences.angleUnit.getPreference(preferences);
if (oldAngleUnits != angleUnits) {
App.getVibrator().vibrate();
Locator.getInstance().getPreferenceService().setAngleUnits(angleUnits);
}
result = true;
} catch (IllegalArgumentException e) {
Log.d(this.getClass().getName(), "Unsupported angle units: " + directionText);
}
return true;
}
} else if (dragDirection == DragDirection.left) {
result = processor.processDragEvent(dragDirection, dragButton, startPoint, motionEvent);
return processor.processDragEvent(dragDirection, dragButton, startPoint, motionEvent);
}
}
return result;
return false;
}
}
@ -223,31 +210,26 @@ public final class CalculatorButtons {
@Nonnull DragButton dragButton,
@Nonnull PointF startPoint,
@Nonnull MotionEvent motionEvent) {
boolean result = false;
if (dragButton instanceof NumeralBasesButton) {
final String directionText = ((NumeralBasesButton) dragButton).getText(dragDirection);
if (directionText != null) {
try {
final NumeralBase numeralBase = NumeralBase.valueOf(directionText);
final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
final NumeralBase oldNumeralBase = AndroidCalculatorEngine.Preferences.numeralBase.getPreference(preferences);
if (oldNumeralBase != numeralBase) {
App.getVibrator().vibrate();
Locator.getInstance().getPreferenceService().setNumeralBase(numeralBase);
}
result = true;
} catch (IllegalArgumentException e) {
Log.d(this.getClass().getName(), "Unsupported numeral base: " + directionText);
}
return true;
}
}
return result;
return false;
}
}
@ -265,15 +247,11 @@ public final class CalculatorButtons {
@Nonnull DragButton dragButton,
@Nonnull PointF startPoint,
@Nonnull MotionEvent motionEvent) {
boolean result = false;
if (dragDirection == DragDirection.up) {
App.getVibrator().vibrate();
Locator.getInstance().getCalculator().fireCalculatorEvent(CalculatorEventType.show_create_function_dialog, null, context);
result = true;
return true;
}
return result;
return false;
}
}
}

View File

@ -22,26 +22,115 @@
package org.solovyev.android.calculator;
import org.solovyev.android.calculator.math.MathType;
import org.solovyev.common.text.Strings;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
/**
* User: serso
* Date: 9/22/12
* Time: 1:08 PM
*/
public interface CalculatorKeyboard {
public class CalculatorKeyboard {
boolean buttonPressed(@Nullable String text);
public boolean buttonPressed(@Nullable final String text) {
App.getGa().onButtonPressed(text);
if (!Strings.isEmpty(text)) {
// process special buttons
boolean processed = processSpecialButtons(text);
void roundBracketsButtonPressed();
if (!processed) {
processText(prepareText(text));
}
return true;
}
return false;
}
void pasteButtonPressed();
private void processText(@Nonnull String text) {
int cursorPositionOffset = 0;
final StringBuilder textToBeInserted = new StringBuilder(text);
void clearButtonPressed();
final MathType.Result mathType = MathType.getType(text, 0, false);
switch (mathType.type) {
case function:
textToBeInserted.append("()");
cursorPositionOffset = -1;
break;
case operator:
textToBeInserted.append("()");
cursorPositionOffset = -1;
break;
case comma:
textToBeInserted.append(" ");
break;
}
void copyButtonPressed();
if (cursorPositionOffset == 0) {
if (MathType.groupSymbols.contains(text)) {
cursorPositionOffset = -1;
}
}
void moveCursorLeft();
final Editor editor = Locator.getInstance().getEditor();
editor.insert(textToBeInserted.toString(), cursorPositionOffset);
}
void moveCursorRight();
@Nonnull
private String prepareText(@Nonnull String text) {
if ("( )".equals(text) || "( )".equals(text)) {
return "()";
} else {
return text;
}
}
private boolean processSpecialButtons(@Nonnull String text) {
boolean result = false;
final CalculatorSpecialButton button = CalculatorSpecialButton.getByActionCode(text);
if (button != null) {
button.onClick(this);
result = true;
}
return result;
}
public void roundBracketsButtonPressed() {
final Editor editor = Locator.getInstance().getEditor();
EditorState viewState = editor.getState();
final int cursorPosition = viewState.selection;
final CharSequence oldText = viewState.text;
editor.setText("(" + oldText.subSequence(0, cursorPosition) + ")" + oldText.subSequence(cursorPosition, oldText.length()), cursorPosition + 2);
}
public void pasteButtonPressed() {
final String text = Locator.getInstance().getClipboard().getText();
if (text != null) {
Locator.getInstance().getEditor().insert(text);
}
}
public void clearButtonPressed() {
Locator.getInstance().getEditor().clear();
}
public void copyButtonPressed() {
final DisplayState displayViewState = Locator.getInstance().getDisplay().getViewState();
if (displayViewState.isValid()) {
final CharSequence text = displayViewState.getText();
if (!Strings.isEmpty(text)) {
Locator.getInstance().getClipboard().setText(text);
Locator.getInstance().getNotifier().showMessage(CalculatorMessage.newInfoMessage(CalculatorMessages.result_copied));
}
}
}
public void moveCursorLeft() {
Locator.getInstance().getEditor().moveCursorLeft();
}
public void moveCursorRight() {
Locator.getInstance().getEditor().moveCursorRight();
}
}

View File

@ -1,142 +0,0 @@
/*
* Copyright 2013 serso aka se.solovyev
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Contact details
*
* Email: se.solovyev@gmail.com
* Site: http://se.solovyev.org
*/
package org.solovyev.android.calculator;
import org.solovyev.android.calculator.math.MathType;
import org.solovyev.common.text.Strings;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
public class CalculatorKeyboardImpl implements CalculatorKeyboard {
@Override
public boolean buttonPressed(@Nullable final String text) {
if (!Strings.isEmpty(text)) {
// process special buttons
boolean processed = processSpecialButtons(text);
if (!processed) {
processText(prepareText(text));
}
return true;
}
return false;
}
private void processText(@Nonnull String text) {
int cursorPositionOffset = 0;
final StringBuilder textToBeInserted = new StringBuilder(text);
final MathType.Result mathType = MathType.getType(text, 0, false);
switch (mathType.type) {
case function:
textToBeInserted.append("()");
cursorPositionOffset = -1;
break;
case operator:
textToBeInserted.append("()");
cursorPositionOffset = -1;
break;
case comma:
textToBeInserted.append(" ");
break;
}
if (cursorPositionOffset == 0) {
if (MathType.groupSymbols.contains(text)) {
cursorPositionOffset = -1;
}
}
final Editor editor = Locator.getInstance().getEditor();
editor.insert(textToBeInserted.toString(), cursorPositionOffset);
}
@Nonnull
private String prepareText(@Nonnull String text) {
if ("( )".equals(text) || "( )".equals(text)) {
return "()";
} else {
return text;
}
}
private boolean processSpecialButtons(@Nonnull 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 Editor editor = Locator.getInstance().getEditor();
EditorState viewState = editor.getState();
final int cursorPosition = viewState.selection;
final CharSequence oldText = viewState.text;
editor.setText("(" + oldText.subSequence(0, cursorPosition) + ")" + oldText.subSequence(cursorPosition, oldText.length()), cursorPosition + 2);
}
@Override
public void pasteButtonPressed() {
final String text = Locator.getInstance().getClipboard().getText();
if (text != null) {
Locator.getInstance().getEditor().insert(text);
}
}
@Override
public void clearButtonPressed() {
Locator.getInstance().getEditor().clear();
}
@Override
public void copyButtonPressed() {
final DisplayState displayViewState = Locator.getInstance().getDisplay().getViewState();
if (displayViewState.isValid()) {
final CharSequence text = displayViewState.getText();
if (!Strings.isEmpty(text)) {
Locator.getInstance().getClipboard().setText(text);
Locator.getInstance().getNotifier().showMessage(CalculatorMessage.newInfoMessage(CalculatorMessages.result_copied));
}
}
}
@Override
public void moveCursorLeft() {
Locator.getInstance().getEditor().moveCursorLeft();
}
@Override
public void moveCursorRight() {
Locator.getInstance().getEditor().moveCursorRight();
}
}

View File

@ -24,6 +24,7 @@ package org.solovyev.android.calculator;
import android.graphics.PointF;
import android.view.MotionEvent;
import org.solovyev.android.views.dragbutton.DirectionDragButton;
import org.solovyev.android.views.dragbutton.DragButton;
import org.solovyev.android.views.dragbutton.DragDirection;
@ -31,33 +32,21 @@ import org.solovyev.android.views.dragbutton.SimpleDragListener;
import javax.annotation.Nonnull;
/**
* User: serso
* Date: 9/16/11
* Time: 11:45 PM
*/
public class CursorDragProcessor implements SimpleDragListener.DragProcessor {
public CursorDragProcessor() {
}
@Override
public boolean processDragEvent(@Nonnull DragDirection dragDirection, @Nonnull DragButton dragButton, @Nonnull PointF startPoint, @Nonnull MotionEvent motionEvent) {
boolean result = false;
if (dragButton instanceof DirectionDragButton) {
String text = ((DirectionDragButton) dragButton).getText(dragDirection);
final String text = ((DirectionDragButton) dragButton).getText(dragDirection);
if ("◁◁".equals(text)) {
App.getVibrator().vibrate();
Locator.getInstance().getEditor().setCursorOnStart();
result = true;
return true;
} else if ("▷▷".equals(text)) {
App.getVibrator().vibrate();
Locator.getInstance().getEditor().setCursorOnEnd();
result = true;
return true;
}
}
return result;
return false;
}
}

View File

@ -31,11 +31,6 @@ import org.solovyev.android.views.dragbutton.SimpleDragListener;
import javax.annotation.Nonnull;
/**
* User: serso
* Date: 9/16/11
* Time: 11:48 PM
*/
public class DigitButtonDragProcessor implements SimpleDragListener.DragProcessor {
@Nonnull
@ -46,11 +41,8 @@ public class DigitButtonDragProcessor implements SimpleDragListener.DragProcesso
}
@Override
public boolean processDragEvent(@Nonnull DragDirection dragDirection, @Nonnull DragButton dragButton, @Nonnull PointF startPoint, @Nonnull MotionEvent motionEvent) {
if (!(dragButton instanceof DirectionDragButton)) throw new AssertionError();
final String text = ((DirectionDragButton) dragButton).getText(dragDirection);
calculatorKeyboard.buttonPressed(text);
return true;
public boolean processDragEvent(@Nonnull DragDirection direction, @Nonnull DragButton button, @Nonnull PointF startPoint, @Nonnull MotionEvent motionEvent) {
final String text = ((DirectionDragButton) button).getText(direction);
return calculatorKeyboard.buttonPressed(text);
}
}

View File

@ -24,6 +24,7 @@ package org.solovyev.android.calculator;
import android.graphics.PointF;
import android.view.MotionEvent;
import org.solovyev.android.views.dragbutton.DirectionDragButton;
import org.solovyev.android.views.dragbutton.DragButton;
import org.solovyev.android.views.dragbutton.DragDirection;
@ -31,35 +32,21 @@ import org.solovyev.android.views.dragbutton.SimpleDragListener;
import javax.annotation.Nonnull;
/**
* User: serso
* Date: 10/24/11
* Time: 9:52 PM
*/
public class EqualsDragProcessor implements SimpleDragListener.DragProcessor {
public EqualsDragProcessor() {
}
@Override
public boolean processDragEvent(@Nonnull DragDirection dragDirection, @Nonnull DragButton dragButton, @Nonnull PointF startPoint, @Nonnull MotionEvent motionEvent) {
boolean result = false;
if (dragButton instanceof DirectionDragButton) {
if (dragDirection == DragDirection.down) {
App.getVibrator().vibrate();
CalculatorActivityLauncher.tryPlot();
result = true;
} else {
final String text = ((DirectionDragButton) dragButton).getText(dragDirection);
if ("".equals(text)) {
App.getVibrator().vibrate();
Locator.getInstance().getCalculator().simplify();
result = true;
}
public boolean processDragEvent(@Nonnull DragDirection direction, @Nonnull DragButton button, @Nonnull PointF startPoint, @Nonnull MotionEvent motionEvent) {
if (direction == DragDirection.down) {
CalculatorActivityLauncher.tryPlot();
return true;
} else if (button instanceof DirectionDragButton) {
final String text = ((DirectionDragButton) button).getText(direction);
if ("".equals(text)) {
Locator.getInstance().getCalculator().simplify();
return true;
}
}
return result;
return false;
}
}

View File

@ -31,23 +31,31 @@ import android.support.annotation.LayoutRes;
import android.support.annotation.StyleRes;
import android.util.SparseArray;
import android.view.ContextThemeWrapper;
import jscl.AngleUnit;
import jscl.NumeralBase;
import org.solovyev.android.Check;
import org.solovyev.android.calculator.language.Languages;
import org.solovyev.android.calculator.math.MathType;
import org.solovyev.android.calculator.model.AndroidCalculatorEngine;
import org.solovyev.android.calculator.preferences.PurchaseDialogActivity;
import org.solovyev.android.calculator.wizard.WizardActivity;
import org.solovyev.android.prefs.*;
import org.solovyev.android.prefs.BooleanPreference;
import org.solovyev.android.prefs.IntegerPreference;
import org.solovyev.android.prefs.LongPreference;
import org.solovyev.android.prefs.NumberToStringPreference;
import org.solovyev.android.prefs.Preference;
import org.solovyev.android.prefs.StringPreference;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.text.DecimalFormatSymbols;
import java.util.EnumMap;
import java.util.Locale;
import java.util.Map;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import jscl.AngleUnit;
import jscl.NumeralBase;
import static org.solovyev.android.Android.isPhoneModel;
import static org.solovyev.android.DeviceModel.samsung_galaxy_s;
import static org.solovyev.android.DeviceModel.samsung_galaxy_s_2;
@ -126,18 +134,6 @@ public final class Preferences {
// renew value after each application start
Calculations.showCalculationMessagesDialog.putDefault(preferences);
Calculations.lastPreferredPreferencesCheck.putDefault(preferences);
if (!Gui.hapticFeedback.isSet(preferences)) {
final Preference<Boolean> hfEnabled = Gui.hapticFeedbackEnabled;
final boolean enabled = !hfEnabled.isSet(preferences) ? true : hfEnabled.getPreference(preferences);
if (enabled) {
final Preference<Long> hfDuration = Gui.hapticFeedbackDuration;
final long duration = !hfDuration.isSet(preferences) ? 60L : hfDuration.getPreference(preferences);
Gui.hapticFeedback.putPreference(preferences, duration);
} else {
Gui.hapticFeedback.putPreference(preferences, 0L);
}
}
}
private static void applyDefaultPreference(@Nonnull SharedPreferences preferences, @Nonnull Preference<?> preference) {
@ -281,9 +277,6 @@ public final class Preferences {
public static final Preference<Boolean> colorDisplay = BooleanPreference.of("org.solovyev.android.calculator.CalculatorModel_color_display", true);
public static final Preference<Long> hapticFeedback = NumberToStringPreference.of("hapticFeedback", 60L, Long.class);
private static final Preference<Boolean> hapticFeedbackEnabled = BooleanPreference.of("org.solovyev.android.calculator.CalculatorModel_haptic_feedback", false);
private static final Preference<Long> hapticFeedbackDuration = NumberToStringPreference.of("org.solovyev.android.calculator.CalculatorActivity_calc_haptic_feedback_duration_key", 60L, Long.class);
@Nonnull
public static Theme getTheme(@Nonnull SharedPreferences preferences) {
return theme.getPreferenceNoError(preferences);

View File

@ -1,42 +0,0 @@
package org.solovyev.android.calculator;
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;
import javax.annotation.Nonnull;
public final class Vibrator implements SharedPreferences.OnSharedPreferenceChangeListener {
@Nonnull
private final android.os.Vibrator service;
private long time = 0;
public Vibrator(@Nonnull Context context, @Nonnull SharedPreferences preferences) {
service = (android.os.Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
preferences.registerOnSharedPreferenceChangeListener(this);
updateTime(preferences);
}
private void updateTime(@Nonnull SharedPreferences preferences) {
time = Preferences.Gui.hapticFeedback.getPreference(preferences) / 2;
}
public void vibrate() {
try {
if (time > 0) {
service.vibrate(time);
}
} catch (SecurityException e) {
Log.e("Vibrator", e.getMessage(), e);
}
}
@Override
public void onSharedPreferenceChanged(@Nonnull SharedPreferences preferences, String key) {
if (Preferences.Gui.hapticFeedback.isSameKey(key)) {
updateTime(preferences);
}
}
}

View File

@ -44,7 +44,6 @@ import android.widget.ListView;
import com.melnykov.fab.FloatingActionButton;
import org.solovyev.android.calculator.App;
import org.solovyev.android.calculator.CalculatorApplication;
import org.solovyev.android.calculator.CalculatorEventData;
import org.solovyev.android.calculator.CalculatorEventListener;
@ -105,13 +104,6 @@ public abstract class BaseHistoryFragment extends ListFragment implements Calcul
@Nonnull
private static final String TAG = "CalculatorHistoryFragment";
/*
**********************************************************************
*
* FIELDS
*
**********************************************************************
*/
private final ActivityMenu<Menu, MenuItem> menu = ListActivityMenu.fromResource(R.menu.history_menu, HistoryMenu.class, AndroidMenuHelper.getInstance(), new HistoryMenuFilter());
@Nonnull
private final SharedPreferences.OnSharedPreferenceChangeListener preferencesListener = new HistoryOnPreferenceChangeListener();
@ -160,9 +152,8 @@ public abstract class BaseHistoryFragment extends ListFragment implements Calcul
return result;
}
public static void useHistoryItem(@Nonnull final HistoryState historyState) {
App.getVibrator().vibrate();
Locator.getInstance().getCalculator().fireCalculatorEvent(CalculatorEventType.use_history_state, historyState);
public static void useHistoryItem(@Nonnull final HistoryState state) {
Locator.getInstance().getCalculator().fireCalculatorEvent(CalculatorEventType.use_history_state, state);
}
@Nonnull

View File

@ -23,9 +23,8 @@
package org.solovyev.android.calculator.history;
import android.graphics.PointF;
import android.util.Log;
import android.view.MotionEvent;
import org.solovyev.android.calculator.App;
import org.solovyev.android.views.dragbutton.DragButton;
import org.solovyev.android.views.dragbutton.DragDirection;
import org.solovyev.android.views.dragbutton.SimpleDragListener;
@ -33,12 +32,8 @@ import org.solovyev.common.history.HistoryAction;
import org.solovyev.common.history.HistoryControl;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
/**
* User: serso
* Date: 9/16/11
* Time: 11:36 PM
*/
public class HistoryDragProcessor<T> implements SimpleDragListener.DragProcessor {
@Nonnull
@ -49,26 +44,22 @@ public class HistoryDragProcessor<T> implements SimpleDragListener.DragProcessor
}
@Override
public boolean processDragEvent(@Nonnull DragDirection dragDirection, @Nonnull DragButton dragButton, @Nonnull PointF startPoint, @Nonnull MotionEvent motionEvent) {
boolean result = false;
Log.d(String.valueOf(dragButton.getId()), "History on drag event start: " + dragDirection);
final HistoryAction historyAction;
if (dragDirection == DragDirection.up) {
historyAction = HistoryAction.undo;
} else if (dragDirection == DragDirection.down) {
historyAction = HistoryAction.redo;
} else {
historyAction = null;
public boolean processDragEvent(@Nonnull DragDirection direction, @Nonnull DragButton button, @Nonnull PointF startPoint, @Nonnull MotionEvent motionEvent) {
final HistoryAction action = getActionFromDirection(direction);
if (action != null) {
historyControl.doHistoryAction(action);
return true;
}
return false;
}
if (historyAction != null) {
App.getVibrator().vibrate();
result = true;
historyControl.doHistoryAction(historyAction);
@Nullable
private HistoryAction getActionFromDirection(@Nonnull DragDirection direction) {
if (direction == DragDirection.up) {
return HistoryAction.undo;
} else if (direction == DragDirection.down) {
return HistoryAction.redo;
}
return result;
return null;
}
}

View File

@ -31,16 +31,26 @@ import android.preference.PreferenceManager;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Gravity;
import android.view.HapticFeedbackConstants;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;
import org.solovyev.android.calculator.*;
import org.solovyev.android.calculator.AndroidCalculatorDisplayView;
import org.solovyev.android.calculator.App;
import org.solovyev.android.calculator.CalculatorButton;
import org.solovyev.android.calculator.DisplayState;
import org.solovyev.android.calculator.EditorState;
import org.solovyev.android.calculator.EditorView;
import org.solovyev.android.calculator.Preferences;
import org.solovyev.android.calculator.R;
import org.solovyev.android.prefs.Preference;
import java.util.Locale;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.Locale;
/**
* User: serso
@ -217,7 +227,9 @@ public class CalculatorOnscreenView {
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
widgetButton.onClick();
if (widgetButton.onClick()) {
v.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
}
if (widgetButton == CalculatorButton.app) {
minimize();
}
@ -226,7 +238,9 @@ public class CalculatorOnscreenView {
button.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
widgetButton.onLongClick();
if (widgetButton.onLongClick()) {
v.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
}
return true;
}
});
@ -250,7 +264,6 @@ public class CalculatorOnscreenView {
onscreenFoldButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
App.getVibrator().vibrate();
if (folded) {
unfold();
} else {
@ -263,7 +276,6 @@ public class CalculatorOnscreenView {
onscreenHideButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
App.getVibrator().vibrate();
minimize();
}
});
@ -271,7 +283,6 @@ public class CalculatorOnscreenView {
root.findViewById(R.id.onscreen_close_button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
App.getVibrator().vibrate();
hide();
}
});

View File

@ -1,6 +1,7 @@
package org.solovyev.android.calculator.view;
import android.view.GestureDetector;
import android.view.HapticFeedbackConstants;
import android.view.MotionEvent;
import android.view.View;
@ -42,7 +43,8 @@ public final class LongClickEraser implements View.OnTouchListener {
}
public static void createAndAttach(@Nonnull View view) {
view.setOnTouchListener(new LongClickEraser(view));
final LongClickEraser l = new LongClickEraser(view);
view.setOnTouchListener(l);
}
@Override
@ -61,11 +63,11 @@ public final class LongClickEraser implements View.OnTouchListener {
}
private class Eraser implements Runnable {
private static final int DELAY = 500;
private static final int DELAY = 300;
private long delay;
private boolean wasCalculatingOnFly;
private boolean erasing;
private boolean tracking = true;
private boolean wasCalculatingOnFly;
@Override
public void run() {
@ -84,12 +86,13 @@ public final class LongClickEraser implements View.OnTouchListener {
}
erasing = true;
delay = DELAY;
view.removeCallbacks(this);
view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
wasCalculatingOnFly = calculator.isCalculateOnFly();
if (wasCalculatingOnFly) {
calculator.setCalculateOnFly(false);
}
view.removeCallbacks(this);
view.post(this);
run();
}
void stop() {

View File

@ -27,16 +27,17 @@ import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;
import org.solovyev.android.calculator.App;
import org.solovyev.android.calculator.R;
import org.solovyev.android.views.dragbutton.DirectionDragButton;
import org.solovyev.android.views.dragbutton.DragButton;
import org.solovyev.android.views.dragbutton.DragDirection;
import org.solovyev.android.views.dragbutton.SimpleDragListener;
import java.util.Arrays;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.Arrays;
public class DragButtonWizardStep extends WizardFragment {
@ -161,7 +162,6 @@ public class DragButtonWizardStep extends WizardFragment {
private class DragButtonOnClickListener implements View.OnClickListener {
@Override
public void onClick(View v) {
App.getVibrator().vibrate();
if (action == DragButtonAction.center || action == DragButtonAction.end) {
setNextAction();
}
@ -174,10 +174,6 @@ public class DragButtonWizardStep extends WizardFragment {
@Nonnull DragButton dragButton,
@Nonnull PointF startPoint,
@Nonnull MotionEvent motionEvent) {
if (dragDirection == DragDirection.up || dragDirection == DragDirection.down) {
App.getVibrator().vibrate();
}
if (action.dragDirection == dragDirection) {
setNextAction();
return true;

View File

@ -36,13 +36,6 @@
a:summary="@string/c_calc_color_display_summary"
a:title="@string/c_calc_color_display_title" />
<ListPreference
a:entries="@array/cpp_haptic_feedback_names"
a:entryValues="@array/cpp_haptic_feedback_values"
a:key="hapticFeedback"
a:summary="@string/c_calc_haptic_feedback_summary"
a:title="@string/c_calc_haptic_feedback_title" />
<ListPreference
a:entries="@array/p_multiplication_sign_values"
a:entryValues="@array/p_multiplication_sign_values"