Merge branch 'develop' into feature/valere/timeline_active_call_rendering

This commit is contained in:
Valere
2026-07-15 16:22:26 +02:00
4 changed files with 23 additions and 5 deletions
@@ -15,7 +15,7 @@ import io.element.android.libraries.matrix.api.MatrixClient
@ContributesBinding(AppScope::class) @ContributesBinding(AppScope::class)
class DefaultSessionGraphFactory( class DefaultSessionGraphFactory(
private val appGraph: AppGraph private val appGraph: AppGraph,
) : SessionGraphFactory { ) : SessionGraphFactory {
override fun create(client: MatrixClient): Any { override fun create(client: MatrixClient): Any {
return appGraph.sessionGraphFactory.create(client) return appGraph.sessionGraphFactory.create(client)
+2 -2
View File
@@ -32,7 +32,7 @@ accompanist = "0.37.3"
# Test # Test
test_core = "1.7.0" test_core = "1.7.0"
roborazzi = "1.64.0" roborazzi = "1.67.0"
# Jetbrain # Jetbrain
datetime = "0.8.0" datetime = "0.8.0"
@@ -185,7 +185,7 @@ test_detekt_test = { module = "io.gitlab.arturbosch.detekt:detekt-test", version
# https://github.com/matrix-org/matrix-rust-components-kotlin/commits/main/sdk/sdk-android/src/main/kotlin/org/matrix/rustcomponents/sdk/matrix_sdk_ffi.kt # https://github.com/matrix-org/matrix-rust-components-kotlin/commits/main/sdk/sdk-android/src/main/kotlin/org/matrix/rustcomponents/sdk/matrix_sdk_ffi.kt
# All new features should not be implemented in the pull request that upgrades the version, developers should # All new features should not be implemented in the pull request that upgrades the version, developers should
# only fix API breaks and may add some TODOs. # only fix API breaks and may add some TODOs.
matrix_sdk = "org.matrix.rustcomponents:sdk-android:26.07.13" matrix_sdk = "org.matrix.rustcomponents:sdk-android:26.07.15"
# Others # Others
coil = { module = "io.coil-kt.coil3:coil", version.ref = "coil" } coil = { module = "io.coil-kt.coil3:coil", version.ref = "coil" }
@@ -12,6 +12,8 @@ import io.element.android.libraries.matrix.api.core.UserId
import org.matrix.rustcomponents.sdk.MembershipState import org.matrix.rustcomponents.sdk.MembershipState
import org.matrix.rustcomponents.sdk.PowerLevel import org.matrix.rustcomponents.sdk.PowerLevel
import org.matrix.rustcomponents.sdk.RoomMember import org.matrix.rustcomponents.sdk.RoomMember
import org.matrix.rustcomponents.sdk.UserCall
import org.matrix.rustcomponents.sdk.UserStatus
import uniffi.matrix_sdk.RoomMemberRole import uniffi.matrix_sdk.RoomMemberRole
internal fun aRustRoomMember( internal fun aRustRoomMember(
@@ -25,6 +27,8 @@ internal fun aRustRoomMember(
role: RoomMemberRole = RoomMemberRole.USER, role: RoomMemberRole = RoomMemberRole.USER,
membershipChangeReason: String? = null, membershipChangeReason: String? = null,
isServiceMember: Boolean = false, isServiceMember: Boolean = false,
status: UserStatus? = null,
call: UserCall? = null,
) = RoomMember( ) = RoomMember(
userId = userId.value, userId = userId.value,
displayName = displayName, displayName = displayName,
@@ -36,4 +40,6 @@ internal fun aRustRoomMember(
suggestedRoleForPowerLevel = role, suggestedRoleForPowerLevel = role,
membershipChangeReason = membershipChangeReason, membershipChangeReason = membershipChangeReason,
isServiceMember = isServiceMember, isServiceMember = isServiceMember,
status = status,
call = call,
) )
@@ -105,13 +105,21 @@ class NotificationBroadcastReceiverHandler(
@Suppress("unused") @Suppress("unused")
private fun handleMarkAsRead(sessionId: SessionId, roomId: RoomId, threadId: ThreadId?) = appCoroutineScope.launch { private fun handleMarkAsRead(sessionId: SessionId, roomId: RoomId, threadId: ThreadId?) = appCoroutineScope.launch {
val client = matrixClientProvider.getOrRestore(sessionId).getOrNull() ?: return@launch val client = matrixClientProvider.getOrRestore(sessionId).getOrNull() ?: return@launch
val isSendPublicReadReceiptsEnabled = sessionPreferencesStore.get(sessionId, this).isSendPublicReadReceiptsEnabled().first() val isSendPublicReadReceiptsEnabled = sessionPreferencesStore.get(
sessionId = sessionId,
// Make sure `sessionCoroutineScope` is used here, otherwise we'll have several instances using different coroutines,
// and it will not work as expected.
sessionCoroutineScope = client.sessionCoroutineScope,
).isSendPublicReadReceiptsEnabled().first()
val receiptType = if (isSendPublicReadReceiptsEnabled) { val receiptType = if (isSendPublicReadReceiptsEnabled) {
ReceiptType.READ ReceiptType.READ
} else { } else {
ReceiptType.READ_PRIVATE ReceiptType.READ_PRIVATE
} }
val room = client.getJoinedRoom(roomId) ?: return@launch
val (room, needsDestroy) = activeRoomsHolder.getActiveRoomMatching(sessionId, roomId)?.let { it to false }
?: client.getJoinedRoom(roomId)?.let { it to true }
?: return@launch
val timeline = if (threadId != null) { val timeline = if (threadId != null) {
room.createTimeline(CreateTimelineParams.Threaded(threadId)).getOrNull() room.createTimeline(CreateTimelineParams.Threaded(threadId)).getOrNull()
} else { } else {
@@ -131,6 +139,10 @@ class NotificationBroadcastReceiverHandler(
if (timeline?.mode != Timeline.Mode.Live) { if (timeline?.mode != Timeline.Mode.Live) {
timeline?.close() timeline?.close()
} }
if (needsDestroy) {
room.destroy()
}
} }
private fun handleSmartReply( private fun handleSmartReply(