diff --git a/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java b/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java index 9f467074d473e..07c8e52e7a6c8 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java @@ -25,6 +25,7 @@ import static com.android.systemui.shade.NotificationPanelViewController.FLING_E import static com.android.systemui.shade.NotificationPanelViewController.FLING_HIDE; import static com.android.systemui.shade.NotificationPanelViewController.QS_PARALLAX_AMOUNT; import static com.android.systemui.statusbar.StatusBarState.KEYGUARD; +import static com.android.systemui.statusbar.StatusBarState.SHADE; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -258,6 +259,12 @@ public class QuickSettingsController { /** The duration of the notification bounds animation. */ private long mNotificationBoundsAnimationDuration; + /** TODO(b/273591201): remove after bug resolved */ + private int mLastClippingTopBound; + private int mLastNotificationsTopPadding; + private int mLastNotificationsClippingTopBound; + private int mLastNotificationsClippingTopBoundNssl; + private final Region mInterceptRegion = new Region(); /** The end bounds of a clipping animation. */ private final Rect mClippingAnimationEndBounds = new Rect(); @@ -643,7 +650,7 @@ public class QuickSettingsController { float appearAmount = mNotificationStackScrollLayoutController .calculateAppearFraction(mShadeExpandedHeight); float startHeight = -getExpansionHeight(); - if (mBarState == StatusBarState.SHADE) { + if (mBarState == SHADE) { // Small parallax as we pull down and clip QS startHeight = -getExpansionHeight() * QS_PARALLAX_AMOUNT; } @@ -1123,6 +1130,7 @@ public class QuickSettingsController { mClippingAnimationEndBounds.left, fraction); int animTop = (int) MathUtils.lerp(startTop, mClippingAnimationEndBounds.top, fraction); + logClippingTopBound("interpolated top bound", top); int animRight = (int) MathUtils.lerp(startRight, mClippingAnimationEndBounds.right, fraction); int animBottom = (int) MathUtils.lerp(startBottom, @@ -1243,6 +1251,8 @@ public class QuickSettingsController { // the screen without clipping. return -mAmbientState.getStackTopMargin(); } else { + logNotificationsClippingTopBound(qsTop, + mNotificationStackScrollLayoutController.getTop()); return qsTop - mNotificationStackScrollLayoutController.getTop(); } } @@ -1265,6 +1275,7 @@ public class QuickSettingsController { /** Calculate top padding for notifications */ public float calculateNotificationsTopPadding(boolean isShadeExpanding, int keyguardNotificationStaticPadding, float expandedFraction) { + float topPadding; boolean keyguardShowing = mBarState == KEYGUARD; if (mSplitShadeEnabled) { return keyguardShowing @@ -1281,19 +1292,27 @@ public class QuickSettingsController { int maxQsPadding = getMaxExpansionHeight(); int max = keyguardShowing ? Math.max( keyguardNotificationStaticPadding, maxQsPadding) : maxQsPadding; - return (int) MathUtils.lerp((float) getMinExpansionHeight(), + topPadding = (int) MathUtils.lerp((float) getMinExpansionHeight(), (float) max, expandedFraction); + logNotificationsTopPadding("keyguard and expandImmediate", topPadding); + return topPadding; } else if (isSizeChangeAnimationRunning()) { - return Math.max((int) mSizeChangeAnimator.getAnimatedValue(), + topPadding = Math.max((int) mSizeChangeAnimator.getAnimatedValue(), keyguardNotificationStaticPadding); + logNotificationsTopPadding("size change animation running", topPadding); + return topPadding; } else if (keyguardShowing) { // We can only do the smoother transition on Keyguard when we also are not collapsing // from a scrolled quick settings. - return MathUtils.lerp((float) keyguardNotificationStaticPadding, + topPadding = MathUtils.lerp((float) keyguardNotificationStaticPadding, (float) (getMaxExpansionHeight()), computeExpansionFraction()); + logNotificationsTopPadding("keyguard", topPadding); + return topPadding; } else { - return mQsFrameTranslateController.getNotificationsTopPadding( + topPadding = mQsFrameTranslateController.getNotificationsTopPadding( mExpansionHeight, mNotificationStackScrollLayoutController); + logNotificationsTopPadding("default case", topPadding); + return topPadding; } } @@ -1340,6 +1359,38 @@ public class QuickSettingsController { - mAmbientState.getScrollY()); } + /** TODO(b/273591201): remove after bug resolved */ + private void logNotificationsTopPadding(String message, float rawPadding) { + int padding = ((int) rawPadding / 10) * 10; + if (mBarState != KEYGUARD && padding != mLastNotificationsTopPadding && !mExpanded) { + mLastNotificationsTopPadding = padding; + mShadeLog.logNotificationsTopPadding(message, padding); + } + } + + /** TODO(b/273591201): remove after bug resolved */ + private void logClippingTopBound(String message, int top) { + top = (top / 10) * 10; + if (mBarState != KEYGUARD && mShadeExpandedFraction == 1 + && top != mLastClippingTopBound && !mExpanded) { + mLastClippingTopBound = top; + mShadeLog.logClippingTopBound(message, top); + } + } + + /** TODO(b/273591201): remove after bug resolved */ + private void logNotificationsClippingTopBound(int top, int nsslTop) { + top = (top / 10) * 10; + nsslTop = (nsslTop / 10) * 10; + if (mBarState == SHADE && mShadeExpandedFraction == 1 + && (top != mLastNotificationsClippingTopBound + || nsslTop != mLastNotificationsClippingTopBoundNssl) && !mExpanded) { + mLastNotificationsClippingTopBound = top; + mLastNotificationsClippingTopBoundNssl = nsslTop; + mShadeLog.logNotificationsClippingTopBound(top, nsslTop); + } + } + private int calculateTopClippingBound(int qsPanelBottomY) { int top; if (mSplitShadeEnabled) { @@ -1349,6 +1400,7 @@ public class QuickSettingsController { // If we're transitioning, let's use the actual value. The else case // can be wrong during transitions when waiting for the keyguard to unlock top = mTransitionToFullShadePosition; + logClippingTopBound("set while transitioning to full shade", top); } else { final float notificationTop = getEdgePosition(); if (mBarState == KEYGUARD) { @@ -1357,8 +1409,10 @@ public class QuickSettingsController { // this should go away once we unify the stackY position and don't have // to do this min anymore below. top = qsPanelBottomY; + logClippingTopBound("bypassing keyguard", top); } else { top = (int) Math.min(qsPanelBottomY, notificationTop); + logClippingTopBound("keyguard default case", top); } } else { top = (int) notificationTop; @@ -1366,12 +1420,14 @@ public class QuickSettingsController { } // TODO (b/265193930): remove dependency on NPVC top += mPanelViewControllerLazy.get().getOverStretchAmount(); + logClippingTopBound("including overstretch", top); // Correction for instant expansion caused by HUN pull down/ float minFraction = mPanelViewControllerLazy.get().getMinFraction(); if (minFraction > 0f && minFraction < 1f) { float realFraction = (mShadeExpandedFraction - minFraction) / (1f - minFraction); top *= MathUtils.saturate(realFraction / minFraction); + logClippingTopBound("after adjusted fraction", top); } } return top; diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeLogger.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeLogger.kt index d34e127b194b1..da4944c20f6e2 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ShadeLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeLogger.kt @@ -280,4 +280,40 @@ class ShadeLogger @Inject constructor(@ShadeLog private val buffer: LogBuffer) { { "Split shade state changed: split shade ${if (bool1) "enabled" else "disabled"}" } ) } + + fun logNotificationsTopPadding(message: String, padding: Int) { + buffer.log( + TAG, + LogLevel.VERBOSE, + { + str1 = message + int1 = padding + }, + { "QSC NotificationsTopPadding $str1: $int1"} + ) + } + + fun logClippingTopBound(message: String, top: Int) { + buffer.log( + TAG, + LogLevel.VERBOSE, + { + str1 = message + int1 = top + }, + { "QSC ClippingTopBound $str1: $int1" } + ) + } + + fun logNotificationsClippingTopBound(top: Int, nsslTop: Int) { + buffer.log( + TAG, + LogLevel.VERBOSE, + { + int1 = top + int2 = nsslTop + }, + { "QSC NotificationsClippingTopBound set to $int1 - $int2" } + ) + } }