From deb340daba96cb7b77d44a29e0b2fd683ca9100f Mon Sep 17 00:00:00 2001 From: Jorge Martin Espinosa Date: Fri, 23 Jan 2026 10:01:52 +0100 Subject: [PATCH] Use `MediaPreviewValue.Private` to check if media should be displayed in notifications (#6038) * Use `MediaPreviewValue.Private` to check if images should be displayed in notifications Also added `NotificationData.roomJoinRule` so we can use it to check if the room is public or not * Add logging message for cases when we should have an image uri it turns out we don't --- .../api/notification/NotificationData.kt | 2 ++ .../impl/notification/NotificationMapper.kt | 2 ++ .../test/notification/NotificationData.kt | 5 +++- .../DefaultNotifiableEventResolver.kt | 23 +++++++++++++++---- 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/notification/NotificationData.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/notification/NotificationData.kt index aff3092549..02e40813b0 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/notification/NotificationData.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/notification/NotificationData.kt @@ -14,6 +14,7 @@ import io.element.android.libraries.matrix.api.core.SessionId import io.element.android.libraries.matrix.api.core.ThreadId import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.room.RoomMembershipState +import io.element.android.libraries.matrix.api.room.join.JoinRule import io.element.android.libraries.matrix.api.timeline.item.event.MessageType data class NotificationData( @@ -36,6 +37,7 @@ data class NotificationData( val timestamp: Long, val content: NotificationContent, val hasMention: Boolean, + val roomJoinRule: JoinRule?, ) { fun getDisambiguatedDisplayName(userId: UserId): String = when { senderDisplayName.isNullOrBlank() -> userId.value diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/notification/NotificationMapper.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/notification/NotificationMapper.kt index 511c899fdb..f1996dd942 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/notification/NotificationMapper.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/notification/NotificationMapper.kt @@ -18,6 +18,7 @@ import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.notification.NotificationContent import io.element.android.libraries.matrix.api.notification.NotificationData import io.element.android.libraries.matrix.api.room.isDm +import io.element.android.libraries.matrix.impl.room.join.map import io.element.android.services.toolbox.api.systemclock.SystemClock import org.matrix.rustcomponents.sdk.NotificationEvent import org.matrix.rustcomponents.sdk.NotificationItem @@ -59,6 +60,7 @@ class NotificationMapper( timestamp = timestamp, content = notificationContentMapper.map(item.event).getOrThrow(), hasMention = item.hasMention.orFalse(), + roomJoinRule = item.roomInfo.joinRule?.map(), ) } } diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/notification/NotificationData.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/notification/NotificationData.kt index b6b6cb66e9..803c9d8f42 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/notification/NotificationData.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/notification/NotificationData.kt @@ -11,6 +11,7 @@ package io.element.android.libraries.matrix.test.notification import io.element.android.libraries.matrix.api.core.ThreadId import io.element.android.libraries.matrix.api.notification.NotificationContent import io.element.android.libraries.matrix.api.notification.NotificationData +import io.element.android.libraries.matrix.api.room.join.JoinRule import io.element.android.libraries.matrix.test.AN_EVENT_ID import io.element.android.libraries.matrix.test.A_ROOM_ID import io.element.android.libraries.matrix.test.A_ROOM_NAME @@ -27,7 +28,8 @@ fun aNotificationData( timestamp: Long = A_TIMESTAMP, senderDisplayName: String? = A_USER_NAME_2, senderIsNameAmbiguous: Boolean = false, - roomDisplayName: String? = A_ROOM_NAME + roomDisplayName: String? = A_ROOM_NAME, + roomJoinRule: JoinRule? = null, ): NotificationData { return NotificationData( sessionId = A_SESSION_ID, @@ -47,5 +49,6 @@ fun aNotificationData( timestamp = timestamp, content = content, hasMention = hasMention, + roomJoinRule = roomJoinRule, ) } diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotifiableEventResolver.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotifiableEventResolver.kt index e3d0f21d03..c0eb07b091 100644 --- a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotifiableEventResolver.kt +++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotifiableEventResolver.kt @@ -31,11 +31,12 @@ import io.element.android.libraries.matrix.api.core.SessionId import io.element.android.libraries.matrix.api.core.ThreadId import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.exception.NotificationResolverException -import io.element.android.libraries.matrix.api.media.MediaPreviewValue import io.element.android.libraries.matrix.api.media.getMediaPreviewValue +import io.element.android.libraries.matrix.api.media.isPreviewEnabled import io.element.android.libraries.matrix.api.notification.NotificationContent import io.element.android.libraries.matrix.api.notification.NotificationData import io.element.android.libraries.matrix.api.permalink.PermalinkParser +import io.element.android.libraries.matrix.api.room.join.JoinRule import io.element.android.libraries.matrix.api.timeline.item.event.AudioMessageType import io.element.android.libraries.matrix.api.timeline.item.event.EmoteMessageType import io.element.android.libraries.matrix.api.timeline.item.event.EventType @@ -140,10 +141,24 @@ class DefaultNotifiableEventResolver( ): Result = runCatchingExceptions { when (val content = this.content) { is NotificationContent.MessageLike.RoomMessage -> { - val showMediaPreview = client.mediaPreviewService.getMediaPreviewValue() == MediaPreviewValue.On + val showMediaPreview = client.mediaPreviewService.getMediaPreviewValue().isPreviewEnabled(roomJoinRule) val senderDisambiguatedDisplayName = getDisambiguatedDisplayName(content.senderId) - val imageMimeType = if (showMediaPreview) content.getImageMimetype() else null - val imageUriString = imageMimeType?.let { content.fetchImageIfPresent(client, imageMimeType)?.toString() } + val imageMimeType = content.getImageMimetype() + val imageUriString = if (showMediaPreview && imageMimeType != null) { + content.fetchImageIfPresent(client, imageMimeType)?.toString() + } else { + null + } + + val isPublicRoom = roomJoinRule == null || roomJoinRule == JoinRule.Public + if (imageMimeType != null && !showMediaPreview && isPublicRoom) { + Timber.tag(loggerTag.value) + .d("We should only display media previews for private rooms and the current room is public. Ignoring image uri.") + } else if (showMediaPreview && content.messageType is ImageMessageType && imageUriString == null) { + Timber.tag(loggerTag.value) + .w("No image uri returned for message with an image and previews enabled. Something went wrong.") + } + val messageBody = descriptionFromMessageContent( content = content, senderDisambiguatedDisplayName = senderDisambiguatedDisplayName,