diff --git a/app/src/main/java/se/ajpanton/notificationsmaster/visibility/VisibilityPolicy.kt b/app/src/main/java/se/ajpanton/notificationsmaster/visibility/VisibilityPolicy.kt index 814eb41..18e743b 100644 --- a/app/src/main/java/se/ajpanton/notificationsmaster/visibility/VisibilityPolicy.kt +++ b/app/src/main/java/se/ajpanton/notificationsmaster/visibility/VisibilityPolicy.kt @@ -93,19 +93,23 @@ class CompiledVisibilityPolicy(policy: VisibilityPolicy) { fun isBlocked(notification: VisibilityNotification, surface: NotificationSurface): Boolean { if (!enabled) return false val policy = apps[notification.packageName] ?: return false - val matchText = notification.matchText() - val exception = policy.exceptions.firstOrNull { it.pattern.matcher(matchText).find() } + val matchTexts = notification.matchTexts() + val exception = policy.exceptions.firstOrNull { rule -> + matchTexts.any { rule.pattern.matcher(it).find() } + } return surface in (exception?.blockedSurfaces ?: policy.blockedSurfaces) } fun hasExceptions(packageName: String) = apps[packageName]?.exceptions?.isNotEmpty() == true - private fun VisibilityNotification.matchText() = buildList { + private fun VisibilityNotification.matchTexts() = buildList { add(packageName) add(key) listOf(title, text, bigText, subtext, channelId).filterNotNullTo(this) addAll(messages) - }.joinToString("\n") + }.map(String::trim).filter(String::isNotEmpty).let { fields -> + fields + fields.joinToString("\n") + } private data class CompiledAppPolicy( val blockedSurfaces: Set, diff --git a/app/src/test/java/se/ajpanton/notificationsmaster/visibility/VisibilityPolicyTest.kt b/app/src/test/java/se/ajpanton/notificationsmaster/visibility/VisibilityPolicyTest.kt index ebfba63..f71b25e 100644 --- a/app/src/test/java/se/ajpanton/notificationsmaster/visibility/VisibilityPolicyTest.kt +++ b/app/src/test/java/se/ajpanton/notificationsmaster/visibility/VisibilityPolicyTest.kt @@ -61,6 +61,14 @@ class VisibilityPolicyTest { } } + @Test fun `anchors apply to each notification field`() { + val policy = compiled(exceptions = listOf( + VisibilityExceptionRule("^Lunch tomorrow\\?$", setOf(NotificationSurface.AOD)), + )) + + assertTrue(policy.isBlocked(notification, NotificationSurface.AOD)) + } + @Test fun `invalid regular expressions can be rejected by an editor`() { assertFalse(VisibilityExceptionRule("(", emptySet()).hasValidPattern()) assertTrue(VisibilityExceptionRule("valid.*", emptySet()).hasValidPattern())