From 008e12eaec36df404d3a87ebb75f4dc0dcf432d7 Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Sat, 9 Jun 2018 22:25:09 +0200
Subject: [PATCH] Allow highlighting of own messages

---
 .../quasseldroid/settings/MessageSettings.kt  |  3 ++-
 .../kuschku/quasseldroid/settings/Settings.kt |  4 +++
 .../ui/chat/messages/DisplayMessage.kt        |  4 +++
 .../ui/chat/messages/MessageAdapter.kt        | 14 ++++++++---
 .../ui/chat/messages/MessageRenderer.kt       |  9 +++++--
 .../chat/messages/QuasselMessageRenderer.kt   | 25 ++++++++++++++++---
 .../main/res/values/strings_preferences.xml   |  4 +++
 app/src/main/res/values/themes_amoled.xml     |  2 +-
 app/src/main/res/values/themes_dracula.xml    |  2 +-
 app/src/main/res/values/themes_gruvbox.xml    |  4 +--
 app/src/main/res/values/themes_material.xml   |  4 +--
 app/src/main/res/values/themes_quassel.xml    |  4 +--
 app/src/main/res/values/themes_solarized.xml  |  4 +--
 app/src/main/res/xml/preferences.xml          |  6 +++++
 14 files changed, 69 insertions(+), 20 deletions(-)

diff --git a/app/src/main/java/de/kuschku/quasseldroid/settings/MessageSettings.kt b/app/src/main/java/de/kuschku/quasseldroid/settings/MessageSettings.kt
index ff9dada98..6090fc4e2 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/settings/MessageSettings.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/settings/MessageSettings.kt
@@ -36,7 +36,8 @@ data class MessageSettings(
   val showIRCCloudAvatars: Boolean = false,
   val showGravatarAvatars: Boolean = false,
   val showMatrixAvatars: Boolean = false,
-  val largerEmoji: Boolean = false
+  val largerEmoji: Boolean = false,
+  val highlightOwnMessages: Boolean = false
 ) {
 
   enum class ColorizeNicknamesMode {
diff --git a/app/src/main/java/de/kuschku/quasseldroid/settings/Settings.kt b/app/src/main/java/de/kuschku/quasseldroid/settings/Settings.kt
index 765289949..1a05908ea 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/settings/Settings.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/settings/Settings.kt
@@ -128,6 +128,10 @@ object Settings {
       largerEmoji = getBoolean(
         context.getString(R.string.preference_larger_emoji_key),
         MessageSettings.DEFAULT.largerEmoji
+      ),
+      highlightOwnMessages = getBoolean(
+        context.getString(R.string.preference_highlight_own_messages_key),
+        MessageSettings.DEFAULT.highlightOwnMessages
       )
     )
   }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/DisplayMessage.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/DisplayMessage.kt
index 67fd519d8..821809422 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/DisplayMessage.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/DisplayMessage.kt
@@ -19,7 +19,9 @@
 
 package de.kuschku.quasseldroid.ui.chat.messages
 
+import de.kuschku.libquassel.protocol.Message_Flag
 import de.kuschku.libquassel.protocol.MsgId
+import de.kuschku.libquassel.util.flag.hasFlag
 import de.kuschku.quasseldroid.persistence.QuasselDatabase
 
 data class DisplayMessage(
@@ -33,6 +35,7 @@ data class DisplayMessage(
 ) {
   data class Tag(
     val id: MsgId,
+    val isSelf: Boolean,
     val hasDayChange: Boolean,
     val isFollowUp: Boolean,
     val isSelected: Boolean,
@@ -43,6 +46,7 @@ data class DisplayMessage(
 
   val tag = Tag(
     content.messageId,
+    content.flag.hasFlag(Message_Flag.Self),
     hasDayChange,
     isFollowUp,
     isSelected,
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageAdapter.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageAdapter.kt
index 2593a6037..c27834969 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageAdapter.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageAdapter.kt
@@ -110,11 +110,12 @@ class MessageAdapter @Inject constructor(
     it.content.type.value or
       (if (it.content.flag.hasFlag(Message_Flag.Highlight)) MASK_HIGHLIGHT else 0x00) or
       (if (it.isFollowUp) MASK_FOLLOWUP else 0x00) or
-      (if (it.isEmoji) MASK_EMOJI else 0x00)
+      (if (it.isEmoji) MASK_EMOJI else 0x00) or
+      (if (it.content.flag.hasFlag(Message_Flag.Self)) MASK_SELF else 0x00)
   } ?: 0
 
   override fun getItemId(position: Int): Long {
-    return getItem(position)?.content?.messageId?.toLong() ?: 0L
+    return getItem(position)?.content?.messageId ?: 0L
   }
 
   private fun messageType(viewType: Int): Message_Type? =
@@ -126,13 +127,17 @@ class MessageAdapter @Inject constructor(
 
   private fun isEmoji(viewType: Int) = viewType and MASK_EMOJI != 0
 
+  private fun isSelf(viewType: Int) = viewType and MASK_SELF != 0
+
   companion object {
     private const val SHIFT_HIGHLIGHT = 32 - 1
     private const val SHIFT_FOLLOWUP = SHIFT_HIGHLIGHT - 1
     private const val SHIFT_EMOJI = SHIFT_FOLLOWUP - 1
+    private const val SHIFT_SELF = SHIFT_EMOJI - 1
     const val MASK_HIGHLIGHT = 0x01 shl SHIFT_HIGHLIGHT
     const val MASK_FOLLOWUP = 0x01 shl SHIFT_FOLLOWUP
     const val MASK_EMOJI = 0x01 shl SHIFT_EMOJI
+    const val MASK_SELF = 0x01 shl SHIFT_SELF
     const val MASK_TYPE = 0xFFFFFF
   }
 
@@ -141,9 +146,10 @@ class MessageAdapter @Inject constructor(
     val hasHighlight = hasHiglight(viewType)
     val isFollowUp = isFollowUp(viewType)
     val isEmoji = isEmoji(viewType)
+    val isSelf = isSelf(viewType)
     val viewHolder = QuasselMessageViewHolder(
       LayoutInflater.from(parent.context).inflate(
-        messageRenderer.layout(messageType, hasHighlight, isFollowUp, isEmoji),
+        messageRenderer.layout(messageType, hasHighlight, isFollowUp, isEmoji, isSelf),
         parent,
         false
       ),
@@ -153,7 +159,7 @@ class MessageAdapter @Inject constructor(
       expansionListener,
       movementMethod
     )
-    messageRenderer.init(viewHolder, messageType, hasHighlight, isFollowUp, isEmoji)
+    messageRenderer.init(viewHolder, messageType, hasHighlight, isFollowUp, isEmoji, isSelf)
     return viewHolder
   }
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageRenderer.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageRenderer.kt
index c2a1281d8..60c4bb302 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageRenderer.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageRenderer.kt
@@ -27,7 +27,11 @@ import de.kuschku.quasseldroid.viewmodel.data.FormattedMessage
 
 interface MessageRenderer {
   @LayoutRes
-  fun layout(type: Message_Type?, hasHighlight: Boolean, isFollowUp: Boolean, isEmoji: Boolean): Int
+  fun layout(type: Message_Type?,
+             hasHighlight: Boolean,
+             isFollowUp: Boolean,
+             isEmoji: Boolean,
+             isSelf: Boolean): Int
 
   fun bind(holder: MessageAdapter.QuasselMessageViewHolder, message: FormattedMessage,
            original: QuasselDatabase.MessageData)
@@ -38,5 +42,6 @@ interface MessageRenderer {
            messageType: Message_Type?,
            hasHighlight: Boolean,
            isFollowUp: Boolean,
-           isEmoji: Boolean) = Unit
+           isEmoji: Boolean,
+           isSelf: Boolean) = Unit
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/QuasselMessageRenderer.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/QuasselMessageRenderer.kt
index fd1d8853d..113af97d8 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/QuasselMessageRenderer.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/QuasselMessageRenderer.kt
@@ -102,8 +102,11 @@ class QuasselMessageRenderer @Inject constructor(
 
   private val zoneId = ZoneId.systemDefault()
 
-  override fun layout(type: Message_Type?, hasHighlight: Boolean,
-                      isFollowUp: Boolean, isEmoji: Boolean) = when (type) {
+  override fun layout(type: Message_Type?,
+                      hasHighlight: Boolean,
+                      isFollowUp: Boolean,
+                      isEmoji: Boolean,
+                      isSelf: Boolean) = when (type) {
     Notice    -> R.layout.widget_chatmessage_notice
     Server    -> R.layout.widget_chatmessage_server
     Error     -> R.layout.widget_chatmessage_error
@@ -119,7 +122,8 @@ class QuasselMessageRenderer @Inject constructor(
                     messageType: Message_Type?,
                     hasHighlight: Boolean,
                     isFollowUp: Boolean,
-                    isEmoji: Boolean) {
+                    isEmoji: Boolean,
+                    isSelf: Boolean) {
     if (hasHighlight) {
       viewHolder.itemView.context.theme.styledAttributes(
         R.attr.colorForegroundHighlight, R.attr.colorForegroundHighlightSecondary,
@@ -140,6 +144,21 @@ class QuasselMessageRenderer @Inject constructor(
       }
     }
 
+
+    if (isSelf && messageSettings.highlightOwnMessages) {
+      viewHolder.itemView.context.theme.styledAttributes(
+        R.attr.colorBackgroundSecondary,
+        R.attr.backgroundMenuItem
+      ) {
+        viewHolder.messageContainer?.background = LayerDrawable(
+          arrayOf(
+            ColorDrawable(getColor(0, 0)),
+            getDrawable(1)
+          )
+        )
+      }
+    }
+
     val avatarContainer = viewHolder.itemView.findViewById<View>(R.id.avatar_container)
     val avatarPlaceholder = viewHolder.itemView.findViewById<View>(R.id.avatar_placeholder)
 
diff --git a/app/src/main/res/values/strings_preferences.xml b/app/src/main/res/values/strings_preferences.xml
index 30aaf0b19..38e16aed0 100644
--- a/app/src/main/res/values/strings_preferences.xml
+++ b/app/src/main/res/values/strings_preferences.xml
@@ -242,6 +242,10 @@
   <string name="preference_larger_emoji_title">Larger Reactions</string>
   <string name="preference_larger_emoji_summary">Increase the size of emoji-only messages</string>
 
+  <string name="preference_highlight_own_messages_key" translatable="false">highlight_own_messages</string>
+  <string name="preference_highlight_own_messages_title">Highlight own messages</string>
+  <string name="preference_highlight_own_messages_summary">Shows your own messages more prominently</string>
+
 
   <string name="preference_autocomplete_title">Autocomplete</string>
 
diff --git a/app/src/main/res/values/themes_amoled.xml b/app/src/main/res/values/themes_amoled.xml
index ec3b486dc..f43bb84d7 100644
--- a/app/src/main/res/values/themes_amoled.xml
+++ b/app/src/main/res/values/themes_amoled.xml
@@ -63,7 +63,7 @@
     <item name="colorBackground">#000000</item>
     <item name="android:windowBackground">@color/amoled_background</item>
     <item name="colorBackgroundHighlight">#40ffaf3b</item>
-    <item name="colorBackgroundSecondary">@null</item>
+    <item name="colorBackgroundSecondary">#10ffaf3b</item>
     <item name="colorBackgroundCard">#000000</item>
     <item name="colorBackgroundDialog">#000000</item>
 
diff --git a/app/src/main/res/values/themes_dracula.xml b/app/src/main/res/values/themes_dracula.xml
index 39ca255b6..f1f26e2d0 100644
--- a/app/src/main/res/values/themes_dracula.xml
+++ b/app/src/main/res/values/themes_dracula.xml
@@ -63,7 +63,7 @@
     <item name="android:windowBackground">@color/dracula_dark_background</item>
     <item name="colorBackground">#282a36</item>
     <item name="colorBackgroundHighlight">#20ff79c6</item>
-    <item name="colorBackgroundSecondary">@null</item>
+    <item name="colorBackgroundSecondary">#44475a</item>
     <item name="colorBackgroundCard">#44475a</item>
     <item name="colorBackgroundDialog">#282a36</item>
 
diff --git a/app/src/main/res/values/themes_gruvbox.xml b/app/src/main/res/values/themes_gruvbox.xml
index 237c1694f..0ddf26994 100644
--- a/app/src/main/res/values/themes_gruvbox.xml
+++ b/app/src/main/res/values/themes_gruvbox.xml
@@ -63,7 +63,7 @@
     <item name="android:windowBackground">@color/gruvbox_light_background</item>
     <item name="colorBackground">#fbf1c7</item>
     <item name="colorBackgroundHighlight">#40d65d0e</item>
-    <item name="colorBackgroundSecondary">@null</item>
+    <item name="colorBackgroundSecondary">#ebdbb2</item>
     <item name="colorBackgroundCard">#ebdbb2</item>
     <item name="colorBackgroundDialog">#f2d5bc</item>
 
@@ -124,7 +124,7 @@
     <item name="android:windowBackground">@color/gruvbox_dark_background</item>
     <item name="colorBackground">#282828</item>
     <item name="colorBackgroundHighlight">#40d65d0e</item>
-    <item name="colorBackgroundSecondary">@null</item>
+    <item name="colorBackgroundSecondary">#504945</item>
     <item name="colorBackgroundCard">#504945</item>
     <item name="colorBackgroundDialog">#3c3836</item>
 
diff --git a/app/src/main/res/values/themes_material.xml b/app/src/main/res/values/themes_material.xml
index 68ec5e472..e79dcb798 100644
--- a/app/src/main/res/values/themes_material.xml
+++ b/app/src/main/res/values/themes_material.xml
@@ -59,7 +59,7 @@
     <item name="android:windowBackground">@color/material_light_background</item>
     <item name="colorBackground">#FAFAFA</item>
     <item name="colorBackgroundHighlight">#40ffaf3b</item>
-    <item name="colorBackgroundSecondary">@null</item>
+    <item name="colorBackgroundSecondary">#F0F0F0</item>
     <item name="colorBackgroundCard">#FFFFFF</item>
     <item name="colorBackgroundDialog">#FAFAFA</item>
 
@@ -113,7 +113,7 @@
     <item name="android:windowBackground">@color/material_dark_background</item>
     <item name="colorBackground">#303030</item>
     <item name="colorBackgroundHighlight">#40ffaf3b</item>
-    <item name="colorBackgroundSecondary">@null</item>
+    <item name="colorBackgroundSecondary">#424242</item>
     <item name="colorBackgroundCard">#424242</item>
     <item name="colorBackgroundDialog">#303030</item>
 
diff --git a/app/src/main/res/values/themes_quassel.xml b/app/src/main/res/values/themes_quassel.xml
index 41dfcff63..d980cfe2b 100644
--- a/app/src/main/res/values/themes_quassel.xml
+++ b/app/src/main/res/values/themes_quassel.xml
@@ -61,7 +61,7 @@
     <item name="android:windowBackground">@color/quassel_light_background</item>
     <item name="colorBackground">#FAFAFA</item>
     <item name="colorBackgroundHighlight">#ffaf3b</item>
-    <item name="colorBackgroundSecondary">@null</item>
+    <item name="colorBackgroundSecondary">#F0F0F0</item>
     <item name="colorBackgroundCard">#FFFFFF</item>
     <item name="colorBackgroundDialog">#FAFAFA</item>
 
@@ -117,7 +117,7 @@
     <item name="android:windowBackground">@color/quassel_dark_background</item>
     <item name="colorBackground">#303030</item>
     <item name="colorBackgroundHighlight">#ffaf3b</item>
-    <item name="colorBackgroundSecondary">@null</item>
+    <item name="colorBackgroundSecondary">#424242</item>
     <item name="colorBackgroundCard">#424242</item>
     <item name="colorBackgroundDialog">#303030</item>
 
diff --git a/app/src/main/res/values/themes_solarized.xml b/app/src/main/res/values/themes_solarized.xml
index 9d5319b21..1d2a5ec0f 100644
--- a/app/src/main/res/values/themes_solarized.xml
+++ b/app/src/main/res/values/themes_solarized.xml
@@ -63,7 +63,7 @@
     <item name="android:windowBackground">@color/solarized_light_background</item>
     <item name="colorBackground">#FDF6E3</item>
     <item name="colorBackgroundHighlight">#40B58900</item>
-    <item name="colorBackgroundSecondary">@null</item>
+    <item name="colorBackgroundSecondary">#EEE8D5</item>
     <item name="colorBackgroundCard">#EEE8D5</item>
     <item name="colorBackgroundDialog">#FDF6E3</item>
 
@@ -124,7 +124,7 @@
     <item name="android:windowBackground">@color/solarized_dark_background</item>
     <item name="colorBackground">#002B36</item>
     <item name="colorBackgroundHighlight">#30268BD2</item>
-    <item name="colorBackgroundSecondary">@null</item>
+    <item name="colorBackgroundSecondary">#073642</item>
     <item name="colorBackgroundCard">#073642</item>
     <item name="colorBackgroundDialog">#002B36</item>
 
diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml
index c4dfa7cc4..9e301f156 100644
--- a/app/src/main/res/xml/preferences.xml
+++ b/app/src/main/res/xml/preferences.xml
@@ -213,6 +213,12 @@
       android:key="@string/preference_larger_emoji_key"
       android:summary="@string/preference_larger_emoji_summary"
       android:title="@string/preference_larger_emoji_title" />
+    <SwitchPreference
+      android:defaultValue="false"
+      android:dependency="@string/preference_highlight_own_messages"
+      android:key="@string/preference_highlight_own_messages_key"
+      android:summary="@string/preference_highlight_own_messages_summary"
+      android:title="@string/preference_highlight_own_messages_title" />
   </PreferenceCategory>
 
   <PreferenceCategory android:layout="@layout/widget_preference_divider" />
-- 
GitLab