From 2c3e73b2a762ffd1ddb530b38331787adb1be23a Mon Sep 17 00:00:00 2001 From: ThomasSession Date: Thu, 5 Sep 2024 13:33:50 +1000 Subject: [PATCH] Added a control message when the current user accepts a message request --- .../v2/messages/ControlMessageView.kt | 16 ++++++++- .../securesms/database/Storage.kt | 34 ++++++++++++++++++- .../repository/ConversationRepository.kt | 2 ++ .../libsession/database/StorageProtocol.kt | 3 +- .../ReceivedMessageHandler.kt | 3 +- 5 files changed, 53 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/ControlMessageView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/ControlMessageView.kt index 8e3e841809..315e24da5c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/ControlMessageView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/ControlMessageView.kt @@ -2,6 +2,7 @@ package org.thoughtcrime.securesms.conversation.v2.messages import android.content.Context import android.util.AttributeSet +import android.util.Log import android.view.LayoutInflater import android.widget.LinearLayout import androidx.core.content.res.ResourcesCompat @@ -17,10 +18,12 @@ import network.loki.messenger.libsession_util.util.ExpiryMode import org.session.libsession.messaging.MessagingModuleConfiguration import org.session.libsession.messaging.messages.ExpirationConfiguration import org.session.libsession.utilities.StringSubstitutionConstants.NAME_KEY +import org.session.libsession.utilities.TextSecurePreferences import org.thoughtcrime.securesms.conversation.disappearingmessages.DisappearingMessages import org.thoughtcrime.securesms.conversation.disappearingmessages.expiryMode import org.thoughtcrime.securesms.database.model.MessageRecord import org.thoughtcrime.securesms.dependencies.DatabaseComponent +import org.thoughtcrime.securesms.ui.getSubbedCharSequence @AndroidEntryPoint class ControlMessageView : LinearLayout { @@ -77,7 +80,18 @@ class ControlMessageView : LinearLayout { } } message.isMessageRequestResponse -> { - binding.textView.text = context.getString(R.string.messageRequestsAccepted) + val msgRecipient = message.recipient.address.serialize() + val me = TextSecurePreferences.getLocalNumber(context) + binding.textView.text = if(me == msgRecipient) { // you accepted the user's request + val threadRecipient = DatabaseComponent.get(context).threadDatabase().getRecipientForThreadId(message.threadId) + context.getSubbedCharSequence( + R.string.messageRequestYouHaveAccepted, + NAME_KEY to (threadRecipient?.name ?: "") + ) + } else { // they accepted your request + context.getString(R.string.messageRequestsAccepted) + } + binding.root.contentDescription = context.getString(R.string.AccessibilityId_message_request_config_message) } message.isCallLog -> { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt b/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt index a39598c55b..8fdbe2accc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt @@ -2,6 +2,7 @@ package org.thoughtcrime.securesms.database import android.content.Context import android.net.Uri +import network.loki.messenger.R import java.security.MessageDigest import network.loki.messenger.libsession_util.ConfigBase import network.loki.messenger.libsession_util.ConfigBase.Companion.PRIORITY_HIDDEN @@ -1448,7 +1449,10 @@ open class Storage( SSKEnvironment.shared.messageExpirationManager.maybeStartExpiration(sentTimestamp, senderPublicKey, expiryMode) } - override fun insertMessageRequestResponse(response: MessageRequestResponse) { + /** + * This will create a control message used to indicate that a contact has accepted our message request + */ + override fun insertMessageRequestResponseFromContact(response: MessageRequestResponse) { val userPublicKey = getUserPublicKey() val senderPublicKey = response.sender!! val recipientPublicKey = response.recipient!! @@ -1542,6 +1546,34 @@ open class Storage( } } + /** + * This will create a control message used to indicate that you have accepted a message request + */ + override fun insertMessageRequestResponseFromYou(threadId: Long){ + val userPublicKey = getUserPublicKey() ?: return + + val mmsDb = DatabaseComponent.get(context).mmsDatabase() + val message = IncomingMediaMessage( + fromSerialized(userPublicKey), + SnodeAPI.nowWithOffset, + -1, + 0, + 0, + false, + false, + true, + false, + Optional.absent(), + Optional.absent(), + Optional.absent(), + Optional.absent(), + Optional.absent(), + Optional.absent(), + Optional.absent() + ) + mmsDb.insertSecureDecryptedMessageInbox(message, threadId, runThreadUpdate = false) + } + override fun getRecipientApproved(address: Address): Boolean { return DatabaseComponent.get(context).recipientDatabase().getApproved(address) } 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 7f10b1eb20..b472c2c0c0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/repository/ConversationRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/repository/ConversationRepository.kt @@ -333,6 +333,8 @@ class DefaultConversationRepository @Inject constructor( MessageSender.send(message, Destination.from(recipient.address), isSyncMessage = recipient.isLocalNumber) .success { threadDb.setHasSent(threadId, true) + // add a control message for our user + storage.insertMessageRequestResponseFromYou(threadId) continuation.resume(Result.success(Unit)) }.fail { error -> continuation.resume(Result.failure(error)) diff --git a/libsession/src/main/java/org/session/libsession/database/StorageProtocol.kt b/libsession/src/main/java/org/session/libsession/database/StorageProtocol.kt index 581cc51570..aac481776f 100644 --- a/libsession/src/main/java/org/session/libsession/database/StorageProtocol.kt +++ b/libsession/src/main/java/org/session/libsession/database/StorageProtocol.kt @@ -202,7 +202,8 @@ interface StorageProtocol { fun getLastSeen(threadId: Long): Long fun updateThread(threadId: Long, unarchive: Boolean) fun insertDataExtractionNotificationMessage(senderPublicKey: String, message: DataExtractionNotificationInfoMessage, sentTimestamp: Long) - fun insertMessageRequestResponse(response: MessageRequestResponse) + fun insertMessageRequestResponseFromContact(response: MessageRequestResponse) + fun insertMessageRequestResponseFromYou(threadId: Long) fun setRecipientApproved(recipient: Recipient, approved: Boolean) fun getRecipientApproved(address: Address): Boolean fun setRecipientApprovedMe(recipient: Recipient, approvedMe: Boolean) diff --git a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt index 525d60e821..2003aacf87 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt @@ -1,7 +1,6 @@ package org.session.libsession.messaging.sending_receiving import android.text.TextUtils -import network.loki.messenger.libsession_util.ConfigBase import network.loki.messenger.libsession_util.util.ExpiryMode import org.session.libsession.avatars.AvatarHelper import org.session.libsession.messaging.MessagingModuleConfiguration @@ -266,7 +265,7 @@ fun MessageReceiver.handleUnsendRequest(message: UnsendRequest): Long? { } fun handleMessageRequestResponse(message: MessageRequestResponse) { - MessagingModuleConfiguration.shared.storage.insertMessageRequestResponse(message) + MessagingModuleConfiguration.shared.storage.insertMessageRequestResponseFromContact(message) } //endregion