mirror of
https://github.com/element-hq/element-android
synced 2024-11-28 05:31:21 +03:00
Implement permalink support for /relations live thread timeline
This commit is contained in:
parent
f4f48b919e
commit
2b740a1ab6
3 changed files with 32 additions and 2 deletions
|
@ -301,7 +301,13 @@ internal class DefaultTimeline(private val roomId: String,
|
|||
Timber.v("Post snapshot of ${snapshot.size} events")
|
||||
withContext(coroutineDispatchers.main) {
|
||||
listeners.forEach {
|
||||
tryOrNull { it.onTimelineUpdated(snapshot) }
|
||||
if (initialEventId != null && isFromThreadTimeline && snapshot.firstOrNull { it.eventId == initialEventId } == null) {
|
||||
// We are in a thread timeline with a permalink, post update timeline only when the appropriate message have been found
|
||||
tryOrNull { it.onTimelineUpdated(arrayListOf()) }
|
||||
} else {
|
||||
// In all the other cases update timeline as expected
|
||||
tryOrNull { it.onTimelineUpdated(snapshot) }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -171,11 +171,12 @@ internal class TimelineChunk(private val chunkEntity: ChunkEntity,
|
|||
* always fetch results, while we want our data to be up to dated.
|
||||
*/
|
||||
suspend fun loadMoreThread(count: Int, direction: Timeline.Direction): LoadMoreResult {
|
||||
val rootThreadEventId = timelineSettings.rootThreadEventId ?: return LoadMoreResult.FAILURE
|
||||
return if (direction == Timeline.Direction.BACKWARDS) {
|
||||
try {
|
||||
fetchThreadTimelineTask.execute(FetchThreadTimelineTask.Params(
|
||||
roomId,
|
||||
timelineSettings.rootThreadEventId!!,
|
||||
rootThreadEventId,
|
||||
chunkEntity.prevToken,
|
||||
count
|
||||
)).toLoadMoreResult()
|
||||
|
|
|
@ -156,6 +156,9 @@ class TimelineViewModel @AssistedInject constructor(
|
|||
|
||||
companion object : MavericksViewModelFactory<TimelineViewModel, RoomDetailViewState> by hiltMavericksViewModelFactory() {
|
||||
const val PAGINATION_COUNT = 50
|
||||
// The larger the number the faster the results, COUNT=200 for 500 thread messages its x4 faster than COUNT=50
|
||||
const val PAGINATION_COUNT_THREADS_PERMALINK = 200
|
||||
|
||||
}
|
||||
|
||||
init {
|
||||
|
@ -1174,10 +1177,30 @@ class TimelineViewModel @AssistedInject constructor(
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Navigates to the appropriate event (by paginating the thread timeline until the event is found
|
||||
* in the snapshot. The main reason for this function is to support the /relations api
|
||||
*/
|
||||
private var threadPermalinkHandled = false
|
||||
private fun navigateToThreadEventIfNeeded(snapshot: List<TimelineEvent>) {
|
||||
if (eventId != null && initialState.rootThreadEventId != null) {
|
||||
// When we have a permalink and we are in a thread timeline
|
||||
if (snapshot.firstOrNull { it.eventId == eventId } != null && !threadPermalinkHandled) {
|
||||
// Permalink event found lets navigate there
|
||||
handleNavigateToEvent(RoomDetailAction.NavigateToEvent(eventId, true))
|
||||
threadPermalinkHandled = true
|
||||
} else {
|
||||
// Permalink event not found yet continue paginating
|
||||
timeline.paginate(Timeline.Direction.BACKWARDS, PAGINATION_COUNT_THREADS_PERMALINK)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onTimelineUpdated(snapshot: List<TimelineEvent>) {
|
||||
viewModelScope.launch {
|
||||
// tryEmit doesn't work with SharedFlow without cache
|
||||
timelineEvents.emit(snapshot)
|
||||
navigateToThreadEventIfNeeded(snapshot)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue