Snap for 4801384 from 172476febbe6a1f092babceabeb9712ffecdf9db to pi-release

Change-Id: Ifef7c4e66a9fcc8879b14694b69f2b3edf94889f
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index 7cd4318..1387b25 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -75,7 +75,7 @@
     <string name="approximate" msgid="7117143366610670836">"(±১ শেষের ডিজিটের মধ্যে)"</string>
     <string name="menu_leading" msgid="2338520833272667740">"লিডিং সংখ্যায় উত্তর"</string>
     <string name="menu_fraction" msgid="1247477377840252234">"ভগ্নাংশ হিসাবে উত্তর"</string>
-    <string name="menu_licenses" msgid="1890541368064108592">"মুক্ত উৎস লাইসেন্সগুলি"</string>
+    <string name="menu_licenses" msgid="1890541368064108592">"ওপেন সোর্স লাইসেন্স"</string>
     <string name="menu_history" msgid="9006222701220105452">"ইতিহাস"</string>
     <string name="menu_clear_history" msgid="2336526604226069572">"সাফ করুন"</string>
     <string name="title_history" msgid="7820912156315181539">"ইতিহাস"</string>
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;
         }
 
diff --git a/src/com/android/calculator2/DragLayout.java b/src/com/android/calculator2/DragLayout.java
index e34c4da..74b0a8e 100644
--- a/src/com/android/calculator2/DragLayout.java
+++ b/src/com/android/calculator2/DragLayout.java
@@ -209,14 +209,11 @@
         return mIsOpen;
     }
 
-    private void setClosed() {
-        if (mIsOpen) {
-            mIsOpen = false;
-            mHistoryFrame.setVisibility(View.INVISIBLE);
-
-            if (mCloseCallback != null) {
-                mCloseCallback.onClose();
-            }
+    public void setClosed() {
+        mIsOpen = false;
+        mHistoryFrame.setVisibility(View.INVISIBLE);
+        if (mCloseCallback != null) {
+            mCloseCallback.onClose();
         }
     }
 
@@ -350,7 +347,9 @@
                 settleToOpen = releasedChild.getTop() > -(mVerticalRange / 2);
             }
 
-            if (mDragHelper.settleCapturedViewAt(0, settleToOpen ? 0 : -mVerticalRange)) {
+            // If the view is not visible, then settle it closed, not open.
+            if (mDragHelper.settleCapturedViewAt(0, settleToOpen && mIsOpen ? 0
+                    : -mVerticalRange)) {
                 ViewCompat.postInvalidateOnAnimation(DragLayout.this);
             }
         }