diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentMessageFactoryTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentMessageFactoryTest.kt index 1c9de095d3..0c6c81a513 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentMessageFactoryTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentMessageFactoryTest.kt @@ -229,6 +229,25 @@ class TimelineItemContentMessageFactoryTest : RobolectricTest() { assertThat((result as TimelineItemTextContent).formattedBody).isEqualTo(SpannedString("body")) } + @Test + fun `test create TextMessageType with a formatted body containing only an image falls back to the body`() = runTest { + val sut = createTimelineItemContentMessageFactory() + val result = sut.create( + content = createMessageContent( + type = TextMessageType( + body = "\uD83D\uDE1C", + formatted = FormattedBody(MessageFormat.HTML, "\"\uD83D\uDE1C\"") + ) + ), + senderId = A_USER_ID, + senderProfile = aProfileDetails(), + eventId = AN_EVENT_ID, + ) + assertThat((result as TimelineItemTextContent).formattedBody).isEqualTo(SpannedString("\uD83D\uDE1C")) + assertThat(result.htmlDocument).isNull() + assertThat(result.plainText).isEqualTo("\uD83D\uDE1C") + } + @Test fun `test create VideoMessageType`() = runTest { val sut = createTimelineItemContentMessageFactory() diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/messages/ToHtmlDocument.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/messages/ToHtmlDocument.kt index d29a28cba9..2f52320b0d 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/messages/ToHtmlDocument.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/messages/ToHtmlDocument.kt @@ -19,7 +19,8 @@ import org.jsoup.safety.Safelist /** * Converts the HTML string [FormattedBody.body] to a [Document] by parsing it. - * If the message is not formatted or the format is not [MessageFormat.HTML] we return `null`. + * If the message is not formatted, the format is not [MessageFormat.HTML], or nothing renderable is left once the + * unsupported tags have been removed, we return `null` so that the plain text body is used instead. * * This will also make sure mentions are prefixed with `@`. * @@ -44,7 +45,7 @@ fun FormattedBody.toHtmlDocument( // Prepend `@` to mentions fixMentions(dom, permalinkParser) - dom + dom.takeIf { it.text().isNotBlank() } } } diff --git a/libraries/matrixui/src/test/kotlin/io/element/android/libraries/matrix/ui/messages/ToHtmlDocumentTest.kt b/libraries/matrixui/src/test/kotlin/io/element/android/libraries/matrix/ui/messages/ToHtmlDocumentTest.kt index ae336cd0d0..dcf8935e57 100644 --- a/libraries/matrixui/src/test/kotlin/io/element/android/libraries/matrix/ui/messages/ToHtmlDocumentTest.kt +++ b/libraries/matrixui/src/test/kotlin/io/element/android/libraries/matrix/ui/messages/ToHtmlDocumentTest.kt @@ -103,4 +103,28 @@ class ToHtmlDocumentTest : RobolectricTest() { }) assertThat(document?.text()).isEqualTo("Hey Alice!") } + + @Test + fun `toHtmlDocument - returns null if the body only contains unsupported tags`() { + val body = FormattedBody( + format = MessageFormat.HTML, + body = "\"\uD83D\uDE1C\"" + ) + + val document = body.toHtmlDocument(permalinkParser = FakePermalinkParser()) + + assertThat(document).isNull() + } + + @Test + fun `toHtmlDocument - returns a Document if some text survives next to unsupported tags`() { + val body = FormattedBody( + format = MessageFormat.HTML, + body = "Look at this \"cat\"!" + ) + + val document = body.toHtmlDocument(permalinkParser = FakePermalinkParser()) + + assertThat(document?.text()).isEqualTo("Look at this !") + } } diff --git a/libraries/matrixui/src/test/kotlin/io/element/android/libraries/matrix/ui/messages/ToPlainTextTest.kt b/libraries/matrixui/src/test/kotlin/io/element/android/libraries/matrix/ui/messages/ToPlainTextTest.kt index b1031176e7..aa5cf2e96e 100644 --- a/libraries/matrixui/src/test/kotlin/io/element/android/libraries/matrix/ui/messages/ToPlainTextTest.kt +++ b/libraries/matrixui/src/test/kotlin/io/element/android/libraries/matrix/ui/messages/ToPlainTextTest.kt @@ -149,4 +149,16 @@ class ToPlainTextTest : RobolectricTest() { ) assertThat(messageType.toPlainText(permalinkParser = FakePermalinkParser())).isEqualTo("This is the message content.") } + + @Test + fun `TextMessageType toPlainText - returns the body if the formatted one only contains an image`() { + val messageType = TextMessageType( + body = "\uD83D\uDE1C", + formatted = FormattedBody( + format = MessageFormat.HTML, + body = "\"\uD83D\uDE1C\"" + ) + ) + assertThat(messageType.toPlainText(permalinkParser = FakePermalinkParser())).isEqualTo("\uD83D\uDE1C") + } }