Exclude silent notifications from lockscreen

regardless of the parent's priority, silent notifications should be
hidden
Fixes: 228756327
Test: KeyguardNotificationVisibilityProviderTest

Change-Id: I12b001b4d54a9bc8d91efa34874b4434dbfff118
This commit is contained in:
Jay Aliomer
2022-04-28 20:49:14 +00:00
parent bd72a95c1f
commit 1fc22b6673
2 changed files with 54 additions and 12 deletions

View File

@@ -164,12 +164,23 @@ private class KeyguardNotificationVisibilityProviderImpl @Inject constructor(
!lockscreenUserManager.shouldShowLockscreenNotifications() -> true
// User settings do not allow this notification on the lockscreen, so hide it.
userSettingsDisallowNotification(entry) -> true
// if entry is silent, apply custom logic to see if should hide
shouldHideIfEntrySilent(entry) -> true
else -> false
}
private fun shouldHideIfEntrySilent(entry: ListEntry): Boolean = when {
// Show if high priority (not hidden)
highPriorityProvider.isHighPriority(entry) -> false
// Ambient notifications are hidden always from lock screen
entry.representativeEntry?.isAmbient == true -> true
// [Now notification is silent]
// Hide regardless of parent priority if user wants silent notifs hidden
hideSilentNotificationsOnLockscreen -> true
// Parent priority is high enough to be shown on the lockscreen, do not hide.
entry.parent?.let(::priorityExceedsLockscreenShowingThreshold) == true -> false
// Entry priority is high enough to be shown on the lockscreen, do not hide.
priorityExceedsLockscreenShowingThreshold(entry) -> false
// Priority is too low, hide.
else -> true
entry.parent?.let(::shouldHideIfEntrySilent) == false -> false
// Show when silent notifications are allowed on lockscreen
else -> false
}
private fun userSettingsDisallowNotification(entry: NotificationEntry): Boolean {
@@ -193,11 +204,6 @@ private class KeyguardNotificationVisibilityProviderImpl @Inject constructor(
}
}
private fun priorityExceedsLockscreenShowingThreshold(entry: ListEntry): Boolean = when {
hideSilentNotificationsOnLockscreen -> highPriorityProvider.isHighPriority(entry)
else -> entry.representativeEntry?.ranking?.isAmbient == false
}
private fun readShowSilentNotificationSetting() {
val showSilentNotifs =
secureSettings.getBoolForUser(Settings.Secure.LOCK_SCREEN_SHOW_SILENT_NOTIFICATIONS,

View File

@@ -27,6 +27,7 @@ import static com.android.systemui.util.mockito.KotlinMockitoHelpersKt.argThat;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.isNull;
@@ -227,6 +228,41 @@ public class KeyguardNotificationVisibilityProviderTest extends SysuiTestCase {
verify(listener).accept(anyString());
}
@Test
public void hideSilentNotificationsPerUserSettingWithHighPriorityParent() {
when(mKeyguardStateController.isShowing()).thenReturn(true);
mFakeSettings.putBool(Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, true);
mFakeSettings.putBool(Settings.Secure.LOCK_SCREEN_SHOW_SILENT_NOTIFICATIONS, false);
GroupEntry parent = new GroupEntryBuilder()
.setKey("parent")
.addChild(mEntry)
.setSummary(new NotificationEntryBuilder()
.setUser(new UserHandle(NOTIF_USER_ID))
.setImportance(IMPORTANCE_LOW)
.build())
.build();
mEntry = new NotificationEntryBuilder()
.setUser(new UserHandle(NOTIF_USER_ID))
.setImportance(IMPORTANCE_LOW)
.setParent(parent)
.build();
when(mHighPriorityProvider.isHighPriority(any())).thenReturn(false);
assertTrue(mKeyguardNotificationVisibilityProvider.shouldHideNotification(mEntry));
}
@Test
public void hideSilentNotificationsPerUserSetting() {
when(mKeyguardStateController.isShowing()).thenReturn(true);
mFakeSettings.putBool(Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, true);
mFakeSettings.putBool(Settings.Secure.LOCK_SCREEN_SHOW_SILENT_NOTIFICATIONS, false);
mEntry = new NotificationEntryBuilder()
.setUser(new UserHandle(NOTIF_USER_ID))
.setImportance(IMPORTANCE_LOW)
.build();
when(mHighPriorityProvider.isHighPriority(any())).thenReturn(false);
assertTrue(mKeyguardNotificationVisibilityProvider.shouldHideNotification(mEntry));
}
@Test
public void notifyListeners_onSettingChange_zenMode() {
when(mKeyguardStateController.isShowing()).thenReturn(true);
@@ -384,8 +420,8 @@ public class KeyguardNotificationVisibilityProviderTest extends SysuiTestCase {
mFakeSettings.putBool(Settings.Secure.LOCK_SCREEN_SHOW_SILENT_NOTIFICATIONS, false);
when(mHighPriorityProvider.isHighPriority(parent)).thenReturn(true);
// THEN don't filter out the entry
assertFalse(
// THEN filter out the entry regardless of parent
assertTrue(
mKeyguardNotificationVisibilityProvider.shouldHideNotification(entryWithParent));
// WHEN its parent doesn't exceed threshold to show on lockscreen