From 6c9474b53f58ff5ff843cd8f2f251b751d14b341 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 14 Feb 2023 10:44:55 +0100 Subject: [PATCH] Add limited test for `HtmlDocument`. If we add html strings, there is an error when rendering the preview: java.lang.NoSuchMethodError: 'java.lang.String org.jsoup.nodes.Element.normalName()' --- .../components/html/DocumentProvider.kt | 41 +++++++++++++++++++ .../timeline/components/html/HtmlDocument.kt | 25 ++++++++++- 2 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 features/messages/src/main/kotlin/io/element/android/features/messages/timeline/components/html/DocumentProvider.kt diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/components/html/DocumentProvider.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/components/html/DocumentProvider.kt new file mode 100644 index 0000000000..7562f8653e --- /dev/null +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/components/html/DocumentProvider.kt @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.features.messages.timeline.components.html + +import androidx.compose.ui.tooling.preview.PreviewParameterProvider +import org.jsoup.Jsoup +import org.jsoup.nodes.Document + +open class DocumentProvider : PreviewParameterProvider { + override val values: Sequence + get() = sequenceOf( + "hello", + // TODO Find a way to make is work with real HTML data. For now there is an error with + // jsoup: java.lang.NoSuchMethodError: 'java.lang.String org.jsoup.nodes.Element.normalName()' + /* + "\n" + + " \n" + + " \n" + + "

Bold

\n" + + " \n" + + "", + "Bold", + "

Heading 1

", + "

Heading 2

", + */ + ).map { Jsoup.parse(it) } +} diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/components/html/HtmlDocument.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/components/html/HtmlDocument.kt index b7e8685656..73b7fe8c4a 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/components/html/HtmlDocument.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/components/html/HtmlDocument.kt @@ -42,11 +42,15 @@ import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.text.withStyle +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.google.accompanist.flowlayout.FlowRow import io.element.android.libraries.designsystem.LinkColor import io.element.android.libraries.designsystem.components.ClickableLinkText +import io.element.android.libraries.designsystem.preview.ElementPreviewDark +import io.element.android.libraries.designsystem.preview.ElementPreviewLight import io.element.android.libraries.designsystem.theme.components.Surface import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.matrix.permalink.PermalinkData @@ -99,7 +103,10 @@ private fun HtmlBody( when (val node = nodes.next()) { is TextNode -> { if (!node.isBlank) { - Text(text = node.text()) + Text( + text = node.text(), + color = MaterialTheme.colorScheme.primary, + ) } } is Element -> { @@ -241,6 +248,7 @@ private fun HtmlPreformatted( Text( text = pre.wholeText(), style = TextStyle(fontFamily = FontFamily.Monospace), + color = MaterialTheme.colorScheme.primary, ) } } @@ -567,3 +575,18 @@ private fun HtmlText( onLongClick = onLongClick ) } + +@Preview +@Composable +internal fun HtmlDocumentLightPreview(@PreviewParameter(DocumentProvider::class) document: Document) = + ElementPreviewLight { ContentToPreview(document) } + +@Preview +@Composable +internal fun HtmlDocumentDarkPreview(@PreviewParameter(DocumentProvider::class) document: Document) = + ElementPreviewDark { ContentToPreview(document) } + +@Composable +private fun ContentToPreview(document: Document) { + HtmlDocument(document, MutableInteractionSource()) +}