From e8f37dc916b8b071079414b95e7654dc92ec70d0 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Wed, 15 Feb 2023 10:36:02 +0100 Subject: [PATCH] Special rendering for poll end event when poll start is not available --- .../timeline/factory/MessageItemFactory.kt | 54 +++++++++++-------- .../room/detail/timeline/item/PollItem.kt | 15 ++++-- .../res/layout/item_timeline_event_poll.xml | 19 ++++++- 3 files changed, 61 insertions(+), 27 deletions(-) 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 bbe8e92756..09b91cc4f1 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 @@ -114,7 +114,6 @@ import org.matrix.android.sdk.api.session.room.model.relation.ReplyToContent import org.matrix.android.sdk.api.session.room.timeline.getRelationContent import org.matrix.android.sdk.api.settings.LightweightSettingsStorage import org.matrix.android.sdk.api.util.MimeTypes -import timber.log.Timber import javax.inject.Inject class MessageItemFactory @Inject constructor( @@ -160,8 +159,8 @@ class MessageItemFactory @Inject constructor( textRendererFactory.create(roomId) } - private val useRichTextEditorStyle: Boolean get() = - vectorPreferences.isRichTextEditorEnabled() + private val useRichTextEditorStyle: Boolean + get() = vectorPreferences.isRichTextEditorEnabled() fun create(params: TimelineItemFactoryParams): VectorEpoxyModel<*>? { val event = params.event @@ -264,7 +263,7 @@ class MessageItemFactory @Inject constructor( return PollItem_() .attributes(attributes) .eventId(informationData.eventId) - .pollQuestion(createPollQuestion(informationData, pollViewState.question, callback)) + .pollTitle(createPollQuestion(informationData, pollViewState.question, callback)) .canVote(pollViewState.canVote) .votesStatus(pollViewState.votesStatus) .optionViewStates(pollViewState.optionViewStates.orEmpty()) @@ -281,21 +280,37 @@ class MessageItemFactory @Inject constructor( highlight: Boolean, callback: TimelineEventController.Callback?, attributes: AbsMessageItem.Attributes, - ): PollItem? { - pollStartEventId ?: return null.also { - Timber.e("### buildEndedPollItem. Cannot render poll end event because poll start event id is null") + ): PollItem { + val pollStartEvent = if (pollStartEventId?.isNotEmpty() == true) { + session.roomService().getRoom(roomId)?.getTimelineEvent(pollStartEventId) + } else { + null } - val pollStartEvent = session.roomService().getRoom(roomId)?.getTimelineEvent(pollStartEventId) - val pollContent = pollStartEvent?.root?.getClearContent()?.toModel() ?: return null + val pollContent = pollStartEvent?.root?.getClearContent()?.toModel() - return buildPollItem( - pollContent, - informationData, - highlight, - callback, - attributes, - isEnded = true - ) + return if (pollContent == null) { + val title = stringProvider.getString(R.string.message_reply_to_ended_poll_preview).toEpoxyCharSequence() + PollItem_() + .attributes(attributes) + .eventId(informationData.eventId) + .pollTitle(title) + .optionViewStates(emptyList()) + .edited(informationData.hasBeenEdited) + .ended(true) + .hasContent(false) + .highlighted(highlight) + .leftGuideline(avatarSizeProvider.leftGuideline) + .callback(callback) + } else { + buildPollItem( + pollContent, + informationData, + highlight, + callback, + attributes, + isEnded = true, + ) + } } private fun createPollQuestion( @@ -487,7 +502,6 @@ class MessageItemFactory @Inject constructor( highlight, callback, attributes, - useRichTextEditorStyle = vectorPreferences.isRichTextEditorEnabled(), ) } @@ -594,7 +608,7 @@ class MessageItemFactory @Inject constructor( val replyToContent = messageContent.relatesTo?.inReplyTo buildFormattedTextItem(matrixFormattedBody, informationData, highlight, callback, attributes, replyToContent) } else { - buildMessageTextItem(messageContent.body, false, informationData, highlight, callback, attributes, useRichTextEditorStyle) + buildMessageTextItem(messageContent.body, false, informationData, highlight, callback, attributes) } } @@ -618,7 +632,6 @@ class MessageItemFactory @Inject constructor( highlight, callback, attributes, - useRichTextEditorStyle, ) } @@ -629,7 +642,6 @@ class MessageItemFactory @Inject constructor( highlight: Boolean, callback: TimelineEventController.Callback?, attributes: AbsMessageItem.Attributes, - useRichTextEditorStyle: Boolean, ): MessageTextItem? { val renderedBody = textRenderer.render(body) val bindingOptions = spanUtils.getBindingOptions(renderedBody) diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/PollItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/PollItem.kt index 6fe19e9762..220e422365 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/PollItem.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/PollItem.kt @@ -16,6 +16,7 @@ package im.vector.app.features.home.room.detail.timeline.item +import android.widget.ImageView import android.widget.LinearLayout import android.widget.TextView import androidx.core.view.children @@ -23,6 +24,7 @@ import androidx.core.view.isVisible import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyModelClass import im.vector.app.R +import im.vector.app.core.extensions.setTextOrHide import im.vector.app.features.home.room.detail.RoomDetailAction import im.vector.app.features.home.room.detail.timeline.TimelineEventController import im.vector.lib.core.utils.epoxy.charsequence.EpoxyCharSequence @@ -31,7 +33,7 @@ import im.vector.lib.core.utils.epoxy.charsequence.EpoxyCharSequence abstract class PollItem : AbsMessageItem() { @EpoxyAttribute - var pollQuestion: EpoxyCharSequence? = null + var pollTitle: EpoxyCharSequence? = null @EpoxyAttribute var callback: TimelineEventController.Callback? = null @@ -54,6 +56,9 @@ abstract class PollItem : AbsMessageItem() { @EpoxyAttribute var ended: Boolean = false + @EpoxyAttribute + var hasContent: Boolean = true + override fun getViewStubId() = STUB_ID override fun bind(holder: Holder) { @@ -61,8 +66,8 @@ abstract class PollItem : AbsMessageItem() { renderSendState(holder.view, holder.questionTextView) - holder.questionTextView.text = pollQuestion?.charSequence - holder.votesStatusTextView.text = votesStatus + holder.questionTextView.text = pollTitle?.charSequence + holder.votesStatusTextView.setTextOrHide(votesStatus) while (holder.optionsContainer.childCount < optionViewStates.size) { holder.optionsContainer.addView(PollOptionView(holder.view.context)) @@ -80,7 +85,8 @@ abstract class PollItem : AbsMessageItem() { } } - holder.endedPollTextView.isVisible = ended + holder.endedPollTextView.isVisible = ended && hasContent + holder.pollIcon.isVisible = ended && hasContent.not() } private fun onPollItemClick(optionViewState: PollOptionViewState) { @@ -96,6 +102,7 @@ abstract class PollItem : AbsMessageItem() { val optionsContainer by bind(R.id.optionsContainer) val votesStatusTextView by bind(R.id.optionsVotesStatusTextView) val endedPollTextView by bind(R.id.endedPollTextView) + val pollIcon by bind(R.id.timelinePollIcon) } companion object { diff --git a/vector/src/main/res/layout/item_timeline_event_poll.xml b/vector/src/main/res/layout/item_timeline_event_poll.xml index 9151fc68cf..093ea181cf 100644 --- a/vector/src/main/res/layout/item_timeline_event_poll.xml +++ b/vector/src/main/res/layout/item_timeline_event_poll.xml @@ -21,16 +21,31 @@ + +