diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/events/model/Event.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/events/model/Event.kt index fb94d61c0b..d131960893 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/events/model/Event.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/events/model/Event.kt @@ -157,6 +157,11 @@ data class Event( */ fun isRedacted() = unsignedData?.redactedEvent != null + /** + * Tells if the event is redacted by the user himself. + */ + fun isRedactedBySameUser() = senderId == unsignedData?.redactedEvent?.senderId + override fun equals(other: Any?): Boolean { if (this === other) return true if (javaClass != other?.javaClass) return false 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 cbda6ab13e..3f574a320c 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 @@ -788,14 +788,14 @@ class RoomDetailFragment @Inject constructor( .show() } - private fun promptConfirmationToRedactEvent(eventId: String, askForReason: Boolean) { + private fun promptConfirmationToRedactEvent(action: EventSharedAction.Redact) { val layout = requireActivity().layoutInflater.inflate(R.layout.dialog_delete_event, null) val reasonCheckBox = layout.findViewById<MaterialCheckBox>(R.id.deleteEventReasonCheck) val reasonTextInputLayout = layout.findViewById<TextInputLayout>(R.id.deleteEventReasonTextInputLayout) val reasonInput = layout.findViewById<TextInputEditText>(R.id.deleteEventReasonInput) - reasonCheckBox.isVisible = askForReason - reasonTextInputLayout.isVisible = askForReason + reasonCheckBox.isVisible = action.askForReason + reasonTextInputLayout.isVisible = action.askForReason reasonCheckBox.setOnCheckedChangeListener { _, isChecked -> reasonTextInputLayout.isEnabled = isChecked } @@ -804,10 +804,10 @@ class RoomDetailFragment @Inject constructor( .setView(layout) .setPositiveButton(R.string.remove) { _, _ -> val reason = reasonInput.text.toString() - .takeIf { askForReason } + .takeIf { action.askForReason } ?.takeIf { reasonCheckBox.isChecked } ?.takeIf { it.isNotBlank() } - roomDetailViewModel.handle(RoomDetailAction.RedactAction(eventId, reason)) + roomDetailViewModel.handle(RoomDetailAction.RedactAction(action.eventId, reason)) } .setNegativeButton(R.string.cancel, null) .show() @@ -1125,7 +1125,7 @@ class RoomDetailFragment @Inject constructor( showSnackWithMessage(getString(R.string.copied_to_clipboard), Snackbar.LENGTH_SHORT) } is EventSharedAction.Redact -> { - promptConfirmationToRedactEvent(action.eventId, action.askForReason) + promptConfirmationToRedactEvent(action) } is EventSharedAction.Share -> { // TODO current data communication is too limited diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/action/MessageActionsViewModel.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/action/MessageActionsViewModel.kt index 04841266ec..8a908c842f 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/action/MessageActionsViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/action/MessageActionsViewModel.kt @@ -168,27 +168,25 @@ class MessageActionsViewModel @AssistedInject constructor(@Assisted } private fun computeMessageBody(timelineEvent: TimelineEvent): CharSequence { + if (timelineEvent.root.isRedacted()) { + return getRedactionReason(timelineEvent) + } + return when (timelineEvent.root.getClearType()) { EventType.MESSAGE, - EventType.ENCRYPTED, EventType.STICKER -> { - when (timelineEvent.root.isRedacted()) { - true -> getRedactionReason(timelineEvent) - false -> { - val messageContent: MessageContent? = timelineEvent.getLastMessageContent() - if (messageContent is MessageTextContent && messageContent.format == MessageFormat.FORMAT_MATRIX_HTML) { - val html = messageContent.formattedBody - ?.takeIf { it.isNotBlank() } - ?.let { htmlCompressor.compress(it) } - ?: messageContent.body + val messageContent: MessageContent? = timelineEvent.getLastMessageContent() + if (messageContent is MessageTextContent && messageContent.format == MessageFormat.FORMAT_MATRIX_HTML) { + val html = messageContent.formattedBody + ?.takeIf { it.isNotBlank() } + ?.let { htmlCompressor.compress(it) } + ?: messageContent.body - eventHtmlRenderer.get().render(html) - } else if (messageContent is MessageVerificationRequestContent) { - stringProvider.getString(R.string.verification_request) - } else { - messageContent?.body - } - } + eventHtmlRenderer.get().render(html) + } else if (messageContent is MessageVerificationRequestContent) { + stringProvider.getString(R.string.verification_request) + } else { + messageContent?.body } } EventType.STATE_ROOM_NAME, @@ -206,26 +204,30 @@ class MessageActionsViewModel @AssistedInject constructor(@Assisted } ?: "" } - private fun getRedactionReason(timelineEvent: TimelineEvent) = - (timelineEvent + private fun getRedactionReason(timelineEvent: TimelineEvent): String { + return (timelineEvent .root .unsignedData ?.redactedEvent ?.content ?.get("reason") as? String) ?.takeIf { it.isNotBlank() } - ?.let { reason -> - when (timelineEvent.root.senderId == timelineEvent.root.unsignedData?.redactedEvent?.senderId) { - true -> stringProvider.getString(R.string.event_redacted_by_user_reason_with_reason, reason) - false -> stringProvider.getString(R.string.event_redacted_by_admin_reason_with_reason, reason) - } - } - ?: run { - when (timelineEvent.root.senderId == timelineEvent.root.unsignedData?.redactedEvent?.senderId) { - true -> stringProvider.getString(R.string.event_redacted_by_user_reason) - false -> stringProvider.getString(R.string.event_redacted_by_admin_reason) + .let { reason -> + if (reason == null) { + if (timelineEvent.root.isRedactedBySameUser()) { + stringProvider.getString(R.string.event_redacted_by_user_reason) + } else { + stringProvider.getString(R.string.event_redacted_by_admin_reason) + } + } else { + if (timelineEvent.root.isRedactedBySameUser()) { + stringProvider.getString(R.string.event_redacted_by_user_reason_with_reason, reason) + } else { + stringProvider.getString(R.string.event_redacted_by_admin_reason_with_reason, reason) + } } } + } private fun actionsForEvent(timelineEvent: TimelineEvent): List<EventSharedAction> { val messageContent: MessageContent? = timelineEvent.annotations?.editSummary?.aggregatedContent.toModel()