diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/permissions/RoomPermissionsAction.kt b/vector/src/main/java/im/vector/app/features/roomprofile/permissions/RoomPermissionsAction.kt index 32d9236fb6..b853dda160 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/permissions/RoomPermissionsAction.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/permissions/RoomPermissionsAction.kt @@ -19,5 +19,7 @@ package im.vector.app.features.roomprofile.permissions import im.vector.app.core.platform.VectorViewModelAction sealed class RoomPermissionsAction : VectorViewModelAction { + object ToggleShowAllPermissions : RoomPermissionsAction() + data class UpdatePermission(val editablePermission: EditablePermission, val powerLevel: Int) : RoomPermissionsAction() } diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/permissions/RoomPermissionsController.kt b/vector/src/main/java/im/vector/app/features/roomprofile/permissions/RoomPermissionsController.kt index 313782bf28..92bdac7ae0 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/permissions/RoomPermissionsController.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/permissions/RoomPermissionsController.kt @@ -25,6 +25,7 @@ import im.vector.app.core.epoxy.profiles.buildProfileSection import im.vector.app.core.resources.ColorProvider import im.vector.app.core.resources.StringProvider import im.vector.app.features.discovery.settingsInfoItem +import im.vector.app.features.form.formAdvancedToggleItem import org.matrix.android.sdk.api.session.room.model.PowerLevelsContent import org.matrix.android.sdk.api.session.room.powerlevels.Role import javax.inject.Inject @@ -36,6 +37,7 @@ class RoomPermissionsController @Inject constructor( interface Callback { fun onEditPermission(editablePermission: EditablePermission, currentRole: Role) + fun toggleShowAllPermissions() } var callback: Callback? = null @@ -43,25 +45,34 @@ class RoomPermissionsController @Inject constructor( private val dividerColor = colorProvider.getColorFromAttribute(R.attr.vctr_list_divider_color) // Order is the order applied in the UI - private val allEditablePermissions = listOf( + // Element Web order is not really nice, try to put the settings which are more likely to be updated first + // And a second section, hidden by default + private val usefulEditablePermissions = listOf( + EditablePermission.ChangeRoomAvatar(), + EditablePermission.ChangeRoomName(), + EditablePermission.ChangeTopic() + ) + + private val advancedEditablePermissions = listOf( + EditablePermission.ChangeMainAddressForTheRoom(), + EditablePermission.DefaultRole(), - EditablePermission.SendMessages(), EditablePermission.InviteUsers(), - EditablePermission.ChangeSettings(), EditablePermission.KickUsers(), EditablePermission.BanUsers(), + + EditablePermission.SendMessages(), + EditablePermission.RemoveMessagesSentByOthers(), EditablePermission.NotifyEveryone(), + + EditablePermission.ChangeSettings(), EditablePermission.ModifyWidgets(), - EditablePermission.ChangeRoomAvatar(), - EditablePermission.ChangeMainAddressForTheRoom(), - EditablePermission.EnableRoomEncryption(), EditablePermission.ChangeHistoryVisibility(), - EditablePermission.ChangeRoomName(), EditablePermission.ChangePermissions(), EditablePermission.SendRoomServerAclEvents(), - EditablePermission.UpgradeTheRoom(), - EditablePermission.ChangeTopic() + EditablePermission.EnableRoomEncryption(), + EditablePermission.UpgradeTheRoom() ) init { @@ -91,22 +102,38 @@ class RoomPermissionsController @Inject constructor( helperText(stringProvider.getString(if (editable) R.string.room_permissions_notice else R.string.room_permissions_notice_read_only)) } - allEditablePermissions.forEach { editablePermission -> - val currentRole = getCurrentRole(editablePermission, content) - buildProfileAction( - id = editablePermission.labelResId.toString(), - title = stringProvider.getString(editablePermission.labelResId), - subtitle = getSubtitle(currentRole), - dividerColor = dividerColor, - divider = true, - editable = data.actionPermissions.canChangePowerLevels, - action = { - callback - ?.takeIf { editable } - ?.onEditPermission(editablePermission, currentRole) - } - ) + // Useful permissions + usefulEditablePermissions.forEach { buildPermission(it, content, editable) } + + // Toggle + formAdvancedToggleItem { + id("showAdvanced") + title(stringProvider.getString(if (data.showAdvancedPermissions) R.string.hide_advanced else R.string.show_advanced)) + expanded(!data.showAdvancedPermissions) + listener { callback?.toggleShowAllPermissions() } } + + // Advanced permissions + if (data.showAdvancedPermissions) { + advancedEditablePermissions.forEach { buildPermission(it, content, editable) } + } + } + + private fun buildPermission(editablePermission: EditablePermission, content: PowerLevelsContent, editable: Boolean) { + val currentRole = getCurrentRole(editablePermission, content) + buildProfileAction( + id = editablePermission.labelResId.toString(), + title = stringProvider.getString(editablePermission.labelResId), + subtitle = getSubtitle(currentRole), + dividerColor = dividerColor, + divider = true, + editable = editable, + action = { + callback + ?.takeIf { editable } + ?.onEditPermission(editablePermission, currentRole) + } + ) } private fun getSubtitle(currentRole: Role): String { diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/permissions/RoomPermissionsFragment.kt b/vector/src/main/java/im/vector/app/features/roomprofile/permissions/RoomPermissionsFragment.kt index 73e0b00de9..61635c9b31 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/permissions/RoomPermissionsFragment.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/permissions/RoomPermissionsFragment.kt @@ -99,4 +99,8 @@ class RoomPermissionsFragment @Inject constructor( viewModel.handle(RoomPermissionsAction.UpdatePermission(editablePermission, newPowerLevel)) } } + + override fun toggleShowAllPermissions() { + viewModel.handle(RoomPermissionsAction.ToggleShowAllPermissions) + } } diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/permissions/RoomPermissionsViewModel.kt b/vector/src/main/java/im/vector/app/features/roomprofile/permissions/RoomPermissionsViewModel.kt index af0a392d88..12f2467247 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/permissions/RoomPermissionsViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/permissions/RoomPermissionsViewModel.kt @@ -94,10 +94,17 @@ class RoomPermissionsViewModel @AssistedInject constructor(@Assisted initialStat override fun handle(action: RoomPermissionsAction) { when (action) { - is RoomPermissionsAction.UpdatePermission -> updatePermission(action) + is RoomPermissionsAction.UpdatePermission -> updatePermission(action) + RoomPermissionsAction.ToggleShowAllPermissions -> toggleShowAllPermissions() }.exhaustive } + private fun toggleShowAllPermissions() { + setState { + copy(showAdvancedPermissions = !showAdvancedPermissions) + } + } + private fun updatePermission(action: RoomPermissionsAction.UpdatePermission) { withState { state -> val currentPowerLevel = state.currentPowerLevelsContent.invoke() ?: return@withState diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/permissions/RoomPermissionsViewState.kt b/vector/src/main/java/im/vector/app/features/roomprofile/permissions/RoomPermissionsViewState.kt index 47c82bde2a..ce38ab87e5 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/permissions/RoomPermissionsViewState.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/permissions/RoomPermissionsViewState.kt @@ -27,6 +27,7 @@ data class RoomPermissionsViewState( val roomId: String, val roomSummary: Async<RoomSummary> = Uninitialized, val actionPermissions: ActionPermissions = ActionPermissions(), + val showAdvancedPermissions: Boolean = false, val currentPowerLevelsContent: Async<PowerLevelsContent> = Uninitialized, val isLoading: Boolean = false ) : MvRxState {