diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index 55b147a8b1c70..55b82fc343450 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -117,6 +117,7 @@ public class NotificationPanelView extends PanelView implements private int mQsPeekHeight; private boolean mStackScrollerOverscrolling; private boolean mQsExpansionFromOverscroll; + private float mLastOverscroll; private boolean mQsExpansionEnabled = true; private ValueAnimator mQsExpansionAnimator; private FlingAnimationUtils mFlingAnimationUtils; @@ -273,9 +274,7 @@ public class NotificationPanelView extends PanelView implements requestScrollerTopPaddingUpdate(false /* animate */); } } else { - if (!mStackScrollerOverscrolling) { - setQsExpansion(mQsMinExpansionHeight); - } + setQsExpansion(mQsMinExpansionHeight + mLastOverscroll); positionClockAndNotifications(); mNotificationStackScroller.setStackHeight(getExpandedHeight()); } @@ -552,8 +551,8 @@ public class NotificationPanelView extends PanelView implements } private float getQsExpansionFraction() { - return (mQsExpansionHeight - mQsMinExpansionHeight) - / (getTempQsMaxExpansion() - mQsMinExpansionHeight); + return Math.min(1f, (mQsExpansionHeight - mQsMinExpansionHeight) + / (getTempQsMaxExpansion() - mQsMinExpansionHeight)); } @Override @@ -727,6 +726,7 @@ public class NotificationPanelView extends PanelView implements float rounded = amount >= 1f ? amount : 0f; mStackScrollerOverscrolling = rounded != 0f && isRubberbanded; mQsExpansionFromOverscroll = rounded != 0f; + mLastOverscroll = rounded; updateQsState(); setQsExpansion(mQsMinExpansionHeight + rounded); } @@ -1034,7 +1034,9 @@ public class NotificationPanelView extends PanelView implements } 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); @@ -1090,6 +1092,7 @@ public class NotificationPanelView extends PanelView implements } return; } + mScrollView.setBlockFlinging(true); ValueAnimator animator = ValueAnimator.ofFloat(mQsExpansionHeight, target); mFlingAnimationUtils.apply(animator, mQsExpansionHeight, target, vel); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @@ -1101,6 +1104,7 @@ public class NotificationPanelView extends PanelView implements animator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { + mScrollView.setBlockFlinging(false); mScrollYOverride = -1; mQsExpansionAnimator = null; if (onFinishRunnable != null) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ObservableScrollView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ObservableScrollView.java index ee6b1a9de864e..53361dcef5913 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ObservableScrollView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ObservableScrollView.java @@ -33,6 +33,7 @@ public class ObservableScrollView extends ScrollView { private boolean mHandlingTouchEvent; private float mLastX; private float mLastY; + private boolean mBlockFlinging; public ObservableScrollView(Context context, AttributeSet attrs) { super(context, attrs); @@ -109,6 +110,17 @@ public class ObservableScrollView extends ScrollView { 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); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java index 94b054c3f19eb..39b20220f5fe2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java @@ -366,7 +366,7 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL mAlarmStatus.setText(KeyguardStatusView.formatNextAlarm(getContext(), nextAlarm)); } mAlarmShowing = nextAlarm != null; - updateVisibilities(); + updateEverything(); requestCaptureValues(); } @@ -512,10 +512,13 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL } public void setShowEmergencyCallsOnly(boolean show) { - mShowEmergencyCallsOnly = show; - if (mExpanded) { - updateVisibilities(); - requestCaptureValues(); + boolean changed = show != mShowEmergencyCallsOnly; + if (changed) { + mShowEmergencyCallsOnly = show; + if (mExpanded) { + updateEverything(); + requestCaptureValues(); + } } } @@ -552,7 +555,7 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL } private void applyAlpha(View v, float alpha) { - if (v == null) { + if (v == null || v.getVisibility() == View.GONE) { return; } if (alpha == 0f) {