From 1f30cf468a8897c0b0efe1ffb576f04454c9e593 Mon Sep 17 00:00:00 2001 From: onurays Date: Tue, 23 Jun 2020 10:59:08 +0300 Subject: [PATCH] Check if user have enough power level to change settings. --- .../room/powerlevels/PowerLevelsHelper.kt | 56 +++++++++++++++++++ .../core/epoxy/profiles/ProfileActionItem.kt | 2 +- .../settings/RoomSettingsController.kt | 10 ++-- .../settings/RoomSettingsViewModel.kt | 16 ++++++ .../settings/RoomSettingsViewState.kt | 11 +++- 5 files changed, 88 insertions(+), 7 deletions(-) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/powerlevels/PowerLevelsHelper.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/powerlevels/PowerLevelsHelper.kt index f434859f6e..6361a46bac 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/powerlevels/PowerLevelsHelper.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/powerlevels/PowerLevelsHelper.kt @@ -17,6 +17,7 @@ package im.vector.matrix.android.api.session.room.powerlevels +import im.vector.matrix.android.api.session.events.model.EventType import im.vector.matrix.android.api.session.room.model.PowerLevelsContent /** @@ -123,4 +124,59 @@ class PowerLevelsHelper(private val powerLevelsContent: PowerLevelsContent) { else -> Role.Moderator.value } } + + /** + * Check if user have the necessary power level to change room name + * @param userId the id of the user to check for. + * @return true if able to change room name + */ + fun isUserAbleToChangeRoomName(userId: String): Boolean { + val powerLevel = getUserPowerLevelValue(userId) + val minPowerLevel = powerLevelsContent.events[EventType.STATE_ROOM_NAME] ?: powerLevelsContent.stateDefault + return powerLevel >= minPowerLevel + } + + /** + * Check if user have the necessary power level to change room topic + * @param userId the id of the user to check for. + * @return true if able to change room topic + */ + fun isUserAbleToChangeRoomTopic(userId: String): Boolean { + val powerLevel = getUserPowerLevelValue(userId) + val minPowerLevel = powerLevelsContent.events[EventType.STATE_ROOM_TOPIC] ?: powerLevelsContent.stateDefault + return powerLevel >= minPowerLevel + } + + /** + * Check if user have the necessary power level to change room canonical alias + * @param userId the id of the user to check for. + * @return true if able to change room canonical alias + */ + fun isUserAbleToChangeRoomCanonicalAlias(userId: String): Boolean { + val powerLevel = getUserPowerLevelValue(userId) + val minPowerLevel = powerLevelsContent.events[EventType.STATE_ROOM_CANONICAL_ALIAS] ?: powerLevelsContent.stateDefault + return powerLevel >= minPowerLevel + } + + /** + * Check if user have the necessary power level to change room history readability + * @param userId the id of the user to check for. + * @return true if able to change room history readability + */ + fun isUserAbleToChangeRoomHistoryReadability(userId: String): Boolean { + val powerLevel = getUserPowerLevelValue(userId) + val minPowerLevel = powerLevelsContent.events[EventType.STATE_ROOM_HISTORY_VISIBILITY] ?: powerLevelsContent.stateDefault + return powerLevel >= minPowerLevel + } + + /** + * Check if user have the necessary power level to change room avatar + * @param userId the id of the user to check for. + * @return true if able to change room avatar + */ + fun isUserAbleToChangeRoomAvatar(userId: String): Boolean { + val powerLevel = getUserPowerLevelValue(userId) + val minPowerLevel = powerLevelsContent.events[EventType.STATE_ROOM_AVATAR] ?: powerLevelsContent.stateDefault + return powerLevel >= minPowerLevel + } } diff --git a/vector/src/main/java/im/vector/riotx/core/epoxy/profiles/ProfileActionItem.kt b/vector/src/main/java/im/vector/riotx/core/epoxy/profiles/ProfileActionItem.kt index 80b78d0d70..1be5386c2f 100644 --- a/vector/src/main/java/im/vector/riotx/core/epoxy/profiles/ProfileActionItem.kt +++ b/vector/src/main/java/im/vector/riotx/core/epoxy/profiles/ProfileActionItem.kt @@ -71,7 +71,7 @@ abstract class ProfileActionItem : VectorEpoxyModel() override fun bind(holder: Holder) { super.bind(holder) holder.view.setOnClickListener(listener) - if (listener == null) { + if (listener == null || !editable) { holder.view.isClickable = false } holder.title.text = title diff --git a/vector/src/main/java/im/vector/riotx/features/roomprofile/settings/RoomSettingsController.kt b/vector/src/main/java/im/vector/riotx/features/roomprofile/settings/RoomSettingsController.kt index ca472b9de4..5764282d47 100644 --- a/vector/src/main/java/im/vector/riotx/features/roomprofile/settings/RoomSettingsController.kt +++ b/vector/src/main/java/im/vector/riotx/features/roomprofile/settings/RoomSettingsController.kt @@ -67,7 +67,7 @@ class RoomSettingsController @Inject constructor( formEditTextItem { id("name") - /*enabled(enableFormElement)*/ + enabled(data.actionPermissions.canChangeName) value(data.newName ?: roomSummary.displayName) hint(stringProvider.getString(R.string.room_settings_name_hint)) @@ -78,7 +78,7 @@ class RoomSettingsController @Inject constructor( formEditTextItem { id("topic") - /*enabled(enableFormElement)*/ + enabled(data.actionPermissions.canChangeTopic) value(data.newTopic ?: roomSummary.topic) hint(stringProvider.getString(R.string.room_settings_topic_hint)) @@ -89,7 +89,7 @@ class RoomSettingsController @Inject constructor( formEditTextItem { id("alias") - /*enabled(enableFormElement)*/ + enabled(data.actionPermissions.canChangeCanonicalAlias) value(data.newAlias ?: roomSummary.canonicalAlias) hint(stringProvider.getString(R.string.room_settings_addresses_add_new_address)) @@ -104,7 +104,7 @@ class RoomSettingsController @Inject constructor( subtitle = newHistoryVisibility ?: historyVisibility, dividerColor = dividerColor, divider = false, - editable = true, + editable = data.actionPermissions.canChangeHistoryReadability, action = { callback?.onHistoryVisibilityClicked() } ) @@ -114,7 +114,7 @@ class RoomSettingsController @Inject constructor( subtitle = "", dividerColor = dividerColor, divider = true, - editable = true, + editable = data.actionPermissions.canChangeAvatar, accessoryMatrixItem = roomSummary.toMatrixItem(), avatarRenderer = avatarRenderer, action = { callback?.onPhotoClicked() } diff --git a/vector/src/main/java/im/vector/riotx/features/roomprofile/settings/RoomSettingsViewModel.kt b/vector/src/main/java/im/vector/riotx/features/roomprofile/settings/RoomSettingsViewModel.kt index d07c2befaf..fd30a5f4db 100644 --- a/vector/src/main/java/im/vector/riotx/features/roomprofile/settings/RoomSettingsViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/features/roomprofile/settings/RoomSettingsViewModel.kt @@ -24,9 +24,11 @@ import com.squareup.inject.assisted.AssistedInject import im.vector.matrix.android.api.MatrixCallback import im.vector.matrix.android.api.session.Session import im.vector.matrix.android.api.session.events.model.EventType +import im.vector.matrix.android.api.session.room.powerlevels.PowerLevelsHelper import im.vector.matrix.rx.rx import im.vector.matrix.rx.unwrap import im.vector.riotx.core.platform.VectorViewModel +import im.vector.riotx.features.powerlevel.PowerLevelsObservableFactory import io.reactivex.Completable import io.reactivex.Observable import java.util.Locale @@ -68,6 +70,20 @@ class RoomSettingsViewModel @AssistedInject constructor(@Assisted initialState: newTopic = roomSummary?.topic ) } + + val powerLevelsContentLive = PowerLevelsObservableFactory(room).createObservable() + + powerLevelsContentLive.subscribe { + val powerLevelsHelper = PowerLevelsHelper(it) + val permissions = RoomSettingsViewState.ActionPermissions( + canChangeName = powerLevelsHelper.isUserAbleToChangeRoomName(session.myUserId), + canChangeTopic = powerLevelsHelper.isUserAbleToChangeRoomTopic(session.myUserId), + canChangeCanonicalAlias = powerLevelsHelper.isUserAbleToChangeRoomCanonicalAlias(session.myUserId), + canChangeAvatar = powerLevelsHelper.isUserAbleToChangeRoomAvatar(session.myUserId), + canChangeHistoryReadability = powerLevelsHelper.isUserAbleToChangeRoomHistoryReadability(session.myUserId) + ) + setState { copy(actionPermissions = permissions) } + }.disposeOnClear() } override fun handle(action: RoomSettingsAction) { diff --git a/vector/src/main/java/im/vector/riotx/features/roomprofile/settings/RoomSettingsViewState.kt b/vector/src/main/java/im/vector/riotx/features/roomprofile/settings/RoomSettingsViewState.kt index 0502c7ebc5..05a2646999 100644 --- a/vector/src/main/java/im/vector/riotx/features/roomprofile/settings/RoomSettingsViewState.kt +++ b/vector/src/main/java/im/vector/riotx/features/roomprofile/settings/RoomSettingsViewState.kt @@ -35,8 +35,17 @@ data class RoomSettingsViewState( val newAvatar: MultiPickerImageType? = null, val newHistoryVisibility: RoomHistoryVisibility? = null, val newAlias: String? = null, - val showSaveAction: Boolean = false + val showSaveAction: Boolean = false, + val actionPermissions: ActionPermissions = ActionPermissions() ) : MvRxState { constructor(args: RoomProfileArgs) : this(roomId = args.roomId) + + data class ActionPermissions( + val canChangeName: Boolean = false, + val canChangeTopic: Boolean = false, + val canChangeCanonicalAlias: Boolean = false, + val canChangeAvatar: Boolean = false, + val canChangeHistoryReadability: Boolean = false + ) }