2021-06-01 05:26:57 +02:00
|
|
|
package org.thoughtcrime.securesms.conversation.v2.messages
|
|
|
|
|
|
|
|
import android.content.Context
|
2021-06-07 07:48:22 +02:00
|
|
|
import android.graphics.drawable.Drawable
|
2021-06-01 05:26:57 +02:00
|
|
|
import android.util.AttributeSet
|
2021-06-01 07:43:37 +02:00
|
|
|
import android.util.TypedValue
|
2021-06-01 05:26:57 +02:00
|
|
|
import android.view.LayoutInflater
|
|
|
|
import android.widget.LinearLayout
|
2021-06-01 06:56:58 +02:00
|
|
|
import android.widget.TextView
|
2021-06-07 07:48:22 +02:00
|
|
|
import androidx.annotation.DrawableRes
|
2021-06-01 05:26:57 +02:00
|
|
|
import androidx.core.content.res.ResourcesCompat
|
|
|
|
import androidx.core.graphics.BlendModeColorFilterCompat
|
|
|
|
import androidx.core.graphics.BlendModeCompat
|
2021-06-01 07:43:37 +02:00
|
|
|
import androidx.core.view.setMargins
|
|
|
|
import androidx.core.view.setPadding
|
2021-06-01 05:26:57 +02:00
|
|
|
import kotlinx.android.synthetic.main.view_visible_message_content.view.*
|
|
|
|
import network.loki.messenger.R
|
|
|
|
import org.session.libsession.utilities.ThemeUtil
|
|
|
|
import org.thoughtcrime.securesms.database.model.MessageRecord
|
2021-06-01 06:56:58 +02:00
|
|
|
import org.thoughtcrime.securesms.database.model.MmsMessageRecord
|
2021-06-02 05:03:22 +02:00
|
|
|
import org.thoughtcrime.securesms.loki.utilities.UiMode
|
|
|
|
import org.thoughtcrime.securesms.loki.utilities.UiModeUtilities
|
|
|
|
import org.thoughtcrime.securesms.loki.utilities.getColorWithID
|
2021-06-01 06:56:58 +02:00
|
|
|
import java.lang.IllegalStateException
|
2021-06-01 05:26:57 +02:00
|
|
|
|
|
|
|
class VisibleMessageContentView : LinearLayout {
|
|
|
|
|
|
|
|
// region Lifecycle
|
|
|
|
constructor(context: Context) : super(context) {
|
|
|
|
setUpViewHierarchy()
|
|
|
|
}
|
|
|
|
|
|
|
|
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
|
|
|
|
setUpViewHierarchy()
|
|
|
|
}
|
|
|
|
|
|
|
|
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
|
|
|
|
setUpViewHierarchy()
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun setUpViewHierarchy() {
|
|
|
|
LayoutInflater.from(context).inflate(R.layout.view_visible_message_content, this)
|
|
|
|
}
|
|
|
|
// endregion
|
|
|
|
|
|
|
|
// region Updating
|
2021-06-07 07:48:22 +02:00
|
|
|
fun bind(message: MessageRecord, isStartOfMessageCluster: Boolean, isEndOfMessageCluster: Boolean) {
|
2021-06-01 05:26:57 +02:00
|
|
|
// Background
|
2021-06-07 07:48:22 +02:00
|
|
|
val background = getBackground(message.isOutgoing, isStartOfMessageCluster, isEndOfMessageCluster)
|
2021-06-01 05:26:57 +02:00
|
|
|
val colorID = if (message.isOutgoing) R.attr.message_sent_background_color else R.attr.message_received_background_color
|
|
|
|
val color = ThemeUtil.getThemedColor(context, colorID)
|
|
|
|
val filter = BlendModeColorFilterCompat.createBlendModeColorFilterCompat(color, BlendModeCompat.SRC_IN)
|
|
|
|
background.colorFilter = filter
|
|
|
|
setBackground(background)
|
|
|
|
// Body
|
2021-06-04 01:58:04 +02:00
|
|
|
mainContainer.removeAllViews()
|
2021-06-01 06:56:58 +02:00
|
|
|
if (message is MmsMessageRecord && message.linkPreviews.isNotEmpty()) {
|
|
|
|
val linkPreviewView = LinkPreviewView(context)
|
2021-06-02 05:14:36 +02:00
|
|
|
linkPreviewView.bind(message)
|
2021-06-01 06:56:58 +02:00
|
|
|
mainContainer.addView(linkPreviewView)
|
|
|
|
} else if (message is MmsMessageRecord && message.quote != null) {
|
|
|
|
val quoteView = QuoteView(context)
|
2021-06-02 05:14:36 +02:00
|
|
|
quoteView.bind(message)
|
2021-06-01 06:56:58 +02:00
|
|
|
mainContainer.addView(quoteView)
|
|
|
|
} else if (message is MmsMessageRecord && message.slideDeck.audioSlide != null) {
|
|
|
|
val voiceMessageView = VoiceMessageView(context)
|
2021-06-02 05:14:36 +02:00
|
|
|
voiceMessageView.bind(message)
|
2021-06-01 06:56:58 +02:00
|
|
|
mainContainer.addView(voiceMessageView)
|
|
|
|
} else if (message is MmsMessageRecord && message.slideDeck.documentSlide != null) {
|
|
|
|
val documentView = DocumentView(context)
|
2021-06-02 05:14:36 +02:00
|
|
|
documentView.bind(message)
|
2021-06-01 06:56:58 +02:00
|
|
|
mainContainer.addView(documentView)
|
|
|
|
} else if (message is MmsMessageRecord && message.slideDeck.asAttachments().isNotEmpty()) {
|
|
|
|
throw IllegalStateException("Not yet implemented; we may want to use Signal's album view here.")
|
|
|
|
} else {
|
2021-06-02 05:03:22 +02:00
|
|
|
val bodyTextView = getBodyTextView(message)
|
2021-06-01 06:56:58 +02:00
|
|
|
mainContainer.addView(bodyTextView)
|
|
|
|
}
|
|
|
|
}
|
2021-06-04 01:58:04 +02:00
|
|
|
|
2021-06-07 07:48:22 +02:00
|
|
|
private fun getBackground(isOutgoing: Boolean, isStartOfMessageCluster: Boolean, isEndOfMessageCluster: Boolean): Drawable {
|
|
|
|
val isSingleMessage = (isStartOfMessageCluster && isEndOfMessageCluster)
|
|
|
|
@DrawableRes val backgroundID: Int
|
|
|
|
if (isSingleMessage) {
|
|
|
|
backgroundID = if (isOutgoing) R.drawable.message_bubble_background_sent_alone else R.drawable.message_bubble_background_received_alone
|
|
|
|
} else if (isStartOfMessageCluster) {
|
|
|
|
backgroundID = if (isOutgoing) R.drawable.message_bubble_background_sent_start else R.drawable.message_bubble_background_received_start
|
|
|
|
} else if (isEndOfMessageCluster) {
|
|
|
|
backgroundID = if (isOutgoing) R.drawable.message_bubble_background_sent_end else R.drawable.message_bubble_background_received_end
|
|
|
|
} else {
|
|
|
|
backgroundID = if (isOutgoing) R.drawable.message_bubble_background_sent_middle else R.drawable.message_bubble_background_received_middle;
|
|
|
|
}
|
|
|
|
return ResourcesCompat.getDrawable(resources, backgroundID, context.theme)!!
|
|
|
|
}
|
|
|
|
|
2021-06-04 01:58:04 +02:00
|
|
|
fun recycle() {
|
|
|
|
mainContainer.removeAllViews()
|
|
|
|
}
|
2021-06-01 06:56:58 +02:00
|
|
|
// endregion
|
|
|
|
|
|
|
|
// region Convenience
|
2021-06-02 05:03:22 +02:00
|
|
|
private fun getBodyTextView(message: MessageRecord): TextView {
|
2021-06-01 06:56:58 +02:00
|
|
|
val result = TextView(context)
|
2021-06-01 07:43:37 +02:00
|
|
|
result.setPadding(resources.getDimension(R.dimen.small_spacing).toInt())
|
2021-06-02 05:03:22 +02:00
|
|
|
result.text = message.body
|
2021-06-01 07:43:37 +02:00
|
|
|
result.setTextSize(TypedValue.COMPLEX_UNIT_PX, resources.getDimension(R.dimen.medium_font_size))
|
2021-06-02 05:03:22 +02:00
|
|
|
val uiMode = UiModeUtilities.getUserSelectedUiMode(context)
|
|
|
|
val colorID = if (message.isOutgoing) {
|
|
|
|
if (uiMode == UiMode.NIGHT) R.color.black else R.color.white
|
|
|
|
} else {
|
|
|
|
if (uiMode == UiMode.NIGHT) R.color.white else R.color.black
|
|
|
|
}
|
|
|
|
result.setTextColor(resources.getColorWithID(colorID, context.theme))
|
2021-06-01 06:56:58 +02:00
|
|
|
return result
|
2021-06-01 05:26:57 +02:00
|
|
|
}
|
|
|
|
// endregion
|
|
|
|
}
|