Implementation of room history readability.

This commit is contained in:
onurays 2020-06-22 10:29:34 +03:00 committed by Benoit Marty
parent e1a12f4c77
commit f5790e5dc2
8 changed files with 81 additions and 10 deletions

View File

@ -111,6 +111,10 @@ class RxRoom(private val room: Room) {
room.updateName(name, it)
}
fun updateHistoryReadability(readability: String) = completableBuilder<Unit> {
room.updateHistoryReadability(readability, it)
}
fun updateAvatar(avatarUri: Uri, fileName: String): Completable = completableBuilder<Unit> {
room.updateAvatar(avatarUri, fileName, it)
}

View File

@ -37,6 +37,11 @@ interface StateService {
*/
fun updateName(name: String, callback: MatrixCallback<Unit>): Cancelable
/**
* Update the history readability of the room
*/
fun updateHistoryReadability(readability: String, callback: MatrixCallback<Unit>): Cancelable
/**
* Update the avatar of the room
*/

View File

@ -111,6 +111,15 @@ internal class DefaultStateService @AssistedInject constructor(@Assisted private
)
}
override fun updateHistoryReadability(readability: String, callback: MatrixCallback<Unit>): Cancelable {
return sendStateEvent(
eventType = EventType.STATE_ROOM_HISTORY_VISIBILITY,
body = mapOf("history_visibility" to readability),
callback = callback,
stateKey = null
)
}
override fun updateAvatar(avatarUri: Uri, fileName: String, callback: MatrixCallback<Unit>): Cancelable {
val cancelableBag = CancelableBag()
val workerParams = UploadAvatarWorker.Params(sessionId, avatarUri, fileName)

View File

@ -16,6 +16,7 @@
package im.vector.riotx.features.roomprofile.settings
import im.vector.matrix.android.api.session.room.model.RoomHistoryVisibility
import im.vector.riotx.core.platform.VectorViewModelAction
import im.vector.riotx.multipicker.entity.MultiPickerImageType
@ -23,6 +24,7 @@ sealed class RoomSettingsAction : VectorViewModelAction {
data class SetRoomName(val newName: String) : RoomSettingsAction()
data class SetRoomTopic(val newTopic: String) : RoomSettingsAction()
data class SetRoomAvatar(val image: MultiPickerImageType) : RoomSettingsAction()
data class SetRoomHistoryVisibility(val visibility: RoomHistoryVisibility) : RoomSettingsAction()
object EnableEncryption : RoomSettingsAction()
object Save : RoomSettingsAction()
}

View File

@ -58,6 +58,7 @@ class RoomSettingsController @Inject constructor(
val roomSummary = data?.roomSummary?.invoke() ?: return
val historyVisibility = data.historyVisibilityEvent?.let { formatRoomHistoryVisibilityEvent(it) } ?: ""
val newHistoryVisibility = data.newHistoryVisibility?.let { formatRoomHistoryVisibility(it) }
buildProfileSection(
stringProvider.getString(R.string.settings)
@ -88,7 +89,7 @@ class RoomSettingsController @Inject constructor(
buildProfileAction(
id = "historyReadability",
title = stringProvider.getString(R.string.room_settings_room_read_history_rules_pref_title),
subtitle = historyVisibility.toString(),
subtitle = newHistoryVisibility ?: historyVisibility,
dividerColor = dividerColor,
divider = false,
editable = true,
@ -131,6 +132,10 @@ class RoomSettingsController @Inject constructor(
private fun formatRoomHistoryVisibilityEvent(event: Event): String? {
val historyVisibility = event.getClearContent().toModel<RoomHistoryVisibilityContent>()?.historyVisibility ?: return null
return formatRoomHistoryVisibility(historyVisibility)
}
private fun formatRoomHistoryVisibility(historyVisibility: RoomHistoryVisibility): String {
val formattedVisibility = when (historyVisibility) {
RoomHistoryVisibility.SHARED -> stringProvider.getString(R.string.notice_room_visibility_shared)
RoomHistoryVisibility.INVITED -> stringProvider.getString(R.string.notice_room_visibility_invited)

View File

@ -27,12 +27,16 @@ import androidx.core.view.isVisible
import com.airbnb.mvrx.args
import com.airbnb.mvrx.fragmentViewModel
import com.airbnb.mvrx.withState
import im.vector.matrix.android.api.session.events.model.toModel
import im.vector.matrix.android.api.session.room.model.RoomHistoryVisibility
import im.vector.matrix.android.api.session.room.model.RoomHistoryVisibilityContent
import im.vector.matrix.android.api.util.toMatrixItem
import im.vector.riotx.R
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.resources.StringProvider
import im.vector.riotx.core.utils.toast
import im.vector.riotx.features.home.AvatarRenderer
import im.vector.riotx.features.roomprofile.RoomProfileArgs
@ -45,7 +49,8 @@ import javax.inject.Inject
class RoomSettingsFragment @Inject constructor(
val viewModelFactory: RoomSettingsViewModel.Factory,
private val controller: RoomSettingsController,
private val avatarRenderer: AvatarRenderer
private val avatarRenderer: AvatarRenderer,
private val stringProvider: StringProvider
) : VectorBaseFragment(), RoomSettingsController.Callback {
private val viewModel: RoomSettingsViewModel by fragmentViewModel()
@ -153,7 +158,36 @@ class RoomSettingsFragment @Inject constructor(
super.onActivityResult(requestCode, resultCode, data)
}
override fun onHistoryVisibilityClicked() {
override fun onHistoryVisibilityClicked() = withState(viewModel) { state ->
val historyVisibilities = arrayOf(
RoomHistoryVisibility.SHARED,
RoomHistoryVisibility.INVITED,
RoomHistoryVisibility.JOINED,
RoomHistoryVisibility.WORLD_READABLE
)
val currentHistoryVisibility =
state.newHistoryVisibility ?: state.historyVisibilityEvent?.getClearContent().toModel<RoomHistoryVisibilityContent>()?.historyVisibility
val currentHistoryVisibilityIndex = historyVisibilities.indexOf(currentHistoryVisibility)
AlertDialog.Builder(requireContext()).apply {
setTitle(R.string.room_settings_room_read_history_rules_pref_title)
setSingleChoiceItems(historyVisibilities.map { formatHistoryVisibility(it) }.toTypedArray(), currentHistoryVisibilityIndex) { dialog, which ->
if (which != currentHistoryVisibilityIndex) {
viewModel.handle(RoomSettingsAction.SetRoomHistoryVisibility(historyVisibilities[which]))
}
dialog.cancel()
}
show()
}
return@withState
}
private fun formatHistoryVisibility(historyVisibility: RoomHistoryVisibility): String {
return when (historyVisibility) {
RoomHistoryVisibility.SHARED -> stringProvider.getString(R.string.notice_room_visibility_shared)
RoomHistoryVisibility.INVITED -> stringProvider.getString(R.string.notice_room_visibility_invited)
RoomHistoryVisibility.JOINED -> stringProvider.getString(R.string.notice_room_visibility_joined)
RoomHistoryVisibility.WORLD_READABLE -> stringProvider.getString(R.string.notice_room_visibility_world_readable)
}
}
}

View File

@ -29,6 +29,7 @@ import im.vector.matrix.rx.unwrap
import im.vector.riotx.core.platform.VectorViewModel
import io.reactivex.Completable
import io.reactivex.Observable
import java.util.Locale
import java.util.UUID
class RoomSettingsViewModel @AssistedInject constructor(@Assisted initialState: RoomSettingsViewState,
@ -71,20 +72,24 @@ class RoomSettingsViewModel @AssistedInject constructor(@Assisted initialState:
override fun handle(action: RoomSettingsAction) {
when (action) {
is RoomSettingsAction.EnableEncryption -> handleEnableEncryption()
is RoomSettingsAction.SetRoomName -> {
is RoomSettingsAction.EnableEncryption -> handleEnableEncryption()
is RoomSettingsAction.SetRoomName -> {
setState { copy(newName = action.newName) }
setState { copy(showSaveAction = shouldShowSaveAction(this)) }
}
is RoomSettingsAction.SetRoomTopic -> {
is RoomSettingsAction.SetRoomTopic -> {
setState { copy(newTopic = action.newTopic) }
setState { copy(showSaveAction = shouldShowSaveAction(this)) }
}
is RoomSettingsAction.SetRoomAvatar -> {
is RoomSettingsAction.SetRoomAvatar -> {
setState { copy(newAvatar = action.image) }
setState { copy(showSaveAction = shouldShowSaveAction(this)) }
}
is RoomSettingsAction.Save -> saveSettings()
is RoomSettingsAction.SetRoomHistoryVisibility -> {
setState { copy(newHistoryVisibility = action.visibility) }
setState { copy(showSaveAction = shouldShowSaveAction(this)) }
}
is RoomSettingsAction.Save -> saveSettings()
}
}
@ -92,6 +97,7 @@ class RoomSettingsViewModel @AssistedInject constructor(@Assisted initialState:
val summary = state.roomSummary.invoke()
return summary?.displayName != state.newName ||
summary?.topic != state.newTopic ||
state.newHistoryVisibility != null ||
state.newAvatar != null
}
@ -109,6 +115,10 @@ class RoomSettingsViewModel @AssistedInject constructor(@Assisted initialState:
operationList.add(room.rx().updateTopic(state.newTopic ?: ""))
}
if (state.newHistoryVisibility != null) {
operationList.add(room.rx().updateHistoryReadability(state.newHistoryVisibility.name.toLowerCase(Locale.ROOT)))
}
if (state.newAvatar != null) {
operationList.add(room.rx().updateAvatar(state.newAvatar.contentUri, state.newAvatar.displayName ?: UUID.randomUUID().toString()))
}
@ -119,7 +129,7 @@ class RoomSettingsViewModel @AssistedInject constructor(@Assisted initialState:
.subscribe(
{
postLoading(false)
setState { copy(newAvatar = null) }
setState { copy(newAvatar = null, newHistoryVisibility = null) }
setState { copy(showSaveAction = shouldShowSaveAction(this)) }
_viewEvents.post(RoomSettingsViewEvents.Success)
},

View File

@ -20,6 +20,7 @@ import com.airbnb.mvrx.Async
import com.airbnb.mvrx.MvRxState
import com.airbnb.mvrx.Uninitialized
import im.vector.matrix.android.api.session.events.model.Event
import im.vector.matrix.android.api.session.room.model.RoomHistoryVisibility
import im.vector.matrix.android.api.session.room.model.RoomSummary
import im.vector.riotx.features.roomprofile.RoomProfileArgs
import im.vector.riotx.multipicker.entity.MultiPickerImageType
@ -32,6 +33,7 @@ data class RoomSettingsViewState(
val newName: String? = null,
val newTopic: String? = null,
val newAvatar: MultiPickerImageType? = null,
val newHistoryVisibility: RoomHistoryVisibility? = null,
val showSaveAction: Boolean = false
) : MvRxState {