Skip to content

Commit 7b342e1

Browse files
committed
Update the editor caret color according to the app's theme
1 parent bf63a91 commit 7b342e1

File tree

7 files changed

+40
-29
lines changed

7 files changed

+40
-29
lines changed

app/src/main/java/com/infomaniak/mail/ui/newMessage/NewMessageFragment.kt

+7-3
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ import com.infomaniak.mail.ui.newMessage.NewMessageViewModel.UiFrom
7171
import com.infomaniak.mail.utils.SentryDebug
7272
import com.infomaniak.mail.utils.SignatureUtils
7373
import com.infomaniak.mail.utils.Utils
74+
import com.infomaniak.mail.utils.Utils.PRIMARY_COLOR_CODE
7475
import com.infomaniak.mail.utils.WebViewUtils
7576
import com.infomaniak.mail.utils.WebViewUtils.Companion.destroyAndClearHistory
7677
import com.infomaniak.mail.utils.WebViewUtils.Companion.setupNewMessageWebViewSettings
@@ -83,6 +84,7 @@ import kotlinx.coroutines.flow.filterNotNull
8384
import kotlinx.coroutines.flow.launchIn
8485
import kotlinx.coroutines.flow.onEach
8586
import javax.inject.Inject
87+
import com.google.android.material.R as RMaeterial
8688

8789
@AndroidEntryPoint
8890
class NewMessageFragment : Fragment() {
@@ -309,10 +311,12 @@ class NewMessageFragment : Fragment() {
309311

310312
editor.apply {
311313
enableAlgorithmicDarkening(true)
312-
if (context.isNightModeEnabled()) editor.addCss(context.readRawResource(R.raw.custom_dark_mode))
314+
if (context.isNightModeEnabled()) editor.addCss(context.loadCss(R.raw.custom_dark_mode))
313315

314-
addCss(context.readRawResource(R.raw.style))
315-
addCss(context.readRawResource(R.raw.editor_style))
316+
addCss(context.loadCss(R.raw.style))
317+
318+
val customColors = listOf(PRIMARY_COLOR_CODE to context.getAttributeColor(RMaeterial.attr.colorPrimary))
319+
addCss(context.loadCss(R.raw.editor_style, customColors))
316320

317321
isEmptyFlow
318322
.filterNotNull()

app/src/main/java/com/infomaniak/mail/utils/HtmlFormatter.kt

+2-22
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@ import androidx.annotation.RawRes
2222
import com.infomaniak.html.cleaner.HtmlSanitizer
2323
import com.infomaniak.mail.R
2424
import com.infomaniak.mail.data.models.message.Message
25+
import com.infomaniak.mail.utils.Utils.PRIMARY_COLOR_CODE
2526
import com.infomaniak.mail.utils.extensions.getAttributeColor
27+
import com.infomaniak.mail.utils.extensions.loadCss
2628
import com.infomaniak.mail.utils.extensions.readRawResource
2729
import org.jsoup.Jsoup
2830
import org.jsoup.nodes.Element
@@ -178,7 +180,6 @@ class HtmlFormatter(private val html: String) {
178180
data class PrintData(val context: Context, val message: Message)
179181

180182
companion object {
181-
private const val PRIMARY_COLOR_CODE = "--kmail-primary-color"
182183
private const val KMAIL_MESSAGE_ID = "kmail-message-content"
183184

184185
private const val WBR = "wbr"
@@ -189,22 +190,6 @@ class HtmlFormatter(private val html: String) {
189190
private val DETECT_BUT_DO_NOT_BREAK = setOf(' ')
190191
private val BREAK_CHARACTERS = setOf(':', '/', '~', '.', ',', '-', '_', '?', '#', '%', '=', '&')
191192

192-
private fun Context.loadCss(@RawRes cssResId: Int, customColors: List<Pair<String, Int>> = emptyList()): String {
193-
var css = readRawResource(cssResId)
194-
195-
if (customColors.isNotEmpty()) {
196-
var header = ":root {\n"
197-
customColors.forEach { (variableName, color) ->
198-
header += formatCssVariable(variableName, color)
199-
}
200-
header += "}\n\n"
201-
202-
css = header + css
203-
}
204-
205-
return css
206-
}
207-
208193
private fun Context.loadScript(
209194
@RawRes scriptResId: Int,
210195
customVariablesDeclaration: List<Pair<String, Any>> = emptyList(),
@@ -225,11 +210,6 @@ class HtmlFormatter(private val html: String) {
225210
}
226211
}
227212

228-
private fun formatCssVariable(variableName: String, color: Int): String {
229-
val formattedColor = Utils.colorToHexRepresentation(color)
230-
return "$variableName: $formattedColor;\n"
231-
}
232-
233213
fun Context.getCustomDarkMode(): String = loadCss(R.raw.custom_dark_mode)
234214

235215
fun Context.getImproveRenderingStyle(): String = loadCss(R.raw.improve_rendering)

app/src/main/java/com/infomaniak/mail/utils/SignatureUtils.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,14 @@ import android.content.Context
2121
import com.infomaniak.mail.R
2222
import com.infomaniak.mail.data.models.draft.Draft
2323
import com.infomaniak.mail.data.models.signature.Signature
24-
import com.infomaniak.mail.utils.extensions.readRawResource
24+
import com.infomaniak.mail.utils.extensions.loadCss
2525
import javax.inject.Inject
2626
import javax.inject.Singleton
2727

2828
@Singleton
2929
class SignatureUtils @Inject constructor(appContext: Context) {
3030

31-
private val signatureMargins by lazy { appContext.readRawResource(R.raw.signature_margins) }
31+
private val signatureMargins by lazy { appContext.loadCss(R.raw.signature_margins) }
3232

3333
fun encapsulateSignatureContentWithInfomaniakClass(signatureContent: String): String {
3434
val verticalMarginsCss = signatureMargins

app/src/main/java/com/infomaniak/mail/utils/Utils.kt

+2
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ object Utils {
5050

5151
const val SCHEME_SMSTO = "smsto:"
5252

53+
const val PRIMARY_COLOR_CODE = "--kmail-primary-color"
54+
5355
fun colorToHexRepresentation(color: Int) = "#" + color.toHexString().substring(2 until 8)
5456

5557
fun isPermanentDeleteFolder(role: FolderRole?): Boolean {

app/src/main/java/com/infomaniak/mail/utils/WebViewUtils.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import com.infomaniak.mail.utils.HtmlFormatter.Companion.getPrintMailStyle
3232
import com.infomaniak.mail.utils.HtmlFormatter.Companion.getResizeScript
3333
import com.infomaniak.mail.utils.HtmlFormatter.Companion.getSignatureMarginStyle
3434
import com.infomaniak.mail.utils.extensions.enableAlgorithmicDarkening
35-
import com.infomaniak.mail.utils.extensions.readRawResource
35+
import com.infomaniak.mail.utils.extensions.loadCss
3636

3737
class WebViewUtils(context: Context) {
3838

@@ -156,7 +156,7 @@ class WebViewUtils(context: Context) {
156156
}
157157

158158
private fun WebView.addBackgroundJs() {
159-
val css = context.readRawResource(R.raw.custom_dark_mode)
159+
val css = context.loadCss(R.raw.custom_dark_mode)
160160
evaluateJavascript(
161161
""" var style = document.createElement('style')
162162
document.head.appendChild(style)

app/src/main/java/com/infomaniak/mail/utils/extensions/Extensions.kt

+21
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,27 @@ fun Context.formatSubject(subject: String?): String {
190190

191191
fun Context.readRawResource(@RawRes resId: Int): String = Scanner(resources.openRawResource(resId)).useDelimiter("\\A").next()
192192

193+
fun Context.loadCss(@RawRes cssResId: Int, customColors: List<Pair<String, Int>> = emptyList()): String {
194+
var css = readRawResource(cssResId)
195+
196+
if (customColors.isNotEmpty()) {
197+
var header = ":root {\n"
198+
customColors.forEach { (variableName, color) ->
199+
header += formatCssVariable(variableName, color)
200+
}
201+
header += "}\n\n"
202+
203+
css = header + css
204+
}
205+
206+
return css
207+
}
208+
209+
private fun formatCssVariable(variableName: String, color: Int): String {
210+
val formattedColor = Utils.colorToHexRepresentation(color)
211+
return "$variableName: $formattedColor;\n"
212+
}
213+
193214
fun LottieAnimationView.repeatFrame(firstFrame: Int, lastFrame: Int) {
194215
addAnimatorListener(object : Animator.AnimatorListener {
195216
override fun onAnimationStart(animation: Animator) = Unit

app/src/main/res/raw/editor_style.css

+4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
html {
2+
caret-color: var(--kmail-primary-color);
3+
}
4+
15
body {
26
margin-top: 0px;
37
margin-bottom: 0px;

0 commit comments

Comments
 (0)