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 1d08658ccaf23..acdc6bc59b20d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -279,6 +279,8 @@ public class NotificationPanelView extends PanelView implements positionClockAndNotifications(); mNotificationStackScroller.setStackHeight(getExpandedHeight()); } + mNotificationStackScroller.updateIsSmallScreen( + mHeader.getCollapsedHeight() + mQsPeekHeight); } @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 d2b97d1e4e363..d25dda1edec11 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java @@ -2164,6 +2164,14 @@ public class NotificationStackScrollLayout extends ViewGroup return max + getTranslationY(); } + /** + * @param qsMinHeight The minimum height of the quick settings including padding + * See {@link StackScrollAlgorithm#updateIsSmallScreen}. + */ + public void updateIsSmallScreen(int qsMinHeight) { + mStackScrollAlgorithm.updateIsSmallScreen(mMaxLayoutHeight - qsMinHeight); + } + /** * A listener that is notified when some child locations might have changed. */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java index ba3f339ef83b5..79a83db68387f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java @@ -71,6 +71,8 @@ public class StackScrollAlgorithm { private int mBottomStackSlowDownLength; private int mTopStackSlowDownLength; private int mCollapseSecondCardPadding; + private boolean mIsSmallScreen; + private int mMaxNotificationHeight; public StackScrollAlgorithm(Context context) { initConstants(context); @@ -106,6 +108,8 @@ public class StackScrollAlgorithm { .getDimensionPixelSize(R.dimen.notification_padding); mCollapsedSize = context.getResources() .getDimensionPixelSize(R.dimen.notification_min_height); + mMaxNotificationHeight = context.getResources() + .getDimensionPixelSize(R.dimen.notification_max_height); mTopStackPeekSize = context.getResources() .getDimensionPixelSize(R.dimen.top_stack_peek_amount); mBottomStackPeekSize = context.getResources() @@ -377,14 +381,17 @@ public class StackScrollAlgorithm { // We are in the top Stack updateStateForTopStackChild(algorithmState, numberOfElementsCompletelyIn, i, childHeight, childViewState, scrollOffset); - clampYTranslation(childViewState, childHeight); + clampPositionToTopStackEnd(childViewState, childHeight); + // check if we are overlapping with the bottom stack if (childViewState.yTranslation + childHeight + mPaddingBetweenElements >= bottomStackStart && !mIsExpansionChanging && i != 0) { - // TODO: handle overlapping sizes with end stack better - // we just collapse this element - childViewState.height = mCollapsedSize; + // we just collapse this element slightly + int newSize = (int) Math.max(bottomStackStart - mPaddingBetweenElements - + childViewState.yTranslation, mCollapsedSize); + childViewState.height = newSize; } + clampPositionToBottomStackStart(childViewState, childViewState.height); } else if (nextYPosition >= bottomStackStart) { // Case 2: // We are in the bottom stack. @@ -489,11 +496,17 @@ public class StackScrollAlgorithm { // the offset starting at the transitionPosition of the bottom stack float offset = mBottomStackIndentationFunctor.getValue(algorithmState.partialInBottom); algorithmState.itemsInBottomStack += algorithmState.partialInBottom; - childViewState.yTranslation = transitioningPositionStart + offset - childHeight + int newHeight = childHeight; + if (childHeight > mCollapsedSize && mIsSmallScreen) { + newHeight = (int) Math.max(Math.min(transitioningPositionStart + offset - + mPaddingBetweenElements - currentYPosition, childHeight), mCollapsedSize); + childViewState.height = newHeight; + } + childViewState.yTranslation = transitioningPositionStart + offset - newHeight - mPaddingBetweenElements; - + // We want at least to be at the end of the top stack when collapsing - clampPositionToTopStackEnd(childViewState, childHeight); + clampPositionToTopStackEnd(childViewState, newHeight); childViewState.location = StackScrollState.ViewState.LOCATION_MAIN_AREA; } @@ -705,6 +718,20 @@ public class StackScrollAlgorithm { mInnerHeight = mLayoutHeight - mTopPadding; } + + /** + * Update whether the device is very small, i.e. Notifications can be in both the top and the + * bottom stack at the same time + * + * @param panelHeight The normal height of the panel when it's open + */ + public void updateIsSmallScreen(int panelHeight) { + mIsSmallScreen = panelHeight < + mCollapsedSize /* top stack */ + + mBottomStackSlowDownLength + mBottomStackPeekSize /* bottom stack */ + + mMaxNotificationHeight; /* max notification height */ + } + public void onExpansionStarted(StackScrollState currentState) { mIsExpansionChanging = true; mExpandedOnStart = mIsExpanded;