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 @@