From 394de03348e26a6425c14fd596dfe9c2c365ac9c Mon Sep 17 00:00:00 2001 From: Janne Koschinski <janne@kuschku.de> Date: Wed, 7 Mar 2018 17:30:21 +0100 Subject: [PATCH] Support also hex background colors --- .../util/irc/format/IrcFormatDeserializer.kt | 46 ++++++++++++++----- .../format/spans/IrcHexBackgroundColorSpan.kt | 9 ++++ .../util/irc/format/spans/IrcHexColorSpan.kt | 9 ---- .../format/spans/IrcHexForegroundColorSpan.kt | 9 ++++ 4 files changed, 53 insertions(+), 20 deletions(-) create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/util/irc/format/spans/IrcHexBackgroundColorSpan.kt delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/util/irc/format/spans/IrcHexColorSpan.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/util/irc/format/spans/IrcHexForegroundColorSpan.kt diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/irc/format/IrcFormatDeserializer.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/util/irc/format/IrcFormatDeserializer.kt index 1033d005b..510352566 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/util/irc/format/IrcFormatDeserializer.kt +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/util/irc/format/IrcFormatDeserializer.kt @@ -196,16 +196,32 @@ class IrcFormatDeserializer(private val context: Context) { plainText.append(str.substring(i - normalCount, i)) normalCount = 0 - val colorStart = i + 1 - val colorEnd = findEndOfHexNumber(str, colorStart) + val foregroundStart = i + 1 + val foregroundEnd = findEndOfHexNumber(str, foregroundStart) // If we have a foreground element - if (colorEnd > colorStart) { - val foreground = readHexNumber(str, colorStart, colorEnd) + if (foregroundEnd > foregroundStart) { + val foreground = readHexNumber(str, foregroundStart, foregroundEnd) + + var background: Int = -1 + var backgroundEnd = -1 + // If we have a background code, read it + if (str.length > foregroundEnd && str[foregroundEnd] == ',') { + backgroundEnd = findEndOfHexNumber(str, foregroundEnd + 1) + background = readHexNumber(str, foregroundEnd + 1, backgroundEnd) + } + // If previous element was also a color element, try to reuse background + if (hexColor != null) { + // Apply old format + if (colorize) hexColor.apply(plainText, plainText.length) + // Reuse old background, if possible + if (background == -1) + background = hexColor.format.background + } // Add new format - hexColor = FormatDescription(plainText.length, HexIrcFormat(foreground)) + hexColor = FormatDescription(plainText.length, HexIrcFormat(foreground, background)) // i points in front of the next character - i = colorEnd - 1 + i = (if (backgroundEnd == -1) foregroundEnd else backgroundEnd) - 1 // Otherwise assume this is a closing tag } else if (hexColor != null) { @@ -326,13 +342,21 @@ class IrcFormatDeserializer(private val context: Context) { } } - private inner class HexIrcFormat(val color: Int) : IrcFormat { + private inner class HexIrcFormat(val foreground: Int, val background: Int) : IrcFormat { override fun applyTo(editable: SpannableStringBuilder, from: Int, to: Int) { - editable.setSpan( - IrcHexColorSpan(color or 0xFFFFFF.inv()), from, to, - Spanned.SPAN_INCLUSIVE_EXCLUSIVE - ) + if (foreground >= 0) { + editable.setSpan( + IrcHexForegroundColorSpan(foreground or 0xFFFFFF.inv()), from, to, + Spanned.SPAN_INCLUSIVE_EXCLUSIVE + ) + } + if (background >= 0) { + editable.setSpan( + IrcHexBackgroundColorSpan(background or 0xFFFFFF.inv()), from, to, + Spanned.SPAN_INCLUSIVE_EXCLUSIVE + ) + } } } diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/irc/format/spans/IrcHexBackgroundColorSpan.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/util/irc/format/spans/IrcHexBackgroundColorSpan.kt new file mode 100644 index 000000000..a7b4f87f6 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/util/irc/format/spans/IrcHexBackgroundColorSpan.kt @@ -0,0 +1,9 @@ +package de.kuschku.quasseldroid_ng.util.irc.format.spans + +import android.support.annotation.ColorInt +import android.text.style.BackgroundColorSpan + +class IrcHexBackgroundColorSpan(@ColorInt color: Int) : BackgroundColorSpan(color), + Copyable<IrcHexBackgroundColorSpan> { + override fun copy() = IrcHexBackgroundColorSpan(backgroundColor) +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/irc/format/spans/IrcHexColorSpan.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/util/irc/format/spans/IrcHexColorSpan.kt deleted file mode 100644 index ef9e33e96..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/util/irc/format/spans/IrcHexColorSpan.kt +++ /dev/null @@ -1,9 +0,0 @@ -package de.kuschku.quasseldroid_ng.util.irc.format.spans - -import android.support.annotation.ColorInt -import android.text.style.ForegroundColorSpan - -class IrcHexColorSpan(@ColorInt color: Int) : ForegroundColorSpan(color), - Copyable<IrcHexColorSpan> { - override fun copy() = IrcHexColorSpan(foregroundColor) -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/irc/format/spans/IrcHexForegroundColorSpan.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/util/irc/format/spans/IrcHexForegroundColorSpan.kt new file mode 100644 index 000000000..b46ce023c --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/util/irc/format/spans/IrcHexForegroundColorSpan.kt @@ -0,0 +1,9 @@ +package de.kuschku.quasseldroid_ng.util.irc.format.spans + +import android.support.annotation.ColorInt +import android.text.style.ForegroundColorSpan + +class IrcHexForegroundColorSpan(@ColorInt color: Int) : ForegroundColorSpan(color), + Copyable<IrcHexForegroundColorSpan> { + override fun copy() = IrcHexForegroundColorSpan(foregroundColor) +} -- GitLab