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 932c3c1c0423a..b650944403cb4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -392,6 +392,8 @@ public class NotificationPanelView extends PanelView implements if (mQs != null) { mQsMinExpansionHeight = mKeyguardShowing ? 0 : mQs.getQsMinExpansionHeight(); mQsMaxExpansionHeight = mQs.getDesiredHeight(); + mNotificationStackScroller.setMaxTopPadding( + mQsMaxExpansionHeight + mQsNotificationTopPadding); } positionClockAndNotifications(); if (mQsExpanded && mQsFullyExpanded) { @@ -588,6 +590,19 @@ public class NotificationPanelView extends PanelView implements mNotificationStackScroller.resetScrollPosition(); } + @Override + public void collapse(boolean delayed, float speedUpFactor) { + if (!canPanelBeCollapsed()) { + return; + } + + if (mQsExpanded) { + mQsExpandImmediate = true; + mNotificationStackScroller.setShouldShowShelfOnly(true); + } + super.collapse(delayed, speedUpFactor); + } + public void closeQs() { cancelQsAnimation(); setQsExpansion(mQsMinExpansionHeight); @@ -615,6 +630,7 @@ public class NotificationPanelView extends PanelView implements public void expandWithQs() { if (mQsExpansionEnabled) { mQsExpandImmediate = true; + mNotificationStackScroller.setShouldShowShelfOnly(true); } expand(true /* animate */); } @@ -878,6 +894,7 @@ public class NotificationPanelView extends PanelView implements && event.getY(event.getActionIndex()) < mStatusBarMinHeight) { MetricsLogger.count(mContext, COUNTER_PANEL_OPEN_QS, 1); mQsExpandImmediate = true; + mNotificationStackScroller.setShouldShowShelfOnly(true); requestPanelHeightUpdate(); // Normally, we start listening when the panel is expanded, but here we need to start @@ -1321,7 +1338,9 @@ public class NotificationPanelView extends PanelView implements protected void updateQsExpansion() { if (mQs == null) return; - mQs.setQsExpansion(getQsExpansionFraction(), getHeaderTranslation()); + float qsExpansionFraction = getQsExpansionFraction(); + mQs.setQsExpansion(qsExpansionFraction, getHeaderTranslation()); + mNotificationStackScroller.setQsExpansionFraction(qsExpansionFraction); } private String determineAccessibilityPaneTitle() { @@ -1357,7 +1376,6 @@ public class NotificationPanelView extends PanelView implements } else if (mQsSizeChangeAnimator != null) { return (int) mQsSizeChangeAnimator.getAnimatedValue(); } else if (mKeyguardShowing) { - // We can only do the smoother transition on Keyguard when we also are not collapsing // from a scrolled quick settings. return interpolate(getQsExpansionFraction(), @@ -1527,7 +1545,6 @@ public class NotificationPanelView extends PanelView implements // On Keyguard, interpolate the QS expansion linearly to the panel expansion t = expandedHeight / (getMaxPanelHeight()); } else { - // In Shade, interpolate linearly such that QS is closed whenever panel height is // minimum QS expansion + minStackHeight float panelHeightQsCollapsed = mNotificationStackScroller.getIntrinsicPadding() @@ -1776,6 +1793,7 @@ public class NotificationPanelView extends PanelView implements setListening(true); } mQsExpandImmediate = false; + mNotificationStackScroller.setShouldShowShelfOnly(false); mTwoFingerQsExpandPossible = false; mIsExpansionFromHeadsUp = false; notifyListenersTrackingHeadsUp(null); @@ -1827,6 +1845,7 @@ public class NotificationPanelView extends PanelView implements super.onTrackingStarted(); if (mQsFullyExpanded) { mQsExpandImmediate = true; + mNotificationStackScroller.setShouldShowShelfOnly(true); } if (mStatusBar.getBarState() == StatusBarState.KEYGUARD || mStatusBar.getBarState() == StatusBarState.SHADE_LOCKED) { @@ -1894,6 +1913,8 @@ public class NotificationPanelView extends PanelView implements if (mAccessibilityManager.isEnabled()) { setAccessibilityPaneTitle(determineAccessibilityPaneTitle()); } + mNotificationStackScroller.setMaxTopPadding( + mQsMaxExpansionHeight + mQsNotificationTopPadding); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java index a0b3c655e99fb..5275e27a2c5ae 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java @@ -169,6 +169,7 @@ public class NotificationStackScrollLayout extends ViewGroup private int mCollapsedSize; private int mPaddingBetweenElements; private int mIncreasedPaddingBetweenElements; + private int mMaxTopPadding; private int mRegularTopPadding; private int mDarkTopPadding; // Current padding, will be either mRegularTopPadding or mDarkTopPadding @@ -177,6 +178,7 @@ public class NotificationStackScrollLayout extends ViewGroup private int mDarkSeparatorPadding; private int mBottomMargin; private int mBottomInset = 0; + private float mQsExpansionFraction; /** * The algorithm which calculates the properties for our children @@ -230,6 +232,7 @@ public class NotificationStackScrollLayout extends ViewGroup private boolean mPanelTracking; private boolean mExpandingNotification; private boolean mExpandedInThisMotion; + private boolean mShouldShowShelfOnly; protected boolean mScrollingEnabled; protected FooterView mFooterView; protected EmptyShadeView mEmptyShadeView; @@ -883,7 +886,20 @@ public class NotificationStackScrollLayout extends ViewGroup float appearFraction = 1.0f; if (height >= appearEndPosition) { translationY = 0; - stackHeight = (int) height; + if (mShouldShowShelfOnly) { + stackHeight = mTopPadding + mShelf.getIntrinsicHeight(); + } else if (mQsExpanded) { + int stackStartPosition = mContentHeight - mTopPadding + mIntrinsicPadding; + int stackEndPosition = mMaxTopPadding + mShelf.getIntrinsicHeight(); + if (stackStartPosition <= stackEndPosition) { + stackHeight = stackEndPosition; + } else { + stackHeight = (int) NotificationUtils.interpolate(stackStartPosition, + stackEndPosition, mQsExpansionFraction); + } + } else { + stackHeight = (int) height; + } } else { appearFraction = getAppearFraction(height); if (appearFraction >= 0) { @@ -2581,6 +2597,10 @@ public class NotificationStackScrollLayout extends ViewGroup setExpandedHeight(mExpandedHeight); } + public void setMaxTopPadding(int maxTopPadding) { + mMaxTopPadding = maxTopPadding; + } + public int getLayoutMinHeight() { if (isHeadsUpTransition()) { return getTopHeadsUpPinnedHeight(); @@ -4484,6 +4504,10 @@ public class NotificationStackScrollLayout extends ViewGroup updateAlgorithmLayoutMinHeight(); } + public void setQsExpansionFraction(float qsExpansionFraction) { + mQsExpansionFraction = qsExpansionFraction; + } + public void setOwnScrollY(int ownScrollY) { if (ownScrollY != mOwnScrollY) { // We still want to call the normal scrolled changed for accessibility reasons @@ -4519,6 +4543,11 @@ public class NotificationStackScrollLayout extends ViewGroup } } + public void setShouldShowShelfOnly(boolean shouldShowShelfOnly) { + mShouldShowShelfOnly = shouldShowShelfOnly; + updateAlgorithmLayoutMinHeight(); + } + public int getMinExpansionHeight() { return mShelf.getIntrinsicHeight() - (mShelf.getIntrinsicHeight() - mStatusBarHeight) / 2; } @@ -4574,7 +4603,8 @@ public class NotificationStackScrollLayout extends ViewGroup public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { pw.println(String.format("[%s: pulsing=%s qsCustomizerShowing=%s visibility=%s" - + " alpha:%f scrollY:%d]", + + " alpha:%f scrollY:%d maxTopPadding:%d showShelfOnly=%s" + + " qsExpandFraction=%f]", this.getClass().getSimpleName(), mPulsing ? "T":"f", mAmbientState.isQsCustomizerShowing() ? "T":"f", @@ -4582,7 +4612,10 @@ public class NotificationStackScrollLayout extends ViewGroup : getVisibility() == View.GONE ? "gone" : "invisible", getAlpha(), - mAmbientState.getScrollY())); + mAmbientState.getScrollY(), + mMaxTopPadding, + mShouldShowShelfOnly ? "T":"f", + mQsExpansionFraction)); } public boolean isFullyDark() {