Fix one-icon shelf flicker after lockscreen swipe-down-and-let-go

How the flicker happens:
- As we return to lockscreen after swipe down, fractionToShade
decreases, so sectionGap decreases.
- In NSSL#setFractionToShade, we don't immediately update
stackHeight with the smaller sectionGap, so the requested
children update works with the bigger stackHeight from before.
- However, StackScrollAlgorithm#updateChild uses the
updated (smaller) sectionGap, resulting in more room such that
the last notification shows partially above the shelf.
- The shelf no longer has a full view so it hides.

This change adds the missing call to updateContentHeight
after fractionToShade changes.

Bug: 222123657
Test: NotificationStackScrollLayoutTest
Test: on lockscreen, have one icon in shelf,
      swipe down and let go
      => shelf and last notification do not flicker
Change-Id: I59a6564b73c1acf15a046db403a185bdaaa5fafe
This commit is contained in:
Lyn Han
2022-05-05 17:22:30 -05:00
parent 1c88a2be52
commit 6b5a9fd911
2 changed files with 9 additions and 0 deletions

View File

@@ -5513,6 +5513,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable
*/
public void setFractionToShade(float fraction) {
mAmbientState.setFractionToShade(fraction);
updateContentHeight(); // Recompute stack height with different section gap.
requestChildrenUpdate();
}

View File

@@ -31,6 +31,8 @@ import static junit.framework.Assert.assertTrue;
import static org.junit.Assert.assertFalse;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyFloat;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.clearInvocations;
@@ -612,6 +614,12 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase {
assertTrue(mStackScroller.isInsideQsHeader(event2));
}
@Test
public void setFractionToShade_recomputesStackHeight() {
mStackScroller.setFractionToShade(1f);
verify(mNotificationStackSizeCalculator).computeHeight(any(), anyInt(), anyFloat());
}
private void setBarStateForTest(int state) {
// Can't inject this through the listener or we end up on the actual implementation
// rather than the mock because the spy just coppied the anonymous inner /shruggie.