Merge pull request #1825 from vector-im/feature/fga/suppress_remove_timeline_usage
Suppress usage of removeTimeline method (#1824)
This commit is contained in:
commit
df3b29b3a4
3 changed files with 21 additions and 13 deletions
1
changelog.d/1824.misc
Normal file
1
changelog.d/1824.misc
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
Suppress usage of removeTimeline method.
|
||||||
|
|
@ -21,12 +21,11 @@ import io.element.android.libraries.matrix.api.core.EventId
|
||||||
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.ForwardEventException
|
import io.element.android.libraries.matrix.api.room.ForwardEventException
|
||||||
import io.element.android.libraries.matrix.impl.roomlist.roomOrNull
|
import io.element.android.libraries.matrix.impl.roomlist.roomOrNull
|
||||||
|
import io.element.android.libraries.matrix.impl.timeline.runWithTimelineListenerRegistered
|
||||||
import kotlinx.coroutines.CancellationException
|
import kotlinx.coroutines.CancellationException
|
||||||
import kotlinx.coroutines.withTimeout
|
import kotlinx.coroutines.withTimeout
|
||||||
import org.matrix.rustcomponents.sdk.Room
|
import org.matrix.rustcomponents.sdk.Room
|
||||||
import org.matrix.rustcomponents.sdk.RoomListService
|
import org.matrix.rustcomponents.sdk.RoomListService
|
||||||
import org.matrix.rustcomponents.sdk.TimelineDiff
|
|
||||||
import org.matrix.rustcomponents.sdk.TimelineListener
|
|
||||||
import kotlin.time.Duration.Companion.milliseconds
|
import kotlin.time.Duration.Companion.milliseconds
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -56,16 +55,14 @@ class RoomContentForwarder(
|
||||||
val failedForwardingTo = mutableSetOf<RoomId>()
|
val failedForwardingTo = mutableSetOf<RoomId>()
|
||||||
targetRooms.parallelMap { room ->
|
targetRooms.parallelMap { room ->
|
||||||
room.use { targetRoom ->
|
room.use { targetRoom ->
|
||||||
val result = runCatching {
|
runCatching {
|
||||||
// Sending a message requires a registered timeline listener
|
// Sending a message requires a registered timeline listener
|
||||||
targetRoom.addTimelineListener(NoOpTimelineListener)
|
targetRoom.runWithTimelineListenerRegistered {
|
||||||
withTimeout(timeoutMs.milliseconds) {
|
withTimeout(timeoutMs.milliseconds) {
|
||||||
targetRoom.send(content)
|
targetRoom.send(content)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// After sending, we remove the timeline
|
|
||||||
targetRoom.removeTimeline()
|
|
||||||
result
|
|
||||||
}.onFailure {
|
}.onFailure {
|
||||||
failedForwardingTo.add(RoomId(room.id()))
|
failedForwardingTo.add(RoomId(room.id()))
|
||||||
if (it is CancellationException) {
|
if (it is CancellationException) {
|
||||||
|
|
@ -78,8 +75,4 @@ class RoomContentForwarder(
|
||||||
throw ForwardEventException(toRoomIds.toList())
|
throw ForwardEventException(toRoomIds.toList())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private object NoOpTimelineListener : TimelineListener {
|
|
||||||
override fun onUpdate(diff: List<TimelineDiff>) = Unit
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -70,3 +70,17 @@ internal fun Room.backPaginationStatusFlow(): Flow<BackPaginationStatus> =
|
||||||
subscribeToBackPaginationStatus(listener)
|
subscribeToBackPaginationStatus(listener)
|
||||||
}
|
}
|
||||||
}.buffer(Channel.UNLIMITED)
|
}.buffer(Channel.UNLIMITED)
|
||||||
|
|
||||||
|
internal suspend fun Room.runWithTimelineListenerRegistered(action: suspend () -> Unit) {
|
||||||
|
val result = addTimelineListener(NoOpTimelineListener)
|
||||||
|
try {
|
||||||
|
action()
|
||||||
|
} finally {
|
||||||
|
result.itemsStream.cancelAndDestroy()
|
||||||
|
result.items.destroyAll()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private object NoOpTimelineListener : TimelineListener {
|
||||||
|
override fun onUpdate(diff: List<TimelineDiff>) = Unit
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue