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:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user