mirror of
https://github.com/Novaloop-AG/element-x-android.git
synced 2026-11-03 16:10:00 +00:00
Merge pull request #7443 from hayaksi1/fix/4519-hide-verification-fallback
Do not render in-chat key verification requests in the timeline
This commit is contained in:
+13
-1
@@ -21,6 +21,9 @@ import io.element.android.libraries.androidutils.diff.MutableListDiffCache
|
|||||||
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
|
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
|
||||||
import io.element.android.libraries.matrix.api.room.RoomMember
|
import io.element.android.libraries.matrix.api.room.RoomMember
|
||||||
import io.element.android.libraries.matrix.api.timeline.MatrixTimelineItem
|
import io.element.android.libraries.matrix.api.timeline.MatrixTimelineItem
|
||||||
|
import io.element.android.libraries.matrix.api.timeline.item.event.EventTimelineItem
|
||||||
|
import io.element.android.libraries.matrix.api.timeline.item.event.MessageContent
|
||||||
|
import io.element.android.libraries.matrix.api.timeline.item.event.OtherMessageType
|
||||||
import kotlinx.collections.immutable.ImmutableList
|
import kotlinx.collections.immutable.ImmutableList
|
||||||
import kotlinx.collections.immutable.toImmutableList
|
import kotlinx.collections.immutable.toImmutableList
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
@@ -110,7 +113,11 @@ class TimelineItemsFactory(
|
|||||||
): 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, renderReadReceipts)
|
is MatrixTimelineItem.Event -> if (currentTimelineItem.event.isKeyVerificationRequest()) {
|
||||||
|
null
|
||||||
|
} else {
|
||||||
|
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
|
||||||
}
|
}
|
||||||
@@ -118,3 +125,8 @@ class TimelineItemsFactory(
|
|||||||
return timelineItem
|
return timelineItem
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun EventTimelineItem.isKeyVerificationRequest(): Boolean {
|
||||||
|
val messageType = (content as? MessageContent)?.type
|
||||||
|
return messageType is OtherMessageType && messageType.isKeyVerificationRequest
|
||||||
|
}
|
||||||
|
|||||||
+46
@@ -12,8 +12,10 @@ import com.google.common.truth.Truth.assertThat
|
|||||||
import io.element.android.features.messages.impl.fixtures.aTimelineItemsFactory
|
import io.element.android.features.messages.impl.fixtures.aTimelineItemsFactory
|
||||||
import io.element.android.features.messages.impl.timeline.model.TimelineItem
|
import io.element.android.features.messages.impl.timeline.model.TimelineItem
|
||||||
import io.element.android.features.messages.impl.timeline.model.TimelineItemGroupPosition
|
import io.element.android.features.messages.impl.timeline.model.TimelineItemGroupPosition
|
||||||
|
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemTextContent
|
||||||
import io.element.android.libraries.matrix.api.core.UniqueId
|
import io.element.android.libraries.matrix.api.core.UniqueId
|
||||||
import io.element.android.libraries.matrix.api.timeline.MatrixTimelineItem
|
import io.element.android.libraries.matrix.api.timeline.MatrixTimelineItem
|
||||||
|
import io.element.android.libraries.matrix.api.timeline.item.event.OtherMessageType
|
||||||
import io.element.android.libraries.matrix.test.A_USER_ID
|
import io.element.android.libraries.matrix.test.A_USER_ID
|
||||||
import io.element.android.libraries.matrix.test.timeline.aMessageContent
|
import io.element.android.libraries.matrix.test.timeline.aMessageContent
|
||||||
import io.element.android.libraries.matrix.test.timeline.anEventTimelineItem
|
import io.element.android.libraries.matrix.test.timeline.anEventTimelineItem
|
||||||
@@ -82,6 +84,50 @@ class TimelineItemsFactoryTest {
|
|||||||
).inOrder()
|
).inOrder()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `a key verification request is not rendered`() = runTest {
|
||||||
|
val factory = aTimelineItemsFactory(
|
||||||
|
config = TimelineItemsFactoryConfig(
|
||||||
|
computeReadReceipts = false,
|
||||||
|
computeReactions = false,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
val items = listOf(
|
||||||
|
MatrixTimelineItem.Event(
|
||||||
|
uniqueId = UniqueId("event-0"),
|
||||||
|
event = anEventTimelineItem(
|
||||||
|
sender = A_USER_ID,
|
||||||
|
content = aMessageContent(
|
||||||
|
body = "Alice is requesting to verify your key, but your client does not support in-chat key verification.",
|
||||||
|
messageType = OtherMessageType(
|
||||||
|
msgType = "m.key.verification.request",
|
||||||
|
body = "Alice is requesting to verify your key, but your client does not support in-chat key verification.",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
MatrixTimelineItem.Event(
|
||||||
|
uniqueId = UniqueId("event-1"),
|
||||||
|
event = anEventTimelineItem(
|
||||||
|
sender = A_USER_ID,
|
||||||
|
content = aMessageContent(body = "A regular message"),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
factory.timelineItems.test {
|
||||||
|
factory.replaceWith(
|
||||||
|
timelineItems = items,
|
||||||
|
roomMembers = emptyList(),
|
||||||
|
renderReadReceipts = false,
|
||||||
|
)
|
||||||
|
val bodies = awaitItem()
|
||||||
|
.filterIsInstance<TimelineItem.Event>()
|
||||||
|
.map { (it.content as TimelineItemTextContent).body }
|
||||||
|
assertThat(bodies).containsExactly("A regular message")
|
||||||
|
cancelAndIgnoreRemainingEvents()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private suspend fun TestScope.groupPositionsOf(timestamps: List<Long>): List<TimelineItemGroupPosition> {
|
private suspend fun TestScope.groupPositionsOf(timestamps: List<Long>): List<TimelineItemGroupPosition> {
|
||||||
val factory = aTimelineItemsFactory(
|
val factory = aTimelineItemsFactory(
|
||||||
config = TimelineItemsFactoryConfig(
|
config = TimelineItemsFactoryConfig(
|
||||||
|
|||||||
+8
-1
@@ -128,4 +128,11 @@ sealed interface GalleryItemType {
|
|||||||
data class OtherMessageType(
|
data class OtherMessageType(
|
||||||
val msgType: String,
|
val msgType: String,
|
||||||
val body: String,
|
val body: String,
|
||||||
) : MessageType
|
) : MessageType {
|
||||||
|
/**
|
||||||
|
* A `m.key.verification.request` carries a body meant for clients that cannot handle in-chat
|
||||||
|
* verification, so it must not be rendered as a message.
|
||||||
|
*/
|
||||||
|
val isKeyVerificationRequest: Boolean
|
||||||
|
get() = msgType == "m.key.verification.request"
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user