Browse Source

Merge pull request #1825 from vector-im/feature/fga/suppress_remove_timeline_usage

Suppress usage of removeTimeline method (#1824)
pull/1827/head
ganfra 10 months ago committed by GitHub
parent
commit
3886048a89
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      changelog.d/1824.misc
  2. 19
      libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RoomContentForwarder.kt
  3. 14
      libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RoomTimelineExtensions.kt

1
changelog.d/1824.misc

@ -0,0 +1 @@
Suppress usage of removeTimeline method.

19
libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RoomContentForwarder.kt

@ -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
}
} }

14
libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RoomTimelineExtensions.kt

@ -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…
Cancel
Save