Increase defensiveness of Incoming Header placement

This change removes the assumption that Silent notifications won't be
out of place in the ranking order. Technically, silent notifs will
never HUN, and so they should always be sorted to the bottom, but
we've seen situations where that is not the case.

Bug: 157764732
Test: manual, atest
Change-Id: Ib90f704c3b3fa290c87f8a45888424ed55d61d52
This commit is contained in:
Steve Elliott
2020-06-01 14:06:31 -04:00
parent dc9e545bd1
commit 49e41617ef
2 changed files with 36 additions and 19 deletions

View File

@@ -287,21 +287,17 @@ class NotificationSectionsManager @Inject internal constructor(
// Is there a section discontinuity? This usually occurs due to HUNs
if (prev?.entry?.bucket?.let { it > child.entry.bucket } == true) {
// Remove existing headers, and move the Incoming header if necessary
if (alertingHeaderTarget != -1) {
if (showHeaders && incomingHeaderTarget != -1) {
incomingHeaderTarget = alertingHeaderTarget
}
alertingHeaderTarget = -1
}
if (peopleHeaderTarget != -1) {
if (showHeaders && incomingHeaderTarget != -1) {
incomingHeaderTarget = peopleHeaderTarget
}
peopleHeaderTarget = -1
}
if (showHeaders && incomingHeaderTarget == -1) {
incomingHeaderTarget = 0
incomingHeaderTarget = when {
!showHeaders -> -1
incomingHeaderTarget != -1 -> incomingHeaderTarget
peopleHeaderTarget != -1 -> peopleHeaderTarget
alertingHeaderTarget != -1 -> alertingHeaderTarget
gentleHeaderTarget != -1 -> gentleHeaderTarget
else -> 0
}
peopleHeaderTarget = -1
alertingHeaderTarget = -1
gentleHeaderTarget = -1
// Walk backwards changing all previous notifications to the Incoming
// section
for (j in i - 1 downTo lastIncomingIndex + 1) {
@@ -323,6 +319,9 @@ class NotificationSectionsManager @Inject internal constructor(
peopleHeaderTarget = i
// Offset the target if there are other headers before this that
// will be moved.
if (currentIncomingHeaderIdx != -1 && incomingHeaderTarget == -1) {
peopleHeaderTarget--
}
if (currentPeopleHeaderIdx != -1) {
peopleHeaderTarget--
}
@@ -340,6 +339,13 @@ class NotificationSectionsManager @Inject internal constructor(
alertingHeaderTarget = i
// Offset the target if there are other headers before this that
// will be moved.
if (currentIncomingHeaderIdx != -1 && incomingHeaderTarget == -1) {
alertingHeaderTarget--
}
if (currentPeopleHeaderIdx != -1 && peopleHeaderTarget == -1) {
// People header will be removed
alertingHeaderTarget--
}
if (currentAlertingHeaderIdx != -1) {
alertingHeaderTarget--
}
@@ -354,6 +360,17 @@ class NotificationSectionsManager @Inject internal constructor(
gentleHeaderTarget = i
// Offset the target if there are other headers before this that
// will be moved.
if (currentIncomingHeaderIdx != -1 && incomingHeaderTarget == -1) {
gentleHeaderTarget--
}
if (currentPeopleHeaderIdx != -1 && peopleHeaderTarget == -1) {
// People header will be removed
gentleHeaderTarget--
}
if (currentAlertingHeaderIdx != -1 && alertingHeaderTarget == -1) {
// Alerting header will be removed
gentleHeaderTarget--
}
if (currentGentleHeaderIdx != -1) {
gentleHeaderTarget--
}

View File

@@ -403,11 +403,11 @@ public class NotificationSectionsManagerTest extends SysuiTestCase {
enablePeopleFiltering();
setupMockStack(
PERSON.headsUp(),
INCOMING_HEADER,
ALERTING.headsUp(),
PEOPLE_HEADER,
PERSON
PERSON.headsUp(), // personHeaderTarget = 0
INCOMING_HEADER, // currentIncomingHeaderIdx = 1
ALERTING.headsUp(), // alertingHeaderTarget = 1
PEOPLE_HEADER, // currentPeopleHeaderIdx = 3
PERSON //
);
mSectionsManager.updateSectionBoundaries();