diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailFragment.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailFragment.kt index 92cc86db2c..9ef92a345b 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailFragment.kt @@ -253,7 +253,6 @@ class RoomDetailFragment @Inject constructor( navigator.openRoomProfile(requireActivity(), roomDetailArgs.roomId) } roomDetailViewModel.subscribe { renderState(it) } - roomDetailViewModel.sendMessageResultLiveData.observeEvent(viewLifecycleOwner) { renderSendMessageResult(it) } sharedActionViewModel .observe() @@ -310,6 +309,7 @@ class RoomDetailFragment @Inject constructor( is RoomDetailViewEvents.ActionSuccess -> displayRoomDetailActionSuccess(it) is RoomDetailViewEvents.ActionFailure -> displayRoomDetailActionFailure(it) is RoomDetailViewEvents.ShowMessage -> showSnackWithMessage(it.message, Snackbar.LENGTH_LONG) + is RoomDetailViewEvents.SendMessageResult -> renderSendMessageResult(it) }.exhaustive } } @@ -734,31 +734,31 @@ class RoomDetailFragment @Inject constructor( } } - private fun renderSendMessageResult(sendMessageResult: SendMessageResult) { + private fun renderSendMessageResult(sendMessageResult: RoomDetailViewEvents.SendMessageResult) { when (sendMessageResult) { - is SendMessageResult.MessageSent -> { + is RoomDetailViewEvents.MessageSent -> { updateComposerText("") } - is SendMessageResult.SlashCommandHandled -> { + is RoomDetailViewEvents.SlashCommandHandled -> { sendMessageResult.messageRes?.let { showSnackWithMessage(getString(it)) } updateComposerText("") } - is SendMessageResult.SlashCommandError -> { + is RoomDetailViewEvents.SlashCommandError -> { displayCommandError(getString(R.string.command_problem_with_parameters, sendMessageResult.command.command)) } - is SendMessageResult.SlashCommandUnknown -> { + is RoomDetailViewEvents.SlashCommandUnknown -> { displayCommandError(getString(R.string.unrecognized_command, sendMessageResult.command)) } - is SendMessageResult.SlashCommandResultOk -> { + is RoomDetailViewEvents.SlashCommandResultOk -> { updateComposerText("") } - is SendMessageResult.SlashCommandResultError -> { + is RoomDetailViewEvents.SlashCommandResultError -> { displayCommandError(sendMessageResult.throwable.localizedMessage) } - is SendMessageResult.SlashCommandNotImplemented -> { + is RoomDetailViewEvents.SlashCommandNotImplemented -> { displayCommandError(getString(R.string.not_implemented)) } - } + } // .exhaustive lockSendButton = false } diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailViewEvents.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailViewEvents.kt index 96ca7bf24e..63f3cdded9 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailViewEvents.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailViewEvents.kt @@ -16,7 +16,9 @@ package im.vector.riotx.features.home.room.detail +import androidx.annotation.StringRes import im.vector.riotx.core.platform.VectorViewEvents +import im.vector.riotx.features.command.Command /** * Transient events for RoomDetail @@ -29,4 +31,15 @@ sealed class RoomDetailViewEvents : VectorViewEvents { data class ActionFailure(val action: RoomDetailAction, val throwable: Throwable) : RoomDetailViewEvents() data class ShowMessage(val message: String) : RoomDetailViewEvents() + + abstract class SendMessageResult : RoomDetailViewEvents() + + object MessageSent : SendMessageResult() + class SlashCommandError(val command: Command) : SendMessageResult() + class SlashCommandUnknown(val command: String) : SendMessageResult() + data class SlashCommandHandled(@StringRes val messageRes: Int? = null) : SendMessageResult() + object SlashCommandResultOk : SendMessageResult() + class SlashCommandResultError(val throwable: Throwable) : SendMessageResult() + // TODO Remove + object SlashCommandNotImplemented : SendMessageResult() } 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 f42baff59e..50422d9199 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 @@ -314,10 +314,6 @@ class RoomDetailViewModel @AssistedInject constructor(@Assisted initialState: Ro } // TODO Cleanup this and use ViewEvents - private val _sendMessageResultLiveData = MutableLiveData>() - val sendMessageResultLiveData: LiveData> - get() = _sendMessageResultLiveData - private val _navigateToEvent = MutableLiveData>() val navigateToEvent: LiveData> get() = _navigateToEvent @@ -349,17 +345,17 @@ class RoomDetailViewModel @AssistedInject constructor(@Assisted initialState: Ro is ParsedCommand.ErrorNotACommand -> { // Send the text message to the room room.sendTextMessage(action.text, autoMarkdown = action.autoMarkdown) - _sendMessageResultLiveData.postLiveEvent(SendMessageResult.MessageSent) + _viewEvents.post(RoomDetailViewEvents.MessageSent) popDraft() } is ParsedCommand.ErrorSyntax -> { - _sendMessageResultLiveData.postLiveEvent(SendMessageResult.SlashCommandError(slashCommandResult.command)) + _viewEvents.post(RoomDetailViewEvents.SlashCommandError(slashCommandResult.command)) } is ParsedCommand.ErrorEmptySlashCommand -> { - _sendMessageResultLiveData.postLiveEvent(SendMessageResult.SlashCommandUnknown("/")) + _viewEvents.post(RoomDetailViewEvents.SlashCommandUnknown("/")) } is ParsedCommand.ErrorUnknownSlashCommand -> { - _sendMessageResultLiveData.postLiveEvent(SendMessageResult.SlashCommandUnknown(slashCommandResult.slashCommand)) + _viewEvents.post(RoomDetailViewEvents.SlashCommandUnknown(slashCommandResult.slashCommand)) } is ParsedCommand.Invite -> { handleInviteSlashCommand(slashCommandResult) @@ -367,55 +363,55 @@ class RoomDetailViewModel @AssistedInject constructor(@Assisted initialState: Ro } is ParsedCommand.SetUserPowerLevel -> { // TODO - _sendMessageResultLiveData.postLiveEvent(SendMessageResult.SlashCommandNotImplemented) + _viewEvents.post(RoomDetailViewEvents.SlashCommandNotImplemented) } is ParsedCommand.ClearScalarToken -> { // TODO - _sendMessageResultLiveData.postLiveEvent(SendMessageResult.SlashCommandNotImplemented) + _viewEvents.post(RoomDetailViewEvents.SlashCommandNotImplemented) } is ParsedCommand.SetMarkdown -> { vectorPreferences.setMarkdownEnabled(slashCommandResult.enable) - _sendMessageResultLiveData.postLiveEvent(SendMessageResult.SlashCommandHandled( + _viewEvents.post(RoomDetailViewEvents.SlashCommandHandled( if (slashCommandResult.enable) R.string.markdown_has_been_enabled else R.string.markdown_has_been_disabled)) popDraft() } is ParsedCommand.UnbanUser -> { // TODO - _sendMessageResultLiveData.postLiveEvent(SendMessageResult.SlashCommandNotImplemented) + _viewEvents.post(RoomDetailViewEvents.SlashCommandNotImplemented) } is ParsedCommand.BanUser -> { // TODO - _sendMessageResultLiveData.postLiveEvent(SendMessageResult.SlashCommandNotImplemented) + _viewEvents.post(RoomDetailViewEvents.SlashCommandNotImplemented) } is ParsedCommand.KickUser -> { // TODO - _sendMessageResultLiveData.postLiveEvent(SendMessageResult.SlashCommandNotImplemented) + _viewEvents.post(RoomDetailViewEvents.SlashCommandNotImplemented) } is ParsedCommand.JoinRoom -> { // TODO - _sendMessageResultLiveData.postLiveEvent(SendMessageResult.SlashCommandNotImplemented) + _viewEvents.post(RoomDetailViewEvents.SlashCommandNotImplemented) } is ParsedCommand.PartRoom -> { // TODO - _sendMessageResultLiveData.postLiveEvent(SendMessageResult.SlashCommandNotImplemented) + _viewEvents.post(RoomDetailViewEvents.SlashCommandNotImplemented) } is ParsedCommand.SendEmote -> { room.sendTextMessage(slashCommandResult.message, msgType = MessageType.MSGTYPE_EMOTE) - _sendMessageResultLiveData.postLiveEvent(SendMessageResult.SlashCommandHandled()) + _viewEvents.post(RoomDetailViewEvents.SlashCommandHandled()) popDraft() } is ParsedCommand.SendRainbow -> { slashCommandResult.message.toString().let { room.sendFormattedTextMessage(it, rainbowGenerator.generate(it)) } - _sendMessageResultLiveData.postLiveEvent(SendMessageResult.SlashCommandHandled()) + _viewEvents.post(RoomDetailViewEvents.SlashCommandHandled()) popDraft() } is ParsedCommand.SendRainbowEmote -> { slashCommandResult.message.toString().let { room.sendFormattedTextMessage(it, rainbowGenerator.generate(it), MessageType.MSGTYPE_EMOTE) } - _sendMessageResultLiveData.postLiveEvent(SendMessageResult.SlashCommandHandled()) + _viewEvents.post(RoomDetailViewEvents.SlashCommandHandled()) popDraft() } is ParsedCommand.SendSpoiler -> { @@ -423,7 +419,7 @@ class RoomDetailViewModel @AssistedInject constructor(@Assisted initialState: Ro "[${stringProvider.getString(R.string.spoiler)}](${slashCommandResult.message})", "${slashCommandResult.message}" ) - _sendMessageResultLiveData.postLiveEvent(SendMessageResult.SlashCommandHandled()) + _viewEvents.post(RoomDetailViewEvents.SlashCommandHandled()) popDraft() } is ParsedCommand.SendShrug -> { @@ -435,12 +431,12 @@ class RoomDetailViewModel @AssistedInject constructor(@Assisted initialState: Ro } } room.sendTextMessage(sequence) - _sendMessageResultLiveData.postLiveEvent(SendMessageResult.SlashCommandHandled()) + _viewEvents.post(RoomDetailViewEvents.SlashCommandHandled()) popDraft() } is ParsedCommand.VerifyUser -> { session.getVerificationService().requestKeyVerificationInDMs(supportedVerificationMethods, slashCommandResult.userId, room.roomId) - _sendMessageResultLiveData.postLiveEvent(SendMessageResult.SlashCommandHandled()) + _viewEvents.post(RoomDetailViewEvents.SlashCommandHandled()) popDraft() } is ParsedCommand.ChangeTopic -> { @@ -449,7 +445,7 @@ class RoomDetailViewModel @AssistedInject constructor(@Assisted initialState: Ro } is ParsedCommand.ChangeDisplayName -> { // TODO - _sendMessageResultLiveData.postLiveEvent(SendMessageResult.SlashCommandNotImplemented) + _viewEvents.post(RoomDetailViewEvents.SlashCommandNotImplemented) } }.exhaustive } @@ -476,7 +472,7 @@ class RoomDetailViewModel @AssistedInject constructor(@Assisted initialState: Ro Timber.w("Same message content, do not send edition") } } - _sendMessageResultLiveData.postLiveEvent(SendMessageResult.MessageSent) + _viewEvents.post(RoomDetailViewEvents.MessageSent) popDraft() } is SendMode.QUOTE -> { @@ -499,13 +495,13 @@ class RoomDetailViewModel @AssistedInject constructor(@Assisted initialState: Ro } else { room.sendFormattedTextMessage(finalText, htmlText) } - _sendMessageResultLiveData.postLiveEvent(SendMessageResult.MessageSent) + _viewEvents.post(RoomDetailViewEvents.MessageSent) popDraft() } is SendMode.REPLY -> { state.sendMode.timelineEvent.let { room.replyToMessage(it, action.text.toString(), action.autoMarkdown) - _sendMessageResultLiveData.postLiveEvent(SendMessageResult.MessageSent) + _viewEvents.post(RoomDetailViewEvents.MessageSent) popDraft() } } @@ -538,29 +534,29 @@ class RoomDetailViewModel @AssistedInject constructor(@Assisted initialState: Ro } private fun handleChangeTopicSlashCommand(changeTopic: ParsedCommand.ChangeTopic) { - _sendMessageResultLiveData.postLiveEvent(SendMessageResult.SlashCommandHandled()) + _viewEvents.post(RoomDetailViewEvents.SlashCommandHandled()) room.updateTopic(changeTopic.topic, object : MatrixCallback { override fun onSuccess(data: Unit) { - _sendMessageResultLiveData.postLiveEvent(SendMessageResult.SlashCommandResultOk) + _viewEvents.post(RoomDetailViewEvents.SlashCommandResultOk) } override fun onFailure(failure: Throwable) { - _sendMessageResultLiveData.postLiveEvent(SendMessageResult.SlashCommandResultError(failure)) + _viewEvents.post(RoomDetailViewEvents.SlashCommandResultError(failure)) } }) } private fun handleInviteSlashCommand(invite: ParsedCommand.Invite) { - _sendMessageResultLiveData.postLiveEvent(SendMessageResult.SlashCommandHandled()) + _viewEvents.post(RoomDetailViewEvents.SlashCommandHandled()) room.invite(invite.userId, invite.reason, object : MatrixCallback { override fun onSuccess(data: Unit) { - _sendMessageResultLiveData.postLiveEvent(SendMessageResult.SlashCommandResultOk) + _viewEvents.post(RoomDetailViewEvents.SlashCommandResultOk) } override fun onFailure(failure: Throwable) { - _sendMessageResultLiveData.postLiveEvent(SendMessageResult.SlashCommandResultError(failure)) + _viewEvents.post(RoomDetailViewEvents.SlashCommandResultError(failure)) } }) } diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/SendMessageResult.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/SendMessageResult.kt deleted file mode 100644 index 9f8d7304f5..0000000000 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/SendMessageResult.kt +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2019 New Vector Ltd - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package im.vector.riotx.features.home.room.detail - -import androidx.annotation.StringRes -import im.vector.riotx.features.command.Command - -sealed class SendMessageResult { - object MessageSent : SendMessageResult() - class SlashCommandError(val command: Command) : SendMessageResult() - class SlashCommandUnknown(val command: String) : SendMessageResult() - data class SlashCommandHandled(@StringRes val messageRes: Int? = null) : SendMessageResult() - object SlashCommandResultOk : SendMessageResult() - class SlashCommandResultError(val throwable: Throwable) : SendMessageResult() - // TODO Remove - object SlashCommandNotImplemented : SendMessageResult() -}