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

Commit dfd9f177 authored by Steve Elliott's avatar Steve Elliott
Browse files

Ignore GONE views in shade when processing sections

Fixes: 161606040
Test: atest
Change-Id: I8ab108aea23ea6a139f758abdaf222f5f3641104
parent e303dd65
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -326,6 +326,7 @@ class NotificationSectionsManager @Inject internal constructor(
        // shade.
        for (i in parent.childCount - 1 downTo -1) {
            val child: View? = parent.getChildAt(i)

            child?.let {
                logShadeChild(i, child)
                // If this child is a header, update the tracked positions
@@ -339,7 +340,8 @@ class NotificationSectionsManager @Inject internal constructor(
                }
            }

            val row = child as? ExpandableNotificationRow
            val row = (child as? ExpandableNotificationRow)
                    ?.takeUnless { it.visibility == View.GONE }

            // Is there a section discontinuity? This usually occurs due to HUNs
            inIncomingSection = inIncomingSection || nextBucket?.let { next ->
@@ -386,7 +388,7 @@ class NotificationSectionsManager @Inject internal constructor(

            // Offset the target to account for the current position of the people header.
            peopleState?.targetPosition = peopleState?.currentPosition?.let { current ->
                peopleState?.targetPosition?.let { target ->
                peopleState.targetPosition?.let { target ->
                    if (current < target) target - 1 else target
                }
            }
+47 −38
Original line number Diff line number Diff line
@@ -380,7 +380,7 @@ public class NotificationSectionsManagerTest extends SysuiTestCase {

        setupMockStack(
                PEOPLE_HEADER,
                ALERTING.headsUp(),
                ALERTING,
                PERSON,
                ALERTING_HEADER,
                GENTLE_HEADER,
@@ -403,9 +403,9 @@ public class NotificationSectionsManagerTest extends SysuiTestCase {
        enablePeopleFiltering();

        setupMockStack(
                PERSON.headsUp(),
                PERSON,
                INCOMING_HEADER,
                ALERTING.headsUp(),
                ALERTING,
                PEOPLE_HEADER,
                PERSON
        );
@@ -425,7 +425,7 @@ public class NotificationSectionsManagerTest extends SysuiTestCase {
        enablePeopleFiltering();

        setupMockStack(
                PERSON.headsUp(),
                PERSON,
                PEOPLE_HEADER,
                PERSON
        );
@@ -443,8 +443,8 @@ public class NotificationSectionsManagerTest extends SysuiTestCase {
        enablePeopleFiltering();

        setupMockStack(
                ALERTING.headsUp(),
                PERSON.headsUp()
                ALERTING,
                PERSON
        );
        mSectionsManager.updateSectionBoundaries();
        verifyMockStack(
@@ -461,7 +461,7 @@ public class NotificationSectionsManagerTest extends SysuiTestCase {

        setupMockStack(
                INCOMING_HEADER,
                ALERTING.headsUp(),
                ALERTING,
                PEOPLE_HEADER,
                FSN,
                PERSON,
@@ -502,9 +502,9 @@ public class NotificationSectionsManagerTest extends SysuiTestCase {
    public void testMediaControls_AddWhenEnterKeyguardWithHeadsUp() {
        enableMediaControls();

        // GIVEN a stack that doesn't include media controls but includes HEADS_UP
        // GIVEN a stack that doesn't include media
        setupMockStack(
                ALERTING.headsUp(),
                ALERTING,
                ALERTING,
                GENTLE_HEADER,
                GENTLE);
@@ -584,6 +584,27 @@ public class NotificationSectionsManagerTest extends SysuiTestCase {
        );
    }

    @Test
    public void testIgnoreGoneView() {
        enablePeopleFiltering();

        setupMockStack(
                PERSON.gone(),
                ALERTING,
                GENTLE
        );

        mSectionsManager.updateSectionBoundaries();

        verifyMockStack(
                ChildType.ALERTING_HEADER,
                ChildType.PERSON,
                ChildType.ALERTING,
                ChildType.GENTLE_HEADER,
                ChildType.GENTLE
        );
    }

    private void enablePeopleFiltering() {
        when(mSectionsFeatureManager.isFilteringEnabled()).thenReturn(true);
    }
@@ -619,16 +640,16 @@ public class NotificationSectionsManagerTest extends SysuiTestCase {
                    child = mSectionsManager.getSilentHeaderView();
                    break;
                case FSN:
                    child = mockNotification(BUCKET_FOREGROUND_SERVICE, entry.mIsHeadsUp);
                    child = mockNotification(BUCKET_FOREGROUND_SERVICE, entry.mIsGone);
                    break;
                case PERSON:
                    child = mockNotification(BUCKET_PEOPLE, entry.mIsHeadsUp);
                    child = mockNotification(BUCKET_PEOPLE, entry.mIsGone);
                    break;
                case ALERTING:
                    child = mockNotification(BUCKET_ALERTING, entry.mIsHeadsUp);
                    child = mockNotification(BUCKET_ALERTING, entry.mIsGone);
                    break;
                case GENTLE:
                    child = mockNotification(BUCKET_SILENT, entry.mIsHeadsUp);
                    child = mockNotification(BUCKET_SILENT, entry.mIsGone);
                    break;
                case OTHER:
                    child = mock(View.class);
@@ -643,7 +664,7 @@ public class NotificationSectionsManagerTest extends SysuiTestCase {
        }
    }

    private View mockNotification(int bucket, boolean headsUp) {
    private View mockNotification(int bucket, boolean isGone) {
        ExpandableNotificationRow notifRow =
                mock(ExpandableNotificationRow.class, RETURNS_DEEP_STUBS);
        when(notifRow.getVisibility()).thenReturn(View.VISIBLE);
@@ -659,8 +680,7 @@ public class NotificationSectionsManagerTest extends SysuiTestCase {
            return null;
        }).when(mockEntry).setBucket(anyInt());

        when(notifRow.isHeadsUp()).thenReturn(headsUp);
        when(mockEntry.isRowHeadsUp()).thenReturn(headsUp);
        when(notifRow.getVisibility()).thenReturn(isGone ? View.GONE : View.VISIBLE);
        return notifRow;
    }

@@ -767,16 +787,16 @@ public class NotificationSectionsManagerTest extends SysuiTestCase {
                    child = mSectionsManager.getSilentHeaderView();
                    break;
                case FSN:
                    child = mockNotification(BUCKET_FOREGROUND_SERVICE, entry.mIsHeadsUp);
                    child = mockNotification(BUCKET_FOREGROUND_SERVICE, entry.mIsGone);
                    break;
                case PERSON:
                    child = mockNotification(BUCKET_PEOPLE, entry.mIsHeadsUp);
                    child = mockNotification(BUCKET_PEOPLE, entry.mIsGone);
                    break;
                case ALERTING:
                    child = mockNotification(BUCKET_ALERTING, entry.mIsHeadsUp);
                    child = mockNotification(BUCKET_ALERTING, entry.mIsGone);
                    break;
                case GENTLE:
                    child = mockNotification(BUCKET_SILENT, entry.mIsHeadsUp);
                    child = mockNotification(BUCKET_SILENT, entry.mIsGone);
                    break;
                case OTHER:
                    child = mock(View.class);
@@ -796,36 +816,25 @@ public class NotificationSectionsManagerTest extends SysuiTestCase {
    private static final StackEntry ALERTING_HEADER = new StackEntry(ChildType.ALERTING_HEADER);
    private static final StackEntry GENTLE_HEADER = new StackEntry(ChildType.GENTLE_HEADER);
    private static final StackEntry FSN = new StackEntry(ChildType.FSN);
    private static final StackEntry.Hunnable PERSON = new StackEntry.Hunnable(ChildType.PERSON);
    private static final StackEntry.Hunnable ALERTING = new StackEntry.Hunnable(ChildType.ALERTING);
    private static final StackEntry PERSON = new StackEntry(ChildType.PERSON);
    private static final StackEntry ALERTING = new StackEntry(ChildType.ALERTING);
    private static final StackEntry GENTLE = new StackEntry(ChildType.GENTLE);

    private static class StackEntry {
        final ChildType mChildType;
        final boolean mIsHeadsUp;
        final boolean mIsGone;

        StackEntry(ChildType childType) {
            this(childType, false);
        }

        StackEntry(ChildType childType, boolean isHeadsUp) {
        StackEntry(ChildType childType, boolean isGone) {
            mChildType = childType;
            mIsHeadsUp = isHeadsUp;
        }

        static class Hunnable extends StackEntry {

            Hunnable(ChildType childType) {
                super(childType, false);
            }

            Hunnable(ChildType childType, boolean isHeadsUp) {
                super(childType, isHeadsUp);
            mIsGone = isGone;
        }

            public Hunnable headsUp() {
                return new Hunnable(mChildType, true);
            }
        public StackEntry gone() {
            return new StackEntry(mChildType, true);
        }
    }
}