summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Julia Tuttle <juliatuttle@google.com> 2023-06-13 15:32:19 -0400
committer Julia Tuttle <juliatuttle@google.com> 2023-06-14 17:38:47 +0000
commit768a21ede47376c8382e73347e8eb3bb1de176fa (patch)
tree67c2f11c69a65921c92138e7f2891d4c390e6d4e
parentcc3076a8518519be7bd543b62c59a5c8c09dc093 (diff)
Ignore implicit high priority for 'hide silent notifs on lockscreen'
Normally, HighPriorityProvider is willing to "promote" low priority notifications to high priority if they "have high priority characteristics" (are media/conversation/messaging and aren't *user* set as low priority). This is fine for ranking, but not fine for deciding which notifications to show on the lockscreen, so add a distinction between (potentially implicitly) high priority and *explicitly* high priority, and use *explicit* high priority when making lockscreen visibility decisions. Bug: 286278782 Test: atest HighPriorityProviderTest KeyguardNotificationVisibilityProviderTest Change-Id: I933d78eed841ded452de126919898e1dfb0d0e35
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/provider/HighPriorityProvider.java29
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/KeyguardNotificationVisibilityProvider.kt4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/HighPriorityProviderTest.java8
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/KeyguardNotificationVisibilityProviderTest.java40
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