diff options
4 files changed, 60 insertions, 21 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/provider/HighPriorityProvider.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/provider/HighPriorityProvider.java index 731ec80817ca..d47fe20911f9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/provider/HighPriorityProvider.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/provider/HighPriorityProvider.java @@ -63,10 +63,27 @@ public class HighPriorityProvider { * - has a media session associated with it * - has messaging style * - * A GroupEntry is considered high priority if its representativeEntry (summary) or children are - * high priority + * A GroupEntry is considered high priority if its representativeEntry (summary) or any of its + * children are high priority. */ public boolean isHighPriority(@Nullable ListEntry entry) { + return isHighPriority(entry, /* allowImplicit = */ true); + } + + /** + * @return true if the ListEntry is explicitly high priority, else false + * + * A NotificationEntry is considered explicitly high priority if has importance greater than or + * equal to IMPORTANCE_DEFAULT. + * + * A GroupEntry is considered explicitly high priority if its representativeEntry (summary) or + * any of its children are explicitly high priority. + */ + public boolean isExplicitlyHighPriority(@Nullable ListEntry entry) { + return isHighPriority(entry, /* allowImplicit= */ false); + } + + private boolean isHighPriority(@Nullable ListEntry entry, boolean allowImplicit) { if (entry == null) { return false; } @@ -77,8 +94,8 @@ public class HighPriorityProvider { } return notifEntry.getRanking().getImportance() >= NotificationManager.IMPORTANCE_DEFAULT - || hasHighPriorityCharacteristics(notifEntry) - || hasHighPriorityChild(entry); + || (allowImplicit && hasHighPriorityCharacteristics(notifEntry)) + || hasHighPriorityChild(entry, allowImplicit); } /** @@ -112,7 +129,7 @@ public class HighPriorityProvider { >= NotificationManager.IMPORTANCE_DEFAULT); } - private boolean hasHighPriorityChild(ListEntry entry) { + private boolean hasHighPriorityChild(ListEntry entry, boolean allowImplicit) { if (entry instanceof NotificationEntry && !mGroupMembershipManager.isGroupSummary((NotificationEntry) entry)) { return false; @@ -121,7 +138,7 @@ public class HighPriorityProvider { List<NotificationEntry> children = mGroupMembershipManager.getChildren(entry); if (children != null) { for (NotificationEntry child : children) { - if (child != entry && isHighPriority(child)) { + if (child != entry && isHighPriority(child, allowImplicit)) { return true; } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/KeyguardNotificationVisibilityProvider.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/KeyguardNotificationVisibilityProvider.kt index 7513aa7fa2a2..90014c2518d1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/KeyguardNotificationVisibilityProvider.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/KeyguardNotificationVisibilityProvider.kt @@ -180,8 +180,8 @@ private class KeyguardNotificationVisibilityProviderImpl @Inject constructor( } private fun shouldHideIfEntrySilent(entry: ListEntry): Boolean = when { - // Show if high priority (not hidden) - highPriorityProvider.isHighPriority(entry) -> false + // Show if explicitly high priority (not hidden) + highPriorityProvider.isExplicitlyHighPriority(entry) -> false // Ambient notifications are hidden always from lock screen entry.representativeEntry?.isAmbient == true -> true // [Now notification is silent] diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/HighPriorityProviderTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/HighPriorityProviderTest.java index ac66ad9e9c8d..2d044fec1eb6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/HighPriorityProviderTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/HighPriorityProviderTest.java @@ -92,8 +92,9 @@ public class HighPriorityProviderTest extends SysuiTestCase { .getPeopleNotificationType(entry)) .thenReturn(TYPE_PERSON); - // THEN it has high priority + // THEN it has high priority BUT it has low explicit priority. assertTrue(mHighPriorityProvider.isHighPriority(entry)); + assertFalse(mHighPriorityProvider.isExplicitlyHighPriority(entry)); } @Test @@ -115,7 +116,7 @@ public class HighPriorityProviderTest extends SysuiTestCase { @Test public void lowImportanceConversation() { - // GIVEN notification is high importance and is a people notification + // GIVEN notification is low importance and is a people notification final Notification notification = new Notification.Builder(mContext, "test") .build(); final NotificationEntry entry = new NotificationEntryBuilder() @@ -162,8 +163,9 @@ public class HighPriorityProviderTest extends SysuiTestCase { .getPeopleNotificationType(entry)) .thenReturn(TYPE_NON_PERSON); - // THEN it has high priority + // THEN it has high priority but low explicit priority assertTrue(mHighPriorityProvider.isHighPriority(entry)); + assertFalse(mHighPriorityProvider.isExplicitlyHighPriority(entry)); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/KeyguardNotificationVisibilityProviderTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/KeyguardNotificationVisibilityProviderTest.java index 6bd3f7a27413..8f39ee6a6e9f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/KeyguardNotificationVisibilityProviderTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/KeyguardNotificationVisibilityProviderTest.java @@ -257,7 +257,7 @@ public class KeyguardNotificationVisibilityProviderTest extends SysuiTestCase { .setImportance(IMPORTANCE_LOW) .setParent(parent) .build(); - when(mHighPriorityProvider.isHighPriority(any())).thenReturn(false); + when(mHighPriorityProvider.isExplicitlyHighPriority(any())).thenReturn(false); assertTrue(mKeyguardNotificationVisibilityProvider.shouldHideNotification(mEntry)); } @@ -270,7 +270,7 @@ public class KeyguardNotificationVisibilityProviderTest extends SysuiTestCase { .setUser(new UserHandle(NOTIF_USER_ID)) .setImportance(IMPORTANCE_LOW) .build(); - when(mHighPriorityProvider.isHighPriority(any())).thenReturn(false); + when(mHighPriorityProvider.isExplicitlyHighPriority(any())).thenReturn(false); assertTrue(mKeyguardNotificationVisibilityProvider.shouldHideNotification(mEntry)); } @@ -292,7 +292,7 @@ public class KeyguardNotificationVisibilityProviderTest extends SysuiTestCase { .setImportance(IMPORTANCE_LOW) .setParent(parent) .build(); - when(mHighPriorityProvider.isHighPriority(any())).thenReturn(false); + when(mHighPriorityProvider.isExplicitlyHighPriority(any())).thenReturn(false); assertTrue(mKeyguardNotificationVisibilityProvider.shouldHideNotification(mEntry)); } @@ -309,7 +309,7 @@ public class KeyguardNotificationVisibilityProviderTest extends SysuiTestCase { mEntry = new NotificationEntryBuilder() .setImportance(IMPORTANCE_LOW) .build(); - when(mHighPriorityProvider.isHighPriority(any())).thenReturn(false); + when(mHighPriorityProvider.isExplicitlyHighPriority(any())).thenReturn(false); // THEN filter out the entry assertTrue(mKeyguardNotificationVisibilityProvider.shouldHideNotification(mEntry)); @@ -328,7 +328,7 @@ public class KeyguardNotificationVisibilityProviderTest extends SysuiTestCase { mEntry = new NotificationEntryBuilder() .setImportance(IMPORTANCE_LOW) .build(); - when(mHighPriorityProvider.isHighPriority(mEntry)).thenReturn(false); + when(mHighPriorityProvider.isExplicitlyHighPriority(mEntry)).thenReturn(false); // THEN do not filter out the entry assertFalse(mKeyguardNotificationVisibilityProvider.shouldHideNotification(mEntry)); @@ -345,7 +345,7 @@ public class KeyguardNotificationVisibilityProviderTest extends SysuiTestCase { .setUser(new UserHandle(NOTIF_USER_ID)) .setImportance(IMPORTANCE_LOW) .build(); - when(mHighPriorityProvider.isHighPriority(any())).thenReturn(false); + when(mHighPriorityProvider.isExplicitlyHighPriority(any())).thenReturn(false); // WhHEN the show silent notifs on lockscreen setting is unset assertNull(mFakeSettings.getString(Settings.Secure.LOCK_SCREEN_SHOW_SILENT_NOTIFICATIONS)); @@ -460,13 +460,33 @@ public class KeyguardNotificationVisibilityProviderTest extends SysuiTestCase { .setKey(mEntry.getKey()) .setImportance(IMPORTANCE_MIN) .build()); - when(mHighPriorityProvider.isHighPriority(mEntry)).thenReturn(false); + when(mHighPriorityProvider.isExplicitlyHighPriority(mEntry)).thenReturn(false); // THEN filter out the entry assertTrue(mKeyguardNotificationVisibilityProvider.shouldHideNotification(mEntry)); } @Test + public void highPriorityCharacteristicsIgnored() { + // GIVEN an 'unfiltered-keyguard-showing' state with silent notifications hidden + setupUnfilteredState(mEntry); + mFakeSettings.putBool(Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, true); + mFakeSettings.putBool(Settings.Secure.LOCK_SCREEN_SHOW_SILENT_NOTIFICATIONS, false); + + // WHEN the notification doesn't exceed the threshold to show on the lockscreen, but does + // have the "high priority characteristics" that would promote it to high priority + mEntry.setRanking(new RankingBuilder() + .setKey(mEntry.getKey()) + .setImportance(IMPORTANCE_MIN) + .build()); + when(mHighPriorityProvider.isHighPriority(mEntry)).thenReturn(true); + when(mHighPriorityProvider.isExplicitlyHighPriority(mEntry)).thenReturn(false); + + // THEN filter out the entry anyway, because the user explicitly asked us to hide it + assertTrue(mKeyguardNotificationVisibilityProvider.shouldHideNotification(mEntry)); + } + + @Test public void notificationVisibilityPublic() { // GIVEN a VISIBILITY_PUBLIC notification NotificationEntryBuilder entryBuilder = new NotificationEntryBuilder() @@ -538,14 +558,14 @@ public class KeyguardNotificationVisibilityProviderTest extends SysuiTestCase { // WHEN its parent does exceed threshold tot show on the lockscreen mFakeSettings.putBool(Settings.Secure.LOCK_SCREEN_SHOW_SILENT_NOTIFICATIONS, false); - when(mHighPriorityProvider.isHighPriority(parent)).thenReturn(true); + when(mHighPriorityProvider.isExplicitlyHighPriority(parent)).thenReturn(true); // THEN filter out the entry regardless of parent assertTrue( mKeyguardNotificationVisibilityProvider.shouldHideNotification(entryWithParent)); // WHEN its parent doesn't exceed threshold to show on lockscreen - when(mHighPriorityProvider.isHighPriority(parent)).thenReturn(false); + when(mHighPriorityProvider.isExplicitlyHighPriority(parent)).thenReturn(false); modifyEntry(parent.getSummary(), builder -> builder .setImportance(IMPORTANCE_MIN) .done()); @@ -591,7 +611,7 @@ public class KeyguardNotificationVisibilityProviderTest extends SysuiTestCase { // notification doesn't have a summary // notification is high priority, so it shouldn't be filtered - when(mHighPriorityProvider.isHighPriority(mEntry)).thenReturn(true); + when(mHighPriorityProvider.isExplicitlyHighPriority(mEntry)).thenReturn(true); } @SysUISingleton |