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 67d488f269cadbe761b59cb1605b17cbf3a88262..8a3f6fb4313e750ff4fb983fc6739658de52b952 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 14f411ac93199f065563485a4069f6f33039d1a9..c223b4edeeb456fd57acba49ad367d8e8b41b1f7 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 99aadeed13b6d5c44f3c37aee7889b89bb210ba4..ce748f8832f986e42b048d56b6029673c9e2e4de 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 73b01707bd896d6beaaa33c76c6da1645124c71c..946c39fc1d07cccc5d84d58a240a6a0754ede2c9 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 f058902d30ae83cbd82b0389536243fef2350562..7ee165112f725703a92fdf3c16ac4783965331d6 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 4a302cadbcd021fe5ada329eee6a0d760e9f046f..40b3984ebfd7d6b301664f895bc37f8ff0ed9e8e 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 fd7c7865b90276fd6f68e6822a7d4cf57709874c..2ae1319a6032ee8101e6ec0569bdb28f758f07c7 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