Merge pull request #4548 from vector-im/feature/adm/sealed-class-cleanup

Voice related sealed class cleanup
This commit is contained in:
Benoit Marty 2021-11-24 11:10:10 +01:00 committed by GitHub
commit bd423db98a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 54 additions and 54 deletions

View File

@ -23,15 +23,15 @@ package org.matrix.android.sdk.api.session.room.send
* EDIT: draft of an edition of a message * EDIT: draft of an edition of a message
* REPLY: draft of a reply of another message * REPLY: draft of a reply of another message
*/ */
sealed class UserDraft(open val text: String) { sealed interface UserDraft {
data class REGULAR(override val text: String) : UserDraft(text) data class Regular(val text: String) : UserDraft
data class QUOTE(val linkedEventId: String, override val text: String) : UserDraft(text) data class Quote(val linkedEventId: String, val text: String) : UserDraft
data class EDIT(val linkedEventId: String, override val text: String) : UserDraft(text) data class Edit(val linkedEventId: String, val text: String) : UserDraft
data class REPLY(val linkedEventId: String, override val text: String) : UserDraft(text) data class Reply(val linkedEventId: String, val text: String) : UserDraft
fun isValid(): Boolean { fun isValid(): Boolean {
return when (this) { return when (this) {
is REGULAR -> text.isNotBlank() is Regular -> text.isNotBlank()
else -> true else -> true
} }
} }

View File

@ -26,20 +26,20 @@ internal object DraftMapper {
fun map(entity: DraftEntity): UserDraft { fun map(entity: DraftEntity): UserDraft {
return when (entity.draftMode) { return when (entity.draftMode) {
DraftEntity.MODE_REGULAR -> UserDraft.REGULAR(entity.content) DraftEntity.MODE_REGULAR -> UserDraft.Regular(entity.content)
DraftEntity.MODE_EDIT -> UserDraft.EDIT(entity.linkedEventId, entity.content) DraftEntity.MODE_EDIT -> UserDraft.Edit(entity.linkedEventId, entity.content)
DraftEntity.MODE_QUOTE -> UserDraft.QUOTE(entity.linkedEventId, entity.content) DraftEntity.MODE_QUOTE -> UserDraft.Quote(entity.linkedEventId, entity.content)
DraftEntity.MODE_REPLY -> UserDraft.REPLY(entity.linkedEventId, entity.content) DraftEntity.MODE_REPLY -> UserDraft.Reply(entity.linkedEventId, entity.content)
else -> null else -> null
} ?: UserDraft.REGULAR("") } ?: UserDraft.Regular("")
} }
fun map(domain: UserDraft): DraftEntity { fun map(domain: UserDraft): DraftEntity {
return when (domain) { return when (domain) {
is UserDraft.REGULAR -> DraftEntity(content = domain.text, draftMode = DraftEntity.MODE_REGULAR, linkedEventId = "") is UserDraft.Regular -> DraftEntity(content = domain.text, draftMode = DraftEntity.MODE_REGULAR, linkedEventId = "")
is UserDraft.EDIT -> DraftEntity(content = domain.text, draftMode = DraftEntity.MODE_EDIT, linkedEventId = domain.linkedEventId) is UserDraft.Edit -> DraftEntity(content = domain.text, draftMode = DraftEntity.MODE_EDIT, linkedEventId = domain.linkedEventId)
is UserDraft.QUOTE -> DraftEntity(content = domain.text, draftMode = DraftEntity.MODE_QUOTE, linkedEventId = domain.linkedEventId) is UserDraft.Quote -> DraftEntity(content = domain.text, draftMode = DraftEntity.MODE_QUOTE, linkedEventId = domain.linkedEventId)
is UserDraft.REPLY -> DraftEntity(content = domain.text, draftMode = DraftEntity.MODE_REPLY, linkedEventId = domain.linkedEventId) is UserDraft.Reply -> DraftEntity(content = domain.text, draftMode = DraftEntity.MODE_REPLY, linkedEventId = domain.linkedEventId)
} }
} }
} }

View File

@ -391,10 +391,10 @@ class RoomDetailFragment @Inject constructor(
return@onEach return@onEach
} }
when (mode) { when (mode) {
is SendMode.REGULAR -> renderRegularMode(mode.text) is SendMode.Regular -> renderRegularMode(mode.text)
is SendMode.EDIT -> renderSpecialMode(mode.timelineEvent, R.drawable.ic_edit, R.string.edit, mode.text) is SendMode.Edit -> renderSpecialMode(mode.timelineEvent, R.drawable.ic_edit, R.string.edit, mode.text)
is SendMode.QUOTE -> renderSpecialMode(mode.timelineEvent, R.drawable.ic_quote, R.string.quote, mode.text) is SendMode.Quote -> renderSpecialMode(mode.timelineEvent, R.drawable.ic_quote, R.string.quote, mode.text)
is SendMode.REPLY -> renderSpecialMode(mode.timelineEvent, R.drawable.ic_reply, R.string.reply, mode.text) is SendMode.Reply -> renderSpecialMode(mode.timelineEvent, R.drawable.ic_reply, R.string.reply, mode.text)
} }
} }

View File

@ -120,7 +120,7 @@ class MessageComposerViewModel @AssistedInject constructor(
} }
private fun updateIsSendButtonVisibility(triggerAnimation: Boolean) = setState { private fun updateIsSendButtonVisibility(triggerAnimation: Boolean) = setState {
val isSendButtonVisible = isComposerVisible && (sendMode !is SendMode.REGULAR || currentComposerText.isNotBlank()) val isSendButtonVisible = isComposerVisible && (sendMode !is SendMode.Regular || currentComposerText.isNotBlank())
if (this.isSendButtonVisible != isSendButtonVisible && triggerAnimation) { if (this.isSendButtonVisible != isSendButtonVisible && triggerAnimation) {
_viewEvents.post(MessageComposerViewEvents.AnimateSendButtonVisibility(isSendButtonVisible)) _viewEvents.post(MessageComposerViewEvents.AnimateSendButtonVisibility(isSendButtonVisible))
} }
@ -128,12 +128,12 @@ class MessageComposerViewModel @AssistedInject constructor(
} }
private fun handleEnterRegularMode(action: MessageComposerAction.EnterRegularMode) = setState { private fun handleEnterRegularMode(action: MessageComposerAction.EnterRegularMode) = setState {
copy(sendMode = SendMode.REGULAR(action.text, action.fromSharing)) copy(sendMode = SendMode.Regular(action.text, action.fromSharing))
} }
private fun handleEnterEditMode(action: MessageComposerAction.EnterEditMode) { private fun handleEnterEditMode(action: MessageComposerAction.EnterEditMode) {
room.getTimeLineEvent(action.eventId)?.let { timelineEvent -> room.getTimeLineEvent(action.eventId)?.let { timelineEvent ->
setState { copy(sendMode = SendMode.EDIT(timelineEvent, timelineEvent.getTextEditableContent())) } setState { copy(sendMode = SendMode.Edit(timelineEvent, timelineEvent.getTextEditableContent())) }
} }
} }
@ -147,20 +147,20 @@ class MessageComposerViewModel @AssistedInject constructor(
private fun handleEnterQuoteMode(action: MessageComposerAction.EnterQuoteMode) { private fun handleEnterQuoteMode(action: MessageComposerAction.EnterQuoteMode) {
room.getTimeLineEvent(action.eventId)?.let { timelineEvent -> room.getTimeLineEvent(action.eventId)?.let { timelineEvent ->
setState { copy(sendMode = SendMode.QUOTE(timelineEvent, action.text)) } setState { copy(sendMode = SendMode.Quote(timelineEvent, action.text)) }
} }
} }
private fun handleEnterReplyMode(action: MessageComposerAction.EnterReplyMode) { private fun handleEnterReplyMode(action: MessageComposerAction.EnterReplyMode) {
room.getTimeLineEvent(action.eventId)?.let { timelineEvent -> room.getTimeLineEvent(action.eventId)?.let { timelineEvent ->
setState { copy(sendMode = SendMode.REPLY(timelineEvent, action.text)) } setState { copy(sendMode = SendMode.Reply(timelineEvent, action.text)) }
} }
} }
private fun handleSendMessage(action: MessageComposerAction.SendMessage) { private fun handleSendMessage(action: MessageComposerAction.SendMessage) {
withState { state -> withState { state ->
when (state.sendMode) { when (state.sendMode) {
is SendMode.REGULAR -> { is SendMode.Regular -> {
when (val slashCommandResult = CommandParser.parseSplashCommand(action.text)) { when (val slashCommandResult = CommandParser.parseSplashCommand(action.text)) {
is ParsedCommand.ErrorNotACommand -> { is ParsedCommand.ErrorNotACommand -> {
// Send the text message to the room // Send the text message to the room
@ -382,7 +382,7 @@ class MessageComposerViewModel @AssistedInject constructor(
} }
}.exhaustive }.exhaustive
} }
is SendMode.EDIT -> { is SendMode.Edit -> {
// is original event a reply? // is original event a reply?
val inReplyTo = state.sendMode.timelineEvent.getRelationContent()?.inReplyTo?.eventId val inReplyTo = state.sendMode.timelineEvent.getRelationContent()?.inReplyTo?.eventId
if (inReplyTo != null) { if (inReplyTo != null) {
@ -405,7 +405,7 @@ class MessageComposerViewModel @AssistedInject constructor(
_viewEvents.post(MessageComposerViewEvents.MessageSent) _viewEvents.post(MessageComposerViewEvents.MessageSent)
popDraft() popDraft()
} }
is SendMode.QUOTE -> { is SendMode.Quote -> {
val messageContent = state.sendMode.timelineEvent.getLastMessageContent() val messageContent = state.sendMode.timelineEvent.getLastMessageContent()
val textMsg = messageContent?.body val textMsg = messageContent?.body
@ -426,7 +426,7 @@ class MessageComposerViewModel @AssistedInject constructor(
_viewEvents.post(MessageComposerViewEvents.MessageSent) _viewEvents.post(MessageComposerViewEvents.MessageSent)
popDraft() popDraft()
} }
is SendMode.REPLY -> { is SendMode.Reply -> {
state.sendMode.timelineEvent.let { state.sendMode.timelineEvent.let {
room.replyToMessage(it, action.text.toString(), action.autoMarkdown) room.replyToMessage(it, action.text.toString(), action.autoMarkdown)
_viewEvents.post(MessageComposerViewEvents.MessageSent) _viewEvents.post(MessageComposerViewEvents.MessageSent)
@ -438,12 +438,12 @@ class MessageComposerViewModel @AssistedInject constructor(
} }
private fun popDraft() = withState { private fun popDraft() = withState {
if (it.sendMode is SendMode.REGULAR && it.sendMode.fromSharing) { if (it.sendMode is SendMode.Regular && it.sendMode.fromSharing) {
// If we were sharing, we want to get back our last value from draft // If we were sharing, we want to get back our last value from draft
loadDraftIfAny() loadDraftIfAny()
} else { } else {
// Otherwise we clear the composer and remove the draft from db // Otherwise we clear the composer and remove the draft from db
setState { copy(sendMode = SendMode.REGULAR("", false)) } setState { copy(sendMode = SendMode.Regular("", false)) }
viewModelScope.launch { viewModelScope.launch {
room.deleteDraft() room.deleteDraft()
} }
@ -456,24 +456,24 @@ class MessageComposerViewModel @AssistedInject constructor(
copy( copy(
// Create a sendMode from a draft and retrieve the TimelineEvent // Create a sendMode from a draft and retrieve the TimelineEvent
sendMode = when (currentDraft) { sendMode = when (currentDraft) {
is UserDraft.REGULAR -> SendMode.REGULAR(currentDraft.text, false) is UserDraft.Regular -> SendMode.Regular(currentDraft.text, false)
is UserDraft.QUOTE -> { is UserDraft.Quote -> {
room.getTimeLineEvent(currentDraft.linkedEventId)?.let { timelineEvent -> room.getTimeLineEvent(currentDraft.linkedEventId)?.let { timelineEvent ->
SendMode.QUOTE(timelineEvent, currentDraft.text) SendMode.Quote(timelineEvent, currentDraft.text)
} }
} }
is UserDraft.REPLY -> { is UserDraft.Reply -> {
room.getTimeLineEvent(currentDraft.linkedEventId)?.let { timelineEvent -> room.getTimeLineEvent(currentDraft.linkedEventId)?.let { timelineEvent ->
SendMode.REPLY(timelineEvent, currentDraft.text) SendMode.Reply(timelineEvent, currentDraft.text)
} }
} }
is UserDraft.EDIT -> { is UserDraft.Edit -> {
room.getTimeLineEvent(currentDraft.linkedEventId)?.let { timelineEvent -> room.getTimeLineEvent(currentDraft.linkedEventId)?.let { timelineEvent ->
SendMode.EDIT(timelineEvent, currentDraft.text) SendMode.Edit(timelineEvent, currentDraft.text)
} }
} }
else -> null else -> null
} ?: SendMode.REGULAR("", fromSharing = false) } ?: SendMode.Regular("", fromSharing = false)
) )
} }
} }
@ -679,21 +679,21 @@ class MessageComposerViewModel @AssistedInject constructor(
private fun handleSaveDraft(action: MessageComposerAction.SaveDraft) = withState { private fun handleSaveDraft(action: MessageComposerAction.SaveDraft) = withState {
session.coroutineScope.launch { session.coroutineScope.launch {
when { when {
it.sendMode is SendMode.REGULAR && !it.sendMode.fromSharing -> { it.sendMode is SendMode.Regular && !it.sendMode.fromSharing -> {
setState { copy(sendMode = it.sendMode.copy(action.draft)) } setState { copy(sendMode = it.sendMode.copy(action.draft)) }
room.saveDraft(UserDraft.REGULAR(action.draft)) room.saveDraft(UserDraft.Regular(action.draft))
} }
it.sendMode is SendMode.REPLY -> { it.sendMode is SendMode.Reply -> {
setState { copy(sendMode = it.sendMode.copy(text = action.draft)) } setState { copy(sendMode = it.sendMode.copy(text = action.draft)) }
room.saveDraft(UserDraft.REPLY(it.sendMode.timelineEvent.root.eventId!!, action.draft)) room.saveDraft(UserDraft.Reply(it.sendMode.timelineEvent.root.eventId!!, action.draft))
} }
it.sendMode is SendMode.QUOTE -> { it.sendMode is SendMode.Quote -> {
setState { copy(sendMode = it.sendMode.copy(text = action.draft)) } setState { copy(sendMode = it.sendMode.copy(text = action.draft)) }
room.saveDraft(UserDraft.QUOTE(it.sendMode.timelineEvent.root.eventId!!, action.draft)) room.saveDraft(UserDraft.Quote(it.sendMode.timelineEvent.root.eventId!!, action.draft))
} }
it.sendMode is SendMode.EDIT -> { it.sendMode is SendMode.Edit -> {
setState { copy(sendMode = it.sendMode.copy(text = action.draft)) } setState { copy(sendMode = it.sendMode.copy(text = action.draft)) }
room.saveDraft(UserDraft.EDIT(it.sendMode.timelineEvent.root.eventId!!, action.draft)) room.saveDraft(UserDraft.Edit(it.sendMode.timelineEvent.root.eventId!!, action.draft))
} }
} }
} }

View File

@ -29,24 +29,24 @@ import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent
* *
* Depending on the state the bottom toolbar will change (icons/preview/actions...) * Depending on the state the bottom toolbar will change (icons/preview/actions...)
*/ */
sealed class SendMode(open val text: String) { sealed interface SendMode {
data class REGULAR( data class Regular(
override val text: String, val text: String,
val fromSharing: Boolean, val fromSharing: Boolean,
// This is necessary for forcing refresh on selectSubscribe // This is necessary for forcing refresh on selectSubscribe
private val ts: Long = System.currentTimeMillis() private val ts: Long = System.currentTimeMillis()
) : SendMode(text) ) : SendMode
data class QUOTE(val timelineEvent: TimelineEvent, override val text: String) : SendMode(text) data class Quote(val timelineEvent: TimelineEvent, val text: String) : SendMode
data class EDIT(val timelineEvent: TimelineEvent, override val text: String) : SendMode(text) data class Edit(val timelineEvent: TimelineEvent, val text: String) : SendMode
data class REPLY(val timelineEvent: TimelineEvent, override val text: String) : SendMode(text) data class Reply(val timelineEvent: TimelineEvent, val text: String) : SendMode
} }
data class MessageComposerViewState( data class MessageComposerViewState(
val roomId: String, val roomId: String,
val canSendMessage: Boolean = true, val canSendMessage: Boolean = true,
val isSendButtonVisible: Boolean = false, val isSendButtonVisible: Boolean = false,
val sendMode: SendMode = SendMode.REGULAR("", false), val sendMode: SendMode = SendMode.Regular("", false),
val voiceRecordingUiState: VoiceMessageRecorderView.RecordingUiState = VoiceMessageRecorderView.RecordingUiState.None val voiceRecordingUiState: VoiceMessageRecorderView.RecordingUiState = VoiceMessageRecorderView.RecordingUiState.None
) : MavericksState { ) : MavericksState {