diff --git a/apps/android/app/src/main/java/ai/openclaw/android/node/DeviceNotificationListenerService.kt b/apps/android/app/src/main/java/ai/openclaw/android/node/DeviceNotificationListenerService.kt index 32ca08764fe..1eff015c5f0 100644 --- a/apps/android/app/src/main/java/ai/openclaw/android/node/DeviceNotificationListenerService.kt +++ b/apps/android/app/src/main/java/ai/openclaw/android/node/DeviceNotificationListenerService.kt @@ -54,6 +54,10 @@ data class NotificationActionResult( val message: String? = null, ) +internal fun actionRequiresClearableNotification(kind: NotificationActionKind): Boolean { + return kind == NotificationActionKind.Dismiss +} + private object DeviceNotificationStore { private val lock = Any() private var connected = false @@ -221,7 +225,7 @@ class DeviceNotificationListenerService : NotificationListenerService() { code = "NOTIFICATION_NOT_FOUND", message = "NOTIFICATION_NOT_FOUND: notification key not found", ) - if (!sbn.isClearable) { + if (actionRequiresClearableNotification(request.kind) && !sbn.isClearable) { return NotificationActionResult( ok = false, code = "NOTIFICATION_NOT_CLEARABLE", diff --git a/apps/android/app/src/test/java/ai/openclaw/android/node/NotificationsHandlerTest.kt b/apps/android/app/src/test/java/ai/openclaw/android/node/NotificationsHandlerTest.kt index 612c9d518aa..256a7346911 100644 --- a/apps/android/app/src/test/java/ai/openclaw/android/node/NotificationsHandlerTest.kt +++ b/apps/android/app/src/test/java/ai/openclaw/android/node/NotificationsHandlerTest.kt @@ -182,6 +182,13 @@ class NotificationsHandlerTest { assertTrue((sanitized ?: "").all { it == 'x' }) } + @Test + fun notificationsActionClearablePolicy_onlyRequiresClearableForDismiss() { + assertTrue(actionRequiresClearableNotification(NotificationActionKind.Dismiss)) + assertFalse(actionRequiresClearableNotification(NotificationActionKind.Open)) + assertFalse(actionRequiresClearableNotification(NotificationActionKind.Reply)) + } + private fun parsePayload(result: GatewaySession.InvokeResult): JsonObject { val payloadJson = result.payloadJson ?: error("expected payload") return Json.parseToJsonElement(payloadJson).jsonObject