Skip to content

Commit 82ea819

Browse files
committed
Merge pull request #9939 from rafaeltonholo/revert-9399-changes
Revert "Propose a solution for #3172, initially covering long URL on mobile phone screens"
1 parent 88baee0 commit 82ea819

File tree

2 files changed

+34
-120
lines changed

2 files changed

+34
-120
lines changed
Lines changed: 25 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,65 +1,40 @@
11
package com.fsck.k9.message.html
22

33
import app.k9mail.html.cleaner.HtmlHeadProvider
4-
import org.intellij.lang.annotations.Language
54

65
class DisplayHtml(private val settings: HtmlSettings) : HtmlHeadProvider {
76
override val headHtml: String
87
get() {
9-
@Language("HTML")
10-
val html = """
11-
<meta name="viewport" content="width=device-width"/>
12-
${cssStyleGlobal()}
13-
${cssStylePre()}
14-
${cssStyleSignature()}
15-
""".trimIndent()
16-
17-
return html
8+
return """<meta name="viewport" content="width=device-width"/>""" +
9+
cssStyleTheme() +
10+
cssStylePre() +
11+
cssStyleSignature()
1812
}
1913

2014
fun wrapStatusMessage(status: CharSequence): String {
21-
@Language("HTML")
22-
val html = """
23-
<div style="text-align:center; color: grey;">$status</div>
24-
""".trimIndent()
25-
26-
return wrapMessageContent(html)
15+
return wrapMessageContent("<div style=\"text-align:center; color: grey;\">$status</div>")
2716
}
2817

29-
@Language("HTML")
3018
fun wrapMessageContent(messageContent: CharSequence): String {
3119
// Include a meta tag so the WebView will not use a fixed viewport width of 980 px
32-
return """
33-
<html dir="auto">
34-
<head>
35-
$headHtml
36-
</head>
37-
<body>
38-
$messageContent
39-
</body>
40-
</html>
41-
""".trimIndent()
20+
return "<html dir=\"auto\"><head><meta name=\"viewport\" content=\"width=device-width\"/>" +
21+
cssStyleTheme() +
22+
cssStylePre() +
23+
"</head><body>" +
24+
messageContent +
25+
"</body></html>"
4226
}
4327

44-
/**
45-
* Dynamically generates a CSS style block that applies global rules to all elements (`*` selector).
46-
*
47-
* The style enforces word-breaking and overflow wrapping to prevent content overflow
48-
* and ensures long text strings break correctly without causing horizontal scrolling.
49-
*
50-
* @return A `<style>` element string that can be dynamically injected into the HTML `<head>`
51-
* to apply these global styles when rendering messages.
52-
*/
53-
@Language("HTML")
54-
private fun cssStyleGlobal(): String {
55-
return """
56-
<style type="text/css">
57-
* {
58-
word-break: break-word;
59-
overflow-wrap: break-word;
60-
}
61-
</style>
62-
""".trimIndent()
28+
private fun cssStyleTheme(): String {
29+
return if (settings.useDarkMode) {
30+
// TODO: Don't hardcode these values. Inject them via HtmlSettings.
31+
"<style type=\"text/css\">" +
32+
"* { background: #121212 ! important; color: #F3F3F3 !important }" +
33+
":link, :link * { color: #CCFF33 !important }" +
34+
":visited, :visited * { color: #551A8B !important }</style> "
35+
} else {
36+
""
37+
}
6338
}
6439

6540
/**
@@ -70,30 +45,15 @@ class DisplayHtml(private val settings: HtmlSettings) : HtmlHeadProvider {
7045
* @return A `<style>` element that can be dynamically included in the HTML `<head>` element when messages are
7146
* displayed.
7247
*/
73-
@Language("HTML")
7448
private fun cssStylePre(): String {
7549
val font = if (settings.useFixedWidthFont) "monospace" else "sans-serif"
7650

77-
return """
78-
<style type="text/css">
79-
pre.${EmailTextToHtml.K9MAIL_CSS_CLASS} {
80-
white-space: pre-wrap;
81-
word-wrap: break-word;
82-
font-family: $font;
83-
margin-top: 0px;
84-
}
85-
</style>
86-
""".trimIndent()
51+
return "<style type=\"text/css\"> pre." + EmailTextToHtml.K9MAIL_CSS_CLASS +
52+
" {white-space: pre-wrap; word-wrap:break-word; " +
53+
"font-family: " + font + "; margin-top: 0px}</style>"
8754
}
8855

89-
@Language("HTML")
9056
private fun cssStyleSignature(): String {
91-
return """
92-
<style type="text/css">
93-
.k9mail-signature {
94-
opacity: 0.5;
95-
}
96-
</style>
97-
""".trimIndent()
57+
return """<style type="text/css">.k9mail-signature { opacity: 0.5 }</style>"""
9858
}
9959
}

legacy/core/src/test/java/com/fsck/k9/message/html/DisplayHtmlTest.kt

Lines changed: 9 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,13 @@ package com.fsck.k9.message.html
22

33
import assertk.Assert
44
import assertk.assertThat
5-
import assertk.assertions.contains
65
import assertk.assertions.hasSize
76
import assertk.assertions.isEqualTo
87
import org.jsoup.Jsoup
98
import org.junit.Test
109

1110
class DisplayHtmlTest {
12-
val htmlSettings = HtmlSettings(useDarkMode = false, useFixedWidthFont = false)
13-
val displayHtml = DisplayHtml(htmlSettings)
11+
val displayHtml = DisplayHtml(HtmlSettings(useDarkMode = false, useFixedWidthFont = false))
1412

1513
@Test
1614
fun wrapMessageContent_addsViewportMetaElement() {
@@ -27,45 +25,19 @@ class DisplayHtmlTest {
2725
}
2826

2927
@Test
30-
fun wrapMessageContent_addsPreCSSStyles() {
28+
fun wrapMessageContent_addsPreCSS() {
3129
val html = displayHtml.wrapMessageContent("Some text")
3230

33-
assertThat(html).containsHtmlElement("head > style", 3)
34-
}
35-
36-
@Test
37-
fun wrapMessageContent_addsGlobalStyleRules() {
38-
val html = displayHtml.wrapMessageContent("test")
39-
40-
assertThat(html).containsStyleRulesFor(
41-
selector = "*",
42-
"word-break: break-word;",
43-
"overflow-wrap: break-word;",
44-
)
31+
assertThat(html).containsHtmlElement("head > style")
4532
}
4633

4734
@Test
48-
fun wrapMessageContent_addsPreCSS() {
49-
val html = displayHtml.wrapMessageContent("test")
50-
val expectedFont = if (htmlSettings.useFixedWidthFont) "monospace" else "sans-serif"
51-
52-
assertThat(html).containsStyleRulesFor(
53-
selector = "pre.${EmailTextToHtml.K9MAIL_CSS_CLASS}",
54-
"white-space: pre-wrap;",
55-
"word-wrap: break-word;",
56-
"font-family: $expectedFont;",
57-
"margin-top: 0px;",
58-
)
59-
}
35+
fun wrapMessageContent_whenDarkMessageViewTheme_addsDarkThemeCSS() {
36+
val darkModeDisplayHtml = DisplayHtml(HtmlSettings(useDarkMode = true, useFixedWidthFont = false))
6037

61-
@Test
62-
fun wrapMessageContent_addsSignatureStyleRules() {
63-
val html = displayHtml.wrapMessageContent("test")
38+
val html = darkModeDisplayHtml.wrapMessageContent("Some text")
6439

65-
assertThat(html).containsStyleRulesFor(
66-
selector = ".k9mail-signature",
67-
"opacity: 0.5;",
68-
)
40+
assertThat(html).htmlElements("head > style").hasSize(2)
6941
}
7042

7143
@Test
@@ -77,26 +49,8 @@ class DisplayHtmlTest {
7749
assertThat(html).bodyText().isEqualTo(content)
7850
}
7951

80-
private fun Assert<String>.containsStyleRulesFor(selector: String, vararg expectedRules: String) = given { html ->
81-
val styleContent = Jsoup.parse(html)
82-
.select("style")
83-
.joinToString("\n") { it.data() }
84-
85-
val selectorPattern = Regex.escape(selector).replace("\\*", "\\\\*")
86-
val selectorBlock = Regex("$selectorPattern\\s*\\{([^}]*)\\}", RegexOption.MULTILINE)
87-
.find(styleContent)
88-
?.groupValues?.get(1)
89-
?.trim()
90-
91-
requireNotNull(selectorBlock) { "No style block found for selector: $selector" }
92-
93-
expectedRules.forEach { rule ->
94-
assertThat(selectorBlock).contains(rule)
95-
}
96-
}
97-
98-
private fun Assert<String>.containsHtmlElement(cssQuery: String, expectedCount: Int = 1) = given { actual ->
99-
assertThat(actual).htmlElements(cssQuery).hasSize(expectedCount)
52+
private fun Assert<String>.containsHtmlElement(cssQuery: String) = given { actual ->
53+
assertThat(actual).htmlElements(cssQuery).hasSize(1)
10054
}
10155

10256
private fun Assert<String>.htmlElements(cssQuery: String) = transform { html ->

0 commit comments

Comments
 (0)