From 57f9a9a1097c46aa101f1f867e8c5969d1a62dce Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Sat, 24 Feb 2018 22:46:20 +0100
Subject: [PATCH] Allow showing hostmask in join/part/quit messages

---
 .../ui/chat/NickListFragment.kt               |  8 +++
 .../chat/messages/QuasselMessageRenderer.kt   | 69 ++++++++++---------
 .../ui/settings/data/AppearanceSettings.kt    |  1 +
 .../ui/settings/data/Settings.kt              | 26 ++++---
 .../main/res/values/strings_preferences.xml   | 20 +++---
 app/src/main/res/xml/preferences.xml          | 30 ++++----
 6 files changed, 91 insertions(+), 63 deletions(-)

diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/NickListFragment.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/NickListFragment.kt
index 0d1c34236..0590152f9 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/NickListFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/NickListFragment.kt
@@ -52,6 +52,14 @@ class NickListFragment : ServiceBoundFragment() {
       viewModel.nickData.map {
         it.map {
           it.copy(
+            modes = when (appearanceSettings.showPrefix) {
+              AppearanceSettings.ShowPrefixMode.ALL -> it.modes
+              else                                  -> it.modes.substring(
+                0, Math.min(
+                it.modes.length, 1
+              )
+              )
+            },
             realname = ircFormatDeserializer?.formatString(
               it.realname.toString(), appearanceSettings.colorizeMirc
             ) ?: it.realname
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/messages/QuasselMessageRenderer.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/messages/QuasselMessageRenderer.kt
index 8ee5dda43..993162c30 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/messages/QuasselMessageRenderer.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/messages/QuasselMessageRenderer.kt
@@ -102,40 +102,40 @@ class QuasselMessageRenderer(
     val self = Message_Flag.of(message.flag).hasFlag(Message_Flag.Self)
     val highlight = Message_Flag.of(message.flag).hasFlag(Message_Flag.Highlight)
     return when (Message_Type.of(message.type).enabledValues().firstOrNull()) {
-      Message_Type.Plain  -> FormattedMessage(
+      Message_Type.Plain        -> FormattedMessage(
         message.messageId,
         timeFormatter.format(message.time.atZone(zoneId)),
         SpanFormatter.format(
           context.getString(R.string.message_format_plain),
           formatPrefix(message.senderPrefixes, highlight),
-          formatNick(message.sender, self, highlight),
+          formatNick(message.sender, self, highlight, false),
           formatContent(message.content, highlight)
         ),
         message.messageId == markerLine
       )
-      Message_Type.Action -> FormattedMessage(
+      Message_Type.Action       -> FormattedMessage(
         message.messageId,
         timeFormatter.format(message.time.atZone(zoneId)),
         SpanFormatter.format(
           context.getString(R.string.message_format_action),
           formatPrefix(message.senderPrefixes, highlight),
-          formatNick(message.sender, self, highlight),
+          formatNick(message.sender, self, highlight, false),
           formatContent(message.content, highlight)
         ),
         message.messageId == markerLine
       )
-      Message_Type.Notice -> FormattedMessage(
+      Message_Type.Notice       -> FormattedMessage(
         message.messageId,
         timeFormatter.format(message.time.atZone(zoneId)),
         SpanFormatter.format(
           context.getString(R.string.message_format_notice),
           formatPrefix(message.senderPrefixes, highlight),
-          formatNick(message.sender, self, highlight),
+          formatNick(message.sender, self, highlight, false),
           formatContent(message.content, highlight)
         ),
         message.messageId == markerLine
       )
-      Message_Type.Nick   -> {
+      Message_Type.Nick         -> {
         val nickSelf = message.sender == message.content || self
         FormattedMessage(
           message.messageId,
@@ -144,74 +144,74 @@ class QuasselMessageRenderer(
             SpanFormatter.format(
               context.getString(R.string.message_format_nick_self),
               formatPrefix(message.senderPrefixes, highlight),
-              formatNick(message.sender, nickSelf, highlight)
+              formatNick(message.sender, nickSelf, highlight, false)
             )
           } else {
             SpanFormatter.format(
               context.getString(R.string.message_format_nick),
               formatPrefix(message.senderPrefixes, highlight),
-              formatNick(message.sender, nickSelf, highlight),
+              formatNick(message.sender, nickSelf, highlight, false),
               formatPrefix(message.senderPrefixes, highlight),
-              formatNick(message.content, nickSelf, highlight)
+              formatNick(message.content, nickSelf, highlight, false)
             )
           },
           message.messageId == markerLine
         )
       }
-      Message_Type.Mode   -> FormattedMessage(
+      Message_Type.Mode         -> FormattedMessage(
         message.messageId,
         timeFormatter.format(message.time.atZone(zoneId)),
         SpanFormatter.format(
           context.getString(R.string.message_format_mode),
           message.content,
           formatPrefix(message.senderPrefixes, highlight),
-          formatNick(message.sender, self, highlight)
+          formatNick(message.sender, self, highlight, true)
         ),
         message.messageId == markerLine
       )
-      Message_Type.Join   -> FormattedMessage(
+      Message_Type.Join         -> FormattedMessage(
         message.messageId,
         timeFormatter.format(message.time.atZone(zoneId)),
         SpanFormatter.format(
           context.getString(R.string.message_format_join),
           formatPrefix(message.senderPrefixes, highlight),
-          formatNick(message.sender, self, highlight)
+          formatNick(message.sender, self, highlight, true)
         ),
         message.messageId == markerLine
       )
-      Message_Type.Part   -> FormattedMessage(
+      Message_Type.Part         -> FormattedMessage(
         message.messageId,
         timeFormatter.format(message.time.atZone(zoneId)),
         if (message.content.isBlank()) {
           SpanFormatter.format(
             context.getString(R.string.message_format_part_1),
             formatPrefix(message.senderPrefixes, highlight),
-            formatNick(message.sender, self, highlight)
+            formatNick(message.sender, self, highlight, true)
           )
         } else {
           SpanFormatter.format(
             context.getString(R.string.message_format_part_2),
             formatPrefix(message.senderPrefixes, highlight),
-            formatNick(message.sender, self, highlight),
+            formatNick(message.sender, self, highlight, true),
             message.content
           )
         },
         message.messageId == markerLine
       )
-      Message_Type.Quit -> FormattedMessage(
+      Message_Type.Quit         -> FormattedMessage(
         message.messageId,
         timeFormatter.format(message.time.atZone(zoneId)),
         if (message.content.isBlank()) {
           SpanFormatter.format(
             context.getString(R.string.message_format_quit_1),
             formatPrefix(message.senderPrefixes, highlight),
-            formatNick(message.sender, self, highlight)
+            formatNick(message.sender, self, highlight, true)
           )
         } else {
           SpanFormatter.format(
             context.getString(R.string.message_format_quit_2),
             formatPrefix(message.senderPrefixes, highlight),
-            formatNick(message.sender, self, highlight),
+            formatNick(message.sender, self, highlight, true),
             message.content
           )
         },
@@ -245,26 +245,26 @@ class QuasselMessageRenderer(
       }
       Message_Type.Server,
       Message_Type.Info,
-      Message_Type.Error -> FormattedMessage(
+      Message_Type.Error        -> FormattedMessage(
         message.messageId,
         timeFormatter.format(message.time.atZone(zoneId)),
         formatContent(message.content, highlight),
         message.messageId == markerLine
       )
-      Message_Type.Topic -> FormattedMessage(
+      Message_Type.Topic        -> FormattedMessage(
         message.messageId,
         timeFormatter.format(message.time.atZone(zoneId)),
         formatContent(message.content, highlight),
         message.messageId == markerLine
       )
-      else -> FormattedMessage(
+      else                      -> FormattedMessage(
         message.messageId,
         timeFormatter.format(message.time.atZone(zoneId)),
         SpanFormatter.format(
           "[%d] %s%s: %s",
           message.type,
           formatPrefix(message.senderPrefixes, highlight),
-          formatNick(message.sender, self, highlight),
+          formatNick(message.sender, self, highlight, true),
           message.content
         ),
         message.messageId == markerLine
@@ -324,32 +324,37 @@ class QuasselMessageRenderer(
     }
   }
 
-  private fun formatNickImpl(sender: String, colorize: Boolean): CharSequence {
+  private fun formatNickImpl(sender: String, colorize: Boolean, hostmask: Boolean): CharSequence {
     val nick = IrcUserUtils.nick(sender)
-    val spannableString = SpannableString(nick)
+    val content = if (hostmask) sender else nick
+    val spannableString = SpannableString(content)
     if (colorize) {
       val senderColor = IrcUserUtils.senderColor(nick)
       spannableString.setSpan(
         ForegroundColorSpan(senderColors[senderColor % senderColors.size]),
         0,
-        nick.length,
+        content.length,
         SpannableString.SPAN_INCLUSIVE_EXCLUSIVE
       )
     }
     spannableString.setSpan(
       StyleSpan(Typeface.BOLD),
       0,
-      nick.length,
+      content.length,
       SpannableString.SPAN_INCLUSIVE_EXCLUSIVE
     )
     return spannableString
   }
 
   private fun formatNick(sender: String, self: Boolean,
-                         highlight: Boolean) = when (appearanceSettings.colorizeNicknames) {
-    ColorizeNicknamesMode.ALL          -> formatNickImpl(sender, !highlight)
-    ColorizeNicknamesMode.ALL_BUT_MINE -> formatNickImpl(sender, !self && !highlight)
-    ColorizeNicknamesMode.NONE         -> formatNickImpl(sender, false)
+                         highlight: Boolean, showHostmask: Boolean) =
+    when (appearanceSettings.colorizeNicknames) {
+      ColorizeNicknamesMode.ALL          ->
+        formatNickImpl(sender, !highlight, appearanceSettings.showHostmask && showHostmask)
+      ColorizeNicknamesMode.ALL_BUT_MINE ->
+        formatNickImpl(sender, !self && !highlight, appearanceSettings.showHostmask && showHostmask)
+      ColorizeNicknamesMode.NONE         ->
+        formatNickImpl(sender, false, appearanceSettings.showHostmask && showHostmask)
   }
 
   private fun formatPrefix(prefix: String,
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/data/AppearanceSettings.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/data/AppearanceSettings.kt
index a9741f275..f3f53c065 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/data/AppearanceSettings.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/data/AppearanceSettings.kt
@@ -10,6 +10,7 @@ data class AppearanceSettings(
   val useMonospace: Boolean = false,
   val showSeconds: Boolean = false,
   val use24hClock: Boolean = true,
+  val showHostmask: Boolean = false,
   val showLag: Boolean = true,
   val theme: Theme = Theme.QUASSEL_LIGHT
 ) {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/data/Settings.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/data/Settings.kt
index ca4f45c5d..3c820d012 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/data/Settings.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/data/Settings.kt
@@ -14,6 +14,18 @@ object Settings {
           AppearanceSettings.DEFAULT.theme.name
         )
       ),
+      useMonospace = getBoolean(
+        context.getString(R.string.preference_monospace_key),
+        AppearanceSettings.DEFAULT.useMonospace
+      ),
+      showSeconds = getBoolean(
+        context.getString(R.string.preference_show_seconds_key),
+        AppearanceSettings.DEFAULT.showSeconds
+      ),
+      use24hClock = getBoolean(
+        context.getString(R.string.preference_use_24h_clock_key),
+        AppearanceSettings.DEFAULT.use24hClock
+      ),
       showPrefix = ShowPrefixMode.valueOf(
         getString(
           context.getString(R.string.preference_show_prefix_key),
@@ -30,17 +42,9 @@ object Settings {
         context.getString(R.string.preference_colorize_mirc_key),
         AppearanceSettings.DEFAULT.colorizeMirc
       ),
-      useMonospace = getBoolean(
-        context.getString(R.string.preference_monospace_key),
-        AppearanceSettings.DEFAULT.useMonospace
-      ),
-      showSeconds = getBoolean(
-        context.getString(R.string.preference_show_seconds_key),
-        AppearanceSettings.DEFAULT.showSeconds
-      ),
-      use24hClock = getBoolean(
-        context.getString(R.string.preference_use_24h_clock_key),
-        AppearanceSettings.DEFAULT.use24hClock
+      showHostmask = getBoolean(
+        context.getString(R.string.preference_hostmask_key),
+        AppearanceSettings.DEFAULT.showHostmask
       ),
       showLag = getBoolean(
         context.getString(R.string.preference_show_lag_key),
diff --git a/app/src/main/res/values/strings_preferences.xml b/app/src/main/res/values/strings_preferences.xml
index e6ef17ff5..0ba6ff568 100644
--- a/app/src/main/res/values/strings_preferences.xml
+++ b/app/src/main/res/values/strings_preferences.xml
@@ -30,6 +30,15 @@
     <item>GRUVBOX_DARK</item>
   </string-array>
 
+  <string name="preference_monospace_key" translatable="false">monospace</string>
+  <string name="preference_monospace_title">Use Monospace Font</string>
+
+  <string name="preference_show_seconds_key" translatable="false">show_seconds</string>
+  <string name="preference_show_seconds_title">Show Seconds</string>
+
+  <string name="preference_use_24h_clock_key" translatable="false">use_24h_clock</string>
+  <string name="preference_use_24h_clock_title">Use 24h Clock</string>
+
   <string name="preference_colorize_mirc_key" translatable="false">colorize_mirc</string>
   <string name="preference_colorize_mirc_title">Use mIRC Colors</string>
   <string name="preference_colorize_mirc_summaryon">Show mIRC colors in messages</string>
@@ -67,14 +76,9 @@
     <item>NONE</item>
   </string-array>
 
-  <string name="preference_monospace_key" translatable="false">monospace</string>
-  <string name="preference_monospace_title">Use Monospace Font</string>
-
-  <string name="preference_show_seconds_key" translatable="false">show_seconds</string>
-  <string name="preference_show_seconds_title">Show Seconds</string>
-
-  <string name="preference_use_24h_clock_key" translatable="false">use_24h_clock</string>
-  <string name="preference_use_24h_clock_title">Use 24h Clock</string>
+  <string name="preference_hostmask_key" translatable="false">hostmask</string>
+  <string name="preference_hostmask_title">Show Hostmask</string>
+  <string name="preference_hostmask_summary">Display the full nick!ident@host in messages</string>
 
   <string name="preference_show_lag_key" translatable="false">show_lag</string>
   <string name="preference_show_lag_title">Show lag</string>
diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml
index 2e1c9c5eb..11c9426fe 100644
--- a/app/src/main/res/xml/preferences.xml
+++ b/app/src/main/res/xml/preferences.xml
@@ -8,6 +8,21 @@
       android:key="@string/preference_theme_key"
       android:title="@string/preference_theme_title" />
 
+    <SwitchPreference
+      android:defaultValue="false"
+      android:key="@string/preference_monospace_key"
+      android:title="@string/preference_monospace_title" />
+
+    <SwitchPreference
+      android:defaultValue="false"
+      android:key="@string/preference_show_seconds_key"
+      android:title="@string/preference_show_seconds_title" />
+
+    <SwitchPreference
+      android:defaultValue="true"
+      android:key="@string/preference_use_24h_clock_key"
+      android:title="@string/preference_use_24h_clock_title" />
+
     <SwitchPreference
       android:defaultValue="true"
       android:key="@string/preference_colorize_mirc_key"
@@ -31,18 +46,9 @@
 
     <SwitchPreference
       android:defaultValue="false"
-      android:key="@string/preference_monospace_key"
-      android:title="@string/preference_monospace_title" />
-
-    <SwitchPreference
-      android:defaultValue="false"
-      android:key="@string/preference_show_seconds_key"
-      android:title="@string/preference_show_seconds_title" />
-
-    <SwitchPreference
-      android:defaultValue="true"
-      android:key="@string/preference_use_24h_clock_key"
-      android:title="@string/preference_use_24h_clock_title" />
+      android:key="@string/preference_hostmask_key"
+      android:summary="@string/preference_hostmask_summary"
+      android:title="@string/preference_hostmask_title" />
 
     <SwitchPreference
       android:defaultValue="false"
-- 
GitLab