Skip to content
Snippets Groups Projects
Commit 694a3cfb authored by Janne Mareike Koschinski's avatar Janne Mareike Koschinski
Browse files

Hide avatar and nick if the same user is sending consecutive messages

parent 4a9e3811
No related branches found
No related tags found
No related merge requests found
......@@ -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)
......
......@@ -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) {
}
}
......@@ -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
......
......@@ -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"
......
......@@ -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"
......
......@@ -212,16 +212,21 @@ FROM
sender,
senderPrefixes,
content,
sender = coalesce((SELECT sender
(SELECT 1
FROM
(SELECT *
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
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
......
......@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment