@ -32,6 +32,7 @@ import org.session.libsession.messaging.contacts.Contact
import org.session.libsession.messaging.contacts.Contact.ContactContext
import org.session.libsession.messaging.contacts.Contact.ContactContext
import org.session.libsession.messaging.open_groups.OpenGroupApi
import org.session.libsession.messaging.open_groups.OpenGroupApi
import org.session.libsession.utilities.Address
import org.session.libsession.utilities.Address
import org.session.libsession.utilities.TextSecurePreferences
import org.session.libsession.utilities.ViewUtil
import org.session.libsession.utilities.ViewUtil
import org.session.libsession.utilities.getColorFromAttr
import org.session.libsession.utilities.getColorFromAttr
import org.session.libsession.utilities.modifyLayoutParams
import org.session.libsession.utilities.modifyLayoutParams
@ -131,7 +132,8 @@ class VisibleMessageView : LinearLayout {
senderSessionID : String ,
senderSessionID : String ,
lastSeen : Long ,
lastSeen : Long ,
delegate : VisibleMessageViewDelegate ? = null ,
delegate : VisibleMessageViewDelegate ? = null ,
onAttachmentNeedsDownload : ( Long , Long ) -> Unit
onAttachmentNeedsDownload : ( Long , Long ) -> Unit ,
lastSentMessageId : Long
) {
) {
val threadID = message . threadId
val threadID = message . threadId
val thread = threadDb . getRecipientForThreadId ( threadID ) ?: return
val thread = threadDb . getRecipientForThreadId ( threadID ) ?: return
@ -195,14 +197,18 @@ class VisibleMessageView : LinearLayout {
val contactContext =
val contactContext =
if ( thread . isOpenGroupRecipient ) ContactContext . OPEN _GROUP else ContactContext . REGULAR
if ( thread . isOpenGroupRecipient ) ContactContext . OPEN _GROUP else ContactContext . REGULAR
binding . senderNameTextView . text = contact ?. displayName ( contactContext ) ?: senderSessionID
binding . senderNameTextView . text = contact ?. displayName ( contactContext ) ?: senderSessionID
// Unread marker
// Unread marker
binding . unreadMarkerContainer . isVisible = lastSeen != - 1L && message . timestamp > lastSeen && ( previous == null || previous . timestamp <= lastSeen ) && ! message . isOutgoing
binding . unreadMarkerContainer . isVisible = lastSeen != - 1L && message . timestamp > lastSeen && ( previous == null || previous . timestamp <= lastSeen ) && ! message . isOutgoing
// Date break
// Date break
val showDateBreak = isStartOfMessageCluster || snIsSelected
val showDateBreak = isStartOfMessageCluster || snIsSelected
binding . dateBreakTextView . text = if ( showDateBreak ) DateUtils . getDisplayFormattedTimeSpanString ( context , Locale . getDefault ( ) , message . timestamp ) else null
binding . dateBreakTextView . text = if ( showDateBreak ) DateUtils . getDisplayFormattedTimeSpanString ( context , Locale . getDefault ( ) , message . timestamp ) else null
binding . dateBreakTextView . isVisible = showDateBreak
binding . dateBreakTextView . isVisible = showDateBreak
// Message status indicator
// Message status indicator
showStatusMessage ( message )
showStatusMessage ( message )
// Emoji Reactions
// Emoji Reactions
val emojiLayoutParams = binding . emojiReactionsView . root . layoutParams as ConstraintLayout . LayoutParams
val emojiLayoutParams = binding . emojiReactionsView . root . layoutParams as ConstraintLayout . LayoutParams
emojiLayoutParams . horizontalBias = if ( message . isOutgoing ) 1f else 0f
emojiLayoutParams . horizontalBias = if ( message . isOutgoing ) 1f else 0f
@ -238,7 +244,8 @@ class VisibleMessageView : LinearLayout {
}
}
private fun showStatusMessage ( message : MessageRecord ) {
private fun showStatusMessage ( message : MessageRecord ) {
val disappearing = message . expiresIn > 0
val scheduledToDisappear = message . expiresIn > 0
binding . messageInnerLayout . modifyLayoutParams < FrameLayout . LayoutParams > {
binding . messageInnerLayout . modifyLayoutParams < FrameLayout . LayoutParams > {
gravity = if ( message . isOutgoing ) Gravity . END else Gravity . START
gravity = if ( message . isOutgoing ) Gravity . END else Gravity . START
@ -250,7 +257,7 @@ class VisibleMessageView : LinearLayout {
binding . expirationTimerView . isGone = true
binding . expirationTimerView . isGone = true
if ( message . isOutgoing || disappearing ) {
if ( message . isOutgoing || sche duledToD isappear) {
val ( iconID , iconColor , textId ) = getMessageStatusImage ( message )
val ( iconID , iconColor , textId ) = getMessageStatusImage ( message )
textId ?. let ( binding . messageStatusTextView :: setText )
textId ?. let ( binding . messageStatusTextView :: setText )
iconColor ?. let ( binding . messageStatusTextView :: setTextColor )
iconColor ?. let ( binding . messageStatusTextView :: setTextColor )
@ -258,13 +265,14 @@ class VisibleMessageView : LinearLayout {
?. run { iconColor ?. let { mutate ( ) . apply { setTint ( it ) } } ?: this }
?. run { iconColor ?. let { mutate ( ) . apply { setTint ( it ) } } ?: this }
?. let ( binding . messageStatusImageView :: setImageDrawable )
?. let ( binding . messageStatusImageView :: setImageDrawable )
val lastMessageID = mmsSmsDb . getLastMessageID ( message . threadId )
// Always show the delivery status of the last sent message
val isLastMessage = message . id == lastMessageID
val thisUsersSessionId = TextSecurePreferences . getLocalNumber ( context )
binding . messageStatusTextView . isVisible =
val lastSentMessageId = mmsSmsDb . getLastSentMessageFromSender ( message . threadId , thisUsersSessionId )
textId != null && ( ! message . isSent || isLastMessage || disappearing )
val isLastSentMessage = lastSentMessageId == message . id
val showTimer = disappearing && ! message . isPending
binding . messageStatusImageView . isVisible =
binding . messageStatusTextView . isVisible = textId != null && ( isLastSentMessage || scheduledToDisappear )
iconID != null && ! showTimer && ( ! message . isSent || isLastMessage )
val showTimer = scheduledToDisappear && ! message . isPending
binding . messageStatusImageView . isVisible = iconID != null && ! showTimer && ( ! message . isSent || isLastSentMessage )
binding . messageStatusImageView . bringToFront ( )
binding . messageStatusImageView . bringToFront ( )
binding . expirationTimerView . bringToFront ( )
binding . expirationTimerView . bringToFront ( )