From e1ddde550169d2d8ee1e98f7145b81351d7b2b8b Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 29 Jan 2020 14:17:05 +0100 Subject: [PATCH] Make CreateRoomParams a regular data class --- .../matrix/android/common/CryptoTestHelper.kt | 10 +- .../room/model/create/CreateRoomParams.kt | 229 +++++++++--------- .../createdirect/CreateDirectRoomViewModel.kt | 5 +- .../VerificationBottomSheetViewModel.kt | 8 +- .../createroom/CreateRoomViewModel.kt | 16 +- 5 files changed, 138 insertions(+), 130 deletions(-) diff --git a/matrix-sdk-android/src/androidTest/java/im/vector/matrix/android/common/CryptoTestHelper.kt b/matrix-sdk-android/src/androidTest/java/im/vector/matrix/android/common/CryptoTestHelper.kt index 25cfff5c16..59db3b287c 100644 --- a/matrix-sdk-android/src/androidTest/java/im/vector/matrix/android/common/CryptoTestHelper.kt +++ b/matrix-sdk-android/src/androidTest/java/im/vector/matrix/android/common/CryptoTestHelper.kt @@ -37,8 +37,12 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking -import org.junit.Assert.* -import java.util.* +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNotNull +import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue +import java.util.Arrays +import java.util.HashMap import java.util.concurrent.CountDownLatch class CryptoTestHelper(val mTestHelper: CommonTestHelper) { @@ -57,7 +61,7 @@ class CryptoTestHelper(val mTestHelper: CommonTestHelper) { var roomId: String? = null val lock1 = CountDownLatch(1) - aliceSession.createRoom(CreateRoomParams().apply { name = "MyRoom" }, object : TestMatrixCallback(lock1) { + aliceSession.createRoom(CreateRoomParams(name = "MyRoom"), object : TestMatrixCallback(lock1) { override fun onSuccess(data: String) { roomId = data super.onSuccess(data) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/create/CreateRoomParams.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/create/CreateRoomParams.kt index 2119c586db..f3069e0de5 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/create/CreateRoomParams.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/create/CreateRoomParams.kt @@ -35,95 +35,98 @@ import timber.log.Timber * Parameter to create a room, with facilities functions to configure it */ @JsonClass(generateAdapter = true) -class CreateRoomParams { +data class CreateRoomParams( + /** + * A public visibility indicates that the room will be shown in the published room list. + * A private visibility will hide the room from the published room list. + * Rooms default to private visibility if this key is not included. + * NB: This should not be confused with join_rules which also uses the word public. One of: ["public", "private"] + */ + @Json(name = "visibility") + val visibility: RoomDirectoryVisibility? = null, - /** - * A public visibility indicates that the room will be shown in the published room list. - * A private visibility will hide the room from the published room list. - * Rooms default to private visibility if this key is not included. - * NB: This should not be confused with join_rules which also uses the word public. One of: ["public", "private"] - */ - var visibility: RoomDirectoryVisibility? = null + /** + * The desired room alias local part. If this is included, a room alias will be created and mapped to the newly created room. + * The alias will belong on the same homeserver which created the room. + * For example, if this was set to "foo" and sent to the homeserver "example.com" the complete room alias would be #foo:example.com. + */ + @Json(name = "room_alias_name") + val roomAliasName: String? = null, - /** - * The desired room alias local part. If this is included, a room alias will be created and mapped to the newly created room. - * The alias will belong on the same homeserver which created the room. - * For example, if this was set to "foo" and sent to the homeserver "example.com" the complete room alias would be #foo:example.com. - */ - @Json(name = "room_alias_name") - var roomAliasName: String? = null + /** + * If this is included, an m.room.name event will be sent into the room to indicate the name of the room. + * See Room Events for more information on m.room.name. + */ + @Json(name = "name") + val name: String? = null, - /** - * If this is included, an m.room.name event will be sent into the room to indicate the name of the room. - * See Room Events for more information on m.room.name. - */ - var name: String? = null + /** + * If this is included, an m.room.topic event will be sent into the room to indicate the topic for the room. + * See Room Events for more information on m.room.topic. + */ + @Json(name = "topic") + val topic: String? = null, - /** - * If this is included, an m.room.topic event will be sent into the room to indicate the topic for the room. - * See Room Events for more information on m.room.topic. - */ - var topic: String? = null + /** + * A list of user IDs to invite to the room. + * This will tell the server to invite everyone in the list to the newly created room. + */ + @Json(name = "invite") + val invitedUserIds: List? = null, - /** - * A list of user IDs to invite to the room. - * This will tell the server to invite everyone in the list to the newly created room. - */ - @Json(name = "invite") - var invitedUserIds: MutableList? = null + /** + * A list of objects representing third party IDs to invite into the room. + */ + @Json(name = "invite_3pid") + val invite3pids: List? = null, - /** - * A list of objects representing third party IDs to invite into the room. - */ - @Json(name = "invite_3pid") - var invite3pids: MutableList? = null + /** + * Extra keys to be added to the content of the m.room.create. + * The server will clobber the following keys: creator. + * Future versions of the specification may allow the server to clobber other keys. + */ + @Json(name = "creation_content") + val creationContent: Any? = null, - /** - * Extra keys to be added to the content of the m.room.create. - * The server will clobber the following keys: creator. - * Future versions of the specification may allow the server to clobber other keys. - */ - @Json(name = "creation_content") - var creationContent: Any? = null + /** + * A list of state events to set in the new room. + * This allows the user to override the default state events set in the new room. + * The expected format of the state events are an object with type, state_key and content keys set. + * Takes precedence over events set by presets, but gets overridden by name and topic keys. + */ + @Json(name = "initial_state") + val initialStates: List? = null, - /** - * A list of state events to set in the new room. - * This allows the user to override the default state events set in the new room. - * The expected format of the state events are an object with type, state_key and content keys set. - * Takes precedence over events set by presets, but gets overridden by name and topic keys. - */ - @Json(name = "initial_state") - var initialStates: MutableList? = null + /** + * Convenience parameter for setting various default state events based on a preset. Must be either: + * private_chat => join_rules is set to invite. history_visibility is set to shared. + * trusted_private_chat => join_rules is set to invite. history_visibility is set to shared. All invitees are given the same power level as the + * room creator. + * public_chat: => join_rules is set to public. history_visibility is set to shared. + */ + @Json(name = "preset") + val preset: CreateRoomPreset? = null, - /** - * Convenience parameter for setting various default state events based on a preset. Must be either: - * private_chat => join_rules is set to invite. history_visibility is set to shared. - * trusted_private_chat => join_rules is set to invite. history_visibility is set to shared. All invitees are given the same power level as the - * room creator. - * public_chat: => join_rules is set to public. history_visibility is set to shared. - */ - var preset: CreateRoomPreset? = null - - /** - * This flag makes the server set the is_direct flag on the m.room.member events sent to the users in invite and invite_3pid. - * See Direct Messaging for more information. - */ - @Json(name = "is_direct") - var isDirect: Boolean? = null - - /** - * The power level content to override in the default power level event - */ - @Json(name = "power_level_content_override") - var powerLevelContentOverride: PowerLevelsContent? = null + /** + * This flag makes the server set the is_direct flag on the m.room.member events sent to the users in invite and invite_3pid. + * See Direct Messaging for more information. + */ + @Json(name = "is_direct") + val isDirect: Boolean? = null, + /** + * The power level content to override in the default power level event + */ + @Json(name = "power_level_content_override") + val powerLevelContentOverride: PowerLevelsContent? = null +) { /** * Add the crypto algorithm to the room creation parameters. * * @param algorithm the algorithm */ - fun enableEncryptionWithAlgorithm(algorithm: String) { - if (algorithm == MXCRYPTO_ALGORITHM_MEGOLM) { + fun enableEncryptionWithAlgorithm(algorithm: String): CreateRoomParams { + return if (algorithm == MXCRYPTO_ALGORITHM_MEGOLM) { val contentMap = mapOf("algorithm" to algorithm) val algoEvent = Event( @@ -132,13 +135,12 @@ class CreateRoomParams { content = contentMap.toContent() ) - if (null == initialStates) { - initialStates = mutableListOf(algoEvent) - } else { - initialStates!!.add(algoEvent) - } + copy( + initialStates = initialStates.orEmpty().filter { it.type != EventType.STATE_ROOM_ENCRYPTION } + algoEvent + ) } else { Timber.e("Unsupported algorithm: $algorithm") + this } } @@ -147,9 +149,10 @@ class CreateRoomParams { * * @param historyVisibility the expected history visibility, set null to remove any existing value. */ - fun setHistoryVisibility(historyVisibility: RoomHistoryVisibility?) { + fun setHistoryVisibility(historyVisibility: RoomHistoryVisibility?): CreateRoomParams { // Remove the existing value if any. - initialStates?.removeAll { it.type == EventType.STATE_ROOM_HISTORY_VISIBILITY } + val newInitialStates = initialStates + ?.filter { it.type != EventType.STATE_ROOM_HISTORY_VISIBILITY } if (historyVisibility != null) { val contentMap = mapOf("history_visibility" to historyVisibility) @@ -159,20 +162,24 @@ class CreateRoomParams { stateKey = "", content = contentMap.toContent()) - if (null == initialStates) { - initialStates = mutableListOf(historyVisibilityEvent) - } else { - initialStates!!.add(historyVisibilityEvent) - } + return copy( + initialStates = newInitialStates.orEmpty() + historyVisibilityEvent + ) + } else { + return copy( + initialStates = newInitialStates + ) } } /** * Mark as a direct message room. */ - fun setDirectMessage() { - preset = CreateRoomPreset.PRESET_TRUSTED_PRIVATE_CHAT - isDirect = true + fun setDirectMessage(): CreateRoomParams { + return copy( + preset = CreateRoomPreset.PRESET_TRUSTED_PRIVATE_CHAT, + isDirect = true + ) } /** @@ -215,28 +222,26 @@ class CreateRoomParams { */ fun addParticipantIds(hsConfig: HomeServerConnectionConfig, userId: String, - ids: List) { - for (id in ids) { - if (Patterns.EMAIL_ADDRESS.matcher(id).matches() && hsConfig.identityServerUri != null) { - if (null == invite3pids) { - invite3pids = ArrayList() - } - val pid = Invite3Pid(idServer = hsConfig.identityServerUri.host!!, - medium = ThreePidMedium.EMAIL, - address = id) - - invite3pids!!.add(pid) - } else if (isUserId(id)) { - // do not invite oneself - if (userId != id) { - if (null == invitedUserIds) { - invitedUserIds = ArrayList() - } - - invitedUserIds!!.add(id) - } - } - // TODO add phonenumbers when it will be available - } + ids: List): CreateRoomParams { + return copy( + invite3pids = (invite3pids.orEmpty() + ids + .takeIf { hsConfig.identityServerUri != null } + ?.filter { id -> Patterns.EMAIL_ADDRESS.matcher(id).matches() } + ?.map { id -> + Invite3Pid( + idServer = hsConfig.identityServerUri!!.host!!, + medium = ThreePidMedium.EMAIL, + address = id + ) + } + .orEmpty()) + .distinct(), + invitedUserIds = (invitedUserIds.orEmpty() + ids + .filter { id -> isUserId(id) } + // do not invite oneself + .filter { id -> id != userId }) + .distinct() + ) + // TODO add phonenumbers when it will be available } } diff --git a/vector/src/main/java/im/vector/riotx/features/createdirect/CreateDirectRoomViewModel.kt b/vector/src/main/java/im/vector/riotx/features/createdirect/CreateDirectRoomViewModel.kt index fd56aacee4..313e5459e9 100644 --- a/vector/src/main/java/im/vector/riotx/features/createdirect/CreateDirectRoomViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/features/createdirect/CreateDirectRoomViewModel.kt @@ -93,8 +93,9 @@ class CreateDirectRoomViewModel @AssistedInject constructor(@Assisted private fun createRoomAndInviteSelectedUsers() = withState { currentState -> val isDirect = currentState.selectedUsers.size == 1 - val roomParams = CreateRoomParams().apply { - invitedUserIds = ArrayList(currentState.selectedUsers.map { it.userId }) + val roomParams = CreateRoomParams( + invitedUserIds = ArrayList(currentState.selectedUsers.map { it.userId }) + ).apply { if (isDirect) { setDirectMessage() } diff --git a/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationBottomSheetViewModel.kt b/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationBottomSheetViewModel.kt index a7834d1c58..5db0ef2284 100644 --- a/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationBottomSheetViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationBottomSheetViewModel.kt @@ -127,10 +127,10 @@ class VerificationBottomSheetViewModel @AssistedInject constructor(@Assisted ini pendingRequest = Loading() ) } - val roomParams = CreateRoomParams().apply { - invitedUserIds = listOf(otherUserId).toMutableList() - setDirectMessage() - } + val roomParams = CreateRoomParams( + invitedUserIds = listOf(otherUserId).toMutableList() + ) + .setDirectMessage() session.createRoom(roomParams, object : MatrixCallback { override fun onSuccess(data: String) { setState { diff --git a/vector/src/main/java/im/vector/riotx/features/roomdirectory/createroom/CreateRoomViewModel.kt b/vector/src/main/java/im/vector/riotx/features/roomdirectory/createroom/CreateRoomViewModel.kt index 457574e736..31f4d176e4 100644 --- a/vector/src/main/java/im/vector/riotx/features/roomdirectory/createroom/CreateRoomViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/features/roomdirectory/createroom/CreateRoomViewModel.kt @@ -81,15 +81,13 @@ class CreateRoomViewModel @AssistedInject constructor(@Assisted initialState: Cr copy(asyncCreateRoomRequest = Loading()) } - val createRoomParams = CreateRoomParams().apply { - name = state.roomName.takeIf { it.isNotBlank() } - - // Directory visibility - visibility = if (state.isInRoomDirectory) RoomDirectoryVisibility.PUBLIC else RoomDirectoryVisibility.PRIVATE - - // Public room - preset = if (state.isPublic) CreateRoomPreset.PRESET_PUBLIC_CHAT else CreateRoomPreset.PRESET_PRIVATE_CHAT - } + val createRoomParams = CreateRoomParams( + name = state.roomName.takeIf { it.isNotBlank() }, + // Directory visibility + visibility = if (state.isInRoomDirectory) RoomDirectoryVisibility.PUBLIC else RoomDirectoryVisibility.PRIVATE, + // Public room + preset = if (state.isPublic) CreateRoomPreset.PRESET_PUBLIC_CHAT else CreateRoomPreset.PRESET_PRIVATE_CHAT + ) session.createRoom(createRoomParams, object : MatrixCallback { override fun onSuccess(data: String) {