Skip to content

Commit 8e87bf2

Browse files
authored
Use the right live timeline instance in RustRoomFactory (#4745)
1 parent e50dfa9 commit 8e87bf2

File tree

1 file changed

+30
-47
lines changed
  • libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room

1 file changed

+30
-47
lines changed

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

Lines changed: 30 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ package io.element.android.libraries.matrix.impl.room
99

1010
import io.element.android.appconfig.TimelineConfig
1111
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
12-
import io.element.android.libraries.core.data.tryOrNull
1312
import io.element.android.libraries.featureflag.api.FeatureFlagService
1413
import io.element.android.libraries.matrix.api.core.DeviceId
1514
import io.element.android.libraries.matrix.api.core.RoomId
@@ -21,6 +20,7 @@ import io.element.android.libraries.matrix.api.room.RoomMembershipObserver
2120
import io.element.android.libraries.matrix.api.roomlist.RoomListService
2221
import io.element.android.libraries.matrix.api.roomlist.awaitLoaded
2322
import io.element.android.libraries.matrix.impl.room.preview.RoomPreviewInfoMapper
23+
import io.element.android.libraries.matrix.impl.roomlist.fullRoomWithTimeline
2424
import io.element.android.libraries.matrix.impl.roomlist.roomOrNull
2525
import io.element.android.services.toolbox.api.systemclock.SystemClock
2626
import kotlinx.coroutines.CoroutineScope
@@ -30,10 +30,10 @@ import kotlinx.coroutines.sync.withLock
3030
import kotlinx.coroutines.withContext
3131
import org.matrix.rustcomponents.sdk.Client
3232
import org.matrix.rustcomponents.sdk.Membership
33+
import org.matrix.rustcomponents.sdk.Room
3334
import org.matrix.rustcomponents.sdk.RoomListItem
3435
import timber.log.Timber
3536
import java.util.concurrent.atomic.AtomicBoolean
36-
import org.matrix.rustcomponents.sdk.Room as SdkRoom
3737
import org.matrix.rustcomponents.sdk.RoomListService as InnerRoomListService
3838

3939
class RustRoomFactory(
@@ -56,11 +56,6 @@ class RustRoomFactory(
5656
private val mutex = Mutex()
5757
private val isDestroyed: AtomicBoolean = AtomicBoolean(false)
5858

59-
private data class RustRoomReferences(
60-
val roomListItem: RoomListItem,
61-
val room: SdkRoom,
62-
)
63-
6459
private val roomInfoMapper = RoomInfoMapper()
6560

6661
private val eventFilters = TimelineConfig.excludedEvents
@@ -84,17 +79,22 @@ class RustRoomFactory(
8479
Timber.d("Room factory is destroyed, returning null for $roomId")
8580
return@withContext null
8681
}
87-
val roomReferences = awaitRoomReferences(roomId) ?: return@withContext null
88-
getBaseRoom(roomReferences)
82+
val roomListItem = awaitRoomListItem(roomId) ?: return@withContext null
83+
getBaseRoom(roomListItem)
8984
}
9085
}
9186

92-
private suspend fun getBaseRoom(roomReferences: RustRoomReferences): RustBaseRoom? {
93-
val initialRoomInfo = roomReferences.room.roomInfo()
87+
private suspend fun getBaseRoom(roomListItem: RoomListItem): RustBaseRoom? {
88+
val sdkRoom = innerClient.getRoom(roomListItem.id()) ?: return null
89+
return getBaseRoom(sdkRoom)
90+
}
91+
92+
private suspend fun getBaseRoom(sdkRoom: Room): RustBaseRoom {
93+
val initialRoomInfo = sdkRoom.roomInfo()
9494
return RustBaseRoom(
9595
sessionId = sessionId,
9696
deviceId = deviceId,
97-
innerRoom = roomReferences.room,
97+
innerRoom = sdkRoom,
9898
coroutineDispatchers = dispatchers,
9999
roomSyncSubscriber = roomSyncSubscriber,
100100
roomMembershipObserver = roomMembershipObserver,
@@ -110,30 +110,26 @@ class RustRoomFactory(
110110
Timber.d("Room factory is destroyed, returning null for $roomId")
111111
return@withContext null
112112
}
113-
val roomReferences = awaitRoomReferences(roomId) ?: return@withContext null
114-
115-
if (roomReferences.room.membership() == Membership.JOINED) {
116-
val baseRoom = getBaseRoom(roomReferences) ?: return@withContext null
113+
val roomListItem = awaitRoomListItem(roomId) ?: return@withContext null
117114

115+
if (roomListItem.membership() == Membership.JOINED) {
118116
// Init the live timeline in the SDK from the RoomListItem
119-
if (!roomReferences.roomListItem.isTimelineInitialized()) {
120-
roomReferences.roomListItem.initTimeline(eventFilters, "LIVE")
121-
}
117+
val sdkRoom = roomListItem.fullRoomWithTimeline(eventFilters)
122118

123119
GetRoomResult.Joined(
124120
JoinedRustRoom(
125-
baseRoom = baseRoom,
121+
baseRoom = getBaseRoom(sdkRoom),
126122
notificationSettingsService = notificationSettingsService,
127123
roomContentForwarder = roomContentForwarder,
128-
liveInnerTimeline = roomReferences.room.timeline(),
124+
liveInnerTimeline = sdkRoom.timeline(),
129125
coroutineDispatchers = dispatchers,
130126
systemClock = systemClock,
131127
featureFlagService = featureFlagService,
132128
)
133129
)
134130
} else {
135131
val preview = try {
136-
roomReferences.roomListItem.previewRoom(via = emptyList())
132+
roomListItem.previewRoom(via = emptyList())
137133
} catch (e: Exception) {
138134
Timber.e(e, "Failed to get room preview for $roomId")
139135
return@withContext null
@@ -142,44 +138,31 @@ class RustRoomFactory(
142138
GetRoomResult.NotJoined(
143139
NotJoinedRustRoom(
144140
sessionId = sessionId,
145-
localRoom = getBaseRoom(roomReferences),
141+
localRoom = getBaseRoom(roomListItem),
146142
previewInfo = RoomPreviewInfoMapper.map(preview.info()),
147143
)
148144
)
149145
}
150146
}
151147
}
152148

153-
private fun getRoomReferences(roomId: RoomId): RustRoomReferences? {
154-
val roomListItem = innerRoomListService.roomOrNull(roomId.value)
155-
if (roomListItem == null) {
156-
Timber.d("Room not found for $roomId")
157-
return null
158-
}
159-
val room = tryOrNull {
160-
innerClient.getRoom(roomId.value)
161-
} ?: error("Failed to get room for room id: $roomId")
162-
163-
Timber.d("Got room for $roomId")
164-
return RustRoomReferences(
165-
roomListItem = roomListItem,
166-
room = room,
167-
)
168-
}
169-
170149
/**
171-
* Get the Rust room references for a room, retrying after the room list is loaded if necessary.
150+
* Get the Rust room list item for a room, retrying after the room list is loaded if necessary.
172151
*/
173-
private suspend fun awaitRoomReferences(roomId: RoomId): RustRoomReferences? {
174-
var roomReferences = getRoomReferences(roomId)
175-
176-
if (roomReferences == null) {
152+
private suspend fun awaitRoomListItem(roomId: RoomId): RoomListItem? {
153+
var roomListItem = innerRoomListService.roomOrNull(roomId.value)
154+
if (roomListItem == null) {
177155
// ... otherwise, lets wait for the SS to load all rooms and check again.
178156
roomListService.allRooms.awaitLoaded()
179-
roomReferences = getRoomReferences(roomId)
157+
roomListItem = innerRoomListService.roomOrNull(roomId.value)
158+
}
159+
160+
if (roomListItem == null) {
161+
Timber.d("Room not found for $roomId")
162+
return null
180163
}
181164

182-
return roomReferences
165+
return roomListItem
183166
}
184167
}
185168

0 commit comments

Comments
 (0)