diff --git a/features/leaveroom/impl/src/main/kotlin/io/element/android/features/leaveroom/impl/LeaveRoomPresenter.kt b/features/leaveroom/impl/src/main/kotlin/io/element/android/features/leaveroom/impl/LeaveRoomPresenter.kt index 4943e75185..915d65b71f 100644 --- a/features/leaveroom/impl/src/main/kotlin/io/element/android/features/leaveroom/impl/LeaveRoomPresenter.kt +++ b/features/leaveroom/impl/src/main/kotlin/io/element/android/features/leaveroom/impl/LeaveRoomPresenter.kt @@ -78,7 +78,8 @@ private suspend fun showLeaveRoomAlert( val roomInfo = room.roomInfoFlow.first() confirmation.value = when { roomInfo.isDm -> Dm(roomId) - !roomInfo.isPublic -> PrivateRoom(roomId) + // If unknown, assume the room is private + roomInfo.isPublic == null || roomInfo.isPublic == false -> PrivateRoom(roomId) roomInfo.joinedMembersCount == 1L -> LastUserInRoom(roomId) else -> Generic(roomId) } diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsNode.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsNode.kt index f0fa5e5c8d..8b96bcda27 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsNode.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsNode.kt @@ -59,7 +59,7 @@ class RolesAndPermissionsNode @AssistedInject constructor( lifecycleScope.launch { room.roomInfoFlow .filter { info -> - info.userPowerLevels[room.sessionId] != RoomMember.Role.ADMIN.powerLevel + info.roomPowerLevels?.users?.get(room.sessionId) != RoomMember.Role.ADMIN.powerLevel } .take(1) .onEach { navigateUp() } diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsPresenter.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsPresenter.kt index 812a9d4e1a..f2de1d2817 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsPresenter.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsPresenter.kt @@ -110,8 +110,8 @@ class RolesAndPermissionsPresenter @Inject constructor( } private fun RoomInfo.userCountWithRole(userIds: List, role: RoomMember.Role): Int { - return this.userPowerLevels.count { (userId, level) -> + return this.roomPowerLevels?.users?.count { (userId, level) -> RoomMember.Role.forPowerLevel(level) == role && userId in userIds - } + } ?: 0 } } diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/changeroles/ChangeRolesPresenter.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/changeroles/ChangeRolesPresenter.kt index 36fc5a336a..e3a173f2f2 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/changeroles/ChangeRolesPresenter.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/changeroles/ChangeRolesPresenter.kt @@ -109,7 +109,7 @@ class ChangeRolesPresenter @AssistedInject constructor( val roomInfo by room.roomInfoFlow.collectAsState() fun canChangeMemberRole(userId: UserId): Boolean { // An admin can't remove or demote another admin - val powerLevel = roomInfo.userPowerLevels[userId] ?: 0L + val powerLevel = roomInfo.roomPowerLevels?.users?.get(userId) ?: 0L return RoomMember.Role.forPowerLevel(powerLevel) != RoomMember.Role.ADMIN } diff --git a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/changeroles/ChangeRolesPresenterTest.kt b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/changeroles/ChangeRolesPresenterTest.kt index 4c56ae3cee..18ddf2ae04 100644 --- a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/changeroles/ChangeRolesPresenterTest.kt +++ b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/changeroles/ChangeRolesPresenterTest.kt @@ -16,14 +16,17 @@ import io.element.android.features.roomdetails.impl.members.aRoomMemberList import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.designsystem.theme.components.SearchBarResultState +import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.room.RoomMember import io.element.android.libraries.matrix.api.room.RoomMembersState +import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevels import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.matrix.test.A_USER_ID import io.element.android.libraries.matrix.test.A_USER_ID_2 import io.element.android.libraries.matrix.test.room.FakeBaseRoom import io.element.android.libraries.matrix.test.room.FakeJoinedRoom import io.element.android.libraries.matrix.test.room.aRoomInfo +import io.element.android.libraries.matrix.test.room.defaultRoomPowerLevelValues import io.element.android.services.analytics.test.FakeAnalyticsService import io.element.android.tests.testutils.testCoroutineDispatchers import kotlinx.collections.immutable.persistentMapOf @@ -142,7 +145,7 @@ class ChangeRolesPresenterTest { fun `present - UserSelectionToggle adds and removes users from the selected user list`() = runTest { val room = FakeJoinedRoom().apply { givenRoomMembersState(RoomMembersState.Ready(aRoomMemberList())) - givenRoomInfo(aRoomInfo(userPowerLevels = persistentMapOf(A_USER_ID to 100))) + givenRoomInfo(aRoomInfo(roomPowerLevels = roomPowerLevelsWithRole(RoomMember.Role.ADMIN))) } val presenter = createChangeRolesPresenter(room = room) moleculeFlow(RecompositionMode.Immediate) { @@ -164,7 +167,7 @@ class ChangeRolesPresenterTest { fun `present - hasPendingChanges is true when the initial selected users don't match the new ones`() = runTest { val room = FakeJoinedRoom().apply { givenRoomMembersState(RoomMembersState.Ready(aRoomMemberList())) - givenRoomInfo(aRoomInfo(userPowerLevels = persistentMapOf(A_USER_ID to 100))) + givenRoomInfo(aRoomInfo(roomPowerLevels = roomPowerLevelsWithRole(RoomMember.Role.ADMIN))) } val presenter = createChangeRolesPresenter(room = room) moleculeFlow(RecompositionMode.Immediate) { @@ -193,7 +196,7 @@ class ChangeRolesPresenterTest { fun `present - Exit will display success if no pending changes`() = runTest { val room = FakeJoinedRoom().apply { givenRoomMembersState(RoomMembersState.Ready(aRoomMemberList())) - givenRoomInfo(aRoomInfo(userPowerLevels = persistentMapOf(A_USER_ID to 100))) + givenRoomInfo(aRoomInfo(roomPowerLevels = roomPowerLevelsWithRole(RoomMember.Role.ADMIN))) } val presenter = createChangeRolesPresenter(room = room) moleculeFlow(RecompositionMode.Immediate) { @@ -213,7 +216,7 @@ class ChangeRolesPresenterTest { fun `present - CancelExit will remove exit confirmation`() = runTest { val room = FakeJoinedRoom().apply { givenRoomMembersState(RoomMembersState.Ready(aRoomMemberList())) - givenRoomInfo(aRoomInfo(userPowerLevels = persistentMapOf(A_USER_ID to 100))) + givenRoomInfo(aRoomInfo(roomPowerLevels = roomPowerLevelsWithRole(RoomMember.Role.ADMIN))) } val presenter = createChangeRolesPresenter(room = room) moleculeFlow(RecompositionMode.Immediate) { @@ -239,7 +242,7 @@ class ChangeRolesPresenterTest { fun `present - Exit will display a confirmation dialog if there are pending changes, calling it again will actually exit`() = runTest { val room = FakeJoinedRoom().apply { givenRoomMembersState(RoomMembersState.Ready(aRoomMemberList())) - givenRoomInfo(aRoomInfo(userPowerLevels = persistentMapOf(A_USER_ID to 100))) + givenRoomInfo(aRoomInfo(roomPowerLevels = roomPowerLevelsWithRole(RoomMember.Role.ADMIN))) } val presenter = createChangeRolesPresenter(room = room) moleculeFlow(RecompositionMode.Immediate) { @@ -270,7 +273,7 @@ class ChangeRolesPresenterTest { baseRoom = FakeBaseRoom(updateMembersResult = { Result.success(Unit) }), ).apply { givenRoomMembersState(RoomMembersState.Ready(aRoomMemberList())) - givenRoomInfo(aRoomInfo(userPowerLevels = persistentMapOf(A_USER_ID to 100))) + givenRoomInfo(aRoomInfo(roomPowerLevels = roomPowerLevelsWithRole(RoomMember.Role.ADMIN))) } val presenter = createChangeRolesPresenter(role = RoomMember.Role.ADMIN, room = room) moleculeFlow(RecompositionMode.Immediate) { @@ -299,7 +302,7 @@ class ChangeRolesPresenterTest { fun `present - CancelSave will remove the confirmation dialog`() = runTest { val room = FakeJoinedRoom().apply { givenRoomMembersState(RoomMembersState.Ready(aRoomMemberList())) - givenRoomInfo(aRoomInfo(userPowerLevels = persistentMapOf(A_USER_ID to 100))) + givenRoomInfo(aRoomInfo(roomPowerLevels = roomPowerLevelsWithRole(RoomMember.Role.ADMIN))) } val presenter = createChangeRolesPresenter(role = RoomMember.Role.ADMIN, room = room) moleculeFlow(RecompositionMode.Immediate) { @@ -328,7 +331,7 @@ class ChangeRolesPresenterTest { baseRoom = FakeBaseRoom(updateMembersResult = { Result.success(Unit) }), ).apply { givenRoomMembersState(RoomMembersState.Ready(aRoomMemberList())) - givenRoomInfo(aRoomInfo(userPowerLevels = persistentMapOf(A_USER_ID to 50))) + givenRoomInfo(aRoomInfo(roomPowerLevels = roomPowerLevelsWithRole(RoomMember.Role.MODERATOR))) } val presenter = createChangeRolesPresenter( role = RoomMember.Role.MODERATOR, @@ -361,7 +364,7 @@ class ChangeRolesPresenterTest { updateUserRoleResult = { Result.failure(IllegalStateException("Failed")) } ).apply { givenRoomMembersState(RoomMembersState.Ready(aRoomMemberList())) - givenRoomInfo(aRoomInfo(userPowerLevels = persistentMapOf(A_USER_ID to 50))) + givenRoomInfo(aRoomInfo(roomPowerLevels = roomPowerLevelsWithRole(RoomMember.Role.MODERATOR))) } val presenter = createChangeRolesPresenter(role = RoomMember.Role.MODERATOR, room = room) moleculeFlow(RecompositionMode.Immediate) { @@ -385,6 +388,16 @@ class ChangeRolesPresenterTest { } } + private fun roomPowerLevelsWithRole( + role: RoomMember.Role, + userId: UserId = A_USER_ID, + ): RoomPowerLevels { + return RoomPowerLevels( + values = defaultRoomPowerLevelValues(), + users = persistentMapOf(userId to role.powerLevel) + ) + } + private fun TestScope.createChangeRolesPresenter( role: RoomMember.Role = RoomMember.Role.ADMIN, room: FakeJoinedRoom = FakeJoinedRoom(), diff --git a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeBaseRoomPermissionsPresenterTest.kt b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeBaseRoomPermissionsPresenterTest.kt index cf764a39fb..70770a6c5c 100644 --- a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeBaseRoomPermissionsPresenterTest.kt +++ b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeBaseRoomPermissionsPresenterTest.kt @@ -21,7 +21,7 @@ import io.element.android.libraries.matrix.api.room.RoomMember.Role.USER import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevelsValues import io.element.android.libraries.matrix.test.room.FakeBaseRoom import io.element.android.libraries.matrix.test.room.FakeJoinedRoom -import io.element.android.libraries.matrix.test.room.defaultRoomPowerLevels +import io.element.android.libraries.matrix.test.room.defaultRoomPowerLevelValues import io.element.android.services.analytics.test.FakeAnalyticsService import kotlinx.coroutines.test.runTest import org.junit.Test @@ -296,7 +296,7 @@ class ChangeBaseRoomPermissionsPresenterTest { analyticsService = analyticsService, ) - private fun defaultPermissions() = defaultRoomPowerLevels() + private fun defaultPermissions() = defaultRoomPowerLevelValues() private suspend fun TurbineTestContext.awaitUpdatedItem(): ChangeRoomPermissionsState { skipItems(1) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 15701f17be..fba82d46cf 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -172,7 +172,7 @@ jsoup = "org.jsoup:jsoup:1.21.1" appyx_core = { module = "com.bumble.appyx:core", version.ref = "appyx" } molecule-runtime = "app.cash.molecule:molecule-runtime:2.1.0" timber = "com.jakewharton.timber:timber:5.0.1" -matrix_sdk = "org.matrix.rustcomponents:sdk-android:25.6.23" +matrix_sdk = "org.matrix.rustcomponents:sdk-android:25.6.25" matrix_richtexteditor = { module = "io.element.android:wysiwyg", version.ref = "wysiwyg" } matrix_richtexteditor_compose = { module = "io.element.android:wysiwyg-compose", version.ref = "wysiwyg" } sqldelight-driver-android = { module = "app.cash.sqldelight:android-driver", version.ref = "sqldelight" } diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/analytics/ViewRoomExt.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/analytics/ViewRoomExt.kt index 3ea1bddf40..ec5a3d8431 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/analytics/ViewRoomExt.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/analytics/ViewRoomExt.kt @@ -27,5 +27,5 @@ fun BaseRoom.toAnalyticsViewRoom( } private fun BaseRoom.toActiveSpace(): ViewRoom.ActiveSpace { - return if (info().isPublic) ViewRoom.ActiveSpace.Public else ViewRoom.ActiveSpace.Private + return if (info().isPublic == true) ViewRoom.ActiveSpace.Public else ViewRoom.ActiveSpace.Private } diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomInfo.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomInfo.kt index 13e2ed44da..261a484fd6 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomInfo.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomInfo.kt @@ -14,10 +14,10 @@ import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.room.history.RoomHistoryVisibility import io.element.android.libraries.matrix.api.room.join.JoinRule +import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevels import io.element.android.libraries.matrix.api.room.tombstone.SuccessorRoom import io.element.android.libraries.matrix.api.user.MatrixUser import kotlinx.collections.immutable.ImmutableList -import kotlinx.collections.immutable.ImmutableMap @Immutable data class RoomInfo( @@ -28,7 +28,7 @@ data class RoomInfo( val rawName: String?, val topic: String?, val avatarUrl: String?, - val isPublic: Boolean, + val isPublic: Boolean?, val isDirect: Boolean, val isEncrypted: Boolean?, val joinRule: JoinRule?, @@ -48,7 +48,7 @@ data class RoomInfo( val activeMembersCount: Long, val invitedMembersCount: Long, val joinedMembersCount: Long, - val userPowerLevels: ImmutableMap, + val roomPowerLevels: RoomPowerLevels?, val highlightCount: Long, val notificationCount: Long, val userDefinedNotificationMode: RoomNotificationMode?, diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/MatrixRoomMembersWithRole.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/MatrixRoomMembersWithRole.kt index 49bc4afcd6..eb3afaf994 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/MatrixRoomMembersWithRole.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/MatrixRoomMembersWithRole.kt @@ -22,7 +22,7 @@ import kotlinx.coroutines.flow.map */ fun BaseRoom.usersWithRole(role: RoomMember.Role): Flow> { return roomInfoFlow - .map { it.userPowerLevels.filter { (_, powerLevel) -> RoomMember.Role.forPowerLevel(powerLevel) == role } } + .map { it.roomPowerLevels?.users.orEmpty().filter { (_, powerLevel) -> RoomMember.Role.forPowerLevel(powerLevel) == role } } .combine(membersStateFlow) { powerLevels, membersState -> membersState.activeRoomMembers() .filter { powerLevels.containsKey(it.userId) } diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/RoomPowerLevels.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/RoomPowerLevels.kt new file mode 100644 index 0000000000..08f2166494 --- /dev/null +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/RoomPowerLevels.kt @@ -0,0 +1,16 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.matrix.api.room.powerlevels + +import io.element.android.libraries.matrix.api.core.UserId +import kotlinx.collections.immutable.ImmutableMap + +data class RoomPowerLevels( + val values: RoomPowerLevelsValues, + val users: ImmutableMap, +) diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/preview/RoomPreviewInfo.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/preview/RoomPreviewInfo.kt index b00d59a3f6..61de6f7d15 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/preview/RoomPreviewInfo.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/preview/RoomPreviewInfo.kt @@ -33,5 +33,5 @@ data class RoomPreviewInfo( /** the membership of the current user. */ val membership: CurrentUserMembership?, /** The room's join rule. */ - val joinRule: JoinRule, + val joinRule: JoinRule?, ) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt index 07b8b3de09..b14d7adb22 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt @@ -129,7 +129,7 @@ class RustMatrixClient( private val sessionStore: SessionStore, private val appCoroutineScope: CoroutineScope, private val sessionDelegate: RustClientSessionDelegate, - innerSyncService: ClientSyncService, + private val innerSyncService: ClientSyncService, dispatchers: CoroutineDispatchers, baseCacheDirectory: File, clock: SystemClock, @@ -531,7 +531,7 @@ class RustMatrixClient( } override suspend fun clearCache() { - innerClient.clearCaches() + innerClient.clearCaches(innerSyncService) destroy() } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt index 8261969918..c1dab6f404 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt @@ -34,6 +34,7 @@ import org.matrix.rustcomponents.sdk.SlidingSyncVersionBuilder import org.matrix.rustcomponents.sdk.use import timber.log.Timber import uniffi.matrix_sdk_crypto.CollectStrategy +import uniffi.matrix_sdk_crypto.DecryptionSettings import uniffi.matrix_sdk_crypto.TrustRequirement import java.io.File import javax.inject.Inject @@ -120,12 +121,14 @@ class RustMatrixClientFactory @Inject constructor( CollectStrategy.ERROR_ON_VERIFIED_USER_PROBLEM } ) - .roomDecryptionTrustRequirement( - trustRequirement = if (featureFlagService.isFeatureEnabled(FeatureFlags.OnlySignedDeviceIsolationMode)) { - TrustRequirement.CROSS_SIGNED_OR_LEGACY - } else { - TrustRequirement.UNTRUSTED - } + .decryptionSettings( + DecryptionSettings( + senderDeviceTrustRequirement = if (featureFlagService.isFeatureEnabled(FeatureFlags.OnlySignedDeviceIsolationMode)) { + TrustRequirement.CROSS_SIGNED_OR_LEGACY + } else { + TrustRequirement.UNTRUSTED + } + ) ) .enableShareHistoryOnInvite(featureFlagService.isFeatureEnabled(FeatureFlags.EnableKeyShareOnInvite)) .run { diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/JoinedRustRoom.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/JoinedRustRoom.kt index 153dc92274..a7dc2523ad 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/JoinedRustRoom.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/JoinedRustRoom.kt @@ -139,7 +139,7 @@ class JoinedRustRoom( } init { - val powerLevelChanges = roomInfoFlow.map { it.userPowerLevels }.distinctUntilChanged() + val powerLevelChanges = roomInfoFlow.map { it.roomPowerLevels }.distinctUntilChanged() val membershipChanges = liveTimeline.membershipChangeEventReceived.onStart { emit(Unit) } combine(membershipChanges, powerLevelChanges) { _, _ -> } // Skip initial one diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RoomInfoMapper.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RoomInfoMapper.kt index e0dec91899..5b5d1f69f0 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RoomInfoMapper.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RoomInfoMapper.kt @@ -14,12 +14,13 @@ import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.room.CurrentUserMembership import io.element.android.libraries.matrix.api.room.RoomInfo import io.element.android.libraries.matrix.api.room.RoomNotificationMode +import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevels import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.matrix.impl.room.history.map import io.element.android.libraries.matrix.impl.room.join.map import io.element.android.libraries.matrix.impl.room.member.RoomMemberMapper +import io.element.android.libraries.matrix.impl.room.powerlevels.RoomPowerLevelsValuesMapper import io.element.android.libraries.matrix.impl.room.tombstone.map -import kotlinx.collections.immutable.ImmutableMap import kotlinx.collections.immutable.toImmutableList import kotlinx.collections.immutable.toPersistentMap import org.matrix.rustcomponents.sdk.Membership @@ -28,6 +29,7 @@ import uniffi.matrix_sdk_base.EncryptionState import org.matrix.rustcomponents.sdk.Membership as RustMembership import org.matrix.rustcomponents.sdk.RoomInfo as RustRoomInfo import org.matrix.rustcomponents.sdk.RoomNotificationMode as RustRoomNotificationMode +import org.matrix.rustcomponents.sdk.RoomPowerLevels as RustRoomPowerLevels class RoomInfoMapper { fun map(rustRoomInfo: RustRoomInfo): RoomInfo = rustRoomInfo.let { @@ -55,7 +57,7 @@ class RoomInfoMapper { activeMembersCount = it.activeMembersCount.toLong(), invitedMembersCount = it.invitedMembersCount.toLong(), joinedMembersCount = it.joinedMembersCount.toLong(), - userPowerLevels = mapPowerLevels(it.userPowerLevels), + roomPowerLevels = it.powerLevels?.let(::mapPowerLevels), highlightCount = it.highlightCount.toLong(), notificationCount = it.notificationCount.toLong(), userDefinedNotificationMode = it.cachedUserDefinedNotificationMode?.map(), @@ -96,6 +98,9 @@ fun RoomHero.map(): MatrixUser = MatrixUser( avatarUrl = avatarUrl ) -fun mapPowerLevels(powerLevels: Map): ImmutableMap { - return powerLevels.mapKeys { (key, _) -> UserId(key) }.toPersistentMap() +fun mapPowerLevels(roomPowerLevels: RustRoomPowerLevels): RoomPowerLevels { + return RoomPowerLevels( + values = RoomPowerLevelsValuesMapper.map(roomPowerLevels.values()), + users = roomPowerLevels.userPowerLevels().mapKeys { (key, _) -> UserId(key) }.toPersistentMap() + ) } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/preview/RoomPreviewInfoMapper.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/preview/RoomPreviewInfoMapper.kt index fd21548224..cb1867ec8e 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/preview/RoomPreviewInfoMapper.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/preview/RoomPreviewInfoMapper.kt @@ -27,7 +27,7 @@ object RoomPreviewInfoMapper { roomType = info.roomType.map(), isHistoryWorldReadable = info.isHistoryWorldReadable.orFalse(), membership = info.membership?.map(), - joinRule = info.joinRule.map(), + joinRule = info.joinRule?.map(), ) } } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/widget/DefaultCallWidgetSettingsProvider.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/widget/DefaultCallWidgetSettingsProvider.kt index eed81c2dcb..2b166a5dde 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/widget/DefaultCallWidgetSettingsProvider.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/widget/DefaultCallWidgetSettingsProvider.kt @@ -16,11 +16,11 @@ import io.element.android.libraries.matrix.api.widget.CallWidgetSettingsProvider import io.element.android.libraries.matrix.api.widget.MatrixWidgetSettings import io.element.android.services.analytics.api.AnalyticsService import kotlinx.coroutines.flow.first -import org.matrix.rustcomponents.sdk.EncryptionSystem -import org.matrix.rustcomponents.sdk.VirtualElementCallWidgetOptions import org.matrix.rustcomponents.sdk.newVirtualElementCallWidget +import uniffi.matrix_sdk.EncryptionSystem +import uniffi.matrix_sdk.VirtualElementCallWidgetOptions import javax.inject.Inject -import org.matrix.rustcomponents.sdk.Intent as CallIntent +import uniffi.matrix_sdk.Intent as CallIntent @ContributesBinding(AppScope::class) class DefaultCallWidgetSettingsProvider @Inject constructor( @@ -50,6 +50,7 @@ class DefaultCallWidgetSettingsProvider @Inject constructor( parentUrl = null, hideHeader = true, controlledMediaDevices = true, + header = null, ) val rustWidgetSettings = newVirtualElementCallWidget(options) return MatrixWidgetSettings.fromRustWidgetSettings(rustWidgetSettings) diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/NotificationItem.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/NotificationItem.kt index 1c966cc047..797958e151 100644 --- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/NotificationItem.kt +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/NotificationItem.kt @@ -52,7 +52,6 @@ fun aRustNotificationRoomInfo( isEncrypted: Boolean? = true, isDirect: Boolean = false, joinRule: JoinRule? = null, - isPublic: Boolean = true, ) = NotificationRoomInfo( displayName = displayName, avatarUrl = avatarUrl, @@ -61,7 +60,6 @@ fun aRustNotificationRoomInfo( isEncrypted = isEncrypted, isDirect = isDirect, joinRule = joinRule, - isPublic = isPublic, ) fun aRustNotificationEventTimeline( diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/RoomInfo.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/RoomInfo.kt index 45b67cc38a..9ba3c100a7 100644 --- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/RoomInfo.kt +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/RoomInfo.kt @@ -8,6 +8,7 @@ package io.element.android.libraries.matrix.impl.fixtures.factories import io.element.android.libraries.matrix.api.core.UserId +import io.element.android.libraries.matrix.impl.fixtures.fakes.FakeFfiRoomPowerLevels import io.element.android.libraries.matrix.test.A_ROOM_ID import io.element.android.libraries.matrix.test.A_ROOM_NAME import org.matrix.rustcomponents.sdk.JoinRule @@ -17,6 +18,7 @@ import org.matrix.rustcomponents.sdk.RoomHistoryVisibility import org.matrix.rustcomponents.sdk.RoomInfo import org.matrix.rustcomponents.sdk.RoomMember import org.matrix.rustcomponents.sdk.RoomNotificationMode +import org.matrix.rustcomponents.sdk.RoomPowerLevels import org.matrix.rustcomponents.sdk.SuccessorRoom import uniffi.matrix_sdk_base.EncryptionState @@ -39,7 +41,7 @@ fun aRustRoomInfo( activeMembersCount: ULong = 0uL, invitedMembersCount: ULong = 0uL, joinedMembersCount: ULong = 0uL, - userPowerLevels: Map = mapOf(), + roomPowerLevels: RoomPowerLevels = FakeFfiRoomPowerLevels(), highlightCount: ULong = 0uL, notificationCount: ULong = 0uL, userDefinedNotificationMode: RoomNotificationMode? = null, @@ -73,7 +75,7 @@ fun aRustRoomInfo( activeMembersCount = activeMembersCount, invitedMembersCount = invitedMembersCount, joinedMembersCount = joinedMembersCount, - userPowerLevels = userPowerLevels, + powerLevels = roomPowerLevels, highlightCount = highlightCount, notificationCount = notificationCount, cachedUserDefinedNotificationMode = userDefinedNotificationMode, diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiClient.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiClient.kt index 5c299f1adf..8e88fa78fe 100644 --- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiClient.kt +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiClient.kt @@ -25,6 +25,7 @@ import org.matrix.rustcomponents.sdk.PusherKind import org.matrix.rustcomponents.sdk.RoomDirectorySearch import org.matrix.rustcomponents.sdk.Session import org.matrix.rustcomponents.sdk.SessionVerificationController +import org.matrix.rustcomponents.sdk.SyncService import org.matrix.rustcomponents.sdk.SyncServiceBuilder import org.matrix.rustcomponents.sdk.TaskHandle import org.matrix.rustcomponents.sdk.UnableToDecryptDelegate @@ -62,7 +63,7 @@ class FakeFfiClient( ) = Unit override suspend fun deletePusher(identifiers: PusherIdentifiers) = Unit - override suspend fun clearCaches() = simulateLongTask { clearCachesResult() } + override suspend fun clearCaches(syncService: SyncService?) = simulateLongTask { clearCachesResult() } override suspend fun setUtdDelegate(utdDelegate: UnableToDecryptDelegate) = withUtdHook(utdDelegate) override suspend fun getSessionVerificationController(): SessionVerificationController = FakeFfiSessionVerificationController() override suspend fun ignoredUsers(): List { diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiClientBuilder.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiClientBuilder.kt index 68e9946cb4..3ddb8c2cee 100644 --- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiClientBuilder.kt +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiClientBuilder.kt @@ -18,7 +18,7 @@ import org.matrix.rustcomponents.sdk.RequestConfig import org.matrix.rustcomponents.sdk.SlidingSyncVersionBuilder import uniffi.matrix_sdk.BackupDownloadStrategy import uniffi.matrix_sdk_crypto.CollectStrategy -import uniffi.matrix_sdk_crypto.TrustRequirement +import uniffi.matrix_sdk_crypto.DecryptionSettings class FakeFfiClientBuilder : ClientBuilder(NoPointer) { override fun addRootCertificates(certificates: List) = this @@ -27,7 +27,7 @@ class FakeFfiClientBuilder : ClientBuilder(NoPointer) { override fun backupDownloadStrategy(backupDownloadStrategy: BackupDownloadStrategy) = this override fun disableAutomaticTokenRefresh() = this override fun disableBuiltInRootCertificates() = this - override fun roomDecryptionTrustRequirement(trustRequirement: TrustRequirement) = this + override fun decryptionSettings(decryptionSettings: DecryptionSettings): ClientBuilder = this override fun disableSslVerification() = this override fun homeserverUrl(url: String) = this override fun sessionPassphrase(passphrase: String?) = this diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiRoomPowerLevels.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiRoomPowerLevels.kt new file mode 100644 index 0000000000..32e7dc891d --- /dev/null +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiRoomPowerLevels.kt @@ -0,0 +1,33 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.matrix.impl.fixtures.fakes + +import org.matrix.rustcomponents.sdk.NoPointer +import org.matrix.rustcomponents.sdk.RoomPowerLevels +import org.matrix.rustcomponents.sdk.RoomPowerLevelsValues + +class FakeFfiRoomPowerLevels( + private val values: RoomPowerLevelsValues = defaultFfiRoomPowerLevelValues(), + private val users: Map = emptyMap(), +) : RoomPowerLevels(NoPointer) { + override fun values(): RoomPowerLevelsValues = values + override fun userPowerLevels(): Map = users +} + +fun defaultFfiRoomPowerLevelValues() = RoomPowerLevelsValues( + ban = 50, + invite = 0, + kick = 50, + eventsDefault = 0, + redact = 50, + roomName = 100, + roomAvatar = 100, + roomTopic = 100, + stateDefault = 0, + usersDefault = 0, +) diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/RoomInfoMapperTest.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/RoomInfoMapperTest.kt index c7e2ced273..7140a90dc4 100644 --- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/RoomInfoMapperTest.kt +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/RoomInfoMapperTest.kt @@ -16,10 +16,12 @@ import io.element.android.libraries.matrix.api.room.RoomInfo import io.element.android.libraries.matrix.api.room.RoomNotificationMode import io.element.android.libraries.matrix.api.room.history.RoomHistoryVisibility import io.element.android.libraries.matrix.api.room.join.JoinRule +import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevels import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.matrix.impl.fixtures.factories.aRustRoomHero import io.element.android.libraries.matrix.impl.fixtures.factories.aRustRoomInfo import io.element.android.libraries.matrix.impl.fixtures.factories.aRustRoomMember +import io.element.android.libraries.matrix.impl.fixtures.fakes.FakeFfiRoomPowerLevels import io.element.android.libraries.matrix.test.AN_AVATAR_URL import io.element.android.libraries.matrix.test.AN_EVENT_ID import io.element.android.libraries.matrix.test.A_ROOM_ALIAS @@ -28,8 +30,9 @@ import io.element.android.libraries.matrix.test.A_USER_ID import io.element.android.libraries.matrix.test.A_USER_ID_3 import io.element.android.libraries.matrix.test.A_USER_ID_6 import io.element.android.libraries.matrix.test.room.aRoomMember +import io.element.android.libraries.matrix.test.room.defaultRoomPowerLevelValues +import kotlinx.collections.immutable.persistentMapOf import kotlinx.collections.immutable.toImmutableList -import kotlinx.collections.immutable.toImmutableMap import kotlinx.collections.immutable.toPersistentList import org.junit.Test import org.matrix.rustcomponents.sdk.Membership @@ -64,7 +67,7 @@ class RoomInfoMapperTest { activeMembersCount = 2uL, invitedMembersCount = 3uL, joinedMembersCount = 4uL, - userPowerLevels = mapOf(A_USER_ID_6.value to 50L), + roomPowerLevels = FakeFfiRoomPowerLevels(users = mapOf(A_USER_ID_6.value to 50L)), highlightCount = 10uL, notificationCount = 11uL, userDefinedNotificationMode = RustRoomNotificationMode.MUTE, @@ -99,7 +102,10 @@ class RoomInfoMapperTest { activeMembersCount = 2L, invitedMembersCount = 3L, joinedMembersCount = 4L, - userPowerLevels = mapOf(A_USER_ID_6 to 50L).toImmutableMap(), + roomPowerLevels = RoomPowerLevels( + values = defaultRoomPowerLevelValues(), + users = persistentMapOf(A_USER_ID_6 to 50L) + ), highlightCount = 10L, notificationCount = 11L, userDefinedNotificationMode = RoomNotificationMode.MUTE, @@ -149,7 +155,7 @@ class RoomInfoMapperTest { activeMembersCount = 2uL, invitedMembersCount = 3uL, joinedMembersCount = 4uL, - userPowerLevels = emptyMap(), + roomPowerLevels = FakeFfiRoomPowerLevels(), highlightCount = 10uL, notificationCount = 11uL, userDefinedNotificationMode = null, @@ -184,7 +190,10 @@ class RoomInfoMapperTest { activeMembersCount = 2L, invitedMembersCount = 3L, joinedMembersCount = 4L, - userPowerLevels = emptyMap().toImmutableMap(), + roomPowerLevels = RoomPowerLevels( + values = defaultRoomPowerLevelValues(), + users = persistentMapOf(), + ), highlightCount = 10L, notificationCount = 11L, userDefinedNotificationMode = null, diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeBaseRoom.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeBaseRoom.kt index c74635d1f9..872481a860 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeBaseRoom.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeBaseRoom.kt @@ -225,7 +225,7 @@ class FakeBaseRoom( override fun predecessorRoom(): PredecessorRoom? = predecessorRoomResult() } -fun defaultRoomPowerLevels() = RoomPowerLevelsValues( +fun defaultRoomPowerLevelValues() = RoomPowerLevelsValues( ban = 50, invite = 0, kick = 50, diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/RoomInfoFixture.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/RoomInfoFixture.kt index 0fc88d1d81..d7f9ccd6be 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/RoomInfoFixture.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/RoomInfoFixture.kt @@ -17,6 +17,7 @@ import io.element.android.libraries.matrix.api.room.RoomMember import io.element.android.libraries.matrix.api.room.RoomNotificationMode import io.element.android.libraries.matrix.api.room.history.RoomHistoryVisibility import io.element.android.libraries.matrix.api.room.join.JoinRule +import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevels import io.element.android.libraries.matrix.api.room.tombstone.SuccessorRoom import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.matrix.test.AN_AVATAR_URL @@ -24,7 +25,6 @@ import io.element.android.libraries.matrix.test.A_ROOM_ID import io.element.android.libraries.matrix.test.A_ROOM_NAME import io.element.android.libraries.matrix.test.A_ROOM_RAW_NAME import io.element.android.libraries.matrix.test.A_ROOM_TOPIC -import kotlinx.collections.immutable.ImmutableMap import kotlinx.collections.immutable.persistentMapOf import kotlinx.collections.immutable.toImmutableList @@ -52,7 +52,10 @@ fun aRoomInfo( notificationCount: Long = 0, userDefinedNotificationMode: RoomNotificationMode? = null, hasRoomCall: Boolean = false, - userPowerLevels: ImmutableMap = persistentMapOf(), + roomPowerLevels: RoomPowerLevels = RoomPowerLevels( + values = defaultRoomPowerLevelValues(), + users = persistentMapOf(), + ), activeRoomCallParticipants: List = emptyList(), heroes: List = emptyList(), pinnedEventIds: List = emptyList(), @@ -86,7 +89,7 @@ fun aRoomInfo( notificationCount = notificationCount, userDefinedNotificationMode = userDefinedNotificationMode, hasRoomCall = hasRoomCall, - userPowerLevels = userPowerLevels, + roomPowerLevels = roomPowerLevels, activeRoomCallParticipants = activeRoomCallParticipants.toImmutableList(), heroes = heroes.toImmutableList(), pinnedEventIds = pinnedEventIds.toImmutableList(), diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/RoomSummaryFixture.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/RoomSummaryFixture.kt index 27302a2d87..aab27e8a11 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/RoomSummaryFixture.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/RoomSummaryFixture.kt @@ -18,6 +18,7 @@ import io.element.android.libraries.matrix.api.room.RoomNotificationMode import io.element.android.libraries.matrix.api.room.history.RoomHistoryVisibility import io.element.android.libraries.matrix.api.room.join.JoinRule import io.element.android.libraries.matrix.api.room.message.RoomMessage +import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevels import io.element.android.libraries.matrix.api.room.tombstone.SuccessorRoom import io.element.android.libraries.matrix.api.roomlist.RoomSummary import io.element.android.libraries.matrix.api.timeline.item.event.EventTimelineItem @@ -29,7 +30,6 @@ import io.element.android.libraries.matrix.test.A_ROOM_RAW_NAME import io.element.android.libraries.matrix.test.A_ROOM_TOPIC import io.element.android.libraries.matrix.test.A_USER_ID import io.element.android.libraries.matrix.test.timeline.anEventTimelineItem -import kotlinx.collections.immutable.ImmutableMap import kotlinx.collections.immutable.persistentMapOf import kotlinx.collections.immutable.toPersistentList @@ -65,7 +65,10 @@ fun aRoomSummary( notificationCount: Long = 0, userDefinedNotificationMode: RoomNotificationMode? = null, hasRoomCall: Boolean = false, - userPowerLevels: ImmutableMap = persistentMapOf(), + roomPowerLevels: RoomPowerLevels = RoomPowerLevels( + values = defaultRoomPowerLevelValues(), + users = persistentMapOf(), + ), activeRoomCallParticipants: List = emptyList(), heroes: List = emptyList(), pinnedEventIds: List = emptyList(), @@ -97,7 +100,7 @@ fun aRoomSummary( activeMembersCount = activeMembersCount, invitedMembersCount = invitedMembersCount, joinedMembersCount = joinedMembersCount, - userPowerLevels = userPowerLevels, + roomPowerLevels = roomPowerLevels, highlightCount = highlightCount, notificationCount = notificationCount, userDefinedNotificationMode = userDefinedNotificationMode, diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/room/MatrixRoomState.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/room/MatrixRoomState.kt index ba32d01e8a..0080eea700 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/room/MatrixRoomState.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/room/MatrixRoomState.kt @@ -106,7 +106,7 @@ fun BaseRoom.userPowerLevelAsState(updateKey: Long): State { @Composable fun BaseRoom.isOwnUserAdmin(): Boolean { val roomInfo by roomInfoFlow.collectAsState() - val powerLevel = roomInfo.userPowerLevels[sessionId] ?: 0L + val powerLevel = roomInfo.roomPowerLevels?.users?.get(sessionId) ?: 0L return RoomMember.Role.forPowerLevel(powerLevel) == RoomMember.Role.ADMIN }