Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+14 −7
Original line number Diff line number Diff line
@@ -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;
        }

+8 −9
Original line number Diff line number Diff line
@@ -209,16 +209,13 @@ public class DragLayout extends ViewGroup {
        return mIsOpen;
    }

    private void setClosed() {
        if (mIsOpen) {
    public void setClosed() {
        mIsOpen = false;
        mHistoryFrame.setVisibility(View.INVISIBLE);

        if (mCloseCallback != null) {
            mCloseCallback.onClose();
        }
    }
    }

    public Animator createAnimator(boolean toOpen) {
        if (mIsOpen == toOpen) {
@@ -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);
            }
        }