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, "
")
+ )
+ ),
+ 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 = "
"
+ )
+
+ 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
!"
+ )
+
+ 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 = "
"
+ )
+ )
+ assertThat(messageType.toPlainText(permalinkParser = FakePermalinkParser())).isEqualTo("\uD83D\uDE1C")
+ }
}