From 4a9e38115ec730bdf8c8527bec5c49c20330b97f Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Fri, 30 Mar 2018 21:02:36 +0200
Subject: [PATCH] Hide avatar and nick if the same user is sending consecutive
 messages

---
 .../ui/chat/messages/DisplayMessage.kt        |  3 +-
 .../ui/chat/messages/MessageAdapter.kt        |  5 ++
 .../chat/messages/QuasselMessageRenderer.kt   |  1 +
 .../res/layout/widget_chatmessage_plain.xml   | 17 ++++---
 .../persistence/QuasselBacklogStorage.kt      |  3 +-
 .../persistence/QuasselDatabase.kt            | 46 ++++++++++++++-----
 .../viewmodel/data/FormattedMessage.kt        |  1 +
 7 files changed, 56 insertions(+), 20 deletions(-)

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 67d488f26..8a3f6fb43 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
@@ -12,12 +12,13 @@ data class DisplayMessage(
 ) {
   data class Tag(
     val id: MsgId,
+    val isFollowUp: Boolean,
     val isSelected: Boolean,
     val isExpanded: Boolean,
     val isMarkerLine: Boolean
   )
 
-  val tag = Tag(content.messageId, isSelected, isExpanded, isMarkerLine)
+  val tag = Tag(content.messageId, content.followUp, isSelected, isExpanded, isMarkerLine)
   val avatarUrl = content.sender.let {
     Regex("[us]id(\\d+)").matchEntire(HostmaskHelper.user(it))?.groupValues?.lastOrNull()?.let {
       "https://www.irccloud.com/avatar-redirect/$it"
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 14f411ac9..c223b4ede 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
@@ -184,6 +184,11 @@ class MessageAdapter(
 
       this.itemView.isSelected = message.isSelected
 
+      if (message.isFollowUp) {
+        name?.visibility = View.GONE
+        avatar?.visibility = View.GONE
+      }
+
       avatar?.let { avatarView ->
         GlideApp.with(itemView)
           .load(message.avatarUrl)
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 99aadeed1..ce748f883 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
@@ -161,6 +161,7 @@ class QuasselMessageRenderer @Inject constructor(
           combined = SpanFormatter.format("%s: %s", nick, content),
           avatarUrl = message.avatarUrl,
           fallbackDrawable = TextDrawable.builder().buildRound(initial, senderColor),
+          isFollowUp = message.content.followUp,
           isMarkerLine = message.isMarkerLine,
           isExpanded = message.isExpanded,
           isSelected = message.isSelected
diff --git a/app/src/main/res/layout/widget_chatmessage_plain.xml b/app/src/main/res/layout/widget_chatmessage_plain.xml
index 73b01707b..946c39fc1 100644
--- a/app/src/main/res/layout/widget_chatmessage_plain.xml
+++ b/app/src/main/res/layout/widget_chatmessage_plain.xml
@@ -29,15 +29,20 @@
       android:typeface="monospace"
       tools:text="@sample/messages.json/data/time" />
 
-    <ImageView
-      android:id="@+id/avatar"
-      android:layout_width="40dp"
-      android:layout_height="40dp"
+    <FrameLayout
+      android:layout_width="@dimen/avatar_size"
+      android:layout_height="wrap_content"
       android:layout_marginBottom="@dimen/message_vertical"
       android:layout_marginEnd="@dimen/message_horizontal"
       android:layout_marginRight="@dimen/message_horizontal"
-      android:layout_marginTop="@dimen/message_vertical"
-      android:visibility="gone" />
+      android:layout_marginTop="@dimen/message_vertical">
+
+      <ImageView
+        android:id="@+id/avatar"
+        android:layout_width="@dimen/avatar_size"
+        android:layout_height="@dimen/avatar_size"
+        android:visibility="gone" />
+    </FrameLayout>
 
     <LinearLayout
       android:layout_width="0dip"
diff --git a/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselBacklogStorage.kt b/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselBacklogStorage.kt
index f058902d3..7ee165112 100644
--- a/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselBacklogStorage.kt
+++ b/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselBacklogStorage.kt
@@ -29,7 +29,8 @@ class QuasselBacklogStorage(private val db: QuasselDatabase) : BacklogStorage {
           bufferId = message.bufferInfo.bufferId,
           sender = message.sender,
           senderPrefixes = message.senderPrefixes,
-          content = message.content
+          content = message.content,
+          followUp = false
         )
       )
     }
diff --git a/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselDatabase.kt b/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselDatabase.kt
index 4a302cadb..40b3984eb 100644
--- a/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselDatabase.kt
+++ b/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselDatabase.kt
@@ -17,7 +17,7 @@ import de.kuschku.quasseldroid.persistence.QuasselDatabase.Filtered
 import io.reactivex.Flowable
 import org.threeten.bp.Instant
 
-@Database(entities = [DatabaseMessage::class, Filtered::class], version = 3)
+@Database(entities = [DatabaseMessage::class, Filtered::class], version = 4)
 @TypeConverters(DatabaseMessage.MessageTypeConverters::class)
 abstract class QuasselDatabase : RoomDatabase() {
   abstract fun message(): MessageDao
@@ -32,7 +32,8 @@ abstract class QuasselDatabase : RoomDatabase() {
     var bufferId: Int,
     var sender: String,
     var senderPrefixes: String,
-    var content: String
+    var content: String,
+    var followUp: Boolean
   ) {
     class MessageTypeConverters {
       @TypeConverter
@@ -169,7 +170,15 @@ abstract class QuasselDatabase : RoomDatabase() {
                     "CREATE TABLE filtered(bufferId INTEGER, accountId INTEGER, filtered INTEGER, PRIMARY KEY(accountId, bufferId));"
                   )
                 }
-              }).build()
+              },
+              object : Migration(3, 4) {
+                override fun migrate(database: SupportSQLiteDatabase) {
+                  database.execSQL(
+                    "ALTER TABLE message ADD followUp INT DEFAULT 0 NOT NULL;"
+                  )
+                }
+              }
+            ).build()
           }
         }
       }
@@ -202,7 +211,17 @@ FROM
       bufferId,
       sender,
       senderPrefixes,
-      content
+      content,
+      sender = coalesce((SELECT sender
+                         FROM message m
+                         WHERE m.messageId < message.messageId
+                               AND bufferId = ?
+                               AND type & ~? > 0
+                               AND date(datetime(m.time / 1000, 'unixepoch', 'localtime')) =
+                                   date(datetime(message.time / 1000, 'unixepoch', 'localtime'))
+                         ORDER BY m.messageId
+                           DESC
+                         LIMIT 1), 0) AS followUp
     FROM message
     WHERE bufferId = ?
           AND type & ~? > 0
@@ -210,15 +229,18 @@ FROM
     SELECT DISTINCT
       strftime('%s', date(datetime(time / 1000, 'unixepoch', 'localtime')), 'utc') * -1000 AS messageId,
       strftime('%s', date(datetime(time / 1000, 'unixepoch', 'localtime')), 'utc') * 1000  AS time,
-      8192                                                             AS type,
-      0                                                                AS flag,
-      ?                                                                AS bufferId,
-      ''                                                               AS sender,
-      ''                                                               AS senderPrefixes,
-      ''                                                               AS content
+      8192                                                                                 AS type,
+      0                                                                                    AS flag,
+      ?                                                                                    AS bufferId,
+      ''                                                                                   AS sender,
+      ''                                                                                   AS senderPrefixes,
+      ''                                                                                   AS content,
+      0                                                                                    AS followUp
     FROM message
     WHERE bufferId = ?
           AND type & ~? > 0
   ) t
-ORDER BY time DESC, messageId DESC
-  """, arrayOf(bufferId, type, bufferId, bufferId, type)))
\ No newline at end of file
+ORDER BY TIME
+  DESC, messageId
+  DESC
+  """, arrayOf(bufferId, type, bufferId, type, bufferId, bufferId, type)))
\ No newline at end of file
diff --git a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/FormattedMessage.kt b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/FormattedMessage.kt
index fd7c7865b..2ae1319a6 100644
--- a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/FormattedMessage.kt
+++ b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/FormattedMessage.kt
@@ -10,6 +10,7 @@ class FormattedMessage(
   val combined: CharSequence,
   val fallbackDrawable: Drawable? = null,
   val avatarUrl: String? = null,
+  val isFollowUp: Boolean = false,
   val isSelected: Boolean,
   val isExpanded: Boolean,
   val isMarkerLine: Boolean
-- 
GitLab