Merge branch 'feature/aris/thread_live_thread_list' into feature/aris/threads_analytics
This commit is contained in:
commit
623e9257a5
@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package org.matrix.android.sdk.api.session.threads
|
package org.matrix.android.sdk.api.session.threads
|
||||||
|
|
||||||
|
import org.matrix.android.sdk.api.session.events.model.Event
|
||||||
import org.matrix.android.sdk.api.session.room.sender.SenderInfo
|
import org.matrix.android.sdk.api.session.room.sender.SenderInfo
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -26,7 +27,7 @@ data class ThreadDetails(
|
|||||||
val isRootThread: Boolean = false,
|
val isRootThread: Boolean = false,
|
||||||
val numberOfThreads: Int = 0,
|
val numberOfThreads: Int = 0,
|
||||||
val threadSummarySenderInfo: SenderInfo? = null,
|
val threadSummarySenderInfo: SenderInfo? = null,
|
||||||
val threadSummaryLatestTextMessage: String? = null,
|
val threadSummaryLatestEvent: Event? = null,
|
||||||
val lastMessageTimestamp: Long? = null,
|
val lastMessageTimestamp: Long? = null,
|
||||||
var threadNotificationState: ThreadNotificationState = ThreadNotificationState.NO_NEW_MESSAGE,
|
var threadNotificationState: ThreadNotificationState = ThreadNotificationState.NO_NEW_MESSAGE,
|
||||||
val isThread: Boolean = false,
|
val isThread: Boolean = false,
|
||||||
|
@ -114,7 +114,7 @@ internal object EventMapper {
|
|||||||
)
|
)
|
||||||
},
|
},
|
||||||
threadNotificationState = eventEntity.threadNotificationState,
|
threadNotificationState = eventEntity.threadNotificationState,
|
||||||
threadSummaryLatestTextMessage = eventEntity.threadSummaryLatestMessage?.root?.asDomain()?.getDecryptedTextSummary(),
|
threadSummaryLatestEvent = eventEntity.threadSummaryLatestMessage?.root?.asDomain(),
|
||||||
lastMessageTimestamp = eventEntity.threadSummaryLatestMessage?.root?.originServerTs
|
lastMessageTimestamp = eventEntity.threadSummaryLatestMessage?.root?.originServerTs
|
||||||
|
|
||||||
)
|
)
|
||||||
|
@ -32,6 +32,7 @@ import im.vector.app.core.resources.StringProvider
|
|||||||
import im.vector.app.core.resources.UserPreferencesProvider
|
import im.vector.app.core.resources.UserPreferencesProvider
|
||||||
import im.vector.app.core.ui.list.GenericHeaderItem_
|
import im.vector.app.core.ui.list.GenericHeaderItem_
|
||||||
import im.vector.app.features.home.AvatarRenderer
|
import im.vector.app.features.home.AvatarRenderer
|
||||||
|
import im.vector.app.features.home.room.detail.timeline.format.DisplayableEventFormatter
|
||||||
import im.vector.lib.core.utils.epoxy.charsequence.toEpoxyCharSequence
|
import im.vector.lib.core.utils.epoxy.charsequence.toEpoxyCharSequence
|
||||||
import org.matrix.android.sdk.api.session.Session
|
import org.matrix.android.sdk.api.session.Session
|
||||||
import org.matrix.android.sdk.api.session.events.model.Content
|
import org.matrix.android.sdk.api.session.events.model.Content
|
||||||
@ -45,6 +46,7 @@ class SearchResultController @Inject constructor(
|
|||||||
private val avatarRenderer: AvatarRenderer,
|
private val avatarRenderer: AvatarRenderer,
|
||||||
private val stringProvider: StringProvider,
|
private val stringProvider: StringProvider,
|
||||||
private val dateFormatter: VectorDateFormatter,
|
private val dateFormatter: VectorDateFormatter,
|
||||||
|
private val displayableEventFormatter: DisplayableEventFormatter,
|
||||||
private val userPreferencesProvider: UserPreferencesProvider
|
private val userPreferencesProvider: UserPreferencesProvider
|
||||||
) : TypedEpoxyController<SearchViewState>() {
|
) : TypedEpoxyController<SearchViewState>() {
|
||||||
|
|
||||||
@ -125,6 +127,7 @@ class SearchResultController @Inject constructor(
|
|||||||
.sender(eventAndSender.sender
|
.sender(eventAndSender.sender
|
||||||
?: eventAndSender.event.senderId?.let { session.getRoomMember(it, data.roomId) }?.toMatrixItem())
|
?: eventAndSender.event.senderId?.let { session.getRoomMember(it, data.roomId) }?.toMatrixItem())
|
||||||
.threadDetails(event.threadDetails)
|
.threadDetails(event.threadDetails)
|
||||||
|
.threadSummaryFormatted(displayableEventFormatter.formatThreadSummary(event.threadDetails?.threadSummaryLatestEvent).toString())
|
||||||
.areThreadMessagesEnabled(userPreferencesProvider.areThreadMessagesEnabled())
|
.areThreadMessagesEnabled(userPreferencesProvider.areThreadMessagesEnabled())
|
||||||
.listener { listener?.onItemClicked(eventAndSender.event) }
|
.listener { listener?.onItemClicked(eventAndSender.event) }
|
||||||
.let { result.add(it) }
|
.let { result.add(it) }
|
||||||
|
@ -42,6 +42,7 @@ abstract class SearchResultItem : VectorEpoxyModel<SearchResultItem.Holder>() {
|
|||||||
@EpoxyAttribute lateinit var spannable: EpoxyCharSequence
|
@EpoxyAttribute lateinit var spannable: EpoxyCharSequence
|
||||||
@EpoxyAttribute var sender: MatrixItem? = null
|
@EpoxyAttribute var sender: MatrixItem? = null
|
||||||
@EpoxyAttribute var threadDetails: ThreadDetails? = null
|
@EpoxyAttribute var threadDetails: ThreadDetails? = null
|
||||||
|
@EpoxyAttribute var threadSummaryFormatted: String? = null
|
||||||
@EpoxyAttribute var areThreadMessagesEnabled: Boolean = false
|
@EpoxyAttribute var areThreadMessagesEnabled: Boolean = false
|
||||||
|
|
||||||
@EpoxyAttribute(EpoxyAttribute.Option.DoNotHash) var listener: ClickListener? = null
|
@EpoxyAttribute(EpoxyAttribute.Option.DoNotHash) var listener: ClickListener? = null
|
||||||
@ -60,8 +61,7 @@ abstract class SearchResultItem : VectorEpoxyModel<SearchResultItem.Holder>() {
|
|||||||
if (it.isRootThread) {
|
if (it.isRootThread) {
|
||||||
showThreadSummary(holder)
|
showThreadSummary(holder)
|
||||||
holder.threadSummaryCounterTextView.text = it.numberOfThreads.toString()
|
holder.threadSummaryCounterTextView.text = it.numberOfThreads.toString()
|
||||||
holder.threadSummaryInfoTextView.text = it.threadSummaryLatestTextMessage.orEmpty()
|
holder.threadSummaryInfoTextView.text = threadSummaryFormatted.orEmpty()
|
||||||
|
|
||||||
val userId = it.threadSummarySenderInfo?.userId ?: return@let
|
val userId = it.threadSummarySenderInfo?.userId ?: return@let
|
||||||
val displayName = it.threadSummarySenderInfo?.displayName
|
val displayName = it.threadSummarySenderInfo?.displayName
|
||||||
val avatarUrl = it.threadSummarySenderInfo?.avatarUrl
|
val avatarUrl = it.threadSummarySenderInfo?.avatarUrl
|
||||||
|
@ -24,9 +24,11 @@ import im.vector.app.core.resources.StringProvider
|
|||||||
import im.vector.app.features.html.EventHtmlRenderer
|
import im.vector.app.features.html.EventHtmlRenderer
|
||||||
import me.gujun.android.span.span
|
import me.gujun.android.span.span
|
||||||
import org.commonmark.node.Document
|
import org.commonmark.node.Document
|
||||||
|
import org.matrix.android.sdk.api.session.events.model.Event
|
||||||
import org.matrix.android.sdk.api.session.events.model.EventType
|
import org.matrix.android.sdk.api.session.events.model.EventType
|
||||||
import org.matrix.android.sdk.api.session.events.model.toModel
|
import org.matrix.android.sdk.api.session.events.model.toModel
|
||||||
import org.matrix.android.sdk.api.session.room.model.message.MessageAudioContent
|
import org.matrix.android.sdk.api.session.room.model.message.MessageAudioContent
|
||||||
|
import org.matrix.android.sdk.api.session.room.model.message.MessageContent
|
||||||
import org.matrix.android.sdk.api.session.room.model.message.MessagePollContent
|
import org.matrix.android.sdk.api.session.room.model.message.MessagePollContent
|
||||||
import org.matrix.android.sdk.api.session.room.model.message.MessageTextContent
|
import org.matrix.android.sdk.api.session.room.model.message.MessageTextContent
|
||||||
import org.matrix.android.sdk.api.session.room.model.message.MessageType
|
import org.matrix.android.sdk.api.session.room.model.message.MessageType
|
||||||
@ -120,14 +122,14 @@ class DisplayableEventFormatter @Inject constructor(
|
|||||||
EventType.CALL_CANDIDATES -> {
|
EventType.CALL_CANDIDATES -> {
|
||||||
span { }
|
span { }
|
||||||
}
|
}
|
||||||
EventType.POLL_START -> {
|
EventType.POLL_START -> {
|
||||||
timelineEvent.root.getClearContent().toModel<MessagePollContent>(catchError = true)?.pollCreationInfo?.question?.question
|
timelineEvent.root.getClearContent().toModel<MessagePollContent>(catchError = true)?.pollCreationInfo?.question?.question
|
||||||
?: stringProvider.getString(R.string.sent_a_poll)
|
?: stringProvider.getString(R.string.sent_a_poll)
|
||||||
}
|
}
|
||||||
EventType.POLL_RESPONSE -> {
|
EventType.POLL_RESPONSE -> {
|
||||||
stringProvider.getString(R.string.poll_response_room_list_preview)
|
stringProvider.getString(R.string.poll_response_room_list_preview)
|
||||||
}
|
}
|
||||||
EventType.POLL_END -> {
|
EventType.POLL_END -> {
|
||||||
stringProvider.getString(R.string.poll_end_room_list_preview)
|
stringProvider.getString(R.string.poll_end_room_list_preview)
|
||||||
}
|
}
|
||||||
else -> {
|
else -> {
|
||||||
@ -139,6 +141,98 @@ class DisplayableEventFormatter @Inject constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun formatThreadSummary(
|
||||||
|
event: Event?,
|
||||||
|
latestEdition: String? = null): CharSequence {
|
||||||
|
event ?: return ""
|
||||||
|
|
||||||
|
// There event have been edited
|
||||||
|
if (latestEdition != null) {
|
||||||
|
return run {
|
||||||
|
val localFormattedBody = htmlRenderer.get().parse(latestEdition) as Document
|
||||||
|
val renderedBody = htmlRenderer.get().render(localFormattedBody) ?: latestEdition
|
||||||
|
renderedBody
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// The event have been redacted
|
||||||
|
if (event.isRedacted()) {
|
||||||
|
return noticeEventFormatter.formatRedactedEvent(event)
|
||||||
|
}
|
||||||
|
|
||||||
|
// The event is encrypted
|
||||||
|
if (event.isEncrypted() &&
|
||||||
|
event.mxDecryptionResult == null) {
|
||||||
|
return stringProvider.getString(R.string.encrypted_message)
|
||||||
|
}
|
||||||
|
|
||||||
|
return when (event.getClearType()) {
|
||||||
|
EventType.MESSAGE -> {
|
||||||
|
(event.getClearContent().toModel() as? MessageContent)?.let { messageContent ->
|
||||||
|
when (messageContent.msgType) {
|
||||||
|
MessageType.MSGTYPE_TEXT -> {
|
||||||
|
val body = messageContent.getTextDisplayableContent()
|
||||||
|
if (messageContent is MessageTextContent && messageContent.matrixFormattedBody.isNullOrBlank().not()) {
|
||||||
|
val localFormattedBody = htmlRenderer.get().parse(body) as Document
|
||||||
|
val renderedBody = htmlRenderer.get().render(localFormattedBody) ?: body
|
||||||
|
renderedBody
|
||||||
|
} else {
|
||||||
|
body
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MessageType.MSGTYPE_VERIFICATION_REQUEST -> {
|
||||||
|
stringProvider.getString(R.string.verification_request)
|
||||||
|
}
|
||||||
|
MessageType.MSGTYPE_IMAGE -> {
|
||||||
|
stringProvider.getString(R.string.sent_an_image)
|
||||||
|
}
|
||||||
|
MessageType.MSGTYPE_AUDIO -> {
|
||||||
|
if ((messageContent as? MessageAudioContent)?.voiceMessageIndicator != null) {
|
||||||
|
stringProvider.getString(R.string.sent_a_voice_message)
|
||||||
|
} else {
|
||||||
|
stringProvider.getString(R.string.sent_an_audio_file)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MessageType.MSGTYPE_VIDEO -> {
|
||||||
|
stringProvider.getString(R.string.sent_a_video)
|
||||||
|
}
|
||||||
|
MessageType.MSGTYPE_FILE -> {
|
||||||
|
stringProvider.getString(R.string.sent_a_file)
|
||||||
|
}
|
||||||
|
MessageType.MSGTYPE_LOCATION -> {
|
||||||
|
stringProvider.getString(R.string.sent_location)
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
|
messageContent.body
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} ?: span { }
|
||||||
|
}
|
||||||
|
EventType.STICKER -> {
|
||||||
|
stringProvider.getString(R.string.send_a_sticker)
|
||||||
|
}
|
||||||
|
EventType.REACTION -> {
|
||||||
|
event.getClearContent().toModel<ReactionContent>()?.relatesTo?.let {
|
||||||
|
emojiSpanify.spanify(stringProvider.getString(R.string.sent_a_reaction, it.key))
|
||||||
|
} ?: span { }
|
||||||
|
}
|
||||||
|
EventType.POLL_START -> {
|
||||||
|
event.getClearContent().toModel<MessagePollContent>(catchError = true)?.pollCreationInfo?.question?.question
|
||||||
|
?: stringProvider.getString(R.string.sent_a_poll)
|
||||||
|
}
|
||||||
|
EventType.POLL_RESPONSE -> {
|
||||||
|
stringProvider.getString(R.string.poll_response_room_list_preview)
|
||||||
|
}
|
||||||
|
EventType.POLL_END -> {
|
||||||
|
stringProvider.getString(R.string.poll_end_room_list_preview)
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
|
span {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun simpleFormat(senderName: String, body: CharSequence, appendAuthor: Boolean): CharSequence {
|
private fun simpleFormat(senderName: String, body: CharSequence, appendAuthor: Boolean): CharSequence {
|
||||||
return if (appendAuthor) {
|
return if (appendAuthor) {
|
||||||
span {
|
span {
|
||||||
|
@ -22,6 +22,7 @@ import im.vector.app.core.resources.UserPreferencesProvider
|
|||||||
import im.vector.app.features.home.AvatarRenderer
|
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.MessageColorProvider
|
||||||
import im.vector.app.features.home.room.detail.timeline.TimelineEventController
|
import im.vector.app.features.home.room.detail.timeline.TimelineEventController
|
||||||
|
import im.vector.app.features.home.room.detail.timeline.format.DisplayableEventFormatter
|
||||||
import im.vector.app.features.home.room.detail.timeline.item.AbsMessageItem
|
import im.vector.app.features.home.room.detail.timeline.item.AbsMessageItem
|
||||||
import im.vector.app.features.home.room.detail.timeline.item.MessageInformationData
|
import im.vector.app.features.home.room.detail.timeline.item.MessageInformationData
|
||||||
import org.matrix.android.sdk.api.session.threads.ThreadDetails
|
import org.matrix.android.sdk.api.session.threads.ThreadDetails
|
||||||
@ -32,6 +33,7 @@ class MessageItemAttributesFactory @Inject constructor(
|
|||||||
private val messageColorProvider: MessageColorProvider,
|
private val messageColorProvider: MessageColorProvider,
|
||||||
private val avatarSizeProvider: AvatarSizeProvider,
|
private val avatarSizeProvider: AvatarSizeProvider,
|
||||||
private val stringProvider: StringProvider,
|
private val stringProvider: StringProvider,
|
||||||
|
private val displayableEventFormatter: DisplayableEventFormatter,
|
||||||
private val preferencesProvider: UserPreferencesProvider,
|
private val preferencesProvider: UserPreferencesProvider,
|
||||||
private val emojiCompatFontProvider: EmojiCompatFontProvider) {
|
private val emojiCompatFontProvider: EmojiCompatFontProvider) {
|
||||||
|
|
||||||
@ -59,6 +61,7 @@ class MessageItemAttributesFactory @Inject constructor(
|
|||||||
readReceiptsCallback = callback,
|
readReceiptsCallback = callback,
|
||||||
emojiTypeFace = emojiCompatFontProvider.typeface,
|
emojiTypeFace = emojiCompatFontProvider.typeface,
|
||||||
decryptionErrorMessage = stringProvider.getString(R.string.encrypted_message),
|
decryptionErrorMessage = stringProvider.getString(R.string.encrypted_message),
|
||||||
|
threadSummaryFormatted = displayableEventFormatter.formatThreadSummary(threadDetails?.threadSummaryLatestEvent).toString(),
|
||||||
threadDetails = threadDetails,
|
threadDetails = threadDetails,
|
||||||
areThreadMessagesEnabled = preferencesProvider.areThreadMessagesEnabled()
|
areThreadMessagesEnabled = preferencesProvider.areThreadMessagesEnabled()
|
||||||
)
|
)
|
||||||
|
@ -115,7 +115,7 @@ abstract class AbsMessageItem<H : AbsMessageItem.Holder> : AbsBaseMessageItem<H>
|
|||||||
attributes.threadDetails?.let { threadDetails ->
|
attributes.threadDetails?.let { threadDetails ->
|
||||||
holder.threadSummaryConstraintLayout.isVisible = threadDetails.isRootThread
|
holder.threadSummaryConstraintLayout.isVisible = threadDetails.isRootThread
|
||||||
holder.threadSummaryCounterTextView.text = threadDetails.numberOfThreads.toString()
|
holder.threadSummaryCounterTextView.text = threadDetails.numberOfThreads.toString()
|
||||||
holder.threadSummaryInfoTextView.text = threadDetails.threadSummaryLatestTextMessage ?: attributes.decryptionErrorMessage
|
holder.threadSummaryInfoTextView.text = attributes.threadSummaryFormatted ?: attributes.decryptionErrorMessage
|
||||||
|
|
||||||
val userId = threadDetails.threadSummarySenderInfo?.userId ?: return@let
|
val userId = threadDetails.threadSummarySenderInfo?.userId ?: return@let
|
||||||
val displayName = threadDetails.threadSummarySenderInfo?.displayName
|
val displayName = threadDetails.threadSummarySenderInfo?.displayName
|
||||||
@ -183,6 +183,7 @@ abstract class AbsMessageItem<H : AbsMessageItem.Holder> : AbsBaseMessageItem<H>
|
|||||||
override val readReceiptsCallback: TimelineEventController.ReadReceiptsCallback? = null,
|
override val readReceiptsCallback: TimelineEventController.ReadReceiptsCallback? = null,
|
||||||
val emojiTypeFace: Typeface? = null,
|
val emojiTypeFace: Typeface? = null,
|
||||||
val decryptionErrorMessage: String? = null,
|
val decryptionErrorMessage: String? = null,
|
||||||
|
val threadSummaryFormatted: String? = null,
|
||||||
val threadDetails: ThreadDetails? = null,
|
val threadDetails: ThreadDetails? = null,
|
||||||
val areThreadMessagesEnabled: Boolean = false
|
val areThreadMessagesEnabled: Boolean = false
|
||||||
) : AbsBaseMessageItem.Attributes {
|
) : AbsBaseMessageItem.Attributes {
|
||||||
|
@ -17,11 +17,11 @@
|
|||||||
package im.vector.app.features.home.room.threads.list.viewmodel
|
package im.vector.app.features.home.room.threads.list.viewmodel
|
||||||
|
|
||||||
import com.airbnb.epoxy.EpoxyController
|
import com.airbnb.epoxy.EpoxyController
|
||||||
import im.vector.app.R
|
|
||||||
import im.vector.app.core.date.DateFormatKind
|
import im.vector.app.core.date.DateFormatKind
|
||||||
import im.vector.app.core.date.VectorDateFormatter
|
import im.vector.app.core.date.VectorDateFormatter
|
||||||
import im.vector.app.core.resources.StringProvider
|
import im.vector.app.core.resources.StringProvider
|
||||||
import im.vector.app.features.home.AvatarRenderer
|
import im.vector.app.features.home.AvatarRenderer
|
||||||
|
import im.vector.app.features.home.room.detail.timeline.format.DisplayableEventFormatter
|
||||||
import im.vector.app.features.home.room.threads.list.model.threadListItem
|
import im.vector.app.features.home.room.threads.list.model.threadListItem
|
||||||
import org.matrix.android.sdk.api.session.Session
|
import org.matrix.android.sdk.api.session.Session
|
||||||
import org.matrix.android.sdk.api.session.room.threads.model.ThreadSummary
|
import org.matrix.android.sdk.api.session.room.threads.model.ThreadSummary
|
||||||
@ -35,6 +35,7 @@ class ThreadListController @Inject constructor(
|
|||||||
private val avatarRenderer: AvatarRenderer,
|
private val avatarRenderer: AvatarRenderer,
|
||||||
private val stringProvider: StringProvider,
|
private val stringProvider: StringProvider,
|
||||||
private val dateFormatter: VectorDateFormatter,
|
private val dateFormatter: VectorDateFormatter,
|
||||||
|
private val displayableEventFormatter: DisplayableEventFormatter,
|
||||||
private val session: Session
|
private val session: Session
|
||||||
) : EpoxyController() {
|
) : EpoxyController() {
|
||||||
|
|
||||||
@ -70,9 +71,18 @@ class ThreadListController @Inject constructor(
|
|||||||
}
|
}
|
||||||
?.forEach { threadSummary ->
|
?.forEach { threadSummary ->
|
||||||
val date = dateFormatter.format(threadSummary.latestEvent?.originServerTs, DateFormatKind.ROOM_LIST)
|
val date = dateFormatter.format(threadSummary.latestEvent?.originServerTs, DateFormatKind.ROOM_LIST)
|
||||||
val decryptionErrorMessage = stringProvider.getString(R.string.encrypted_message)
|
val lastMessageFormatted = threadSummary.let {
|
||||||
val rootThreadEdition = threadSummary.threadEditions.rootThreadEdition
|
displayableEventFormatter.formatThreadSummary(
|
||||||
val latestThreadEdition = threadSummary.threadEditions.latestThreadEdition
|
event = it.latestEvent,
|
||||||
|
latestEdition = it.threadEditions.latestThreadEdition
|
||||||
|
).toString()
|
||||||
|
}
|
||||||
|
val rootMessageFormatted = threadSummary.let {
|
||||||
|
displayableEventFormatter.formatThreadSummary(
|
||||||
|
event = it.rootEvent,
|
||||||
|
latestEdition = it.threadEditions.rootThreadEdition
|
||||||
|
).toString()
|
||||||
|
}
|
||||||
threadListItem {
|
threadListItem {
|
||||||
id(threadSummary.rootEvent?.eventId)
|
id(threadSummary.rootEvent?.eventId)
|
||||||
avatarRenderer(host.avatarRenderer)
|
avatarRenderer(host.avatarRenderer)
|
||||||
@ -82,8 +92,8 @@ class ThreadListController @Inject constructor(
|
|||||||
rootMessageDeleted(threadSummary.rootEvent?.isRedacted() ?: false)
|
rootMessageDeleted(threadSummary.rootEvent?.isRedacted() ?: false)
|
||||||
// TODO refactor notifications that with the new thread summary
|
// TODO refactor notifications that with the new thread summary
|
||||||
threadNotificationState(threadSummary.rootEvent?.threadDetails?.threadNotificationState ?: ThreadNotificationState.NO_NEW_MESSAGE)
|
threadNotificationState(threadSummary.rootEvent?.threadDetails?.threadNotificationState ?: ThreadNotificationState.NO_NEW_MESSAGE)
|
||||||
rootMessage(rootThreadEdition ?: threadSummary.rootEvent?.getDecryptedTextSummary() ?: decryptionErrorMessage)
|
rootMessage(rootMessageFormatted)
|
||||||
lastMessage(latestThreadEdition ?: threadSummary.latestEvent?.getDecryptedTextSummary() ?: decryptionErrorMessage)
|
lastMessage(lastMessageFormatted)
|
||||||
lastMessageCounter(threadSummary.numberOfThreads.toString())
|
lastMessageCounter(threadSummary.numberOfThreads.toString())
|
||||||
lastMessageMatrixItem(threadSummary.latestThreadSenderInfo.toMatrixItemOrNull())
|
lastMessageMatrixItem(threadSummary.latestThreadSenderInfo.toMatrixItemOrNull())
|
||||||
itemClickListener {
|
itemClickListener {
|
||||||
@ -112,8 +122,18 @@ class ThreadListController @Inject constructor(
|
|||||||
}
|
}
|
||||||
?.forEach { timelineEvent ->
|
?.forEach { timelineEvent ->
|
||||||
val date = dateFormatter.format(timelineEvent.root.threadDetails?.lastMessageTimestamp, DateFormatKind.ROOM_LIST)
|
val date = dateFormatter.format(timelineEvent.root.threadDetails?.lastMessageTimestamp, DateFormatKind.ROOM_LIST)
|
||||||
val decryptionErrorMessage = stringProvider.getString(R.string.encrypted_message)
|
|
||||||
val lastRootThreadEdition = timelineEvent.root.threadDetails?.lastRootThreadEdition
|
val lastRootThreadEdition = timelineEvent.root.threadDetails?.lastRootThreadEdition
|
||||||
|
val lastMessageFormatted = timelineEvent.root.threadDetails?.threadSummaryLatestEvent.let {
|
||||||
|
displayableEventFormatter.formatThreadSummary(
|
||||||
|
event = it,
|
||||||
|
).toString()
|
||||||
|
}
|
||||||
|
val rootMessageFormatted = timelineEvent.root.let {
|
||||||
|
displayableEventFormatter.formatThreadSummary(
|
||||||
|
event = it,
|
||||||
|
latestEdition = lastRootThreadEdition
|
||||||
|
).toString()
|
||||||
|
}
|
||||||
threadListItem {
|
threadListItem {
|
||||||
id(timelineEvent.eventId)
|
id(timelineEvent.eventId)
|
||||||
avatarRenderer(host.avatarRenderer)
|
avatarRenderer(host.avatarRenderer)
|
||||||
@ -122,8 +142,8 @@ class ThreadListController @Inject constructor(
|
|||||||
date(date)
|
date(date)
|
||||||
rootMessageDeleted(timelineEvent.root.isRedacted())
|
rootMessageDeleted(timelineEvent.root.isRedacted())
|
||||||
threadNotificationState(timelineEvent.root.threadDetails?.threadNotificationState ?: ThreadNotificationState.NO_NEW_MESSAGE)
|
threadNotificationState(timelineEvent.root.threadDetails?.threadNotificationState ?: ThreadNotificationState.NO_NEW_MESSAGE)
|
||||||
rootMessage(lastRootThreadEdition ?: timelineEvent.root.getDecryptedTextSummary() ?: decryptionErrorMessage)
|
rootMessage(rootMessageFormatted)
|
||||||
lastMessage(timelineEvent.root.threadDetails?.threadSummaryLatestTextMessage ?: decryptionErrorMessage)
|
lastMessage(lastMessageFormatted)
|
||||||
lastMessageCounter(timelineEvent.root.threadDetails?.numberOfThreads.toString())
|
lastMessageCounter(timelineEvent.root.threadDetails?.numberOfThreads.toString())
|
||||||
lastMessageMatrixItem(timelineEvent.root.threadDetails?.threadSummarySenderInfo?.toMatrixItem())
|
lastMessageMatrixItem(timelineEvent.root.threadDetails?.threadSummarySenderInfo?.toMatrixItem())
|
||||||
itemClickListener {
|
itemClickListener {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user