diff --git a/library/ui-styles/src/main/res/values/styles_sc.xml b/library/ui-styles/src/main/res/values/styles_sc.xml
index ef2ea0c288..ec6584ad0b 100644
--- a/library/ui-styles/src/main/res/values/styles_sc.xml
+++ b/library/ui-styles/src/main/res/values/styles_sc.xml
@@ -65,4 +65,9 @@
- ?vctr_content_secondary
+
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt
index ea5d2583b5..c141cf6037 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt
@@ -202,11 +202,11 @@ class MessageItemFactory @Inject constructor(
is MessageImageInfoContent -> buildImageMessageItem(messageContent, informationData, highlight, callback, attributes)
is MessageNoticeContent -> buildNoticeMessageItem(messageContent, informationData, highlight, callback, attributes)
is MessageVideoContent -> buildVideoMessageItem(messageContent, informationData, highlight, callback, attributes)
- is MessageFileContent -> buildFileMessageItem(messageContent, highlight, attributes)
- is MessageAudioContent -> buildAudioContent(params, messageContent, informationData, highlight, attributes)
+ is MessageFileContent -> buildFileMessageItem(messageContent, highlight, callback, attributes)
+ is MessageAudioContent -> buildAudioContent(params, messageContent, informationData, highlight, callback, attributes)
is MessageVerificationRequestContent -> buildVerificationRequestMessageItem(messageContent, informationData, highlight, callback, attributes)
is MessagePollContent -> buildPollItem(messageContent, informationData, highlight, callback, attributes)
- is MessageLocationContent -> buildLocationItem(messageContent, informationData, highlight, attributes)
+ is MessageLocationContent -> buildLocationItem(messageContent, informationData, highlight, callback, attributes)
is MessageBeaconInfoContent -> liveLocationShareMessageItemFactory.create(params.event, highlight, attributes)
is MessageVoiceBroadcastInfoContent -> voiceBroadcastItemFactory.create(params, messageContent, highlight, attributes)
else -> buildNotHandledMessageItem(messageContent, informationData, highlight, callback, attributes)
@@ -220,6 +220,7 @@ class MessageItemFactory @Inject constructor(
locationContent: MessageLocationContent,
informationData: MessageInformationData,
highlight: Boolean,
+ callback: TimelineEventController.Callback?,
attributes: AbsMessageItem.Attributes,
): MessageLocationItem? {
val width = timelineMediaSizeProvider.getMaxSize().first
@@ -240,6 +241,9 @@ class MessageItemFactory @Inject constructor(
.locationPinProvider(locationPinProvider)
.highlighted(highlight)
.leftGuideline(avatarSizeProvider.leftGuideline)
+ .movementMethod(createLinkMovementMethod(callback))
+ .replyPreviewRetriever(callback?.getReplyPreviewRetriever())
+ .inReplyToClickCallback(callback)
}
private fun buildPollItem(
@@ -262,6 +266,9 @@ class MessageItemFactory @Inject constructor(
.highlighted(highlight)
.leftGuideline(avatarSizeProvider.leftGuideline)
.callback(callback)
+ .movementMethod(createLinkMovementMethod(callback))
+ .replyPreviewRetriever(callback?.getReplyPreviewRetriever())
+ .inReplyToClickCallback(callback)
}
private fun createPollQuestion(
@@ -279,6 +286,7 @@ class MessageItemFactory @Inject constructor(
messageContent: MessageAudioContent,
informationData: MessageInformationData,
highlight: Boolean,
+ callback: TimelineEventController.Callback?,
attributes: AbsMessageItem.Attributes
): MessageAudioItem {
val fileUrl = getAudioFileUrl(messageContent, informationData)
@@ -300,6 +308,9 @@ class MessageItemFactory @Inject constructor(
.contentDownloadStateTrackerBinder(contentDownloadStateTrackerBinder)
.highlighted(highlight)
.leftGuideline(avatarSizeProvider.leftGuideline)
+ .movementMethod(createLinkMovementMethod(callback))
+ .replyPreviewRetriever(callback?.getReplyPreviewRetriever())
+ .inReplyToClickCallback(callback)
}
private fun getAudioFileUrl(
@@ -328,6 +339,7 @@ class MessageItemFactory @Inject constructor(
messageContent: MessageAudioContent,
informationData: MessageInformationData,
highlight: Boolean,
+ callback: TimelineEventController.Callback?,
attributes: AbsMessageItem.Attributes
): MessageVoiceItem? {
// Do not display voice broadcast messages
@@ -361,6 +373,9 @@ class MessageItemFactory @Inject constructor(
.contentDownloadStateTrackerBinder(contentDownloadStateTrackerBinder)
.highlighted(highlight)
.leftGuideline(avatarSizeProvider.leftGuideline)
+ .movementMethod(createLinkMovementMethod(callback))
+ .replyPreviewRetriever(callback?.getReplyPreviewRetriever())
+ .inReplyToClickCallback(callback)
}
private fun buildVerificationRequestMessageItem(
@@ -409,6 +424,7 @@ class MessageItemFactory @Inject constructor(
private fun buildFileMessageItem(
messageContent: MessageFileContent,
highlight: Boolean,
+ callback: TimelineEventController.Callback?,
attributes: AbsMessageItem.Attributes,
): MessageFileItem {
val mxcUrl = messageContent.getFileUrl() ?: ""
@@ -424,6 +440,9 @@ class MessageItemFactory @Inject constructor(
.filename(messageContent.getFileName())
.caption(messageContent.getCaption())
.iconRes(R.drawable.ic_paperclip)
+ .movementMethod(createLinkMovementMethod(callback))
+ .replyPreviewRetriever(callback?.getReplyPreviewRetriever())
+ .inReplyToClickCallback(callback)
}
private fun buildAudioContent(
@@ -431,11 +450,12 @@ class MessageItemFactory @Inject constructor(
messageContent: MessageAudioContent,
informationData: MessageInformationData,
highlight: Boolean,
+ callback: TimelineEventController.Callback?,
attributes: AbsMessageItem.Attributes,
) = if (messageContent.voiceMessageIndicator != null) {
- buildVoiceMessageItem(params, messageContent, informationData, highlight, attributes)
+ buildVoiceMessageItem(params, messageContent, informationData, highlight, callback, attributes)
} else {
- buildAudioMessageItem(params, messageContent, informationData, highlight, attributes)
+ buildAudioMessageItem(params, messageContent, informationData, highlight, callback, attributes)
}
private fun buildNotHandledMessageItem(
@@ -481,6 +501,9 @@ class MessageItemFactory @Inject constructor(
.contentUploadStateTrackerBinder(contentUploadStateTrackerBinder)
.playable(playable)
.highlighted(highlight)
+ .movementMethod(createLinkMovementMethod(callback))
+ .replyPreviewRetriever(callback?.getReplyPreviewRetriever())
+ .inReplyToClickCallback(callback)
.mediaData(data)
.apply {
if (messageContent.msgType == MessageType.MSGTYPE_STICKER_LOCAL) {
@@ -543,6 +566,9 @@ class MessageItemFactory @Inject constructor(
.contentUploadStateTrackerBinder(contentUploadStateTrackerBinder)
.playable(true)
.highlighted(highlight)
+ .movementMethod(createLinkMovementMethod(callback))
+ .replyPreviewRetriever(callback?.getReplyPreviewRetriever())
+ .inReplyToClickCallback(callback)
.mediaData(thumbnailData)
.clickListener { view -> callback?.onVideoMessageClicked(messageContent, videoData, view.findViewById(R.id.messageThumbnailView)) }
}
@@ -604,14 +630,14 @@ class MessageItemFactory @Inject constructor(
.markwonPlugins(htmlRenderer.get().plugins)
.searchForPills(isFormatted)
.previewUrlRetriever(callback?.getPreviewUrlRetriever())
- .replyPreviewRetriever(callback?.getReplyPreviewRetriever())
- .inReplyToClickCallback(callback)
.imageContentRenderer(imageContentRenderer)
.previewUrlCallback(callback)
.leftGuideline(avatarSizeProvider.leftGuideline)
.attributes(attributes)
.highlighted(highlight)
.movementMethod(createLinkMovementMethod(callback))
+ .replyPreviewRetriever(callback?.getReplyPreviewRetriever())
+ .inReplyToClickCallback(callback)
}
private fun annotateWithEdited(
@@ -705,8 +731,6 @@ class MessageItemFactory @Inject constructor(
return MessageTextItem_()
.leftGuideline(avatarSizeProvider.leftGuideline)
.previewUrlRetriever(callback?.getPreviewUrlRetriever())
- .replyPreviewRetriever(callback?.getReplyPreviewRetriever())
- .inReplyToClickCallback(callback)
.imageContentRenderer(imageContentRenderer)
.previewUrlCallback(callback)
.attributes(attributes)
@@ -714,6 +738,8 @@ class MessageItemFactory @Inject constructor(
.bindingOptions(bindingOptions)
.highlighted(highlight)
.movementMethod(createLinkMovementMethod(callback))
+ .replyPreviewRetriever(callback?.getReplyPreviewRetriever())
+ .inReplyToClickCallback(callback)
}
private fun buildEmoteMessageItem(
@@ -740,13 +766,13 @@ class MessageItemFactory @Inject constructor(
.bindingOptions(bindingOptions)
.leftGuideline(avatarSizeProvider.leftGuideline)
.previewUrlRetriever(callback?.getPreviewUrlRetriever())
- .replyPreviewRetriever(callback?.getReplyPreviewRetriever())
- .inReplyToClickCallback(callback)
.imageContentRenderer(imageContentRenderer)
.previewUrlCallback(callback)
.attributes(attributes)
.highlighted(highlight)
.movementMethod(createLinkMovementMethod(callback))
+ .replyPreviewRetriever(callback?.getReplyPreviewRetriever())
+ .inReplyToClickCallback(callback)
}
private fun MessageContentWithFormattedBody.getHtmlBody(): CharSequence {
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/MessageInformationDataFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/MessageInformationDataFactory.kt
index a91f8817f9..b26da5ffa4 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/MessageInformationDataFactory.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/MessageInformationDataFactory.kt
@@ -49,6 +49,7 @@ import org.matrix.android.sdk.api.session.room.model.message.MessageVerification
import org.matrix.android.sdk.api.session.room.send.SendState
import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent
import org.matrix.android.sdk.api.session.room.timeline.hasBeenEdited
+import org.matrix.android.sdk.api.session.room.timeline.isReply
import timber.log.Timber
import javax.inject.Inject
@@ -169,6 +170,7 @@ class MessageInformationDataFactory @Inject constructor(
senderPowerLevel = senderPowerLevel,
isDirect = isEffectivelyDirect,
isPublic = roomSummary?.isPublic ?: false,
+ isReply = event.isReply(),
dmChatPartnerId = dmOtherMemberId,
isFirstFromThisSender = isFirstFromThisSender,
isLastFromThisSender = isLastFromThisSender,
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/AbsMessageItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/AbsMessageItem.kt
index 17202c946f..a0a4495be3 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/AbsMessageItem.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/AbsMessageItem.kt
@@ -18,6 +18,7 @@ package im.vector.app.features.home.room.detail.timeline.item
import android.content.Context
import android.graphics.Typeface
+import android.text.method.MovementMethod
import android.view.View
import android.widget.ImageView
import android.widget.ProgressBar
@@ -37,6 +38,9 @@ import im.vector.app.features.home.AvatarRenderer
import im.vector.app.features.home.room.detail.timeline.MessageColorProvider
import im.vector.app.features.home.room.detail.timeline.TimelineEventController
import im.vector.app.features.home.room.detail.timeline.helper.MatrixItemColorProvider
+import im.vector.app.features.home.room.detail.timeline.reply.InReplyToView
+import im.vector.app.features.home.room.detail.timeline.reply.PreviewReplyUiState
+import im.vector.app.features.home.room.detail.timeline.reply.ReplyPreviewRetriever
import im.vector.app.features.home.room.detail.timeline.style.TimelineMessageLayout
import im.vector.app.features.home.room.detail.timeline.view.ScMessageBubbleWrapView
import im.vector.app.features.home.room.detail.timeline.view.TimelineMessageLayoutRenderer
@@ -55,6 +59,8 @@ abstract class AbsMessageItem(
@LayoutRes layoutId: Int = R.layout.item_timeline_event_base
) : AbsBaseMessageItem(layoutId) {
+ private val replyViewUpdater = ReplyViewUpdater()
+
override val baseAttributes: AbsBaseMessageItem.Attributes
get() = attributes
@@ -65,6 +71,15 @@ abstract class AbsMessageItem(
@EpoxyAttribute
lateinit var attributes: Attributes
+ @EpoxyAttribute(EpoxyAttribute.Option.DoNotHash)
+ var movementMethod: MovementMethod? = null
+
+ @EpoxyAttribute
+ var replyPreviewRetriever: ReplyPreviewRetriever? = null
+
+ @EpoxyAttribute
+ var inReplyToClickCallback: TimelineEventController.InReplyToClickCallback? = null
+
private val _avatarClickListener = object : ClickListener {
override fun invoke(p1: View) {
attributes.avatarCallback?.onAvatarClicked(attributes.informationData)
@@ -140,6 +155,18 @@ abstract class AbsMessageItem(
updateHighlightedMessageHeight(holder, false)
}
}
+
+ // Replies
+ if (holder.replyToView != null) {
+ replyViewUpdater.replyView = holder.replyToView
+ val safeReplyPreviewRetriever = replyPreviewRetriever
+ if (safeReplyPreviewRetriever == null) {
+ holder.replyToView?.isVisible = false
+ } else {
+ safeReplyPreviewRetriever.addListener(attributes.informationData.eventId, replyViewUpdater)
+ }
+ holder.replyToView?.delegate = inReplyToClickCallback
+ }
}
private fun updateHighlightedMessageHeight(holder: Holder, isExpanded: Boolean) {
@@ -160,6 +187,8 @@ abstract class AbsMessageItem(
holder.memberNameView.setOnLongClickListener(null)
attributes.avatarRenderer.clear(holder.threadSummaryAvatarImageView)
holder.threadSummaryConstraintLayout.setOnClickListener(null)
+ replyPreviewRetriever?.removeListener(attributes.informationData.eventId, replyViewUpdater)
+ replyViewUpdater.replyView = null
super.unbind(holder)
}
@@ -172,6 +201,7 @@ abstract class AbsMessageItem(
val timeView by bind(R.id.messageTimeView)
val sendStateImageView by bind(R.id.messageSendStateImageView)
val eventSendingIndicator by bind(R.id.eventSendingIndicator)
+ val replyToView: InReplyToView? by lazy { view.findViewById(R.id.inReplyToContainer) }
val threadSummaryConstraintLayout by bind(R.id.messageThreadSummaryConstraintLayout)
val threadSummaryCounterTextView by bind(R.id.messageThreadSummaryCounterTextView)
val threadSummaryAvatarImageView by bind(R.id.messageThreadSummaryAvatarImageView)
@@ -237,6 +267,16 @@ abstract class AbsMessageItem(
)
}
+
+ inner class ReplyViewUpdater : ReplyPreviewRetriever.PreviewReplyRetrieverListener {
+ var replyView: InReplyToView? = null
+
+ override fun onStateUpdated(state: PreviewReplyUiState) {
+ replyPreviewRetriever?.let {
+ replyView?.render(state, it, attributes.informationData, movementMethod, coroutineScope)
+ }
+ }
+ }
override fun ignoreMessageGuideline(context: Context): Boolean {
val messageLayout = attributes.informationData.messageLayout as? TimelineMessageLayout.ScBubble ?: return false
return infoInBubbles(messageLayout) && canHideAvatars(attributes)
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageImageVideoItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageImageVideoItem.kt
index 60bc6f14e9..bb9c67f3db 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageImageVideoItem.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageImageVideoItem.kt
@@ -145,6 +145,8 @@ abstract class MessageImageVideoItem : AbsMessageItem {
+ !(messageLayout.isRealBubble || messageLayout.isPseudoBubble) || needsRealBubble() || mode != ImageContentRenderer.Mode.THUMBNAIL -> {
holder.mediaContentView.background = null
}
attributes.informationData.sentByMe -> {
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageInformationData.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageInformationData.kt
index 81b0686ad9..5e2ecbae78 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageInformationData.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageInformationData.kt
@@ -42,6 +42,7 @@ data class MessageInformationData(
val readReceiptAnonymous: AnonymousReadReceipt,
val isDirect: Boolean,
val isPublic: Boolean,
+ val isReply: Boolean,
val senderPowerLevel: Int?,
val dmChatPartnerId: String?,
val e2eDecoration: E2EDecoration = E2EDecoration.NONE,
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageTextItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageTextItem.kt
index f4031bf3fb..aa8893041c 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageTextItem.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageTextItem.kt
@@ -60,12 +60,6 @@ abstract class MessageTextItem : AbsMessageItem() {
@EpoxyAttribute
var useBigFont: Boolean = false
- @EpoxyAttribute
- var replyPreviewRetriever: ReplyPreviewRetriever? = null
-
- @EpoxyAttribute
- var inReplyToClickCallback: TimelineEventController.InReplyToClickCallback? = null
-
@EpoxyAttribute
var previewUrlRetriever: PreviewUrlRetriever? = null
@@ -75,14 +69,14 @@ abstract class MessageTextItem : AbsMessageItem() {
@EpoxyAttribute
var imageContentRenderer: ImageContentRenderer? = null
- @EpoxyAttribute(EpoxyAttribute.Option.DoNotHash)
- var movementMethod: MovementMethod? = null
+ // SC: moved to super
+ //@EpoxyAttribute(EpoxyAttribute.Option.DoNotHash)
+ //var movementMethod: MovementMethod? = null
@EpoxyAttribute(EpoxyAttribute.Option.DoNotHash)
var markwonPlugins: (List)? = null
private val previewUrlViewUpdater = PreviewUrlViewUpdater()
- private val replyViewUpdater = ReplyViewUpdater()
// Remember footer measures for URL updates
private var footerWidth: Int = 0
@@ -107,15 +101,6 @@ abstract class MessageTextItem : AbsMessageItem() {
holder.previewUrlView.delegate = previewUrlCallback
holder.previewUrlView.renderMessageLayout(attributes.informationData.messageLayout)
- replyViewUpdater.replyView = holder.replyToView
- val safeReplyPreviewRetriever = replyPreviewRetriever
- if (safeReplyPreviewRetriever == null) {
- holder.replyToView.isVisible = false
- } else {
- safeReplyPreviewRetriever.addListener(attributes.informationData.eventId, replyViewUpdater)
- }
- holder.replyToView.delegate = inReplyToClickCallback
-
if (useBigFont) {
holder.messageView.textSize = 44F
} else {
@@ -155,7 +140,6 @@ abstract class MessageTextItem : AbsMessageItem() {
previewUrlViewUpdater.previewUrlView = null
previewUrlViewUpdater.imageContentRenderer = null
previewUrlRetriever?.removeListener(attributes.informationData.eventId, previewUrlViewUpdater)
- replyPreviewRetriever?.removeListener(attributes.informationData.eventId, replyViewUpdater)
}
override fun getViewStubId() = STUB_ID
@@ -164,7 +148,6 @@ abstract class MessageTextItem : AbsMessageItem() {
val messageView by bind(R.id.messageTextView)
val previewUrlViewElement by bind(R.id.messageUrlPreviewElement)
val previewUrlViewSc by bind(R.id.messageUrlPreviewSc)
- val replyToView by bind(R.id.inReplyToContainer)
lateinit var previewUrlView: AbstractPreviewUrlView // set to either previewUrlViewElement or previewUrlViewSc by layout
}
@@ -197,17 +180,6 @@ abstract class MessageTextItem : AbsMessageItem() {
}
}
- inner class ReplyViewUpdater : ReplyPreviewRetriever.PreviewReplyRetrieverListener {
- var replyView: InReplyToView? = null
-
- override fun onStateUpdated(state: PreviewReplyUiState) {
- timber.log.Timber.i("REPLY STATE UPDATE $replyPreviewRetriever $replyView")
- replyPreviewRetriever?.let {
- replyView?.render(state, it, attributes.informationData, movementMethod, coroutineScope)
- }
- }
- }
-
override fun allowFooterOverlay(holder: Holder, bubbleWrapView: ScMessageBubbleWrapView): Boolean {
return true
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/style/TimelineMessageLayoutFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/style/TimelineMessageLayoutFactory.kt
index 6300d3d892..8f51f7930a 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/style/TimelineMessageLayoutFactory.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/style/TimelineMessageLayoutFactory.kt
@@ -28,6 +28,7 @@ import im.vector.app.features.themes.BubbleThemeUtils
import org.matrix.android.sdk.api.session.Session
import org.matrix.android.sdk.api.session.events.model.EventType
import org.matrix.android.sdk.api.session.room.model.message.MessageContent
+import org.matrix.android.sdk.api.session.room.model.message.MessageImageContent
import org.matrix.android.sdk.api.session.room.model.message.MessageNoticeContent
import org.matrix.android.sdk.api.session.room.model.message.MessageType
import org.matrix.android.sdk.api.session.room.model.message.MessageVerificationRequestContent
@@ -36,6 +37,7 @@ import org.matrix.android.sdk.api.session.room.model.message.getCaption
import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent
import org.matrix.android.sdk.api.session.room.timeline.getLastMessageContent
import org.matrix.android.sdk.api.session.room.timeline.isEdition
+import org.matrix.android.sdk.api.session.room.timeline.isReply
import org.matrix.android.sdk.api.session.room.timeline.isRootThread
import javax.inject.Inject
@@ -208,9 +210,10 @@ class TimelineMessageLayoutFactory @Inject constructor(
}
}
- private fun MessageContent?.isPseudoBubble(event: TimelineEvent): Boolean {
+ private fun MessageContent?.isPseudoBubble(event: TimelineEvent, ignoreReply: Boolean = false): Boolean {
if (this == null) return false
if (event.root.isRedacted()) return false
+ if (!ignoreReply && event.isReply()) return false
if (this is MessageWithAttachmentContent && !getCaption().isNullOrBlank()) return false
return this.msgType in MSG_TYPES_WITH_PSEUDO_BUBBLE_LAYOUT
}
@@ -242,6 +245,7 @@ class TimelineMessageLayoutFactory @Inject constructor(
val type = root.getClearType()
if (type in EVENT_TYPES_WITH_BUBBLE_LAYOUT) {
val messageContent = getVectorLastMessageContent()
+ if (messageContent.isPseudoBubble(this, true)) return true
return messageContent?.msgType !in MSG_TYPES_WITHOUT_BUBBLE_LAYOUT
}
return false
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/view/ScMessageBubbleWrapView.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/view/ScMessageBubbleWrapView.kt
index 5356a38ac2..a3eaa30cb9 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/view/ScMessageBubbleWrapView.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/view/ScMessageBubbleWrapView.kt
@@ -604,7 +604,7 @@ fun setFlatRtl(layout: ViewGroup, direction: Int, childDirection: Int, depth: In
}
// Static to use from classes that use simplified/non-sc layouts, e.g. item_timeline_event_base_noinfo
-fun renderStubMessageLayout(messageLayout: TimelineMessageLayout, viewStubContainer: FrameLayout) {
+fun renderStubMessageLayout(messageLayout: TimelineMessageLayout, viewStubContainer: View) {
if (messageLayout !is TimelineMessageLayout.ScBubble) {
return
}
diff --git a/vector/src/main/res/layout/item_timeline_event_audio_stub.xml b/vector/src/main/res/layout/item_timeline_event_audio_stub.xml
index a317edc055..c04ad2d27a 100644
--- a/vector/src/main/res/layout/item_timeline_event_audio_stub.xml
+++ b/vector/src/main/res/layout/item_timeline_event_audio_stub.xml
@@ -9,6 +9,13 @@
android:minWidth="@dimen/chat_bubble_fixed_size"
tools:viewBindingIgnore="true">
+
+
+
+
+
+
+
+
@@ -57,6 +70,6 @@
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toBottomOf="@id/messageTextView"
+ app:layout_constraintTop_toBottomOf="@id/messageCaptionView"
tools:visibility="visible" />
diff --git a/vector/src/main/res/layout/item_timeline_event_text_message_stub.xml b/vector/src/main/res/layout/item_timeline_event_text_message_stub.xml
index 053661ddf3..20ec302401 100644
--- a/vector/src/main/res/layout/item_timeline_event_text_message_stub.xml
+++ b/vector/src/main/res/layout/item_timeline_event_text_message_stub.xml
@@ -10,11 +10,9 @@