From b60a98cc3e79bdda10470b5cbaa046563a805db5 Mon Sep 17 00:00:00 2001 From: SessionHero01 <180888785+SessionHero01@users.noreply.github.com> Date: Tue, 29 Apr 2025 16:57:51 +1000 Subject: [PATCH 1/2] Fix message request not showing sometimes --- .../conversation/v2/ConversationActivityV2.kt | 8 +++++-- .../conversation/v2/ConversationViewModel.kt | 21 +++++++------------ 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt index e3bdbf819b..706c6a06bb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt @@ -1910,7 +1910,7 @@ class ConversationActivityV2 : ScreenLockActionBarActivity(), InputBarDelegate, private fun sendTextOnlyMessage(hasPermissionToSendSeed: Boolean = false): Pair? { val recipient = viewModel.recipient ?: return null val sentTimestamp = SnodeAPI.nowWithOffset - viewModel.beforeSendingTextOnlyMessage() + val approvalSendJob = viewModel.implicitlyApproveRecipient() val text = getMessageBody() val userPublicKey = textSecurePreferences.getLocalNumber() val isNoteToSelf = (recipient.isContactRecipient && recipient.address.toString() == userPublicKey) @@ -1949,6 +1949,8 @@ class ConversationActivityV2 : ScreenLockActionBarActivity(), InputBarDelegate, null, true ) + + approvalSendJob?.join() // Must wait for approval send job to finish before sending the actual message MessageSender.send(message, recipient.address) } // Send a typing stopped message @@ -1968,7 +1970,7 @@ class ConversationActivityV2 : ScreenLockActionBarActivity(), InputBarDelegate, } val recipient = viewModel.recipient!! val sentTimestamp = SnodeAPI.nowWithOffset - viewModel.beforeSendingAttachments() + val approvalSendJob = viewModel.implicitlyApproveRecipient() // Create the message val message = VisibleMessage().applyExpiryMode(viewModel.threadId) @@ -2014,6 +2016,8 @@ class ConversationActivityV2 : ScreenLockActionBarActivity(), InputBarDelegate, null, runThreadUpdate = true ) + + approvalSendJob?.join() // Must wait for approval send job to finish before sending the actual message MessageSender.send(message, recipient.address, attachments, quote, linkPreview) } 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 877fbc8a35..48ddd6f740 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 @@ -15,6 +15,7 @@ import dagger.assisted.AssistedInject import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.Job import kotlinx.coroutines.channels.consumeEach import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow @@ -891,7 +892,7 @@ class ConversationViewModel( } } - fun acceptMessageRequest() = viewModelScope.launch { + fun acceptMessageRequest(): Job = viewModelScope.launch { val recipient = recipient ?: return@launch Log.w("Loki", "Recipient was null for accept message request action") val currentState = _uiState.value.messageRequestState as? MessageRequestUiState.Visible ?: return@launch Log.w("Loki", "Current state was not visible for accept message request action") @@ -971,23 +972,17 @@ class ConversationViewModel( attachmentDownloadHandler.retryFailedAttachments(attachments) } - fun beforeSendingTextOnlyMessage() { - implicitlyApproveRecipient() - } - - fun beforeSendingAttachments() { - implicitlyApproveRecipient() - } + fun implicitlyApproveRecipient(): Job? { + val recipient = recipient - private fun implicitlyApproveRecipient() { - val recipient = recipient - - if (uiState.value.messageRequestState is MessageRequestUiState.Visible) { - acceptMessageRequest() + if (uiState.value.messageRequestState is MessageRequestUiState.Visible) { + return acceptMessageRequest() } else if (recipient?.isApproved == false) { // edge case for new outgoing thread on new recipient without sending approval messages repository.setApproved(recipient, true) } + + return null } fun onCommand(command: Commands) { From bcb38ccd20ef331b9bf4bf27d602f12ccc169167 Mon Sep 17 00:00:00 2001 From: SessionHero01 <180888785+SessionHero01@users.noreply.github.com> Date: Wed, 30 Apr 2025 09:26:41 +1000 Subject: [PATCH 2/2] Use job system for approval message instead --- .../securesms/conversation/v2/ConversationActivityV2.kt | 6 ++---- .../securesms/conversation/v2/ConversationViewModel.kt | 8 +++----- .../securesms/repository/ConversationRepository.kt | 7 ++----- 3 files changed, 7 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt index 706c6a06bb..a11f5507b5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt @@ -1910,7 +1910,7 @@ class ConversationActivityV2 : ScreenLockActionBarActivity(), InputBarDelegate, private fun sendTextOnlyMessage(hasPermissionToSendSeed: Boolean = false): Pair? { val recipient = viewModel.recipient ?: return null val sentTimestamp = SnodeAPI.nowWithOffset - val approvalSendJob = viewModel.implicitlyApproveRecipient() + viewModel.implicitlyApproveRecipient() val text = getMessageBody() val userPublicKey = textSecurePreferences.getLocalNumber() val isNoteToSelf = (recipient.isContactRecipient && recipient.address.toString() == userPublicKey) @@ -1950,7 +1950,6 @@ class ConversationActivityV2 : ScreenLockActionBarActivity(), InputBarDelegate, true ) - approvalSendJob?.join() // Must wait for approval send job to finish before sending the actual message MessageSender.send(message, recipient.address) } // Send a typing stopped message @@ -1970,7 +1969,7 @@ class ConversationActivityV2 : ScreenLockActionBarActivity(), InputBarDelegate, } val recipient = viewModel.recipient!! val sentTimestamp = SnodeAPI.nowWithOffset - val approvalSendJob = viewModel.implicitlyApproveRecipient() + viewModel.implicitlyApproveRecipient() // Create the message val message = VisibleMessage().applyExpiryMode(viewModel.threadId) @@ -2017,7 +2016,6 @@ class ConversationActivityV2 : ScreenLockActionBarActivity(), InputBarDelegate, runThreadUpdate = true ) - approvalSendJob?.join() // Must wait for approval send job to finish before sending the actual message MessageSender.send(message, recipient.address, attachments, quote, linkPreview) } 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 48ddd6f740..c90da163b4 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 @@ -892,7 +892,7 @@ class ConversationViewModel( } } - fun acceptMessageRequest(): Job = viewModelScope.launch { + fun acceptMessageRequest() = viewModelScope.launch { val recipient = recipient ?: return@launch Log.w("Loki", "Recipient was null for accept message request action") val currentState = _uiState.value.messageRequestState as? MessageRequestUiState.Visible ?: return@launch Log.w("Loki", "Current state was not visible for accept message request action") @@ -972,17 +972,15 @@ class ConversationViewModel( attachmentDownloadHandler.retryFailedAttachments(attachments) } - fun implicitlyApproveRecipient(): Job? { + fun implicitlyApproveRecipient() { val recipient = recipient if (uiState.value.messageRequestState is MessageRequestUiState.Visible) { - return acceptMessageRequest() + acceptMessageRequest() } else if (recipient?.isApproved == false) { // edge case for new outgoing thread on new recipient without sending approval messages repository.setApproved(recipient, true) } - - return null } fun onCommand(command: Commands) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/repository/ConversationRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/repository/ConversationRepository.kt index c3988c407e..f0d2d8959d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/repository/ConversationRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/repository/ConversationRepository.kt @@ -416,11 +416,8 @@ class DefaultConversationRepository @Inject constructor( ) } else { val message = MessageRequestResponse(true) - MessageSender.sendNonDurably( - message = message, - destination = Destination.from(recipient.address), - isSyncMessage = recipient.isLocalNumber - ).await() + + MessageSender.send(message = message, address = recipient.address) // add a control message for our user storage.insertMessageRequestResponseFromYou(threadId)