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
This commit is contained in:
Jorge Martin Espinosa
2026-01-23 10:01:52 +01:00
committed by GitHub
parent 87619e50e8
commit deb340daba
4 changed files with 27 additions and 5 deletions

View File

@@ -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

View File

@@ -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(),
)
}
}

View File

@@ -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,
)
}

View File

@@ -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<ResolvedPushEvent> = 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,