mirror of
https://github.com/oxen-io/session-android.git
synced 2025-02-20 19:48:26 +00:00
Fix expiry timer update handling
This commit is contained in:
parent
644484b650
commit
487f99ab93
@ -20,6 +20,7 @@ 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
|
||||||
|
import org.session.libsignal.protos.SignalServiceProtos
|
||||||
import org.thoughtcrime.securesms.conversation.v2.utilities.MentionManagerUtilities
|
import org.thoughtcrime.securesms.conversation.v2.utilities.MentionManagerUtilities
|
||||||
import org.thoughtcrime.securesms.database.GroupDatabase
|
import org.thoughtcrime.securesms.database.GroupDatabase
|
||||||
import org.thoughtcrime.securesms.database.LokiAPIDatabase
|
import org.thoughtcrime.securesms.database.LokiAPIDatabase
|
||||||
@ -104,9 +105,14 @@ class ConversationActionBarView : LinearLayout {
|
|||||||
fun updateSubtitle(recipient: Recipient, openGroup: OpenGroup? = null, config: ExpirationConfiguration? = null) {
|
fun updateSubtitle(recipient: Recipient, openGroup: OpenGroup? = null, config: ExpirationConfiguration? = null) {
|
||||||
val settings = mutableListOf<ConversationSetting>()
|
val settings = mutableListOf<ConversationSetting>()
|
||||||
if (config?.isEnabled == true) {
|
if (config?.isEnabled == true) {
|
||||||
|
val prefix = if (config.expirationType == SignalServiceProtos.Content.ExpirationType.DELETE_AFTER_READ) {
|
||||||
|
context.getString(R.string.expiration_type_disappear_after_read)
|
||||||
|
} else {
|
||||||
|
context.getString(R.string.expiration_type_disappear_after_send)
|
||||||
|
}
|
||||||
settings.add(
|
settings.add(
|
||||||
ConversationSetting(
|
ConversationSetting(
|
||||||
"${context.getString(R.string.expiration_type_disappear_after_read)} - ${ExpirationUtil.getExpirationAbbreviatedDisplayValue(context, config?.durationSeconds ?: 0)}" ,
|
"$prefix - ${ExpirationUtil.getExpirationAbbreviatedDisplayValue(context, config.durationSeconds)}" ,
|
||||||
ConversationSettingType.EXPIRATION,
|
ConversationSettingType.EXPIRATION,
|
||||||
R.drawable.ic_timer
|
R.drawable.ic_timer
|
||||||
)
|
)
|
||||||
|
@ -15,6 +15,7 @@ import kotlinx.coroutines.launch
|
|||||||
import org.session.libsession.messaging.messages.ExpirationConfiguration
|
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.sending_receiving.MessageSender
|
import org.session.libsession.messaging.sending_receiving.MessageSender
|
||||||
|
import org.session.libsession.utilities.SSKEnvironment.MessageExpirationManagerProtocol
|
||||||
import org.session.libsession.utilities.recipients.Recipient
|
import org.session.libsession.utilities.recipients.Recipient
|
||||||
import org.session.libsignal.protos.SignalServiceProtos.Content.ExpirationType
|
import org.session.libsignal.protos.SignalServiceProtos.Content.ExpirationType
|
||||||
import org.thoughtcrime.securesms.database.Storage
|
import org.thoughtcrime.securesms.database.Storage
|
||||||
@ -25,6 +26,7 @@ class ExpirationSettingsViewModel(
|
|||||||
private val threadId: Long,
|
private val threadId: Long,
|
||||||
private val afterReadOptions: List<RadioOption>,
|
private val afterReadOptions: List<RadioOption>,
|
||||||
private val afterSendOptions: List<RadioOption>,
|
private val afterSendOptions: List<RadioOption>,
|
||||||
|
private val messageExpirationManager: MessageExpirationManagerProtocol,
|
||||||
private val threadDb: ThreadDatabase,
|
private val threadDb: ThreadDatabase,
|
||||||
private val storage: Storage
|
private val storage: Storage
|
||||||
) : ViewModel() {
|
) : ViewModel() {
|
||||||
@ -54,11 +56,6 @@ class ExpirationSettingsViewModel(
|
|||||||
_uiState.update {
|
_uiState.update {
|
||||||
it.copy(showExpirationTypeSelector = !ExpirationConfiguration.isNewConfigEnabled || (recipient?.isContactRecipient == true && !recipient.isLocalNumber))
|
it.copy(showExpirationTypeSelector = !ExpirationConfiguration.isNewConfigEnabled || (recipient?.isContactRecipient == true && !recipient.isLocalNumber))
|
||||||
}
|
}
|
||||||
if (ExpirationConfiguration.isNewConfigEnabled && (recipient?.isLocalNumber == true || recipient?.isClosedGroupRecipient == true)) {
|
|
||||||
_selectedExpirationType.value = ExpirationType.DELETE_AFTER_SEND.number
|
|
||||||
} else {
|
|
||||||
_selectedExpirationType.value = expirationConfig?.expirationTypeValue ?: -1
|
|
||||||
}
|
|
||||||
_selectedExpirationType.value = if (ExpirationConfiguration.isNewConfigEnabled) {
|
_selectedExpirationType.value = if (ExpirationConfiguration.isNewConfigEnabled) {
|
||||||
if (recipient?.isLocalNumber == true || recipient?.isClosedGroupRecipient == true) {
|
if (recipient?.isLocalNumber == true || recipient?.isClosedGroupRecipient == true) {
|
||||||
ExpirationType.DELETE_AFTER_SEND.number
|
ExpirationType.DELETE_AFTER_SEND.number
|
||||||
@ -108,6 +105,8 @@ class ExpirationSettingsViewModel(
|
|||||||
val address = recipient.value?.address ?: return@launch
|
val address = recipient.value?.address ?: return@launch
|
||||||
message.recipient = address.serialize()
|
message.recipient = address.serialize()
|
||||||
message.sentTimestamp = System.currentTimeMillis()
|
message.sentTimestamp = System.currentTimeMillis()
|
||||||
|
messageExpirationManager.setExpirationTimer(message)
|
||||||
|
|
||||||
MessageSender.send(message, address)
|
MessageSender.send(message, address)
|
||||||
_uiState.update {
|
_uiState.update {
|
||||||
it.copy(settingsSaved = true)
|
it.copy(settingsSaved = true)
|
||||||
@ -128,6 +127,7 @@ class ExpirationSettingsViewModel(
|
|||||||
@Assisted private val threadId: Long,
|
@Assisted private val threadId: Long,
|
||||||
@Assisted("afterRead") private val afterReadOptions: List<RadioOption>,
|
@Assisted("afterRead") private val afterReadOptions: List<RadioOption>,
|
||||||
@Assisted("afterSend") private val afterSendOptions: List<RadioOption>,
|
@Assisted("afterSend") private val afterSendOptions: List<RadioOption>,
|
||||||
|
private val messageExpirationManager: MessageExpirationManagerProtocol,
|
||||||
private val threadDb: ThreadDatabase,
|
private val threadDb: ThreadDatabase,
|
||||||
private val storage: Storage
|
private val storage: Storage
|
||||||
) : ViewModelProvider.Factory {
|
) : ViewModelProvider.Factory {
|
||||||
@ -137,6 +137,7 @@ class ExpirationSettingsViewModel(
|
|||||||
threadId,
|
threadId,
|
||||||
afterReadOptions,
|
afterReadOptions,
|
||||||
afterSendOptions,
|
afterSendOptions,
|
||||||
|
messageExpirationManager,
|
||||||
threadDb,
|
threadDb,
|
||||||
storage
|
storage
|
||||||
) as T
|
) as T
|
||||||
|
@ -83,6 +83,7 @@ class ExpirationConfigurationDatabase(context: Context, helper: SQLCipherOpenHel
|
|||||||
|
|
||||||
writableDatabase.insert(TABLE_NAME, null, values)
|
writableDatabase.insert(TABLE_NAME, null, values)
|
||||||
writableDatabase.setTransactionSuccessful()
|
writableDatabase.setTransactionSuccessful()
|
||||||
|
notifyConversationListeners(configuration.threadId)
|
||||||
} finally {
|
} finally {
|
||||||
writableDatabase.endTransaction()
|
writableDatabase.endTransaction()
|
||||||
}
|
}
|
||||||
|
@ -8,12 +8,14 @@ import dagger.hilt.android.qualifiers.ApplicationContext
|
|||||||
import dagger.hilt.components.SingletonComponent
|
import dagger.hilt.components.SingletonComponent
|
||||||
import net.sqlcipher.database.SQLiteDatabase
|
import net.sqlcipher.database.SQLiteDatabase
|
||||||
import org.session.libsession.database.MessageDataProvider
|
import org.session.libsession.database.MessageDataProvider
|
||||||
|
import org.session.libsession.utilities.SSKEnvironment
|
||||||
import org.thoughtcrime.securesms.attachments.DatabaseAttachmentProvider
|
import org.thoughtcrime.securesms.attachments.DatabaseAttachmentProvider
|
||||||
import org.thoughtcrime.securesms.crypto.AttachmentSecret
|
import org.thoughtcrime.securesms.crypto.AttachmentSecret
|
||||||
import org.thoughtcrime.securesms.crypto.AttachmentSecretProvider
|
import org.thoughtcrime.securesms.crypto.AttachmentSecretProvider
|
||||||
import org.thoughtcrime.securesms.crypto.DatabaseSecretProvider
|
import org.thoughtcrime.securesms.crypto.DatabaseSecretProvider
|
||||||
import org.thoughtcrime.securesms.database.*
|
import org.thoughtcrime.securesms.database.*
|
||||||
import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper
|
import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper
|
||||||
|
import org.thoughtcrime.securesms.service.ExpiringMessageManager
|
||||||
import javax.inject.Singleton
|
import javax.inject.Singleton
|
||||||
|
|
||||||
@Module
|
@Module
|
||||||
@ -25,6 +27,10 @@ object DatabaseModule {
|
|||||||
SQLiteDatabase.loadLibs(context)
|
SQLiteDatabase.loadLibs(context)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Provides
|
||||||
|
@Singleton
|
||||||
|
fun provideMessageExpirationManagerProtocol(@ApplicationContext context: Context): SSKEnvironment.MessageExpirationManagerProtocol = ExpiringMessageManager(context)
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
@Singleton
|
@Singleton
|
||||||
fun provideAttachmentSecret(@ApplicationContext context: Context) = AttachmentSecretProvider.getInstance(context).orCreateAttachmentSecret
|
fun provideAttachmentSecret(@ApplicationContext context: Context) = AttachmentSecretProvider.getInstance(context).orCreateAttachmentSecret
|
||||||
|
@ -69,20 +69,7 @@ public class ExpiringMessageManager implements SSKEnvironment.MessageExpirationM
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setExpirationTimer(@NotNull ExpirationTimerUpdate message, @Nullable Integer expirationType) {
|
public void setExpirationTimer(@NotNull ExpirationTimerUpdate message) {
|
||||||
try {
|
|
||||||
ThreadDatabase threadDb = DatabaseComponent.get(context).threadDatabase();
|
|
||||||
long threadId = threadDb.getOrCreateThreadIdFor(Recipient.from(context, Address.fromSerialized(message.getSender()), false));
|
|
||||||
if (message.getGroupPublicKey() != null) {
|
|
||||||
Recipient recipient = Recipient.from(context, Address.fromSerialized(GroupUtil.doubleEncodeGroupID(message.getGroupPublicKey())), false);
|
|
||||||
threadId = threadDb.getOrCreateThreadIdFor(recipient);
|
|
||||||
}
|
|
||||||
DatabaseComponent.get(context).expirationConfigurationDatabase().setExpirationConfiguration(
|
|
||||||
new ExpirationConfiguration(threadId, message.getDuration(), expirationType, 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();
|
||||||
|
|
||||||
|
@ -33,8 +33,10 @@ import org.session.libsession.messaging.utilities.SodiumUtilities
|
|||||||
import org.session.libsession.messaging.utilities.WebRtcUtils
|
import org.session.libsession.messaging.utilities.WebRtcUtils
|
||||||
import org.session.libsession.snode.SnodeAPI
|
import org.session.libsession.snode.SnodeAPI
|
||||||
import org.session.libsession.utilities.Address
|
import org.session.libsession.utilities.Address
|
||||||
|
import org.session.libsession.utilities.Address.Companion.fromSerialized
|
||||||
import org.session.libsession.utilities.GroupRecord
|
import org.session.libsession.utilities.GroupRecord
|
||||||
import org.session.libsession.utilities.GroupUtil
|
import org.session.libsession.utilities.GroupUtil
|
||||||
|
import org.session.libsession.utilities.GroupUtil.doubleEncodeGroupID
|
||||||
import org.session.libsession.utilities.ProfileKeyUtil
|
import org.session.libsession.utilities.ProfileKeyUtil
|
||||||
import org.session.libsession.utilities.SSKEnvironment
|
import org.session.libsession.utilities.SSKEnvironment
|
||||||
import org.session.libsession.utilities.TextSecurePreferences
|
import org.session.libsession.utilities.TextSecurePreferences
|
||||||
@ -92,7 +94,7 @@ fun updateExpirationConfigurationIfNeeded(message: Message, proto: SignalService
|
|||||||
val threadID = storage.getOrCreateThreadIdFor(message.sender!!, message.groupPublicKey, openGroupID)
|
val threadID = storage.getOrCreateThreadIdFor(message.sender!!, message.groupPublicKey, openGroupID)
|
||||||
if (threadID <= 0) return
|
if (threadID <= 0) return
|
||||||
val localConfig = storage.getExpirationConfiguration(threadID)
|
val localConfig = storage.getExpirationConfiguration(threadID)
|
||||||
if (localConfig == null || localConfig.updatedTimestampMs > proto.lastDisappearingMessageChangeTimestamp) return
|
if (localConfig != null && localConfig.updatedTimestampMs > proto.lastDisappearingMessageChangeTimestamp) return
|
||||||
val durationSeconds = if (proto.hasExpirationTimer()) proto.expirationTimer else 0
|
val durationSeconds = if (proto.hasExpirationTimer()) proto.expirationTimer else 0
|
||||||
val type = if (proto.hasExpirationType()) proto.expirationType else null
|
val type = if (proto.hasExpirationType()) proto.expirationType else null
|
||||||
val remoteConfig = ExpirationConfiguration(
|
val remoteConfig = ExpirationConfiguration(
|
||||||
@ -102,6 +104,9 @@ fun updateExpirationConfigurationIfNeeded(message: Message, proto: SignalService
|
|||||||
proto.lastDisappearingMessageChangeTimestamp
|
proto.lastDisappearingMessageChangeTimestamp
|
||||||
)
|
)
|
||||||
storage.setExpirationConfiguration(remoteConfig)
|
storage.setExpirationConfiguration(remoteConfig)
|
||||||
|
if (message is ExpirationTimerUpdate) {
|
||||||
|
SSKEnvironment.shared.messageExpirationManager.setExpirationTimer(message)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// region Control Messages
|
// region Control Messages
|
||||||
@ -158,13 +163,25 @@ fun MessageReceiver.cancelTypingIndicatorsIfNeeded(senderPublicKey: String) {
|
|||||||
|
|
||||||
private fun MessageReceiver.handleExpirationTimerUpdate(message: ExpirationTimerUpdate) {
|
private fun MessageReceiver.handleExpirationTimerUpdate(message: ExpirationTimerUpdate) {
|
||||||
if (ExpirationConfiguration.isNewConfigEnabled) return
|
if (ExpirationConfiguration.isNewConfigEnabled) return
|
||||||
val recipient = Recipient.from(MessagingModuleConfiguration.shared.context, Address.fromSerialized(message.sender!!), false)
|
val module = MessagingModuleConfiguration.shared
|
||||||
|
val recipient = Recipient.from(module.context, Address.fromSerialized(message.sender!!), false)
|
||||||
val type = when {
|
val type = when {
|
||||||
recipient.isContactRecipient -> ExpirationType.DELETE_AFTER_READ
|
recipient.isContactRecipient -> ExpirationType.DELETE_AFTER_READ
|
||||||
recipient.isGroupRecipient -> ExpirationType.DELETE_AFTER_SEND
|
recipient.isGroupRecipient -> ExpirationType.DELETE_AFTER_SEND
|
||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
SSKEnvironment.shared.messageExpirationManager.setExpirationTimer(message, type?.number)
|
try {
|
||||||
|
var threadId: Long = module.storage.getOrCreateThreadIdFor(fromSerialized(message.sender!!))
|
||||||
|
if (message.groupPublicKey != null) {
|
||||||
|
threadId = module.storage.getOrCreateThreadIdFor(fromSerialized(doubleEncodeGroupID(message.groupPublicKey!!)))
|
||||||
|
}
|
||||||
|
module.storage.setExpirationConfiguration(
|
||||||
|
ExpirationConfiguration(threadId, message.duration!!, type?.number ?: -1, System.currentTimeMillis())
|
||||||
|
)
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Log.e("Loki", "Failed to update expiration configuration.")
|
||||||
|
}
|
||||||
|
SSKEnvironment.shared.messageExpirationManager.setExpirationTimer(message)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun MessageReceiver.handleDataExtractionNotification(message: DataExtractionNotification) {
|
private fun MessageReceiver.handleDataExtractionNotification(message: DataExtractionNotification) {
|
||||||
|
@ -36,7 +36,7 @@ class SSKEnvironment(
|
|||||||
}
|
}
|
||||||
|
|
||||||
interface MessageExpirationManagerProtocol {
|
interface MessageExpirationManagerProtocol {
|
||||||
fun setExpirationTimer(message: ExpirationTimerUpdate, expirationType: Int?)
|
fun setExpirationTimer(message: ExpirationTimerUpdate)
|
||||||
fun startAnyExpiration(timestamp: Long, author: String)
|
fun startAnyExpiration(timestamp: Long, author: String)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user