summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff DeCew <jeffdq@google.com>2022-06-08 19:11:50 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2022-07-21 03:27:40 +0000
commitedcb214c8a26d3e5e5a3e4b4b6c520d4c84bfc0d (patch)
tree506a4fdf2eb0f508d6b408a38b53d97d79fad1c5
parent61e079266734ec5fb8b73de1b80f14e09abc2507 (diff)
downloadbase-edcb214c8a26d3e5e5a3e4b4b6c520d4c84bfc0d.tar.gz
Fix squished notifications on the lockscreen.
This fixes a stale state caused when stack height is not recalculated after being frozen. NSSL uses shouldSkipHeightUpdate() to prevent the stack height from being recalculated during various animations and gestures, but we didn't correctly trigger a recalculation after that 'freeze', so this CL adds the necessary recalculation at those transition points to prevent the old stack height from persisting until the next update. This also fixes a visual jump when unfreezing the stack height if it was frozen while the appear fraction was still changing. This jump is fixed by allowing the appear fraction to continue to apply and update the stackHeight (from the stackEndHeight) even while the stackEndHeight is frozen. Fixes: 235366457 Bug: 234824085 Test: drag shade up during aod->ls transition Change-Id: Ice6de1149b05564294e5c51308e962112cf4eda7 (cherry picked from commit 82596c5c5dd6c11da61000a17488615bfe12b01d) (cherry picked from commit c29777f4059da03ac663c3cc5b61d0f011aac8bb) Merged-In: Ice6de1149b05564294e5c51308e962112cf4eda7
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java28
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java76
4 files changed, 106 insertions, 6 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 c9d70d1ad44c..e2ed1d83530b 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
@@ -1323,10 +1323,24 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable
if (mOnStackYChanged != null) {
mOnStackYChanged.accept(listenerNeedsAnimation);
}
+ updateStackEndHeightAndStackHeight(fraction);
+ }
+
+ @VisibleForTesting
+ public void updateStackEndHeightAndStackHeight(float fraction) {
+ final float oldStackHeight = mAmbientState.getStackHeight();
if (mQsExpansionFraction <= 0 && !shouldSkipHeightUpdate()) {
final float endHeight = updateStackEndHeight(
getHeight(), getEmptyBottomMargin(), mTopPadding);
updateStackHeight(endHeight, fraction);
+ } else {
+ // Always updateStackHeight to prevent jumps in the stack height when this fraction
+ // suddenly reapplies after a freeze.
+ final float endHeight = mAmbientState.getStackEndHeight();
+ updateStackHeight(endHeight, fraction);
+ }
+ if (oldStackHeight != mAmbientState.getStackHeight()) {
+ requestChildrenUpdate();
}
}
@@ -1343,6 +1357,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable
return stackEndHeight;
}
+ @VisibleForTesting
public void updateStackHeight(float endHeight, float fraction) {
// During the (AOD<=>LS) transition where dozeAmount is changing,
// apply dozeAmount to stack height instead of expansionFraction
@@ -5041,6 +5056,19 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable
@ShadeViewRefactor(RefactorComponent.SHADE_VIEW)
public void setUnlockHintRunning(boolean running) {
mAmbientState.setUnlockHintRunning(running);
+ if (!running) {
+ // re-calculate the stack height which was frozen while running this animation
+ updateStackPosition();
+ }
+ }
+
+ @ShadeViewRefactor(RefactorComponent.SHADE_VIEW)
+ public void setPanelFlinging(boolean flinging) {
+ mAmbientState.setIsFlinging(flinging);
+ if (!flinging) {
+ // re-calculate the stack height which was frozen while flinging
+ updateStackPosition();
+ }
}
@ShadeViewRefactor(RefactorComponent.SHADE_VIEW)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java
index 2493ccbe5a48..010e6cf90817 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java
@@ -1190,6 +1190,10 @@ public class NotificationStackScrollLayoutController {
mView.setUnlockHintRunning(running);
}
+ public void setPanelFlinging(boolean flinging) {
+ mView.setPanelFlinging(flinging);
+ }
+
public boolean isFooterViewNotGone() {
return mView.isFooterViewNotGone();
}
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 2cac0017db9c..3580fe6cdbc5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
@@ -1782,14 +1782,14 @@ public class NotificationPanelViewController extends PanelViewController {
mHeadsUpTouchHelper.notifyFling(!expand);
mKeyguardStateController.notifyPanelFlingStart(!expand /* flingingToDismiss */);
setClosingWithAlphaFadeout(!expand && !isOnKeyguard() && getFadeoutAlpha() == 1.0f);
- mAmbientState.setIsFlinging(true);
+ mNotificationStackScrollLayoutController.setPanelFlinging(true);
super.flingToHeight(vel, expand, target, collapseSpeedUpFactor, expandBecauseOfFalsing);
}
@Override
protected void onFlingEnd(boolean cancelled) {
super.onFlingEnd(cancelled);
- mAmbientState.setIsFlinging(false);
+ mNotificationStackScrollLayoutController.setPanelFlinging(false);
}
private boolean onQsIntercept(MotionEvent event) {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java
index f5fe6f3a1a5f..b83743c90623 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java
@@ -39,6 +39,7 @@ import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -122,12 +123,12 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase {
allowTestableLooperAsMainThread();
// Interact with real instance of AmbientState.
- mAmbientState = new AmbientState(
+ mAmbientState = spy(new AmbientState(
mContext,
mDumpManager,
mNotificationSectionsManager,
mBypassController,
- mStatusBarKeyguardViewManager);
+ mStatusBarKeyguardViewManager));
// Inject dependencies before initializing the layout
mDependency.injectTestDependency(SysuiStatusBarStateController.class, mBarState);
@@ -190,7 +191,7 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase {
endHeight, dozeAmount);
mStackScroller.updateStackHeight(endHeight, expansionFraction);
- assertTrue(mAmbientState.getStackHeight() == expected);
+ assertThat(mAmbientState.getStackHeight()).isEqualTo(expected);
}
@Test
@@ -205,7 +206,74 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase {
endHeight, expansionFraction);
mStackScroller.updateStackHeight(endHeight, expansionFraction);
- assertTrue(mAmbientState.getStackHeight() == expected);
+ assertThat(mAmbientState.getStackHeight()).isEqualTo(expected);
+ }
+
+ @Test
+ public void updateStackEndHeightAndStackHeight_normallyUpdatesBoth() {
+ final float expansionFraction = 0.5f;
+ mAmbientState.setStatusBarState(StatusBarState.KEYGUARD);
+
+ // Validate that by default we update everything
+ clearInvocations(mAmbientState);
+ mStackScroller.updateStackEndHeightAndStackHeight(expansionFraction);
+ verify(mAmbientState).setStackEndHeight(anyFloat());
+ verify(mAmbientState).setStackHeight(anyFloat());
+ }
+
+ @Test
+ public void updateStackEndHeightAndStackHeight_onlyUpdatesStackHeightDuringSwipeUp() {
+ final float expansionFraction = 0.5f;
+ mAmbientState.setStatusBarState(StatusBarState.KEYGUARD);
+ mAmbientState.setSwipingUp(true);
+
+ // Validate that when the gesture is in progress, we update only the stackHeight
+ clearInvocations(mAmbientState);
+ mStackScroller.updateStackEndHeightAndStackHeight(expansionFraction);
+ verify(mAmbientState, never()).setStackEndHeight(anyFloat());
+ verify(mAmbientState).setStackHeight(anyFloat());
+ }
+
+ @Test
+ public void setPanelFlinging_updatesStackEndHeightOnlyOnFinish() {
+ final float expansionFraction = 0.5f;
+ mAmbientState.setStatusBarState(StatusBarState.KEYGUARD);
+ mAmbientState.setSwipingUp(true);
+ mStackScroller.setPanelFlinging(true);
+ mAmbientState.setSwipingUp(false);
+
+ // Validate that when the animation is running, we update only the stackHeight
+ clearInvocations(mAmbientState);
+ mStackScroller.updateStackEndHeightAndStackHeight(expansionFraction);
+ verify(mAmbientState, never()).setStackEndHeight(anyFloat());
+ verify(mAmbientState).setStackHeight(anyFloat());
+
+ // Validate that when the animation ends the stackEndHeight is recalculated immediately
+ clearInvocations(mAmbientState);
+ mStackScroller.setPanelFlinging(false);
+ verify(mAmbientState).setIsFlinging(eq(false));
+ verify(mAmbientState).setStackEndHeight(anyFloat());
+ verify(mAmbientState).setStackHeight(anyFloat());
+ }
+
+ @Test
+ public void setUnlockHintRunning_updatesStackEndHeightOnlyOnFinish() {
+ final float expansionFraction = 0.5f;
+ mAmbientState.setStatusBarState(StatusBarState.KEYGUARD);
+ mStackScroller.setUnlockHintRunning(true);
+
+ // Validate that when the animation is running, we update only the stackHeight
+ clearInvocations(mAmbientState);
+ mStackScroller.updateStackEndHeightAndStackHeight(expansionFraction);
+ verify(mAmbientState, never()).setStackEndHeight(anyFloat());
+ verify(mAmbientState).setStackHeight(anyFloat());
+
+ // Validate that when the animation ends the stackEndHeight is recalculated immediately
+ clearInvocations(mAmbientState);
+ mStackScroller.setUnlockHintRunning(false);
+ verify(mAmbientState).setUnlockHintRunning(eq(false));
+ verify(mAmbientState).setStackEndHeight(anyFloat());
+ verify(mAmbientState).setStackHeight(anyFloat());
}
@Test