From d23b849c918339f7a5e77b0b865f58f64418fb83 Mon Sep 17 00:00:00 2001 From: charles Date: Fri, 16 Dec 2022 13:35:55 +1100 Subject: [PATCH] Group settings refactor --- .../conversation/ConversationActionBarView.kt | 14 ++++++++------ .../conversation/v2/ConversationActivityV2.kt | 17 ++++++++++------- .../conversation/v2/ConversationViewModel.kt | 4 ++++ .../v2/menus/ConversationMenuHelper.kt | 6 ++++-- .../ExpirationConfigurationDatabase.kt | 6 +++--- .../thoughtcrime/securesms/database/Storage.kt | 18 +++++++++++++----- .../AndroidAutoReplyReceiver.java | 7 +++++-- .../notifications/RemoteReplyReceiver.java | 8 +++++--- .../service/ExpiringMessageManager.java | 6 +++--- .../messages/ExpirationConfiguration.kt | 2 +- .../messages/control/ConfigurationMessage.kt | 5 +++-- .../messages/signal/OutgoingMediaMessage.java | 13 +++++++------ .../messages/signal/OutgoingTextMessage.java | 5 +++-- .../MessageSenderClosedGroupHandler.kt | 4 ++-- 14 files changed, 71 insertions(+), 44 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActionBarView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActionBarView.kt index 28476750d8..9d1149849b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActionBarView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActionBarView.kt @@ -16,6 +16,7 @@ import dagger.hilt.android.AndroidEntryPoint import network.loki.messenger.R import network.loki.messenger.databinding.ViewConversationActionBarBinding import network.loki.messenger.databinding.ViewConversationSettingBinding +import org.session.libsession.messaging.messages.ExpirationConfiguration import org.session.libsession.messaging.open_groups.OpenGroup import org.session.libsession.utilities.ExpirationUtil import org.session.libsession.utilities.recipients.Recipient @@ -74,6 +75,7 @@ class ConversationActionBarView : LinearLayout { delegate: ConversationActionBarDelegate, threadId: Long, recipient: Recipient, + config: ExpirationConfiguration? = null, openGroup: OpenGroup? = null, glide: GlideRequests ) { @@ -87,24 +89,24 @@ class ConversationActionBarView : LinearLayout { binding.profilePictureView.root.layoutParams = LayoutParams(size, size) binding.profilePictureView.root.glide = glide MentionManagerUtilities.populateUserPublicKeyCacheIfNeeded(threadId, context) - update(recipient, openGroup) + update(recipient, openGroup, config) } - fun update(recipient: Recipient, openGroup: OpenGroup? = null) { + fun update(recipient: Recipient, openGroup: OpenGroup? = null, config: ExpirationConfiguration? = null) { binding.profilePictureView.root.update(recipient) binding.conversationTitleView.text = when { recipient.isLocalNumber -> context.getString(R.string.note_to_self) else -> recipient.toShortString() } - updateSubtitle(recipient, openGroup) + updateSubtitle(recipient, openGroup, config) } - fun updateSubtitle(recipient: Recipient, openGroup: OpenGroup? = null) { + fun updateSubtitle(recipient: Recipient, openGroup: OpenGroup? = null, config: ExpirationConfiguration? = null) { val settings = mutableListOf() - if (recipient.expireMessages > 0) { + if (config?.isEnabled == true) { settings.add( ConversationSetting( - "${context.getString(R.string.expiration_type_disappear_after_read)} - ${ExpirationUtil.getExpirationAbbreviatedDisplayValue(context, recipient.expireMessages)}" , + "${context.getString(R.string.expiration_type_disappear_after_read)} - ${ExpirationUtil.getExpirationAbbreviatedDisplayValue(context, config?.durationSeconds ?: 0)}" , ConversationSettingType.EXPIRATION, R.drawable.ic_timer ) 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 4813d6bd6f..afced6aa3a 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 @@ -455,7 +455,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe actionBar.title = "" actionBar.setDisplayHomeAsUpEnabled(true) actionBar.setHomeButtonEnabled(true) - binding!!.toolbarContent.bind(this, viewModel.threadId, recipient, viewModel.openGroup, glide) + binding!!.toolbarContent.bind(this, viewModel.threadId, recipient, viewModel.expirationConfiguration, viewModel.openGroup, glide) maybeUpdateToolbar(recipient) } @@ -548,7 +548,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe private fun getLatestOpenGroupInfoIfNeeded() { viewModel.openGroup?.let { openGroup -> OpenGroupApi.getMemberCount(openGroup.room, openGroup.server).successUi { - binding?.toolbarContent?.updateSubtitle(viewModel.recipient!!, openGroup) + binding?.toolbarContent?.updateSubtitle(viewModel.recipient!!, openGroup, viewModel.expirationConfiguration) maybeUpdateToolbar(viewModel.recipient!!) } } @@ -568,7 +568,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe private fun setUpOutdatedClientBanner() { val recipient = viewModel.recipient ?: return - if (recipient.expireMessages == 0 || !ExpirationConfiguration.isNewConfigEnabled) { return } + if (viewModel.expirationConfiguration?.isEnabled != true || !ExpirationConfiguration.isNewConfigEnabled) { return } binding?.outdatedBannerTextView?.text = resources.getString(R.string.activity_conversation_outdated_client_banner_text, recipient.name) binding?.outdatedBanner?.isVisible = true @@ -622,7 +622,8 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe menu, menuInflater, recipient, - this + this, + viewModel.expirationConfiguration ) } viewModel.recipient?.let { maybeUpdateToolbar(it) } @@ -653,7 +654,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe } private fun maybeUpdateToolbar(recipient: Recipient) { - binding?.toolbarContent?.update(recipient, viewModel.openGroup) + binding?.toolbarContent?.update(recipient, viewModel.openGroup, viewModel.expirationConfiguration) } private fun showOrHideInputIfNeeded() { @@ -1347,7 +1348,8 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe val message = VisibleMessage() message.sentTimestamp = System.currentTimeMillis() message.text = text - val outgoingTextMessage = OutgoingTextMessage.from(message, recipient) + val expiresInMillis = (viewModel.expirationConfiguration?.durationSeconds ?: 0) * 1000L + val outgoingTextMessage = OutgoingTextMessage.from(message, recipient, expiresInMillis) // Clear the input bar binding?.inputBar?.text = "" binding?.inputBar?.cancelQuoteDraft() @@ -1384,7 +1386,8 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe else it.individualRecipient.address quote?.copy(author = sender) } - val outgoingTextMessage = OutgoingMediaMessage.from(message, recipient, attachments, localQuote, linkPreview) + val expiresInMillis = (viewModel.expirationConfiguration?.durationSeconds ?: 0) * 1000L + val outgoingTextMessage = OutgoingMediaMessage.from(message, recipient, attachments, localQuote, linkPreview, expiresInMillis) // Clear the input bar binding?.inputBar?.text = "" binding?.inputBar?.cancelQuoteDraft() 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 4d78653abc..4b5ee8458c 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 @@ -10,6 +10,7 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch +import org.session.libsession.messaging.messages.ExpirationConfiguration import org.session.libsession.messaging.open_groups.OpenGroup import org.session.libsession.messaging.open_groups.OpenGroupApi import org.session.libsession.messaging.utilities.SessionId @@ -32,6 +33,9 @@ class ConversationViewModel( private val _uiState = MutableStateFlow(ConversationUiState()) val uiState: StateFlow = _uiState + val expirationConfiguration: ExpirationConfiguration? + get() = storage.getExpirationConfiguration(threadId) + val recipient: Recipient? get() = repository.maybeGetRecipientForThreadId(threadId) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/menus/ConversationMenuHelper.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/menus/ConversationMenuHelper.kt index da7f150923..73c5932ab6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/menus/ConversationMenuHelper.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/menus/ConversationMenuHelper.kt @@ -18,6 +18,7 @@ import androidx.core.content.pm.ShortcutInfoCompat import androidx.core.content.pm.ShortcutManagerCompat import androidx.core.graphics.drawable.IconCompat import network.loki.messenger.R +import org.session.libsession.messaging.messages.ExpirationConfiguration import org.session.libsession.messaging.sending_receiving.MessageSender import org.session.libsession.messaging.sending_receiving.leave import org.session.libsession.utilities.GroupUtil.doubleDecodeGroupID @@ -46,7 +47,8 @@ object ConversationMenuHelper { menu: Menu, inflater: MenuInflater, thread: Recipient, - context: Context + context: Context, + config: ExpirationConfiguration? ) { // Prepare menu.clear() @@ -54,7 +56,7 @@ object ConversationMenuHelper { // Base menu (options that should always be present) inflater.inflate(R.menu.menu_conversation, menu) // Expiring messages - if (thread.expireMessages == 0 && !isOpenGroup && + if (config?.isEnabled != true && !isOpenGroup && (thread.hasApprovedMe() || thread.isClosedGroupRecipient || thread.isLocalNumber) ) { inflater.inflate(R.menu.menu_conversation_expiration_off, menu) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/ExpirationConfigurationDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/database/ExpirationConfigurationDatabase.kt index aac19f8390..67e2b42c79 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/ExpirationConfigurationDatabase.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/ExpirationConfigurationDatabase.kt @@ -60,15 +60,15 @@ class ExpirationConfigurationDatabase(context: Context, helper: SQLCipherOpenHel val query = "$THREAD_ID = ?" val args = arrayOf("$threadId") - val mappings: MutableList = mutableListOf() + val configurations: MutableList = mutableListOf() readableDatabase.query(TABLE_NAME, null, query, args, null, null, null).use { cursor -> while (cursor.moveToNext()) { - mappings += readExpirationConfiguration(cursor) + configurations += readExpirationConfiguration(cursor) } } - return mappings.firstOrNull() + return configurations.firstOrNull() } fun setExpirationConfiguration(configuration: ExpirationConfiguration) { 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 b8243d57a6..71825feb89 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt @@ -168,19 +168,27 @@ class Storage(context: Context, helper: SQLCipherOpenHelper) : Database(context, recipientDb.setApprovedMe(targetRecipient, true) } } + val expiresIn = getExpirationConfiguration(message.threadID ?: -1)?.durationSeconds ?: 0 if (message.isMediaMessage() || attachments.isNotEmpty()) { val quote: Optional = if (quotes != null) Optional.of(quotes) else Optional.absent() val linkPreviews: Optional> = if (linkPreview.isEmpty()) Optional.absent() else Optional.of(linkPreview.mapNotNull { it!! }) val mmsDatabase = DatabaseComponent.get(context).mmsDatabase() val insertResult = if (isUserSender || isUserBlindedSender) { - val mediaMessage = OutgoingMediaMessage.from(message, targetRecipient, pointers, quote.orNull(), linkPreviews.orNull()?.firstOrNull()) + val mediaMessage = OutgoingMediaMessage.from( + message, + targetRecipient, + pointers, + quote.orNull(), + linkPreviews.orNull()?.firstOrNull(), + expiresIn * 1000L + ) mmsDatabase.insertSecureDecryptedMessageOutbox(mediaMessage, message.threadID ?: -1, message.sentTimestamp!!, runThreadUpdate) } else { // It seems like we have replaced SignalServiceAttachment with SessionServiceAttachment val signalServiceAttachments = attachments.mapNotNull { it.toSignalPointer() } - val mediaMessage = IncomingMediaMessage.from(message, senderAddress, targetRecipient.expireMessages * 1000L, group, signalServiceAttachments, quote, linkPreviews) + val mediaMessage = IncomingMediaMessage.from(message, senderAddress, expiresIn * 1000L, group, signalServiceAttachments, quote, linkPreviews) mmsDatabase.insertSecureDecryptedMessageInbox(mediaMessage, message.threadID ?: -1, message.receivedTimestamp ?: 0, runIncrement, runThreadUpdate) } if (insertResult.isPresent) { @@ -192,11 +200,11 @@ class Storage(context: Context, helper: SQLCipherOpenHelper) : Database(context, val insertResult = if (isUserSender || isUserBlindedSender) { val textMessage = if (isOpenGroupInvitation) OutgoingTextMessage.fromOpenGroupInvitation(message.openGroupInvitation, targetRecipient, message.sentTimestamp) - else OutgoingTextMessage.from(message, targetRecipient) + else OutgoingTextMessage.from(message, targetRecipient, expiresIn * 1000L) smsDatabase.insertMessageOutbox(message.threadID ?: -1, textMessage, message.sentTimestamp!!, runThreadUpdate) } else { val textMessage = if (isOpenGroupInvitation) IncomingTextMessage.fromOpenGroupInvitation(message.openGroupInvitation, senderAddress, message.sentTimestamp) - else IncomingTextMessage.from(message, senderAddress, group, targetRecipient.expireMessages * 1000L) + else IncomingTextMessage.from(message, senderAddress, group, expiresIn * 1000L) val encrypted = IncomingEncryptedMessage(textMessage, textMessage.messageBody) smsDatabase.insertMessageInbox(encrypted, message.receivedTimestamp ?: 0, runIncrement, runThreadUpdate) } @@ -542,7 +550,7 @@ class Storage(context: Context, helper: SQLCipherOpenHelper) : Database(context, override fun setExpirationTimer(groupID: String, duration: Int) { val recipient = Recipient.from(context, fromSerialized(groupID), false) - val threadId = DatabaseComponent.get(context).threadDatabase().getThreadIdIfExistsFor(recipient) + val threadId = DatabaseComponent.get(context).threadDatabase().getOrCreateThreadIdFor(recipient) DatabaseComponent.get(context).expirationConfigurationDatabase().setExpirationConfiguration( ExpirationConfiguration(threadId, duration, ExpirationType.DELETE_AFTER_SEND.number, System.currentTimeMillis()) ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/AndroidAutoReplyReceiver.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/AndroidAutoReplyReceiver.java index 884d6d7bed..68fdccef88 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/AndroidAutoReplyReceiver.java +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/AndroidAutoReplyReceiver.java @@ -26,6 +26,7 @@ import android.os.Bundle; import androidx.core.app.RemoteInput; +import org.session.libsession.messaging.messages.ExpirationConfiguration; import org.session.libsession.messaging.messages.signal.OutgoingMediaMessage; import org.session.libsession.messaging.messages.signal.OutgoingTextMessage; import org.session.libsession.messaging.messages.visible.VisibleMessage; @@ -84,10 +85,12 @@ public class AndroidAutoReplyReceiver extends BroadcastReceiver { message.setText(responseText.toString()); message.setSentTimestamp(System.currentTimeMillis()); MessageSender.send(message, recipient.getAddress()); + ExpirationConfiguration config = DatabaseComponent.get(context).expirationConfigurationDatabase().getExpirationConfiguration(threadId); + long expiresInMillis = config == null ? 0 : config.getDurationSeconds() * 1000L; if (recipient.isGroupRecipient()) { Log.w("AndroidAutoReplyReceiver", "GroupRecipient, Sending media message"); - OutgoingMediaMessage reply = OutgoingMediaMessage.from(message, recipient, Collections.emptyList(), null, null); + OutgoingMediaMessage reply = OutgoingMediaMessage.from(message, recipient, Collections.emptyList(), null, null, expiresInMillis); try { DatabaseComponent.get(context).mmsDatabase().insertMessageOutbox(reply, replyThreadId, false, null, true); } catch (MmsException e) { @@ -95,7 +98,7 @@ public class AndroidAutoReplyReceiver extends BroadcastReceiver { } } else { Log.w("AndroidAutoReplyReceiver", "Sending regular message "); - OutgoingTextMessage reply = OutgoingTextMessage.from(message, recipient); + OutgoingTextMessage reply = OutgoingTextMessage.from(message, recipient, expiresInMillis); DatabaseComponent.get(context).smsDatabase().insertMessageOutbox(replyThreadId, reply, false, System.currentTimeMillis(), null, true); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/RemoteReplyReceiver.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/RemoteReplyReceiver.java index 06ea38b79b..39b9ff4297 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/RemoteReplyReceiver.java +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/RemoteReplyReceiver.java @@ -26,6 +26,7 @@ import android.os.Bundle; import androidx.core.app.RemoteInput; +import org.session.libsession.messaging.messages.ExpirationConfiguration; import org.session.libsession.messaging.messages.signal.OutgoingMediaMessage; import org.session.libsession.messaging.messages.signal.OutgoingTextMessage; import org.session.libsession.messaging.messages.visible.VisibleMessage; @@ -78,10 +79,11 @@ public class RemoteReplyReceiver extends BroadcastReceiver { VisibleMessage message = new VisibleMessage(); message.setSentTimestamp(System.currentTimeMillis()); message.setText(responseText.toString()); - + ExpirationConfiguration config = DatabaseComponent.get(context).expirationConfigurationDatabase().getExpirationConfiguration(threadId); + long expiresInMillis = config == null ? 0 : config.getDurationSeconds() * 1000L; switch (replyMethod) { case GroupMessage: { - OutgoingMediaMessage reply = OutgoingMediaMessage.from(message, recipient, Collections.emptyList(), null, null); + OutgoingMediaMessage reply = OutgoingMediaMessage.from(message, recipient, Collections.emptyList(), null, null, expiresInMillis); try { DatabaseComponent.get(context).mmsDatabase().insertMessageOutbox(reply, threadId, false, null, true); MessageSender.send(message, address); @@ -91,7 +93,7 @@ public class RemoteReplyReceiver extends BroadcastReceiver { break; } case SecureMessage: { - OutgoingTextMessage reply = OutgoingTextMessage.from(message, recipient); + OutgoingTextMessage reply = OutgoingTextMessage.from(message, recipient, expiresInMillis); DatabaseComponent.get(context).smsDatabase().insertMessageOutbox(threadId, reply, false, System.currentTimeMillis(), null, true); MessageSender.send(message, address); break; diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/ExpiringMessageManager.java b/app/src/main/java/org/thoughtcrime/securesms/service/ExpiringMessageManager.java index 760622b12f..b46a99b775 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/ExpiringMessageManager.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/ExpiringMessageManager.java @@ -162,14 +162,14 @@ public class ExpiringMessageManager implements SSKEnvironment.MessageExpirationM MessageRecord messageRecord = DatabaseComponent.get(context).mmsSmsDatabase().getMessageFor(timestamp, author); if (messageRecord != null) { boolean mms = messageRecord.isMms(); - Recipient recipient = messageRecord.getRecipient(); - if (recipient.getExpireMessages() <= 0) return; + ExpirationConfiguration config = DatabaseComponent.get(context).expirationConfigurationDatabase().getExpirationConfiguration(messageRecord.getThreadId()); + if (config == null || !config.isEnabled()) return; if (mms) { mmsDatabase.markExpireStarted(messageRecord.getId()); } else { smsDatabase.markExpireStarted(messageRecord.getId()); } - scheduleDeletion(messageRecord.getId(), mms, recipient.getExpireMessages() * 1000); + scheduleDeletion(messageRecord.getId(), mms, config.getDurationSeconds() * 1000L); } } diff --git a/libsession/src/main/java/org/session/libsession/messaging/messages/ExpirationConfiguration.kt b/libsession/src/main/java/org/session/libsession/messaging/messages/ExpirationConfiguration.kt index 5ee5b8f88d..37c13776e5 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/messages/ExpirationConfiguration.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/messages/ExpirationConfiguration.kt @@ -12,6 +12,6 @@ class ExpirationConfiguration( val expirationType: ExpirationType? = ExpirationType.valueOf(expirationTypeValue) companion object { - val isNewConfigEnabled = System.currentTimeMillis() > 1_674_000_000_000 // 18/01/2023 + val isNewConfigEnabled = true//System.currentTimeMillis() > 1_674_000_000_000 // 18/01/2023 } } \ No newline at end of file diff --git a/libsession/src/main/java/org/session/libsession/messaging/messages/control/ConfigurationMessage.kt b/libsession/src/main/java/org/session/libsession/messaging/messages/control/ConfigurationMessage.kt index 30a47ab85b..0062a45968 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/messages/control/ConfigurationMessage.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/messages/control/ConfigurationMessage.kt @@ -128,8 +128,9 @@ class ConfigurationMessage(var closedGroups: List, var openGroups: if (!group.members.contains(Address.fromSerialized(storage.getUserPublicKey()!!))) continue val groupPublicKey = GroupUtil.doubleDecodeGroupID(group.encodedId).toHexString() val encryptionKeyPair = storage.getLatestClosedGroupEncryptionKeyPair(groupPublicKey) ?: continue - val recipient = Recipient.from(context, Address.fromSerialized(group.encodedId), false) - val closedGroup = ClosedGroup(groupPublicKey, group.title, encryptionKeyPair, group.members.map { it.serialize() }, group.admins.map { it.serialize() }, recipient.expireMessages) + val threadID = storage.getOrCreateThreadIdFor(Address.fromSerialized(group.encodedId)) + val expiryConfig = storage.getExpirationConfiguration(threadID) + val closedGroup = ClosedGroup(groupPublicKey, group.title, encryptionKeyPair, group.members.map { it.serialize() }, group.admins.map { it.serialize() }, expiryConfig?.durationSeconds ?: 0) closedGroups.add(closedGroup) } if (group.isOpenGroup) { diff --git a/libsession/src/main/java/org/session/libsession/messaging/messages/signal/OutgoingMediaMessage.java b/libsession/src/main/java/org/session/libsession/messaging/messages/signal/OutgoingMediaMessage.java index a163b667d9..57d3f88182 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/messages/signal/OutgoingMediaMessage.java +++ b/libsession/src/main/java/org/session/libsession/messaging/messages/signal/OutgoingMediaMessage.java @@ -4,13 +4,13 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import org.session.libsession.messaging.messages.visible.VisibleMessage; -import org.session.libsession.utilities.DistributionTypes; -import org.session.libsession.utilities.IdentityKeyMismatch; -import org.session.libsession.utilities.NetworkFailure; import org.session.libsession.messaging.sending_receiving.attachments.Attachment; -import org.session.libsession.utilities.Contact; import org.session.libsession.messaging.sending_receiving.link_preview.LinkPreview; import org.session.libsession.messaging.sending_receiving.quotes.QuoteModel; +import org.session.libsession.utilities.Contact; +import org.session.libsession.utilities.DistributionTypes; +import org.session.libsession.utilities.IdentityKeyMismatch; +import org.session.libsession.utilities.NetworkFailure; import org.session.libsession.utilities.recipients.Recipient; import java.util.Collections; @@ -78,14 +78,15 @@ public class OutgoingMediaMessage { Recipient recipient, List attachments, @Nullable QuoteModel outgoingQuote, - @Nullable LinkPreview linkPreview) + @Nullable LinkPreview linkPreview, + long expiresInMillis) { List previews = Collections.emptyList(); if (linkPreview != null) { previews = Collections.singletonList(linkPreview); } return new OutgoingMediaMessage(recipient, message.getText(), attachments, message.getSentTimestamp(), -1, - recipient.getExpireMessages() * 1000, DistributionTypes.DEFAULT, outgoingQuote, Collections.emptyList(), + expiresInMillis, DistributionTypes.DEFAULT, outgoingQuote, Collections.emptyList(), previews, Collections.emptyList(), Collections.emptyList()); } diff --git a/libsession/src/main/java/org/session/libsession/messaging/messages/signal/OutgoingTextMessage.java b/libsession/src/main/java/org/session/libsession/messaging/messages/signal/OutgoingTextMessage.java index abc39b662e..fb02ff05d6 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/messages/signal/OutgoingTextMessage.java +++ b/libsession/src/main/java/org/session/libsession/messaging/messages/signal/OutgoingTextMessage.java @@ -1,5 +1,6 @@ package org.session.libsession.messaging.messages.signal; +import org.session.libsession.messaging.messages.ExpirationConfiguration; import org.session.libsession.messaging.messages.visible.OpenGroupInvitation; import org.session.libsession.messaging.messages.visible.VisibleMessage; import org.session.libsession.utilities.recipients.Recipient; @@ -21,8 +22,8 @@ public class OutgoingTextMessage { this.sentTimestampMillis = sentTimestampMillis; } - public static OutgoingTextMessage from(VisibleMessage message, Recipient recipient) { - return new OutgoingTextMessage(recipient, message.getText(), recipient.getExpireMessages() * 1000, -1, message.getSentTimestamp()); + public static OutgoingTextMessage from(VisibleMessage message, Recipient recipient, long expiresInMillis) { + return new OutgoingTextMessage(recipient, message.getText(), expiresInMillis, -1, message.getSentTimestamp()); } public static OutgoingTextMessage fromOpenGroupInvitation(OpenGroupInvitation openGroupInvitation, Recipient recipient, Long sentTimestamp) { diff --git a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageSenderClosedGroupHandler.kt b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageSenderClosedGroupHandler.kt index 906e201a8a..3e013d88a6 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageSenderClosedGroupHandler.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageSenderClosedGroupHandler.kt @@ -133,8 +133,8 @@ fun MessageSender.addMembers(groupPublicKey: String, membersToAdd: List) Log.d("Loki", "Can't add members to nonexistent closed group.") throw Error.NoThread } - val recipient = Recipient.from(context, fromSerialized(groupID), false) - val expireTimer = recipient.expireMessages + val threadId = storage.getOrCreateThreadIdFor(fromSerialized(groupID)) + val expireTimer = storage.getExpirationConfiguration(threadId)?.durationSeconds ?: 0 if (membersToAdd.isEmpty()) { Log.d("Loki", "Invalid closed group update.") throw Error.InvalidClosedGroupUpdate