diff options
author | Christine Franks <christyfranks@google.com> | 2017-01-04 21:00:36 -0800 |
---|---|---|
committer | Justin Klaassen <justinklaassen@google.com> | 2017-01-04 21:01:07 -0800 |
commit | cbc51fac12491ff0650ee16de501ffcc105c7aa9 (patch) | |
tree | 968a2083c30980084170677c0bed96cfa5efbdc6 | |
parent | e95203e0bb7c6ae242ada6f2c443366d50dc79ea (diff) | |
download | android_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.java | 34 | ||||
-rw-r--r-- | src/com/android/calculator2/CalculatorFormula.java | 20 | ||||
-rw-r--r-- | src/com/android/calculator2/Evaluator.java | 48 | ||||
-rw-r--r-- | src/com/android/calculator2/HistoryFragment.java | 6 |
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); |