Commit bdfd38cf authored by Annie Chin's avatar Annie Chin Committed by Hung-ying Tyan

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)
parent bd190d65
......@@ -535,9 +535,6 @@ public class Calculator extends Activity
}
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 @@ public class Calculator extends Activity
*/
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 @@ public class Calculator extends Activity
}
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;
}
......
......@@ -209,14 +209,11 @@ public class DragLayout extends ViewGroup {
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 @@ public class DragLayout extends ViewGroup {
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);
}
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment