Move mStoreToMemoryRequested to CalculatorResult.

Fixes: 33085082

Change-Id: Ifa95eafd1fd94d8efd16a5bdb802385c0f30ea88
diff --git a/src/com/android/calculator2/Calculator.java b/src/com/android/calculator2/Calculator.java
index e22e628..f41d87e 100644
--- a/src/com/android/calculator2/Calculator.java
+++ b/src/com/android/calculator2/Calculator.java
@@ -253,9 +253,6 @@
 
     private HistoryFragment mHistoryFragment = new HistoryFragment();
 
-    // The user requested that the result currently being evaluated should be stored to "memory".
-    private boolean mStoreToMemoryRequested = false;
-
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -769,7 +766,7 @@
                 }
                 return;
             case R.id.memory_store:
-                onMemoryStore();
+                mResultText.onMemoryStore();
                 return;
             case R.id.memory_recall:
                 onMemoryRecall();
@@ -819,10 +816,7 @@
         if (index != Evaluator.MAIN_INDEX) {
             throw new AssertionError("Unexpected evaluation result index\n");
         }
-        if (mStoreToMemoryRequested) {
-            mEvaluator.copyToMemory(Evaluator.MAIN_INDEX);
-            mStoreToMemoryRequested = false;
-        }
+
         // Invalidate any options that may depend on the current result.
         invalidateOptionsMenu();
 
@@ -926,18 +920,6 @@
         redisplayAfterFormulaChange();
     }
 
-    private void onMemoryStore() {
-        if (mCurrentState == CalculatorState.RESULT) {
-            mEvaluator.copyToMemory(Evaluator.MAIN_INDEX);
-        } else {
-            // Defer the store until we have the actual result.
-            mStoreToMemoryRequested = true;
-            if (mCurrentState == CalculatorState.INPUT) {
-                onEquals();
-            }
-        }
-    }
-
     private void onMemoryRecall() {
         clearIfNotInputState();
         long memoryIndex = mEvaluator.getMemoryIndex();
diff --git a/src/com/android/calculator2/CalculatorResult.java b/src/com/android/calculator2/CalculatorResult.java
index c604a6f..e001bee 100644
--- a/src/com/android/calculator2/CalculatorResult.java
+++ b/src/com/android/calculator2/CalculatorResult.java
@@ -142,6 +142,9 @@
     private ActionMode.Callback mCopyActionModeCallback;
     private ContextMenu mContextMenu;
 
+    // The user requested that the result currently being evaluated should be stored to "memory".
+    private boolean mStoreToMemoryRequested = false;
+
     public CalculatorResult(Context context, AttributeSet attrs) {
         super(context, attrs);
         mScroller = new OverScroller(context);
@@ -384,10 +387,29 @@
     public void onEvaluate(long index, int initPrec, int msd, int leastDigPos,
             String truncatedWholePart) {
         initPositions(initPrec, msd, leastDigPos, truncatedWholePart);
+
+        if (mStoreToMemoryRequested) {
+            mEvaluator.copyToMemory(index);
+            mStoreToMemoryRequested = false;
+        }
         redisplay();
     }
 
     /**
+     * Store the result for this index if it is available.
+     * If it is unavailable, set mStoreToMemoryRequested to indicate that we should store
+     * when evaluation is complete.
+     */
+    public void onMemoryStore() {
+        if (mEvaluator.hasResult(mIndex)) {
+            mEvaluator.copyToMemory(mIndex);
+        } else {
+            mStoreToMemoryRequested = true;
+            mEvaluator.requireResult(mIndex, this /* listener */, this /* CharMetricsInfo */);
+        }
+    }
+
+    /**
      * Set up scroll bounds (mMinPos, mMaxPos, etc.) and determine whether the result is
      * scrollable, based on the supplied information about the result.
      * This is unfortunately complicated because we need to predict whether trailing digits
@@ -513,6 +535,7 @@
      */
     @Override
     public void onError(long index, int resourceId) {
+        mStoreToMemoryRequested = false;
         mValid = true;
         setLongClickable(false);
         mScrollable = false;
@@ -818,6 +841,7 @@
     @Override
     public void onCancelled(long index) {
         clear();
+        mStoreToMemoryRequested = false;
     }
 
     /**