@@ -102,11 +102,11 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle
102102 data class LEFT (val data : Map <String , RoomSync >) : HandlingStrategy()
103103 }
104104
105- suspend fun handle (realm : Realm ,
106- roomsSyncResponse : RoomsSyncResponse ,
107- isInitialSync : Boolean ,
108- aggregator : SyncResponsePostTreatmentAggregator ,
109- reporter : ProgressReporter ? = null) {
105+ fun handle (realm : Realm ,
106+ roomsSyncResponse : RoomsSyncResponse ,
107+ isInitialSync : Boolean ,
108+ aggregator : SyncResponsePostTreatmentAggregator ,
109+ reporter : ProgressReporter ? = null) {
110110 handleRoomSync(realm, HandlingStrategy .JOINED (roomsSyncResponse.join), isInitialSync, aggregator, reporter)
111111 handleRoomSync(realm, HandlingStrategy .INVITED (roomsSyncResponse.invite), isInitialSync, aggregator, reporter)
112112 handleRoomSync(realm, HandlingStrategy .LEFT (roomsSyncResponse.leave), isInitialSync, aggregator, reporter)
@@ -120,11 +120,11 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle
120120 }
121121 // PRIVATE METHODS *****************************************************************************
122122
123- private suspend fun handleRoomSync (realm : Realm ,
124- handlingStrategy : HandlingStrategy ,
125- isInitialSync : Boolean ,
126- aggregator : SyncResponsePostTreatmentAggregator ,
127- reporter : ProgressReporter ? ) {
123+ private fun handleRoomSync (realm : Realm ,
124+ handlingStrategy : HandlingStrategy ,
125+ isInitialSync : Boolean ,
126+ aggregator : SyncResponsePostTreatmentAggregator ,
127+ reporter : ProgressReporter ? ) {
128128 val insertType = if (isInitialSync) {
129129 EventInsertType .INITIAL_SYNC
130130 } else {
@@ -157,11 +157,11 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle
157157 realm.insertOrUpdate(rooms)
158158 }
159159
160- private suspend fun insertJoinRoomsFromInitSync (realm : Realm ,
161- handlingStrategy : HandlingStrategy .JOINED ,
162- syncLocalTimeStampMillis : Long ,
163- aggregator : SyncResponsePostTreatmentAggregator ,
164- reporter : ProgressReporter ? ) {
160+ private fun insertJoinRoomsFromInitSync (realm : Realm ,
161+ handlingStrategy : HandlingStrategy .JOINED ,
162+ syncLocalTimeStampMillis : Long ,
163+ aggregator : SyncResponsePostTreatmentAggregator ,
164+ reporter : ProgressReporter ? ) {
165165 val bestChunkSize = computeBestChunkSize(
166166 listSize = handlingStrategy.data.keys.size,
167167 limit = (initialSyncStrategy as ? InitialSyncStrategy .Optimized )?.maxRoomsToInsert ? : Int .MAX_VALUE
@@ -199,12 +199,12 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle
199199 }
200200 }
201201
202- private suspend fun handleJoinedRoom (realm : Realm ,
203- roomId : String ,
204- roomSync : RoomSync ,
205- insertType : EventInsertType ,
206- syncLocalTimestampMillis : Long ,
207- aggregator : SyncResponsePostTreatmentAggregator ): RoomEntity {
202+ private fun handleJoinedRoom (realm : Realm ,
203+ roomId : String ,
204+ roomSync : RoomSync ,
205+ insertType : EventInsertType ,
206+ syncLocalTimestampMillis : Long ,
207+ aggregator : SyncResponsePostTreatmentAggregator ): RoomEntity {
208208 Timber .v(" Handle join sync for room $roomId " )
209209 val isInitialSync = insertType == EventInsertType .INITIAL_SYNC
210210
@@ -353,15 +353,15 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle
353353 return roomEntity
354354 }
355355
356- private suspend fun handleTimelineEvents (realm : Realm ,
357- roomId : String ,
358- roomEntity : RoomEntity ,
359- eventList : List <Event >,
360- prevToken : String? = null,
361- isLimited : Boolean = true,
362- insertType : EventInsertType ,
363- syncLocalTimestampMillis : Long ,
364- aggregator : SyncResponsePostTreatmentAggregator ): ChunkEntity {
356+ private fun handleTimelineEvents (realm : Realm ,
357+ roomId : String ,
358+ roomEntity : RoomEntity ,
359+ eventList : List <Event >,
360+ prevToken : String? = null,
361+ isLimited : Boolean = true,
362+ insertType : EventInsertType ,
363+ syncLocalTimestampMillis : Long ,
364+ aggregator : SyncResponsePostTreatmentAggregator ): ChunkEntity {
365365 val lastChunk = ChunkEntity .findLastForwardChunkOfRoom(realm, roomEntity.roomId)
366366 if (isLimited && lastChunk != null ) {
367367 lastChunk.deleteOnCascade(deleteStateEvents = false , canDeleteRoot = true )
@@ -389,8 +389,10 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle
389389 liveEventService.get().dispatchLiveEventReceived(event, roomId, isInitialSync)
390390
391391 if (event.isEncrypted() && ! isInitialSync) {
392- runBlocking {
392+ try {
393393 decryptIfNeeded(event, roomId)
394+ } catch (e: InterruptedException ) {
395+ Timber .i(" Decryption got interrupted" )
394396 }
395397 }
396398 var contentToInject: String? = null
@@ -421,7 +423,8 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle
421423 roomId = roomId,
422424 eventEntity = eventEntity,
423425 direction = PaginationDirection .FORWARDS ,
424- roomMemberContentsByUser = roomMemberContentsByUser)
426+ roomMemberContentsByUser = roomMemberContentsByUser
427+ )
425428 if (lightweightSettingsStorage.areThreadMessagesEnabled()) {
426429 eventEntity.rootThreadEventId?.let {
427430 // This is a thread event
@@ -437,7 +440,8 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle
437440 threadEventEntity = eventEntity,
438441 roomMemberContentsByUser = roomMemberContentsByUser,
439442 userId = userId,
440- roomEntity = roomEntity)
443+ roomEntity = roomEntity
444+ )
441445 }
442446 } ? : run {
443447 // This is a normal event or a root thread one
@@ -475,7 +479,8 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle
475479 roomId = roomId,
476480 realm = realm,
477481 chunkEntity = chunkEntity,
478- currentUserId = userId)
482+ currentUserId = userId
483+ )
479484 }
480485
481486 // posting new events to timeline if any is registered
@@ -505,10 +510,11 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle
505510 }
506511 }
507512
508- private suspend fun decryptIfNeeded (event : Event , roomId : String ) {
513+ private fun decryptIfNeeded (event : Event , roomId : String ) {
509514 try {
510515 // Event from sync does not have roomId, so add it to the event first
511- val result = cryptoService.decryptEvent(event.copy(roomId = roomId), " " )
516+ // note: runBlocking should be used here while we are in realm single thread executor, to avoid thread switching
517+ val result = runBlocking { cryptoService.decryptEvent(event.copy(roomId = roomId), " " ) }
512518 event.mxDecryptionResult = OlmDecryptionResult (
513519 payload = result.clearEvent,
514520 senderKey = result.senderCurve25519Key,
0 commit comments