diff --git a/matrix-sdk-android-rx/src/main/java/im/vector/matrix/rx/RxRoom.kt b/matrix-sdk-android-rx/src/main/java/im/vector/matrix/rx/RxRoom.kt index 5cc9d1fc00..20f794860e 100644 --- a/matrix-sdk-android-rx/src/main/java/im/vector/matrix/rx/RxRoom.kt +++ b/matrix-sdk-android-rx/src/main/java/im/vector/matrix/rx/RxRoom.kt @@ -101,6 +101,14 @@ class RxRoom(private val room: Room) { fun invite(userId: String, reason: String? = null): Completable = completableBuilder { room.invite(userId, reason, it) } + + fun updateTopic(topic: String): Completable = completableBuilder { + room.updateTopic(topic, it) + } + + fun updateName(name: String): Completable = completableBuilder { + room.updateName(name, it) + } } fun Room.rx(): RxRoom { diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/state/StateService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/state/StateService.kt index 827ce50e13..91a193fba7 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/state/StateService.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/state/StateService.kt @@ -31,6 +31,11 @@ interface StateService { */ fun updateTopic(topic: String, callback: MatrixCallback): Cancelable + /** + * Update the name of the room + */ + fun updateName(name: String, callback: MatrixCallback): Cancelable + fun sendStateEvent(eventType: String, stateKey: String?, body: JsonDict, callback: MatrixCallback): Cancelable fun getStateEvent(eventType: String, stateKey: QueryStringValue = QueryStringValue.NoCondition): Event? diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/state/DefaultStateService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/state/DefaultStateService.kt index 6646f08c2d..ed077d76b9 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/state/DefaultStateService.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/state/DefaultStateService.kt @@ -84,4 +84,13 @@ internal class DefaultStateService @AssistedInject constructor(@Assisted private stateKey = null ) } + + override fun updateName(name: String, callback: MatrixCallback): Cancelable { + return sendStateEvent( + eventType = EventType.STATE_ROOM_NAME, + body = mapOf("name" to name), + callback = callback, + stateKey = null + ) + } } diff --git a/vector/src/main/java/im/vector/riotx/features/roomprofile/settings/RoomSettingsFragment.kt b/vector/src/main/java/im/vector/riotx/features/roomprofile/settings/RoomSettingsFragment.kt index 12af2be689..bb97409e74 100644 --- a/vector/src/main/java/im/vector/riotx/features/roomprofile/settings/RoomSettingsFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/roomprofile/settings/RoomSettingsFragment.kt @@ -31,6 +31,7 @@ import im.vector.riotx.core.extensions.cleanup import im.vector.riotx.core.extensions.configureWith import im.vector.riotx.core.extensions.exhaustive import im.vector.riotx.core.platform.VectorBaseFragment +import im.vector.riotx.core.utils.toast import im.vector.riotx.features.home.AvatarRenderer import im.vector.riotx.features.roomprofile.RoomProfileArgs import kotlinx.android.synthetic.main.fragment_room_setting_generic.* @@ -61,10 +62,15 @@ class RoomSettingsFragment @Inject constructor( viewModel.observeViewEvents { when (it) { is RoomSettingsViewEvents.Failure -> showFailure(it.throwable) + is RoomSettingsViewEvents.Success -> showSuccess() }.exhaustive } } + private fun showSuccess() { + activity?.toast(R.string.room_settings_save_success) + } + override fun onDestroyView() { recyclerView.cleanup() super.onDestroyView() diff --git a/vector/src/main/java/im/vector/riotx/features/roomprofile/settings/RoomSettingsViewEvents.kt b/vector/src/main/java/im/vector/riotx/features/roomprofile/settings/RoomSettingsViewEvents.kt index 4856a935a8..c30a5ff9c9 100644 --- a/vector/src/main/java/im/vector/riotx/features/roomprofile/settings/RoomSettingsViewEvents.kt +++ b/vector/src/main/java/im/vector/riotx/features/roomprofile/settings/RoomSettingsViewEvents.kt @@ -24,4 +24,5 @@ import im.vector.riotx.core.platform.VectorViewEvents */ sealed class RoomSettingsViewEvents : VectorViewEvents { data class Failure(val throwable: Throwable) : RoomSettingsViewEvents() + object Success : RoomSettingsViewEvents() } 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 d5283a240b..deca6858e2 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 @@ -26,6 +26,8 @@ import im.vector.matrix.android.api.session.Session import im.vector.matrix.rx.rx import im.vector.matrix.rx.unwrap import im.vector.riotx.core.platform.VectorViewModel +import io.reactivex.Completable +import io.reactivex.Observable class RoomSettingsViewModel @AssistedInject constructor(@Assisted initialState: RoomSettingsViewState, private val session: Session) @@ -89,28 +91,53 @@ class RoomSettingsViewModel @AssistedInject constructor(@Assisted initialState: summary?.topic != state.newTopic } - private fun saveSettings() { + private fun saveSettings() = withState { state -> + postLoading(true) + + val operationList = mutableListOf() + + val summary = state.roomSummary.invoke() + + if (summary?.displayName != state.newName) { + operationList.add(room.rx().updateName(state.newName ?: "")) + } + if (summary?.topic != state.newTopic) { + operationList.add(room.rx().updateTopic(state.newTopic ?: "")) + } + + Observable + .fromIterable(operationList) + .flatMapCompletable { it } + .subscribe( + { + postLoading(false) + _viewEvents.post(RoomSettingsViewEvents.Success) + }, + { + postLoading(false) + _viewEvents.post(RoomSettingsViewEvents.Failure(it)) + } + ) } private fun handleEnableEncryption() { - setState { - copy(isLoading = true) - } + postLoading(true) room.enableEncryption(callback = object : MatrixCallback { override fun onFailure(failure: Throwable) { - setState { - copy(isLoading = false) - } - + postLoading(false) _viewEvents.post(RoomSettingsViewEvents.Failure(failure)) } override fun onSuccess(data: Unit) { - setState { - copy(isLoading = false) - } + postLoading(false) } }) } + + private fun postLoading(isLoading: Boolean) { + setState { + copy(isLoading = isLoading) + } + } } diff --git a/vector/src/main/res/values/strings.xml b/vector/src/main/res/values/strings.xml index 98d8c3323e..3b3af55d1f 100644 --- a/vector/src/main/res/values/strings.xml +++ b/vector/src/main/res/values/strings.xml @@ -2499,5 +2499,6 @@ Not all features in Riot are implemented in RiotX yet. Main missing (and coming Room Name Topic + You changed room settings successfully