Merge "Clean up STABILITY_INDEX_FIX and SEMI_STABLE_SORT flags which have already been released." into tm-qpr-dev

This commit is contained in:
Jeff DeCew
2023-01-17 19:26:18 +00:00
committed by Android (Google) Code Review
5 changed files with 13 additions and 180 deletions

View File

@@ -77,12 +77,6 @@ object Flags {
// TODO(b/254512731): Tracking Bug // TODO(b/254512731): Tracking Bug
@JvmField val NOTIFICATION_DISMISSAL_FADE = releasedFlag(113, "notification_dismissal_fade") @JvmField val NOTIFICATION_DISMISSAL_FADE = releasedFlag(113, "notification_dismissal_fade")
// TODO(b/259558771): Tracking Bug
val STABILITY_INDEX_FIX = releasedFlag(114, "stability_index_fix")
// TODO(b/259559750): Tracking Bug
val SEMI_STABLE_SORT = releasedFlag(115, "semi_stable_sort")
@JvmField val USE_ROUNDNESS_SOURCETYPES = releasedFlag(116, "use_roundness_sourcetype") @JvmField val USE_ROUNDNESS_SOURCETYPES = releasedFlag(116, "use_roundness_sourcetype")
// TODO(b/259217907) // TODO(b/259217907)

View File

@@ -35,14 +35,6 @@ class NotifPipelineFlags @Inject constructor(
fun fsiOnDNDUpdate(): Boolean = featureFlags.isEnabled(Flags.FSI_ON_DND_UPDATE) fun fsiOnDNDUpdate(): Boolean = featureFlags.isEnabled(Flags.FSI_ON_DND_UPDATE)
val isStabilityIndexFixEnabled: Boolean by lazy {
featureFlags.isEnabled(Flags.STABILITY_INDEX_FIX)
}
val isSemiStableSortEnabled: Boolean by lazy {
featureFlags.isEnabled(Flags.SEMI_STABLE_SORT)
}
val shouldFilterUnseenNotifsOnKeyguard: Boolean by lazy { val shouldFilterUnseenNotifsOnKeyguard: Boolean by lazy {
featureFlags.isEnabled(Flags.FILTER_UNSEEN_NOTIFS_ON_KEYGUARD) featureFlags.isEnabled(Flags.FILTER_UNSEEN_NOTIFS_ON_KEYGUARD)
} }

View File

@@ -98,14 +98,12 @@ data class ListAttachState private constructor(
* This can happen if the entry is removed from a group that was broken up or if the entry was * This can happen if the entry is removed from a group that was broken up or if the entry was
* filtered out during any of the filtering steps. * filtered out during any of the filtering steps.
*/ */
fun detach(includingStableIndex: Boolean) { fun detach() {
parent = null parent = null
section = null section = null
promoter = null promoter = null
if (includingStableIndex) {
stableIndex = -1 stableIndex = -1
} }
}
companion object { companion object {
@JvmStatic @JvmStatic

View File

@@ -965,8 +965,7 @@ public class ShadeListBuilder implements Dumpable, PipelineDumpable {
* filtered out during any of the filtering steps. * filtered out during any of the filtering steps.
*/ */
private void annulAddition(ListEntry entry) { private void annulAddition(ListEntry entry) {
// NOTE(b/241229236): Don't clear stableIndex until we fix stability fragility entry.getAttachState().detach();
entry.getAttachState().detach(/* includingStableIndex= */ mFlags.isSemiStableSortEnabled());
} }
private void assignSections() { private void assignSections() {
@@ -986,50 +985,10 @@ public class ShadeListBuilder implements Dumpable, PipelineDumpable {
private void sortListAndGroups() { private void sortListAndGroups() {
Trace.beginSection("ShadeListBuilder.sortListAndGroups"); Trace.beginSection("ShadeListBuilder.sortListAndGroups");
if (mFlags.isSemiStableSortEnabled()) {
sortWithSemiStableSort(); sortWithSemiStableSort();
} else {
sortWithLegacyStability();
}
Trace.endSection(); Trace.endSection();
} }
private void sortWithLegacyStability() {
// Sort all groups and the top level list
for (ListEntry entry : mNotifList) {
if (entry instanceof GroupEntry) {
GroupEntry parent = (GroupEntry) entry;
parent.sortChildren(mGroupChildrenComparator);
}
}
mNotifList.sort(mTopLevelComparator);
assignIndexes(mNotifList);
// Check for suppressed order changes
if (!getStabilityManager().isEveryChangeAllowed()) {
mForceReorderable = true;
boolean isSorted = isShadeSortedLegacy();
mForceReorderable = false;
if (!isSorted) {
getStabilityManager().onEntryReorderSuppressed();
}
}
}
private boolean isShadeSortedLegacy() {
if (!isSorted(mNotifList, mTopLevelComparator)) {
return false;
}
for (ListEntry entry : mNotifList) {
if (entry instanceof GroupEntry) {
if (!isSorted(((GroupEntry) entry).getChildren(), mGroupChildrenComparator)) {
return false;
}
}
}
return true;
}
private void sortWithSemiStableSort() { private void sortWithSemiStableSort() {
// Sort each group's children // Sort each group's children
boolean allSorted = true; boolean allSorted = true;
@@ -1100,7 +1059,6 @@ public class ShadeListBuilder implements Dumpable, PipelineDumpable {
sectionMemberIndex = 0; sectionMemberIndex = 0;
currentSection = section; currentSection = section;
} }
if (mFlags.isStabilityIndexFixEnabled()) {
entry.getAttachState().setStableIndex(sectionMemberIndex++); entry.getAttachState().setStableIndex(sectionMemberIndex++);
if (entry instanceof GroupEntry) { if (entry instanceof GroupEntry) {
final GroupEntry parent = (GroupEntry) entry; final GroupEntry parent = (GroupEntry) entry;
@@ -1112,18 +1070,6 @@ public class ShadeListBuilder implements Dumpable, PipelineDumpable {
child.getAttachState().setStableIndex(sectionMemberIndex++); child.getAttachState().setStableIndex(sectionMemberIndex++);
} }
} }
} else {
// This old implementation uses the same index number for the group as the first
// child, and fails to assign an index to the summary. Remove once tested.
entry.getAttachState().setStableIndex(sectionMemberIndex);
if (entry instanceof GroupEntry) {
final GroupEntry parent = (GroupEntry) entry;
for (NotificationEntry child : parent.getChildren()) {
child.getAttachState().setStableIndex(sectionMemberIndex++);
}
}
sectionMemberIndex++;
}
} }
} }
@@ -1272,11 +1218,6 @@ public class ShadeListBuilder implements Dumpable, PipelineDumpable {
o2.getSectionIndex()); o2.getSectionIndex());
if (cmp != 0) return cmp; if (cmp != 0) return cmp;
cmp = mFlags.isSemiStableSortEnabled() ? 0 : Integer.compare(
getStableOrderIndex(o1),
getStableOrderIndex(o2));
if (cmp != 0) return cmp;
NotifComparator sectionComparator = getSectionComparator(o1, o2); NotifComparator sectionComparator = getSectionComparator(o1, o2);
if (sectionComparator != null) { if (sectionComparator != null) {
cmp = sectionComparator.compare(o1, o2); cmp = sectionComparator.compare(o1, o2);
@@ -1301,12 +1242,7 @@ public class ShadeListBuilder implements Dumpable, PipelineDumpable {
private final Comparator<NotificationEntry> mGroupChildrenComparator = (o1, o2) -> { private final Comparator<NotificationEntry> mGroupChildrenComparator = (o1, o2) -> {
int cmp = mFlags.isSemiStableSortEnabled() ? 0 : Integer.compare( int cmp = Integer.compare(
getStableOrderIndex(o1),
getStableOrderIndex(o2));
if (cmp != 0) return cmp;
cmp = Integer.compare(
o1.getRepresentativeEntry().getRanking().getRank(), o1.getRepresentativeEntry().getRanking().getRank(),
o2.getRepresentativeEntry().getRanking().getRank()); o2.getRepresentativeEntry().getRanking().getRank());
if (cmp != 0) return cmp; if (cmp != 0) return cmp;
@@ -1317,25 +1253,6 @@ public class ShadeListBuilder implements Dumpable, PipelineDumpable {
return cmp; return cmp;
}; };
/**
* A flag that is set to true when we want to run the comparators as if all reordering is
* allowed. This is used to check if the list is "out of order" after the sort is complete.
*/
private boolean mForceReorderable = false;
private int getStableOrderIndex(ListEntry entry) {
if (mForceReorderable) {
// this is used to determine if the list is correctly sorted
return -1;
}
if (getStabilityManager().isEntryReorderingAllowed(entry)) {
// let the stability manager constrain or allow reordering
return -1;
}
// NOTE(b/241229236): Can't use cleared section index until we fix stability fragility
return entry.getPreviousAttachState().getStableIndex();
}
@Nullable @Nullable
private Integer getStableOrderRank(ListEntry entry) { private Integer getStableOrderRank(ListEntry entry) {
if (getStabilityManager().isEntryReorderingAllowed(entry)) { if (getStabilityManager().isEntryReorderingAllowed(entry)) {

View File

@@ -39,7 +39,6 @@ import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times; import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static java.util.Arrays.asList; import static java.util.Arrays.asList;
import static java.util.Collections.singletonList; import static java.util.Collections.singletonList;
@@ -137,7 +136,6 @@ public class ShadeListBuilderTest extends SysuiTestCase {
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
allowTestableLooperAsMainThread(); allowTestableLooperAsMainThread();
when(mNotifPipelineFlags.isStabilityIndexFixEnabled()).thenReturn(true);
mListBuilder = new ShadeListBuilder( mListBuilder = new ShadeListBuilder(
mDumpManager, mDumpManager,
@@ -1997,30 +1995,8 @@ public class ShadeListBuilderTest extends SysuiTestCase {
return wtf; return wtf;
} }
@Test
public void testActiveOrdering_withLegacyStability() {
when(mNotifPipelineFlags.isSemiStableSortEnabled()).thenReturn(false);
assertOrder("ABCDEFG", "ABCDEFG", "ABCDEFG", true); // no change
assertOrder("ABCDEFG", "ACDEFXBG", "ACDEFXBG", true); // X
assertOrder("ABCDEFG", "ACDEFBG", "ACDEFBG", true); // no change
assertOrder("ABCDEFG", "ACDEFBXZG", "ACDEFBXZG", true); // Z and X
assertOrder("ABCDEFG", "AXCDEZFBG", "AXCDEZFBG", true); // Z and X + gap
}
@Test
public void testStableOrdering_withLegacyStability() {
when(mNotifPipelineFlags.isSemiStableSortEnabled()).thenReturn(false);
mStabilityManager.setAllowEntryReordering(false);
assertOrder("ABCDEFG", "ABCDEFG", "ABCDEFG", true); // no change
assertOrder("ABCDEFG", "ACDEFXBG", "XABCDEFG", false); // X
assertOrder("ABCDEFG", "ACDEFBG", "ABCDEFG", false); // no change
assertOrder("ABCDEFG", "ACDEFBXZG", "XZABCDEFG", false); // Z and X
assertOrder("ABCDEFG", "AXCDEZFBG", "XZABCDEFG", false); // Z and X + gap
}
@Test @Test
public void testStableOrdering() { public void testStableOrdering() {
when(mNotifPipelineFlags.isSemiStableSortEnabled()).thenReturn(true);
mStabilityManager.setAllowEntryReordering(false); mStabilityManager.setAllowEntryReordering(false);
// No input or output // No input or output
assertOrder("", "", "", true); assertOrder("", "", "", true);
@@ -2076,7 +2052,6 @@ public class ShadeListBuilderTest extends SysuiTestCase {
@Test @Test
public void testActiveOrdering() { public void testActiveOrdering() {
when(mNotifPipelineFlags.isSemiStableSortEnabled()).thenReturn(true);
assertOrder("ABCDEFG", "ACDEFXBG", "ACDEFXBG", true); // X assertOrder("ABCDEFG", "ACDEFXBG", "ACDEFXBG", true); // X
assertOrder("ABCDEFG", "ACDEFBG", "ACDEFBG", true); // no change assertOrder("ABCDEFG", "ACDEFBG", "ACDEFBG", true); // no change
assertOrder("ABCDEFG", "ACDEFBXZG", "ACDEFBXZG", true); // Z and X assertOrder("ABCDEFG", "ACDEFBXZG", "ACDEFBXZG", true); // Z and X
@@ -2133,7 +2108,6 @@ public class ShadeListBuilderTest extends SysuiTestCase {
@Test @Test
public void stableOrderingDisregardedWithSectionChange() { public void stableOrderingDisregardedWithSectionChange() {
when(mNotifPipelineFlags.isSemiStableSortEnabled()).thenReturn(true);
// GIVEN the first sectioner's packages can be changed from run-to-run // GIVEN the first sectioner's packages can be changed from run-to-run
List<String> mutableSectionerPackages = new ArrayList<>(); List<String> mutableSectionerPackages = new ArrayList<>();
mutableSectionerPackages.add(PACKAGE_1); mutableSectionerPackages.add(PACKAGE_1);
@@ -2228,50 +2202,8 @@ public class ShadeListBuilderTest extends SysuiTestCase {
); );
} }
@Test
public void groupRevertingToSummaryDoesNotRetainStablePositionWithLegacyIndexLogic() {
when(mNotifPipelineFlags.isStabilityIndexFixEnabled()).thenReturn(false);
// GIVEN a notification group is on screen
mStabilityManager.setAllowEntryReordering(false);
// WHEN the list is originally built with reordering disabled (and section changes allowed)
addNotif(0, PACKAGE_1).setRank(2);
addNotif(1, PACKAGE_1).setRank(3);
addGroupSummary(2, PACKAGE_1, "group").setRank(4);
addGroupChild(3, PACKAGE_1, "group").setRank(5);
addGroupChild(4, PACKAGE_1, "group").setRank(6);
dispatchBuild();
verifyBuiltList(
notif(0),
notif(1),
group(
summary(2),
child(3),
child(4)
)
);
// WHEN the notification summary rank increases and children removed
setNewRank(notif(2).entry, 1);
mEntrySet.remove(4);
mEntrySet.remove(3);
dispatchBuild();
// VERIFY the summary (incorrectly) moves to the top of the section where it is ranked,
// despite visual stability being active
verifyBuiltList(
notif(2),
notif(0),
notif(1)
);
}
@Test @Test
public void groupRevertingToSummaryRetainsStablePosition() { public void groupRevertingToSummaryRetainsStablePosition() {
when(mNotifPipelineFlags.isStabilityIndexFixEnabled()).thenReturn(true);
// GIVEN a notification group is on screen // GIVEN a notification group is on screen
mStabilityManager.setAllowEntryReordering(false); mStabilityManager.setAllowEntryReordering(false);