From 56878dbd3553b06de09ac6198ad59ebcb673471a Mon Sep 17 00:00:00 2001 From: 0x330a <92654767+0x330a@users.noreply.github.com> Date: Mon, 13 Nov 2023 10:33:48 +1100 Subject: [PATCH] refactor: add sender to be the person to trigger the legacy message send (in case of closed group updates) --- .../conversation/v2/ConversationActivityV2.kt | 8 +++----- .../conversation/v2/ConversationViewModel.kt | 7 +++++++ .../securesms/database/Storage.kt | 19 ++++++++++++++++++- .../libsession/database/StorageProtocol.kt | 8 +++++++- .../ReceivedMessageHandler.kt | 2 +- 5 files changed, 36 insertions(+), 8 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 c158053fdd..9678bf20cd 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 @@ -92,7 +92,6 @@ import org.session.libsession.utilities.Stub import org.session.libsession.utilities.TextSecurePreferences import org.session.libsession.utilities.concurrent.SimpleTask import org.session.libsession.utilities.recipients.Recipient -import org.session.libsession.utilities.recipients.Recipient.DisappearingState import org.session.libsession.utilities.recipients.RecipientModifiedListener import org.session.libsignal.crypto.MnemonicCodec import org.session.libsignal.utilities.IdPrefix @@ -697,13 +696,12 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe } private fun setUpOutdatedClientBanner() { - val recipient = viewModel.recipient?.takeIf { !it.isLocalNumber } ?: return + val legacyRecipient = viewModel.legacyBannerRecipient(this) if (ExpirationConfiguration.isNewConfigEnabled && - recipient.disappearingState == DisappearingState.LEGACY && - viewModel.expirationConfiguration?.isEnabled == true + legacyRecipient != null ) { binding?.outdatedBannerTextView?.text = - resources.getString(R.string.activity_conversation_outdated_client_banner_text, recipient.name) + resources.getString(R.string.activity_conversation_outdated_client_banner_text, legacyRecipient.name) binding?.outdatedBanner?.isVisible = true } } 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 2911995f45..00b1b98f6a 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 @@ -1,5 +1,6 @@ package org.thoughtcrime.securesms.conversation.v2 +import android.content.Context import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope @@ -17,6 +18,7 @@ import org.session.libsession.messaging.open_groups.OpenGroup import org.session.libsession.messaging.open_groups.OpenGroupApi import org.session.libsession.messaging.utilities.SessionId import org.session.libsession.messaging.utilities.SodiumUtilities +import org.session.libsession.utilities.Address import org.session.libsession.utilities.recipients.Recipient import org.session.libsignal.utilities.IdPrefix import org.session.libsignal.utilities.Log @@ -221,6 +223,11 @@ class ConversationViewModel( fun hidesInputBar(): Boolean = openGroup?.canWrite != true && blindedRecipient?.blocksCommunityMessageRequests == true + fun legacyBannerRecipient(context: Context): Recipient? = recipient?.let { recipient -> + val legacyAddress = storage.getLastLegacyRecipient(recipient.address.serialize()) ?: return@let null + return Recipient.from(context, Address.fromSerialized(legacyAddress), false) + } + @dagger.assisted.AssistedFactory interface AssistedFactory { 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 d2db4d9572..a274e868c2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt @@ -67,6 +67,7 @@ import org.session.libsession.utilities.ProfileKeyUtil import org.session.libsession.utilities.SSKEnvironment import org.session.libsession.utilities.TextSecurePreferences import org.session.libsession.utilities.recipients.Recipient +import org.session.libsession.utilities.recipients.Recipient.DisappearingState import org.session.libsignal.crypto.ecc.DjbECPrivateKey import org.session.libsignal.crypto.ecc.DjbECPublicKey import org.session.libsignal.crypto.ecc.ECKeyPair @@ -1345,6 +1346,14 @@ open class Storage( threadDb.setDate(threadId, newDate) } + override fun getLastLegacyRecipient(threadRecipient: String): String? { + return DatabaseComponent.get(context).lokiAPIDatabase().getLastLegacySenderAddress(threadRecipient) + } + + override fun setLastLegacyRecipient(threadRecipient: String, senderRecipient: String?) { + DatabaseComponent.get(context).lokiAPIDatabase().setLastLegacySenderAddress(threadRecipient, senderRecipient) + } + override fun deleteConversation(threadID: Long) { val recipient = getRecipientForThread(threadID) val threadDB = DatabaseComponent.get(context).threadDatabase() @@ -1759,10 +1768,18 @@ open class Storage( return expiringMessages } - override fun updateDisappearingState(threadID: Long, disappearingState: Recipient.DisappearingState) { + override fun updateDisappearingState( + messageSender: String, + threadID: Long, + disappearingState: Recipient.DisappearingState + ) { val threadDb = DatabaseComponent.get(context).threadDatabase() val recipient = threadDb.getRecipientForThreadId(threadID) ?: return val recipientDb = DatabaseComponent.get(context).recipientDatabase() recipientDb.setDisappearingState(recipient, disappearingState); + if (disappearingState == DisappearingState.LEGACY) { + DatabaseComponent.get(context).lokiAPIDatabase() + .setLastLegacySenderAddress(recipient.address.serialize(), messageSender) + } } } \ No newline at end of file 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 c9b0f3cf0e..ff56368833 100644 --- a/libsession/src/main/java/org/session/libsession/database/StorageProtocol.kt +++ b/libsession/src/main/java/org/session/libsession/database/StorageProtocol.kt @@ -175,6 +175,8 @@ interface StorageProtocol { fun isPinned(threadID: Long): Boolean fun deleteConversation(threadID: Long) fun setThreadDate(threadId: Long, newDate: Long) + fun getLastLegacyRecipient(threadRecipient: String): String? + fun setLastLegacyRecipient(threadRecipient: String, senderRecipient: String?) // Contacts fun getContactWithSessionID(sessionID: String): Contact? @@ -226,7 +228,11 @@ interface StorageProtocol { fun getExpirationConfiguration(threadId: Long): ExpirationConfiguration? fun setExpirationConfiguration(config: ExpirationConfiguration) fun getExpiringMessages(messageIds: List = emptyList()): List> - fun updateDisappearingState(threadID: Long, disappearingState: Recipient.DisappearingState) + fun updateDisappearingState( + messageSender: String, + threadID: Long, + disappearingState: Recipient.DisappearingState + ) // Shared configs fun notifyConfigUpdates(forConfigObject: ConfigBase, messageTimestamp: Long) 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 e23535805b..cc48b21ce1 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 @@ -307,7 +307,7 @@ fun MessageReceiver.updateExpiryIfNeeded( if (!recipient.isGroupRecipient && !recipient.isLocalNumber) { val disappearingState = if (proto.hasExpirationType()) Recipient.DisappearingState.UPDATED else Recipient.DisappearingState.LEGACY - storage.updateDisappearingState(threadID, disappearingState) + storage.updateDisappearingState(message.sender!!, threadID, disappearingState) } remoteConfig.takeIf { localConfig == null || it.updatedTimestampMs > localConfig.updatedTimestampMs }