Skip to content
Snippets Groups Projects
Commit 00b1d91c authored by Pierre Nicolas's avatar Pierre Nicolas :joy: Committed by Emma Falkiewitz
Browse files

chatview: implement text message new design

Implement custom message bubble
GitLab: #1523

Change-Id: I6c9fc607c3e4af05b78eb53c95e17ebbeaa8366c
parent 25fbe899
No related branches found
No related tags found
No related merge requests found
Showing
with 525 additions and 519 deletions
......@@ -32,7 +32,6 @@ import android.media.MediaPlayer
import android.net.Uri
import android.text.format.DateUtils
import android.text.format.Formatter
import android.text.method.LinkMovementMethod
import android.util.TypedValue
import android.view.*
import android.view.ContextMenu.ContextMenuInfo
......@@ -120,7 +119,6 @@ class ConversationAdapter(
res.getDimensionPixelSize(R.dimen.text_message_padding)
)
private var expandedItemPosition = -1
private var lastDeliveredPosition = -1
private val timestampUpdateTimer: Observable<Long> =
Observable.interval(10, TimeUnit.SECONDS, DeviceUtils.uiScheduler)
......@@ -464,11 +462,10 @@ class ConversationAdapter(
if (conversation == null || conversation !is Conversation) {
conversationViewHolder.mReplyName?.isVisible = false
conversationViewHolder.mReplyTxt?.isVisible = false
conversationViewHolder.mInReplyTo?.isVisible = false
return
}
conversationViewHolder.mReplyName?.let { replyView ->
conversationViewHolder.mReplyBubble?.let { replyBubble ->
val replyTo = interaction.replyTo
// If currently replying to another message :
......@@ -482,25 +479,26 @@ class ConversationAdapter(
.observeOn(DeviceUtils.uiScheduler)
.subscribe({ i ->
conversationViewHolder.mReplyTxt!!.text = i.first.body
conversationViewHolder.mReplyName.text = i.second.displayName
// Apply correct color depending if message is incoming or not.
conversationViewHolder.mReplyTxt.background?.setTint(
if (i.first.isIncoming)
context.getColor(
R.color.conversation_secondary_background
)
else convColor
)
conversationViewHolder.mReplyTxt.setTextColor(
if (i.first.isIncoming)
context.getColor(
R.color.colorOnSurface
)
else context.getColor(
R.color.text_color_primary_dark
// Name of whom we are replying to.
conversationViewHolder.mReplyName?.text =
if (i.first.isIncoming) i.second.displayName
else res.getString(R.string.conversation_reply_you)
// Apply the correct color depending if message is incoming or not.
val textColor:Int
if (i.first.isIncoming){
textColor = context.getColor(R.color.colorOnSurface)
replyBubble.background.setTint(
context.getColor(R.color.conversation_secondary_background)
)
)
}
else {
textColor = context.getColor(R.color.text_color_primary_dark)
replyBubble.background.setTint(convColor)
}
conversationViewHolder.mReplyTxt?.setTextColor(textColor)
conversationViewHolder.mReplyName?.setTextColor(textColor)
// Load avatar drawable from contact.
val avatarSize = context.resources
......@@ -511,36 +509,28 @@ class ConversationAdapter(
.build(context)
.setInSize(avatarSize)
// Update the view.
conversationViewHolder.mReplyName.setCompoundDrawablesWithIntrinsicBounds(
conversationViewHolder.mReplyName!!.setCompoundDrawablesWithIntrinsicBounds(
smallAvatarDrawable, null, null, null
)
replyView.isVisible = true
conversationViewHolder.mReplyTxt.isVisible = true
conversationViewHolder.mInReplyTo!!.isVisible = true
// User can click on mReplyTxt (replied message),
// mInReplyTo or mReplyName (text above the message) to go to it.
listOf(
conversationViewHolder.mReplyTxt,
conversationViewHolder.mInReplyTo,
replyView
).forEach {
it.setOnClickListener {
i.first.messageId?.let { messageId ->
presenter.scrollToMessage(messageId)
}
replyBubble.isVisible = true
conversationViewHolder.mReplyTxt!!.isVisible = true
// User can click on mReplyTxt (replied message)
// or mReplyName (text above the message) to go to it.
listOf(conversationViewHolder.mReplyTxt,
replyBubble).forEach{
it?.setOnClickListener{
i.first.messageId?.let { presenter.scrollToMessage(it) }
}
}
}) {
replyView.isVisible = false
replyBubble.isVisible = false
conversationViewHolder.mReplyTxt!!.isVisible = false
conversationViewHolder.mInReplyTo!!.isVisible = false
})
} else { // Not replying to another message, we can hide reply Textview.
replyView.isVisible = false
replyBubble.isVisible = false
conversationViewHolder.mReplyTxt?.isVisible = false
conversationViewHolder.mInReplyTo?.isVisible = false
}
}
}
......@@ -635,10 +625,6 @@ class ConversationAdapter(
}
holder.mMsgTxt?.setOnLongClickListener(null)
holder.mItem?.setOnClickListener(null)
if (expandedItemPosition == holder.layoutPosition) {
holder.mMsgDetailTxt?.visibility = View.GONE
expandedItemPosition = -1
}
holder.compositeDisposable.clear()
}
......@@ -1030,11 +1016,11 @@ class ConversationAdapter(
.setAction(Intent.ACTION_EDIT)
.putExtra(
Intent.EXTRA_TEXT,
conversationViewHolder.mMsgTxt!!.text.toString()
conversationViewHolder.mMessageContent!!.getText().toString()
)
val options = ActivityOptionsCompat.makeSceneTransitionAnimation(
conversationFragment.requireActivity(),
conversationViewHolder.mMsgTxt!!,
conversationViewHolder.mMessageBubble!!,
"messageEdit"
)
conversationFragment.startActivityForResult(
......@@ -1254,6 +1240,67 @@ class ConversationAdapter(
}
}
/**
* Configures the background of the message bubble.
* It changes if it's an incoming/outgoing message, it position or if it's an emoji.
* ResIndex indicates how is considered the message (first, single, last, etc.).
*/
private fun updateMessageBackground(
context: Context, messageBubble: View, messageBubbleBorder: View,
messageSequenceType: SequenceType,
isOnlyEmoji: Boolean, isReplying: Boolean, isDeleted: Boolean, isIncoming: Boolean,
) {
if (isOnlyEmoji) messageBubble.background = null
else {
// Manage layout for standard message. Index refers to msgBGLayouts array.
val resIndex =
if (isReplying && !isDeleted) {
// Reply message incoming, first or single.
if (isIncoming) if (messageSequenceType == SequenceType.FIRST) 11 else 10
// Reply message outgoing, first or single
else if (messageSequenceType == SequenceType.FIRST) 9 else 8
}
// Standard message, incoming or outgoing and first, single or last.
else messageSequenceType.ordinal + (if (isIncoming) 1 else 0) * 4
messageBubble.background = ContextCompat.getDrawable(context, msgBGLayouts[resIndex])
if (isReplying && !isDeleted) messageBubbleBorder.background =
ContextCompat.getDrawable(context, msgBGLayouts[resIndex])
if (convColor != 0 && !isIncoming) messageBubble.background?.setTint(convColor)
}
}
/**
* Configures the left margin of the message bubble.
* It changes if it's a group (avatar is displayed) or not (avatar is gone).
*/
private fun updateMessageLeftMargin(
context: Context,
messageBubbleBorder: View, replyBubble: View?,
isGroup: Boolean, isIncoming: Boolean
) {
if (isGroup && isIncoming) {
context.resources.getDimensionPixelSize(R.dimen.margin_no_group).let {
(messageBubbleBorder.layoutParams as MarginLayoutParams)
.apply { leftMargin = it }
replyBubble?.let { replyBubble ->
(replyBubble.layoutParams as MarginLayoutParams)
.apply { leftMargin = it }
}
}
} else {
context.resources.getDimensionPixelSize(R.dimen.margin_without_avatar).let {
(messageBubbleBorder.layoutParams as MarginLayoutParams)
.apply { leftMargin = it }
replyBubble?.let { replyBubble ->
(replyBubble.layoutParams as MarginLayoutParams)
.apply { leftMargin = it }
}
}
}
}
/**
* Configures the viewHolder to display a classic text message, ie. not a call info text message
*
......@@ -1267,6 +1314,7 @@ class ConversationAdapter(
position: Int
) {
val context = convViewHolder.itemView.context
convViewHolder.compositeDisposable.add(interaction.lastElement
.observeOn(DeviceUtils.uiScheduler)
.subscribe { lastElement ->
......@@ -1274,100 +1322,76 @@ class ConversationAdapter(
val account = interaction.account ?: return@subscribe
val contact = textMessage.contact ?: return@subscribe
val isDeleted = textMessage.body.isNullOrEmpty()
val msgTxt = convViewHolder.mMsgTxt ?: return@subscribe
val longPressView = convViewHolder.mMsgTxt!!
longPressView.background?.setTintList(null)
val isEdited = interaction.history.size > 1
val messageContent = convViewHolder.mMessageContent ?: return@subscribe
val messageBubble = convViewHolder.mMessageBubble ?: return@subscribe
val messageBubbleBorder = convViewHolder.mMessageBubbleBorder ?: return@subscribe
val replyBubble = convViewHolder.mReplyBubble
val answerLayout = convViewHolder.mAnswerLayout
val isTimeShown = hasPermanentTimeString(textMessage, position)
val msgSequenceType = getMsgSequencing(position, isTimeShown)
val peerDisplayName = convViewHolder.mPeerDisplayName
// Only show the peer avatar if it is a group conversation
val endOfSeq =
msgSequenceType == SequenceType.LAST || msgSequenceType == SequenceType.SINGLE
if (presenter.isGroup()) {
// Manage animation for avatar.
// To only display the avatar of the last message.
val avatar = convViewHolder.mAvatar
if (endOfSeq) {
avatar?.setImageDrawable(
conversationFragment.getConversationAvatar(contact.primaryNumber)
)
avatar?.visibility = View.VISIBLE
} else {
if (position == lastMsgPos - 1) {
avatar?.let { ActionHelper.startFadeOutAnimation(avatar) }
} else {
avatar?.setImageBitmap(null)
avatar?.visibility = View.INVISIBLE
}
}
} else {
convViewHolder.mAvatar?.visibility = View.GONE
}
// Manage background layout for standard message.
// Index refers to msgBGLayouts array.
val resIndex =
if (interaction.replyTo != null) {
// Reply message incoming, first or single.
if (textMessage.isIncoming)
if (msgSequenceType == SequenceType.FIRST) 11 else 10
// Reply message outgoing, first or single
else if (msgSequenceType == SequenceType.FIRST) 9 else 8
}
// Standard message, incoming or outgoing and first, single or last.
else msgSequenceType.ordinal + (if (textMessage.isIncoming) 1 else 0) * 4
val isDateShown = hasPermanentDateString(interaction, position)
val msgSequenceType = getMsgSequencing(position, isDateShown)
msgTxt.background = ContextCompat.getDrawable(context, msgBGLayouts[resIndex])
if (convColor != 0 && !textMessage.isIncoming) {
msgTxt.background.setTint(convColor)
} else {
msgTxt.background.setTint(
context.getColor(R.color.conversation_secondary_background)
)
// Show the name of the contact if it is a group conversation
peerDisplayName?.apply {
if (presenter.isGroup() && (msgSequenceType == SequenceType.SINGLE ||
msgSequenceType == SequenceType.FIRST)
) {
visibility = View.VISIBLE
convViewHolder.compositeDisposable.add(
presenter.contactService
.observeContact(account, contact, false)
.observeOn(DeviceUtils.uiScheduler)
.subscribe {
text = it.displayName
}
)
} else visibility = View.GONE
}
val message = textMessage.body?.trim() ?: ""
val messageTime = TextUtils
.timestampToTime(context, formatter, mInteractions[position].timestamp)
val timePermanent = convViewHolder.mMsgDetailTxtPerm
// Add margin if message need to be separated.
val isMessageSeparationNeeded = isMessageSeparationNeeded(isDateShown, position)
convViewHolder.mMessageLayout?.updateLayoutParams<MarginLayoutParams> {
topMargin = if (!isMessageSeparationNeeded) 0 else context.resources
.getDimensionPixelSize(R.dimen.conversation_message_separation)
}
msgTxt.background.alpha = 255
// Apply a bottom margin to the global layout if end of sequence needed.
convViewHolder.mItem?.let { setBottomMargin(it, if (endOfSeq) 8 else 0) }
// Manage deleted message.
if (isDeleted) {
msgTxt.text = context.getString(R.string.conversation_message_deleted)
// Hide the link preview
answerLayout?.visibility = View.GONE
msgTxt.textSize = 14f
msgTxt.setPadding(textMessagePadding)
longPressView.setOnLongClickListener(null)
return@subscribe
messageBubble.background?.setTintList(null)
// Manage the update of the timestamp
if (isDateShown) {
convViewHolder.compositeDisposable.add(timestampUpdateTimer.subscribe {
timePermanent?.text = TextUtils
.timestampToDate(context, formatter, interaction.timestamp)
})
convViewHolder.mMsgDetailTxtPerm?.visibility = View.VISIBLE
} else convViewHolder.mMsgDetailTxtPerm?.visibility = View.GONE
// If in a replying bubble, we need to overlap the message bubble
// with the answered message bubble.
if (textMessage.replyToId != null) {
val paddingInDp = (1.5 * context.resources.displayMetrics.density).toInt()
messageBubbleBorder.setPadding(paddingInDp, paddingInDp, 0, 0)
messageBubbleBorder.updateLayoutParams<MarginLayoutParams> {
topMargin = context.resources
.getDimensionPixelSize(R.dimen.conversation_reply_overlap)
}
} else {
messageBubbleBorder.setPadding(0, 0, 0, 0)
messageBubbleBorder.updateLayoutParams<MarginLayoutParams> { topMargin = 0 }
}
// Manage the background of the message bubble.
updateMessageBackground(
context, messageBubble, messageBubbleBorder, msgSequenceType,
isOnlyEmoji = StringUtils.isOnlyEmoji(message),
isReplying = interaction.replyTo != null,
isDeleted = isDeleted,
isIncoming = textMessage.isIncoming
)
// Manage the left margin of the message bubble.
updateMessageLeftMargin(
context, messageBubbleBorder, replyBubble,
isGroup = presenter.isGroup(),
isIncoming = textMessage.isIncoming
)
// Manage long press.
longPressView.setOnLongClickListener { v: View ->
messageBubble.setOnLongClickListener { v: View ->
openItemMenu(convViewHolder, v, interaction)
if (expandedItemPosition == position) {
expandedItemPosition = -1
}
conversationFragment.updatePosition(convViewHolder.bindingAdapterPosition)
if (textMessage.isIncoming) {
longPressView.background.setTint(res.getColor(R.color.grey_500))
messageBubble.background?.setTint(context.getColor(R.color.grey_500))
} else {
longPressView.background.setTint(convColorTint)
messageBubble.background?.setTint(convColorTint)
}
mCurrentLongItem = RecyclerViewContextMenuInfo(
convViewHolder.bindingAdapterPosition,
......@@ -1376,20 +1400,16 @@ class ConversationAdapter(
true
}
val message = textMessage.body?.trim() ?: ""
convViewHolder.mAnswerLayout?.visibility = View.GONE
// Manage the message content.
if (StringUtils.isOnlyEmoji(message)) {
// Manage layout if message is emoji.
msgTxt.background.alpha = 0
msgTxt.textSize = 32.0f
msgTxt.setPadding(emojiMessagePadding)
messageContent.updateEmoji(message, messageTime, isEdited)
} else {
msgTxt.textSize = 16f
msgTxt.setPadding(textMessagePadding)
messageContent.updateStandard(
markwon.toMarkdown(message), messageTime, isEdited
)
// Manage layout for message with a link inside.
if (showLinkPreviews) {
if (showLinkPreviews && !isDeleted) {
val cachedPreview =
textMessage.preview as? Maybe<PreviewData>? ?: LinkPreview.getFirstUrl(
message
......@@ -1419,56 +1439,66 @@ class ConversationAdapter(
} else {
convViewHolder.mHistDetailTxt?.visibility = View.GONE
}
convViewHolder.mAnswerLayout?.visibility = View.VISIBLE
answerLayout?.visibility = View.VISIBLE
val url = Uri.parse(data.baseUrl)
convViewHolder.mPreviewDomain?.text = url.host
convViewHolder.mAnswerLayout?.setOnClickListener {
answerLayout?.setOnClickListener {
context.startActivity(Intent(Intent.ACTION_VIEW, url))
}
}) { e -> Log.e(TAG, "Can't load preview", e) })
}
} else answerLayout?.visibility = View.GONE
}
msgTxt.movementMethod = LinkMovementMethod.getInstance()
msgTxt.text = markwon.toMarkdown(message)
// msgTxt.movementMethod = LinkMovementMethod.getInstance()
// Manage the update of the timestamp and the fact than we can expend/hide it.
if (isTimeShown) {
convViewHolder.compositeDisposable.add(timestampUpdateTimer.subscribe {
convViewHolder.mMsgDetailTxtPerm?.text =
TextUtils.timestampToDetailString(
context,
formatter,
textMessage.timestamp
val endOfSeq =
msgSequenceType == SequenceType.LAST || msgSequenceType == SequenceType.SINGLE
// Manage animation for avatar and name.
val avatar = convViewHolder.mAvatar
if (presenter.isGroup() && textMessage.isIncoming) {
avatar?.let {
if (endOfSeq) { // To only display the avatar of the last message.
avatar.setImageDrawable(
conversationFragment.getConversationAvatar(contact.primaryNumber)
)
})
convViewHolder.mMsgDetailTxtPerm?.visibility = View.VISIBLE
} else {
convViewHolder.mMsgDetailTxtPerm?.visibility = View.GONE
val isExpanded = position == expandedItemPosition
if (isExpanded) {
convViewHolder.compositeDisposable.add(timestampUpdateTimer.subscribe {
convViewHolder.mMsgDetailTxt?.text =
TextUtils.timestampToDetailString(
context,
formatter,
textMessage.timestamp
)
})
}
setItemViewExpansionState(convViewHolder, isExpanded)
convViewHolder.mItem?.setOnClickListener {
if (convViewHolder.animator?.isRunning == true) {
return@setOnClickListener
avatar.visibility = View.VISIBLE
} else {
if (position == lastMsgPos - 1) {
ActionHelper.startFadeOutAnimation(avatar)
} else {
avatar.setImageBitmap(null)
avatar.visibility = View.INVISIBLE
}
}
if (expandedItemPosition >= 0) {
val prev = expandedItemPosition
notifyItemChanged(prev)
}
// Show the name of the contact.
val startOfSeq = msgSequenceType == SequenceType.FIRST
|| msgSequenceType == SequenceType.SINGLE
peerDisplayName?.apply {
if (startOfSeq) {
visibility = View.VISIBLE
convViewHolder.compositeDisposable.add(
presenter.contactService
.observeContact(account, contact, false)
.observeOn(DeviceUtils.uiScheduler)
.subscribe { text = it.displayName }
)
} else {
visibility = View.GONE
text = null
}
expandedItemPosition = if (isExpanded) -1 else position
notifyItemChanged(expandedItemPosition)
}
} else {
avatar?.visibility = View.GONE
peerDisplayName?.visibility = View.GONE
}
// Manage deleted message.
if (isDeleted) {
replyBubble?.visibility = View.GONE
messageContent.updateDeleted(messageTime)
messageBubble.setOnLongClickListener(null)
}
})
}
......@@ -1558,7 +1588,7 @@ class ConversationAdapter(
}
// When long clicked...
setOnLongClickListener { v: View ->
background.setTint(context.getColor(R.color.grey_500))
background?.setTint(context.getColor(R.color.grey_500))
// Open Context Menu
conversationFragment.updatePosition(convViewHolder.adapterPosition)
mCurrentLongItem =
......@@ -1607,9 +1637,6 @@ class ConversationAdapter(
}
} else avatar?.visibility = View.GONE
// Apply a bottom margin to the global layout if end of sequence needed.
convViewHolder.mItem?.let { setBottomMargin(it, if (endOfSeq) 8 else 0) }
// Show the name of the contact if it is a group conversation
peerDisplayName?.apply {
if (presenter.isGroup() && startOfSeq) {
......@@ -1984,17 +2011,6 @@ class ConversationAdapter(
R.drawable.textmsg_bg_in_reply_first
)
/**
* Add bottom margin to a view.
* @param view the view to modify
* @param margin_in_dp the margin to set
*/
private fun setBottomMargin(view: View, margin_in_dp: Int) {
val targetSize = (margin_in_dp * view.context.resources.displayMetrics.density).toInt()
val params = view.layoutParams as? MarginLayoutParams?
params?.bottomMargin = targetSize
}
/**
* Tells if a break should be added in the sequence.
* The first interaction must be before the second interaction.
......
......@@ -31,6 +31,7 @@ import android.widget.ImageButton
import android.widget.ImageView
import androidx.constraintlayout.widget.ConstraintLayout
import cx.ring.R
import cx.ring.views.CustomMessageBubble
import cx.ring.adapters.MessageType
import cx.ring.views.MessageStatusView
import io.reactivex.rxjava3.disposables.CompositeDisposable
......@@ -75,16 +76,21 @@ class ConversationViewHolder(v: ViewGroup, val type: MessageType) : RecyclerView
else -> null
}
val mTypingIndicatorLayout: FrameLayout? = v.findViewById(R.id.typing_indicator_layout)
val mReplyName: TextView? = v.findViewById(R.id.msg_reply_name)
val mReplyTxt: TextView? = v.findViewById(R.id.msg_reply_txt)
val mInReplyTo: TextView? = v.findViewById(R.id.msg_in_reply_to)
val mPeerDisplayName: TextView? = when (type){
MessageType.INCOMING_TEXT_MESSAGE,
var mPeerDisplayName: TextView? = when (type){
MessageType.INCOMING_CALL_INFORMATION,
MessageType.ONGOING_GROUP_CALL -> v.findViewById(R.id.msg_display_name)
MessageType.INCOMING_FILE -> v.findViewById(R.id.peer_name)
MessageType.INCOMING_FILE,
MessageType.INCOMING_TEXT_MESSAGE -> v.findViewById(R.id.peer_name)
else -> null
}
var mMessageBubble: ConstraintLayout? = null
var mMessageLayout: ConstraintLayout? = null
var mMessageBubbleBorder: FrameLayout? = null
var mMessageContent: CustomMessageBubble? = null
var mReplyBubble: LinearLayout? = null
var mReplyName: TextView? = null
var mReplyTxt: TextView? = null
val reactionChip: TextView? = v.findViewById(R.id.reaction_chip)
val mIcon: ImageView? = when (type) {
MessageType.INCOMING_CALL_INFORMATION,
......@@ -176,9 +182,16 @@ class ConversationViewHolder(v: ViewGroup, val type: MessageType) : RecyclerView
}
MessageType.INCOMING_TEXT_MESSAGE,
MessageType.OUTGOING_TEXT_MESSAGE -> {
mReplyName = v.findViewById(R.id.reply_name)
mReplyBubble = v.findViewById(R.id.reply_bubble)
mReplyTxt = v.findViewById(R.id.reply_text)
mMsgTxt = v.findViewById(R.id.msg_txt)
mMessageBubble = v.findViewById(R.id.message_bubble)
mMessageBubbleBorder = v.findViewById(R.id.message_bubble_border)
mMessageLayout = v.findViewById(R.id.message_layout)
mMessageContent = v.findViewById(R.id.message_content)
mMsgDetailTxt = v.findViewById(R.id.msg_details_txt)
mMsgDetailTxtPerm = v.findViewById(R.id.msg_details_txt_perm)
mMsgDetailTxtPerm = v.findViewById(R.id.message_time_permanent)
mAnswerLayout = v.findViewById(R.id.link_preview)
mHistTxt = v.findViewById(R.id.link_preview_title)
mHistDetailTxt = v.findViewById(R.id.link_preview_description)
......
......@@ -3,13 +3,6 @@
<solid android:color="@color/conversation_secondary_background" />
<padding
android:left="@dimen/padding_medium"
android:right="@dimen/padding_medium"
android:top="@dimen/conversation_message_padding_top"
android:bottom="@dimen/conversation_message_padding_bottom"
/>
<corners android:radius="@dimen/conversation_message_radius" />
</shape>
\ No newline at end of file
......@@ -3,13 +3,6 @@
<solid android:color="@color/conversation_secondary_background" />
<padding
android:left="@dimen/padding_medium"
android:right="@dimen/padding_medium"
android:top="@dimen/conversation_message_padding_top"
android:bottom="@dimen/conversation_message_padding_bottom"
/>
<corners
android:topLeftRadius="@dimen/conversation_message_radius"
android:topRightRadius="@dimen/conversation_message_radius"
......
......@@ -3,13 +3,6 @@
<solid android:color="@color/conversation_secondary_background" />
<padding
android:left="@dimen/padding_medium"
android:right="@dimen/padding_medium"
android:top="@dimen/conversation_message_padding_top"
android:bottom="@dimen/conversation_message_padding_bottom"
/>
<corners
android:topLeftRadius="@dimen/conversation_message_minor_radius"
android:topRightRadius="@dimen/conversation_message_radius"
......
......@@ -3,13 +3,6 @@
<solid android:color="@color/conversation_secondary_background" />
<padding
android:left="@dimen/padding_medium"
android:right="@dimen/padding_medium"
android:top="@dimen/conversation_message_padding_top"
android:bottom="@dimen/conversation_message_padding_bottom"
/>
<corners
android:topLeftRadius="@dimen/conversation_message_minor_radius"
android:topRightRadius="@dimen/conversation_message_radius"
......
......@@ -3,13 +3,6 @@
<solid android:color="@color/conversation_secondary_background" />
<padding
android:left="@dimen/padding_medium"
android:right="@dimen/padding_medium"
android:top="@dimen/conversation_message_padding_top"
android:bottom="@dimen/conversation_message_padding_bottom"
/>
<corners android:radius="@dimen/conversation_message_radius"
android:topRightRadius="@dimen/conversation_message_minor_radius"
/>
......
......@@ -3,13 +3,6 @@
<solid android:color="@color/conversation_secondary_background" />
<padding
android:left="@dimen/padding_medium"
android:right="@dimen/padding_medium"
android:top="@dimen/conversation_message_padding_top"
android:bottom="@dimen/conversation_message_padding_bottom"
/>
<corners android:radius="@dimen/conversation_message_radius"
android:topRightRadius="@dimen/conversation_message_minor_radius"
android:bottomLeftRadius="@dimen/conversation_message_minor_radius"
......
......@@ -3,13 +3,6 @@
<solid android:color="@color/conversation_primary_background" />
<padding
android:left="@dimen/padding_medium"
android:right="@dimen/padding_medium"
android:top="@dimen/conversation_message_padding_top"
android:bottom="@dimen/conversation_message_padding_bottom"
/>
<corners android:radius="@dimen/conversation_message_radius" />
</shape>
\ No newline at end of file
......@@ -3,13 +3,6 @@
<solid android:color="@color/conversation_primary_background" />
<padding
android:left="@dimen/padding_medium"
android:right="@dimen/padding_medium"
android:top="@dimen/conversation_message_padding_top"
android:bottom="@dimen/conversation_message_padding_bottom"
/>
<corners
android:bottomRightRadius="@dimen/conversation_message_minor_radius"
android:bottomLeftRadius="@dimen/conversation_message_radius"
......
......@@ -3,13 +3,6 @@
<solid android:color="@color/conversation_primary_background" />
<padding
android:left="@dimen/padding_medium"
android:right="@dimen/padding_medium"
android:top="@dimen/conversation_message_padding_top"
android:bottom="@dimen/conversation_message_padding_bottom"
/>
<corners
android:topLeftRadius="@dimen/conversation_message_radius"
android:topRightRadius="@dimen/conversation_message_minor_radius"
......
......@@ -3,13 +3,6 @@
<solid android:color="@color/conversation_primary_background" />
<padding
android:left="@dimen/padding_medium"
android:right="@dimen/padding_medium"
android:top="@dimen/conversation_message_padding_top"
android:bottom="@dimen/conversation_message_padding_bottom"
/>
<corners
android:topLeftRadius="@dimen/conversation_message_radius"
android:topRightRadius="@dimen/conversation_message_minor_radius"
......
......@@ -3,13 +3,6 @@
<solid android:color="@color/conversation_primary_background" />
<padding
android:left="@dimen/padding_medium"
android:right="@dimen/padding_medium"
android:top="@dimen/conversation_message_padding_top"
android:bottom="@dimen/conversation_message_padding_bottom"
/>
<corners android:radius="@dimen/conversation_message_radius"
android:topLeftRadius="@dimen/conversation_message_minor_radius"
/>
......
......@@ -3,13 +3,6 @@
<solid android:color="@color/conversation_primary_background" />
<padding
android:left="@dimen/padding_medium"
android:right="@dimen/padding_medium"
android:top="@dimen/conversation_message_padding_top"
android:bottom="@dimen/conversation_message_padding_bottom"
/>
<corners android:radius="@dimen/conversation_message_radius"
android:topLeftRadius="@dimen/conversation_message_minor_radius"
android:bottomRightRadius="@dimen/conversation_message_minor_radius"
......
......@@ -65,6 +65,7 @@ along with this program; if not, write to the Free Software
android:layout_gravity="start|bottom"
android:layout_marginEnd="@dimen/margin_end_avatar_conversation"
android:contentDescription="@null"
tools:visibility="visible"
tools:srcCompat="@color/blue_200" />
<LinearLayout
......
......@@ -12,6 +12,6 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/conversation_contact_is_typing"
android:paddingHorizontal="4dp"
android:padding="5dp"
app:srcCompat="@drawable/typing_indicator_animation" />
</FrameLayout>
\ No newline at end of file
......@@ -16,148 +16,176 @@ along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/txt_entry"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:gravity="center"
android:orientation="vertical"
android:paddingBottom="2dp">
android:layout_height="wrap_content">
<TextView
android:id="@+id/msg_details_txt_perm"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/padding_small"
android:textColor="@color/textColorSecondary"
android:textSize="@dimen/conversation_timestamp_textsize"
android:visibility="gone"
tools:text="@string/time_just_now"
tools:visibility="visible" />
<FrameLayout
android:id="@+id/excluded_left_zone"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_weight="1"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@+id/message_layout"
app:layout_constraintTop_toTopOf="@id/message_time_permanent" />
<TextView
android:id="@+id/msg_details_txt"
android:id="@+id/message_time_permanent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="4dp"
android:paddingBottom="2dp"
android:paddingVertical="@dimen/conversation_date_padding"
android:textColor="@color/textColorSecondary"
android:textSize="@dimen/conversation_timestamp_textsize"
android:visibility="gone"
app:layout_constraintBottom_toTopOf="@id/message_layout"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="@string/time_just_now"
tools:visibility="visible" />
<RelativeLayout
android:layout_width="match_parent"
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/message_layout"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:paddingStart="@dimen/padding_large"
android:paddingEnd="0dp">
android:paddingBottom="@dimen/padding_xsmall"
app:layout_constraintHorizontal_weight="5"
app:layout_constraintLeft_toRightOf="@+id/excluded_left_zone"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/message_time_permanent">
<TextView
android:id="@+id/msg_reply_name"
<LinearLayout
android:id="@+id/reply_bubble"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignEnd="@id/msg_reply_txt"
android:drawablePadding="4dp"
android:ellipsize="middle"
android:maxWidth="200dp"
android:maxLines="1"
android:padding="4dp"
android:textColor="@color/textColorSecondary"
android:textSize="@dimen/conversation_timestamp_textsize"
android:textStyle="bold"
tools:drawableStart="@drawable/baseline_delete_16"
tools:text="Bob" />
android:layout_gravity="end"
android:layout_marginStart="70dp"
android:layout_marginEnd="@dimen/conversation_me_margin_end"
android:background="@drawable/textmsg_bg_out"
android:backgroundTint="@color/conversation_secondary_background"
android:padding="5dp"
android:visibility="gone"
app:layout_constrainedWidth="true"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:visibility="visible">
<TextView
android:id="@+id/msg_in_reply_to"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@id/msg_reply_name"
android:layout_toStartOf="@id/msg_reply_name"
android:maxLines="1"
android:text="@string/in_reply_to"
android:textColor="@color/textColorSecondary"
android:textSize="@dimen/conversation_timestamp_textsize"
android:textStyle="bold" />
<TextView
android:id="@+id/reply_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:background="@drawable/reply_contact_msg_bg"
android:backgroundTint="@color/conversation_reply_background"
android:drawablePadding="5dp"
android:ellipsize="end"
android:maxLines="1"
android:padding="5dp"
android:textColor="#000000"
android:textSize="@dimen/message_display_name_textsize"
app:drawableStartCompat="@drawable/reply_contact_avatar_12px"
tools:text="Jean-Pascal" />
<TextView
android:id="@+id/msg_reply_txt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/msg_reply_name"
android:layout_alignEnd="@id/msg_txt"
android:layout_marginStart="72dp"
android:layout_marginEnd="30dp"
android:layout_marginBottom="-8dp"
android:background="@drawable/textmsg_bg_out"
android:focusable="true"
android:minWidth="@dimen/conversation_avatar_size"
android:minHeight="@dimen/conversation_avatar_size"
android:singleLine="true"
android:textColor="@color/text_color_primary_dark"
android:textColorHighlight="@color/conversation_primary_selection"
android:textColorLink="@color/text_color_primary_dark"
android:textSize="@dimen/text_size_large"
android:theme="@style/OutgoingTextView"
tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod" />
<include
layout="@layout/msg_link_preview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/msg_reply_txt"
android:layout_marginStart="72dp"
android:layout_marginEnd="24dp" />
<TextView
android:id="@+id/reply_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:focusable="true"
android:maxLines="1"
android:padding="5dp"
android:textColor="@color/colorOnSurface"
android:textColorHighlight="@color/conversation_primary_selection"
android:textColorLink="@color/text_color_primary_dark"
android:textSize="@dimen/conversation_text_size_small"
android:theme="@style/OutgoingTextView"
tools:text="Lorem ipsum" />
<TextView
android:id="@+id/msg_txt"
</LinearLayout>
<FrameLayout
android:id="@+id/message_bubble_border"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/link_preview"
android:layout_alignParentEnd="true"
android:layout_marginStart="72dp"
android:layout_marginEnd="24dp"
android:layout_marginTop="-8dp"
android:layout_marginEnd="@dimen/conversation_me_margin_end"
android:background="@drawable/textmsg_bg_out"
android:focusable="true"
android:minWidth="@dimen/conversation_avatar_size"
android:minHeight="@dimen/conversation_avatar_size"
android:textColor="@color/text_color_primary_dark"
android:textColorHighlight="@color/conversation_primary_selection"
android:textColorLink="@color/text_color_primary_dark"
android:textIsSelectable="true"
android:textSize="@dimen/text_size_large"
android:theme="@style/OutgoingTextView"
tools:text="yo this is the test of a long long text can not be_found_message" />
android:backgroundTint="@color/background"
android:paddingStart="1.5dp"
android:paddingTop="1.5dp"
android:paddingEnd="0dp"
android:paddingBottom="0dp"
app:layout_constrainedWidth="true"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/reply_bubble">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/message_bubble"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:background="@drawable/textmsg_bg_out">
<cx.ring.views.CustomMessageBubble
android:id="@+id/message_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingHorizontal="10dp"
android:paddingVertical="5dp"
android:textColor="@color/text_color_primary_dark"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:edited="true"
tools:message="This is a test !"
tools:time="11h05" />
<include
android:id="@+id/link_preview"
layout="@layout/msg_link_preview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/message_content" />
</androidx.constraintlayout.widget.ConstraintLayout>
</FrameLayout>
<cx.ring.views.MessageStatusView
android:id="@+id/status_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/msg_txt"
android:layout_alignParentEnd="true"
android:layout_marginEnd="5dp" />
android:layout_width="@dimen/conversation_status_icon_size"
android:layout_height="@dimen/conversation_status_icon_size"
android:layout_marginHorizontal="5dp"
app:layout_constraintBottom_toBottomOf="@id/message_bubble_border"
app:layout_constraintEnd_toEndOf="parent"
tools:background="@color/purple_300"
tools:layout_height="@dimen/conversation_status_icon_size"
tools:visibility="visible" />
<TextView
android:id="@+id/reaction_chip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/msg_txt"
android:layout_alignEnd="@id/msg_txt"
android:layout_marginTop="-16dp"
android:layout_marginTop="-6dp"
android:layout_marginEnd="8dp"
android:background="@drawable/background_item_conv_image"
android:backgroundTint="@color/icon_background_color"
android:elevation="4dp"
android:outlineProvider="none"
android:text="👍 😍 3"
android:background="@drawable/background_reaction_chip"
android:lines="1"
android:singleLine="true"
android:maxLines="1"
android:padding="5dp" />
android:outlineProvider="none"
android:padding="5dp"
android:singleLine="true"
app:layout_constraintEnd_toEndOf="@id/message_bubble_border"
app:layout_constraintTop_toBottomOf="@id/message_bubble_border"
tools:text="👍 😍 3" />
</androidx.constraintlayout.widget.ConstraintLayout>
</RelativeLayout>
</LinearLayout>
\ No newline at end of file
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
......@@ -41,8 +41,8 @@ along with this program; if not, write to the Free Software
<cx.ring.views.MessageStatusView
android:id="@+id/status_icon"
android:layout_width="14dp"
android:layout_height="14dp"
android:layout_width="@dimen/conversation_status_icon_size"
android:layout_height="@dimen/conversation_status_icon_size"
android:layout_alignBottom="@id/msg_txt"
android:layout_alignParentEnd="true"
android:layout_marginEnd="5dp"
......
......@@ -16,108 +16,53 @@ along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/txt_entry"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:gravity="center"
android:orientation="vertical"
android:paddingBottom="2dp">
android:layout_height="wrap_content">
<FrameLayout
android:id="@+id/excluded_right_zone"
android:layout_width="0dp"
android:layout_height="0dp"
android:orientation="horizontal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_weight="1"
app:layout_constraintStart_toEndOf="@+id/message_layout"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/msg_details_txt_perm"
android:id="@+id/message_time_permanent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/padding_small"
android:paddingVertical="@dimen/conversation_date_padding"
android:textColor="@color/textColorSecondary"
android:textSize="@dimen/conversation_timestamp_textsize"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="@string/time_just_now"
tools:visibility="visible" />
<TextView
android:id="@+id/msg_details_txt"
android:layout_width="wrap_content"
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/message_layout"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:paddingTop="4dp"
android:background="@android:color/transparent"
android:paddingBottom="@dimen/padding_xsmall"
android:textColor="@color/textColorSecondary"
android:textSize="@dimen/conversation_timestamp_textsize"
android:visibility="gone"
tools:text="@string/time_just_now"
tools:visibility="visible" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="@dimen/padding_large"
android:paddingEnd="36dp">
<TextView
android:id="@+id/msg_reply_txt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/msg_reply_name"
android:layout_alignStart="@id/msg_txt"
android:layout_marginStart="30dp"
android:layout_marginEnd="20dp"
android:layout_marginBottom="-8dp"
android:background="@drawable/textmsg_bg_in"
android:focusable="true"
android:minWidth="@dimen/conversation_avatar_size"
android:minHeight="@dimen/conversation_avatar_size"
android:singleLine="true"
android:textColor="@color/colorOnSurface"
android:textColorHighlight="@color/conversation_primary_selection"
android:textColorLink="@color/text_color_primary_dark"
android:textSize="@dimen/text_size_large"
android:visibility="gone"
tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod"
tools:visibility="visible" />
<ImageView
android:id="@+id/photo"
android:layout_width="@dimen/conversation_avatar_size"
android:layout_height="@dimen/conversation_avatar_size"
android:layout_alignBottom="@id/msg_txt"
android:layout_alignParentStart="true"
android:layout_marginEnd="@dimen/margin_end_avatar_conversation"
tools:srcCompat="@tools:sample/avatars" />
<TextView
android:id="@+id/msg_txt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/link_preview"
android:layout_marginEnd="20dp"
android:layout_toEndOf="@+id/photo"
android:background="@drawable/textmsg_bg_in"
android:focusable="true"
android:minWidth="@dimen/conversation_avatar_size"
android:minHeight="@dimen/conversation_avatar_size"
android:textColor="@color/colorOnSurface"
android:textColorLink="@color/link_peer_color"
android:textIsSelectable="true"
android:textSize="@dimen/text_size_large"
tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod" />
<include
layout="@layout/msg_link_preview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/msg_display_name"
android:layout_alignStart="@id/msg_txt"
android:layout_marginEnd="20dp" />
app:layout_constraintEnd_toStartOf="@+id/excluded_right_zone"
app:layout_constraintHorizontal_weight="5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/message_time_permanent">
<TextView
android:id="@+id/msg_display_name"
android:id="@+id/peer_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/msg_reply_txt"
android:layout_alignStart="@id/msg_txt"
android:layout_marginStart="@dimen/margin_no_group"
android:ellipsize="end"
android:maxEms="8"
android:maxLines="1"
......@@ -125,55 +70,142 @@ along with this program; if not, write to the Free Software
android:textColor="@color/msg_display_name"
android:textSize="@dimen/message_display_name_textsize"
android:visibility="gone"
app:layout_constraintStart_toEndOf="@id/photo"
app:layout_constraintTop_toTopOf="parent"
tools:text="Bob"
tools:visibility="visible" />
<!-- maxEms="8" to have around 16 characters displayed -->
<TextView
android:id="@+id/reaction_chip"
<LinearLayout
android:id="@+id/reply_bubble"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/msg_txt"
android:layout_alignStart="@id/msg_txt"
android:layout_marginStart="8dp"
android:layout_marginTop="-16dp"
android:background="@drawable/background_item_conv_image"
android:backgroundTint="@color/icon_background_color"
android:elevation="4dp"
android:outlineProvider="none"
android:text="👍😍 3"
android:lines="1"
android:singleLine="true"
android:maxLines="1"
android:padding="5dp" />
<TextView
android:id="@+id/msg_in_reply_to"
android:layout_marginStart="@dimen/margin_no_group"
android:layout_marginEnd="70dp"
android:background="@drawable/textmsg_bg_in"
android:backgroundTint="@color/conversation_secondary_background"
android:gravity="start"
android:padding="5dp"
android:visibility="gone"
app:layout_constrainedWidth="true"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0"
app:layout_constraintStart_toEndOf="@id/photo"
app:layout_constraintTop_toBottomOf="@id/peer_name"
tools:visibility="visible">
<TextView
android:id="@+id/reply_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:background="@drawable/reply_contact_msg_bg"
android:backgroundTint="@color/conversation_reply_background"
android:drawablePadding="5dp"
android:ellipsize="end"
android:maxLines="1"
android:padding="5dp"
android:textColor="@color/colorOnSurface"
android:textSize="@dimen/message_display_name_textsize"
app:drawableStartCompat="@drawable/reply_contact_avatar_12px"
tools:text="Jean-Pascal" />
<TextView
android:id="@+id/reply_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:focusable="true"
android:maxLines="1"
android:paddingHorizontal="5dp"
android:textColor="@color/colorOnSurface"
android:textColorHighlight="@color/conversation_primary_selection"
android:textColorLink="@color/text_color_primary_dark"
android:textSize="@dimen/conversation_text_size_small"
android:theme="@style/OutgoingTextView"
android:translationY="5dp"
tools:text="Lorem ipsum" />
</LinearLayout>
<FrameLayout
android:id="@+id/message_bubble_border"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@id/msg_reply_name"
android:layout_alignStart="@id/msg_reply_txt"
android:maxLines="1"
android:text="@string/in_reply_to"
android:textColor="@color/textColorSecondary"
android:textSize="@dimen/conversation_timestamp_textsize"
android:textStyle="bold" />
android:layout_marginStart="12dp"
android:layout_marginTop="-8dp"
android:background="@drawable/textmsg_bg_in"
android:backgroundTint="@color/background"
android:gravity="start"
android:paddingStart="0dp"
android:paddingTop="1.5dp"
android:paddingEnd="1.5dp"
android:paddingBottom="0dp"
app:layout_constrainedWidth="true"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0"
app:layout_constraintStart_toEndOf="@id/photo"
app:layout_constraintTop_toBottomOf="@id/reply_bubble">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/message_bubble"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="start"
android:background="@drawable/textmsg_bg_in">
<cx.ring.views.CustomMessageBubble
android:id="@+id/message_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingHorizontal="10dp"
android:paddingVertical="5dp"
android:textColor="@color/colorOnSurface"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:edited="true"
tools:message="This is a test !"
tools:time="11h05" />
<include
android:id="@+id/link_preview"
layout="@layout/msg_link_preview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/message_content" />
</androidx.constraintlayout.widget.ConstraintLayout>
</FrameLayout>
<TextView
android:id="@+id/msg_reply_name"
android:id="@+id/reaction_chip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toEndOf="@id/msg_in_reply_to"
android:drawablePadding="4dp"
android:ellipsize="middle"
android:maxWidth="200dp"
android:layout_marginStart="8dp"
android:layout_marginTop="-6dp"
android:background="@drawable/background_reaction_chip"
android:lines="1"
android:maxLines="1"
android:padding="4dp"
android:textColor="@color/textColorSecondary"
android:textSize="@dimen/conversation_timestamp_textsize"
android:textStyle="bold"
tools:drawableStart="@drawable/baseline_delete_16"
tools:text="Bob" />
</RelativeLayout>
</LinearLayout>
\ No newline at end of file
android:outlineProvider="none"
android:padding="5dp"
android:singleLine="true"
app:layout_constraintStart_toStartOf="@id/message_bubble_border"
app:layout_constraintTop_toBottomOf="@id/message_bubble_border"
tools:text="🤕🤒3" />
<ImageView
android:id="@+id/photo"
android:layout_width="@dimen/conversation_avatar_size"
android:layout_height="@dimen/conversation_avatar_size"
android:layout_marginStart="@dimen/margin_without_avatar"
android:contentDescription="@null"
app:layout_constraintBottom_toBottomOf="@id/message_bubble_border"
app:layout_constraintStart_toStartOf="parent"
tools:srcCompat="@color/blue_200"
tools:visibility="gone" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
......@@ -38,7 +38,7 @@ along with this program; if not, write to the Free Software
android:paddingEnd="36dp">
<TextView
android:id="@+id/msg_display_name"
android:id="@+id/peer_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignStart="@id/msg_txt"
......@@ -69,7 +69,7 @@ along with this program; if not, write to the Free Software
android:layout_height="wrap_content"
android:layout_marginEnd="20dp"
android:layout_toEndOf="@+id/photo"
android:layout_below="@id/msg_display_name"
android:layout_below="@id/peer_name"
android:background="@drawable/textmsg_bg_in"
android:focusable="true"
android:minWidth="@dimen/conversation_avatar_size"
......@@ -83,7 +83,7 @@ along with this program; if not, write to the Free Software
</RelativeLayout>
<TextView
android:id="@+id/msg_details_txt_perm"
android:id="@+id/message_time_permanent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="4dp"
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment