summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristine Franks <christyfranks@google.com>2017-01-04 21:00:36 -0800
committerJustin Klaassen <justinklaassen@google.com>2017-01-04 21:01:07 -0800
commitcbc51fac12491ff0650ee16de501ffcc105c7aa9 (patch)
tree968a2083c30980084170677c0bed96cfa5efbdc6
parente95203e0bb7c6ae242ada6f2c443366d50dc79ea (diff)
downloadandroid_packages_apps_ExactCalculator-cbc51fac12491ff0650ee16de501ffcc105c7aa9.tar.gz
android_packages_apps_ExactCalculator-cbc51fac12491ff0650ee16de501ffcc105c7aa9.tar.bz2
android_packages_apps_ExactCalculator-cbc51fac12491ff0650ee16de501ffcc105c7aa9.zip
Changes for testing CalculatorFormula
Bug: 33458518 Test: manual - compiles, and can still enter, calculate, and inflate the context menus on API 21 and 25. Change-Id: Ib5f01e89854248c77cb6484bca46086f34be1ca7
-rw-r--r--src/com/android/calculator2/Calculator.java34
-rw-r--r--src/com/android/calculator2/CalculatorFormula.java20
-rw-r--r--src/com/android/calculator2/Evaluator.java48
-rw-r--r--src/com/android/calculator2/HistoryFragment.java6
4 files changed, 64 insertions, 44 deletions
diff --git a/src/com/android/calculator2/Calculator.java b/src/com/android/calculator2/Calculator.java
index 96bf44d..9af6bc1 100644
--- a/src/com/android/calculator2/Calculator.java
+++ b/src/com/android/calculator2/Calculator.java
@@ -44,6 +44,7 @@ import android.graphics.Rect;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
+import android.support.annotation.StringRes;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.ViewPager;
import android.text.Editable;
@@ -166,7 +167,22 @@ public class Calculator extends Activity
}
};
- public final OnDisplayMemoryOperationsListener mOnDisplayMemoryOperationsListener =
+ private final Evaluator.Callback mEvaluatorCallback = new Evaluator.Callback() {
+ @Override
+ public void onMemoryStateChanged() {
+ mFormulaText.onMemoryStateChanged();
+ }
+
+ @Override
+ public void showMessageDialog(@StringRes int title, @StringRes int message,
+ @StringRes int positiveButtonLabel, String tag) {
+ AlertDialogFragment.showMessageDialog(Calculator.this, title, message,
+ positiveButtonLabel, tag);
+
+ }
+ };
+
+ private final OnDisplayMemoryOperationsListener mOnDisplayMemoryOperationsListener =
new OnDisplayMemoryOperationsListener() {
@Override
public boolean shouldDisplayMemory() {
@@ -174,7 +190,7 @@ public class Calculator extends Activity
}
};
- public final OnFormulaContextMenuClickListener mOnFormulaContextMenuClickListener =
+ private final OnFormulaContextMenuClickListener mOnFormulaContextMenuClickListener =
new OnFormulaContextMenuClickListener() {
@Override
public boolean onPaste(ClipData clip) {
@@ -398,6 +414,7 @@ public class Calculator extends Activity
mResultText = (CalculatorResult) findViewById(R.id.result);
mFormulaContainer = (HorizontalScrollView) findViewById(R.id.formula_container);
mEvaluator = Evaluator.getInstance(this);
+ mEvaluator.setCallback(mEvaluatorCallback);
mResultText.setEvaluator(mEvaluator, Evaluator.MAIN_INDEX);
KeyMaps.setActivity(this);
@@ -950,16 +967,11 @@ public class Calculator extends Activity
}
// Reevaluation completed; ask result to redisplay current value.
- public void onReevaluate(long index)
- {
+ public void onReevaluate(long index) {
// Index is Evaluator.MAIN_INDEX.
mResultText.onReevaluate(index);
}
- public void onMemoryStateChanged() {
- mFormulaText.onMemoryStateChanged();
- }
-
@Override
public void onTextSizeChanged(final TextView textView, float oldSize) {
if (mCurrentState != CalculatorState.INPUT) {
@@ -1253,16 +1265,16 @@ public class Calculator extends Activity
@Override
public void onClick(AlertDialogFragment fragment, int which) {
if (which == DialogInterface.BUTTON_POSITIVE) {
- if (fragment.getTag() == HistoryFragment.CLEAR_DIALOG_TAG) {
+ if (HistoryFragment.CLEAR_DIALOG_TAG.equals(fragment.getTag())) {
// TODO: Try to preserve the current, saved, and memory expressions. How should we
// handle expressions to which they refer?
mEvaluator.clearEverything();
// TODO: It's not clear what we should really do here. This is an initial hack.
// May want to make onClearAnimationEnd() private if/when we fix this.
onClearAnimationEnd();
- onMemoryStateChanged();
+ mEvaluatorCallback.onMemoryStateChanged();
onBackPressed();
- } else if (fragment.getTag() == Evaluator.TIMEOUT_DIALOG_TAG) {
+ } else if (Evaluator.TIMEOUT_DIALOG_TAG.equals(fragment.getTag())) {
// Timeout extension request.
mEvaluator.setLongTimeout();
} else {
diff --git a/src/com/android/calculator2/CalculatorFormula.java b/src/com/android/calculator2/CalculatorFormula.java
index b342792..2911df8 100644
--- a/src/com/android/calculator2/CalculatorFormula.java
+++ b/src/com/android/calculator2/CalculatorFormula.java
@@ -55,9 +55,9 @@ public class CalculatorFormula extends AlignedTextView implements MenuItem.OnMen
private final ClipboardManager mClipboardManager;
private int mWidthConstraint = -1;
- protected ActionMode mActionMode;
+ private ActionMode mActionMode;
private ActionMode.Callback mPasteActionModeCallback;
- protected ContextMenu mContextMenu;
+ private ContextMenu mContextMenu;
private OnTextSizeChangeListener mOnTextSizeChangeListener;
private OnFormulaContextMenuClickListener mOnContextMenuClickListener;
private Calculator.OnDisplayMemoryOperationsListener mOnDisplayMemoryOperationsListener;
@@ -184,20 +184,6 @@ public class CalculatorFormula extends AlignedTextView implements MenuItem.OnMen
return lastFitTextSize;
}
- private static boolean startsWith(CharSequence whole, CharSequence prefix) {
- int wholeLen = whole.length();
- int prefixLen = prefix.length();
- if (prefixLen > wholeLen) {
- return false;
- }
- for (int i = 0; i < prefixLen; ++i) {
- if (prefix.charAt(i) != whole.charAt(i)) {
- return false;
- }
- }
- return true;
- }
-
/**
* Functionally equivalent to setText(), but explicitly announce changes.
* If the new text is an extension of the old one, announce the addition.
@@ -377,7 +363,7 @@ public class CalculatorFormula extends AlignedTextView implements MenuItem.OnMen
}
private boolean isMemoryEnabled() {
- return !(mOnDisplayMemoryOperationsListener == null || mOnContextMenuClickListener == null)
+ return mOnDisplayMemoryOperationsListener != null
&& mOnDisplayMemoryOperationsListener.shouldDisplayMemory();
}
diff --git a/src/com/android/calculator2/Evaluator.java b/src/com/android/calculator2/Evaluator.java
index 604f31a..ab32bc2 100644
--- a/src/com/android/calculator2/Evaluator.java
+++ b/src/com/android/calculator2/Evaluator.java
@@ -16,13 +16,13 @@
package com.android.calculator2;
-import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Handler;
import android.preference.PreferenceManager;
+import android.support.annotation.StringRes;
import android.support.annotation.VisibleForTesting;
import android.text.Spannable;
import android.util.Log;
@@ -100,11 +100,10 @@ public class Evaluator implements CalculatorExpr.ExprResolver {
public static String TIMEOUT_DIALOG_TAG = "timeout";
- public static Evaluator getInstance(Calculator calculator) {
+ public static Evaluator getInstance(Context context) {
if (evaluator == null) {
- evaluator = new Evaluator(calculator.getApplicationContext());
+ evaluator = new Evaluator(context.getApplicationContext());
}
- evaluator.mCalculator = calculator;
return evaluator;
}
@@ -255,7 +254,11 @@ public class Evaluator implements CalculatorExpr.ExprResolver {
// estimating exponent size for truncating short representation.
private static final int EXP_COST = 3;
- private Calculator mCalculator;
+ // Listener that reports changes to the state (empty/filled) of memory. Protected for testing.
+ private Callback mCallback;
+
+ // Context for database helper.
+ private Context mContext;
// A hopefully unique name associated with mSaved.
private String mSavedName;
@@ -270,7 +273,7 @@ public class Evaluator implements CalculatorExpr.ExprResolver {
public static final int INVALID_MSD = Integer.MAX_VALUE;
// Used to represent an erroneous result or a required evaluation. Not displayed.
- public static final String ERRONEOUS_RESULT = "ERR";
+ private static final String ERRONEOUS_RESULT = "ERR";
/**
* An individual CalculatorExpr, together with its evaluation state.
@@ -337,6 +340,7 @@ public class Evaluator implements CalculatorExpr.ExprResolver {
}
Evaluator(Context context) {
+ mContext = context;
setMainExpr(new ExprInfo(new CalculatorExpr(), false));
mSavedName = "none";
mTimeoutHandler = new Handler();
@@ -378,6 +382,14 @@ public class Evaluator implements CalculatorExpr.ExprResolver {
}
/**
+ * Set the Callback for showing dialogs and notifying the UI about memory state changes.
+ * @param callback
+ */
+ public void setCallback(Callback callback) {
+ mCallback = callback;
+ }
+
+ /**
* Result of initial asynchronous result computation.
* Represents either an error or a result computed to an initial evaluation precision.
*/
@@ -407,7 +419,9 @@ public class Evaluator implements CalculatorExpr.ExprResolver {
}
private void displayCancelledMessage() {
- AlertDialogFragment.showMessageDialog(mCalculator, 0, R.string.cancelled, 0, null);
+ if (mCallback != null) {
+ mCallback.showMessageDialog(0, R.string.cancelled, 0, null);
+ }
}
// Timeout handling.
@@ -456,9 +470,10 @@ public class Evaluator implements CalculatorExpr.ExprResolver {
private static final int QUICK_MAX_RESULT_BITS = 150000;
private void displayTimeoutMessage(boolean longTimeout) {
- AlertDialogFragment.showMessageDialog(mCalculator, R.string.dialog_timeout,
- R.string.timeout, longTimeout ? 0 : R.string.ok_remove_timeout,
- TIMEOUT_DIALOG_TAG);
+ if (mCallback != null) {
+ mCallback.showMessageDialog(R.string.dialog_timeout, R.string.timeout,
+ longTimeout ? 0 : R.string.ok_remove_timeout, TIMEOUT_DIALOG_TAG);
+ }
}
public void setLongTimeout() {
@@ -1592,6 +1607,10 @@ public class Evaluator implements CalculatorExpr.ExprResolver {
mSharedPrefs.edit()
.putLong(KEY_PREF_MEMORY_INDEX, index)
.apply();
+
+ if (mCallback != null) {
+ mCallback.onMemoryStateChanged();
+ }
}
/**
@@ -1638,7 +1657,6 @@ public class Evaluator implements CalculatorExpr.ExprResolver {
* The expression at index is presumed to have been evaluated.
*/
public void copyToMemory(long index) {
- mCalculator.onMemoryStateChanged();
setMemoryIndex((index == MAIN_INDEX) ? preserve(false) : index);
}
@@ -1867,7 +1885,7 @@ public class Evaluator implements CalculatorExpr.ExprResolver {
}
public Spannable getExprAsSpannable(long index) {
- return getExpr(index).toSpannableStringBuilder(mCalculator);
+ return getExpr(index).toSpannableStringBuilder(mContext);
}
/**
@@ -1905,4 +1923,10 @@ public class Evaluator implements CalculatorExpr.ExprResolver {
mExprDB.close();
evaluator = null;
}
+
+ public interface Callback {
+ void onMemoryStateChanged();
+ void showMessageDialog(@StringRes int title, @StringRes int message,
+ @StringRes int positiveButtonLabel, String tag);
+ }
}
diff --git a/src/com/android/calculator2/HistoryFragment.java b/src/com/android/calculator2/HistoryFragment.java
index 86ab138..9c9c573 100644
--- a/src/com/android/calculator2/HistoryFragment.java
+++ b/src/com/android/calculator2/HistoryFragment.java
@@ -137,8 +137,8 @@ public class HistoryFragment extends Fragment {
super.onActivityCreated(savedInstanceState);
final Calculator activity = (Calculator) getActivity();
-
- mAdapter.setEvaluator(Evaluator.getInstance(activity));
+ mEvaluator = Evaluator.getInstance(activity);
+ mAdapter.setEvaluator(mEvaluator);
final boolean isResultLayout = activity.isResultLayout();
@@ -146,8 +146,6 @@ public class HistoryFragment extends Fragment {
mDragLayout.removeDragCallback(mDragCallback);
mDragLayout.addDragCallback(mDragCallback);
- mEvaluator = Evaluator.getInstance(activity);
-
if (mEvaluator != null) {
initializeController(isResultLayout);