Fix strings, stability bug, easy UI & correctness issues

Bug: 20625562
Bug: 20649711
Bug: 20561890
Bug: 20561528
Bug: 20442590
Bug: 15473140
Bug: 20503008
Bug: 20503007

- Improve timeout text.

- Recalculate when Calculator is rotated, e.g. in error state, thus
  reproducing message.  It's unclear this is good enough, but it's
  better.

- Fix square root parsing.

- Fix concatenation of numbers when pasting by adding explicit
  multiplication.

- Display divide by zero error differently from other domain errors.

- Improved advanced keypad layout of portrait-mode tablet calculator.

- Improved overflow menu order.  (More to be done.)

- Report zero division as zero division when we can recognize it.

- Switch to floating menus for copy/paste.

Change-Id: I3875414f293e62a59b0e41f0de822f29bd5ac6a6
diff --git a/src/com/android/calculator2/Calculator.java b/src/com/android/calculator2/Calculator.java
index ed5eb6b..df7c09c 100644
--- a/src/com/android/calculator2/Calculator.java
+++ b/src/com/android/calculator2/Calculator.java
@@ -239,19 +239,18 @@
                     mEvaluator.clear();
                 }
             }
+        } else {
+            mCurrentState = CalculatorState.INPUT;
+            mEvaluator.clear();
         }
         mFormulaText.setOnKeyListener(mFormulaOnKeyListener);
         mFormulaText.setOnTextSizeChangeListener(this);
         mFormulaText.setPasteListener(this);
         mDeleteButton.setOnLongClickListener(this);
         updateDegreeMode(mEvaluator.getDegreeMode());
-        if (mCurrentState == CalculatorState.EVALUATE) {
-            // Odd case.  Evaluation probably took a long time.  Let user ask for it again
-            mCurrentState = CalculatorState.INPUT;
-            // TODO: This can happen if the user rotates the screen.
-            // Is this rotate-to-abort behavior correct?  Revisit after experimentation.
-        }
         if (mCurrentState != CalculatorState.INPUT) {
+            // Just reevaluate.
+            redisplayFormula();
             setState(CalculatorState.INIT);
             mEvaluator.requireResult();
         } else {
@@ -607,19 +606,20 @@
 
     // Evaluation encountered en error.  Display the error.
     void onError(final int errorResourceId) {
-        if (mCurrentState != CalculatorState.EVALUATE) {
-            // Only animate error on evaluate.
-            return;
+        if (mCurrentState == CalculatorState.EVALUATE) {
+            setState(CalculatorState.ANIMATE);
+            reveal(mCurrentButton, R.color.calculator_error_color,
+                    new AnimatorListenerAdapter() {
+                        @Override
+                        public void onAnimationEnd(Animator animation) {
+                           setState(CalculatorState.ERROR);
+                           mResult.displayError(errorResourceId);
+                        }
+                    });
+        } else if (mCurrentState == CalculatorState.INIT) {
+            setState(CalculatorState.ERROR);
+            mResult.displayError(errorResourceId);
         }
-
-        setState(CalculatorState.ANIMATE);
-        reveal(mCurrentButton, R.color.calculator_error_color, new AnimatorListenerAdapter() {
-            @Override
-            public void onAnimationEnd(Animator animation) {
-                setState(CalculatorState.ERROR);
-                mResult.displayError(errorResourceId);
-            }
-        });
     }