242 lines
6.9 KiB
Java
242 lines
6.9 KiB
Java
/*
|
|
* 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.content.SharedPreferences;
|
|
import android.support.annotation.NonNull;
|
|
import android.text.TextUtils;
|
|
import com.squareup.otto.Bus;
|
|
import dagger.Lazy;
|
|
import org.solovyev.android.Check;
|
|
import org.solovyev.android.calculator.buttons.CppSpecialButton;
|
|
import org.solovyev.android.calculator.ga.Ga;
|
|
import org.solovyev.android.calculator.math.MathType;
|
|
import org.solovyev.android.calculator.memory.Memory;
|
|
|
|
import javax.annotation.Nonnull;
|
|
import javax.annotation.Nullable;
|
|
import javax.inject.Inject;
|
|
import javax.inject.Singleton;
|
|
|
|
@Singleton
|
|
public class Keyboard implements SharedPreferences.OnSharedPreferenceChangeListener {
|
|
|
|
@Nonnull
|
|
private final MathType.Result mathType = new MathType.Result();
|
|
|
|
@Inject
|
|
Editor editor;
|
|
@Inject
|
|
Display display;
|
|
@Inject
|
|
Lazy<Memory> memory;
|
|
@Inject
|
|
Calculator calculator;
|
|
@Inject
|
|
Engine engine;
|
|
@Inject
|
|
Ga ga;
|
|
@Inject
|
|
Lazy<Clipboard> clipboard;
|
|
@Inject
|
|
Lazy<Bus> bus;
|
|
@Inject
|
|
ActivityLauncher launcher;
|
|
private boolean vibrateOnKeypress;
|
|
|
|
@Inject
|
|
public Keyboard(@Nonnull SharedPreferences preferences) {
|
|
preferences.registerOnSharedPreferenceChangeListener(this);
|
|
vibrateOnKeypress = Preferences.Gui.vibrateOnKeypress.getPreference(preferences);
|
|
}
|
|
|
|
public boolean isVibrateOnKeypress() {
|
|
return vibrateOnKeypress;
|
|
}
|
|
|
|
public boolean buttonPressed(@Nullable final String text) {
|
|
if (TextUtils.isEmpty(text)) {
|
|
return false;
|
|
}
|
|
ga.onButtonPressed(text);
|
|
if (!processSpecialAction(text)) {
|
|
processText(prepareText(text));
|
|
}
|
|
return true;
|
|
}
|
|
|
|
private void processText(@Nonnull String text) {
|
|
int cursorPositionOffset = 0;
|
|
final StringBuilder textToBeInserted = new StringBuilder(text);
|
|
|
|
MathType.getType(text, 0, false, mathType, engine);
|
|
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;
|
|
}
|
|
}
|
|
|
|
editor.insert(textToBeInserted.toString(), cursorPositionOffset);
|
|
}
|
|
|
|
@Nonnull
|
|
private String prepareText(@Nonnull String text) {
|
|
if ("( )".equals(text) || "( )".equals(text)) {
|
|
return "()";
|
|
} else {
|
|
return text;
|
|
}
|
|
}
|
|
|
|
private boolean processSpecialAction(@Nonnull String action) {
|
|
final CppSpecialButton button = CppSpecialButton.getByAction(action);
|
|
if (button == null) {
|
|
return false;
|
|
}
|
|
onSpecialButtonPressed(button);
|
|
return true;
|
|
}
|
|
|
|
private void onSpecialButtonPressed(@NonNull CppSpecialButton button) {
|
|
switch (button) {
|
|
case history:
|
|
launcher.showHistory();
|
|
break;
|
|
case cursor_right:
|
|
moveCursorRight();
|
|
break;
|
|
case cursor_left:
|
|
moveCursorLeft();
|
|
break;
|
|
case settings:
|
|
launcher.showSettings();
|
|
break;
|
|
case settings_widget:
|
|
launcher.showWidgetSettings();
|
|
break;
|
|
case like:
|
|
launcher.openFacebook();
|
|
break;
|
|
case memory:
|
|
memory.get().requestValue();
|
|
break;
|
|
case erase:
|
|
editor.erase();
|
|
break;
|
|
case paste:
|
|
pasteButtonPressed();
|
|
break;
|
|
case copy:
|
|
copyButtonPressed();
|
|
break;
|
|
case equals:
|
|
equalsButtonPressed();
|
|
break;
|
|
case clear:
|
|
clearButtonPressed();
|
|
break;
|
|
case functions:
|
|
launcher.showFunctions();
|
|
break;
|
|
case open_app:
|
|
launcher.openApp();
|
|
break;
|
|
case vars:
|
|
launcher.showVariables();
|
|
break;
|
|
case operators:
|
|
launcher.showOperators();
|
|
break;
|
|
default:
|
|
Check.shouldNotHappen();
|
|
}
|
|
}
|
|
|
|
private void equalsButtonPressed() {
|
|
if (!calculator.isCalculateOnFly()) {
|
|
// no automatic calculations are => equals button must be used to calculate
|
|
calculator.evaluate();
|
|
return;
|
|
}
|
|
|
|
final DisplayState state = display.getState();
|
|
if (!state.valid) {
|
|
return;
|
|
}
|
|
editor.setText(state.text);
|
|
}
|
|
|
|
public void roundBracketsButtonPressed() {
|
|
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 = clipboard.get().getText();
|
|
if (!TextUtils.isEmpty(text)) {
|
|
editor.insert(text);
|
|
}
|
|
}
|
|
|
|
public void clearButtonPressed() {
|
|
editor.clear();
|
|
}
|
|
|
|
public void copyButtonPressed() {
|
|
bus.get().post(new Display.CopyOperation());
|
|
}
|
|
|
|
public void moveCursorLeft() {
|
|
editor.moveCursorLeft();
|
|
}
|
|
|
|
public void moveCursorRight() {
|
|
editor.moveCursorRight();
|
|
}
|
|
|
|
@Override
|
|
public void onSharedPreferenceChanged(SharedPreferences preferences, String key) {
|
|
if (Preferences.Gui.vibrateOnKeypress.isSameKey(key)) {
|
|
vibrateOnKeypress = Preferences.Gui.vibrateOnKeypress.getPreference(preferences);
|
|
}
|
|
}
|
|
}
|