From 636b5a4ba6095b9e8ca882622858afe41b34dc3f Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Thu, 12 Sep 2024 17:02:24 -0400 Subject: [PATCH] Prevent sharing and clear drafts when entering disabled send conversations. --- .../conversation/drafts/DraftViewModel.kt | 4 ++-- .../conversation/v2/ConversationFragment.kt | 22 +++++++++++++++---- .../conversation/v2/InputReadyState.kt | 8 +++++++ 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/drafts/DraftViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/drafts/DraftViewModel.kt index fb73761799..0418ff14a1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/drafts/DraftViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/drafts/DraftViewModel.kt @@ -115,9 +115,9 @@ class DraftViewModel @JvmOverloads constructor( } } - fun onSendComplete(threadId: Long = store.state.threadId) { + fun clearDraft() { repository.deleteVoiceNoteDraftData(store.state.voiceNoteDraft) - store.update { saveDraftsIfChanged(it, it.copyAndClearDrafts(threadId)) } + store.update { saveDraftsIfChanged(it, it.copyAndClearDrafts(store.state.threadId)) } } private fun saveDraftsIfChanged(oldState: DraftState, newState: DraftState): DraftState { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt index c63e06fb15..a1561399bb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt @@ -1072,8 +1072,13 @@ class ConversationFragment : this::handleReplyToMessage ).attachToRecyclerView(binding.conversationItemRecycler) - draftViewModel.loadShareOrDraftData(shareDataTimestampViewModel.timestamp) - .subscribeBy { data -> handleShareOrDraftData(data) } + viewModel + .inputReadyState + .flatMapMaybe { inputReadyState -> + draftViewModel.loadShareOrDraftData(shareDataTimestampViewModel.timestamp) + .map { inputReadyState to it } + } + .subscribeBy { (inputReadyState, data) -> handleShareOrDraftData(inputReadyState, data) } .addTo(disposables) disposables.add( @@ -1519,9 +1524,18 @@ class ConversationFragment : } } - private fun handleShareOrDraftData(data: ShareOrDraftData) { + private fun handleShareOrDraftData(inputReadyState: InputReadyState, data: ShareOrDraftData) { shareDataTimestampViewModel.timestamp = args.shareDataTimestamp + if (inputReadyState.isAnnouncementGroup == true && inputReadyState.isAdmin == false) { + Toast.makeText(requireContext(), R.string.MultiselectForwardFragment__only_admins_can_send_messages_to_this_group, Toast.LENGTH_SHORT).show() + draftViewModel.clearDraft() + return + } else if (inputReadyState.shouldClearDraft()) { + draftViewModel.clearDraft() + return + } + when (data) { is ShareOrDraftData.SendKeyboardImage -> sendMessageWithoutComposeInput(slide = data.slide, clearCompose = false) is ShareOrDraftData.SendSticker -> sendMessageWithoutComposeInput(slide = data.slide, clearCompose = true) @@ -1960,7 +1974,7 @@ class ConversationFragment : updateLinkPreviewState() - draftViewModel.onSendComplete() + draftViewModel.clearDraft() inputPanel.exitEditMessageMode() diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/InputReadyState.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/InputReadyState.kt index 0a33ed79e8..f6affbe4b2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/InputReadyState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/InputReadyState.kt @@ -34,6 +34,14 @@ class InputReadyState( !conversationRecipient.isReleaseNotes } + fun shouldClearDraft(): Boolean { + return isActiveGroup == false || + isRequestingMember == true || + (isAnnouncementGroup == true && isAdmin == false) || + conversationRecipient.isReleaseNotes || + shouldShowInviteToSignal() + } + override fun equals(other: Any?): Boolean { if (this === other) return true if (javaClass != other?.javaClass) return false