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

Commit a8b31db9 authored by Annie Chin's avatar Annie Chin Committed by Justin Klaassen
Browse files

Fix "disappearing history fragment" issue.

Swiping down too quickly after swiping up to hide history could
cause history fragment to disappear and freeze.

Fixes: 34717239
Test: manual - with history open, tap back, then immediately start drag
before fragment finishes animating.
Change-Id: I2196ba224712a66c406980f7453d5fc443a5fb5a
parent cd744f7a
Loading
Loading
Loading
Loading
+7 −5
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder;
import android.app.ActionBar;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.ClipData;
@@ -1278,7 +1279,7 @@ public class Calculator extends Activity
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.menu_history:
                showHistoryFragment(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                showHistoryFragment();
                return true;
            case R.id.menu_leading:
                displayFull();
@@ -1307,7 +1308,7 @@ public class Calculator extends Activity

    public void onStartDraggingOpen() {
        mDisplayView.hideToolbar();
        showHistoryFragment(FragmentTransaction.TRANSIT_NONE);
        showHistoryFragment();
    }

    @Override
@@ -1359,10 +1360,11 @@ public class Calculator extends Activity
        if (manager == null || manager.isDestroyed()) {
            return null;
        }
        return (HistoryFragment) manager.findFragmentByTag(HistoryFragment.TAG);
        final Fragment fragment = manager.findFragmentByTag(HistoryFragment.TAG);
        return fragment == null || fragment.isRemoving() ? null : (HistoryFragment) fragment;
    }

    private void showHistoryFragment(int transit) {
    private void showHistoryFragment() {
        final FragmentManager manager = getFragmentManager();
        if (manager == null || manager.isDestroyed()) {
            return;
@@ -1375,7 +1377,7 @@ public class Calculator extends Activity
        stopActionModeOrContextMenu();
        manager.beginTransaction()
                .replace(R.id.history_frame, new HistoryFragment(), HistoryFragment.TAG)
                .setTransition(transit)
                .setTransition(FragmentTransaction.TRANSIT_NONE)
                .addToBackStack(HistoryFragment.TAG)
                .commit();

+7 −21
Original line number Diff line number Diff line
@@ -222,34 +222,20 @@ public class DragLayout extends ViewGroup {

    public Animator createAnimator(boolean toOpen) {
        if (mIsOpen == toOpen) {
            return null;
            return ValueAnimator.ofFloat(0f, 1f).setDuration(0L);
        }

        mIsOpen = true;
        mIsOpen = toOpen;
        mHistoryFrame.setVisibility(VISIBLE);

        final ValueAnimator animator = ValueAnimator.ofInt(mHistoryFrame.getTop(),
                toOpen ? 0 : -mVerticalRange);
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animator) {
                final int top = (int) animator.getAnimatedValue();
                mHistoryFrame.offsetTopAndBottom(top - mHistoryFrame.getTop());

                for (DragCallback c : mDragCallbacks) {
                    // Top is between [-mVerticalRange, 0].
                    c.whileDragging(1f + (float) top / mVerticalRange);
                }
            }
        });
        if (!toOpen) {
        final ValueAnimator animator = ValueAnimator.ofFloat(0f, 1f);
        animator.addListener(new AnimatorListenerAdapter() {
            @Override
                public void onAnimationEnd(Animator animator) {
                    setClosed();
            public void onAnimationStart(Animator animation) {
                mDragHelper.cancel();
                mDragHelper.smoothSlideViewTo(mHistoryFrame, 0, mIsOpen ? 0 : -mVerticalRange);
            }
        });
        }

        return animator;
    }
+1 −9
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@ package com.android.calculator2;

import android.animation.Animator;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.RecyclerView;
@@ -165,14 +164,7 @@ public class HistoryFragment extends Fragment implements DragLayout.DragCallback

    @Override
    public Animator onCreateAnimator(int transit, boolean enter, int nextAnim) {
        if (enter) {
            if (transit == FragmentTransaction.TRANSIT_FRAGMENT_OPEN) {
                return mDragLayout.createAnimator(true /* toOpen */);
            } else {
                return null;
            }
        }
        return mDragLayout.createAnimator(false /* toOpen */);
        return mDragLayout.createAnimator(enter);
    }

    @Override