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