From 5b94540f7656b698f54ef89877d18e695aef6f3d Mon Sep 17 00:00:00 2001 From: Valere Date: Tue, 16 Mar 2021 12:16:11 +0100 Subject: [PATCH] Quick Work around to remove stuck messages --- CHANGES.md | 2 +- .../home/room/detail/RoomDetailAction.kt | 2 +- .../home/room/detail/RoomDetailFragment.kt | 20 +++++++------ .../home/room/detail/RoomDetailViewModel.kt | 4 +++ .../timeline/action/EventSharedAction.kt | 2 +- .../action/MessageActionsViewModel.kt | 28 ++++++++++++++----- 6 files changed, 40 insertions(+), 18 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index e4ff049550..d123e3c732 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -8,7 +8,7 @@ Improvements 🙌: - Bugfix 🐛: - - + - Add option to cancel stuck messages at bottom of timeline see #516 Translations 🗣: - diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailAction.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailAction.kt index ecbd0b0d30..72e614c18c 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailAction.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailAction.kt @@ -58,7 +58,7 @@ sealed class RoomDetailAction : VectorViewModelAction { data class ResendMessage(val eventId: String) : RoomDetailAction() data class RemoveFailedEcho(val eventId: String) : RoomDetailAction() - data class CancelSend(val eventId: String) : RoomDetailAction() + data class CancelSend(val eventId: String, val force: Boolean) : RoomDetailAction() data class ReplyToOptions(val eventId: String, val optionIndex: Int, val optionValue: String) : RoomDetailAction() diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt index 1a487eb065..a80aeb65b0 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt @@ -1570,14 +1570,18 @@ class RoomDetailFragment @Inject constructor( } private fun handleCancelSend(action: EventSharedAction.Cancel) { - AlertDialog.Builder(requireContext()) - .setTitle(R.string.dialog_title_confirmation) - .setMessage(getString(R.string.event_status_cancel_sending_dialog_message)) - .setNegativeButton(R.string.no, null) - .setPositiveButton(R.string.yes) { _, _ -> - roomDetailViewModel.handle(RoomDetailAction.CancelSend(action.eventId)) - } - .show() + if (action.force) { + roomDetailViewModel.handle(RoomDetailAction.CancelSend(action.eventId, true)) + } else { + AlertDialog.Builder(requireContext()) + .setTitle(R.string.dialog_title_confirmation) + .setMessage(getString(R.string.event_status_cancel_sending_dialog_message)) + .setNegativeButton(R.string.no, null) + .setPositiveButton(R.string.yes) { _, _ -> + roomDetailViewModel.handle(RoomDetailAction.CancelSend(action.eventId, false)) + } + .show() + } } override fun onAvatarClicked(informationData: MessageInformationData) { diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt index 115b0b29dd..af3d5461ef 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt @@ -1208,6 +1208,10 @@ class RoomDetailViewModel @AssistedInject constructor( } private fun handleCancel(action: RoomDetailAction.CancelSend) { + if (action.force) { + room.cancelSend(action.eventId) + return + } val targetEventId = action.eventId room.getTimeLineEvent(targetEventId)?.let { // State must be in one of the sending states diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/action/EventSharedAction.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/action/EventSharedAction.kt index c21d552409..d9ee7f3ccf 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/action/EventSharedAction.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/action/EventSharedAction.kt @@ -63,7 +63,7 @@ sealed class EventSharedAction(@StringRes val titleRes: Int, data class Redact(val eventId: String, val askForReason: Boolean) : EventSharedAction(R.string.message_action_item_redact, R.drawable.ic_delete, true) - data class Cancel(val eventId: String) : + data class Cancel(val eventId: String, val force: Boolean) : EventSharedAction(R.string.cancel, R.drawable.ic_close_round) data class ViewSource(val content: String) : diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/action/MessageActionsViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/action/MessageActionsViewModel.kt index adf315a955..f748369061 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/action/MessageActionsViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/action/MessageActionsViewModel.kt @@ -250,6 +250,9 @@ class MessageActionsViewModel @AssistedInject constructor(@Assisted timelineEvent.root.sendState == SendState.SYNCED -> { addActionsForSyncedState(timelineEvent, actionPermissions, messageContent, msgType) } + timelineEvent.root.sendState == SendState.SENT -> { + addActionsForSentNotSyncedState(timelineEvent, actionPermissions, messageContent, msgType) + } } } } @@ -287,7 +290,24 @@ class MessageActionsViewModel @AssistedInject constructor(@Assisted private fun ArrayList.addActionsForSendingState(timelineEvent: TimelineEvent) { // TODO is uploading attachment? if (canCancel(timelineEvent)) { - add(EventSharedAction.Cancel(timelineEvent.eventId)) + add(EventSharedAction.Cancel(timelineEvent.eventId, false)) + } + } + + private fun ArrayList.addActionsForSentNotSyncedState(timelineEvent: TimelineEvent, + actionPermissions: ActionPermissions, + messageContent: MessageContent?, + msgType: String?) { + if (timelineEvent.root.sendState == SendState.SENT) { + // If sent but not synced (synapse stuck at bottom bug) + // Still offer action to cancel (will only remove local echo) + timelineEvent.root.eventId?.let { + add(EventSharedAction.Cancel(it, true)) + } + + // TODO Can be redacted + + // TODO sent by me or sufficient power level } } @@ -337,12 +357,6 @@ class MessageActionsViewModel @AssistedInject constructor(@Assisted if (canSave(msgType) && messageContent is MessageWithAttachmentContent) { add(EventSharedAction.Save(timelineEvent.eventId, messageContent)) } - - if (timelineEvent.root.sendState == SendState.SENT) { - // TODO Can be redacted - - // TODO sent by me or sufficient power level - } } if (vectorPreferences.developerMode()) {