Categories removed

This commit is contained in:
serso 2016-01-23 21:13:56 +01:00
parent 18b7ac83c1
commit 0b5bc2b621
26 changed files with 204 additions and 389 deletions

View File

@ -34,13 +34,12 @@ import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.app.AppCompatActivity;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import org.solovyev.android.Activities;
import org.solovyev.android.Check;
import org.solovyev.android.Views;
import org.solovyev.android.calculator.language.Language;
import org.solovyev.android.calculator.language.Languages;
@ -227,6 +226,7 @@ public class ActivityUi extends BaseUi {
int captionResId,
int parentViewId) {
final ActionBar actionBar = activity.getSupportActionBar();
Check.isNotNull(actionBar);
final ActionBar.Tab tab = actionBar.newTab();
tab.setTag(tag);

View File

@ -1,61 +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 javax.annotation.Nonnull;
import javax.annotation.Nullable;
/**
* User: serso
* Date: 10/7/12
* Time: 7:17 PM
*/
public enum AndroidFunctionCategory {
trigonometric(R.string.c_fun_category_trig),
hyperbolic_trigonometric(R.string.c_fun_category_hyper_trig),
comparison(R.string.c_fun_category_comparison),
my(R.string.c_fun_category_my),
common(R.string.c_fun_category_common);
private final int captionId;
AndroidFunctionCategory(int captionId) {
this.captionId = captionId;
}
@Nullable
public static AndroidFunctionCategory valueOf(@Nonnull FunctionCategory functionCategory) {
for (AndroidFunctionCategory androidFunctionCategory : values()) {
if (androidFunctionCategory.name().equals(functionCategory.name())) {
return androidFunctionCategory;
}
}
return null;
}
public int getCaptionId() {
return captionId;
}
}

View File

@ -1,60 +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 javax.annotation.Nonnull;
import javax.annotation.Nullable;
/**
* User: serso
* Date: 10/7/12
* Time: 7:41 PM
*/
public enum AndroidOperatorCategory {
derivatives(R.string.derivatives),
other(R.string.other),
my(R.string.c_fun_category_my),
common(R.string.c_fun_category_common);
private final int captionId;
AndroidOperatorCategory(int captionId) {
this.captionId = captionId;
}
@Nullable
public static AndroidOperatorCategory valueOf(@Nonnull OperatorCategory operatorCategory) {
for (AndroidOperatorCategory androidOperatorCategory : values()) {
if (androidOperatorCategory.name().equals(operatorCategory.name())) {
return androidOperatorCategory;
}
}
return null;
}
public int getCaptionId() {
return captionId;
}
}

View File

@ -1,58 +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 javax.annotation.Nonnull;
import javax.annotation.Nullable;
/**
* User: serso
* Date: 10/7/12
* Time: 7:56 PM
*/
public enum AndroidVarCategory {
system(R.string.c_var_system),
my(R.string.c_var_my);
private final int captionId;
AndroidVarCategory(int captionId) {
this.captionId = captionId;
}
@Nullable
public static AndroidVarCategory valueOf(@Nonnull VarCategory varCategory) {
for (AndroidVarCategory androidVarCategory : values()) {
if (androidVarCategory.name().equals(varCategory.name())) {
return androidVarCategory;
}
}
return null;
}
public int getCaptionId() {
return captionId;
}
}

View File

@ -0,0 +1,16 @@
package org.solovyev.android.calculator;
import android.support.annotation.StringRes;
import javax.annotation.Nonnull;
public interface Category {
int ordinal();
@Nonnull
String name();
@StringRes
int title();
}

View File

@ -28,27 +28,18 @@ import android.os.Build;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.util.Log;
import android.view.ContextMenu;
import android.widget.EditText;
import org.solovyev.android.Check;
import org.solovyev.android.calculator.onscreen.CalculatorOnscreenService;
import java.lang.reflect.Method;
import org.solovyev.android.calculator.view.EditTextCompat;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
public class EditorView extends EditText {
@Nonnull
private static final String TAG = App.subTag("EditorView");
public class EditorView extends EditTextCompat {
private boolean reportChanges;
@Nullable
private Method setShowSoftInputOnFocusMethod;
@Nullable
private Editor editor;
public EditorView(Context context) {
@ -123,28 +114,6 @@ public class EditorView extends EditText {
editor.setSelection(start);
}
public void setShowSoftInputOnFocusCompat(boolean show) {
Check.isMainThread();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
setShowSoftInputOnFocus(show);
} else {
setShowSoftInputOnFocusPreLollipop(show);
}
}
private void setShowSoftInputOnFocusPreLollipop(boolean show) {
try {
if (setShowSoftInputOnFocusMethod == null) {
setShowSoftInputOnFocusMethod = EditText.class.getMethod("setShowSoftInputOnFocus", boolean.class);
setShowSoftInputOnFocusMethod.setAccessible(true);
}
setShowSoftInputOnFocusMethod.invoke(this, show);
} catch (Exception e) {
Log.w(TAG, e.getMessage(), e);
}
}
private class MyTextWatcher implements TextWatcher {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {

View File

@ -23,9 +23,12 @@
package org.solovyev.android.calculator;
import android.content.SharedPreferences;
import com.squareup.otto.Bus;
import jscl.AngleUnit;
import jscl.JsclMathEngine;
import jscl.MathEngine;
import jscl.NumeralBase;
import jscl.math.operator.Operator;
import org.solovyev.android.Check;
import org.solovyev.android.calculator.model.EntityDao;
import org.solovyev.android.calculator.model.Vars;
@ -37,29 +40,21 @@ import org.solovyev.common.text.EnumMapper;
import org.solovyev.common.text.NumberMapper;
import org.solovyev.common.text.Strings;
import javax.annotation.Nonnull;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.Executor;
import javax.annotation.Nonnull;
import javax.inject.Inject;
import javax.inject.Singleton;
import jscl.AngleUnit;
import jscl.JsclMathEngine;
import jscl.MathEngine;
import jscl.NumeralBase;
import jscl.math.function.IConstant;
import jscl.math.operator.Operator;
@Singleton
public class Engine implements SharedPreferences.OnSharedPreferenceChangeListener {
@Nonnull
private final MathEngine mathEngine;
@Nonnull
private final EntitiesRegistry<IConstant> varsRegistry;
private final VarsRegistry varsRegistry;
@Nonnull
private final EntitiesRegistry<Operator> operatorsRegistry;
@ -76,7 +71,7 @@ public class Engine implements SharedPreferences.OnSharedPreferenceChangeListene
@Nonnull
private String multiplicationSign = Preferences.multiplicationSign.getDefaultValue();
public Engine(@Nonnull MathEngine mathEngine, @Nonnull EntitiesRegistry<IConstant> varsRegistry, @Nonnull FunctionsRegistry functionsRegistry, @Nonnull EntitiesRegistry<Operator> operatorsRegistry, @Nonnull EntitiesRegistry<Operator> postfixFunctionsRegistry) {
public Engine(@Nonnull MathEngine mathEngine, @Nonnull VarsRegistry varsRegistry, @Nonnull FunctionsRegistry functionsRegistry, @Nonnull EntitiesRegistry<Operator> operatorsRegistry, @Nonnull EntitiesRegistry<Operator> postfixFunctionsRegistry) {
this.mathEngine = mathEngine;
this.varsRegistry = varsRegistry;
this.functionsRegistry = functionsRegistry;
@ -111,7 +106,7 @@ public class Engine implements SharedPreferences.OnSharedPreferenceChangeListene
}
@Nonnull
public EntitiesRegistry<IConstant> getVarsRegistry() {
public VarsRegistry getVarsRegistry() {
return varsRegistry;
}

View File

@ -34,7 +34,7 @@ public interface EntitiesRegistry<E extends MathEntity> extends MathRegistry<E>
String getDescription(@Nonnull String name);
@Nullable
String getCategory(@Nonnull E entity);
Category getCategory(@Nonnull E entity);
void init();

View File

@ -22,6 +22,7 @@
package org.solovyev.android.calculator;
import android.support.annotation.StringRes;
import jscl.math.function.ArcTrigonometric;
import jscl.math.function.Comparison;
import jscl.math.function.Function;
@ -31,21 +32,16 @@ import org.solovyev.common.collections.Collections;
import javax.annotation.Nonnull;
import java.util.*;
/**
* User: serso
* Date: 10/7/12
* Time: 7:15 PM
*/
public enum FunctionCategory {
public enum FunctionCategory implements Category {
trigonometric(100) {
trigonometric(100, R.string.c_fun_category_trig) {
@Override
public boolean isInCategory(@Nonnull Function function) {
return (function instanceof Trigonometric || function instanceof ArcTrigonometric) && !hyperbolic_trigonometric.isInCategory(function);
}
},
hyperbolic_trigonometric(300) {
hyperbolic_trigonometric(300, R.string.c_fun_category_hyper_trig) {
private final Set<String> names = new HashSet<>(Arrays.asList("sinh", "cosh", "tanh", "coth", "asinh", "acosh", "atanh", "acoth"));
@ -55,21 +51,21 @@ public enum FunctionCategory {
}
},
comparison(200) {
comparison(200, R.string.c_fun_category_comparison) {
@Override
public boolean isInCategory(@Nonnull Function function) {
return function instanceof Comparison;
}
},
my(0) {
my(0, R.string.c_fun_category_my) {
@Override
public boolean isInCategory(@Nonnull Function function) {
return !function.isSystem();
}
},
common(50) {
common(50, R.string.c_fun_category_common) {
@Override
public boolean isInCategory(@Nonnull Function function) {
for (FunctionCategory category : values()) {
@ -84,10 +80,12 @@ public enum FunctionCategory {
}
};
private final int tabOrder;
public final int tabOrder;
public final int title;
FunctionCategory(int tabOrder) {
FunctionCategory(int tabOrder, @StringRes int title) {
this.tabOrder = tabOrder;
this.title = title;
}
@Nonnull
@ -104,5 +102,10 @@ public enum FunctionCategory {
return result;
}
@Override
public int title() {
return title;
}
public abstract boolean isInCategory(@Nonnull Function function);
}

View File

@ -26,9 +26,10 @@ import android.app.Application;
import android.content.SharedPreferences;
import android.os.Handler;
import android.support.annotation.NonNull;
import com.squareup.otto.Bus;
import jscl.JsclMathEngine;
import jscl.math.function.CustomFunction;
import jscl.math.function.Function;
import org.json.JSONArray;
import org.json.JSONException;
import org.simpleframework.xml.Serializer;
@ -42,25 +43,15 @@ import org.solovyev.android.io.FileSaver;
import org.solovyev.common.JBuilder;
import org.solovyev.common.text.Strings;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executor;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;
import jscl.JsclMathEngine;
import jscl.math.function.CustomFunction;
import jscl.math.function.Function;
import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.Executor;
import static android.text.TextUtils.isEmpty;
@ -186,10 +177,10 @@ public class FunctionsRegistry extends BaseEntitiesRegistry<Function, OldFunctio
}
@Override
public String getCategory(@Nonnull Function function) {
public Category getCategory(@Nonnull Function function) {
for (FunctionCategory category : FunctionCategory.values()) {
if (category.isInCategory(function)) {
return category.name();
return category;
}
}

View File

@ -28,8 +28,7 @@ public class KeyboardWindow {
private static void hideIme(@NonNull View view) {
final IBinder token = view.getWindowToken();
if (token != null) {
InputMethodManager imm = (InputMethodManager) view.getContext().getSystemService(
Context.INPUT_METHOD_SERVICE);
InputMethodManager imm = (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(token, 0);
}
}
@ -45,12 +44,13 @@ public class KeyboardWindow {
}
public void show(@NonNull KeyboardUi.User user, @Nullable Dialog dialog, @NonNull List<String> parameterNames) {
final EditText editor = user.getEditor();
if (isShown()) {
hideIme(editor);
return;
}
this.dialog = dialog;
moveDialog(Gravity.TOP);
final EditText editor = user.getEditor();
hideIme(editor);
final Context context = editor.getContext();
final LinearLayout view = new LinearLayout(context);

View File

@ -22,49 +22,38 @@
package org.solovyev.android.calculator;
import android.support.annotation.StringRes;
import jscl.math.operator.*;
import org.solovyev.common.collections.Collections;
import javax.annotation.Nonnull;
import java.util.Comparator;
import java.util.List;
import javax.annotation.Nonnull;
public enum OperatorCategory implements Category {
import jscl.math.operator.Derivative;
import jscl.math.operator.IndefiniteIntegral;
import jscl.math.operator.Integral;
import jscl.math.operator.Operator;
import jscl.math.operator.Product;
import jscl.math.operator.Sum;
/**
* User: serso
* Date: 10/7/12
* Time: 7:40 PM
*/
public enum OperatorCategory {
derivatives(100) {
derivatives(100, R.string.derivatives) {
@Override
public boolean isInCategory(@Nonnull Operator operator) {
return operator instanceof Derivative || operator instanceof Integral || operator instanceof IndefiniteIntegral;
}
},
other(200) {
other(200, R.string.other) {
@Override
public boolean isInCategory(@Nonnull Operator operator) {
return operator instanceof Sum || operator instanceof Product;
}
},
my(0) {
my(0, R.string.c_fun_category_my) {
@Override
public boolean isInCategory(@Nonnull Operator operator) {
return !operator.isSystem();
}
},
common(50) {
common(50, R.string.c_fun_category_common) {
@Override
public boolean isInCategory(@Nonnull Operator operator) {
for (OperatorCategory category : values()) {
@ -80,9 +69,12 @@ public enum OperatorCategory {
};
private final int tabOrder;
@StringRes
private final int title;
OperatorCategory(int tabOrder) {
OperatorCategory(int tabOrder, @StringRes int title) {
this.tabOrder = tabOrder;
this.title = title;
}
@Nonnull
@ -102,5 +94,12 @@ public enum OperatorCategory {
return result;
}
public abstract boolean isInCategory(@Nonnull Operator operator);
@Override
public int title() {
return title;
}
}

View File

@ -57,10 +57,10 @@ public class OperatorsRegistry extends BaseEntitiesRegistry<Operator, PersistedE
}
@Override
public String getCategory(@Nonnull Operator operator) {
public Category getCategory(@Nonnull Operator operator) {
for (OperatorCategory category : OperatorCategory.values()) {
if (category.isInCategory(operator)) {
return category.name();
return category;
}
}
return null;

View File

@ -55,10 +55,10 @@ public class PostfixFunctionsRegistry extends BaseEntitiesRegistry<Operator, Per
}
@Override
public String getCategory(@Nonnull Operator operator) {
public Category getCategory(@Nonnull Operator operator) {
for (OperatorCategory category : OperatorCategory.values()) {
if (category.isInCategory(operator)) {
return category.name();
return category;
}
}
return null;

View File

@ -22,30 +22,24 @@
package org.solovyev.android.calculator;
import android.support.annotation.StringRes;
import jscl.math.function.IConstant;
import org.solovyev.common.collections.Collections;
import javax.annotation.Nonnull;
import java.util.Comparator;
import java.util.List;
import javax.annotation.Nonnull;
public enum VarCategory implements Category {
import jscl.math.function.IConstant;
/**
* User: serso
* Date: 12/22/11
* Time: 4:25 PM
*/
public enum VarCategory {
system(100) {
system(100, R.string.c_var_system) {
@Override
public boolean isInCategory(@Nonnull IConstant var) {
return var.isSystem();
}
},
my(0) {
my(0, R.string.c_var_my) {
@Override
public boolean isInCategory(@Nonnull IConstant var) {
return !var.isSystem();
@ -53,9 +47,12 @@ public enum VarCategory {
};
private final int tabOrder;
@StringRes
private final int title;
VarCategory(int tabOrder) {
VarCategory(int tabOrder, @StringRes int title) {
this.tabOrder = tabOrder;
this.title = title;
}
@Nonnull
@ -73,4 +70,10 @@ public enum VarCategory {
}
public abstract boolean isInCategory(@Nonnull IConstant var);
@Override
public int title() {
return title;
}
}

View File

@ -129,10 +129,10 @@ public class VarsRegistry extends BaseEntitiesRegistry<IConstant, Var> {
}
@Override
public String getCategory(@Nonnull IConstant var) {
public Category getCategory(@Nonnull IConstant var) {
for (VarCategory category : VarCategory.values()) {
if (category.isInCategory(var)) {
return category.name();
return category;
}
}

View File

@ -44,12 +44,12 @@ import butterknife.Bind;
import butterknife.ButterKnife;
import jscl.math.function.CustomFunction;
import jscl.math.function.Function;
import jscl.math.function.IConstant;
import org.solovyev.android.Check;
import org.solovyev.android.calculator.*;
import org.solovyev.android.calculator.math.edit.CalculatorFunctionsActivity;
import org.solovyev.android.calculator.math.edit.FunctionsFragment;
import org.solovyev.android.calculator.math.edit.VarEditorSaver;
import org.solovyev.android.calculator.view.EditTextCompat;
import org.solovyev.common.math.MathRegistry;
import javax.annotation.Nonnull;
@ -67,9 +67,7 @@ public class EditFunctionFragment extends BaseDialogFragment implements View.OnC
private static final int MENU_CATEGORY = Menu.FIRST + 2;
@NonNull
private final MathRegistry<Function> functionsRegistry = Locator.getInstance().getEngine().getFunctionsRegistry();
@NonNull
private final MathRegistry<IConstant> constantsRegistry = Locator.getInstance().getEngine().getVarsRegistry();
private final VarsRegistry constantsRegistry = Locator.getInstance().getEngine().getVarsRegistry();
@NonNull
private final KeyboardWindow keyboardWindow = new KeyboardWindow();
@NonNull
@ -83,13 +81,13 @@ public class EditFunctionFragment extends BaseDialogFragment implements View.OnC
@Bind(R.id.function_body_label)
TextInputLayout bodyLabel;
@Bind(R.id.function_body)
EditText bodyView;
EditTextCompat bodyView;
@Bind(R.id.function_description)
EditText descriptionView;
@Inject
Calculator calculator;
@Inject
FunctionsRegistry registry;
FunctionsRegistry functionsRegistry;
@Nullable
private CppFunction function;
@ -175,6 +173,7 @@ public class EditFunctionFragment extends BaseDialogFragment implements View.OnC
}
});
if (!isNewFunction()) {
Check.isNotNull(function);
final Button neutral = dialog.getButton(AlertDialog.BUTTON_NEUTRAL);
neutral.setOnClickListener(new View.OnClickListener() {
@Override
@ -191,7 +190,7 @@ public class EditFunctionFragment extends BaseDialogFragment implements View.OnC
return;
}
final CustomFunction entity = function.toCustomFunctionBuilder().create();
registry.remove(entity);
functionsRegistry.remove(entity);
calculator.fireCalculatorEvent(CalculatorEventType.function_removed, entity, this);
dismiss();
}
@ -293,8 +292,8 @@ public class EditFunctionFragment extends BaseDialogFragment implements View.OnC
.withId(isNewFunction() ? NO_ID : function.id)
.withParameters(collectParameters())
.withDescription(descriptionView.getText().toString()).build();
final Function oldFunction = isNewFunction() ? null : registry.getById(function.id);
registry.add(newFunction.toCustomFunctionBuilder(), oldFunction);
final Function oldFunction = isNewFunction() ? null : functionsRegistry.getById(function.id);
functionsRegistry.add(newFunction.toCustomFunctionBuilder(), oldFunction);
return true;
} catch (RuntimeException e) {
setError(bodyLabel, e.getLocalizedMessage());
@ -312,7 +311,7 @@ public class EditFunctionFragment extends BaseDialogFragment implements View.OnC
setError(nameLabel, getString(R.string.function_name_is_not_valid));
return false;
}
final Function existingFunction = registry.get(name);
final Function existingFunction = functionsRegistry.get(name);
if (existingFunction != null) {
if (!existingFunction.isIdDefined()) {
Check.shouldNotHappen();
@ -385,6 +384,7 @@ public class EditFunctionFragment extends BaseDialogFragment implements View.OnC
bodyView.setOnClickListener(this);
bodyView.setOnFocusChangeListener(this);
bodyView.setOnKeyListener(this);
bodyView.setShowSoftInputOnFocusCompat(false);
descriptionView.setOnFocusChangeListener(this);
return view;
@ -564,9 +564,10 @@ public class EditFunctionFragment extends BaseDialogFragment implements View.OnC
bodyView.post(new Runnable() {
@Override
public void run() {
if (item.getItemId() == MENU_FUNCTION) {
final int itemId = item.getItemId();
if (itemId == MENU_FUNCTION) {
showFunctions(bodyView);
} else {
} else if (itemId == MENU_CONSTANT) {
showConstants(bodyView);
}
}

View File

@ -31,34 +31,27 @@ import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.ClipboardManager;
import android.text.TextUtils;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.*;
import android.widget.TextView;
import butterknife.Bind;
import butterknife.ButterKnife;
import com.melnykov.fab.FloatingActionButton;
import org.solovyev.android.Check;
import org.solovyev.android.calculator.BaseFragment;
import org.solovyev.android.calculator.CalculatorFragmentType;
import org.solovyev.android.calculator.Category;
import org.solovyev.android.calculator.R;
import org.solovyev.android.views.llm.DividerItemDecoration;
import org.solovyev.common.math.MathEntity;
import org.solovyev.common.text.Strings;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import butterknife.Bind;
import butterknife.ButterKnife;
public abstract class BaseEntitiesFragment<E extends MathEntity> extends BaseFragment {
@ -140,14 +133,18 @@ public abstract class BaseEntitiesFragment<E extends MathEntity> extends BaseFra
}
private boolean isInCategory(@NonNull E entity, @NonNull String category) {
return TextUtils.equals(getCategory(entity), category);
final Category entityCategory = getCategory(entity);
if (entityCategory == null) {
return false;
}
return TextUtils.equals(entityCategory.name(), category);
}
@Nonnull
protected abstract List<E> getEntities();
@Nullable
abstract String getCategory(@Nonnull E e);
abstract Category getCategory(@Nonnull E e);
protected EntitiesAdapter getAdapter() {
return adapter;

View File

@ -23,9 +23,6 @@
package org.solovyev.android.calculator.math.edit;
import android.os.Bundle;
import android.util.Log;
import org.solovyev.android.calculator.AndroidFunctionCategory;
import org.solovyev.android.calculator.BaseActivity;
import org.solovyev.android.calculator.CalculatorFragmentType;
import org.solovyev.android.calculator.FunctionCategory;
@ -48,22 +45,16 @@ public class CalculatorFunctionsActivity extends BaseActivity {
final CalculatorFragmentType fragmentType = CalculatorFragmentType.functions;
for (FunctionCategory category : FunctionCategory.getCategoriesByTabOrder()) {
final AndroidFunctionCategory androidCategory = AndroidFunctionCategory.valueOf(category);
if (androidCategory != null) {
final Bundle fragmentParameters;
final Bundle fragmentParameters;
if (category == FunctionCategory.my && bundle != null) {
BaseEntitiesFragment.putCategory(bundle, category.name());
fragmentParameters = bundle;
} else {
fragmentParameters = BaseEntitiesFragment.createBundleFor(category.name());
}
ui.addTab(this, fragmentType.createSubFragmentTag(category.name()), fragmentType.getFragmentClass(), fragmentParameters, androidCategory.getCaptionId(), R.id.main_layout);
if (category == FunctionCategory.my && bundle != null) {
BaseEntitiesFragment.putCategory(bundle, category.name());
fragmentParameters = bundle;
} else {
Log.e(CalculatorFunctionsActivity.class.getSimpleName(), "Unable to find android function category for " + category);
fragmentParameters = BaseEntitiesFragment.createBundleFor(category.name());
}
ui.addTab(this, fragmentType.createSubFragmentTag(category.name()), fragmentType.getFragmentClass(), fragmentParameters, category.title, R.id.main_layout);
}
}
}

View File

@ -24,7 +24,6 @@ package org.solovyev.android.calculator.math.edit;
import android.os.Bundle;
import org.solovyev.android.calculator.AndroidOperatorCategory;
import org.solovyev.android.calculator.BaseActivity;
import org.solovyev.android.calculator.CalculatorEventData;
import org.solovyev.android.calculator.CalculatorEventListener;
@ -49,12 +48,7 @@ public class CalculatorOperatorsActivity extends BaseActivity implements Calcula
final CalculatorFragmentType fragmentType = CalculatorFragmentType.operators;
for (OperatorCategory category : OperatorCategory.getCategoriesByTabOrder()) {
final AndroidOperatorCategory androidCategory = AndroidOperatorCategory.valueOf(category);
if (androidCategory != null) {
ui.addTab(this, fragmentType.createSubFragmentTag(category.name()), fragmentType.getFragmentClass(), BaseEntitiesFragment.createBundleFor(category.name()), androidCategory.getCaptionId(), R.id.main_layout);
} else {
ui.logError("Unable to find android operator category for " + category);
}
ui.addTab(this, fragmentType.createSubFragmentTag(category.name()), fragmentType.getFragmentClass(), BaseEntitiesFragment.createBundleFor(category.name()), category.title(), R.id.main_layout);
}
}

View File

@ -25,7 +25,6 @@ package org.solovyev.android.calculator.math.edit;
import android.content.Intent;
import android.os.Bundle;
import org.solovyev.android.calculator.AndroidVarCategory;
import org.solovyev.android.calculator.BaseActivity;
import org.solovyev.android.calculator.CalculatorEventData;
import org.solovyev.android.calculator.CalculatorEventListener;
@ -68,15 +67,7 @@ public class CalculatorVarsActivity extends BaseActivity implements CalculatorEv
} else {
fragmentParameters = BaseEntitiesFragment.createBundleFor(category.name());
}
final AndroidVarCategory androidVarCategory = AndroidVarCategory.valueOf(category);
if (androidVarCategory != null) {
ui.addTab(this, fragmentType.createSubFragmentTag(category.name()), fragmentType.getFragmentClass(), fragmentParameters, androidVarCategory.getCaptionId(), R.id.main_layout);
} else {
ui.logError("Unable to find android var category for " + category);
}
ui.addTab(this, fragmentType.createSubFragmentTag(category.name()), fragmentType.getFragmentClass(), fragmentParameters, category.title(), R.id.main_layout);
}
}

View File

@ -34,13 +34,7 @@ import android.view.ViewGroup;
import com.squareup.otto.Bus;
import com.squareup.otto.Subscribe;
import org.solovyev.android.calculator.AppComponent;
import org.solovyev.android.calculator.Calculator;
import org.solovyev.android.calculator.CalculatorFragmentType;
import org.solovyev.android.calculator.EntitiesRegistry;
import org.solovyev.android.calculator.FunctionsRegistry;
import org.solovyev.android.calculator.Keyboard;
import org.solovyev.android.calculator.R;
import org.solovyev.android.calculator.*;
import org.solovyev.android.calculator.function.CppFunction;
import org.solovyev.android.calculator.function.EditFunctionFragment;
import org.solovyev.common.text.Strings;
@ -165,7 +159,7 @@ public class FunctionsFragment extends BaseEntitiesFragment<Function> {
}
@Override
protected String getCategory(@Nonnull Function function) {
protected Category getCategory(@Nonnull Function function) {
return registry.getCategory(function);
}

View File

@ -23,24 +23,16 @@
package org.solovyev.android.calculator.math.edit;
import android.support.annotation.NonNull;
import android.text.TextUtils;
import android.view.ContextMenu;
import android.view.MenuItem;
import org.solovyev.android.calculator.CalculatorEventType;
import org.solovyev.android.calculator.CalculatorFragmentType;
import org.solovyev.android.calculator.EntitiesRegistry;
import org.solovyev.android.calculator.Locator;
import org.solovyev.android.calculator.R;
import jscl.math.operator.Operator;
import org.solovyev.android.calculator.*;
import org.solovyev.common.text.Strings;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import jscl.math.operator.Operator;
import java.util.ArrayList;
import java.util.List;
public class OperatorsFragment extends BaseEntitiesFragment<Operator> {
@ -70,9 +62,9 @@ public class OperatorsFragment extends BaseEntitiesFragment<Operator> {
}
@Override
protected String getCategory(@Nonnull Operator operator) {
final String result = operatorsRegistry.getCategory(operator);
if (!TextUtils.isEmpty(result)) {
protected Category getCategory(@Nonnull Operator operator) {
final Category result = operatorsRegistry.getCategory(operator);
if (result != null) {
return result;
}
return postfixFunctionsRegistry.getCategory(operator);

View File

@ -120,7 +120,7 @@ public class VarsFragment extends BaseEntitiesFragment<IConstant>implements Calc
}
@Override
protected String getCategory(@Nonnull IConstant var) {
protected Category getCategory(@Nonnull IConstant var) {
return registry.getCategory(var);
}

View File

@ -0,0 +1,57 @@
package org.solovyev.android.calculator.view;
import android.annotation.TargetApi;
import android.content.Context;
import android.os.Build;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.EditText;
import org.solovyev.android.Check;
import javax.annotation.Nullable;
import java.lang.reflect.Method;
public class EditTextCompat extends EditText {
@Nullable
private Method setShowSoftInputOnFocusMethod;
public EditTextCompat(Context context) {
super(context);
}
public EditTextCompat(Context context, AttributeSet attrs) {
super(context, attrs);
}
public EditTextCompat(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public EditTextCompat(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
public void setShowSoftInputOnFocusCompat(boolean show) {
Check.isMainThread();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
setShowSoftInputOnFocus(show);
} else {
setShowSoftInputOnFocusPreLollipop(show);
}
}
private void setShowSoftInputOnFocusPreLollipop(boolean show) {
try {
if (setShowSoftInputOnFocusMethod == null) {
setShowSoftInputOnFocusMethod = EditText.class.getMethod("setShowSoftInputOnFocus", boolean.class);
setShowSoftInputOnFocusMethod.setAccessible(true);
}
setShowSoftInputOnFocusMethod.invoke(this, show);
} catch (Exception e) {
Log.w("EditTextCompat", e.getMessage(), e);
}
}
}

View File

@ -55,11 +55,12 @@
a:layout_width="match_parent"
a:layout_height="wrap_content">
<EditText
<org.solovyev.android.calculator.view.EditTextCompat
a:id="@+id/function_body"
a:layout_width="match_parent"
a:layout_height="wrap_content"
a:hint="@string/c_function_value"
a:imeOptions="flagNoExtractUi"
a:inputType="text" />
</android.support.design.widget.TextInputLayout>