From 73792905a2586c4fa4dc2a51c7eb94bbeaac2da6 Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Mon, 24 Jul 2023 13:32:16 -0400 Subject: [PATCH] Clear compose input immediately on send to match behavior of v1. --- .../conversation/v2/ConversationFragment.kt | 49 ++++++++++++------- .../conversation/v2/ConversationRepository.kt | 20 +------- .../conversation/v2/ConversationViewModel.kt | 9 ++-- .../v2/RecentSafetyNumberChangeException.kt | 13 ----- 4 files changed, 36 insertions(+), 55 deletions(-) delete mode 100644 app/src/main/java/org/thoughtcrime/securesms/conversation/v2/RecentSafetyNumberChangeException.kt 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 f4c482c6ab..265cf6f813 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 @@ -86,7 +86,6 @@ import org.signal.core.util.dp import org.signal.core.util.logging.Log import org.signal.core.util.orNull import org.signal.core.util.setActionItemTint -import org.signal.libsignal.protocol.InvalidMessageException import org.signal.ringrtc.CallLinkRootKey import org.thoughtcrime.securesms.BlockUnblockDialog import org.thoughtcrime.securesms.GroupMembersDialog @@ -258,7 +257,6 @@ import org.thoughtcrime.securesms.reactions.ReactionsBottomSheetDialogFragment import org.thoughtcrime.securesms.reactions.any.ReactWithAnyEmojiBottomSheetDialogFragment import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.RecipientExporter -import org.thoughtcrime.securesms.recipients.RecipientFormattingException import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.recipients.ui.bottomsheet.RecipientBottomSheetDialogFragment import org.thoughtcrime.securesms.recipients.ui.disappearingmessages.RecipientDisappearingMessagesActivity @@ -901,7 +899,7 @@ class ConversationFragment : .addTo(disposables) viewModel - .identityRecords + .identityRecordsObservable .distinctUntilChanged() .observeOn(AndroidSchedulers.mainThread()) .subscribeBy { presentIdentityRecordsState(it) } @@ -1652,6 +1650,14 @@ class ConversationFragment : isViewOnce: Boolean = false, afterSendComplete: () -> Unit = {} ) { + val threadRecipient = viewModel.recipientSnapshot + + if (threadRecipient == null) { + Log.w(TAG, "Unable to send due to invalid thread recipient") + toast(R.string.ConversationActivity_recipient_is_not_a_valid_sms_or_email_address_exclamation, Toast.LENGTH_LONG) + return + } + if (scheduledDate != -1L && ReenableScheduledMessagesDialogFragment.showIfNeeded(requireContext(), childFragmentManager, null, scheduledDate)) { return } @@ -1676,10 +1682,23 @@ class ConversationFragment : } } + if (body.isEmpty() && slideDeck?.containsMediaSlide() != true && preUploadResults.isEmpty() && contacts.isEmpty()) { + Log.i(TAG, "Unable to send due to empty message") + toast(R.string.ConversationActivity_message_is_empty_exclamation) + return + } + + if (viewModel.identityRecordsState.hasRecentSafetyNumberChange() && !bypassPreSendSafetyNumberCheck) { + Log.i(TAG, "Unable to send due to SNC") + handleRecentSafetyNumberChange(viewModel.identityRecordsState.getRecentSafetyNumberChangeRecords()) + return + } + val metricId = viewModel.recipientSnapshot?.let { if (it.isGroup) SignalLocalMetrics.GroupMessageSend.start() else SignalLocalMetrics.IndividualMessageSend.start() } val send: Completable = viewModel.sendMessage( metricId = metricId, + threadRecipient = threadRecipient, body = body, slideDeck = slideDeck, scheduledDate = scheduledDate, @@ -1690,28 +1709,20 @@ class ConversationFragment : contacts = contacts, linkPreviews = linkPreviews, preUploadResults = preUploadResults, - bypassPreSendSafetyNumberCheck = bypassPreSendSafetyNumberCheck, isViewOnce = isViewOnce ) disposables += send - .doOnSubscribe { scrollToPositionDelegate.markListCommittedVersion() } + .doOnSubscribe { + if (clearCompose) { + composeText.setText("") + attachmentManager.clear(GlideApp.with(this@ConversationFragment), false) + inputPanel.clearQuote() + } + scrollToPositionDelegate.markListCommittedVersion() + } .subscribeBy( - onError = { t -> - Log.w(TAG, "Error sending", t) - when (t) { - is InvalidMessageException -> toast(R.string.ConversationActivity_message_is_empty_exclamation) - is RecipientFormattingException -> toast(R.string.ConversationActivity_recipient_is_not_a_valid_sms_or_email_address_exclamation, Toast.LENGTH_LONG) - is RecentSafetyNumberChangeException -> handleRecentSafetyNumberChange(t.changedRecords) - } - }, onComplete = { - if (clearCompose) { - composeText.setText("") - attachmentManager.clear(GlideApp.with(this@ConversationFragment), false) - inputPanel.clearQuote() - } - onSendComplete() afterSendComplete() } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationRepository.kt index 6634661b57..8848217a7e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationRepository.kt @@ -28,7 +28,6 @@ import org.signal.core.util.concurrent.SignalExecutors import org.signal.core.util.dp import org.signal.core.util.logging.Log import org.signal.core.util.toOptional -import org.signal.libsignal.protocol.InvalidMessageException import org.signal.paging.PagedData import org.signal.paging.PagingConfig import org.thoughtcrime.securesms.R @@ -88,7 +87,6 @@ import org.thoughtcrime.securesms.mms.SlideDeck import org.thoughtcrime.securesms.profiles.spoofing.ReviewUtil import org.thoughtcrime.securesms.providers.BlobProvider import org.thoughtcrime.securesms.recipients.Recipient -import org.thoughtcrime.securesms.recipients.RecipientFormattingException import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.search.MessageResult import org.thoughtcrime.securesms.sms.MessageSender @@ -203,7 +201,7 @@ class ConversationRepository( fun sendMessage( threadId: Long, - threadRecipient: Recipient?, + threadRecipient: Recipient, metricId: String?, body: String, slideDeck: SlideDeck?, @@ -215,25 +213,9 @@ class ConversationRepository( contacts: List, linkPreviews: List, preUploadResults: List, - identityRecordsState: IdentityRecordsState?, isViewOnce: Boolean ): Completable { val sendCompletable = Completable.create { emitter -> - if (body.isEmpty() && slideDeck?.containsMediaSlide() != true && preUploadResults.isEmpty() && contacts.isEmpty()) { - emitter.onError(InvalidMessageException("Message is empty!")) - return@create - } - - if (threadRecipient == null) { - emitter.onError(RecipientFormattingException("Badly formatted")) - return@create - } - - if (identityRecordsState != null && identityRecordsState.hasRecentSafetyNumberChange()) { - emitter.onError(RecentSafetyNumberChangeException(identityRecordsState.getRecentSafetyNumberChangeRecords())) - return@create - } - val splitMessage: MessageUtil.SplitResult = MessageUtil.getSplitMessage( applicationContext, body, diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModel.kt index de9582410d..12802bc3f1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModel.kt @@ -131,7 +131,9 @@ class ConversationViewModel( private val refreshIdentityRecords: Subject = PublishSubject.create() private val identityRecordsStore: RxStore = RxStore(IdentityRecordsState()) - val identityRecords: Observable = identityRecordsStore.stateFlowable.toObservable() + val identityRecordsObservable: Observable = identityRecordsStore.stateFlowable.toObservable() + val identityRecordsState: IdentityRecordsState + get() = identityRecordsStore.state private val _searchQuery = BehaviorSubject.createDefault("") val searchQuery: Observable = _searchQuery @@ -336,6 +338,7 @@ class ConversationViewModel( fun sendMessage( metricId: String?, + threadRecipient: Recipient, body: String, slideDeck: SlideDeck?, scheduledDate: Long, @@ -346,12 +349,11 @@ class ConversationViewModel( contacts: List, linkPreviews: List, preUploadResults: List, - bypassPreSendSafetyNumberCheck: Boolean, isViewOnce: Boolean ): Completable { return repository.sendMessage( threadId = threadId, - threadRecipient = recipientSnapshot, + threadRecipient = threadRecipient, metricId = metricId, body = body, slideDeck = slideDeck, @@ -363,7 +365,6 @@ class ConversationViewModel( contacts = contacts, linkPreviews = linkPreviews, preUploadResults = preUploadResults, - identityRecordsState = if (bypassPreSendSafetyNumberCheck) null else identityRecordsStore.state, isViewOnce = isViewOnce ).observeOn(AndroidSchedulers.mainThread()) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/RecentSafetyNumberChangeException.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/RecentSafetyNumberChangeException.kt deleted file mode 100644 index e2bc18d558..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/RecentSafetyNumberChangeException.kt +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Copyright 2023 Signal Messenger, LLC - * SPDX-License-Identifier: AGPL-3.0-only - */ - -package org.thoughtcrime.securesms.conversation.v2 - -import org.thoughtcrime.securesms.database.model.IdentityRecord - -/** - * Emitted when safety numbers changed recently before a send attempt. - */ -class RecentSafetyNumberChangeException(val changedRecords: List) : Exception()