Group settings refactor

pull/1014/head
charles 2 years ago
parent 2494483afb
commit d23b849c91

@ -16,6 +16,7 @@ import dagger.hilt.android.AndroidEntryPoint
import network.loki.messenger.R import network.loki.messenger.R
import network.loki.messenger.databinding.ViewConversationActionBarBinding import network.loki.messenger.databinding.ViewConversationActionBarBinding
import network.loki.messenger.databinding.ViewConversationSettingBinding 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.messaging.open_groups.OpenGroup
import org.session.libsession.utilities.ExpirationUtil import org.session.libsession.utilities.ExpirationUtil
import org.session.libsession.utilities.recipients.Recipient import org.session.libsession.utilities.recipients.Recipient
@ -74,6 +75,7 @@ class ConversationActionBarView : LinearLayout {
delegate: ConversationActionBarDelegate, delegate: ConversationActionBarDelegate,
threadId: Long, threadId: Long,
recipient: Recipient, recipient: Recipient,
config: ExpirationConfiguration? = null,
openGroup: OpenGroup? = null, openGroup: OpenGroup? = null,
glide: GlideRequests glide: GlideRequests
) { ) {
@ -87,24 +89,24 @@ class ConversationActionBarView : LinearLayout {
binding.profilePictureView.root.layoutParams = LayoutParams(size, size) binding.profilePictureView.root.layoutParams = LayoutParams(size, size)
binding.profilePictureView.root.glide = glide binding.profilePictureView.root.glide = glide
MentionManagerUtilities.populateUserPublicKeyCacheIfNeeded(threadId, context) 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.profilePictureView.root.update(recipient)
binding.conversationTitleView.text = when { binding.conversationTitleView.text = when {
recipient.isLocalNumber -> context.getString(R.string.note_to_self) recipient.isLocalNumber -> context.getString(R.string.note_to_self)
else -> recipient.toShortString() 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<ConversationSetting>() val settings = mutableListOf<ConversationSetting>()
if (recipient.expireMessages > 0) { if (config?.isEnabled == true) {
settings.add( settings.add(
ConversationSetting( 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, ConversationSettingType.EXPIRATION,
R.drawable.ic_timer R.drawable.ic_timer
) )

@ -455,7 +455,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
actionBar.title = "" actionBar.title = ""
actionBar.setDisplayHomeAsUpEnabled(true) actionBar.setDisplayHomeAsUpEnabled(true)
actionBar.setHomeButtonEnabled(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) maybeUpdateToolbar(recipient)
} }
@ -548,7 +548,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
private fun getLatestOpenGroupInfoIfNeeded() { private fun getLatestOpenGroupInfoIfNeeded() {
viewModel.openGroup?.let { openGroup -> viewModel.openGroup?.let { openGroup ->
OpenGroupApi.getMemberCount(openGroup.room, openGroup.server).successUi { OpenGroupApi.getMemberCount(openGroup.room, openGroup.server).successUi {
binding?.toolbarContent?.updateSubtitle(viewModel.recipient!!, openGroup) binding?.toolbarContent?.updateSubtitle(viewModel.recipient!!, openGroup, viewModel.expirationConfiguration)
maybeUpdateToolbar(viewModel.recipient!!) maybeUpdateToolbar(viewModel.recipient!!)
} }
} }
@ -568,7 +568,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
private fun setUpOutdatedClientBanner() { private fun setUpOutdatedClientBanner() {
val recipient = viewModel.recipient ?: return val recipient = viewModel.recipient ?: return
if (recipient.expireMessages == 0 || !ExpirationConfiguration.isNewConfigEnabled) { return } if (viewModel.expirationConfiguration?.isEnabled != true || !ExpirationConfiguration.isNewConfigEnabled) { return }
binding?.outdatedBannerTextView?.text = 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, recipient.name)
binding?.outdatedBanner?.isVisible = true binding?.outdatedBanner?.isVisible = true
@ -622,7 +622,8 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
menu, menu,
menuInflater, menuInflater,
recipient, recipient,
this this,
viewModel.expirationConfiguration
) )
} }
viewModel.recipient?.let { maybeUpdateToolbar(it) } viewModel.recipient?.let { maybeUpdateToolbar(it) }
@ -653,7 +654,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
} }
private fun maybeUpdateToolbar(recipient: Recipient) { private fun maybeUpdateToolbar(recipient: Recipient) {
binding?.toolbarContent?.update(recipient, viewModel.openGroup) binding?.toolbarContent?.update(recipient, viewModel.openGroup, viewModel.expirationConfiguration)
} }
private fun showOrHideInputIfNeeded() { private fun showOrHideInputIfNeeded() {
@ -1347,7 +1348,8 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
val message = VisibleMessage() val message = VisibleMessage()
message.sentTimestamp = System.currentTimeMillis() message.sentTimestamp = System.currentTimeMillis()
message.text = text 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 // Clear the input bar
binding?.inputBar?.text = "" binding?.inputBar?.text = ""
binding?.inputBar?.cancelQuoteDraft() binding?.inputBar?.cancelQuoteDraft()
@ -1384,7 +1386,8 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
else it.individualRecipient.address else it.individualRecipient.address
quote?.copy(author = sender) 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 // Clear the input bar
binding?.inputBar?.text = "" binding?.inputBar?.text = ""
binding?.inputBar?.cancelQuoteDraft() binding?.inputBar?.cancelQuoteDraft()

@ -10,6 +10,7 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.update import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch 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.OpenGroup
import org.session.libsession.messaging.open_groups.OpenGroupApi import org.session.libsession.messaging.open_groups.OpenGroupApi
import org.session.libsession.messaging.utilities.SessionId import org.session.libsession.messaging.utilities.SessionId
@ -32,6 +33,9 @@ class ConversationViewModel(
private val _uiState = MutableStateFlow(ConversationUiState()) private val _uiState = MutableStateFlow(ConversationUiState())
val uiState: StateFlow<ConversationUiState> = _uiState val uiState: StateFlow<ConversationUiState> = _uiState
val expirationConfiguration: ExpirationConfiguration?
get() = storage.getExpirationConfiguration(threadId)
val recipient: Recipient? val recipient: Recipient?
get() = repository.maybeGetRecipientForThreadId(threadId) get() = repository.maybeGetRecipientForThreadId(threadId)

@ -18,6 +18,7 @@ import androidx.core.content.pm.ShortcutInfoCompat
import androidx.core.content.pm.ShortcutManagerCompat import androidx.core.content.pm.ShortcutManagerCompat
import androidx.core.graphics.drawable.IconCompat import androidx.core.graphics.drawable.IconCompat
import network.loki.messenger.R 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.MessageSender
import org.session.libsession.messaging.sending_receiving.leave import org.session.libsession.messaging.sending_receiving.leave
import org.session.libsession.utilities.GroupUtil.doubleDecodeGroupID import org.session.libsession.utilities.GroupUtil.doubleDecodeGroupID
@ -46,7 +47,8 @@ object ConversationMenuHelper {
menu: Menu, menu: Menu,
inflater: MenuInflater, inflater: MenuInflater,
thread: Recipient, thread: Recipient,
context: Context context: Context,
config: ExpirationConfiguration?
) { ) {
// Prepare // Prepare
menu.clear() menu.clear()
@ -54,7 +56,7 @@ object ConversationMenuHelper {
// Base menu (options that should always be present) // Base menu (options that should always be present)
inflater.inflate(R.menu.menu_conversation, menu) inflater.inflate(R.menu.menu_conversation, menu)
// Expiring messages // Expiring messages
if (thread.expireMessages == 0 && !isOpenGroup && if (config?.isEnabled != true && !isOpenGroup &&
(thread.hasApprovedMe() || thread.isClosedGroupRecipient || thread.isLocalNumber) (thread.hasApprovedMe() || thread.isClosedGroupRecipient || thread.isLocalNumber)
) { ) {
inflater.inflate(R.menu.menu_conversation_expiration_off, menu) inflater.inflate(R.menu.menu_conversation_expiration_off, menu)

@ -60,15 +60,15 @@ class ExpirationConfigurationDatabase(context: Context, helper: SQLCipherOpenHel
val query = "$THREAD_ID = ?" val query = "$THREAD_ID = ?"
val args = arrayOf("$threadId") val args = arrayOf("$threadId")
val mappings: MutableList<ExpirationConfiguration> = mutableListOf() val configurations: MutableList<ExpirationConfiguration> = mutableListOf()
readableDatabase.query(TABLE_NAME, null, query, args, null, null, null).use { cursor -> readableDatabase.query(TABLE_NAME, null, query, args, null, null, null).use { cursor ->
while (cursor.moveToNext()) { while (cursor.moveToNext()) {
mappings += readExpirationConfiguration(cursor) configurations += readExpirationConfiguration(cursor)
} }
} }
return mappings.firstOrNull() return configurations.firstOrNull()
} }
fun setExpirationConfiguration(configuration: ExpirationConfiguration) { fun setExpirationConfiguration(configuration: ExpirationConfiguration) {

@ -168,19 +168,27 @@ class Storage(context: Context, helper: SQLCipherOpenHelper) : Database(context,
recipientDb.setApprovedMe(targetRecipient, true) recipientDb.setApprovedMe(targetRecipient, true)
} }
} }
val expiresIn = getExpirationConfiguration(message.threadID ?: -1)?.durationSeconds ?: 0
if (message.isMediaMessage() || attachments.isNotEmpty()) { if (message.isMediaMessage() || attachments.isNotEmpty()) {
val quote: Optional<QuoteModel> = if (quotes != null) Optional.of(quotes) else Optional.absent() val quote: Optional<QuoteModel> = if (quotes != null) Optional.of(quotes) else Optional.absent()
val linkPreviews: Optional<List<LinkPreview>> = if (linkPreview.isEmpty()) Optional.absent() else Optional.of(linkPreview.mapNotNull { it!! }) val linkPreviews: Optional<List<LinkPreview>> = if (linkPreview.isEmpty()) Optional.absent() else Optional.of(linkPreview.mapNotNull { it!! })
val mmsDatabase = DatabaseComponent.get(context).mmsDatabase() val mmsDatabase = DatabaseComponent.get(context).mmsDatabase()
val insertResult = if (isUserSender || isUserBlindedSender) { 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) mmsDatabase.insertSecureDecryptedMessageOutbox(mediaMessage, message.threadID ?: -1, message.sentTimestamp!!, runThreadUpdate)
} else { } else {
// It seems like we have replaced SignalServiceAttachment with SessionServiceAttachment // It seems like we have replaced SignalServiceAttachment with SessionServiceAttachment
val signalServiceAttachments = attachments.mapNotNull { val signalServiceAttachments = attachments.mapNotNull {
it.toSignalPointer() 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) mmsDatabase.insertSecureDecryptedMessageInbox(mediaMessage, message.threadID ?: -1, message.receivedTimestamp ?: 0, runIncrement, runThreadUpdate)
} }
if (insertResult.isPresent) { if (insertResult.isPresent) {
@ -192,11 +200,11 @@ class Storage(context: Context, helper: SQLCipherOpenHelper) : Database(context,
val insertResult = if (isUserSender || isUserBlindedSender) { val insertResult = if (isUserSender || isUserBlindedSender) {
val textMessage = if (isOpenGroupInvitation) OutgoingTextMessage.fromOpenGroupInvitation(message.openGroupInvitation, targetRecipient, message.sentTimestamp) 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) smsDatabase.insertMessageOutbox(message.threadID ?: -1, textMessage, message.sentTimestamp!!, runThreadUpdate)
} else { } else {
val textMessage = if (isOpenGroupInvitation) IncomingTextMessage.fromOpenGroupInvitation(message.openGroupInvitation, senderAddress, message.sentTimestamp) 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) val encrypted = IncomingEncryptedMessage(textMessage, textMessage.messageBody)
smsDatabase.insertMessageInbox(encrypted, message.receivedTimestamp ?: 0, runIncrement, runThreadUpdate) 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) { override fun setExpirationTimer(groupID: String, duration: Int) {
val recipient = Recipient.from(context, fromSerialized(groupID), false) 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( DatabaseComponent.get(context).expirationConfigurationDatabase().setExpirationConfiguration(
ExpirationConfiguration(threadId, duration, ExpirationType.DELETE_AFTER_SEND.number, System.currentTimeMillis()) ExpirationConfiguration(threadId, duration, ExpirationType.DELETE_AFTER_SEND.number, System.currentTimeMillis())
) )

@ -26,6 +26,7 @@ import android.os.Bundle;
import androidx.core.app.RemoteInput; 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.OutgoingMediaMessage;
import org.session.libsession.messaging.messages.signal.OutgoingTextMessage; import org.session.libsession.messaging.messages.signal.OutgoingTextMessage;
import org.session.libsession.messaging.messages.visible.VisibleMessage; import org.session.libsession.messaging.messages.visible.VisibleMessage;
@ -84,10 +85,12 @@ public class AndroidAutoReplyReceiver extends BroadcastReceiver {
message.setText(responseText.toString()); message.setText(responseText.toString());
message.setSentTimestamp(System.currentTimeMillis()); message.setSentTimestamp(System.currentTimeMillis());
MessageSender.send(message, recipient.getAddress()); MessageSender.send(message, recipient.getAddress());
ExpirationConfiguration config = DatabaseComponent.get(context).expirationConfigurationDatabase().getExpirationConfiguration(threadId);
long expiresInMillis = config == null ? 0 : config.getDurationSeconds() * 1000L;
if (recipient.isGroupRecipient()) { if (recipient.isGroupRecipient()) {
Log.w("AndroidAutoReplyReceiver", "GroupRecipient, Sending media message"); 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 { try {
DatabaseComponent.get(context).mmsDatabase().insertMessageOutbox(reply, replyThreadId, false, null, true); DatabaseComponent.get(context).mmsDatabase().insertMessageOutbox(reply, replyThreadId, false, null, true);
} catch (MmsException e) { } catch (MmsException e) {
@ -95,7 +98,7 @@ public class AndroidAutoReplyReceiver extends BroadcastReceiver {
} }
} else { } else {
Log.w("AndroidAutoReplyReceiver", "Sending regular message "); 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); DatabaseComponent.get(context).smsDatabase().insertMessageOutbox(replyThreadId, reply, false, System.currentTimeMillis(), null, true);
} }

@ -26,6 +26,7 @@ import android.os.Bundle;
import androidx.core.app.RemoteInput; 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.OutgoingMediaMessage;
import org.session.libsession.messaging.messages.signal.OutgoingTextMessage; import org.session.libsession.messaging.messages.signal.OutgoingTextMessage;
import org.session.libsession.messaging.messages.visible.VisibleMessage; import org.session.libsession.messaging.messages.visible.VisibleMessage;
@ -78,10 +79,11 @@ public class RemoteReplyReceiver extends BroadcastReceiver {
VisibleMessage message = new VisibleMessage(); VisibleMessage message = new VisibleMessage();
message.setSentTimestamp(System.currentTimeMillis()); message.setSentTimestamp(System.currentTimeMillis());
message.setText(responseText.toString()); message.setText(responseText.toString());
ExpirationConfiguration config = DatabaseComponent.get(context).expirationConfigurationDatabase().getExpirationConfiguration(threadId);
long expiresInMillis = config == null ? 0 : config.getDurationSeconds() * 1000L;
switch (replyMethod) { switch (replyMethod) {
case GroupMessage: { case GroupMessage: {
OutgoingMediaMessage reply = OutgoingMediaMessage.from(message, recipient, Collections.emptyList(), null, null); OutgoingMediaMessage reply = OutgoingMediaMessage.from(message, recipient, Collections.emptyList(), null, null, expiresInMillis);
try { try {
DatabaseComponent.get(context).mmsDatabase().insertMessageOutbox(reply, threadId, false, null, true); DatabaseComponent.get(context).mmsDatabase().insertMessageOutbox(reply, threadId, false, null, true);
MessageSender.send(message, address); MessageSender.send(message, address);
@ -91,7 +93,7 @@ public class RemoteReplyReceiver extends BroadcastReceiver {
break; break;
} }
case SecureMessage: { 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); DatabaseComponent.get(context).smsDatabase().insertMessageOutbox(threadId, reply, false, System.currentTimeMillis(), null, true);
MessageSender.send(message, address); MessageSender.send(message, address);
break; break;

@ -162,14 +162,14 @@ public class ExpiringMessageManager implements SSKEnvironment.MessageExpirationM
MessageRecord messageRecord = DatabaseComponent.get(context).mmsSmsDatabase().getMessageFor(timestamp, author); MessageRecord messageRecord = DatabaseComponent.get(context).mmsSmsDatabase().getMessageFor(timestamp, author);
if (messageRecord != null) { if (messageRecord != null) {
boolean mms = messageRecord.isMms(); boolean mms = messageRecord.isMms();
Recipient recipient = messageRecord.getRecipient(); ExpirationConfiguration config = DatabaseComponent.get(context).expirationConfigurationDatabase().getExpirationConfiguration(messageRecord.getThreadId());
if (recipient.getExpireMessages() <= 0) return; if (config == null || !config.isEnabled()) return;
if (mms) { if (mms) {
mmsDatabase.markExpireStarted(messageRecord.getId()); mmsDatabase.markExpireStarted(messageRecord.getId());
} else { } else {
smsDatabase.markExpireStarted(messageRecord.getId()); smsDatabase.markExpireStarted(messageRecord.getId());
} }
scheduleDeletion(messageRecord.getId(), mms, recipient.getExpireMessages() * 1000); scheduleDeletion(messageRecord.getId(), mms, config.getDurationSeconds() * 1000L);
} }
} }

@ -12,6 +12,6 @@ class ExpirationConfiguration(
val expirationType: ExpirationType? = ExpirationType.valueOf(expirationTypeValue) val expirationType: ExpirationType? = ExpirationType.valueOf(expirationTypeValue)
companion object { 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
} }
} }

@ -128,8 +128,9 @@ class ConfigurationMessage(var closedGroups: List<ClosedGroup>, var openGroups:
if (!group.members.contains(Address.fromSerialized(storage.getUserPublicKey()!!))) continue if (!group.members.contains(Address.fromSerialized(storage.getUserPublicKey()!!))) continue
val groupPublicKey = GroupUtil.doubleDecodeGroupID(group.encodedId).toHexString() val groupPublicKey = GroupUtil.doubleDecodeGroupID(group.encodedId).toHexString()
val encryptionKeyPair = storage.getLatestClosedGroupEncryptionKeyPair(groupPublicKey) ?: continue val encryptionKeyPair = storage.getLatestClosedGroupEncryptionKeyPair(groupPublicKey) ?: continue
val recipient = Recipient.from(context, Address.fromSerialized(group.encodedId), false) val threadID = storage.getOrCreateThreadIdFor(Address.fromSerialized(group.encodedId))
val closedGroup = ClosedGroup(groupPublicKey, group.title, encryptionKeyPair, group.members.map { it.serialize() }, group.admins.map { it.serialize() }, recipient.expireMessages) 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) closedGroups.add(closedGroup)
} }
if (group.isOpenGroup) { if (group.isOpenGroup) {

@ -4,13 +4,13 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import org.session.libsession.messaging.messages.visible.VisibleMessage; 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.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.link_preview.LinkPreview;
import org.session.libsession.messaging.sending_receiving.quotes.QuoteModel; 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 org.session.libsession.utilities.recipients.Recipient;
import java.util.Collections; import java.util.Collections;
@ -78,14 +78,15 @@ public class OutgoingMediaMessage {
Recipient recipient, Recipient recipient,
List<Attachment> attachments, List<Attachment> attachments,
@Nullable QuoteModel outgoingQuote, @Nullable QuoteModel outgoingQuote,
@Nullable LinkPreview linkPreview) @Nullable LinkPreview linkPreview,
long expiresInMillis)
{ {
List<LinkPreview> previews = Collections.emptyList(); List<LinkPreview> previews = Collections.emptyList();
if (linkPreview != null) { if (linkPreview != null) {
previews = Collections.singletonList(linkPreview); previews = Collections.singletonList(linkPreview);
} }
return new OutgoingMediaMessage(recipient, message.getText(), attachments, message.getSentTimestamp(), -1, 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()); previews, Collections.emptyList(), Collections.emptyList());
} }

@ -1,5 +1,6 @@
package org.session.libsession.messaging.messages.signal; 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.OpenGroupInvitation;
import org.session.libsession.messaging.messages.visible.VisibleMessage; import org.session.libsession.messaging.messages.visible.VisibleMessage;
import org.session.libsession.utilities.recipients.Recipient; import org.session.libsession.utilities.recipients.Recipient;
@ -21,8 +22,8 @@ public class OutgoingTextMessage {
this.sentTimestampMillis = sentTimestampMillis; this.sentTimestampMillis = sentTimestampMillis;
} }
public static OutgoingTextMessage from(VisibleMessage message, Recipient recipient) { public static OutgoingTextMessage from(VisibleMessage message, Recipient recipient, long expiresInMillis) {
return new OutgoingTextMessage(recipient, message.getText(), recipient.getExpireMessages() * 1000, -1, message.getSentTimestamp()); return new OutgoingTextMessage(recipient, message.getText(), expiresInMillis, -1, message.getSentTimestamp());
} }
public static OutgoingTextMessage fromOpenGroupInvitation(OpenGroupInvitation openGroupInvitation, Recipient recipient, Long sentTimestamp) { public static OutgoingTextMessage fromOpenGroupInvitation(OpenGroupInvitation openGroupInvitation, Recipient recipient, Long sentTimestamp) {

@ -133,8 +133,8 @@ fun MessageSender.addMembers(groupPublicKey: String, membersToAdd: List<String>)
Log.d("Loki", "Can't add members to nonexistent closed group.") Log.d("Loki", "Can't add members to nonexistent closed group.")
throw Error.NoThread throw Error.NoThread
} }
val recipient = Recipient.from(context, fromSerialized(groupID), false) val threadId = storage.getOrCreateThreadIdFor(fromSerialized(groupID))
val expireTimer = recipient.expireMessages val expireTimer = storage.getExpirationConfiguration(threadId)?.durationSeconds ?: 0
if (membersToAdd.isEmpty()) { if (membersToAdd.isEmpty()) {
Log.d("Loki", "Invalid closed group update.") Log.d("Loki", "Invalid closed group update.")
throw Error.InvalidClosedGroupUpdate throw Error.InvalidClosedGroupUpdate

Loading…
Cancel
Save