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
Test: drag shade up during aod->ls transition
Change-Id: Ice6de1149b05564294e5c51308e962112cf4eda7
(cherry picked from commit 82596c5c5d)
This commit is contained in:
committed by
Steve Elliott
parent
9d2f3f9d1f
commit
52ebab8ffd
@@ -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)
|
||||
|
||||
@@ -1190,6 +1190,10 @@ public class NotificationStackScrollLayoutController {
|
||||
mView.setUnlockHintRunning(running);
|
||||
}
|
||||
|
||||
public void setPanelFlinging(boolean flinging) {
|
||||
mView.setPanelFlinging(flinging);
|
||||
}
|
||||
|
||||
public boolean isFooterViewNotGone() {
|
||||
return mView.isFooterViewNotGone();
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user