Adapt 'change roles' screens to the new creator/owner role (#5076)

* Replace `RoomMember.Role.CREATOR` with `RoomMember.Role.Owner` - Make `RoomMember.Role` a sealed interface instead

* Adapt room member role mapping to include the power level to distinguish between admins and owners

* Use new `RoomMember.Role` sealed interface through the app

* Change how `MembersByRole` groups members to add owners to the admins section

* Adapt the `ChangeRoles` screen to the new roles:
    - Owners can't modify other owner's roles.
    - They can modify the roles of any other user, without confirmation.

* Adapt 'roles and permissions' screen:
    - Owners can't demote themselves.
    - The admin count also counts owners.

* Add more tests and screenshots

* Add owners to its own section in the 'change roles' screen

* Update screenshots

---------

Co-authored-by: ElementBot <android@element.io>
This commit is contained in:
Jorge Martin Espinosa 2025-07-29 16:07:16 +02:00 committed by GitHub
parent 4534229e84
commit 51f67741ae
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
77 changed files with 663 additions and 301 deletions

View file

@ -61,8 +61,8 @@ class RoomMemberModerationPresenterTest {
val room = aJoinedRoom(
canBan = false,
canKick = false,
myUserRole = RoomMember.Role.USER,
targetRoomMember = aRoomMember(userId = A_USER_ID, powerLevel = RoomMember.Role.USER.powerLevel)
myUserRole = RoomMember.Role.User,
targetRoomMember = aRoomMember(userId = A_USER_ID, powerLevel = RoomMember.Role.User.powerLevel)
)
createRoomMemberModerationPresenter(room = room).test {
val initialState = awaitState()
@ -81,7 +81,7 @@ class RoomMemberModerationPresenterTest {
val room = aJoinedRoom(
canBan = true,
canKick = true,
myUserRole = RoomMember.Role.ADMIN,
myUserRole = RoomMember.Role.Admin,
targetRoomMember = null
)
createRoomMemberModerationPresenter(room = room).test {
@ -103,8 +103,8 @@ class RoomMemberModerationPresenterTest {
val room = aJoinedRoom(
canBan = true,
canKick = true,
myUserRole = RoomMember.Role.ADMIN,
targetRoomMember = aRoomMember(userId = A_USER_ID, powerLevel = RoomMember.Role.USER.powerLevel)
myUserRole = RoomMember.Role.Admin,
targetRoomMember = aRoomMember(userId = A_USER_ID, powerLevel = RoomMember.Role.User.powerLevel)
)
createRoomMemberModerationPresenter(room = room).test {
val initialState = awaitState()
@ -125,8 +125,8 @@ class RoomMemberModerationPresenterTest {
val room = aJoinedRoom(
canBan = true,
canKick = true,
myUserRole = RoomMember.Role.MODERATOR,
targetRoomMember = aRoomMember(userId = A_USER_ID, powerLevel = RoomMember.Role.ADMIN.powerLevel)
myUserRole = RoomMember.Role.Moderator,
targetRoomMember = aRoomMember(userId = A_USER_ID, powerLevel = RoomMember.Role.Admin.powerLevel)
)
createRoomMemberModerationPresenter(room = room).test {
val initialState = awaitState()
@ -147,7 +147,7 @@ class RoomMemberModerationPresenterTest {
val room = aJoinedRoom(
canBan = true,
canKick = true,
myUserRole = RoomMember.Role.MODERATOR,
myUserRole = RoomMember.Role.Moderator,
targetRoomMember = aRoomMember(userId = A_USER_ID, membership = RoomMembershipState.BAN)
)
createRoomMemberModerationPresenter(room = room).test {
@ -321,7 +321,7 @@ class RoomMemberModerationPresenterTest {
private fun aJoinedRoom(
canKick: Boolean = false,
canBan: Boolean = false,
myUserRole: RoomMember.Role = RoomMember.Role.USER,
myUserRole: RoomMember.Role = RoomMember.Role.User,
kickUserResult: Result<Unit> = Result.success(Unit),
banUserResult: Result<Unit> = Result.success(Unit),
unBanUserResult: Result<Unit> = Result.success(Unit),