diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/message/MessageOptionsContent.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/message/MessageOptionsContent.kt index 4841f134ae..4da35fa52c 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/message/MessageOptionsContent.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/message/MessageOptionsContent.kt @@ -30,7 +30,7 @@ enum class OptionsType(val value: String) { */ @JsonClass(generateAdapter = true) data class MessageOptionsContent( - @Json(name = "msgtype") override val type: String, + @Json(name = "msgtype") override val type: String = MessageType.MSGTYPE_OPTIONS, @Json(name = "type") val optionType: String? = null, @Json(name = "body") override val body: String, @Json(name = "label") val label: String?, diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/send/SendService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/send/SendService.kt index d3d4b13cc0..a49828c0d1 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/send/SendService.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/send/SendService.kt @@ -62,12 +62,19 @@ interface SendService { fun sendMedias(attachments: List): Cancelable /** - * Method to send a list of media asynchronously. - * @param attachments the list of media to send + * Method to send a poll response. + * @param pollEventId the poll currently replied to + * @param optionIndex The reply index + * @param optionValue The option value (for compatibility) * @return a [Cancelable] */ fun sendPollReply(pollEventId: String, optionIndex: Int, optionValue: String): Cancelable + /** + * @param options list of (label, value) + */ + fun sendPoll(question: String, options: List>) + /** * Redacts (delete) the given event. * @param event The event to redact diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/DefaultSendService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/DefaultSendService.kt index 6e303db93b..f0a600cc67 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/DefaultSendService.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/DefaultSendService.kt @@ -91,6 +91,13 @@ internal class DefaultSendService @AssistedInject constructor( return sendEvent(event) } + override fun sendPoll(question: String, options: List>) { + localEchoEventFactory.createPollEvent(roomId, question, options).also { + saveLocalEcho(it) + sendEvent(it) + } + } + private fun sendEvent(event: Event): Cancelable { // Encrypted room handling return if (cryptoService.isRoomEncrypted(roomId)) { diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/LocalEchoEventFactory.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/LocalEchoEventFactory.kt index 0cfd36b8e9..13691412f7 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/LocalEchoEventFactory.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/LocalEchoEventFactory.kt @@ -36,11 +36,14 @@ import im.vector.matrix.android.api.session.room.model.message.MessageContent import im.vector.matrix.android.api.session.room.model.message.MessageFileContent import im.vector.matrix.android.api.session.room.model.message.MessageFormat import im.vector.matrix.android.api.session.room.model.message.MessageImageContent +import im.vector.matrix.android.api.session.room.model.message.MessageOptionsContent import im.vector.matrix.android.api.session.room.model.message.MessagePollResponseContent import im.vector.matrix.android.api.session.room.model.message.MessageTextContent import im.vector.matrix.android.api.session.room.model.message.MessageType import im.vector.matrix.android.api.session.room.model.message.MessageVerificationRequestContent import im.vector.matrix.android.api.session.room.model.message.MessageVideoContent +import im.vector.matrix.android.api.session.room.model.message.OptionItems +import im.vector.matrix.android.api.session.room.model.message.OptionsType import im.vector.matrix.android.api.session.room.model.message.ThumbnailInfo import im.vector.matrix.android.api.session.room.model.message.VideoInfo import im.vector.matrix.android.api.session.room.model.message.isReply @@ -148,6 +151,30 @@ internal class LocalEchoEventFactory @Inject constructor( )) } + fun createPollEvent(roomId: String, + question: String, + options: List>): Event { + val compatLabel = buildString { + append(question) + append("\n") + options.forEach { + append("\n") + append(it.second) + } + } + return createEvent( + roomId, + MessageOptionsContent( + body = compatLabel, + label = question, + optionType = OptionsType.POLL.value, + options = options.map { + OptionItems(it.first, it.second) + } + ) + ) + } + fun createReplaceTextOfReply(roomId: String, eventReplaced: TimelineEvent, originalEvent: TimelineEvent, diff --git a/vector/src/main/java/im/vector/riotx/features/command/Command.kt b/vector/src/main/java/im/vector/riotx/features/command/Command.kt index 5c96b7c93c..0274a7b22e 100644 --- a/vector/src/main/java/im/vector/riotx/features/command/Command.kt +++ b/vector/src/main/java/im/vector/riotx/features/command/Command.kt @@ -42,6 +42,7 @@ enum class Command(val command: String, val parameters: String, @StringRes val d CLEAR_SCALAR_TOKEN("/clear_scalar_token", "", R.string.command_description_clear_scalar_token), SPOILER("/spoiler", "", R.string.command_description_spoiler), SHRUG("/shrug", "", R.string.command_description_shrug), + SPOILER("/spoiler", "", R.string.command_description_spoiler), // TODO temporary command VERIFY_USER("/verify", "", R.string.command_description_verify); diff --git a/vector/src/main/java/im/vector/riotx/features/command/CommandParser.kt b/vector/src/main/java/im/vector/riotx/features/command/CommandParser.kt index d4f5010d7e..c0b848ebf8 100644 --- a/vector/src/main/java/im/vector/riotx/features/command/CommandParser.kt +++ b/vector/src/main/java/im/vector/riotx/features/command/CommandParser.kt @@ -251,7 +251,6 @@ object CommandParser { } Command.SPOILER.command -> { val message = textMessage.substring(Command.SPOILER.command.length).trim() - ParsedCommand.SendSpoiler(message) } Command.SHRUG.command -> { @@ -265,6 +264,15 @@ object CommandParser { ParsedCommand.VerifyUser(message) } + Command.POLL.command -> { + val rawCommand = textMessage.substring(Command.POLL.command.length).trim() + val splited = rawCommand.split("|").map { it.trim() } + if (splited.size > 2) { + ParsedCommand.SendPoll(splited[0], splited.subList(1, splited.size)) + } else { + ParsedCommand.ErrorUnknownSlashCommand(slashCommand) + } + } else -> { // Unknown command ParsedCommand.ErrorUnknownSlashCommand(slashCommand) diff --git a/vector/src/main/java/im/vector/riotx/features/command/ParsedCommand.kt b/vector/src/main/java/im/vector/riotx/features/command/ParsedCommand.kt index dd9fe32e09..d823429ac9 100644 --- a/vector/src/main/java/im/vector/riotx/features/command/ParsedCommand.kt +++ b/vector/src/main/java/im/vector/riotx/features/command/ParsedCommand.kt @@ -50,4 +50,5 @@ sealed class ParsedCommand { class SendSpoiler(val message: String) : ParsedCommand() class SendShrug(val message: CharSequence) : ParsedCommand() class VerifyUser(val userId: String) : ParsedCommand() + class SendPoll(val question: String, val options: List) : ParsedCommand() } diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailViewModel.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailViewModel.kt index f39ac66941..adb410d83e 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailViewModel.kt @@ -423,6 +423,11 @@ class RoomDetailViewModel @AssistedInject constructor(@Assisted initialState: Ro _viewEvents.post(RoomDetailViewEvents.SlashCommandHandled()) popDraft() } + is ParsedCommand.SendPoll -> { + room.sendPoll(slashCommandResult.question, slashCommandResult.options.mapIndexed { index, s -> s to "$index. $s" }) + _sendMessageResultLiveData.postLiveEvent(SendMessageResult.SlashCommandHandled()) + popDraft() + } is ParsedCommand.ChangeTopic -> { handleChangeTopicSlashCommand(slashCommandResult) popDraft() diff --git a/vector/src/main/res/values/strings_riotX.xml b/vector/src/main/res/values/strings_riotX.xml index 0264909476..75790348de 100644 --- a/vector/src/main/res/values/strings_riotX.xml +++ b/vector/src/main/res/values/strings_riotX.xml @@ -15,6 +15,7 @@ %d votes - Final results Selected Option + Creates a simple poll