From 0c9d558ae03c4f5179d7cb55e4de228a1f0d6cc5 Mon Sep 17 00:00:00 2001 From: Lyn Han Date: Tue, 11 May 2021 13:23:39 -0500 Subject: [PATCH] Push notifications down offscreen when QQS expands to fullscreen QS And bring notifications back up when fullscreen QS closes to QQS This updates UI to spec and fixes issues where the top of the notifications background scrim and notification shelf icons still show in fullscreen QS, which looks messy and blocks the media player. Fixes: 187195324 Test: open shade, expand QS, close QS, close shade Change-Id: Ic0a3238db16086ac272e80521c5e332d1a92744b --- .../stack/NotificationStackScrollLayout.java | 16 +++++++++------- .../notification/stack/StackScrollAlgorithm.java | 8 ++++++++ .../phone/NotificationPanelViewController.java | 7 +++---- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index 120f9732f5552..3b64d48f4df90 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -664,7 +664,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable mDebugPaint.setColor(Color.CYAN); canvas.drawLine(0, y, getWidth(), y, mDebugPaint); - y = (int) (mAmbientState.getStackY() + mAmbientState.getStackHeight()); + y = (int) (mAmbientState.getStackY() + mSidePaddings + mAmbientState.getStackHeight()); mDebugPaint.setColor(Color.BLUE); canvas.drawLine(0, y, getWidth(), y, mDebugPaint); } @@ -1148,12 +1148,14 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable if (mOnStackYChanged != null) { mOnStackYChanged.run(); } - - final float stackEndHeight = getHeight() - getEmptyBottomMargin() - mTopPadding; - mAmbientState.setStackEndHeight(stackEndHeight); - mAmbientState.setStackHeight( - MathUtils.lerp(stackEndHeight * StackScrollAlgorithm.START_FRACTION, - stackEndHeight, fraction)); + if (mQsExpansionFraction <= 0) { + final float stackEndHeight = Math.max(0f, + getHeight() - getEmptyBottomMargin() - stackY - mSidePaddings); + mAmbientState.setStackEndHeight(stackEndHeight); + mAmbientState.setStackHeight( + MathUtils.lerp(stackEndHeight * StackScrollAlgorithm.START_FRACTION, + stackEndHeight, fraction)); + } } void setOnStackYChanged(Runnable onStackYChanged) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java index d94d030f326e2..b2d39a952fe20 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java @@ -58,6 +58,7 @@ public class StackScrollAlgorithm { private int mStatusBarHeight; private float mHeadsUpInset; private int mPinnedZTranslationExtra; + private float mNotificationScrimPadding; public StackScrollAlgorithm( Context context, @@ -82,6 +83,7 @@ public class StackScrollAlgorithm { mPinnedZTranslationExtra = res.getDimensionPixelSize( R.dimen.heads_up_pinned_elevation); mGapHeight = res.getDimensionPixelSize(R.dimen.notification_section_divider_height); + mNotificationScrimPadding = res.getDimensionPixelSize(R.dimen.notification_side_paddings); } /** @@ -258,6 +260,9 @@ public class StackScrollAlgorithm { // expanded. Consider updating these states in updateContentView instead so that we don't // have to recalculate in every frame. float currentY = -scrollY; + if (!ambientState.isOnKeyguard()) { + currentY += mNotificationScrimPadding; + } float previousY = 0; state.firstViewInShelf = null; state.viewHeightBeforeShelf = -1; @@ -318,6 +323,9 @@ public class StackScrollAlgorithm { AmbientState ambientState) { // The y coordinate of the current child. float currentYPosition = -algorithmState.scrollY; + if (!ambientState.isOnKeyguard()) { + currentYPosition += mNotificationScrimPadding; + } int childCount = algorithmState.visibleChildren.size(); for (int i = 0; i < childCount; i++) { currentYPosition = updateChild(i, algorithmState, ambientState, currentYPosition); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java index c0d713b852876..357083d32ebb9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java @@ -2067,14 +2067,13 @@ public class NotificationPanelViewController extends PanelViewController { final int qsPanelBottomY = calculateQsBottomPosition(getQsExpansionFraction()); final boolean visible = (getQsExpansionFraction() > 0 || qsPanelBottomY > 0) && !mShouldUseSplitNotificationShade; - final float notificationTop = mAmbientState.getStackY() - - mNotificationScrimPadding - - mAmbientState.getScrollY(); + final float notificationTop = mAmbientState.getStackY() - mAmbientState.getScrollY(); setQsExpansionEnabled(mAmbientState.getScrollY() == 0); int radius = mScrimCornerRadius; if (!mShouldUseSplitNotificationShade) { - top = (int) Math.min(qsPanelBottomY, notificationTop); + top = (int) (isOnKeyguard() ? Math.min(qsPanelBottomY, notificationTop) + : notificationTop); bottom = getView().getBottom(); left = getView().getLeft(); right = getView().getRight();