mirror of
https://github.com/SchildiChat/SchildiChat-android.git
synced 2025-02-16 12:00:03 +03:00
Implementation of room history readability.
This commit is contained in:
parent
e1a12f4c77
commit
f5790e5dc2
8 changed files with 81 additions and 10 deletions
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
},
|
||||
|
|
|
@ -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 {
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue