mirror of
https://github.com/vector-im/element-android.git
synced 2024-11-15 01:35:07 +08:00
Merge pull request #6474 from vector-im/feature/fga/fix_6463
Fix crashes when opening Thread (#6463)
This commit is contained in:
commit
3e770f9efa
1
changelog.d/6463.bugfix
Normal file
1
changelog.d/6463.bugfix
Normal file
@ -0,0 +1 @@
|
||||
Fix crashes when opening Thread
|
@ -20,6 +20,7 @@ import io.realm.Realm
|
||||
import io.realm.RealmConfiguration
|
||||
import kotlinx.coroutines.CancellationException
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Job
|
||||
import kotlinx.coroutines.SupervisorJob
|
||||
import kotlinx.coroutines.android.asCoroutineDispatcher
|
||||
import kotlinx.coroutines.cancelChildren
|
||||
@ -116,6 +117,7 @@ internal class DefaultTimeline(
|
||||
)
|
||||
|
||||
private var strategy: LoadTimelineStrategy = buildStrategy(LoadTimelineStrategy.Mode.Live)
|
||||
private var startTimelineJob: Job? = null
|
||||
|
||||
override val isLive: Boolean
|
||||
get() = !getPaginationState(Timeline.Direction.FORWARDS).hasMoreToLoad
|
||||
@ -143,7 +145,7 @@ internal class DefaultTimeline(
|
||||
timelineScope.launch {
|
||||
loadRoomMembersIfNeeded()
|
||||
}
|
||||
timelineScope.launch {
|
||||
startTimelineJob = timelineScope.launch {
|
||||
sequencer.post {
|
||||
if (isStarted.compareAndSet(false, true)) {
|
||||
isFromThreadTimeline = rootThreadEventId != null
|
||||
@ -174,10 +176,12 @@ internal class DefaultTimeline(
|
||||
|
||||
override fun restartWithEventId(eventId: String?) {
|
||||
timelineScope.launch {
|
||||
sequencer.post {
|
||||
openAround(eventId, rootThreadEventId)
|
||||
postSnapshot()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun hasMoreToLoad(direction: Timeline.Direction): Boolean {
|
||||
return getPaginationState(direction).hasMoreToLoad
|
||||
@ -185,6 +189,7 @@ internal class DefaultTimeline(
|
||||
|
||||
override fun paginate(direction: Timeline.Direction, count: Int) {
|
||||
timelineScope.launch {
|
||||
startTimelineJob?.join()
|
||||
val postSnapshot = loadMore(count, direction, fetchOnServerIfNeeded = true)
|
||||
if (postSnapshot) {
|
||||
postSnapshot()
|
||||
@ -193,6 +198,7 @@ internal class DefaultTimeline(
|
||||
}
|
||||
|
||||
override suspend fun awaitPaginate(direction: Timeline.Direction, count: Int): List<TimelineEvent> {
|
||||
startTimelineJob?.join()
|
||||
withContext(timelineDispatcher) {
|
||||
loadMore(count, direction, fetchOnServerIfNeeded = true)
|
||||
}
|
||||
@ -279,6 +285,7 @@ internal class DefaultTimeline(
|
||||
direction = Timeline.Direction.BACKWARDS,
|
||||
fetchOnServerIfNeeded = false
|
||||
)
|
||||
|
||||
Timber.v("$baseLogMessage finished")
|
||||
}
|
||||
|
||||
@ -312,11 +319,13 @@ internal class DefaultTimeline(
|
||||
|
||||
private fun onLimitedTimeline() {
|
||||
timelineScope.launch {
|
||||
sequencer.post {
|
||||
initPaginationStates(null)
|
||||
loadMore(settings.initialSize, Timeline.Direction.BACKWARDS, false)
|
||||
postSnapshot()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun onEventsDeleted() {
|
||||
// Some event have been deleted, for instance when a user has been ignored.
|
||||
|
@ -22,6 +22,7 @@ import io.realm.Realm
|
||||
import io.realm.RealmConfiguration
|
||||
import io.realm.RealmResults
|
||||
import io.realm.kotlin.createObject
|
||||
import io.realm.kotlin.executeTransactionAwait
|
||||
import kotlinx.coroutines.CompletableDeferred
|
||||
import org.matrix.android.sdk.api.MatrixCoroutineDispatchers
|
||||
import org.matrix.android.sdk.api.extensions.orFalse
|
||||
@ -265,7 +266,7 @@ internal class LoadTimelineStrategy constructor(
|
||||
}
|
||||
}
|
||||
|
||||
private fun getChunkEntity(realm: Realm): RealmResults<ChunkEntity> {
|
||||
private suspend fun getChunkEntity(realm: Realm): RealmResults<ChunkEntity> {
|
||||
return when (mode) {
|
||||
is Mode.Live -> {
|
||||
ChunkEntity.where(realm, roomId)
|
||||
@ -289,8 +290,8 @@ internal class LoadTimelineStrategy constructor(
|
||||
* Clear any existing thread chunk entity and create a new one, with the
|
||||
* rootThreadEventId included.
|
||||
*/
|
||||
private fun recreateThreadChunkEntity(realm: Realm, rootThreadEventId: String) {
|
||||
realm.executeTransaction {
|
||||
private suspend fun recreateThreadChunkEntity(realm: Realm, rootThreadEventId: String) {
|
||||
realm.executeTransactionAwait {
|
||||
// Lets delete the chunk and start a new one
|
||||
ChunkEntity.findLastForwardChunkOfThread(it, roomId, rootThreadEventId)?.deleteAndClearThreadEvents()?.let {
|
||||
Timber.i("###THREADS LoadTimelineStrategy [onStart] thread chunk cleared..")
|
||||
@ -309,8 +310,8 @@ internal class LoadTimelineStrategy constructor(
|
||||
/**
|
||||
* Clear any existing thread chunk.
|
||||
*/
|
||||
private fun clearThreadChunkEntity(realm: Realm, rootThreadEventId: String) {
|
||||
realm.executeTransaction {
|
||||
private suspend fun clearThreadChunkEntity(realm: Realm, rootThreadEventId: String) {
|
||||
realm.executeTransactionAwait {
|
||||
ChunkEntity.findLastForwardChunkOfThread(it, roomId, rootThreadEventId)?.deleteAndClearThreadEvents()?.let {
|
||||
Timber.i("###THREADS LoadTimelineStrategy [onStop] thread chunk cleared..")
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user