Update SDK bindings version to 0.2.62 and fix SendHandle usages (#3876)
This commit is contained in:
parent
1b33e1ac31
commit
56fe177c31
26 changed files with 135 additions and 59 deletions
|
|
@ -51,10 +51,12 @@ class ResolveVerifiedUserSendFailurePresenter @Inject constructor(
|
||||||
is ResolveVerifiedUserSendFailureEvents.ComputeForMessage -> {
|
is ResolveVerifiedUserSendFailureEvents.ComputeForMessage -> {
|
||||||
val sendState = event.messageEvent.localSendState as? LocalEventSendState.Failed.VerifiedUser
|
val sendState = event.messageEvent.localSendState as? LocalEventSendState.Failed.VerifiedUser
|
||||||
val transactionId = event.messageEvent.transactionId
|
val transactionId = event.messageEvent.transactionId
|
||||||
resolver = if (sendState != null && transactionId != null) {
|
val sendHandle = event.messageEvent.sendhandle
|
||||||
|
resolver = if (sendState != null && transactionId != null && sendHandle != null) {
|
||||||
VerifiedUserSendFailureResolver(
|
VerifiedUserSendFailureResolver(
|
||||||
room = room,
|
room = room,
|
||||||
transactionId = transactionId,
|
transactionId = transactionId,
|
||||||
|
sendHandle = sendHandle,
|
||||||
iterator = VerifiedUserSendFailureIterator.from(sendState)
|
iterator = VerifiedUserSendFailureIterator.from(sendState)
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@
|
||||||
package io.element.android.features.messages.impl.crypto.sendfailure.resolve
|
package io.element.android.features.messages.impl.crypto.sendfailure.resolve
|
||||||
|
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
|
import io.element.android.libraries.matrix.api.core.SendHandle
|
||||||
import io.element.android.libraries.matrix.api.core.TransactionId
|
import io.element.android.libraries.matrix.api.core.TransactionId
|
||||||
import io.element.android.libraries.matrix.api.room.MatrixRoom
|
import io.element.android.libraries.matrix.api.room.MatrixRoom
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.LocalEventSendState
|
import io.element.android.libraries.matrix.api.timeline.item.event.LocalEventSendState
|
||||||
|
|
@ -22,6 +23,7 @@ import timber.log.Timber
|
||||||
class VerifiedUserSendFailureResolver(
|
class VerifiedUserSendFailureResolver(
|
||||||
private val room: MatrixRoom,
|
private val room: MatrixRoom,
|
||||||
private val transactionId: TransactionId,
|
private val transactionId: TransactionId,
|
||||||
|
private val sendHandle: SendHandle,
|
||||||
private val iterator: VerifiedUserSendFailureIterator,
|
private val iterator: VerifiedUserSendFailureIterator,
|
||||||
) {
|
) {
|
||||||
val currentSendFailure = mutableStateOf<LocalEventSendState.Failed.VerifiedUser?>(null)
|
val currentSendFailure = mutableStateOf<LocalEventSendState.Failed.VerifiedUser?>(null)
|
||||||
|
|
@ -33,7 +35,7 @@ class VerifiedUserSendFailureResolver(
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun resend(): Result<Unit> {
|
suspend fun resend(): Result<Unit> {
|
||||||
return room.retrySendMessage(transactionId)
|
return sendHandle.retry()
|
||||||
.onSuccess {
|
.onSuccess {
|
||||||
Timber.d("Succeed to resend message with transactionId: $transactionId")
|
Timber.d("Succeed to resend message with transactionId: $transactionId")
|
||||||
currentSendFailure.value = null
|
currentSendFailure.value = null
|
||||||
|
|
@ -46,10 +48,10 @@ class VerifiedUserSendFailureResolver(
|
||||||
suspend fun resolveAndResend(): Result<Unit> {
|
suspend fun resolveAndResend(): Result<Unit> {
|
||||||
return when (val failure = currentSendFailure.value) {
|
return when (val failure = currentSendFailure.value) {
|
||||||
is LocalEventSendState.Failed.VerifiedUserHasUnsignedDevice -> {
|
is LocalEventSendState.Failed.VerifiedUserHasUnsignedDevice -> {
|
||||||
room.ignoreDeviceTrustAndResend(failure.devices, transactionId)
|
room.ignoreDeviceTrustAndResend(failure.devices, sendHandle)
|
||||||
}
|
}
|
||||||
is LocalEventSendState.Failed.VerifiedUserChangedIdentity -> {
|
is LocalEventSendState.Failed.VerifiedUserChangedIdentity -> {
|
||||||
room.withdrawVerificationAndResend(failure.users, transactionId)
|
room.withdrawVerificationAndResend(failure.users, sendHandle)
|
||||||
}
|
}
|
||||||
else -> {
|
else -> {
|
||||||
Result.failure(IllegalStateException("Unknown send failure type"))
|
Result.failure(IllegalStateException("Unknown send failure type"))
|
||||||
|
|
|
||||||
|
|
@ -169,6 +169,7 @@ internal fun aTimelineItemEvent(
|
||||||
origin = null,
|
origin = null,
|
||||||
timelineItemDebugInfoProvider = { debugInfo },
|
timelineItemDebugInfoProvider = { debugInfo },
|
||||||
messageShieldProvider = { messageShield },
|
messageShieldProvider = { messageShield },
|
||||||
|
sendHandleProvider = { null }
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -88,6 +88,7 @@ class TimelineItemEventFactory @AssistedInject constructor(
|
||||||
origin = currentTimelineItem.event.origin,
|
origin = currentTimelineItem.event.origin,
|
||||||
timelineItemDebugInfoProvider = currentTimelineItem.event.timelineItemDebugInfoProvider,
|
timelineItemDebugInfoProvider = currentTimelineItem.event.timelineItemDebugInfoProvider,
|
||||||
messageShieldProvider = currentTimelineItem.event.messageShieldProvider,
|
messageShieldProvider = currentTimelineItem.event.messageShieldProvider,
|
||||||
|
sendHandleProvider = currentTimelineItem.event.sendHandleProvider,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ import io.element.android.features.messages.impl.timeline.model.event.TimelineIt
|
||||||
import io.element.android.features.messages.impl.timeline.model.virtual.TimelineItemVirtualModel
|
import io.element.android.features.messages.impl.timeline.model.virtual.TimelineItemVirtualModel
|
||||||
import io.element.android.libraries.designsystem.components.avatar.AvatarData
|
import io.element.android.libraries.designsystem.components.avatar.AvatarData
|
||||||
import io.element.android.libraries.matrix.api.core.EventId
|
import io.element.android.libraries.matrix.api.core.EventId
|
||||||
|
import io.element.android.libraries.matrix.api.core.SendHandle
|
||||||
import io.element.android.libraries.matrix.api.core.TransactionId
|
import io.element.android.libraries.matrix.api.core.TransactionId
|
||||||
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.core.UserId
|
import io.element.android.libraries.matrix.api.core.UserId
|
||||||
|
|
@ -25,6 +26,7 @@ import io.element.android.libraries.matrix.api.timeline.item.event.LocalEventSen
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.MessageShield
|
import io.element.android.libraries.matrix.api.timeline.item.event.MessageShield
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.MessageShieldProvider
|
import io.element.android.libraries.matrix.api.timeline.item.event.MessageShieldProvider
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.ProfileTimelineDetails
|
import io.element.android.libraries.matrix.api.timeline.item.event.ProfileTimelineDetails
|
||||||
|
import io.element.android.libraries.matrix.api.timeline.item.event.SendHandleProvider
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.TimelineItemDebugInfoProvider
|
import io.element.android.libraries.matrix.api.timeline.item.event.TimelineItemDebugInfoProvider
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.TimelineItemEventOrigin
|
import io.element.android.libraries.matrix.api.timeline.item.event.TimelineItemEventOrigin
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.getDisambiguatedDisplayName
|
import io.element.android.libraries.matrix.api.timeline.item.event.getDisambiguatedDisplayName
|
||||||
|
|
@ -82,6 +84,7 @@ sealed interface TimelineItem {
|
||||||
val origin: TimelineItemEventOrigin?,
|
val origin: TimelineItemEventOrigin?,
|
||||||
val timelineItemDebugInfoProvider: TimelineItemDebugInfoProvider,
|
val timelineItemDebugInfoProvider: TimelineItemDebugInfoProvider,
|
||||||
val messageShieldProvider: MessageShieldProvider,
|
val messageShieldProvider: MessageShieldProvider,
|
||||||
|
val sendHandleProvider: SendHandleProvider,
|
||||||
) : TimelineItem {
|
) : TimelineItem {
|
||||||
val showSenderInformation = groupPosition.isNew() && !isMine
|
val showSenderInformation = groupPosition.isNew() && !isMine
|
||||||
|
|
||||||
|
|
@ -114,6 +117,8 @@ sealed interface TimelineItem {
|
||||||
|
|
||||||
val debugInfo: TimelineItemDebugInfo
|
val debugInfo: TimelineItemDebugInfo
|
||||||
get() = timelineItemDebugInfoProvider()
|
get() = timelineItemDebugInfoProvider()
|
||||||
|
|
||||||
|
val sendhandle: SendHandle? get() = sendHandleProvider()
|
||||||
}
|
}
|
||||||
|
|
||||||
@Immutable
|
@Immutable
|
||||||
|
|
|
||||||
|
|
@ -111,9 +111,6 @@ class ResolveVerifiedUserSendFailurePresenterTest {
|
||||||
userDisplayNameResult = { userId ->
|
userDisplayNameResult = { userId ->
|
||||||
Result.success(userId.value)
|
Result.success(userId.value)
|
||||||
},
|
},
|
||||||
retrySendMessageResult = {
|
|
||||||
Result.success(Unit)
|
|
||||||
},
|
|
||||||
)
|
)
|
||||||
val presenter = createResolveVerifiedUserSendFailurePresenter(room)
|
val presenter = createResolveVerifiedUserSendFailurePresenter(room)
|
||||||
presenter.test {
|
presenter.test {
|
||||||
|
|
@ -219,9 +216,6 @@ class ResolveVerifiedUserSendFailurePresenterTest {
|
||||||
userDisplayNameResult = { userId ->
|
userDisplayNameResult = { userId ->
|
||||||
Result.success(userId.value)
|
Result.success(userId.value)
|
||||||
},
|
},
|
||||||
retrySendMessageResult = {
|
|
||||||
Result.success(Unit)
|
|
||||||
},
|
|
||||||
)
|
)
|
||||||
val presenter = createResolveVerifiedUserSendFailurePresenter(room)
|
val presenter = createResolveVerifiedUserSendFailurePresenter(room)
|
||||||
presenter.test {
|
presenter.test {
|
||||||
|
|
|
||||||
|
|
@ -19,13 +19,15 @@ import io.element.android.libraries.designsystem.components.avatar.AvatarSize
|
||||||
import io.element.android.libraries.matrix.api.core.EventId
|
import io.element.android.libraries.matrix.api.core.EventId
|
||||||
import io.element.android.libraries.matrix.api.core.TransactionId
|
import io.element.android.libraries.matrix.api.core.TransactionId
|
||||||
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.item.TimelineItemDebugInfo
|
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.LocalEventSendState
|
import io.element.android.libraries.matrix.api.timeline.item.event.LocalEventSendState
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.MessageShield
|
import io.element.android.libraries.matrix.api.timeline.item.event.MessageShieldProvider
|
||||||
|
import io.element.android.libraries.matrix.api.timeline.item.event.SendHandleProvider
|
||||||
|
import io.element.android.libraries.matrix.api.timeline.item.event.TimelineItemDebugInfoProvider
|
||||||
import io.element.android.libraries.matrix.test.AN_EVENT_ID
|
import io.element.android.libraries.matrix.test.AN_EVENT_ID
|
||||||
import io.element.android.libraries.matrix.test.A_MESSAGE
|
import io.element.android.libraries.matrix.test.A_MESSAGE
|
||||||
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.A_USER_NAME
|
import io.element.android.libraries.matrix.test.A_USER_NAME
|
||||||
|
import io.element.android.libraries.matrix.test.core.FakeSendHandle
|
||||||
import io.element.android.libraries.matrix.ui.messages.reply.InReplyToDetails
|
import io.element.android.libraries.matrix.ui.messages.reply.InReplyToDetails
|
||||||
import io.element.android.libraries.matrix.ui.messages.reply.aProfileTimelineDetailsReady
|
import io.element.android.libraries.matrix.ui.messages.reply.aProfileTimelineDetailsReady
|
||||||
import kotlinx.collections.immutable.toImmutableList
|
import kotlinx.collections.immutable.toImmutableList
|
||||||
|
|
@ -39,9 +41,10 @@ internal fun aMessageEvent(
|
||||||
content: TimelineItemEventContent = TimelineItemTextContent(body = A_MESSAGE, htmlDocument = null, formattedBody = null, isEdited = false),
|
content: TimelineItemEventContent = TimelineItemTextContent(body = A_MESSAGE, htmlDocument = null, formattedBody = null, isEdited = false),
|
||||||
inReplyTo: InReplyToDetails? = null,
|
inReplyTo: InReplyToDetails? = null,
|
||||||
isThreaded: Boolean = false,
|
isThreaded: Boolean = false,
|
||||||
debugInfo: TimelineItemDebugInfo = aTimelineItemDebugInfo(),
|
|
||||||
sendState: LocalEventSendState = LocalEventSendState.Sent(AN_EVENT_ID),
|
sendState: LocalEventSendState = LocalEventSendState.Sent(AN_EVENT_ID),
|
||||||
messageShield: MessageShield? = null,
|
debugInfoProvider: TimelineItemDebugInfoProvider = TimelineItemDebugInfoProvider { aTimelineItemDebugInfo() },
|
||||||
|
messageShieldProvider: MessageShieldProvider = MessageShieldProvider { null },
|
||||||
|
sendHandleProvider: SendHandleProvider = SendHandleProvider { FakeSendHandle() }
|
||||||
) = TimelineItem.Event(
|
) = TimelineItem.Event(
|
||||||
id = UniqueId(eventId?.value.orEmpty()),
|
id = UniqueId(eventId?.value.orEmpty()),
|
||||||
eventId = eventId,
|
eventId = eventId,
|
||||||
|
|
@ -60,6 +63,7 @@ internal fun aMessageEvent(
|
||||||
inReplyTo = inReplyTo,
|
inReplyTo = inReplyTo,
|
||||||
isThreaded = isThreaded,
|
isThreaded = isThreaded,
|
||||||
origin = null,
|
origin = null,
|
||||||
timelineItemDebugInfoProvider = { debugInfo },
|
timelineItemDebugInfoProvider = debugInfoProvider,
|
||||||
messageShieldProvider = { messageShield },
|
messageShieldProvider = messageShieldProvider,
|
||||||
|
sendHandleProvider = sendHandleProvider,
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ import io.element.android.libraries.matrix.api.core.UniqueId
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.LocalEventSendState
|
import io.element.android.libraries.matrix.api.timeline.item.event.LocalEventSendState
|
||||||
import io.element.android.libraries.matrix.test.AN_EVENT_ID
|
import io.element.android.libraries.matrix.test.AN_EVENT_ID
|
||||||
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.core.FakeSendHandle
|
||||||
import io.element.android.libraries.matrix.ui.messages.reply.aProfileTimelineDetailsReady
|
import io.element.android.libraries.matrix.ui.messages.reply.aProfileTimelineDetailsReady
|
||||||
import kotlinx.collections.immutable.toImmutableList
|
import kotlinx.collections.immutable.toImmutableList
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
|
|
@ -44,6 +45,7 @@ class TimelineItemGrouperTest {
|
||||||
origin = null,
|
origin = null,
|
||||||
timelineItemDebugInfoProvider = { aTimelineItemDebugInfo() },
|
timelineItemDebugInfoProvider = { aTimelineItemDebugInfo() },
|
||||||
messageShieldProvider = { null },
|
messageShieldProvider = { null },
|
||||||
|
sendHandleProvider = { FakeSendHandle() },
|
||||||
)
|
)
|
||||||
private val aNonGroupableItem = aMessageEvent()
|
private val aNonGroupableItem = aMessageEvent()
|
||||||
private val aNonGroupableItemNoEvent = TimelineItem.Virtual(UniqueId("virtual"), aTimelineItemDaySeparatorModel("Today"))
|
private val aNonGroupableItemNoEvent = TimelineItem.Virtual(UniqueId("virtual"), aTimelineItemDaySeparatorModel("Today"))
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@ import io.element.android.libraries.matrix.api.timeline.item.event.RedactedConte
|
||||||
import io.element.android.libraries.matrix.test.AN_EVENT_ID
|
import io.element.android.libraries.matrix.test.AN_EVENT_ID
|
||||||
import io.element.android.libraries.matrix.test.AN_EVENT_ID_2
|
import io.element.android.libraries.matrix.test.AN_EVENT_ID_2
|
||||||
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.core.FakeSendHandle
|
||||||
import io.element.android.libraries.mediaplayer.api.MediaPlayer
|
import io.element.android.libraries.mediaplayer.api.MediaPlayer
|
||||||
import io.element.android.libraries.mediaplayer.test.FakeMediaPlayer
|
import io.element.android.libraries.mediaplayer.test.FakeMediaPlayer
|
||||||
import io.element.android.tests.testutils.testCoroutineDispatchers
|
import io.element.android.tests.testutils.testCoroutineDispatchers
|
||||||
|
|
@ -96,6 +97,7 @@ fun aRedactedMatrixTimeline(eventId: EventId) = listOf<MatrixTimelineItem>(
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
messageShieldProvider = { null },
|
messageShieldProvider = { null },
|
||||||
|
sendHandleProvider = { FakeSendHandle() },
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -173,7 +173,7 @@ jsoup = "org.jsoup:jsoup:1.18.1"
|
||||||
appyx_core = { module = "com.bumble.appyx:core", version.ref = "appyx" }
|
appyx_core = { module = "com.bumble.appyx:core", version.ref = "appyx" }
|
||||||
molecule-runtime = "app.cash.molecule:molecule-runtime:2.0.0"
|
molecule-runtime = "app.cash.molecule:molecule-runtime:2.0.0"
|
||||||
timber = "com.jakewharton.timber:timber:5.0.1"
|
timber = "com.jakewharton.timber:timber:5.0.1"
|
||||||
matrix_sdk = "org.matrix.rustcomponents:sdk-android:0.2.61"
|
matrix_sdk = "org.matrix.rustcomponents:sdk-android:0.2.62"
|
||||||
matrix_richtexteditor = { module = "io.element.android:wysiwyg", version.ref = "wysiwyg" }
|
matrix_richtexteditor = { module = "io.element.android:wysiwyg", version.ref = "wysiwyg" }
|
||||||
matrix_richtexteditor_compose = { module = "io.element.android:wysiwyg-compose", version.ref = "wysiwyg" }
|
matrix_richtexteditor_compose = { module = "io.element.android:wysiwyg-compose", version.ref = "wysiwyg" }
|
||||||
sqldelight-driver-android = { module = "app.cash.sqldelight:android-driver", version.ref = "sqldelight" }
|
sqldelight-driver-android = { module = "app.cash.sqldelight:android-driver", version.ref = "sqldelight" }
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2024 New Vector Ltd.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
* Please see LICENSE in the repository root for full details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.element.android.libraries.matrix.api.core
|
||||||
|
|
||||||
|
fun interface SendHandle {
|
||||||
|
suspend fun retry(): Result<Unit>
|
||||||
|
}
|
||||||
|
|
@ -12,6 +12,7 @@ import io.element.android.libraries.matrix.api.core.EventId
|
||||||
import io.element.android.libraries.matrix.api.core.ProgressCallback
|
import io.element.android.libraries.matrix.api.core.ProgressCallback
|
||||||
import io.element.android.libraries.matrix.api.core.RoomAlias
|
import io.element.android.libraries.matrix.api.core.RoomAlias
|
||||||
import io.element.android.libraries.matrix.api.core.RoomId
|
import io.element.android.libraries.matrix.api.core.RoomId
|
||||||
|
import io.element.android.libraries.matrix.api.core.SendHandle
|
||||||
import io.element.android.libraries.matrix.api.core.SessionId
|
import io.element.android.libraries.matrix.api.core.SessionId
|
||||||
import io.element.android.libraries.matrix.api.core.TransactionId
|
import io.element.android.libraries.matrix.api.core.TransactionId
|
||||||
import io.element.android.libraries.matrix.api.core.UserId
|
import io.element.android.libraries.matrix.api.core.UserId
|
||||||
|
|
@ -154,8 +155,6 @@ interface MatrixRoom : Closeable {
|
||||||
|
|
||||||
suspend fun forwardEvent(eventId: EventId, roomIds: List<RoomId>): Result<Unit>
|
suspend fun forwardEvent(eventId: EventId, roomIds: List<RoomId>): Result<Unit>
|
||||||
|
|
||||||
suspend fun retrySendMessage(transactionId: TransactionId): Result<Unit>
|
|
||||||
|
|
||||||
suspend fun cancelSend(transactionId: TransactionId): Result<Unit>
|
suspend fun cancelSend(transactionId: TransactionId): Result<Unit>
|
||||||
|
|
||||||
suspend fun leave(): Result<Unit>
|
suspend fun leave(): Result<Unit>
|
||||||
|
|
@ -356,20 +355,20 @@ interface MatrixRoom : Closeable {
|
||||||
* Ignore the local trust for the given devices and resend messages that failed to send because said devices are unverified.
|
* Ignore the local trust for the given devices and resend messages that failed to send because said devices are unverified.
|
||||||
*
|
*
|
||||||
* @param devices The map of users identifiers to device identifiers received in the error
|
* @param devices The map of users identifiers to device identifiers received in the error
|
||||||
* @param transactionId The send queue transaction identifier of the local echo the send error applies to.
|
* @param sendHandle The send queue handle of the local echo the send error applies to. It can be used to retry the upload.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
suspend fun ignoreDeviceTrustAndResend(devices: Map<UserId, List<DeviceId>>, transactionId: TransactionId): Result<Unit>
|
suspend fun ignoreDeviceTrustAndResend(devices: Map<UserId, List<DeviceId>>, sendHandle: SendHandle): Result<Unit>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove verification requirements for the given users and
|
* Remove verification requirements for the given users and
|
||||||
* resend messages that failed to send because their identities were no longer verified.
|
* resend messages that failed to send because their identities were no longer verified.
|
||||||
*
|
*
|
||||||
* @param userIds The list of users identifiers received in the error.
|
* @param userIds The list of users identifiers received in the error.
|
||||||
* @param transactionId The send queue transaction identifier of the local echo the send error applies to.
|
* @param sendHandle The send queue handle of the local echo the send error applies to. It can be used to retry the upload.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
suspend fun withdrawVerificationAndResend(userIds: List<UserId>, transactionId: TransactionId): Result<Unit>
|
suspend fun withdrawVerificationAndResend(userIds: List<UserId>, sendHandle: SendHandle): Result<Unit>
|
||||||
|
|
||||||
override fun close() = destroy()
|
override fun close() = destroy()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@
|
||||||
package io.element.android.libraries.matrix.api.timeline.item.event
|
package io.element.android.libraries.matrix.api.timeline.item.event
|
||||||
|
|
||||||
import io.element.android.libraries.matrix.api.core.EventId
|
import io.element.android.libraries.matrix.api.core.EventId
|
||||||
|
import io.element.android.libraries.matrix.api.core.SendHandle
|
||||||
import io.element.android.libraries.matrix.api.core.TransactionId
|
import io.element.android.libraries.matrix.api.core.TransactionId
|
||||||
import io.element.android.libraries.matrix.api.core.UserId
|
import io.element.android.libraries.matrix.api.core.UserId
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.TimelineItemDebugInfo
|
import io.element.android.libraries.matrix.api.timeline.item.TimelineItemDebugInfo
|
||||||
|
|
@ -30,6 +31,7 @@ data class EventTimelineItem(
|
||||||
val origin: TimelineItemEventOrigin?,
|
val origin: TimelineItemEventOrigin?,
|
||||||
val timelineItemDebugInfoProvider: TimelineItemDebugInfoProvider,
|
val timelineItemDebugInfoProvider: TimelineItemDebugInfoProvider,
|
||||||
val messageShieldProvider: MessageShieldProvider,
|
val messageShieldProvider: MessageShieldProvider,
|
||||||
|
val sendHandleProvider: SendHandleProvider,
|
||||||
) {
|
) {
|
||||||
fun inReplyTo(): InReplyTo? {
|
fun inReplyTo(): InReplyTo? {
|
||||||
return (content as? MessageContent)?.inReplyTo
|
return (content as? MessageContent)?.inReplyTo
|
||||||
|
|
@ -52,3 +54,7 @@ fun interface TimelineItemDebugInfoProvider {
|
||||||
fun interface MessageShieldProvider {
|
fun interface MessageShieldProvider {
|
||||||
operator fun invoke(strict: Boolean): MessageShield?
|
operator fun invoke(strict: Boolean): MessageShield?
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun interface SendHandleProvider {
|
||||||
|
operator fun invoke(): SendHandle?
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2024 New Vector Ltd.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
* Please see LICENSE in the repository root for full details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.element.android.libraries.matrix.impl.core
|
||||||
|
|
||||||
|
import io.element.android.libraries.matrix.api.core.SendHandle
|
||||||
|
|
||||||
|
class RustSendHandle(
|
||||||
|
val inner: org.matrix.rustcomponents.sdk.SendHandle,
|
||||||
|
) : SendHandle {
|
||||||
|
override suspend fun retry(): Result<Unit> {
|
||||||
|
return runCatching {
|
||||||
|
inner.tryResend()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -8,11 +8,12 @@
|
||||||
package io.element.android.libraries.matrix.impl.room
|
package io.element.android.libraries.matrix.impl.room
|
||||||
|
|
||||||
import io.element.android.libraries.matrix.api.room.RoomType
|
import io.element.android.libraries.matrix.api.room.RoomType
|
||||||
|
import org.matrix.rustcomponents.sdk.RoomType as RustRoomType
|
||||||
|
|
||||||
fun String?.toRoomType(): RoomType {
|
fun RustRoomType.map(): RoomType {
|
||||||
return when (this) {
|
return when (this) {
|
||||||
null -> RoomType.Room
|
RustRoomType.Room -> RoomType.Room
|
||||||
"m.space" -> RoomType.Space
|
RustRoomType.Space -> RoomType.Space
|
||||||
else -> RoomType.Other(this)
|
is RustRoomType.Custom -> RoomType.Other(this.value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ import io.element.android.libraries.matrix.api.core.EventId
|
||||||
import io.element.android.libraries.matrix.api.core.ProgressCallback
|
import io.element.android.libraries.matrix.api.core.ProgressCallback
|
||||||
import io.element.android.libraries.matrix.api.core.RoomAlias
|
import io.element.android.libraries.matrix.api.core.RoomAlias
|
||||||
import io.element.android.libraries.matrix.api.core.RoomId
|
import io.element.android.libraries.matrix.api.core.RoomId
|
||||||
|
import io.element.android.libraries.matrix.api.core.SendHandle
|
||||||
import io.element.android.libraries.matrix.api.core.SessionId
|
import io.element.android.libraries.matrix.api.core.SessionId
|
||||||
import io.element.android.libraries.matrix.api.core.TransactionId
|
import io.element.android.libraries.matrix.api.core.TransactionId
|
||||||
import io.element.android.libraries.matrix.api.core.UserId
|
import io.element.android.libraries.matrix.api.core.UserId
|
||||||
|
|
@ -45,6 +46,7 @@ import io.element.android.libraries.matrix.api.timeline.Timeline
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.EventOrTransactionId
|
import io.element.android.libraries.matrix.api.timeline.item.event.EventOrTransactionId
|
||||||
import io.element.android.libraries.matrix.api.widget.MatrixWidgetDriver
|
import io.element.android.libraries.matrix.api.widget.MatrixWidgetDriver
|
||||||
import io.element.android.libraries.matrix.api.widget.MatrixWidgetSettings
|
import io.element.android.libraries.matrix.api.widget.MatrixWidgetSettings
|
||||||
|
import io.element.android.libraries.matrix.impl.core.RustSendHandle
|
||||||
import io.element.android.libraries.matrix.impl.mapper.map
|
import io.element.android.libraries.matrix.impl.mapper.map
|
||||||
import io.element.android.libraries.matrix.impl.room.draft.into
|
import io.element.android.libraries.matrix.impl.room.draft.into
|
||||||
import io.element.android.libraries.matrix.impl.room.member.RoomMemberListFetcher
|
import io.element.android.libraries.matrix.impl.room.member.RoomMemberListFetcher
|
||||||
|
|
@ -481,10 +483,6 @@ class RustMatrixRoom(
|
||||||
return liveTimeline.forwardEvent(eventId, roomIds)
|
return liveTimeline.forwardEvent(eventId, roomIds)
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun retrySendMessage(transactionId: TransactionId): Result<Unit> = runCatching {
|
|
||||||
innerRoom.tryResend(transactionId.value)
|
|
||||||
}
|
|
||||||
|
|
||||||
override suspend fun cancelSend(transactionId: TransactionId): Result<Unit> {
|
override suspend fun cancelSend(transactionId: TransactionId): Result<Unit> {
|
||||||
return liveTimeline.cancelSend(transactionId)
|
return liveTimeline.cancelSend(transactionId)
|
||||||
}
|
}
|
||||||
|
|
@ -671,19 +669,19 @@ class RustMatrixRoom(
|
||||||
innerRoom.clearComposerDraft()
|
innerRoom.clearComposerDraft()
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun ignoreDeviceTrustAndResend(devices: Map<UserId, List<DeviceId>>, transactionId: TransactionId) = runCatching {
|
override suspend fun ignoreDeviceTrustAndResend(devices: Map<UserId, List<DeviceId>>, sendHandle: SendHandle) = runCatching {
|
||||||
innerRoom.ignoreDeviceTrustAndResend(
|
innerRoom.ignoreDeviceTrustAndResend(
|
||||||
devices = devices.entries.associate { entry ->
|
devices = devices.entries.associate { entry ->
|
||||||
entry.key.value to entry.value.map { it.value }
|
entry.key.value to entry.value.map { it.value }
|
||||||
},
|
},
|
||||||
transactionId = transactionId.value
|
sendHandle = (sendHandle as RustSendHandle).inner,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun withdrawVerificationAndResend(userIds: List<UserId>, transactionId: TransactionId) = runCatching {
|
override suspend fun withdrawVerificationAndResend(userIds: List<UserId>, sendHandle: SendHandle) = runCatching {
|
||||||
innerRoom.withdrawVerificationAndResend(
|
innerRoom.withdrawVerificationAndResend(
|
||||||
userIds = userIds.map { it.value },
|
userIds = userIds.map { it.value },
|
||||||
transactionId = transactionId.value
|
sendHandle = (sendHandle as RustSendHandle).inner,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ package io.element.android.libraries.matrix.impl.room.preview
|
||||||
import io.element.android.libraries.matrix.api.core.RoomAlias
|
import io.element.android.libraries.matrix.api.core.RoomAlias
|
||||||
import io.element.android.libraries.matrix.api.core.RoomId
|
import io.element.android.libraries.matrix.api.core.RoomId
|
||||||
import io.element.android.libraries.matrix.api.room.preview.RoomPreviewInfo
|
import io.element.android.libraries.matrix.api.room.preview.RoomPreviewInfo
|
||||||
import io.element.android.libraries.matrix.impl.room.toRoomType
|
import io.element.android.libraries.matrix.impl.room.map
|
||||||
import org.matrix.rustcomponents.sdk.JoinRule
|
import org.matrix.rustcomponents.sdk.JoinRule
|
||||||
import org.matrix.rustcomponents.sdk.Membership
|
import org.matrix.rustcomponents.sdk.Membership
|
||||||
import org.matrix.rustcomponents.sdk.RoomPreviewInfo as RustRoomPreviewInfo
|
import org.matrix.rustcomponents.sdk.RoomPreviewInfo as RustRoomPreviewInfo
|
||||||
|
|
@ -24,7 +24,7 @@ object RoomPreviewInfoMapper {
|
||||||
topic = info.topic,
|
topic = info.topic,
|
||||||
avatarUrl = info.avatarUrl,
|
avatarUrl = info.avatarUrl,
|
||||||
numberOfJoinedMembers = info.numJoinedMembers.toLong(),
|
numberOfJoinedMembers = info.numJoinedMembers.toLong(),
|
||||||
roomType = info.roomType.toRoomType(),
|
roomType = info.roomType.map(),
|
||||||
isHistoryWorldReadable = info.isHistoryWorldReadable,
|
isHistoryWorldReadable = info.isHistoryWorldReadable,
|
||||||
isJoined = info.membership == Membership.JOINED,
|
isJoined = info.membership == Membership.JOINED,
|
||||||
isInvited = info.membership == Membership.INVITED,
|
isInvited = info.membership == Membership.INVITED,
|
||||||
|
|
|
||||||
|
|
@ -43,7 +43,7 @@ class RustRoomDirectoryList(
|
||||||
|
|
||||||
override suspend fun filter(filter: String?, batchSize: Int, viaServerName: String?): Result<Unit> {
|
override suspend fun filter(filter: String?, batchSize: Int, viaServerName: String?): Result<Unit> {
|
||||||
return execute {
|
return execute {
|
||||||
inner.search(filter = filter, batchSize = batchSize.toUInt(), viaServerName = viaServerName)
|
inner.search(filter = filter, batchSize = batchSize.toUInt(), viaServerName = null)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ import io.element.android.libraries.matrix.api.timeline.item.event.ProfileTimeli
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.ReactionSender
|
import io.element.android.libraries.matrix.api.timeline.item.event.ReactionSender
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.Receipt
|
import io.element.android.libraries.matrix.api.timeline.item.event.Receipt
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.TimelineItemEventOrigin
|
import io.element.android.libraries.matrix.api.timeline.item.event.TimelineItemEventOrigin
|
||||||
|
import io.element.android.libraries.matrix.impl.core.RustSendHandle
|
||||||
import kotlinx.collections.immutable.ImmutableList
|
import kotlinx.collections.immutable.ImmutableList
|
||||||
import kotlinx.collections.immutable.persistentListOf
|
import kotlinx.collections.immutable.persistentListOf
|
||||||
import kotlinx.collections.immutable.toImmutableList
|
import kotlinx.collections.immutable.toImmutableList
|
||||||
|
|
@ -56,6 +57,7 @@ class EventTimelineItemMapper(
|
||||||
origin = origin?.map(),
|
origin = origin?.map(),
|
||||||
timelineItemDebugInfoProvider = { lazyProvider.debugInfo().map() },
|
timelineItemDebugInfoProvider = { lazyProvider.debugInfo().map() },
|
||||||
messageShieldProvider = { strict -> lazyProvider.getShields(strict)?.map() },
|
messageShieldProvider = { strict -> lazyProvider.getShields(strict)?.map() },
|
||||||
|
sendHandleProvider = { lazyProvider.getSendHandle()?.let(::RustSendHandle) }
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@ import io.element.android.libraries.matrix.test.A_ROOM_ID
|
||||||
import org.matrix.rustcomponents.sdk.JoinRule
|
import org.matrix.rustcomponents.sdk.JoinRule
|
||||||
import org.matrix.rustcomponents.sdk.Membership
|
import org.matrix.rustcomponents.sdk.Membership
|
||||||
import org.matrix.rustcomponents.sdk.RoomPreviewInfo
|
import org.matrix.rustcomponents.sdk.RoomPreviewInfo
|
||||||
|
import org.matrix.rustcomponents.sdk.RoomType
|
||||||
|
|
||||||
internal fun aRustRoomPreviewInfo(
|
internal fun aRustRoomPreviewInfo(
|
||||||
canonicalAlias: String? = A_ROOM_ALIAS.value,
|
canonicalAlias: String? = A_ROOM_ALIAS.value,
|
||||||
|
|
@ -25,7 +26,9 @@ internal fun aRustRoomPreviewInfo(
|
||||||
topic = "topic",
|
topic = "topic",
|
||||||
avatarUrl = "avatarUrl",
|
avatarUrl = "avatarUrl",
|
||||||
numJoinedMembers = 1u,
|
numJoinedMembers = 1u,
|
||||||
roomType = null,
|
numActiveMembers = 1u,
|
||||||
|
isDirect = false,
|
||||||
|
roomType = RoomType.Room,
|
||||||
isHistoryWorldReadable = true,
|
isHistoryWorldReadable = true,
|
||||||
membership = membership,
|
membership = membership,
|
||||||
joinRule = joinRule,
|
joinRule = joinRule,
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,6 @@ class FakeRustClientBuilder : ClientBuilder(NoPointer) {
|
||||||
override fun disableBuiltInRootCertificates() = this
|
override fun disableBuiltInRootCertificates() = this
|
||||||
override fun roomDecryptionTrustRequirement(trustRequirement: TrustRequirement) = this
|
override fun roomDecryptionTrustRequirement(trustRequirement: TrustRequirement) = this
|
||||||
override fun disableSslVerification() = this
|
override fun disableSslVerification() = this
|
||||||
override fun enableCrossProcessRefreshLock(processId: String, sessionDelegate: ClientSessionDelegate) = this
|
|
||||||
override fun homeserverUrl(url: String) = this
|
override fun homeserverUrl(url: String) = this
|
||||||
override fun passphrase(passphrase: String?) = this
|
override fun passphrase(passphrase: String?) = this
|
||||||
override fun proxy(url: String) = this
|
override fun proxy(url: String) = this
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ import io.element.android.libraries.matrix.impl.fixtures.factories.anEventTimeli
|
||||||
import org.matrix.rustcomponents.sdk.EventTimelineItemDebugInfo
|
import org.matrix.rustcomponents.sdk.EventTimelineItemDebugInfo
|
||||||
import org.matrix.rustcomponents.sdk.LazyTimelineItemProvider
|
import org.matrix.rustcomponents.sdk.LazyTimelineItemProvider
|
||||||
import org.matrix.rustcomponents.sdk.NoPointer
|
import org.matrix.rustcomponents.sdk.NoPointer
|
||||||
|
import org.matrix.rustcomponents.sdk.SendHandle
|
||||||
import org.matrix.rustcomponents.sdk.ShieldState
|
import org.matrix.rustcomponents.sdk.ShieldState
|
||||||
|
|
||||||
class FakeRustLazyTimelineItemProvider(
|
class FakeRustLazyTimelineItemProvider(
|
||||||
|
|
@ -19,4 +20,5 @@ class FakeRustLazyTimelineItemProvider(
|
||||||
) : LazyTimelineItemProvider(NoPointer) {
|
) : LazyTimelineItemProvider(NoPointer) {
|
||||||
override fun getShields(strict: Boolean) = shieldsState
|
override fun getShields(strict: Boolean) = shieldsState
|
||||||
override fun debugInfo() = debugInfo
|
override fun debugInfo() = debugInfo
|
||||||
|
override fun getSendHandle(): SendHandle? = null
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,12 +8,13 @@ package io.element.android.libraries.matrix.impl.room
|
||||||
|
|
||||||
import io.element.android.libraries.matrix.api.room.RoomType
|
import io.element.android.libraries.matrix.api.room.RoomType
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
|
import org.matrix.rustcomponents.sdk.RoomType as RustRoomType
|
||||||
|
|
||||||
class RoomTypeKtTest {
|
class RoomTypeKtTest {
|
||||||
@Test
|
@Test
|
||||||
fun toRoomType() {
|
fun toRoomType() {
|
||||||
assert(null.toRoomType() == RoomType.Room)
|
assert(RustRoomType.Room.map() == RoomType.Room)
|
||||||
assert("m.space".toRoomType() == RoomType.Space)
|
assert(RustRoomType.Space.map() == RoomType.Space)
|
||||||
assert("m.other".toRoomType() == RoomType.Other("m.other"))
|
assert(RustRoomType.Custom("m.other").map() == RoomType.Other("m.other"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2024 New Vector Ltd.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
* Please see LICENSE in the repository root for full details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.element.android.libraries.matrix.test.core
|
||||||
|
|
||||||
|
import io.element.android.libraries.matrix.api.core.SendHandle
|
||||||
|
import io.element.android.tests.testutils.simulateLongTask
|
||||||
|
|
||||||
|
class FakeSendHandle(
|
||||||
|
var retryLambda: () -> Result<Unit> = { Result.success(Unit) }
|
||||||
|
) : SendHandle {
|
||||||
|
override suspend fun retry(): Result<Unit> = simulateLongTask {
|
||||||
|
return retryLambda()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -12,6 +12,7 @@ import io.element.android.libraries.matrix.api.core.EventId
|
||||||
import io.element.android.libraries.matrix.api.core.ProgressCallback
|
import io.element.android.libraries.matrix.api.core.ProgressCallback
|
||||||
import io.element.android.libraries.matrix.api.core.RoomAlias
|
import io.element.android.libraries.matrix.api.core.RoomAlias
|
||||||
import io.element.android.libraries.matrix.api.core.RoomId
|
import io.element.android.libraries.matrix.api.core.RoomId
|
||||||
|
import io.element.android.libraries.matrix.api.core.SendHandle
|
||||||
import io.element.android.libraries.matrix.api.core.SessionId
|
import io.element.android.libraries.matrix.api.core.SessionId
|
||||||
import io.element.android.libraries.matrix.api.core.TransactionId
|
import io.element.android.libraries.matrix.api.core.TransactionId
|
||||||
import io.element.android.libraries.matrix.api.core.UserId
|
import io.element.android.libraries.matrix.api.core.UserId
|
||||||
|
|
@ -105,7 +106,6 @@ class FakeMatrixRoom(
|
||||||
private val sendMessageResult: (String, String?, List<IntentionalMention>) -> Result<Unit> = { _, _, _ -> lambdaError() },
|
private val sendMessageResult: (String, String?, List<IntentionalMention>) -> Result<Unit> = { _, _, _ -> lambdaError() },
|
||||||
private val updateUserRoleResult: () -> Result<Unit> = { lambdaError() },
|
private val updateUserRoleResult: () -> Result<Unit> = { lambdaError() },
|
||||||
private val toggleReactionResult: (String, EventOrTransactionId) -> Result<Unit> = { _, _ -> lambdaError() },
|
private val toggleReactionResult: (String, EventOrTransactionId) -> Result<Unit> = { _, _ -> lambdaError() },
|
||||||
private val retrySendMessageResult: (TransactionId) -> Result<Unit> = { lambdaError() },
|
|
||||||
private val cancelSendResult: (TransactionId) -> Result<Unit> = { lambdaError() },
|
private val cancelSendResult: (TransactionId) -> Result<Unit> = { lambdaError() },
|
||||||
private val forwardEventResult: (EventId, List<RoomId>) -> Result<Unit> = { _, _ -> lambdaError() },
|
private val forwardEventResult: (EventId, List<RoomId>) -> Result<Unit> = { _, _ -> lambdaError() },
|
||||||
private val reportContentResult: (EventId, String, UserId?) -> Result<Unit> = { _, _, _ -> lambdaError() },
|
private val reportContentResult: (EventId, String, UserId?) -> Result<Unit> = { _, _, _ -> lambdaError() },
|
||||||
|
|
@ -138,8 +138,8 @@ class FakeMatrixRoom(
|
||||||
private val loadComposerDraftLambda: () -> Result<ComposerDraft?> = { Result.success<ComposerDraft?>(null) },
|
private val loadComposerDraftLambda: () -> Result<ComposerDraft?> = { Result.success<ComposerDraft?>(null) },
|
||||||
private val clearComposerDraftLambda: () -> Result<Unit> = { Result.success(Unit) },
|
private val clearComposerDraftLambda: () -> Result<Unit> = { Result.success(Unit) },
|
||||||
private val subscribeToSyncLambda: () -> Unit = { lambdaError() },
|
private val subscribeToSyncLambda: () -> Unit = { lambdaError() },
|
||||||
private val ignoreDeviceTrustAndResendResult: (Map<UserId, List<DeviceId>>, TransactionId) -> Result<Unit> = { _, _ -> lambdaError() },
|
private val ignoreDeviceTrustAndResendResult: (Map<UserId, List<DeviceId>>, SendHandle) -> Result<Unit> = { _, _ -> lambdaError() },
|
||||||
private val withdrawVerificationAndResendResult: (List<UserId>, TransactionId) -> Result<Unit> = { _, _ -> lambdaError() },
|
private val withdrawVerificationAndResendResult: (List<UserId>, SendHandle) -> Result<Unit> = { _, _ -> lambdaError() },
|
||||||
) : MatrixRoom {
|
) : MatrixRoom {
|
||||||
private val _roomInfoFlow: MutableSharedFlow<MatrixRoomInfo> = MutableSharedFlow(replay = 1)
|
private val _roomInfoFlow: MutableSharedFlow<MatrixRoomInfo> = MutableSharedFlow(replay = 1)
|
||||||
override val roomInfoFlow: Flow<MatrixRoomInfo> = _roomInfoFlow
|
override val roomInfoFlow: Flow<MatrixRoomInfo> = _roomInfoFlow
|
||||||
|
|
@ -249,10 +249,6 @@ class FakeMatrixRoom(
|
||||||
return toggleReactionResult(emoji, eventOrTransactionId)
|
return toggleReactionResult(emoji, eventOrTransactionId)
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun retrySendMessage(transactionId: TransactionId): Result<Unit> = simulateLongTask {
|
|
||||||
return retrySendMessageResult(transactionId)
|
|
||||||
}
|
|
||||||
|
|
||||||
override suspend fun cancelSend(transactionId: TransactionId): Result<Unit> {
|
override suspend fun cancelSend(transactionId: TransactionId): Result<Unit> {
|
||||||
return cancelSendResult(transactionId)
|
return cancelSendResult(transactionId)
|
||||||
}
|
}
|
||||||
|
|
@ -554,12 +550,12 @@ class FakeMatrixRoom(
|
||||||
return getWidgetDriverResult(widgetSettings)
|
return getWidgetDriverResult(widgetSettings)
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun ignoreDeviceTrustAndResend(devices: Map<UserId, List<DeviceId>>, transactionId: TransactionId): Result<Unit> = simulateLongTask {
|
override suspend fun ignoreDeviceTrustAndResend(devices: Map<UserId, List<DeviceId>>, sendHandle: SendHandle): Result<Unit> = simulateLongTask {
|
||||||
return ignoreDeviceTrustAndResendResult(devices, transactionId)
|
return ignoreDeviceTrustAndResendResult(devices, sendHandle)
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun withdrawVerificationAndResend(userIds: List<UserId>, transactionId: TransactionId): Result<Unit> = simulateLongTask {
|
override suspend fun withdrawVerificationAndResend(userIds: List<UserId>, sendHandle: SendHandle): Result<Unit> = simulateLongTask {
|
||||||
return withdrawVerificationAndResendResult(userIds, transactionId)
|
return withdrawVerificationAndResendResult(userIds, sendHandle)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun givenRoomMembersState(state: MatrixRoomMembersState) {
|
fun givenRoomMembersState(state: MatrixRoomMembersState) {
|
||||||
|
|
|
||||||
|
|
@ -21,17 +21,20 @@ import io.element.android.libraries.matrix.api.timeline.item.event.EventTimeline
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.InReplyTo
|
import io.element.android.libraries.matrix.api.timeline.item.event.InReplyTo
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.LocalEventSendState
|
import io.element.android.libraries.matrix.api.timeline.item.event.LocalEventSendState
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.MessageContent
|
import io.element.android.libraries.matrix.api.timeline.item.event.MessageContent
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.MessageShield
|
import io.element.android.libraries.matrix.api.timeline.item.event.MessageShieldProvider
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.MessageType
|
import io.element.android.libraries.matrix.api.timeline.item.event.MessageType
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.PollContent
|
import io.element.android.libraries.matrix.api.timeline.item.event.PollContent
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.ProfileChangeContent
|
import io.element.android.libraries.matrix.api.timeline.item.event.ProfileChangeContent
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.ProfileTimelineDetails
|
import io.element.android.libraries.matrix.api.timeline.item.event.ProfileTimelineDetails
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.Receipt
|
import io.element.android.libraries.matrix.api.timeline.item.event.Receipt
|
||||||
|
import io.element.android.libraries.matrix.api.timeline.item.event.SendHandleProvider
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.StickerContent
|
import io.element.android.libraries.matrix.api.timeline.item.event.StickerContent
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.TextMessageType
|
import io.element.android.libraries.matrix.api.timeline.item.event.TextMessageType
|
||||||
|
import io.element.android.libraries.matrix.api.timeline.item.event.TimelineItemDebugInfoProvider
|
||||||
import io.element.android.libraries.matrix.test.AN_EVENT_ID
|
import io.element.android.libraries.matrix.test.AN_EVENT_ID
|
||||||
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.A_USER_NAME
|
import io.element.android.libraries.matrix.test.A_USER_NAME
|
||||||
|
import io.element.android.libraries.matrix.test.core.FakeSendHandle
|
||||||
import kotlinx.collections.immutable.ImmutableList
|
import kotlinx.collections.immutable.ImmutableList
|
||||||
import kotlinx.collections.immutable.ImmutableMap
|
import kotlinx.collections.immutable.ImmutableMap
|
||||||
import kotlinx.collections.immutable.persistentListOf
|
import kotlinx.collections.immutable.persistentListOf
|
||||||
|
|
@ -51,8 +54,9 @@ fun anEventTimelineItem(
|
||||||
senderProfile: ProfileTimelineDetails = aProfileTimelineDetails(),
|
senderProfile: ProfileTimelineDetails = aProfileTimelineDetails(),
|
||||||
timestamp: Long = 0L,
|
timestamp: Long = 0L,
|
||||||
content: EventContent = aProfileChangeMessageContent(),
|
content: EventContent = aProfileChangeMessageContent(),
|
||||||
debugInfo: TimelineItemDebugInfo = aTimelineItemDebugInfo(),
|
debugInfoProvider: TimelineItemDebugInfoProvider = TimelineItemDebugInfoProvider { aTimelineItemDebugInfo() },
|
||||||
messageShield: MessageShield? = null,
|
messageShieldProvider: MessageShieldProvider = MessageShieldProvider { null },
|
||||||
|
sendHandleProvider: SendHandleProvider = SendHandleProvider { FakeSendHandle() }
|
||||||
) = EventTimelineItem(
|
) = EventTimelineItem(
|
||||||
eventId = eventId,
|
eventId = eventId,
|
||||||
transactionId = transactionId,
|
transactionId = transactionId,
|
||||||
|
|
@ -68,8 +72,9 @@ fun anEventTimelineItem(
|
||||||
timestamp = timestamp,
|
timestamp = timestamp,
|
||||||
content = content,
|
content = content,
|
||||||
origin = null,
|
origin = null,
|
||||||
timelineItemDebugInfoProvider = { debugInfo },
|
timelineItemDebugInfoProvider = debugInfoProvider,
|
||||||
messageShieldProvider = { messageShield },
|
messageShieldProvider = messageShieldProvider,
|
||||||
|
sendHandleProvider = sendHandleProvider,
|
||||||
)
|
)
|
||||||
|
|
||||||
fun aProfileTimelineDetails(
|
fun aProfileTimelineDetails(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue