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

Commit b9eabc5c authored by Adam Powell's avatar Adam Powell Committed by Android (Google) Code Review
Browse files

Merge "Allow swipe down to dismiss for ResolverDrawerLayout" into lmp-mr1-dev

parents 984cf41a 5dd072d8
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -278,9 +278,9 @@ public class ResolverActivity extends Activity implements AdapterView.OnItemClic


        final ResolverDrawerLayout rdl = (ResolverDrawerLayout) findViewById(R.id.contentPanel);
        final ResolverDrawerLayout rdl = (ResolverDrawerLayout) findViewById(R.id.contentPanel);
        if (rdl != null) {
        if (rdl != null) {
            rdl.setOnClickOutsideListener(new View.OnClickListener() {
            rdl.setOnDismissedListener(new ResolverDrawerLayout.OnDismissedListener() {
                @Override
                @Override
                public void onClick(View v) {
                public void onDismissed() {
                    finish();
                    finish();
                }
                }
            });
            });
+59 −21
Original line number Original line Diff line number Diff line
@@ -63,18 +63,22 @@ public class ResolverDrawerLayout extends ViewGroup {
    private float mCollapseOffset;
    private float mCollapseOffset;


    private int mCollapsibleHeight;
    private int mCollapsibleHeight;
    private int mUncollapsibleHeight;


    private int mTopOffset;
    private int mTopOffset;


    private boolean mIsDragging;
    private boolean mIsDragging;
    private boolean mOpenOnClick;
    private boolean mOpenOnClick;
    private boolean mOpenOnLayout;
    private boolean mOpenOnLayout;
    private boolean mDismissOnScrollerFinished;
    private final int mTouchSlop;
    private final int mTouchSlop;
    private final float mMinFlingVelocity;
    private final float mMinFlingVelocity;
    private final OverScroller mScroller;
    private final OverScroller mScroller;
    private final VelocityTracker mVelocityTracker;
    private final VelocityTracker mVelocityTracker;


    private OnClickListener mClickOutsideListener;
    private OnDismissedListener mOnDismissedListener;
    private RunOnDismissedListener mRunOnDismissedListener;

    private float mInitialTouchX;
    private float mInitialTouchX;
    private float mInitialTouchY;
    private float mInitialTouchY;
    private float mLastTouchY;
    private float mLastTouchY;
@@ -143,8 +147,8 @@ public class ResolverDrawerLayout extends ViewGroup {
        return isSmallCollapsed() ? mMaxCollapsedHeightSmall : mMaxCollapsedHeight;
        return isSmallCollapsed() ? mMaxCollapsedHeightSmall : mMaxCollapsedHeight;
    }
    }


    public void setOnClickOutsideListener(OnClickListener listener) {
    public void setOnDismissedListener(OnDismissedListener listener) {
        mClickOutsideListener = listener;
        mOnDismissedListener = listener;
    }
    }


    @Override
    @Override
@@ -194,7 +198,7 @@ public class ResolverDrawerLayout extends ViewGroup {
        }
        }


        if (mIsDragging) {
        if (mIsDragging) {
            mScroller.abortAnimation();
            abortAnimation();
        }
        }
        return mIsDragging || mOpenOnClick;
        return mIsDragging || mOpenOnClick;
    }
    }
@@ -213,12 +217,9 @@ public class ResolverDrawerLayout extends ViewGroup {
                mInitialTouchX = x;
                mInitialTouchX = x;
                mInitialTouchY = mLastTouchY = y;
                mInitialTouchY = mLastTouchY = y;
                mActivePointerId = ev.getPointerId(0);
                mActivePointerId = ev.getPointerId(0);
                if (findChildUnder(mInitialTouchX, mInitialTouchY) == null &&
                mIsDragging = findChildUnder(mInitialTouchX, mInitialTouchY) != null;
                        mClickOutsideListener != null) {
                handled = (!mIsDragging && mOnDismissedListener != null) || mCollapsibleHeight > 0;
                    mIsDragging = handled = true;
                abortAnimation();
                }
                handled |= mCollapsibleHeight > 0;
                mScroller.abortAnimation();
            }
            }
            break;
            break;


@@ -264,11 +265,12 @@ public class ResolverDrawerLayout extends ViewGroup {
            break;
            break;


            case MotionEvent.ACTION_UP: {
            case MotionEvent.ACTION_UP: {
                final boolean wasDragging = mIsDragging;
                mIsDragging = false;
                mIsDragging = false;
                if (!mIsDragging && findChildUnder(mInitialTouchX, mInitialTouchY) == null &&
                if (!wasDragging && findChildUnder(mInitialTouchX, mInitialTouchY) == null &&
                        findChildUnder(ev.getX(), ev.getY()) == null) {
                        findChildUnder(ev.getX(), ev.getY()) == null) {
                    if (mClickOutsideListener != null) {
                    if (mOnDismissedListener != null) {
                        mClickOutsideListener.onClick(this);
                        dispatchOnDismissed();
                        resetTouch();
                        resetTouch();
                        return true;
                        return true;
                    }
                    }
@@ -281,7 +283,13 @@ public class ResolverDrawerLayout extends ViewGroup {
                mVelocityTracker.computeCurrentVelocity(1000);
                mVelocityTracker.computeCurrentVelocity(1000);
                final float yvel = mVelocityTracker.getYVelocity(mActivePointerId);
                final float yvel = mVelocityTracker.getYVelocity(mActivePointerId);
                if (Math.abs(yvel) > mMinFlingVelocity) {
                if (Math.abs(yvel) > mMinFlingVelocity) {
                    if (mOnDismissedListener != null
                            && yvel > 0 && mCollapseOffset > mCollapsibleHeight) {
                        smoothScrollTo(mCollapsibleHeight + mUncollapsibleHeight, yvel);
                        mDismissOnScrollerFinished = true;
                    } else {
                        smoothScrollTo(yvel < 0 ? 0 : mCollapsibleHeight, yvel);
                        smoothScrollTo(yvel < 0 ? 0 : mCollapsibleHeight, yvel);
                    }
                } else {
                } else {
                    smoothScrollTo(
                    smoothScrollTo(
                            mCollapseOffset < mCollapsibleHeight / 2 ? 0 : mCollapsibleHeight, 0);
                            mCollapseOffset < mCollapsibleHeight / 2 ? 0 : mCollapsibleHeight, 0);
@@ -327,17 +335,27 @@ public class ResolverDrawerLayout extends ViewGroup {
    @Override
    @Override
    public void computeScroll() {
    public void computeScroll() {
        super.computeScroll();
        super.computeScroll();
        if (!mScroller.isFinished()) {
        if (mScroller.computeScrollOffset()) {
            final boolean keepGoing = mScroller.computeScrollOffset();
            final boolean keepGoing = !mScroller.isFinished();
            performDrag(mScroller.getCurrY() - mCollapseOffset);
            performDrag(mScroller.getCurrY() - mCollapseOffset);
            if (keepGoing) {
            if (keepGoing) {
                postInvalidateOnAnimation();
                postInvalidateOnAnimation();
            } else if (mDismissOnScrollerFinished && mOnDismissedListener != null) {
                mRunOnDismissedListener = new RunOnDismissedListener();
                post(mRunOnDismissedListener);
            }
            }
        }
        }
    }
    }


    private void abortAnimation() {
        mScroller.abortAnimation();
        mRunOnDismissedListener = null;
        mDismissOnScrollerFinished = false;
    }

    private float performDrag(float dy) {
    private float performDrag(float dy) {
        final float newPos = Math.max(0, Math.min(mCollapseOffset + dy, mCollapsibleHeight));
        final float newPos = Math.max(0, Math.min(mCollapseOffset + dy,
                mCollapsibleHeight + mUncollapsibleHeight));
        if (newPos != mCollapseOffset) {
        if (newPos != mCollapseOffset) {
            dy = newPos - mCollapseOffset;
            dy = newPos - mCollapseOffset;
            final int childCount = getChildCount();
            final int childCount = getChildCount();
@@ -356,11 +374,18 @@ public class ResolverDrawerLayout extends ViewGroup {
        return 0;
        return 0;
    }
    }


    private void smoothScrollTo(int yOffset, float velocity) {
    void dispatchOnDismissed() {
        if (getMaxCollapsedHeight() == 0) {
        if (mOnDismissedListener != null) {
            return;
            mOnDismissedListener.onDismissed();
        }
        }
        mScroller.abortAnimation();
        if (mRunOnDismissedListener != null) {
            removeCallbacks(mRunOnDismissedListener);
            mRunOnDismissedListener = null;
        }
    }

    private void smoothScrollTo(int yOffset, float velocity) {
        abortAnimation();
        final int sy = (int) mCollapseOffset;
        final int sy = (int) mCollapseOffset;
        int dy = yOffset - sy;
        int dy = yOffset - sy;
        if (dy == 0) {
        if (dy == 0) {
@@ -490,6 +515,7 @@ public class ResolverDrawerLayout extends ViewGroup {
    protected void onDetachedFromWindow() {
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        super.onDetachedFromWindow();
        getViewTreeObserver().removeOnTouchModeChangeListener(mTouchModeChangeListener);
        getViewTreeObserver().removeOnTouchModeChangeListener(mTouchModeChangeListener);
        abortAnimation();
    }
    }


    @Override
    @Override
@@ -585,6 +611,7 @@ public class ResolverDrawerLayout extends ViewGroup {


        mCollapsibleHeight = Math.max(0,
        mCollapsibleHeight = Math.max(0,
                heightUsed - alwaysShowHeight - getMaxCollapsedHeight());
                heightUsed - alwaysShowHeight - getMaxCollapsedHeight());
        mUncollapsibleHeight = heightUsed - mCollapsibleHeight;


        if (isLaidOut()) {
        if (isLaidOut()) {
            mCollapseOffset = Math.min(mCollapseOffset, mCollapsibleHeight);
            mCollapseOffset = Math.min(mCollapseOffset, mCollapsibleHeight);
@@ -734,4 +761,15 @@ public class ResolverDrawerLayout extends ViewGroup {
            }
            }
        };
        };
    }
    }

    public interface OnDismissedListener {
        public void onDismissed();
    }

    private class RunOnDismissedListener implements Runnable {
        @Override
        public void run() {
            dispatchOnDismissed();
        }
    }
}
}