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 c223b4edeeb456fd57acba49ad367d8e8b41b1f7..2a4310464029221148384483a8ba59c73b6adf7d 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 @@ -59,31 +59,42 @@ class MessageAdapter( } override fun getItemViewType(position: Int) = getItem(position)?.let { - viewType(Message_Flags.of(it.content.type), Message_Flags.of(it.content.flag)) + viewType(Message_Flags.of(it.content.type), + Message_Flags.of(it.content.flag), + it.content.followUp) } ?: 0 - private fun viewType(type: Message_Types, flags: Message_Flags) = - if (flags.hasFlag(Message_Flag.Highlight)) { - -type.value - } else { - type.value - } + private fun viewType(type: Message_Types, flags: Message_Flags, followUp: Boolean) = + type.value or + (if (flags.hasFlag(Message_Flag.Highlight)) MASK_HIGHLIGHT else 0x00) or + (if (followUp) MASK_FOLLOWUP else 0x00) override fun getItemId(position: Int): Long { return getItem(position)?.content?.messageId?.toLong() ?: 0L } private fun messageType(viewType: Int): Message_Type? = - Message_Type.of(Math.abs(viewType)).enabledValues().firstOrNull() + Message_Type.of(viewType and MASK_TYPE).enabledValues().firstOrNull() + + private fun hasHiglight(viewType: Int) = viewType and MASK_HIGHLIGHT != 0 - private fun hasHiglight(viewType: Int) = viewType < 0 + private fun isFollowUp(viewType: Int) = viewType and MASK_FOLLOWUP != 0 + + companion object { + const val SHIFT_HIGHLIGHT = 32 - 1 + const val SHIFT_FOLLOWUP = SHIFT_HIGHLIGHT - 1 + const val MASK_HIGHLIGHT = 0x01 shl SHIFT_HIGHLIGHT + const val MASK_FOLLOWUP = 0x01 shl SHIFT_FOLLOWUP + const val MASK_TYPE = 0xFFFF + } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): QuasselMessageViewHolder { val messageType = messageType(viewType) val hasHighlight = hasHiglight(viewType) + val isFollowUp = isFollowUp(viewType) val viewHolder = QuasselMessageViewHolder( LayoutInflater.from(parent.context).inflate( - messageRenderer.layout(messageType, hasHighlight), + messageRenderer.layout(messageType, hasHighlight, isFollowUp), parent, false ), @@ -91,7 +102,7 @@ class MessageAdapter( selectionListener, expansionListener ) - messageRenderer.init(viewHolder, messageType, hasHighlight) + messageRenderer.init(viewHolder, messageType, hasHighlight, isFollowUp) return viewHolder } @@ -119,6 +130,10 @@ class MessageAdapter( @JvmField var avatar: ImageView? = null + @BindView(R.id.avatar_container) + @JvmField + var avatarContainer: View? = null + @BindView(R.id.avatar_placeholder) @JvmField var avatarPlaceholder: Space? = null @@ -184,11 +199,6 @@ 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/MessageRenderer.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageRenderer.kt index 5ebf18cea402a93e81b93e3bcf73fc6aff86c479..185bc59e2acef0b5c80ebfda6dd6e4d92009e9b3 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 @@ -8,7 +8,7 @@ import de.kuschku.quasseldroid.viewmodel.data.FormattedMessage interface MessageRenderer { @LayoutRes - fun layout(type: Message_Type?, hasHighlight: Boolean): Int + fun layout(type: Message_Type?, hasHighlight: Boolean, isFollowUp: Boolean): Int fun bind(holder: MessageAdapter.QuasselMessageViewHolder, message: FormattedMessage, original: QuasselDatabase.DatabaseMessage) @@ -17,7 +17,8 @@ interface MessageRenderer { fun init(viewHolder: MessageAdapter.QuasselMessageViewHolder, messageType: Message_Type?, - hasHighlight: Boolean) { + hasHighlight: Boolean, + isFollowUp: Boolean) { } } 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 ce748f8832f986e42b048d56b6029673c9e2e4de..105c4ed2bcbac82c1e46591ed54804fbfb5c8804 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 @@ -56,7 +56,8 @@ class QuasselMessageRenderer @Inject constructor( private val zoneId = ZoneId.systemDefault() - override fun layout(type: Message_Type?, hasHighlight: Boolean) = when (type) { + override fun layout(type: Message_Type?, hasHighlight: Boolean, + isFollowUp: Boolean) = when (type) { Notice -> R.layout.widget_chatmessage_notice Server -> R.layout.widget_chatmessage_server Error -> R.layout.widget_chatmessage_error @@ -70,7 +71,8 @@ class QuasselMessageRenderer @Inject constructor( override fun init(viewHolder: MessageAdapter.QuasselMessageViewHolder, messageType: Message_Type?, - hasHighlight: Boolean) { + hasHighlight: Boolean, + isFollowUp: Boolean) { if (hasHighlight) { viewHolder.itemView.context.theme.styledAttributes( R.attr.colorForegroundHighlight, R.attr.colorBackgroundHighlight, @@ -95,10 +97,11 @@ class QuasselMessageRenderer @Inject constructor( viewHolder.combined?.typeface = if (viewHolder.combined?.typeface?.isItalic == true) monospaceItalic else Typeface.MONOSPACE } - viewHolder.avatar?.visibleIf(messageSettings.showAvatars || true) - viewHolder.avatarPlaceholder?.visibleIf(messageSettings.showAvatars || true) + viewHolder.avatar?.visibleIf(!isFollowUp) + viewHolder.avatarContainer?.visibleIf(messageSettings.showAvatars) + viewHolder.avatarPlaceholder?.visibleIf(messageSettings.showAvatars) val separateLine = viewHolder.content != null && viewHolder.name != null && messageSettings.nicksOnNewLine - viewHolder.name?.visibleIf(separateLine) + viewHolder.name?.visibleIf(separateLine && !isFollowUp) viewHolder.content?.visibleIf(separateLine) viewHolder.combined?.visibleIf(!separateLine) @@ -161,7 +164,6 @@ 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 946c39fc1d07cccc5d84d58a240a6a0754ede2c9..f0761655b6b2dcc291b21db18cb55dacc7d57e7f 100644 --- a/app/src/main/res/layout/widget_chatmessage_plain.xml +++ b/app/src/main/res/layout/widget_chatmessage_plain.xml @@ -30,6 +30,7 @@ tools:text="@sample/messages.json/data/time" /> <FrameLayout + android:id="@+id/avatar_container" android:layout_width="@dimen/avatar_size" android:layout_height="wrap_content" android:layout_marginBottom="@dimen/message_vertical" diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 1d67cdc48cbbca0cd9a577f939b01ecdc0683a00..9193f53bf50c47d05ea39fb444f9b17c5ecf0f2e 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -69,8 +69,9 @@ <SwitchPreference android:defaultValue="false" - android:dependency="@string/preference_nicks_on_new_line_summary" - android:key="@string/preference_show_avatars_key" /> + android:dependency="@string/preference_nicks_on_new_line_key" + android:key="@string/preference_show_avatars_key" + android:title="@string/preference_show_avatars_title" /> <SwitchPreference android:defaultValue="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 40b3984ebfd7d6b301664f895bc37f8ff0ed9e8e..df1f595d5ef0443e315bbc7528901f0285182764 100644 --- a/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselDatabase.kt +++ b/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselDatabase.kt @@ -212,16 +212,21 @@ FROM sender, senderPrefixes, 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 + (SELECT 1 + FROM + (SELECT * + FROM message m + WHERE m.messageId < message.messageId + AND bufferId = ? + AND type & ~? > 0 + ORDER BY m.messageId + DESC + LIMIT 1) t + WHERE t.sender = message.sender + AND strftime('%s', date(datetime(t.time / 1000, 'unixepoch', 'localtime')), 'utc') * 1000 = + strftime('%s', date(datetime(message.time / 1000, 'unixepoch', 'localtime')), 'utc') * 1000 + AND t.type = message.type + ) = 1 AS followUp FROM message WHERE bufferId = ? AND type & ~? > 0 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 2ae1319a6032ee8101e6ec0569bdb28f758f07c7..fd7c7865b90276fd6f68e6822a7d4cf57709874c 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,7 +10,6 @@ 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