From 2625e511ba17454b254324b49d26afd33b6c6272 Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Sun, 18 Feb 2018 16:38:57 +0100
Subject: [PATCH] Improve message rendering

---
 .../ui/chat/QuasselMessageRenderer.kt         | 105 ++++++++++++++++--
 .../res/layout/widget_chatmessage_info.xml    |  40 +++++++
 .../res/layout/widget_chatmessage_notice.xml  |  39 +++++++
 app/src/main/res/values/attrs.xml             |   1 +
 app/src/main/res/values/themes_amoled.xml     |   1 +
 app/src/main/res/values/themes_quassel.xml    |   2 +
 app/src/main/res/values/themes_solarized.xml  |   2 +
 7 files changed, 183 insertions(+), 7 deletions(-)
 create mode 100644 app/src/main/res/layout/widget_chatmessage_info.xml
 create mode 100644 app/src/main/res/layout/widget_chatmessage_notice.xml

diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/QuasselMessageRenderer.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/QuasselMessageRenderer.kt
index 688beaa65..0e0f2998c 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/QuasselMessageRenderer.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/QuasselMessageRenderer.kt
@@ -28,9 +28,9 @@ class QuasselMessageRenderer(context: Context) : MessageRenderer {
   init {
     context.theme.styledAttributes(
       R.attr.senderColor0, R.attr.senderColor1, R.attr.senderColor2, R.attr.senderColor3,
-        R.attr.senderColor4, R.attr.senderColor5, R.attr.senderColor6, R.attr.senderColor7,
-        R.attr.senderColor8, R.attr.senderColor9, R.attr.senderColorA, R.attr.senderColorB,
-        R.attr.senderColorC, R.attr.senderColorD, R.attr.senderColorE, R.attr.senderColorF
+      R.attr.senderColor4, R.attr.senderColor5, R.attr.senderColor6, R.attr.senderColor7,
+      R.attr.senderColor8, R.attr.senderColor9, R.attr.senderColorA, R.attr.senderColorB,
+      R.attr.senderColorC, R.attr.senderColorD, R.attr.senderColorE, R.attr.senderColorF
     ) {
       senderColors = IntArray(16) {
         getColor(it, 0)
@@ -40,8 +40,10 @@ class QuasselMessageRenderer(context: Context) : MessageRenderer {
 
   override fun layout(type: Message_Type?, hasHighlight: Boolean)
     = when (type) {
-    Nick, Notice, Mode, Join, Part, Quit, Kick, Kill, Server, Info, DayChange, Topic, NetsplitJoin,
-    NetsplitQuit, Invite -> R.layout.widget_chatmessage_server
+    Nick, Mode, Join, Part, Quit, Kick, Kill, Info, DayChange, Topic, NetsplitJoin,
+    NetsplitQuit, Invite -> R.layout.widget_chatmessage_info
+    Notice               -> R.layout.widget_chatmessage_notice
+    Server               -> R.layout.widget_chatmessage_server
     Error                -> R.layout.widget_chatmessage_error
     Action               -> R.layout.widget_chatmessage_action
     Plain                -> R.layout.widget_chatmessage_plain
@@ -65,8 +67,8 @@ class QuasselMessageRenderer(context: Context) : MessageRenderer {
   }
 
   override fun render(message: QuasselDatabase.DatabaseMessage): FormattedMessage {
-    when (message.type) {
-      else -> return FormattedMessage(
+    return when (message.type) {
+      Message_Type.Plain.bit  -> FormattedMessage(
         message.messageId,
         timeFormatter.format(message.time.atZone(zoneId)),
         SpanFormatter.format(
@@ -76,6 +78,95 @@ class QuasselMessageRenderer(context: Context) : MessageRenderer {
           message.content
         )
       )
+      Message_Type.Action.bit -> FormattedMessage(
+        message.messageId,
+        timeFormatter.format(message.time.atZone(zoneId)),
+        SpanFormatter.format(
+          "* %s%s %s",
+          message.senderPrefixes,
+          formatNick(message.sender),
+          message.content
+        )
+      )
+      Message_Type.Notice.bit -> FormattedMessage(
+        message.messageId,
+        timeFormatter.format(message.time.atZone(zoneId)),
+        SpanFormatter.format(
+          "[%s%s] %s",
+          message.senderPrefixes,
+          formatNick(message.sender),
+          message.content
+        )
+      )
+      Message_Type.Nick.bit   -> FormattedMessage(
+        message.messageId,
+        timeFormatter.format(message.time.atZone(zoneId)),
+        SpanFormatter.format(
+          "%s%s is now known as %s%s",
+          message.senderPrefixes,
+          formatNick(message.sender),
+          message.senderPrefixes,
+          formatNick(message.content)
+        )
+      )
+      Message_Type.Join.bit   -> FormattedMessage(
+        message.messageId,
+        timeFormatter.format(message.time.atZone(zoneId)),
+        SpanFormatter.format(
+          "%s%s joined",
+          message.senderPrefixes,
+          formatNick(message.sender)
+        )
+      )
+      Message_Type.Part.bit   -> FormattedMessage(
+        message.messageId,
+        timeFormatter.format(message.time.atZone(zoneId)),
+        SpanFormatter.format(
+          "%s%s left: %s",
+          message.senderPrefixes,
+          formatNick(message.sender),
+          message.content
+        )
+      )
+      Message_Type.Quit.bit   -> FormattedMessage(
+        message.messageId,
+        timeFormatter.format(message.time.atZone(zoneId)),
+        SpanFormatter.format(
+          "%s%s quit: %s",
+          message.senderPrefixes,
+          formatNick(message.sender),
+          message.content
+        )
+      )
+      Message_Type.Server.bit,
+      Message_Type.Info.bit,
+      Message_Type.Error.bit  -> FormattedMessage(
+        message.messageId,
+        timeFormatter.format(message.time.atZone(zoneId)),
+        SpanFormatter.format(
+          "%s",
+          message.content
+        )
+      )
+      Message_Type.Topic.bit  -> FormattedMessage(
+        message.messageId,
+        timeFormatter.format(message.time.atZone(zoneId)),
+        SpanFormatter.format(
+          "%s",
+          message.content
+        )
+      )
+      else                    -> FormattedMessage(
+        message.messageId,
+        timeFormatter.format(message.time.atZone(zoneId)),
+        SpanFormatter.format(
+          "[%d] %s%s: %s",
+          message.type,
+          message.senderPrefixes,
+          formatNick(message.sender),
+          message.content
+        )
+      )
     }
   }
 
diff --git a/app/src/main/res/layout/widget_chatmessage_info.xml b/app/src/main/res/layout/widget_chatmessage_info.xml
new file mode 100644
index 000000000..0530deda0
--- /dev/null
+++ b/app/src/main/res/layout/widget_chatmessage_info.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+  xmlns:tools="http://schemas.android.com/tools"
+  android:layout_width="match_parent"
+  android:layout_height="wrap_content"
+  android:background="?attr/colorBackgroundSecondary"
+  android:clickable="true"
+  android:focusable="true"
+  android:gravity="top"
+  android:orientation="horizontal"
+  android:paddingBottom="@dimen/message_vertical"
+  android:paddingEnd="@dimen/message_horizontal"
+  android:paddingLeft="@dimen/message_horizontal"
+  android:paddingRight="@dimen/message_horizontal"
+  android:paddingStart="@dimen/message_horizontal"
+  android:paddingTop="@dimen/message_vertical"
+  android:textAppearance="?android:attr/textAppearanceListItemSmall"
+  tools:background="@android:color/background_light"
+  tools:theme="@style/Theme.ChatTheme.Quassel_Light">
+
+  <TextView
+    android:id="@+id/time"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:layout_marginEnd="@dimen/message_horizontal"
+    android:layout_marginRight="@dimen/message_horizontal"
+    android:fontFamily="monospace"
+    android:textColor="?attr/colorForegroundSecondary"
+    tools:text="[15:55]" />
+
+  <TextView
+    android:id="@+id/content"
+    android:layout_width="0dip"
+    android:layout_height="wrap_content"
+    android:layout_weight="1"
+    android:textColor="?attr/colorForegroundSecondary"
+    android:textIsSelectable="true"
+    android:textStyle="italic"
+    tools:text="Connecting to irc.freenode.net:6667..." />
+</LinearLayout>
diff --git a/app/src/main/res/layout/widget_chatmessage_notice.xml b/app/src/main/res/layout/widget_chatmessage_notice.xml
new file mode 100644
index 000000000..0d785dd05
--- /dev/null
+++ b/app/src/main/res/layout/widget_chatmessage_notice.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+  xmlns:tools="http://schemas.android.com/tools"
+  android:layout_width="match_parent"
+  android:layout_height="wrap_content"
+  android:background="?attr/colorBackgroundSecondary"
+  android:clickable="true"
+  android:focusable="true"
+  android:gravity="top"
+  android:orientation="horizontal"
+  android:paddingBottom="@dimen/message_vertical"
+  android:paddingEnd="@dimen/message_horizontal"
+  android:paddingLeft="@dimen/message_horizontal"
+  android:paddingRight="@dimen/message_horizontal"
+  android:paddingStart="@dimen/message_horizontal"
+  android:paddingTop="@dimen/message_vertical"
+  android:textAppearance="?android:attr/textAppearanceListItemSmall"
+  tools:background="@android:color/background_light"
+  tools:theme="@style/Theme.ChatTheme.Quassel_Light">
+
+  <TextView
+    android:id="@+id/time"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:layout_marginEnd="@dimen/message_horizontal"
+    android:layout_marginRight="@dimen/message_horizontal"
+    android:fontFamily="monospace"
+    android:textColor="?attr/colorForegroundNotice"
+    tools:text="[15:55]" />
+
+  <TextView
+    android:id="@+id/content"
+    android:layout_width="0dip"
+    android:layout_height="wrap_content"
+    android:layout_weight="1"
+    android:textColor="?attr/colorForegroundNotice"
+    android:textIsSelectable="true"
+    tools:text="Connecting to irc.freenode.net:6667..." />
+</LinearLayout>
diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml
index 81d04fca8..cc5cf114c 100644
--- a/app/src/main/res/values/attrs.xml
+++ b/app/src/main/res/values/attrs.xml
@@ -39,6 +39,7 @@
   <attr name="colorForeground" format="color" />
   <attr name="colorForegroundHighlight" format="color" />
   <attr name="colorForegroundSecondary" format="color" />
+  <attr name="colorForegroundNotice" format="color" />
   <attr name="colorForegroundAction" format="color" />
   <attr name="colorForegroundError" format="color" />
 
diff --git a/app/src/main/res/values/themes_amoled.xml b/app/src/main/res/values/themes_amoled.xml
index 0786acba1..fe36b6143 100644
--- a/app/src/main/res/values/themes_amoled.xml
+++ b/app/src/main/res/values/themes_amoled.xml
@@ -30,6 +30,7 @@
     <item name="colorForegroundHighlight">#FFFFFF</item>
     <item name="colorForegroundSecondary">#B3FFFFFF</item>
     <item name="colorForegroundAction">#7986cb</item>
+    <item name="colorForegroundNotice">#916409</item>
     <item name="colorForegroundError">#800000</item>
 
     <item name="colorForegroundMirc">0x0</item>
diff --git a/app/src/main/res/values/themes_quassel.xml b/app/src/main/res/values/themes_quassel.xml
index d9cbff96d..f83e1fffb 100644
--- a/app/src/main/res/values/themes_quassel.xml
+++ b/app/src/main/res/values/themes_quassel.xml
@@ -26,6 +26,7 @@
     <item name="colorForegroundHighlight">#DE000000</item>
     <item name="colorForegroundSecondary">#8A000000</item>
     <item name="colorForegroundAction">#1a237e</item>
+    <item name="colorForegroundNotice">#916409</item>
     <item name="colorForegroundError">#800000</item>
 
     <item name="colorForegroundMirc">0x1</item>
@@ -66,6 +67,7 @@
     <item name="colorForegroundHighlight">#FFFFFF</item>
     <item name="colorForegroundSecondary">#B3FFFFFF</item>
     <item name="colorForegroundAction">#7986cb</item>
+    <item name="colorForegroundNotice">#916409</item>
     <item name="colorForegroundError">#800000</item>
 
     <item name="colorForegroundMirc">0x0</item>
diff --git a/app/src/main/res/values/themes_solarized.xml b/app/src/main/res/values/themes_solarized.xml
index 12973f3c5..c1ece0215 100644
--- a/app/src/main/res/values/themes_solarized.xml
+++ b/app/src/main/res/values/themes_solarized.xml
@@ -32,6 +32,7 @@
     <item name="colorForegroundHighlight">#839495</item>
     <item name="colorForegroundSecondary">#576A66</item>
     <item name="colorForegroundAction">#268BD2</item>
+    <item name="colorForegroundNotice">#B58900</item>
     <item name="colorForegroundError">#B00000</item>
 
     <item name="colorForegroundMirc">0xF</item>
@@ -76,6 +77,7 @@
     <item name="colorForegroundHighlight">#839495</item>
     <item name="colorForegroundSecondary">#576A66</item>
     <item name="colorForegroundAction">#268BD2</item>
+    <item name="colorForegroundNotice">#B58900</item>
     <item name="colorForegroundError">#B00000</item>
 
     <item name="colorForegroundMirc">0xF</item>
-- 
GitLab