mirror of
https://github.com/oxen-io/session-android.git
synced 2025-04-30 03:40:46 +00:00
Cleanup expiring message manager
This commit is contained in:
parent
d70bfe5614
commit
a4e64187f1
@ -72,7 +72,7 @@ class ExpirationConfigurationDatabase(context: Context, helper: SQLCipherOpenHel
|
|||||||
return mappings.firstOrNull()
|
return mappings.firstOrNull()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun addExpirationConfiguration(configuration: ExpirationConfiguration) {
|
fun setExpirationConfiguration(configuration: ExpirationConfiguration) {
|
||||||
writableDatabase.beginTransaction()
|
writableDatabase.beginTransaction()
|
||||||
try {
|
try {
|
||||||
val values = ContentValues().apply {
|
val values = ContentValues().apply {
|
||||||
|
@ -317,16 +317,6 @@ public class RecipientDatabase extends Database {
|
|||||||
notifyRecipientListeners();
|
notifyRecipientListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setExpireMessages(@NonNull Recipient recipient, int expiration) {
|
|
||||||
recipient.setExpireMessages(expiration);
|
|
||||||
|
|
||||||
ContentValues values = new ContentValues(1);
|
|
||||||
values.put(EXPIRE_MESSAGES, expiration);
|
|
||||||
updateOrInsert(recipient.getAddress(), values);
|
|
||||||
recipient.resolve().setExpireMessages(expiration);
|
|
||||||
notifyRecipientListeners();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setUnidentifiedAccessMode(@NonNull Recipient recipient, @NonNull UnidentifiedAccessMode unidentifiedAccessMode) {
|
public void setUnidentifiedAccessMode(@NonNull Recipient recipient, @NonNull UnidentifiedAccessMode unidentifiedAccessMode) {
|
||||||
ContentValues values = new ContentValues(1);
|
ContentValues values = new ContentValues(1);
|
||||||
values.put(UNIDENTIFIED_ACCESS_MODE, unidentifiedAccessMode.getMode());
|
values.put(UNIDENTIFIED_ACCESS_MODE, unidentifiedAccessMode.getMode());
|
||||||
|
@ -48,6 +48,7 @@ import org.session.libsession.utilities.recipients.Recipient
|
|||||||
import org.session.libsignal.crypto.ecc.ECKeyPair
|
import org.session.libsignal.crypto.ecc.ECKeyPair
|
||||||
import org.session.libsignal.messages.SignalServiceAttachmentPointer
|
import org.session.libsignal.messages.SignalServiceAttachmentPointer
|
||||||
import org.session.libsignal.messages.SignalServiceGroup
|
import org.session.libsignal.messages.SignalServiceGroup
|
||||||
|
import org.session.libsignal.protos.SignalServiceProtos.Content.ExpirationType
|
||||||
import org.session.libsignal.utilities.IdPrefix
|
import org.session.libsignal.utilities.IdPrefix
|
||||||
import org.session.libsignal.utilities.KeyHelper
|
import org.session.libsignal.utilities.KeyHelper
|
||||||
import org.session.libsignal.utilities.guava.Optional
|
import org.session.libsignal.utilities.guava.Optional
|
||||||
@ -541,7 +542,10 @@ 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)
|
||||||
DatabaseComponent.get(context).recipientDatabase().setExpireMessages(recipient, duration);
|
val threadId = DatabaseComponent.get(context).threadDatabase().getThreadIdIfExistsFor(recipient)
|
||||||
|
DatabaseComponent.get(context).expirationConfigurationDatabase().setExpirationConfiguration(
|
||||||
|
ExpirationConfiguration(threadId, duration, ExpirationType.DELETE_AFTER_SEND, System.currentTimeMillis())
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun setServerCapabilities(server: String, capabilities: List<String>) {
|
override fun setServerCapabilities(server: String, capabilities: List<String>) {
|
||||||
@ -968,7 +972,7 @@ class Storage(context: Context, helper: SQLCipherOpenHelper) : Database(context,
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun addExpirationConfiguration(config: ExpirationConfiguration) {
|
override fun addExpirationConfiguration(config: ExpirationConfiguration) {
|
||||||
DatabaseComponent.get(context).expirationConfigurationDatabase().addExpirationConfiguration(config)
|
DatabaseComponent.get(context).expirationConfigurationDatabase().setExpirationConfiguration(config)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getExpiringMessages(messageIds: LongArray): List<Pair<String, Int>> {
|
override fun getExpiringMessages(messageIds: LongArray): List<Pair<String, Int>> {
|
||||||
|
@ -3,6 +3,8 @@ package org.thoughtcrime.securesms.service;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.session.libsession.messaging.messages.ExpirationConfiguration;
|
||||||
import org.session.libsession.messaging.messages.control.ExpirationTimerUpdate;
|
import org.session.libsession.messaging.messages.control.ExpirationTimerUpdate;
|
||||||
import org.session.libsession.messaging.messages.signal.IncomingMediaMessage;
|
import org.session.libsession.messaging.messages.signal.IncomingMediaMessage;
|
||||||
import org.session.libsession.messaging.messages.signal.OutgoingExpirationUpdateMessage;
|
import org.session.libsession.messaging.messages.signal.OutgoingExpirationUpdateMessage;
|
||||||
@ -12,6 +14,7 @@ import org.session.libsession.utilities.SSKEnvironment;
|
|||||||
import org.session.libsession.utilities.TextSecurePreferences;
|
import org.session.libsession.utilities.TextSecurePreferences;
|
||||||
import org.session.libsession.utilities.recipients.Recipient;
|
import org.session.libsession.utilities.recipients.Recipient;
|
||||||
import org.session.libsignal.messages.SignalServiceGroup;
|
import org.session.libsignal.messages.SignalServiceGroup;
|
||||||
|
import org.session.libsignal.protos.SignalServiceProtos;
|
||||||
import org.session.libsignal.utilities.Log;
|
import org.session.libsignal.utilities.Log;
|
||||||
import org.session.libsignal.utilities.guava.Optional;
|
import org.session.libsignal.utilities.guava.Optional;
|
||||||
import org.thoughtcrime.securesms.database.MmsDatabase;
|
import org.thoughtcrime.securesms.database.MmsDatabase;
|
||||||
@ -66,7 +69,19 @@ public class ExpiringMessageManager implements SSKEnvironment.MessageExpirationM
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setExpirationTimer(@NotNull ExpirationTimerUpdate message) {
|
public void setExpirationTimer(@NotNull ExpirationTimerUpdate message, @Nullable SignalServiceProtos.Content.ExpirationType type) {
|
||||||
|
try {
|
||||||
|
long threadId = message.getThreadID();
|
||||||
|
if (message.getGroupPublicKey() != null) {
|
||||||
|
Recipient recipient = Recipient.from(context, Address.fromSerialized(GroupUtil.doubleEncodeGroupID(message.getGroupPublicKey())), false);
|
||||||
|
threadId = DatabaseComponent.get(context).threadDatabase().getOrCreateThreadIdFor(recipient);
|
||||||
|
}
|
||||||
|
DatabaseComponent.get(context).expirationConfigurationDatabase().setExpirationConfiguration(
|
||||||
|
new ExpirationConfiguration(threadId, message.getDuration(), type, System.currentTimeMillis())
|
||||||
|
);
|
||||||
|
} catch (Exception e) {
|
||||||
|
Log.e("Loki", "Failed to update expiration configuration.");
|
||||||
|
}
|
||||||
String userPublicKey = TextSecurePreferences.getLocalNumber(context);
|
String userPublicKey = TextSecurePreferences.getLocalNumber(context);
|
||||||
String senderPublicKey = message.getSender();
|
String senderPublicKey = message.getSender();
|
||||||
|
|
||||||
@ -120,10 +135,6 @@ public class ExpiringMessageManager implements SSKEnvironment.MessageExpirationM
|
|||||||
Optional.absent());
|
Optional.absent());
|
||||||
//insert the timer update message
|
//insert the timer update message
|
||||||
database.insertSecureDecryptedMessageInbox(mediaMessage, -1, true, true);
|
database.insertSecureDecryptedMessageInbox(mediaMessage, -1, true, true);
|
||||||
|
|
||||||
//set the timer to the conversation
|
|
||||||
DatabaseComponent.get(context).recipientDatabase().setExpireMessages(recipient, duration);
|
|
||||||
|
|
||||||
} catch (IOException | MmsException ioe) {
|
} catch (IOException | MmsException ioe) {
|
||||||
Log.e("Loki", "Failed to insert expiration update message.");
|
Log.e("Loki", "Failed to insert expiration update message.");
|
||||||
}
|
}
|
||||||
@ -142,24 +153,11 @@ public class ExpiringMessageManager implements SSKEnvironment.MessageExpirationM
|
|||||||
try {
|
try {
|
||||||
OutgoingExpirationUpdateMessage timerUpdateMessage = new OutgoingExpirationUpdateMessage(recipient, sentTimestamp, duration * 1000L, groupId);
|
OutgoingExpirationUpdateMessage timerUpdateMessage = new OutgoingExpirationUpdateMessage(recipient, sentTimestamp, duration * 1000L, groupId);
|
||||||
database.insertSecureDecryptedMessageOutbox(timerUpdateMessage, -1, sentTimestamp, true);
|
database.insertSecureDecryptedMessageOutbox(timerUpdateMessage, -1, sentTimestamp, true);
|
||||||
|
} catch (MmsException e) {
|
||||||
if (groupId != null) {
|
|
||||||
// we need the group ID as recipient for setExpireMessages below
|
|
||||||
recipient = Recipient.from(context, Address.fromSerialized(GroupUtil.doubleEncodeGroupID(groupId)), false);
|
|
||||||
}
|
|
||||||
//set the timer to the conversation
|
|
||||||
DatabaseComponent.get(context).recipientDatabase().setExpireMessages(recipient, duration);
|
|
||||||
|
|
||||||
} catch (MmsException | IOException ioe) {
|
|
||||||
Log.e("Loki", "Failed to insert expiration update message.");
|
Log.e("Loki", "Failed to insert expiration update message.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void disableExpirationTimer(@NotNull ExpirationTimerUpdate message) {
|
|
||||||
setExpirationTimer(message);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void startAnyExpiration(long timestamp, @NotNull String author) {
|
public void startAnyExpiration(long timestamp, @NotNull String author) {
|
||||||
MessageRecord messageRecord = DatabaseComponent.get(context).mmsSmsDatabase().getMessageFor(timestamp, author);
|
MessageRecord messageRecord = DatabaseComponent.get(context).mmsSmsDatabase().getMessageFor(timestamp, author);
|
||||||
|
@ -45,6 +45,7 @@ import org.session.libsignal.crypto.ecc.DjbECPublicKey
|
|||||||
import org.session.libsignal.crypto.ecc.ECKeyPair
|
import org.session.libsignal.crypto.ecc.ECKeyPair
|
||||||
import org.session.libsignal.messages.SignalServiceGroup
|
import org.session.libsignal.messages.SignalServiceGroup
|
||||||
import org.session.libsignal.protos.SignalServiceProtos
|
import org.session.libsignal.protos.SignalServiceProtos
|
||||||
|
import org.session.libsignal.protos.SignalServiceProtos.Content.ExpirationType
|
||||||
import org.session.libsignal.utilities.Base64
|
import org.session.libsignal.utilities.Base64
|
||||||
import org.session.libsignal.utilities.IdPrefix
|
import org.session.libsignal.utilities.IdPrefix
|
||||||
import org.session.libsignal.utilities.Log
|
import org.session.libsignal.utilities.Log
|
||||||
@ -156,11 +157,14 @@ fun MessageReceiver.cancelTypingIndicatorsIfNeeded(senderPublicKey: String) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun MessageReceiver.handleExpirationTimerUpdate(message: ExpirationTimerUpdate) {
|
private fun MessageReceiver.handleExpirationTimerUpdate(message: ExpirationTimerUpdate) {
|
||||||
if (message.duration!! > 0) {
|
if (ExpirationConfiguration.isNewConfigEnabled) return
|
||||||
SSKEnvironment.shared.messageExpirationManager.setExpirationTimer(message)
|
val recipient = Recipient.from(MessagingModuleConfiguration.shared.context, Address.fromSerialized(message.sender!!), false)
|
||||||
} else {
|
val type = when {
|
||||||
SSKEnvironment.shared.messageExpirationManager.disableExpirationTimer(message)
|
recipient.isLocalNumber -> ExpirationType.DELETE_AFTER_READ
|
||||||
|
recipient.isContactRecipient || recipient.isGroupRecipient -> ExpirationType.DELETE_AFTER_SEND
|
||||||
|
else -> null
|
||||||
}
|
}
|
||||||
|
SSKEnvironment.shared.messageExpirationManager.setExpirationTimer(message, type)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun MessageReceiver.handleDataExtractionNotification(message: DataExtractionNotification) {
|
private fun MessageReceiver.handleDataExtractionNotification(message: DataExtractionNotification) {
|
||||||
|
@ -3,8 +3,8 @@ package org.session.libsession.utilities
|
|||||||
import android.content.Context
|
import android.content.Context
|
||||||
import org.session.libsession.messaging.messages.control.ExpirationTimerUpdate
|
import org.session.libsession.messaging.messages.control.ExpirationTimerUpdate
|
||||||
import org.session.libsession.messaging.sending_receiving.notifications.MessageNotifier
|
import org.session.libsession.messaging.sending_receiving.notifications.MessageNotifier
|
||||||
import org.session.libsession.utilities.Address
|
|
||||||
import org.session.libsession.utilities.recipients.Recipient
|
import org.session.libsession.utilities.recipients.Recipient
|
||||||
|
import org.session.libsignal.protos.SignalServiceProtos.Content.ExpirationType
|
||||||
|
|
||||||
class SSKEnvironment(
|
class SSKEnvironment(
|
||||||
val typingIndicators: TypingIndicatorsProtocol,
|
val typingIndicators: TypingIndicatorsProtocol,
|
||||||
@ -37,8 +37,7 @@ class SSKEnvironment(
|
|||||||
}
|
}
|
||||||
|
|
||||||
interface MessageExpirationManagerProtocol {
|
interface MessageExpirationManagerProtocol {
|
||||||
fun setExpirationTimer(message: ExpirationTimerUpdate)
|
fun setExpirationTimer(message: ExpirationTimerUpdate, type: ExpirationType?)
|
||||||
fun disableExpirationTimer(message: ExpirationTimerUpdate)
|
|
||||||
fun startAnyExpiration(timestamp: Long, author: String)
|
fun startAnyExpiration(timestamp: Long, author: String)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user