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