diff options
| author | Ben Lin <linben@google.com> | 2017-10-25 11:38:40 -0700 |
|---|---|---|
| committer | Ben Lin <linben@google.com> | 2017-12-01 12:24:37 -0800 |
| commit | 93b8697cdc0355ec5deede356994ea1a45d8a329 (patch) | |
| tree | b52e1feac92f95ea3c3227fc9acf39e95eb34aea /core/java | |
| parent | 684cae74e343a3abb3b28ce8ebb3683939704723 (diff) | |
Add ability for ResolverDrawer to be align to top via XML attribute.
Bug: 70036020
Test: ResolverActivityTest#setShowAtTopToTrue passes.
Change-Id: I2c51c9c731234f05a589c52d5a03b8b6605d4c9c
Diffstat (limited to 'core/java')
| -rw-r--r-- | core/java/com/android/internal/widget/ResolverDrawerLayout.java | 78 |
1 files changed, 63 insertions, 15 deletions
diff --git a/core/java/com/android/internal/widget/ResolverDrawerLayout.java b/core/java/com/android/internal/widget/ResolverDrawerLayout.java index 17c7ebd39678..7635a727ae85 100644 --- a/core/java/com/android/internal/widget/ResolverDrawerLayout.java +++ b/core/java/com/android/internal/widget/ResolverDrawerLayout.java @@ -81,6 +81,7 @@ public class ResolverDrawerLayout extends ViewGroup { private int mCollapsibleHeightReserved; private int mTopOffset; + private boolean mShowAtTop; private boolean mIsDragging; private boolean mOpenOnClick; @@ -134,6 +135,7 @@ public class ResolverDrawerLayout extends ViewGroup { mMaxCollapsedHeightSmall = a.getDimensionPixelSize( R.styleable.ResolverDrawerLayout_maxCollapsedHeightSmall, mMaxCollapsedHeight); + mShowAtTop = a.getBoolean(R.styleable.ResolverDrawerLayout_showAtTop, false); a.recycle(); mScrollIndicatorDrawable = mContext.getDrawable(R.drawable.scroll_indicator_material); @@ -162,6 +164,16 @@ public class ResolverDrawerLayout extends ViewGroup { return mCollapseOffset > 0; } + public void setShowAtTop(boolean showOnTop) { + mShowAtTop = showOnTop; + invalidate(); + requestLayout(); + } + + public boolean getShowAtTop() { + return mShowAtTop; + } + public void setCollapsed(boolean collapsed) { if (!isLaidOut()) { mOpenOnLayout = collapsed; @@ -206,6 +218,12 @@ public class ResolverDrawerLayout extends ViewGroup { return false; } + if (getShowAtTop()) { + // Keep the drawer fully open. + mCollapseOffset = 0; + return false; + } + if (isLaidOut()) { final boolean isCollapsedOld = mCollapseOffset != 0; if (remainClosed && (oldCollapsibleHeight < mCollapsibleHeight @@ -372,14 +390,23 @@ public class ResolverDrawerLayout extends ViewGroup { mVelocityTracker.computeCurrentVelocity(1000); final float yvel = mVelocityTracker.getYVelocity(mActivePointerId); if (Math.abs(yvel) > mMinFlingVelocity) { - if (isDismissable() - && yvel > 0 && mCollapseOffset > mCollapsibleHeight) { - smoothScrollTo(mCollapsibleHeight + mUncollapsibleHeight, yvel); - mDismissOnScrollerFinished = true; + if (getShowAtTop()) { + if (isDismissable() && yvel < 0) { + abortAnimation(); + dismiss(); + } else { + smoothScrollTo(yvel < 0 ? 0 : mCollapsibleHeight, yvel); + } } else { - smoothScrollTo(yvel < 0 ? 0 : mCollapsibleHeight, yvel); + if (isDismissable() + && yvel > 0 && mCollapseOffset > mCollapsibleHeight) { + smoothScrollTo(mCollapsibleHeight + mUncollapsibleHeight, yvel); + mDismissOnScrollerFinished = true; + } else { + smoothScrollTo(yvel < 0 ? 0 : mCollapsibleHeight, yvel); + } } - } else { + }else { smoothScrollTo( mCollapseOffset < mCollapsibleHeight / 2 ? 0 : mCollapsibleHeight, 0); } @@ -421,6 +448,11 @@ public class ResolverDrawerLayout extends ViewGroup { mVelocityTracker.clear(); } + private void dismiss() { + mRunOnDismissedListener = new RunOnDismissedListener(); + post(mRunOnDismissedListener); + } + @Override public void computeScroll() { super.computeScroll(); @@ -430,8 +462,7 @@ public class ResolverDrawerLayout extends ViewGroup { if (keepGoing) { postInvalidateOnAnimation(); } else if (mDismissOnScrollerFinished && mOnDismissedListener != null) { - mRunOnDismissedListener = new RunOnDismissedListener(); - post(mRunOnDismissedListener); + dismiss(); } } } @@ -443,6 +474,10 @@ public class ResolverDrawerLayout extends ViewGroup { } private float performDrag(float dy) { + if (getShowAtTop()) { + return 0; + } + final float newPos = Math.max(0, Math.min(mCollapseOffset + dy, mCollapsibleHeight + mUncollapsibleHeight)); if (newPos != mCollapseOffset) { @@ -656,7 +691,7 @@ public class ResolverDrawerLayout extends ViewGroup { @Override public boolean onNestedPreFling(View target, float velocityX, float velocityY) { - if (velocityY > mMinFlingVelocity && mCollapseOffset != 0) { + if (!getShowAtTop() && velocityY > mMinFlingVelocity && mCollapseOffset != 0) { smoothScrollTo(0, velocityY); return true; } @@ -666,12 +701,21 @@ public class ResolverDrawerLayout extends ViewGroup { @Override public boolean onNestedFling(View target, float velocityX, float velocityY, boolean consumed) { if (!consumed && Math.abs(velocityY) > mMinFlingVelocity) { - if (isDismissable() - && velocityY < 0 && mCollapseOffset > mCollapsibleHeight) { - smoothScrollTo(mCollapsibleHeight + mUncollapsibleHeight, velocityY); - mDismissOnScrollerFinished = true; + if (getShowAtTop()) { + if (isDismissable() && velocityY > 0) { + abortAnimation(); + dismiss(); + } else { + smoothScrollTo(velocityY < 0 ? mCollapsibleHeight : 0, velocityY); + } } else { - smoothScrollTo(velocityY > 0 ? 0 : mCollapsibleHeight, velocityY); + if (isDismissable() + && velocityY < 0 && mCollapseOffset > mCollapsibleHeight) { + smoothScrollTo(mCollapsibleHeight + mUncollapsibleHeight, velocityY); + mDismissOnScrollerFinished = true; + } else { + smoothScrollTo(velocityY > 0 ? 0 : mCollapsibleHeight, velocityY); + } } return true; } @@ -794,7 +838,11 @@ public class ResolverDrawerLayout extends ViewGroup { updateCollapseOffset(oldCollapsibleHeight, !isDragging()); - mTopOffset = Math.max(0, heightSize - heightUsed) + (int) mCollapseOffset; + if (getShowAtTop()) { + mTopOffset = 0; + } else { + mTopOffset = Math.max(0, heightSize - heightUsed) + (int) mCollapseOffset; + } setMeasuredDimension(sourceWidth, heightSize); } |
