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:
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user