|
|
@ -17,7 +17,6 @@ |
|
|
|
package io.element.android.libraries.matrix.impl.timeline |
|
|
|
package io.element.android.libraries.matrix.impl.timeline |
|
|
|
|
|
|
|
|
|
|
|
import io.element.android.libraries.matrix.impl.util.cancelAndDestroy |
|
|
|
import io.element.android.libraries.matrix.impl.util.cancelAndDestroy |
|
|
|
import io.element.android.libraries.matrix.impl.util.destroyAll |
|
|
|
|
|
|
|
import kotlinx.coroutines.channels.Channel |
|
|
|
import kotlinx.coroutines.channels.Channel |
|
|
|
import kotlinx.coroutines.channels.awaitClose |
|
|
|
import kotlinx.coroutines.channels.awaitClose |
|
|
|
import kotlinx.coroutines.channels.trySendBlocking |
|
|
|
import kotlinx.coroutines.channels.trySendBlocking |
|
|
@ -28,7 +27,6 @@ import kotlinx.coroutines.flow.catch |
|
|
|
import org.matrix.rustcomponents.sdk.PaginationStatusListener |
|
|
|
import org.matrix.rustcomponents.sdk.PaginationStatusListener |
|
|
|
import org.matrix.rustcomponents.sdk.Timeline |
|
|
|
import org.matrix.rustcomponents.sdk.Timeline |
|
|
|
import org.matrix.rustcomponents.sdk.TimelineDiff |
|
|
|
import org.matrix.rustcomponents.sdk.TimelineDiff |
|
|
|
import org.matrix.rustcomponents.sdk.TimelineItem |
|
|
|
|
|
|
|
import org.matrix.rustcomponents.sdk.TimelineListener |
|
|
|
import org.matrix.rustcomponents.sdk.TimelineListener |
|
|
|
import timber.log.Timber |
|
|
|
import timber.log.Timber |
|
|
|
import uniffi.matrix_sdk_ui.LiveBackPaginationStatus |
|
|
|
import uniffi.matrix_sdk_ui.LiveBackPaginationStatus |
|
|
@ -47,7 +45,7 @@ internal fun Timeline.liveBackPaginationStatus(): Flow<LiveBackPaginationStatus> |
|
|
|
Timber.d(it, "liveBackPaginationStatus() failed") |
|
|
|
Timber.d(it, "liveBackPaginationStatus() failed") |
|
|
|
}.buffer(Channel.UNLIMITED) |
|
|
|
}.buffer(Channel.UNLIMITED) |
|
|
|
|
|
|
|
|
|
|
|
internal fun Timeline.timelineDiffFlow(onInitialList: suspend (List<TimelineItem>) -> Unit): Flow<List<TimelineDiff>> = |
|
|
|
internal fun Timeline.timelineDiffFlow(): Flow<List<TimelineDiff>> = |
|
|
|
callbackFlow { |
|
|
|
callbackFlow { |
|
|
|
val listener = object : TimelineListener { |
|
|
|
val listener = object : TimelineListener { |
|
|
|
override fun onUpdate(diff: List<TimelineDiff>) { |
|
|
|
override fun onUpdate(diff: List<TimelineDiff>) { |
|
|
@ -55,16 +53,10 @@ internal fun Timeline.timelineDiffFlow(onInitialList: suspend (List<TimelineItem |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
Timber.d("Open timelineDiffFlow for TimelineInterface ${this@timelineDiffFlow}") |
|
|
|
Timber.d("Open timelineDiffFlow for TimelineInterface ${this@timelineDiffFlow}") |
|
|
|
val result = addListener(listener) |
|
|
|
val taskHandle = addListener(listener) |
|
|
|
try { |
|
|
|
|
|
|
|
onInitialList(result.items) |
|
|
|
|
|
|
|
} catch (exception: Exception) { |
|
|
|
|
|
|
|
Timber.d(exception, "Catch failure in timelineDiffFlow of TimelineInterface ${this@timelineDiffFlow}") |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
awaitClose { |
|
|
|
awaitClose { |
|
|
|
Timber.d("Close timelineDiffFlow for TimelineInterface ${this@timelineDiffFlow}") |
|
|
|
Timber.d("Close timelineDiffFlow for TimelineInterface ${this@timelineDiffFlow}") |
|
|
|
result.itemsStream.cancelAndDestroy() |
|
|
|
taskHandle.cancelAndDestroy() |
|
|
|
result.items.destroyAll() |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
}.catch { |
|
|
|
}.catch { |
|
|
|
Timber.d(it, "timelineDiffFlow() failed") |
|
|
|
Timber.d(it, "timelineDiffFlow() failed") |
|
|
@ -75,8 +67,7 @@ internal suspend fun Timeline.runWithTimelineListenerRegistered(action: suspend |
|
|
|
try { |
|
|
|
try { |
|
|
|
action() |
|
|
|
action() |
|
|
|
} finally { |
|
|
|
} finally { |
|
|
|
result.itemsStream.cancelAndDestroy() |
|
|
|
result.cancelAndDestroy() |
|
|
|
result.items.destroyAll() |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|