Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6b5a9fd9 authored by Lyn Han's avatar Lyn Han
Browse files

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
parent 1c88a2be
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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();
    }

+8 −0
Original line number Diff line number Diff line
@@ -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.