mirror of
https://github.com/Novaloop-AG/element-x-android.git
synced 2026-11-03 16:10:00 +00:00
Fix "Sent" checkmark disappearing when the message is read and "Share presence" is disabled (#6985)
* Don't compute read receipts if presence sharing is disabled * Update screenshots --------- Co-authored-by: ElementBot <android@element.io> Co-authored-by: Jorge Martín <jorgem@element.io>
This commit is contained in:
+2
-1
@@ -208,7 +208,8 @@ class PinnedMessagesListPresenter(
|
|||||||
combine(timelineItemsFlow, room.membersStateFlow) { items, membersState ->
|
combine(timelineItemsFlow, room.membersStateFlow) { items, membersState ->
|
||||||
timelineItemsFactory.replaceWith(
|
timelineItemsFactory.replaceWith(
|
||||||
timelineItems = items,
|
timelineItems = items,
|
||||||
roomMembers = membersState.roomMembers().orEmpty()
|
roomMembers = membersState.roomMembers().orEmpty(),
|
||||||
|
renderReadReceipts = false,
|
||||||
)
|
)
|
||||||
}.launchIn(this)
|
}.launchIn(this)
|
||||||
|
|
||||||
|
|||||||
-1
@@ -217,7 +217,6 @@ private fun PinnedMessagesListLoaded(
|
|||||||
timelineItem = timelineItem,
|
timelineItem = timelineItem,
|
||||||
timelineMode = Timeline.Mode.PinnedEvents,
|
timelineMode = Timeline.Mode.PinnedEvents,
|
||||||
timelineRoomInfo = state.timelineRoomInfo,
|
timelineRoomInfo = state.timelineRoomInfo,
|
||||||
renderReadReceipts = false,
|
|
||||||
timelineProtectionState = state.timelineProtectionState,
|
timelineProtectionState = state.timelineProtectionState,
|
||||||
isLastOutgoingMessage = false,
|
isLastOutgoingMessage = false,
|
||||||
focusedEventId = null,
|
focusedEventId = null,
|
||||||
|
|||||||
+7
-6
@@ -138,9 +138,6 @@ class TimelinePresenter(
|
|||||||
val messageShieldDialogData: MutableState<MessageShieldData?> = remember { mutableStateOf(null) }
|
val messageShieldDialogData: MutableState<MessageShieldData?> = remember { mutableStateOf(null) }
|
||||||
|
|
||||||
val resolveVerifiedUserSendFailureState = resolveVerifiedUserSendFailurePresenter.present()
|
val resolveVerifiedUserSendFailureState = resolveVerifiedUserSendFailurePresenter.present()
|
||||||
val renderReadReceipts by remember {
|
|
||||||
sessionPreferencesStore.isRenderReadReceiptsEnabled()
|
|
||||||
}.collectAsState(initial = true)
|
|
||||||
val isLive by remember {
|
val isLive by remember {
|
||||||
timelineController.isLive()
|
timelineController.isLive()
|
||||||
}.collectAsState(initial = true)
|
}.collectAsState(initial = true)
|
||||||
@@ -252,13 +249,18 @@ class TimelinePresenter(
|
|||||||
}
|
}
|
||||||
.launchIn(this)
|
.launchIn(this)
|
||||||
|
|
||||||
combine(timelineController.timelineItems(), room.membersStateFlow) { items, membersState ->
|
combine(
|
||||||
|
timelineController.timelineItems(),
|
||||||
|
room.membersStateFlow,
|
||||||
|
sessionPreferencesStore.isRenderReadReceiptsEnabled(),
|
||||||
|
) { items, membersState, renderReadReceipts ->
|
||||||
val parent = analyticsService.getLongRunningTransaction(DisplayFirstTimelineItems)
|
val parent = analyticsService.getLongRunningTransaction(DisplayFirstTimelineItems)
|
||||||
val transaction = parent?.startChild("timelineItemsFactory.replaceWith", "Processing timeline items")
|
val transaction = parent?.startChild("timelineItemsFactory.replaceWith", "Processing timeline items")
|
||||||
transaction?.putExtraData(AnalyticsUserData.TIMELINE_ITEM_COUNT, items.count().toString())
|
transaction?.putExtraData(AnalyticsUserData.TIMELINE_ITEM_COUNT, items.count().toString())
|
||||||
timelineItemsFactory.replaceWith(
|
timelineItemsFactory.replaceWith(
|
||||||
timelineItems = items,
|
timelineItems = items,
|
||||||
roomMembers = membersState.roomMembers().orEmpty()
|
roomMembers = membersState.roomMembers().orEmpty(),
|
||||||
|
renderReadReceipts = renderReadReceipts,
|
||||||
)
|
)
|
||||||
transaction?.finish()
|
transaction?.finish()
|
||||||
items
|
items
|
||||||
@@ -313,7 +315,6 @@ class TimelinePresenter(
|
|||||||
timelineItems = timelineItems,
|
timelineItems = timelineItems,
|
||||||
timelineMode = timelineMode,
|
timelineMode = timelineMode,
|
||||||
timelineRoomInfo = timelineRoomInfo,
|
timelineRoomInfo = timelineRoomInfo,
|
||||||
renderReadReceipts = renderReadReceipts,
|
|
||||||
newEventState = newEventState.value,
|
newEventState = newEventState.value,
|
||||||
isLive = isLive,
|
isLive = isLive,
|
||||||
focusRequestState = focusRequestState.value,
|
focusRequestState = focusRequestState.value,
|
||||||
|
|||||||
-1
@@ -26,7 +26,6 @@ data class TimelineState(
|
|||||||
val timelineItems: ImmutableList<TimelineItem>,
|
val timelineItems: ImmutableList<TimelineItem>,
|
||||||
val timelineRoomInfo: TimelineRoomInfo,
|
val timelineRoomInfo: TimelineRoomInfo,
|
||||||
val timelineMode: Timeline.Mode,
|
val timelineMode: Timeline.Mode,
|
||||||
val renderReadReceipts: Boolean,
|
|
||||||
val newEventState: NewEventState,
|
val newEventState: NewEventState,
|
||||||
val isLive: Boolean,
|
val isLive: Boolean,
|
||||||
val focusRequestState: FocusRequestState,
|
val focusRequestState: FocusRequestState,
|
||||||
|
|||||||
-2
@@ -51,7 +51,6 @@ import kotlin.random.Random
|
|||||||
fun aTimelineState(
|
fun aTimelineState(
|
||||||
timelineItems: ImmutableList<TimelineItem> = persistentListOf(),
|
timelineItems: ImmutableList<TimelineItem> = persistentListOf(),
|
||||||
timelineMode: Timeline.Mode = Timeline.Mode.Live,
|
timelineMode: Timeline.Mode = Timeline.Mode.Live,
|
||||||
renderReadReceipts: Boolean = false,
|
|
||||||
timelineRoomInfo: TimelineRoomInfo = aTimelineRoomInfo(),
|
timelineRoomInfo: TimelineRoomInfo = aTimelineRoomInfo(),
|
||||||
focusedEventIndex: Int = -1,
|
focusedEventIndex: Int = -1,
|
||||||
isLive: Boolean = true,
|
isLive: Boolean = true,
|
||||||
@@ -70,7 +69,6 @@ fun aTimelineState(
|
|||||||
timelineItems = timelineItems,
|
timelineItems = timelineItems,
|
||||||
timelineMode = timelineMode,
|
timelineMode = timelineMode,
|
||||||
timelineRoomInfo = timelineRoomInfo,
|
timelineRoomInfo = timelineRoomInfo,
|
||||||
renderReadReceipts = renderReadReceipts,
|
|
||||||
newEventState = NewEventState.None,
|
newEventState = NewEventState.None,
|
||||||
isLive = isLive,
|
isLive = isLive,
|
||||||
focusRequestState = focusRequestState,
|
focusRequestState = focusRequestState,
|
||||||
|
|||||||
-1
@@ -171,7 +171,6 @@ fun TimelineView(
|
|||||||
timelineMode = state.timelineMode,
|
timelineMode = state.timelineMode,
|
||||||
timelineRoomInfo = state.timelineRoomInfo,
|
timelineRoomInfo = state.timelineRoomInfo,
|
||||||
timelineProtectionState = timelineProtectionState,
|
timelineProtectionState = timelineProtectionState,
|
||||||
renderReadReceipts = state.renderReadReceipts,
|
|
||||||
isLastOutgoingMessage = state.isLastOutgoingMessage(timelineItem.identifier()),
|
isLastOutgoingMessage = state.isLastOutgoingMessage(timelineItem.identifier()),
|
||||||
focusedEventId = state.focusedEventId,
|
focusedEventId = state.focusedEventId,
|
||||||
displayThreadSummaries = state.displayThreadSummaries,
|
displayThreadSummaries = state.displayThreadSummaries,
|
||||||
|
|||||||
-2
@@ -22,7 +22,6 @@ internal fun ATimelineItemEventRow(
|
|||||||
event: TimelineItem.Event,
|
event: TimelineItem.Event,
|
||||||
timelineMode: Timeline.Mode = Timeline.Mode.Live,
|
timelineMode: Timeline.Mode = Timeline.Mode.Live,
|
||||||
timelineRoomInfo: TimelineRoomInfo = aTimelineRoomInfo(),
|
timelineRoomInfo: TimelineRoomInfo = aTimelineRoomInfo(),
|
||||||
renderReadReceipts: Boolean = false,
|
|
||||||
isLastOutgoingMessage: Boolean = false,
|
isLastOutgoingMessage: Boolean = false,
|
||||||
timelineProtectionState: TimelineProtectionState = aTimelineProtectionState(),
|
timelineProtectionState: TimelineProtectionState = aTimelineProtectionState(),
|
||||||
displayThreadSummaries: Boolean = false,
|
displayThreadSummaries: Boolean = false,
|
||||||
@@ -30,7 +29,6 @@ internal fun ATimelineItemEventRow(
|
|||||||
event = event,
|
event = event,
|
||||||
timelineMode = timelineMode,
|
timelineMode = timelineMode,
|
||||||
timelineRoomInfo = timelineRoomInfo,
|
timelineRoomInfo = timelineRoomInfo,
|
||||||
renderReadReceipts = renderReadReceipts,
|
|
||||||
timelineProtectionState = timelineProtectionState,
|
timelineProtectionState = timelineProtectionState,
|
||||||
isLastOutgoingMessage = isLastOutgoingMessage,
|
isLastOutgoingMessage = isLastOutgoingMessage,
|
||||||
displayThreadSummaries = displayThreadSummaries,
|
displayThreadSummaries = displayThreadSummaries,
|
||||||
|
|||||||
+6
-9
@@ -52,7 +52,6 @@ internal fun TimelineItemCallNotifyView(
|
|||||||
timelineRoomInfo: TimelineRoomInfo,
|
timelineRoomInfo: TimelineRoomInfo,
|
||||||
event: TimelineItem.Event,
|
event: TimelineItem.Event,
|
||||||
content: TimelineItemRtcNotificationContent,
|
content: TimelineItemRtcNotificationContent,
|
||||||
renderReadReceipts: Boolean,
|
|
||||||
isLastOutgoingMessage: Boolean,
|
isLastOutgoingMessage: Boolean,
|
||||||
onLongClick: (TimelineItem.Event) -> Unit,
|
onLongClick: (TimelineItem.Event) -> Unit,
|
||||||
onReadReceiptsClick: (TimelineItem.Event) -> Unit,
|
onReadReceiptsClick: (TimelineItem.Event) -> Unit,
|
||||||
@@ -106,7 +105,6 @@ internal fun TimelineItemCallNotifyView(
|
|||||||
isLastOutgoingMessage = isLastOutgoingMessage,
|
isLastOutgoingMessage = isLastOutgoingMessage,
|
||||||
receipts = event.readReceiptState.receipts,
|
receipts = event.readReceiptState.receipts,
|
||||||
),
|
),
|
||||||
renderReadReceipts = renderReadReceipts,
|
|
||||||
onReadReceiptsClick = { onReadReceiptsClick(event) },
|
onReadReceiptsClick = { onReadReceiptsClick(event) },
|
||||||
modifier = Modifier.padding(top = 4.dp),
|
modifier = Modifier.padding(top = 4.dp),
|
||||||
)
|
)
|
||||||
@@ -146,8 +144,10 @@ private fun getIcon(
|
|||||||
@PreviewsDayNight
|
@PreviewsDayNight
|
||||||
@Composable
|
@Composable
|
||||||
internal fun TimelineItemCallNotifyViewPreview() = ElementPreview {
|
internal fun TimelineItemCallNotifyViewPreview() = ElementPreview {
|
||||||
val readReceiptState = aTimelineItemReadReceipts(
|
val readReceiptState = mutableListOf(
|
||||||
receipts = List(3) { aReadReceiptData(it) },
|
aTimelineItemReadReceipts(
|
||||||
|
receipts = List(3) { aReadReceiptData(it) },
|
||||||
|
)
|
||||||
)
|
)
|
||||||
Column(modifier = Modifier.padding(bottom = 16.dp)) {
|
Column(modifier = Modifier.padding(bottom = 16.dp)) {
|
||||||
listOf(false, true).forEach { isDm ->
|
listOf(false, true).forEach { isDm ->
|
||||||
@@ -162,13 +162,10 @@ internal fun TimelineItemCallNotifyViewPreview() = ElementPreview {
|
|||||||
timelineRoomInfo = aTimelineRoomInfo(isDm = isDm),
|
timelineRoomInfo = aTimelineRoomInfo(isDm = isDm),
|
||||||
event = aTimelineItemEvent(
|
event = aTimelineItemEvent(
|
||||||
content = content,
|
content = content,
|
||||||
readReceiptState = readReceiptState,
|
// Only display read receipts for the first item
|
||||||
|
readReceiptState = readReceiptState.removeFirstOrNull() ?: aTimelineItemReadReceipts(),
|
||||||
),
|
),
|
||||||
content = content,
|
content = content,
|
||||||
// Render read receipts for the first item only
|
|
||||||
renderReadReceipts = !isDm &&
|
|
||||||
callIntent == CallIntent.AUDIO &&
|
|
||||||
state == RtcNotificationState.Started,
|
|
||||||
isLastOutgoingMessage = false,
|
isLastOutgoingMessage = false,
|
||||||
onLongClick = {},
|
onLongClick = {},
|
||||||
onReadReceiptsClick = {},
|
onReadReceiptsClick = {},
|
||||||
|
|||||||
-2
@@ -142,7 +142,6 @@ fun TimelineItemEventRow(
|
|||||||
timelineMode: Timeline.Mode,
|
timelineMode: Timeline.Mode,
|
||||||
timelineRoomInfo: TimelineRoomInfo,
|
timelineRoomInfo: TimelineRoomInfo,
|
||||||
timelineProtectionState: TimelineProtectionState,
|
timelineProtectionState: TimelineProtectionState,
|
||||||
renderReadReceipts: Boolean,
|
|
||||||
isLastOutgoingMessage: Boolean,
|
isLastOutgoingMessage: Boolean,
|
||||||
displayThreadSummaries: Boolean,
|
displayThreadSummaries: Boolean,
|
||||||
onEventClick: () -> Unit,
|
onEventClick: () -> Unit,
|
||||||
@@ -296,7 +295,6 @@ fun TimelineItemEventRow(
|
|||||||
isLastOutgoingMessage = isLastOutgoingMessage,
|
isLastOutgoingMessage = isLastOutgoingMessage,
|
||||||
receipts = event.readReceiptState.receipts,
|
receipts = event.readReceiptState.receipts,
|
||||||
),
|
),
|
||||||
renderReadReceipts = renderReadReceipts,
|
|
||||||
onReadReceiptsClick = { onReadReceiptClick(event) },
|
onReadReceiptsClick = { onReadReceiptClick(event) },
|
||||||
modifier = Modifier.padding(top = 4.dp)
|
modifier = Modifier.padding(top = 4.dp)
|
||||||
)
|
)
|
||||||
|
|||||||
-3
@@ -37,7 +37,6 @@ internal fun TimelineItemEventRowWithRRPreview(
|
|||||||
timelineItemReactions = aTimelineItemReactions(count = 0),
|
timelineItemReactions = aTimelineItemReactions(count = 0),
|
||||||
readReceiptState = TimelineItemReadReceipts(state.receipts),
|
readReceiptState = TimelineItemReadReceipts(state.receipts),
|
||||||
),
|
),
|
||||||
renderReadReceipts = true,
|
|
||||||
isLastOutgoingMessage = false,
|
isLastOutgoingMessage = false,
|
||||||
)
|
)
|
||||||
// A message from current user
|
// A message from current user
|
||||||
@@ -49,7 +48,6 @@ internal fun TimelineItemEventRowWithRRPreview(
|
|||||||
timelineItemReactions = aTimelineItemReactions(count = 0),
|
timelineItemReactions = aTimelineItemReactions(count = 0),
|
||||||
readReceiptState = TimelineItemReadReceipts(state.receipts),
|
readReceiptState = TimelineItemReadReceipts(state.receipts),
|
||||||
),
|
),
|
||||||
renderReadReceipts = true,
|
|
||||||
isLastOutgoingMessage = false,
|
isLastOutgoingMessage = false,
|
||||||
)
|
)
|
||||||
// Another message from current user
|
// Another message from current user
|
||||||
@@ -61,7 +59,6 @@ internal fun TimelineItemEventRowWithRRPreview(
|
|||||||
timelineItemReactions = aTimelineItemReactions(count = 0),
|
timelineItemReactions = aTimelineItemReactions(count = 0),
|
||||||
readReceiptState = TimelineItemReadReceipts(state.receipts),
|
readReceiptState = TimelineItemReadReceipts(state.receipts),
|
||||||
),
|
),
|
||||||
renderReadReceipts = true,
|
|
||||||
isLastOutgoingMessage = true,
|
isLastOutgoingMessage = true,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-8
@@ -43,7 +43,6 @@ fun TimelineItemGroupedEventsRow(
|
|||||||
timelineMode: Timeline.Mode,
|
timelineMode: Timeline.Mode,
|
||||||
timelineRoomInfo: TimelineRoomInfo,
|
timelineRoomInfo: TimelineRoomInfo,
|
||||||
timelineProtectionState: TimelineProtectionState,
|
timelineProtectionState: TimelineProtectionState,
|
||||||
renderReadReceipts: Boolean,
|
|
||||||
isLastOutgoingMessage: Boolean,
|
isLastOutgoingMessage: Boolean,
|
||||||
focusedEventId: EventId?,
|
focusedEventId: EventId?,
|
||||||
displayThreadSummaries: Boolean,
|
displayThreadSummaries: Boolean,
|
||||||
@@ -89,7 +88,6 @@ fun TimelineItemGroupedEventsRow(
|
|||||||
timelineRoomInfo = timelineRoomInfo,
|
timelineRoomInfo = timelineRoomInfo,
|
||||||
timelineProtectionState = timelineProtectionState,
|
timelineProtectionState = timelineProtectionState,
|
||||||
focusedEventId = focusedEventId,
|
focusedEventId = focusedEventId,
|
||||||
renderReadReceipts = renderReadReceipts,
|
|
||||||
isLastOutgoingMessage = isLastOutgoingMessage,
|
isLastOutgoingMessage = isLastOutgoingMessage,
|
||||||
displayThreadSummaries = displayThreadSummaries,
|
displayThreadSummaries = displayThreadSummaries,
|
||||||
onClick = onClick,
|
onClick = onClick,
|
||||||
@@ -117,7 +115,6 @@ private fun TimelineItemGroupedEventsRowContent(
|
|||||||
timelineRoomInfo: TimelineRoomInfo,
|
timelineRoomInfo: TimelineRoomInfo,
|
||||||
timelineProtectionState: TimelineProtectionState,
|
timelineProtectionState: TimelineProtectionState,
|
||||||
focusedEventId: EventId?,
|
focusedEventId: EventId?,
|
||||||
renderReadReceipts: Boolean,
|
|
||||||
isLastOutgoingMessage: Boolean,
|
isLastOutgoingMessage: Boolean,
|
||||||
displayThreadSummaries: Boolean,
|
displayThreadSummaries: Boolean,
|
||||||
onClick: (TimelineItem.Event) -> Unit,
|
onClick: (TimelineItem.Event) -> Unit,
|
||||||
@@ -173,7 +170,6 @@ private fun TimelineItemGroupedEventsRowContent(
|
|||||||
timelineItem = subGroupEvent,
|
timelineItem = subGroupEvent,
|
||||||
timelineRoomInfo = timelineRoomInfo,
|
timelineRoomInfo = timelineRoomInfo,
|
||||||
timelineProtectionState = timelineProtectionState,
|
timelineProtectionState = timelineProtectionState,
|
||||||
renderReadReceipts = renderReadReceipts,
|
|
||||||
isLastOutgoingMessage = isLastOutgoingMessage,
|
isLastOutgoingMessage = isLastOutgoingMessage,
|
||||||
focusedEventId = focusedEventId,
|
focusedEventId = focusedEventId,
|
||||||
displayThreadSummaries = displayThreadSummaries,
|
displayThreadSummaries = displayThreadSummaries,
|
||||||
@@ -193,14 +189,13 @@ private fun TimelineItemGroupedEventsRowContent(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (renderReadReceipts) {
|
} else if (timelineItem.aggregatedReadReceipts.isNotEmpty()) {
|
||||||
TimelineItemReadReceiptView(
|
TimelineItemReadReceiptView(
|
||||||
state = ReadReceiptViewState(
|
state = ReadReceiptViewState(
|
||||||
sendState = null,
|
sendState = null,
|
||||||
isLastOutgoingMessage = false,
|
isLastOutgoingMessage = false,
|
||||||
receipts = timelineItem.aggregatedReadReceipts,
|
receipts = timelineItem.aggregatedReadReceipts,
|
||||||
),
|
),
|
||||||
renderReadReceipts = true,
|
|
||||||
onReadReceiptsClick = onExpandGroupClick
|
onReadReceiptsClick = onExpandGroupClick
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -219,7 +214,6 @@ internal fun TimelineItemGroupedEventsRowContentExpandedPreview() = ElementPrevi
|
|||||||
timelineRoomInfo = aTimelineRoomInfo(),
|
timelineRoomInfo = aTimelineRoomInfo(),
|
||||||
timelineProtectionState = aTimelineProtectionState(),
|
timelineProtectionState = aTimelineProtectionState(),
|
||||||
focusedEventId = events.events.first().eventId,
|
focusedEventId = events.events.first().eventId,
|
||||||
renderReadReceipts = true,
|
|
||||||
isLastOutgoingMessage = false,
|
isLastOutgoingMessage = false,
|
||||||
displayThreadSummaries = false,
|
displayThreadSummaries = false,
|
||||||
onClick = {},
|
onClick = {},
|
||||||
@@ -247,7 +241,6 @@ internal fun TimelineItemGroupedEventsRowContentCollapsePreview() = ElementPrevi
|
|||||||
timelineRoomInfo = aTimelineRoomInfo(),
|
timelineRoomInfo = aTimelineRoomInfo(),
|
||||||
timelineProtectionState = aTimelineProtectionState(),
|
timelineProtectionState = aTimelineProtectionState(),
|
||||||
focusedEventId = null,
|
focusedEventId = null,
|
||||||
renderReadReceipts = true,
|
|
||||||
isLastOutgoingMessage = false,
|
isLastOutgoingMessage = false,
|
||||||
displayThreadSummaries = false,
|
displayThreadSummaries = false,
|
||||||
onClick = {},
|
onClick = {},
|
||||||
|
|||||||
-5
@@ -56,7 +56,6 @@ internal fun TimelineItemRow(
|
|||||||
timelineItem: TimelineItem,
|
timelineItem: TimelineItem,
|
||||||
timelineMode: Timeline.Mode,
|
timelineMode: Timeline.Mode,
|
||||||
timelineRoomInfo: TimelineRoomInfo,
|
timelineRoomInfo: TimelineRoomInfo,
|
||||||
renderReadReceipts: Boolean,
|
|
||||||
isLastOutgoingMessage: Boolean,
|
isLastOutgoingMessage: Boolean,
|
||||||
timelineProtectionState: TimelineProtectionState,
|
timelineProtectionState: TimelineProtectionState,
|
||||||
focusedEventId: EventId?,
|
focusedEventId: EventId?,
|
||||||
@@ -114,7 +113,6 @@ internal fun TimelineItemRow(
|
|||||||
is TimelineItemStateContent, is TimelineItemLegacyCallInviteContent -> {
|
is TimelineItemStateContent, is TimelineItemLegacyCallInviteContent -> {
|
||||||
TimelineItemStateEventRow(
|
TimelineItemStateEventRow(
|
||||||
event = timelineItem,
|
event = timelineItem,
|
||||||
renderReadReceipts = renderReadReceipts,
|
|
||||||
isLastOutgoingMessage = isLastOutgoingMessage,
|
isLastOutgoingMessage = isLastOutgoingMessage,
|
||||||
onClick = { onContentClick(timelineItem) },
|
onClick = { onContentClick(timelineItem) },
|
||||||
onReadReceiptsClick = onReadReceiptClick,
|
onReadReceiptsClick = onReadReceiptClick,
|
||||||
@@ -127,7 +125,6 @@ internal fun TimelineItemRow(
|
|||||||
timelineRoomInfo = timelineRoomInfo,
|
timelineRoomInfo = timelineRoomInfo,
|
||||||
event = timelineItem,
|
event = timelineItem,
|
||||||
content = timelineItem.content,
|
content = timelineItem.content,
|
||||||
renderReadReceipts = renderReadReceipts,
|
|
||||||
isLastOutgoingMessage = isLastOutgoingMessage,
|
isLastOutgoingMessage = isLastOutgoingMessage,
|
||||||
onLongClick = onLongClick,
|
onLongClick = onLongClick,
|
||||||
onReadReceiptsClick = onReadReceiptClick,
|
onReadReceiptsClick = onReadReceiptClick,
|
||||||
@@ -167,7 +164,6 @@ internal fun TimelineItemRow(
|
|||||||
event = timelineItem,
|
event = timelineItem,
|
||||||
timelineMode = timelineMode,
|
timelineMode = timelineMode,
|
||||||
timelineRoomInfo = timelineRoomInfo,
|
timelineRoomInfo = timelineRoomInfo,
|
||||||
renderReadReceipts = renderReadReceipts,
|
|
||||||
timelineProtectionState = timelineProtectionState,
|
timelineProtectionState = timelineProtectionState,
|
||||||
isLastOutgoingMessage = isLastOutgoingMessage,
|
isLastOutgoingMessage = isLastOutgoingMessage,
|
||||||
displayThreadSummaries = displayThreadSummaries,
|
displayThreadSummaries = displayThreadSummaries,
|
||||||
@@ -196,7 +192,6 @@ internal fun TimelineItemRow(
|
|||||||
timelineMode = timelineMode,
|
timelineMode = timelineMode,
|
||||||
timelineRoomInfo = timelineRoomInfo,
|
timelineRoomInfo = timelineRoomInfo,
|
||||||
timelineProtectionState = timelineProtectionState,
|
timelineProtectionState = timelineProtectionState,
|
||||||
renderReadReceipts = renderReadReceipts,
|
|
||||||
isLastOutgoingMessage = isLastOutgoingMessage,
|
isLastOutgoingMessage = isLastOutgoingMessage,
|
||||||
focusedEventId = focusedEventId,
|
focusedEventId = focusedEventId,
|
||||||
displayThreadSummaries = displayThreadSummaries,
|
displayThreadSummaries = displayThreadSummaries,
|
||||||
|
|||||||
-3
@@ -39,7 +39,6 @@ import kotlinx.collections.immutable.persistentListOf
|
|||||||
@Composable
|
@Composable
|
||||||
fun TimelineItemStateEventRow(
|
fun TimelineItemStateEventRow(
|
||||||
event: TimelineItem.Event,
|
event: TimelineItem.Event,
|
||||||
renderReadReceipts: Boolean,
|
|
||||||
isLastOutgoingMessage: Boolean,
|
isLastOutgoingMessage: Boolean,
|
||||||
onClick: () -> Unit,
|
onClick: () -> Unit,
|
||||||
onLongClick: () -> Unit,
|
onLongClick: () -> Unit,
|
||||||
@@ -86,7 +85,6 @@ fun TimelineItemStateEventRow(
|
|||||||
isLastOutgoingMessage = isLastOutgoingMessage,
|
isLastOutgoingMessage = isLastOutgoingMessage,
|
||||||
receipts = event.readReceiptState.receipts,
|
receipts = event.readReceiptState.receipts,
|
||||||
),
|
),
|
||||||
renderReadReceipts = renderReadReceipts,
|
|
||||||
onReadReceiptsClick = { onReadReceiptsClick(event) },
|
onReadReceiptsClick = { onReadReceiptsClick(event) },
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -104,7 +102,6 @@ internal fun TimelineItemStateEventRowPreview() = ElementPreview {
|
|||||||
receipts = persistentListOf(aReadReceiptData(0)),
|
receipts = persistentListOf(aReadReceiptData(0)),
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
renderReadReceipts = true,
|
|
||||||
isLastOutgoingMessage = false,
|
isLastOutgoingMessage = false,
|
||||||
onClick = {},
|
onClick = {},
|
||||||
onLongClick = {},
|
onLongClick = {},
|
||||||
|
|||||||
+13
-17
@@ -53,27 +53,24 @@ import kotlinx.collections.immutable.ImmutableList
|
|||||||
@Composable
|
@Composable
|
||||||
fun TimelineItemReadReceiptView(
|
fun TimelineItemReadReceiptView(
|
||||||
state: ReadReceiptViewState,
|
state: ReadReceiptViewState,
|
||||||
renderReadReceipts: Boolean,
|
|
||||||
onReadReceiptsClick: () -> Unit,
|
onReadReceiptsClick: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
) {
|
) {
|
||||||
if (state.receipts.isNotEmpty()) {
|
if (state.receipts.isNotEmpty()) {
|
||||||
if (renderReadReceipts) {
|
ReadReceiptsRow(
|
||||||
ReadReceiptsRow(
|
modifier = modifier.clearAndSetSemantics {
|
||||||
modifier = modifier.clearAndSetSemantics {
|
hideFromAccessibility()
|
||||||
hideFromAccessibility()
|
|
||||||
}
|
|
||||||
) {
|
|
||||||
ReadReceiptsAvatars(
|
|
||||||
receipts = state.receipts,
|
|
||||||
modifier = Modifier
|
|
||||||
.clip(RoundedCornerShape(4.dp))
|
|
||||||
.clickable {
|
|
||||||
onReadReceiptsClick()
|
|
||||||
}
|
|
||||||
.padding(2.dp)
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
) {
|
||||||
|
ReadReceiptsAvatars(
|
||||||
|
receipts = state.receipts,
|
||||||
|
modifier = Modifier
|
||||||
|
.clip(RoundedCornerShape(4.dp))
|
||||||
|
.clickable {
|
||||||
|
onReadReceiptsClick()
|
||||||
|
}
|
||||||
|
.padding(2.dp)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
when (state.sendState) {
|
when (state.sendState) {
|
||||||
@@ -209,7 +206,6 @@ internal fun TimelineItemReadReceiptViewPreview(
|
|||||||
) = ElementPreview {
|
) = ElementPreview {
|
||||||
TimelineItemReadReceiptView(
|
TimelineItemReadReceiptView(
|
||||||
state = state,
|
state = state,
|
||||||
renderReadReceipts = true,
|
|
||||||
onReadReceiptsClick = {},
|
onReadReceiptsClick = {},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
+8
-4
@@ -64,22 +64,24 @@ class TimelineItemsFactory(
|
|||||||
suspend fun replaceWith(
|
suspend fun replaceWith(
|
||||||
timelineItems: List<MatrixTimelineItem>,
|
timelineItems: List<MatrixTimelineItem>,
|
||||||
roomMembers: List<RoomMember>,
|
roomMembers: List<RoomMember>,
|
||||||
|
renderReadReceipts: Boolean,
|
||||||
) = withContext(dispatchers.computation) {
|
) = withContext(dispatchers.computation) {
|
||||||
lock.withLock {
|
lock.withLock {
|
||||||
diffCacheUpdater.updateWith(timelineItems)
|
diffCacheUpdater.updateWith(timelineItems)
|
||||||
buildAndEmitTimelineItemStates(timelineItems, roomMembers)
|
buildAndEmitTimelineItemStates(timelineItems, roomMembers, renderReadReceipts)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun buildAndEmitTimelineItemStates(
|
private suspend fun buildAndEmitTimelineItemStates(
|
||||||
timelineItems: List<MatrixTimelineItem>,
|
timelineItems: List<MatrixTimelineItem>,
|
||||||
roomMembers: List<RoomMember>,
|
roomMembers: List<RoomMember>,
|
||||||
|
renderReadReceipts: Boolean,
|
||||||
) {
|
) {
|
||||||
val newTimelineItemStates = ArrayList<TimelineItem>()
|
val newTimelineItemStates = ArrayList<TimelineItem>()
|
||||||
for (index in diffCache.indices().reversed()) {
|
for (index in diffCache.indices().reversed()) {
|
||||||
val cacheItem = diffCache.get(index)
|
val cacheItem = diffCache.get(index)
|
||||||
if (cacheItem == null) {
|
if (cacheItem == null) {
|
||||||
buildAndCacheItem(timelineItems, index, roomMembers)?.also { timelineItemState ->
|
buildAndCacheItem(timelineItems, index, roomMembers, renderReadReceipts)?.also { timelineItemState ->
|
||||||
newTimelineItemStates.add(timelineItemState)
|
newTimelineItemStates.add(timelineItemState)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -87,7 +89,8 @@ class TimelineItemsFactory(
|
|||||||
eventItemFactory.update(
|
eventItemFactory.update(
|
||||||
timelineItem = cacheItem,
|
timelineItem = cacheItem,
|
||||||
receivedMatrixTimelineItem = timelineItems[index] as MatrixTimelineItem.Event,
|
receivedMatrixTimelineItem = timelineItems[index] as MatrixTimelineItem.Event,
|
||||||
roomMembers = roomMembers
|
roomMembers = roomMembers,
|
||||||
|
renderReadReceipts = renderReadReceipts,
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
cacheItem
|
cacheItem
|
||||||
@@ -103,10 +106,11 @@ class TimelineItemsFactory(
|
|||||||
timelineItems: List<MatrixTimelineItem>,
|
timelineItems: List<MatrixTimelineItem>,
|
||||||
index: Int,
|
index: Int,
|
||||||
roomMembers: List<RoomMember>,
|
roomMembers: List<RoomMember>,
|
||||||
|
renderReadReceipts: Boolean,
|
||||||
): TimelineItem? {
|
): TimelineItem? {
|
||||||
val timelineItem =
|
val timelineItem =
|
||||||
when (val currentTimelineItem = timelineItems[index]) {
|
when (val currentTimelineItem = timelineItems[index]) {
|
||||||
is MatrixTimelineItem.Event -> eventItemFactory.create(currentTimelineItem, index, timelineItems, roomMembers)
|
is MatrixTimelineItem.Event -> eventItemFactory.create(currentTimelineItem, index, timelineItems, roomMembers, renderReadReceipts)
|
||||||
is MatrixTimelineItem.Virtual -> virtualItemFactory.create(currentTimelineItem)
|
is MatrixTimelineItem.Virtual -> virtualItemFactory.create(currentTimelineItem)
|
||||||
MatrixTimelineItem.Other -> null
|
MatrixTimelineItem.Other -> null
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-3
@@ -57,6 +57,7 @@ class TimelineItemEventFactory(
|
|||||||
index: Int,
|
index: Int,
|
||||||
timelineItems: List<MatrixTimelineItem>,
|
timelineItems: List<MatrixTimelineItem>,
|
||||||
roomMembers: List<RoomMember>,
|
roomMembers: List<RoomMember>,
|
||||||
|
renderReadReceipts: Boolean,
|
||||||
): TimelineItem.Event {
|
): TimelineItem.Event {
|
||||||
val currentSender = currentTimelineItem.event.sender
|
val currentSender = currentTimelineItem.event.sender
|
||||||
val groupPosition =
|
val groupPosition =
|
||||||
@@ -116,7 +117,7 @@ class TimelineItemEventFactory(
|
|||||||
sentDate = sentDate,
|
sentDate = sentDate,
|
||||||
groupPosition = groupPosition,
|
groupPosition = groupPosition,
|
||||||
reactionsState = currentTimelineItem.computeReactionsState(),
|
reactionsState = currentTimelineItem.computeReactionsState(),
|
||||||
readReceiptState = currentTimelineItem.computeReadReceiptState(roomMembers),
|
readReceiptState = currentTimelineItem.computeReadReceiptState(roomMembers, renderReadReceipts),
|
||||||
localSendState = currentTimelineItem.event.localSendState,
|
localSendState = currentTimelineItem.event.localSendState,
|
||||||
inReplyTo = currentTimelineItem.event.inReplyTo()?.map(permalinkParser = permalinkParser),
|
inReplyTo = currentTimelineItem.event.inReplyTo()?.map(permalinkParser = permalinkParser),
|
||||||
threadInfo = mappedThreadInfo,
|
threadInfo = mappedThreadInfo,
|
||||||
@@ -133,9 +134,10 @@ class TimelineItemEventFactory(
|
|||||||
timelineItem: TimelineItem.Event,
|
timelineItem: TimelineItem.Event,
|
||||||
receivedMatrixTimelineItem: MatrixTimelineItem.Event,
|
receivedMatrixTimelineItem: MatrixTimelineItem.Event,
|
||||||
roomMembers: List<RoomMember>,
|
roomMembers: List<RoomMember>,
|
||||||
|
renderReadReceipts: Boolean,
|
||||||
): TimelineItem.Event {
|
): TimelineItem.Event {
|
||||||
return timelineItem.copy(
|
return timelineItem.copy(
|
||||||
readReceiptState = receivedMatrixTimelineItem.computeReadReceiptState(roomMembers)
|
readReceiptState = receivedMatrixTimelineItem.computeReadReceiptState(roomMembers, renderReadReceipts)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -180,8 +182,9 @@ class TimelineItemEventFactory(
|
|||||||
|
|
||||||
private fun MatrixTimelineItem.Event.computeReadReceiptState(
|
private fun MatrixTimelineItem.Event.computeReadReceiptState(
|
||||||
roomMembers: List<RoomMember>,
|
roomMembers: List<RoomMember>,
|
||||||
|
renderReadReceipts: Boolean,
|
||||||
): TimelineItemReadReceipts {
|
): TimelineItemReadReceipts {
|
||||||
if (!config.computeReadReceipts) {
|
if (!config.computeReadReceipts || !renderReadReceipts) {
|
||||||
return TimelineItemReadReceipts(receipts = persistentListOf())
|
return TimelineItemReadReceipts(receipts = persistentListOf())
|
||||||
}
|
}
|
||||||
return TimelineItemReadReceipts(
|
return TimelineItemReadReceipts(
|
||||||
|
|||||||
-1
@@ -238,7 +238,6 @@ class MessagesViewTest {
|
|||||||
val eventsRecorder = EventsRecorder<ReadReceiptBottomSheetEvent>()
|
val eventsRecorder = EventsRecorder<ReadReceiptBottomSheetEvent>()
|
||||||
val state = aMessagesState(
|
val state = aMessagesState(
|
||||||
timelineState = aTimelineState(
|
timelineState = aTimelineState(
|
||||||
renderReadReceipts = true,
|
|
||||||
timelineItems = persistentListOf(
|
timelineItems = persistentListOf(
|
||||||
aTimelineItemEvent(
|
aTimelineItemEvent(
|
||||||
readReceiptState = aTimelineItemReadReceipts(
|
readReceiptState = aTimelineItemReadReceipts(
|
||||||
|
|||||||
Reference in New Issue
Block a user