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
This commit is contained in:
Lucas Dupin
2021-09-03 16:49:26 -07:00
parent 3b6d65f7f3
commit 44fdbc81d7
7 changed files with 66 additions and 6 deletions

View File

@@ -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

View File

@@ -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() {

View File

@@ -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]

View File

@@ -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

View File

@@ -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();

View File

@@ -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()

View File

@@ -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 */,