Sharesheet - Modify header scrolling behavior

To align with UX, scroll the listview before the header when
collapsing the sharesheet to its minified state, on both flings and
drags. Fix an issue with the expansion area, whereby state is only
updated if view positions are actually updated.

Bug: 129979914
Test: Visual inspection
Change-Id: I2e32a1a3288a21bcd3ce07819f77760f10d5d929
This commit is contained in:
Matt Pietal
2019-04-25 14:38:30 -04:00
parent 22f79f250c
commit c6d3ac2385
2 changed files with 32 additions and 7 deletions

View File

@@ -3042,10 +3042,9 @@ public class ChooserActivity extends ResolverActivity {
int yDiff = (int) ((oldy - y) * DIRECT_SHARE_EXPANSION_RATE);
int prevHeight = mDirectShareCurrHeight;
mDirectShareCurrHeight = Math.min(mDirectShareCurrHeight + yDiff,
mDirectShareMaxHeight);
mDirectShareCurrHeight = Math.max(mDirectShareCurrHeight, mDirectShareMinHeight);
yDiff = mDirectShareCurrHeight - prevHeight;
int newHeight = Math.min(prevHeight + yDiff, mDirectShareMaxHeight);
newHeight = Math.max(newHeight, mDirectShareMinHeight);
yDiff = newHeight - prevHeight;
if (view == null || view.getChildCount() == 0 || yDiff == 0) {
return;
@@ -3062,7 +3061,7 @@ public class ChooserActivity extends ResolverActivity {
if (child.getTag() != null && child.getTag() instanceof DirectShareViewHolder) {
int widthSpec = MeasureSpec.makeMeasureSpec(child.getWidth(),
MeasureSpec.EXACTLY);
int heightSpec = MeasureSpec.makeMeasureSpec(mDirectShareCurrHeight,
int heightSpec = MeasureSpec.makeMeasureSpec(newHeight,
MeasureSpec.EXACTLY);
child.measure(widthSpec, heightSpec);
child.getLayoutParams().height = child.getMeasuredHeight();
@@ -3073,6 +3072,10 @@ public class ChooserActivity extends ResolverActivity {
}
}
}
if (foundExpansion) {
mDirectShareCurrHeight = newHeight;
}
}
}

View File

@@ -114,6 +114,8 @@ public class ResolverDrawerLayout extends ViewGroup {
private final Rect mTempRect = new Rect();
private AbsListView mNestedScrollingChild;
private final ViewTreeObserver.OnTouchModeChangeListener mTouchModeChangeListener =
new ViewTreeObserver.OnTouchModeChangeListener() {
@Override
@@ -317,6 +319,13 @@ public class ResolverDrawerLayout extends ViewGroup {
return mIsDragging || mOpenOnClick;
}
private boolean isNestedChildScrolled() {
return mNestedScrollingChild != null
&& mNestedScrollingChild.getChildCount() > 0
&& (mNestedScrollingChild.getFirstVisiblePosition() > 0
|| mNestedScrollingChild.getChildAt(0).getTop() < 0);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
final int action = ev.getActionMasked();
@@ -359,7 +368,11 @@ public class ResolverDrawerLayout extends ViewGroup {
}
if (mIsDragging) {
final float dy = y - mLastTouchY;
performDrag(dy);
if (dy > 0 && isNestedChildScrolled()) {
mNestedScrollingChild.smoothScrollBy((int) -dy, 0);
} else {
performDrag(dy);
}
}
mLastTouchY = y;
}
@@ -411,6 +424,9 @@ public class ResolverDrawerLayout extends ViewGroup {
smoothScrollTo(mCollapsibleHeight + mUncollapsibleHeight, yvel);
mDismissOnScrollerFinished = true;
} else {
if (isNestedChildScrolled()) {
mNestedScrollingChild.smoothScrollToPosition(0);
}
smoothScrollTo(yvel < 0 ? 0 : mCollapsibleHeight, yvel);
}
}
@@ -680,7 +696,13 @@ public class ResolverDrawerLayout extends ViewGroup {
@Override
public boolean onStartNestedScroll(View child, View target, int nestedScrollAxes) {
return (nestedScrollAxes & View.SCROLL_AXIS_VERTICAL) != 0;
if ((nestedScrollAxes & View.SCROLL_AXIS_VERTICAL) != 0) {
if (child instanceof AbsListView) {
mNestedScrollingChild = (AbsListView) child;
}
return true;
}
return false;
}
@Override