feat(security&privacy) : introduce permissions and use in RoomDetails
This commit is contained in:
parent
be199e25ff
commit
19d273ddc4
5 changed files with 62 additions and 4 deletions
|
|
@ -24,6 +24,7 @@ import io.element.android.features.leaveroom.api.LeaveRoomState
|
||||||
import io.element.android.features.messages.api.pinned.IsPinnedMessagesFeatureEnabled
|
import io.element.android.features.messages.api.pinned.IsPinnedMessagesFeatureEnabled
|
||||||
import io.element.android.features.roomcall.api.RoomCallState
|
import io.element.android.features.roomcall.api.RoomCallState
|
||||||
import io.element.android.features.roomdetails.impl.members.details.RoomMemberDetailsPresenter
|
import io.element.android.features.roomdetails.impl.members.details.RoomMemberDetailsPresenter
|
||||||
|
import io.element.android.features.roomdetails.impl.securityandprivacy.permissions.securityAndPrivacyPermissionsAsState
|
||||||
import io.element.android.libraries.architecture.Presenter
|
import io.element.android.libraries.architecture.Presenter
|
||||||
import io.element.android.libraries.core.bool.orFalse
|
import io.element.android.libraries.core.bool.orFalse
|
||||||
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
|
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
|
||||||
|
|
@ -147,6 +148,8 @@ class RoomDetailsPresenter @Inject constructor(
|
||||||
|
|
||||||
val roomMemberDetailsState = roomMemberDetailsPresenter?.present()
|
val roomMemberDetailsState = roomMemberDetailsPresenter?.present()
|
||||||
|
|
||||||
|
val securityAndPrivacyPermissions by room.securityAndPrivacyPermissionsAsState(syncUpdateFlow.value)
|
||||||
|
|
||||||
return RoomDetailsState(
|
return RoomDetailsState(
|
||||||
roomId = room.roomId,
|
roomId = room.roomId,
|
||||||
roomName = roomName,
|
roomName = roomName,
|
||||||
|
|
@ -172,6 +175,7 @@ class RoomDetailsPresenter @Inject constructor(
|
||||||
pinnedMessagesCount = pinnedMessagesCount,
|
pinnedMessagesCount = pinnedMessagesCount,
|
||||||
canShowKnockRequests = canShowKnockRequests,
|
canShowKnockRequests = canShowKnockRequests,
|
||||||
knockRequestsCount = knockRequestsCount,
|
knockRequestsCount = knockRequestsCount,
|
||||||
|
canShowSecurityAndPrivacy = securityAndPrivacyPermissions.hasAny,
|
||||||
eventSink = ::handleEvents,
|
eventSink = ::handleEvents,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,7 @@ data class RoomDetailsState(
|
||||||
val pinnedMessagesCount: Int?,
|
val pinnedMessagesCount: Int?,
|
||||||
val canShowKnockRequests: Boolean,
|
val canShowKnockRequests: Boolean,
|
||||||
val knockRequestsCount: Int?,
|
val knockRequestsCount: Int?,
|
||||||
|
val canShowSecurityAndPrivacy: Boolean,
|
||||||
val eventSink: (RoomDetailsEvent) -> Unit
|
val eventSink: (RoomDetailsEvent) -> Unit
|
||||||
) {
|
) {
|
||||||
val roomBadges = buildList {
|
val roomBadges = buildList {
|
||||||
|
|
|
||||||
|
|
@ -107,6 +107,7 @@ fun aRoomDetailsState(
|
||||||
pinnedMessagesCount: Int? = null,
|
pinnedMessagesCount: Int? = null,
|
||||||
canShowKnockRequests: Boolean = false,
|
canShowKnockRequests: Boolean = false,
|
||||||
knockRequestsCount: Int? = null,
|
knockRequestsCount: Int? = null,
|
||||||
|
canShowSecurityAndPrivacy: Boolean = true,
|
||||||
eventSink: (RoomDetailsEvent) -> Unit = {},
|
eventSink: (RoomDetailsEvent) -> Unit = {},
|
||||||
) = RoomDetailsState(
|
) = RoomDetailsState(
|
||||||
roomId = roomId,
|
roomId = roomId,
|
||||||
|
|
@ -133,6 +134,7 @@ fun aRoomDetailsState(
|
||||||
pinnedMessagesCount = pinnedMessagesCount,
|
pinnedMessagesCount = pinnedMessagesCount,
|
||||||
canShowKnockRequests = canShowKnockRequests,
|
canShowKnockRequests = canShowKnockRequests,
|
||||||
knockRequestsCount = knockRequestsCount,
|
knockRequestsCount = knockRequestsCount,
|
||||||
|
canShowSecurityAndPrivacy = canShowSecurityAndPrivacy,
|
||||||
eventSink = eventSink
|
eventSink = eventSink
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -183,10 +183,11 @@ fun RoomDetailsView(
|
||||||
state.eventSink(RoomDetailsEvent.SetFavorite(it))
|
state.eventSink(RoomDetailsEvent.SetFavorite(it))
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
if (state.canShowSecurityAndPrivacy) {
|
||||||
SecurityAndPrivacyItem(
|
SecurityAndPrivacyItem(
|
||||||
onClick = onSecurityAndPrivacyClick
|
onClick = onSecurityAndPrivacyClick
|
||||||
)
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state.roomType is RoomDetailsType.Room) {
|
if (state.roomType is RoomDetailsType.Room) {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,50 @@
|
||||||
|
/*
|
||||||
|
* 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.features.roomdetails.impl.securityandprivacy.permissions
|
||||||
|
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.State
|
||||||
|
import androidx.compose.runtime.produceState
|
||||||
|
import io.element.android.features.roomdetails.impl.securityandprivacy.permissions.SecurityAndPrivacyPermissions.Companion.DEFAULT
|
||||||
|
import io.element.android.libraries.matrix.api.room.MatrixRoom
|
||||||
|
import io.element.android.libraries.matrix.api.room.StateEventType
|
||||||
|
import io.element.android.libraries.matrix.api.room.powerlevels.canSendState
|
||||||
|
|
||||||
|
data class SecurityAndPrivacyPermissions(
|
||||||
|
val canChangeRoomAccess: Boolean,
|
||||||
|
val canChangeHistoryVisibility: Boolean,
|
||||||
|
val canChangeEncryption: Boolean,
|
||||||
|
val canChangeRoomVisibility: Boolean,
|
||||||
|
) {
|
||||||
|
val hasAny = canChangeRoomAccess ||
|
||||||
|
canChangeHistoryVisibility ||
|
||||||
|
canChangeEncryption ||
|
||||||
|
canChangeRoomVisibility
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
val DEFAULT = SecurityAndPrivacyPermissions(
|
||||||
|
canChangeRoomAccess = false,
|
||||||
|
canChangeHistoryVisibility = false,
|
||||||
|
canChangeEncryption = false,
|
||||||
|
canChangeRoomVisibility = false,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun MatrixRoom.securityAndPrivacyPermissionsAsState(updateKey: Long): State<SecurityAndPrivacyPermissions> {
|
||||||
|
return produceState(DEFAULT, key1 = updateKey) {
|
||||||
|
value = SecurityAndPrivacyPermissions(
|
||||||
|
canChangeRoomAccess = canSendState(type = StateEventType.ROOM_JOIN_RULES).getOrElse { false },
|
||||||
|
canChangeHistoryVisibility = canSendState(type = StateEventType.ROOM_HISTORY_VISIBILITY).getOrElse { false },
|
||||||
|
canChangeEncryption = canSendState(type = StateEventType.ROOM_ENCRYPTION).getOrElse { false },
|
||||||
|
canChangeRoomVisibility = canSendState(type = StateEventType.ROOM_CANONICAL_ALIAS).getOrElse { false },
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue