Refuse to open history if in ANIMATE state.

-Hopefully addresses the failing assertion in isResultLayout
without any further defensive fixes.

Bug: 34711428
Bug: 35316164
Bug: 79182188
Test: Swipe down history while an error evaluation is in progress.
No longer crashes.

Change-Id: I7e924deb13c9cc4ca2487224d59d86a046ca019b
(cherry picked from b5cfb17556050d977d2f9aedba29923cff44aa32)
diff --git a/src/com/android/calculator2/Calculator.java b/src/com/android/calculator2/Calculator.java
index 392447c..81ab1f6 100644
--- a/src/com/android/calculator2/Calculator.java
+++ b/src/com/android/calculator2/Calculator.java
@@ -535,9 +535,6 @@
     }
 
     public boolean isResultLayout() {
-        if (mCurrentState == CalculatorState.ANIMATE) {
-            throw new AssertionError("impossible state");
-        }
         // Note that ERROR has INPUT, not RESULT layout.
         return mCurrentState == CalculatorState.INIT_FOR_RESULT
                 || mCurrentState == CalculatorState.RESULT;
@@ -1339,7 +1336,14 @@
      */
     private boolean prepareForHistory() {
         if (mCurrentState == CalculatorState.ANIMATE) {
-            throw new AssertionError("onUserInteraction should have ended animation");
+            // End the current animation and signal that preparation has failed.
+            // onUserInteraction is unreliable and onAnimationEnd() is asynchronous, so we
+            // aren't guaranteed to be out of the ANIMATE state by the time prepareForHistory is
+            // called.
+            if (mCurrentAnimator != null) {
+                mCurrentAnimator.end();
+            }
+            return false;
         } else if (mCurrentState == CalculatorState.EVALUATE) {
             // Cancel current evaluation
             cancelIfEvaluating(true /* quiet */ );
@@ -1366,12 +1370,15 @@
     }
 
     private void showHistoryFragment() {
-        final FragmentManager manager = getFragmentManager();
-        if (manager == null || manager.isDestroyed()) {
+        if (getHistoryFragment() != null) {
+            // If the fragment already exists, do nothing.
             return;
         }
 
-        if (getHistoryFragment() != null || !prepareForHistory()) {
+        final FragmentManager manager = getFragmentManager();
+        if (manager == null || manager.isDestroyed() || !prepareForHistory()) {
+            // If the history fragment can not be shown, close the draglayout.
+            mDragLayout.setClosed();
             return;
         }