From 44fdbc81d7b1bcb48d15fadadcb344f6358eaef8 Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Fri, 3 Sep 2021 16:49:26 -0700 Subject: [PATCH] Correctly clip QS during heads-up pull down Test: pull down heads-up Test: swipe-up heads-up Test: receive hun, wait for timeout Test: atest NotificationShadeDepthControllerTest Test: atest NotificationPanelViewControllerTest Fixes: 197641911 Fixes: 199527220 Change-Id: I47914698091aedfe7e4b1004039467de197194c7 --- .../NotificationShadeDepthController.kt | 10 ++++++++-- .../phone/NotificationPanelViewController.java | 18 +++++++++++++++++- .../systemui/statusbar/phone/PanelBar.java | 9 ++++++++- .../statusbar/phone/PanelViewController.java | 7 +++++++ .../statusbar/phone/PhoneStatusBarView.java | 3 ++- .../NotificationShadeDepthControllerTest.kt | 17 +++++++++++++++++ ...> NotificationPanelViewControllerTest.java} | 8 +++++++- 7 files changed, 66 insertions(+), 6 deletions(-) rename packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/{NotificationPanelViewTest.java => NotificationPanelViewControllerTest.java} (99%) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt index e8458040f448c..2a8771e96e7b6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt @@ -78,7 +78,8 @@ class NotificationShadeDepthController @Inject constructor( private var keyguardAnimator: Animator? = null private var notificationAnimator: Animator? = null private var updateScheduled: Boolean = false - private var shadeExpansion = 0f + @VisibleForTesting + var shadeExpansion = 0f private var isClosed: Boolean = true private var isOpen: Boolean = false private var isBlurred: Boolean = false @@ -92,6 +93,9 @@ class NotificationShadeDepthController @Inject constructor( // Only for dumpsys private var lastAppliedBlur = 0 + // Shade expansion offset that happens when pulling down on a HUN. + var panelPullDownMinFraction = 0f + var shadeAnimation = DepthAnimation() @VisibleForTesting @@ -312,8 +316,10 @@ class NotificationShadeDepthController @Inject constructor( /** * Update blurs when pulling down the shade */ - override fun onPanelExpansionChanged(expansion: Float, tracking: Boolean) { + override fun onPanelExpansionChanged(rawExpansion: Float, tracking: Boolean) { val timestamp = SystemClock.elapsedRealtimeNanos() + val expansion = MathUtils.saturate( + (rawExpansion - panelPullDownMinFraction) / (1f - panelPullDownMinFraction)) if (shadeExpansion == expansion && prevTracking == tracking) { prevTimestamp = timestamp 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 51d531ba56723..198ad98b8a376 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java @@ -582,6 +582,7 @@ public class NotificationPanelViewController extends PanelViewController { private int mQsClipBottom; private boolean mQsVisible; private final ContentResolver mContentResolver; + private float mMinFraction; private final Executor mUiExecutor; private final SecureSettings mSecureSettings; @@ -1777,6 +1778,15 @@ public class NotificationPanelViewController extends PanelViewController { return !mQsTouchAboveFalsingThreshold; } + /** + * Percentage of panel expansion offset, caused by pulling down on a heads-up. + */ + @Override + public void setMinFraction(float minFraction) { + mMinFraction = minFraction; + mDepthController.setPanelPullDownMinFraction(mMinFraction); + } + private float computeQsExpansionFraction() { if (mQSAnimatingHiddenFromCollapsed) { // When hiding QS from collapsed state, the expansion can sometimes temporarily @@ -2246,6 +2256,12 @@ public class NotificationPanelViewController extends PanelViewController { } } top += mOverStretchAmount; + // Correction for instant expansion caused by HUN pull down/ + if (mMinFraction > 0f && mMinFraction < 1f) { + float realFraction = + (getExpandedFraction() - mMinFraction) / (1f - mMinFraction); + top *= MathUtils.saturate(realFraction / mMinFraction); + } bottom = getView().getBottom(); // notification bounds should take full screen width regardless of insets left = 0; @@ -3313,7 +3329,7 @@ public class NotificationPanelViewController extends PanelViewController { } public void setPanelScrimMinFraction(float minFraction) { - mBar.panelScrimMinFractionChanged(minFraction); + mBar.onPanelMinFractionChanged(minFraction); } public void clearNotificationEffects() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java index f1b6c7c3ad193..eca91a3f6fb72 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java @@ -18,6 +18,7 @@ package com.android.systemui.statusbar.phone; import static java.lang.Float.isNaN; +import android.annotation.CallSuper; import android.content.Context; import android.os.Bundle; import android.os.Parcelable; @@ -162,7 +163,13 @@ public abstract class PanelBar extends FrameLayout { return mPanel == null || mPanel.getView().dispatchTouchEvent(event); } - public abstract void panelScrimMinFractionChanged(float minFraction); + /** + * Percentage of panel expansion offset, caused by pulling down on a heads-up. + */ + @CallSuper + public void onPanelMinFractionChanged(float minFraction) { + mPanel.setMinFraction(minFraction); + } /** * @param frac the fraction from the expansion in [0, 1] diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java index a3877b0eb5e63..51cae8c4af7f1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java @@ -339,6 +339,13 @@ public abstract class PanelViewController { protected abstract float getOpeningHeight(); + /** + * Minimum fraction from where expansion should start. This is set when pulling down on a + * heads-up notification. + * @param minFraction Fraction from 0 to 1. + */ + public abstract void setMinFraction(float minFraction); + /** * @return whether the swiping direction is upwards and above a 45 degree angle compared to the * horizontal direction diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java index 88a823c083d92..a09b30f41f498 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java @@ -273,10 +273,11 @@ public class PhoneStatusBarView extends PanelBar { } @Override - public void panelScrimMinFractionChanged(float minFraction) { + public void onPanelMinFractionChanged(float minFraction) { if (isNaN(minFraction)) { throw new IllegalArgumentException("minFraction cannot be NaN"); } + super.onPanelMinFractionChanged(minFraction); if (mMinFraction != minFraction) { mMinFraction = minFraction; updateScrimFraction(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationShadeDepthControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationShadeDepthControllerTest.kt index 7f72f194d9d96..465370b59553d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationShadeDepthControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationShadeDepthControllerTest.kt @@ -33,6 +33,7 @@ import com.android.systemui.statusbar.phone.DozeParameters import com.android.systemui.statusbar.phone.ScrimController import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.systemui.util.mockito.eq +import com.google.common.truth.Truth.assertThat import org.junit.Before import org.junit.Rule import org.junit.Test @@ -167,6 +168,22 @@ class NotificationShadeDepthControllerTest : SysuiTestCase() { verify(shadeAnimation).animateTo(eq(maxBlur), any()) } + @Test + fun onPanelExpansionChanged_respectsMinPanelPullDownFraction() { + notificationShadeDepthController.panelPullDownMinFraction = 0.5f + notificationShadeDepthController.onPanelExpansionChanged(0.5f /* expansion */, + true /* tracking */) + assertThat(notificationShadeDepthController.shadeExpansion).isEqualTo(0f) + + notificationShadeDepthController.onPanelExpansionChanged(0.75f /* expansion */, + true /* tracking */) + assertThat(notificationShadeDepthController.shadeExpansion).isEqualTo(0.5f) + + notificationShadeDepthController.onPanelExpansionChanged(1f /* expansion */, + true /* tracking */) + assertThat(notificationShadeDepthController.shadeExpansion).isEqualTo(1f) + } + @Test fun onStateChanged_reevalutesBlurs_ifSameRadiusAndNewState() { onPanelExpansionChanged_apliesBlur_ifShade() diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java similarity index 99% rename from packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java rename to packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java index 7fc36f82142df..33928ea783682 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java @@ -142,7 +142,7 @@ import java.util.List; @SmallTest @RunWith(AndroidTestingRunner.class) @TestableLooper.RunWithLooper -public class NotificationPanelViewTest extends SysuiTestCase { +public class NotificationPanelViewControllerTest extends SysuiTestCase { private static final int NOTIFICATION_SCRIM_TOP_PADDING_IN_SPLIT_SHADE = 50; @@ -471,6 +471,12 @@ public class NotificationPanelViewTest extends SysuiTestCase { .setHeadsUpAppearanceController(mock(HeadsUpAppearanceController.class)); } + @Test + public void testSetMinFraction() { + mNotificationPanelViewController.setMinFraction(0.5f); + verify(mNotificationShadeDepthController).setPanelPullDownMinFraction(eq(0.5f)); + } + @Test public void testSetDozing_notifiesNsslAndStateController() { mNotificationPanelViewController.setDozing(true /* dozing */, false /* animate */,