private int mQsPeekHeight;
private boolean mStackScrollerOverscrolling;
private boolean mQsExpansionFromOverscroll;
+ private float mLastOverscroll;
private boolean mQsExpansionEnabled = true;
private ValueAnimator mQsExpansionAnimator;
private FlingAnimationUtils mFlingAnimationUtils;
requestScrollerTopPaddingUpdate(false /* animate */);
}
} else {
- if (!mStackScrollerOverscrolling) {
- setQsExpansion(mQsMinExpansionHeight);
- }
+ setQsExpansion(mQsMinExpansionHeight + mLastOverscroll);
positionClockAndNotifications();
mNotificationStackScroller.setStackHeight(getExpandedHeight());
}
}
private float getQsExpansionFraction() {
- return (mQsExpansionHeight - mQsMinExpansionHeight)
- / (getTempQsMaxExpansion() - mQsMinExpansionHeight);
+ return Math.min(1f, (mQsExpansionHeight - mQsMinExpansionHeight)
+ / (getTempQsMaxExpansion() - mQsMinExpansionHeight));
}
@Override
float rounded = amount >= 1f ? amount : 0f;
mStackScrollerOverscrolling = rounded != 0f && isRubberbanded;
mQsExpansionFromOverscroll = rounded != 0f;
+ mLastOverscroll = rounded;
updateQsState();
setQsExpansion(mQsMinExpansionHeight + rounded);
}
}
private float calculateQsTopPadding() {
- if (mKeyguardShowing) {
+ // We can only do the smoother transition on Keyguard when we also are not collapsing from a
+ // scrolled quick settings.
+ if (mKeyguardShowing && mScrollYOverride == -1) {
return interpolate(getQsExpansionFraction(),
mNotificationStackScroller.getIntrinsicPadding() - mNotificationTopPadding,
mQsMaxExpansionHeight);
}
return;
}
+ mScrollView.setBlockFlinging(true);
ValueAnimator animator = ValueAnimator.ofFloat(mQsExpansionHeight, target);
mFlingAnimationUtils.apply(animator, mQsExpansionHeight, target, vel);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
+ mScrollView.setBlockFlinging(false);
mScrollYOverride = -1;
mQsExpansionAnimator = null;
if (onFinishRunnable != null) {
private boolean mHandlingTouchEvent;
private float mLastX;
private float mLastY;
+ private boolean mBlockFlinging;
public ObservableScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
maxOverScrollX, maxOverScrollY, isTouchEvent);
}
+ public void setBlockFlinging(boolean blockFlinging) {
+ mBlockFlinging = blockFlinging;
+ }
+
+ @Override
+ public void fling(int velocityY) {
+ if (!mBlockFlinging) {
+ super.fling(velocityY);
+ }
+ }
+
@Override
protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) {
super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);
mAlarmStatus.setText(KeyguardStatusView.formatNextAlarm(getContext(), nextAlarm));
}
mAlarmShowing = nextAlarm != null;
- updateVisibilities();
+ updateEverything();
requestCaptureValues();
}
}
public void setShowEmergencyCallsOnly(boolean show) {
- mShowEmergencyCallsOnly = show;
- if (mExpanded) {
- updateVisibilities();
- requestCaptureValues();
+ boolean changed = show != mShowEmergencyCallsOnly;
+ if (changed) {
+ mShowEmergencyCallsOnly = show;
+ if (mExpanded) {
+ updateEverything();
+ requestCaptureValues();
+ }
}
}
}
private void applyAlpha(View v, float alpha) {
- if (v == null) {
+ if (v == null || v.getVisibility() == View.GONE) {
return;
}
if (alpha == 0f) {