diff --git a/app/src/main/java/org/session/libsession/messaging/jobs/InviteContactsJob.kt b/app/src/main/java/org/session/libsession/messaging/jobs/InviteContactsJob.kt index 2dd53a2864..ad7f31f1b7 100644 --- a/app/src/main/java/org/session/libsession/messaging/jobs/InviteContactsJob.kt +++ b/app/src/main/java/org/session/libsession/messaging/jobs/InviteContactsJob.kt @@ -21,10 +21,12 @@ import org.session.libsession.messaging.utilities.MessageAuthentication.buildGro import org.session.libsession.snode.SnodeAPI import org.session.libsession.utilities.ConfigFactoryProtocol import org.session.libsession.utilities.getGroup -import org.session.protos.SessionProtos.GroupUpdateInviteMessage -import org.session.protos.SessionProtos.GroupUpdateMessage +import org.session.libsession.utilities.withGroupConfigs +import org.session.libsession.utilities.withMutableGroupConfigs import org.session.libsignal.utilities.AccountId import org.session.libsignal.utilities.Log +import org.session.protos.SessionProtos.GroupUpdateInviteMessage +import org.session.protos.SessionProtos.GroupUpdateMessage class InviteContactsJob @AssistedInject constructor( @Assisted val groupSessionId: String, diff --git a/app/src/main/java/org/session/libsession/messaging/jobs/MessageSendJob.kt b/app/src/main/java/org/session/libsession/messaging/jobs/MessageSendJob.kt index 1cb9e88bfa..d64c782d02 100644 --- a/app/src/main/java/org/session/libsession/messaging/jobs/MessageSendJob.kt +++ b/app/src/main/java/org/session/libsession/messaging/jobs/MessageSendJob.kt @@ -22,6 +22,7 @@ import org.session.libsession.messaging.sending_receiving.MessageSender import org.session.libsession.messaging.utilities.Data import org.session.libsession.utilities.ConfigFactoryProtocol import org.session.libsession.utilities.ConfigUpdateNotification +import org.session.libsession.utilities.withGroupConfigs import org.session.libsignal.utilities.AccountId import org.session.libsignal.utilities.HTTP import org.session.libsignal.utilities.Log diff --git a/app/src/main/java/org/session/libsession/messaging/messages/Destination.kt b/app/src/main/java/org/session/libsession/messaging/messages/Destination.kt index 5ddbad9fa1..3b6c5f3f86 100644 --- a/app/src/main/java/org/session/libsession/messaging/messages/Destination.kt +++ b/app/src/main/java/org/session/libsession/messaging/messages/Destination.kt @@ -2,6 +2,7 @@ package org.session.libsession.messaging.messages import org.session.libsession.messaging.MessagingModuleConfiguration import org.session.libsession.utilities.Address +import org.session.libsession.utilities.withUserConfigs sealed class Destination { diff --git a/app/src/main/java/org/session/libsession/messaging/messages/ProfileUpdateHandler.kt b/app/src/main/java/org/session/libsession/messaging/messages/ProfileUpdateHandler.kt index 02a31bf1e7..75dc0fab54 100644 --- a/app/src/main/java/org/session/libsession/messaging/messages/ProfileUpdateHandler.kt +++ b/app/src/main/java/org/session/libsession/messaging/messages/ProfileUpdateHandler.kt @@ -12,9 +12,10 @@ import org.session.libsession.utilities.Address import org.session.libsession.utilities.Address.Companion.toAddress import org.session.libsession.utilities.ConfigFactoryProtocol import org.session.libsession.utilities.updateContact -import org.session.protos.SessionProtos +import org.session.libsession.utilities.withMutableUserConfigs import org.session.libsignal.utilities.AccountId import org.session.libsignal.utilities.Log +import org.session.protos.SessionProtos import org.thoughtcrime.securesms.database.BlindMappingRepository import org.thoughtcrime.securesms.database.RecipientRepository import org.thoughtcrime.securesms.database.RecipientSettingsDatabase diff --git a/app/src/main/java/org/session/libsession/messaging/sending_receiving/MessageParser.kt b/app/src/main/java/org/session/libsession/messaging/sending_receiving/MessageParser.kt index 89158d15ab..9526287ec6 100644 --- a/app/src/main/java/org/session/libsession/messaging/sending_receiving/MessageParser.kt +++ b/app/src/main/java/org/session/libsession/messaging/sending_receiving/MessageParser.kt @@ -22,6 +22,8 @@ import org.session.libsession.snode.SnodeClock import org.session.libsession.utilities.Address import org.session.libsession.utilities.ConfigFactoryProtocol import org.session.libsession.utilities.TextSecurePreferences +import org.session.libsession.utilities.withGroupConfigs +import org.session.libsession.utilities.withUserConfigs import org.session.libsignal.exceptions.NonRetryableException import org.session.libsignal.utilities.AccountId import org.session.libsignal.utilities.Base64 diff --git a/app/src/main/java/org/session/libsession/messaging/sending_receiving/MessageRequestResponseHandler.kt b/app/src/main/java/org/session/libsession/messaging/sending_receiving/MessageRequestResponseHandler.kt index 280fba31e4..8a9b97023c 100644 --- a/app/src/main/java/org/session/libsession/messaging/sending_receiving/MessageRequestResponseHandler.kt +++ b/app/src/main/java/org/session/libsession/messaging/sending_receiving/MessageRequestResponseHandler.kt @@ -1,7 +1,6 @@ package org.session.libsession.messaging.sending_receiving import network.loki.messenger.libsession_util.protocol.DecodedPro -import network.loki.messenger.libsession_util.util.BitSet import org.session.libsession.messaging.messages.Message import org.session.libsession.messaging.messages.ProfileUpdateHandler import org.session.libsession.messaging.messages.control.MessageRequestResponse @@ -14,8 +13,10 @@ import org.session.libsession.utilities.ConfigFactoryProtocol import org.session.libsession.utilities.recipients.Recipient import org.session.libsession.utilities.updateContact import org.session.libsession.utilities.upsertContact -import org.session.protos.SessionProtos +import org.session.libsession.utilities.withMutableUserConfigs +import org.session.libsession.utilities.withUserConfigs import org.session.libsignal.utilities.Log +import org.session.protos.SessionProtos import org.thoughtcrime.securesms.database.BlindMappingRepository import org.thoughtcrime.securesms.database.MmsDatabase import org.thoughtcrime.securesms.database.RecipientRepository diff --git a/app/src/main/java/org/session/libsession/messaging/sending_receiving/MessageSender.kt b/app/src/main/java/org/session/libsession/messaging/sending_receiving/MessageSender.kt index c4c453dc57..0635c56eb3 100644 --- a/app/src/main/java/org/session/libsession/messaging/sending_receiving/MessageSender.kt +++ b/app/src/main/java/org/session/libsession/messaging/sending_receiving/MessageSender.kt @@ -33,6 +33,9 @@ import org.session.libsession.snode.SnodeClock import org.session.libsession.snode.SnodeMessage import org.session.libsession.utilities.Address import org.session.libsession.utilities.ConfigFactoryProtocol +import org.session.libsession.utilities.withGroupConfigs +import org.session.libsession.utilities.withMutableUserConfigs +import org.session.libsession.utilities.withUserConfigs import org.session.libsignal.utilities.AccountId import org.session.libsignal.utilities.Base64 import org.session.libsignal.utilities.Hex diff --git a/app/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageProcessor.kt b/app/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageProcessor.kt index bae87cf23b..03a37c4fc1 100644 --- a/app/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageProcessor.kt +++ b/app/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageProcessor.kt @@ -40,6 +40,7 @@ import org.session.libsession.utilities.UserConfigType import org.session.libsession.utilities.recipients.MessageType import org.session.libsession.utilities.recipients.Recipient import org.session.libsession.utilities.recipients.getType +import org.session.libsession.utilities.withUserConfigs import org.session.libsignal.utilities.AccountId import org.session.libsignal.utilities.Log import org.session.protos.SessionProtos diff --git a/app/src/main/java/org/session/libsession/messaging/sending_receiving/VisibleMessageHandler.kt b/app/src/main/java/org/session/libsession/messaging/sending_receiving/VisibleMessageHandler.kt index ef5bd90cfe..3fbb54ac21 100644 --- a/app/src/main/java/org/session/libsession/messaging/sending_receiving/VisibleMessageHandler.kt +++ b/app/src/main/java/org/session/libsession/messaging/sending_receiving/VisibleMessageHandler.kt @@ -27,9 +27,11 @@ import org.session.libsession.utilities.isGroupOrCommunity import org.session.libsession.utilities.recipients.RecipientData import org.session.libsession.utilities.updateContact import org.session.libsession.utilities.upsertContact -import org.session.protos.SessionProtos +import org.session.libsession.utilities.withMutableUserConfigs +import org.session.libsession.utilities.withUserConfigs import org.session.libsignal.utilities.Log import org.session.libsignal.utilities.guava.Optional +import org.session.protos.SessionProtos import org.thoughtcrime.securesms.database.Storage import org.thoughtcrime.securesms.database.model.MessageId import org.thoughtcrime.securesms.dependencies.ConfigFactory diff --git a/app/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/OpenGroupPoller.kt b/app/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/OpenGroupPoller.kt index e83caa4d04..27cda56e68 100644 --- a/app/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/OpenGroupPoller.kt +++ b/app/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/OpenGroupPoller.kt @@ -20,7 +20,6 @@ import org.session.libsession.database.StorageProtocol import org.session.libsession.messaging.jobs.JobQueue import org.session.libsession.messaging.jobs.OpenGroupDeleteJob import org.session.libsession.messaging.jobs.TrimThreadJob -import org.session.libsession.messaging.messages.Message.Companion.senderOrSync import org.session.libsession.messaging.open_groups.Endpoint import org.session.libsession.messaging.open_groups.OpenGroupApi import org.session.libsession.messaging.open_groups.OpenGroupApi.BatchRequest @@ -33,9 +32,8 @@ import org.session.libsession.messaging.open_groups.OpenGroupApi.parallelBatch import org.session.libsession.messaging.sending_receiving.MessageParser import org.session.libsession.messaging.sending_receiving.ReceivedMessageProcessor import org.session.libsession.utilities.Address -import org.session.libsession.utilities.Address.Companion.toAddress import org.session.libsession.utilities.ConfigFactoryProtocol -import org.session.libsignal.utilities.Base64 +import org.session.libsession.utilities.withUserConfigs import org.session.libsignal.utilities.HTTP.Verb.GET import org.session.libsignal.utilities.JsonUtil import org.session.libsignal.utilities.Log diff --git a/app/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/OpenGroupPollerManager.kt b/app/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/OpenGroupPollerManager.kt index 2e431400ff..99b24fe59f 100644 --- a/app/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/OpenGroupPollerManager.kt +++ b/app/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/OpenGroupPollerManager.kt @@ -17,6 +17,7 @@ import kotlinx.coroutines.sync.Semaphore import org.session.libsession.utilities.ConfigFactoryProtocol import org.session.libsession.utilities.UserConfigType import org.session.libsession.utilities.userConfigsChanged +import org.session.libsession.utilities.withUserConfigs import org.session.libsignal.utilities.Log import org.thoughtcrime.securesms.auth.LoginStateRepository import org.thoughtcrime.securesms.dependencies.ManagerScope diff --git a/app/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/Poller.kt b/app/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/Poller.kt index 27454527ed..b6c7a7573d 100644 --- a/app/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/Poller.kt +++ b/app/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/Poller.kt @@ -40,6 +40,7 @@ import org.session.libsession.utilities.ConfigFactoryProtocol import org.session.libsession.utilities.ConfigMessage import org.session.libsession.utilities.TextSecurePreferences import org.session.libsession.utilities.UserConfigType +import org.session.libsession.utilities.withUserConfigs import org.session.libsignal.database.LokiAPIDatabaseProtocol import org.session.libsignal.utilities.Log import org.session.libsignal.utilities.Snode diff --git a/app/src/main/java/org/session/libsession/utilities/ConfigFactoryProtocol.kt b/app/src/main/java/org/session/libsession/utilities/ConfigFactoryProtocol.kt index 37545d464b..3a58174cee 100644 --- a/app/src/main/java/org/session/libsession/utilities/ConfigFactoryProtocol.kt +++ b/app/src/main/java/org/session/libsession/utilities/ConfigFactoryProtocol.kt @@ -34,11 +34,56 @@ import java.time.Instant interface ConfigFactoryProtocol { val configUpdateNotifications: Flow - fun withUserConfigs(cb: (UserConfigs) -> T): T - fun withMutableUserConfigs(cb: (MutableUserConfigs) -> T): T - fun mergeUserConfigs(userConfigType: UserConfigType, messages: List) + /** + * Dangerously access the user configs. You must call the returned release function + * to release the lock after you are done with the configs. + * + * **Warning:** Improper use of this function may lead to deadlocks or data corruption. + * It's better to use [withUserConfigs] instead. + * + * @return A pair of the user configs and a release function. + */ + fun dangerouslyAccessUserConfigs(): Pair Unit> + + /** + * Dangerously access the mutable user configs. You must call the returned release function + * to release the lock after you are done with the configs. The release function must be called + * as soon as possible and must be called in the same thread as this function. + * + * **Warning:** Improper use of this function may lead to deadlocks or data corruption. + * It's better to use [withMutableUserConfigs] instead. + * + * @return A pair of the mutable user configs and a release function. + */ + fun dangerouslyAccessMutableUserConfigs(): Pair Unit> + + /** + * Dangerously access the group configs for the given group ID. You must call the returned + * release function to release the lock after you are done with the configs. The release + * function must be called as soon as possible and must be called in the same thread as + * this function. + * + * **Warning:** Improper use of this function may lead to deadlocks or data corruption. + * It's better to use [withGroupConfigs] instead. + * + * @return A pair of the group configs and a release function. + */ + fun dangerouslyAccessGroupConfigs(groupId: AccountId): Pair Unit> + + /** + * Dangerously access the mutable group configs for the given group ID. You must call the + * returned release function to release the lock after you are done with the configs. The + * release function must be called as soon as possible and must be called in the same thread + * as this function. + * + * **Warning:** Improper use of this function may lead to deadlocks or data corruption. + * It's better to use [withMutableGroupConfigs] instead. + * + * @return A pair of the mutable group configs and a release function. + */ + fun dangerouslyAccessMutableGroupConfigs(groupId: AccountId): Pair Unit> - fun withGroupConfigs(groupId: AccountId, cb: (GroupConfigs) -> T): T + fun mergeUserConfigs(userConfigType: UserConfigType, messages: List) /** * Create a new group config instance. Note this does not save the group configs to the database. @@ -54,11 +99,6 @@ interface ConfigFactoryProtocol { */ fun saveGroupConfigs(groupId: AccountId, groupConfigs: MutableGroupConfigs) - /** - * @param recreateConfigInstances If true, the group configs will be recreated before calling the callback. This is useful when you have received an admin key or otherwise. - */ - fun withMutableGroupConfigs(groupId: AccountId, cb: (MutableGroupConfigs) -> T): T - fun canPerformChange(variant: String, publicKey: String, changeTimestampMs: Long): Boolean fun getConfigTimestamp(userConfigType: UserConfigType, publicKey: String): Long @@ -114,6 +154,42 @@ enum class UserConfigType(val namespace: Int) { USER_GROUPS(Namespace.USER_GROUPS()), } +inline fun ConfigFactoryProtocol.withUserConfigs(cb: (UserConfigs) -> T): T { + val (configs, release) = dangerouslyAccessUserConfigs() + return try { + cb(configs) + } finally { + release() + } +} + +inline fun ConfigFactoryProtocol.withMutableUserConfigs(cb: (MutableUserConfigs) -> T): T { + val (configs, release) = dangerouslyAccessMutableUserConfigs() + return try { + cb(configs) + } finally { + release() + } +} + +inline fun ConfigFactoryProtocol.withGroupConfigs(groupId: AccountId, cb: (GroupConfigs) -> T): T { + val (configs, release) = dangerouslyAccessGroupConfigs(groupId) + return try { + cb(configs) + } finally { + release() + } +} + +inline fun ConfigFactoryProtocol.withMutableGroupConfigs(groupId: AccountId, cb: (MutableGroupConfigs) -> T): T { + val (configs, release) = dangerouslyAccessMutableGroupConfigs(groupId) + return try { + cb(configs) + } finally { + release() + } +} + val ConfigFactoryProtocol.currentUserName: String get() = withUserConfigs { it.userProfile.getName().orEmpty() } val ConfigFactoryProtocol.currentUserProfile: UserPic? get() = withUserConfigs { configs -> configs.userProfile.getPic().takeIf { it.url.isNotBlank() } diff --git a/app/src/main/java/org/thoughtcrime/securesms/attachments/AvatarDownloadManager.kt b/app/src/main/java/org/thoughtcrime/securesms/attachments/AvatarDownloadManager.kt index ac2bffe579..a84babfa93 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/attachments/AvatarDownloadManager.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/attachments/AvatarDownloadManager.kt @@ -17,6 +17,8 @@ import org.session.libsession.utilities.Address.Companion.toAddress import org.session.libsession.utilities.ConfigFactoryProtocol import org.session.libsession.utilities.TextSecurePreferences import org.session.libsession.utilities.recipients.RemoteFile +import org.session.libsession.utilities.withGroupConfigs +import org.session.libsession.utilities.withUserConfigs import org.session.libsignal.exceptions.NonRetryableException import org.session.libsignal.utilities.AccountId import org.session.libsignal.utilities.ByteArraySlice diff --git a/app/src/main/java/org/thoughtcrime/securesms/attachments/AvatarReuploadWorker.kt b/app/src/main/java/org/thoughtcrime/securesms/attachments/AvatarReuploadWorker.kt index 0c1aca9c25..5eb2b07ddb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/attachments/AvatarReuploadWorker.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/attachments/AvatarReuploadWorker.kt @@ -26,6 +26,7 @@ import org.session.libsession.snode.OnionRequestAPI import org.session.libsession.utilities.ConfigFactoryProtocol import org.session.libsession.utilities.TextSecurePreferences import org.session.libsession.utilities.recipients.RemoteFile.Companion.toRemoteFile +import org.session.libsession.utilities.withUserConfigs import org.session.libsignal.exceptions.NonRetryableException import org.session.libsignal.utilities.Log import org.thoughtcrime.securesms.debugmenu.DebugLogGroup diff --git a/app/src/main/java/org/thoughtcrime/securesms/attachments/AvatarUploadManager.kt b/app/src/main/java/org/thoughtcrime/securesms/attachments/AvatarUploadManager.kt index b0cb1f5063..4bd0c512da 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/attachments/AvatarUploadManager.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/attachments/AvatarUploadManager.kt @@ -15,6 +15,7 @@ import org.session.libsession.utilities.TextSecurePreferences import org.session.libsession.utilities.Util import org.session.libsession.utilities.recipients.RemoteFile import org.session.libsession.utilities.recipients.RemoteFile.Companion.toRemoteFile +import org.session.libsession.utilities.withMutableUserConfigs import org.session.libsignal.utilities.Log import org.thoughtcrime.securesms.auth.AuthAwareComponent import org.thoughtcrime.securesms.auth.LoggedInState diff --git a/app/src/main/java/org/thoughtcrime/securesms/configs/ConfigToDatabaseSync.kt b/app/src/main/java/org/thoughtcrime/securesms/configs/ConfigToDatabaseSync.kt index 4abe47990e..4a023de195 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/configs/ConfigToDatabaseSync.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/configs/ConfigToDatabaseSync.kt @@ -26,11 +26,13 @@ import org.session.libsession.utilities.Address import org.session.libsession.utilities.Address.Companion.fromSerialized import org.session.libsession.utilities.Address.Companion.toAddress import org.session.libsession.utilities.ConfigFactoryProtocol -import org.session.libsession.utilities.TextSecurePreferences import org.session.libsession.utilities.UserConfigType import org.session.libsession.utilities.allConfigAddresses import org.session.libsession.utilities.getGroup import org.session.libsession.utilities.userConfigsChanged +import org.session.libsession.utilities.withGroupConfigs +import org.session.libsession.utilities.withMutableUserConfigs +import org.session.libsession.utilities.withUserConfigs import org.session.libsignal.crypto.ecc.DjbECPrivateKey import org.session.libsignal.crypto.ecc.DjbECPublicKey import org.session.libsignal.crypto.ecc.ECKeyPair @@ -38,7 +40,6 @@ import org.session.libsignal.utilities.AccountId import org.session.libsignal.utilities.Log import org.thoughtcrime.securesms.auth.AuthAwareComponent import org.thoughtcrime.securesms.auth.LoggedInState -import org.thoughtcrime.securesms.auth.LoginStateRepository import org.thoughtcrime.securesms.database.CommunityDatabase import org.thoughtcrime.securesms.database.DraftDatabase import org.thoughtcrime.securesms.database.GroupDatabase @@ -53,7 +54,6 @@ import org.thoughtcrime.securesms.database.SmsDatabase import org.thoughtcrime.securesms.database.ThreadDatabase import org.thoughtcrime.securesms.database.model.MmsMessageRecord import org.thoughtcrime.securesms.dependencies.ManagerScope -import org.thoughtcrime.securesms.dependencies.OnAppStartupComponent import org.thoughtcrime.securesms.repository.ConversationRepository import org.thoughtcrime.securesms.util.SessionMetaProtocol import org.thoughtcrime.securesms.util.castAwayType diff --git a/app/src/main/java/org/thoughtcrime/securesms/configs/ConfigUploader.kt b/app/src/main/java/org/thoughtcrime/securesms/configs/ConfigUploader.kt index 20892a7aa8..7543dac353 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/configs/ConfigUploader.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/configs/ConfigUploader.kt @@ -35,6 +35,9 @@ import org.session.libsession.utilities.MutableGroupConfigs import org.session.libsession.utilities.UserConfigType import org.session.libsession.utilities.getGroup import org.session.libsession.utilities.userConfigsChanged +import org.session.libsession.utilities.withMutableGroupConfigs +import org.session.libsession.utilities.withMutableUserConfigs +import org.session.libsession.utilities.withUserConfigs import org.session.libsignal.utilities.AccountId import org.session.libsignal.utilities.Base64 import org.session.libsignal.utilities.Log 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 863d7dcc73..95b2350001 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 @@ -114,6 +114,7 @@ import org.session.libsession.utilities.getColorFromAttr import org.session.libsession.utilities.isBlinded import org.session.libsession.utilities.recipients.Recipient import org.session.libsession.utilities.recipients.displayName +import org.session.libsession.utilities.withUserConfigs import org.session.libsignal.crypto.MnemonicCodec import org.session.libsignal.utilities.ListenableFuture import org.session.libsignal.utilities.Log 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 f44375d22c..56c479b56f 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 @@ -77,6 +77,8 @@ import org.session.libsession.utilities.recipients.repeatedWithEffectiveNotifyTy import org.session.libsession.utilities.toGroupString import org.session.libsession.utilities.upsertContact import org.session.libsession.utilities.userConfigsChanged +import org.session.libsession.utilities.withMutableUserConfigs +import org.session.libsession.utilities.withUserConfigs import org.session.libsignal.utilities.AccountId import org.session.libsignal.utilities.Hex import org.session.libsignal.utilities.IdPrefix diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/settings/ConversationSettingsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/settings/ConversationSettingsViewModel.kt index fe762498b8..441ba5763e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/settings/ConversationSettingsViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/settings/ConversationSettingsViewModel.kt @@ -46,6 +46,8 @@ import org.session.libsession.utilities.recipients.RecipientData import org.session.libsession.utilities.recipients.displayName import org.session.libsession.utilities.updateContact import org.session.libsession.utilities.upsertContact +import org.session.libsession.utilities.withMutableUserConfigs +import org.session.libsession.utilities.withUserConfigs import org.session.libsignal.utilities.AccountId import org.session.libsignal.utilities.Log import org.thoughtcrime.securesms.conversation.v2.ConversationActivityV2 diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/BlindMappingRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/database/BlindMappingRepository.kt index 75c7f53cf3..eca80d52bd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/BlindMappingRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/BlindMappingRepository.kt @@ -11,9 +11,9 @@ import kotlinx.coroutines.flow.stateIn import network.loki.messenger.libsession_util.util.BaseCommunityInfo import network.loki.messenger.libsession_util.util.BlindKeyAPI import org.session.libsession.utilities.Address -import org.session.libsession.utilities.TextSecurePreferences import org.session.libsession.utilities.UserConfigType import org.session.libsession.utilities.userConfigsChanged +import org.session.libsession.utilities.withUserConfigs import org.session.libsignal.utilities.AccountId import org.session.libsignal.utilities.Log import org.thoughtcrime.securesms.auth.LoginStateRepository diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientRepository.kt index 2cd4c8c8d9..755389882c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientRepository.kt @@ -48,6 +48,8 @@ import org.session.libsession.utilities.recipients.RemoteFile.Companion.toRemote import org.session.libsession.utilities.toBlinded import org.session.libsession.utilities.toGroupString import org.session.libsession.utilities.userConfigsChanged +import org.session.libsession.utilities.withGroupConfigs +import org.session.libsession.utilities.withUserConfigs import org.session.libsignal.utilities.AccountId import org.session.libsignal.utilities.Log import org.thoughtcrime.securesms.auth.LoginStateRepository 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 a52279598e..21425bdcfa 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt @@ -57,6 +57,10 @@ import org.session.libsession.utilities.isCommunityInbox import org.session.libsession.utilities.recipients.Recipient import org.session.libsession.utilities.recipients.RecipientData import org.session.libsession.utilities.upsertContact +import org.session.libsession.utilities.withGroupConfigs +import org.session.libsession.utilities.withMutableGroupConfigs +import org.session.libsession.utilities.withMutableUserConfigs +import org.session.libsession.utilities.withUserConfigs import org.session.libsignal.crypto.ecc.DjbECPublicKey import org.session.libsignal.crypto.ecc.ECKeyPair import org.session.libsignal.messages.SignalServiceAttachmentPointer diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java index 068ab51fbc..5d8bd51a14 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java @@ -868,7 +868,7 @@ public ThreadRecord getCurrent() { } final boolean isUnread = address instanceof Address.Conversable && - configFactory.get().withUserConfigs(configs -> + ConfigFactoryProtocolKt.withUserConfigs(configFactory.get(), configs -> SharedConfigUtilsKt.getConversationUnread( configs.getConvoInfoVolatile(), (Address.Conversable) address)); diff --git a/app/src/main/java/org/thoughtcrime/securesms/debugmenu/DebugMenuViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/debugmenu/DebugMenuViewModel.kt index 88f57881db..89e56ecce6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/debugmenu/DebugMenuViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/debugmenu/DebugMenuViewModel.kt @@ -28,7 +28,6 @@ import network.loki.messenger.libsession_util.PRIORITY_HIDDEN import network.loki.messenger.libsession_util.PRIORITY_VISIBLE import network.loki.messenger.libsession_util.protocol.ProFeature import network.loki.messenger.libsession_util.util.BlindKeyAPI -import network.loki.messenger.libsession_util.util.toBitSet import org.session.libsession.database.StorageProtocol import org.session.libsession.messaging.file_server.FileServer import org.session.libsession.messaging.file_server.FileServerApi @@ -39,6 +38,8 @@ import org.session.libsession.utilities.Address import org.session.libsession.utilities.Environment import org.session.libsession.utilities.TextSecurePreferences import org.session.libsession.utilities.upsertContact +import org.session.libsession.utilities.withMutableUserConfigs +import org.session.libsession.utilities.withUserConfigs import org.session.libsignal.utilities.AccountId import org.session.libsignal.utilities.IdPrefix import org.session.libsignal.utilities.Log diff --git a/app/src/main/java/org/thoughtcrime/securesms/dependencies/ConfigFactory.kt b/app/src/main/java/org/thoughtcrime/securesms/dependencies/ConfigFactory.kt index 9bf4e762ca..3b05669f7d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/dependencies/ConfigFactory.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/dependencies/ConfigFactory.kt @@ -1,5 +1,6 @@ package org.thoughtcrime.securesms.dependencies +import androidx.collection.arraySetOf import dagger.Lazy import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.MutableSharedFlow @@ -29,6 +30,8 @@ import org.session.libsession.utilities.MutableUserConfigs import org.session.libsession.utilities.UserConfigType import org.session.libsession.utilities.UserConfigs import org.session.libsession.utilities.getGroup +import org.session.libsession.utilities.withGroupConfigs +import org.session.libsession.utilities.withMutableUserConfigs import org.session.libsignal.utilities.AccountId import org.thoughtcrime.securesms.auth.LoginStateRepository import org.thoughtcrime.securesms.configs.ConfigToDatabaseSync @@ -38,7 +41,6 @@ import java.util.EnumSet import java.util.concurrent.locks.ReentrantReadWriteLock import javax.inject.Inject import javax.inject.Singleton -import kotlin.concurrent.read import kotlin.concurrent.write @@ -134,13 +136,86 @@ class ConfigFactory @Inject constructor( } } - override fun withUserConfigs(cb: (UserConfigs) -> T): T { + override fun dangerouslyAccessMutableUserConfigs(): Pair Unit> { val (lock, configs) = ensureUserConfigsInitialized() - return lock.read { - cb(configs) + lock.writeLock().lock() + return configs to { + val changed = arraySetOf() + + for (type in UserConfigType.entries) { + val config = configs.getConfig(type) + if (config.dirty()) { + changed.add(type) + } + + if (config.needsDump()) { + configDatabase.storeConfig( + variant = type.configVariant, + publicKey = requiresCurrentUserAccountId().hexString, + data = config.dump(), + timestamp = clock.currentTimeMills() + ) + } + } + + lock.writeLock().unlock() + + // Notify changes on a coroutine + if (changed.isNotEmpty()) { + coroutineScope.launch { + _configUpdateNotifications.emit( + ConfigUpdateNotification.UserConfigsUpdated(updatedTypes = changed, fromMerge = false) + ) + } + } + } + } + + override fun dangerouslyAccessMutableGroupConfigs(groupId: AccountId): Pair Unit> { + val (lock, configs) = ensureGroupConfigsInitialized(groupId) + lock.writeLock().lock() + return configs to { + val changed = configs.groupInfo.dirty() || + configs.groupMembers.dirty() || + configs.groupKeys.needsDump() || + configs.groupKeys.needsRekey() + + if (configs.groupInfo.needsDump() || configs.groupMembers.needsDump() || + configs.groupKeys.needsDump()) { + configDatabase.storeGroupConfigs( + publicKey = groupId.hexString, + keysConfig = configs.groupKeys.dump(), + infoConfig = configs.groupInfo.dump(), + memberConfig = configs.groupMembers.dump(), + timestamp = clock.currentTimeMills() + ) + } + + lock.writeLock().unlock() + + // Notify changes on a coroutine + if (changed) { + coroutineScope.launch { + _configUpdateNotifications.emit( + ConfigUpdateNotification.GroupConfigsUpdated(groupId, fromMerge = false) + ) + } + } } } + override fun dangerouslyAccessUserConfigs(): Pair Unit> { + val (lock, configs) = ensureUserConfigsInitialized() + lock.readLock().lock() + return configs to lock.readLock()::unlock + } + + override fun dangerouslyAccessGroupConfigs(groupId: AccountId): Pair Unit> { + val (lock, configs) = ensureGroupConfigsInitialized(groupId) + lock.readLock().lock() + return configs to lock.readLock()::unlock + } + /** * Perform an operation on the user configs, and notify listeners if the configs were changed. * @@ -204,29 +279,6 @@ class ConfigFactory @Inject constructor( } } - override fun withMutableUserConfigs(cb: (MutableUserConfigs) -> T): T { - return doWithMutableUserConfigs(fromMerge = false) { - val result = cb(it) - - val changed = buildSet { - if (it.userGroups.dirty()) add(UserConfigType.USER_GROUPS) - if (it.convoInfoVolatile.dirty()) add(UserConfigType.CONVO_INFO_VOLATILE) - if (it.userProfile.dirty()) add(UserConfigType.USER_PROFILE) - if (it.contacts.dirty()) add(UserConfigType.CONTACTS) - } - - result to changed - } - } - - override fun withGroupConfigs(groupId: AccountId, cb: (GroupConfigs) -> T): T { - val (lock, configs) = ensureGroupConfigsInitialized(groupId) - - return lock.read { - cb(configs) - } - } - override fun createGroupConfigs(groupId: AccountId, adminKey: ByteArray): MutableGroupConfigs { return GroupConfigsImpl( userEd25519SecKey = requiresCurrentUserED25519SecKey(), @@ -268,14 +320,6 @@ class ConfigFactory @Inject constructor( return result } - override fun withMutableGroupConfigs( - groupId: AccountId, - cb: (MutableGroupConfigs) -> T - ): T { - return doWithMutableGroupConfigs(groupId = groupId, fromMerge = false) { - cb(it) to it.dumpIfNeeded(clock) - } - } override fun removeContactOrBlindedContact(address: Address.WithAccountId) { withMutableUserConfigs { diff --git a/app/src/main/java/org/thoughtcrime/securesms/glide/RecipientAvatarDownloadManager.kt b/app/src/main/java/org/thoughtcrime/securesms/glide/RecipientAvatarDownloadManager.kt index 85442acb4e..614d194458 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/glide/RecipientAvatarDownloadManager.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/glide/RecipientAvatarDownloadManager.kt @@ -16,6 +16,8 @@ import kotlinx.coroutines.sync.withPermit import network.loki.messenger.libsession_util.util.GroupInfo import org.session.libsession.utilities.recipients.RemoteFile import org.session.libsession.utilities.recipients.RemoteFile.Companion.toRemoteFile +import org.session.libsession.utilities.withGroupConfigs +import org.session.libsession.utilities.withUserConfigs import org.session.libsignal.utilities.AccountId import org.session.libsignal.utilities.Log import org.thoughtcrime.securesms.attachments.AvatarDownloadManager diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/BaseGroupMembersViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/groups/BaseGroupMembersViewModel.kt index fe897f2f63..4a2dbbdc37 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/BaseGroupMembersViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/BaseGroupMembersViewModel.kt @@ -31,12 +31,12 @@ import org.session.libsession.utilities.ConfigFactoryProtocol import org.session.libsession.utilities.ConfigUpdateNotification import org.session.libsession.utilities.GroupDisplayInfo import org.session.libsession.utilities.recipients.displayName +import org.session.libsession.utilities.withGroupConfigs import org.session.libsignal.utilities.AccountId import org.thoughtcrime.securesms.database.RecipientRepository import org.thoughtcrime.securesms.util.AvatarUIData import org.thoughtcrime.securesms.util.AvatarUtils import java.util.EnumSet -import kotlin.coroutines.cancellation.CancellationException abstract class BaseGroupMembersViewModel( groupAddress: Address.Group, diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupLeavingWorker.kt b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupLeavingWorker.kt index 9658312dfc..55a8ada16b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupLeavingWorker.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupLeavingWorker.kt @@ -21,6 +21,8 @@ import org.session.libsession.messaging.utilities.UpdateMessageData import org.session.libsession.utilities.Address import org.session.libsession.utilities.getGroup import org.session.libsession.utilities.waitUntilGroupConfigsPushed +import org.session.libsession.utilities.withGroupConfigs +import org.session.libsession.utilities.withMutableGroupConfigs import org.session.libsignal.exceptions.NonRetryableException import org.session.libsignal.utilities.AccountId import org.session.libsignal.utilities.Log diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2Impl.kt b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2Impl.kt index 03d1ef94c6..38adfdf1eb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2Impl.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2Impl.kt @@ -49,6 +49,10 @@ import org.session.libsession.utilities.getGroup import org.session.libsession.utilities.recipients.Recipient import org.session.libsession.utilities.recipients.RecipientData import org.session.libsession.utilities.waitUntilGroupConfigsPushed +import org.session.libsession.utilities.withGroupConfigs +import org.session.libsession.utilities.withMutableGroupConfigs +import org.session.libsession.utilities.withMutableUserConfigs +import org.session.libsession.utilities.withUserConfigs import org.session.libsignal.utilities.AccountId import org.session.libsignal.utilities.Base64 import org.session.libsignal.utilities.Log @@ -71,7 +75,6 @@ import org.thoughtcrime.securesms.util.SessionMetaProtocol import java.util.concurrent.TimeUnit import javax.inject.Inject import javax.inject.Singleton -import kotlin.collections.map private const val TAG = "GroupManagerV2Impl" diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupPoller.kt b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupPoller.kt index fd8e8f3e5c..f9a08c3468 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupPoller.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupPoller.kt @@ -30,6 +30,7 @@ import org.session.libsession.utilities.Address import org.session.libsession.utilities.ConfigFactoryProtocol import org.session.libsession.utilities.ConfigMessage import org.session.libsession.utilities.getGroup +import org.session.libsession.utilities.withGroupConfigs import org.session.libsignal.database.LokiAPIDatabaseProtocol import org.session.libsignal.exceptions.NonRetryableException import org.session.libsignal.utilities.AccountId diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupPollerManager.kt b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupPollerManager.kt index 001d5e3756..8ea0ef88ea 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupPollerManager.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupPollerManager.kt @@ -25,6 +25,7 @@ import kotlinx.coroutines.supervisorScope import kotlinx.coroutines.sync.Semaphore import org.session.libsession.utilities.UserConfigType import org.session.libsession.utilities.userConfigsChanged +import org.session.libsession.utilities.withUserConfigs import org.session.libsignal.utilities.AccountId import org.session.libsignal.utilities.Log import org.thoughtcrime.securesms.auth.LoginStateRepository diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupRevokedMessageHandler.kt b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupRevokedMessageHandler.kt index 5153ceb531..533db03e29 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupRevokedMessageHandler.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupRevokedMessageHandler.kt @@ -4,6 +4,7 @@ import network.loki.messenger.libsession_util.util.MultiEncrypt import org.session.libsession.database.StorageProtocol import org.session.libsession.messaging.groups.GroupManagerV2 import org.session.libsession.utilities.ConfigFactoryProtocol +import org.session.libsession.utilities.withGroupConfigs import org.session.libsignal.utilities.AccountId import org.session.libsignal.utilities.IdPrefix import org.session.libsignal.utilities.Log diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ManageGroupMembersViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/groups/ManageGroupMembersViewModel.kt index b451c413ad..bb1e17a02e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ManageGroupMembersViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ManageGroupMembersViewModel.kt @@ -11,16 +11,11 @@ import dagger.assisted.AssistedInject import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.async import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine -import kotlinx.coroutines.flow.distinctUntilChanged -import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map -import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch @@ -36,6 +31,7 @@ import org.session.libsession.utilities.StringSubstitutionConstants.COUNT_KEY import org.session.libsession.utilities.StringSubstitutionConstants.GROUP_NAME_KEY import org.session.libsession.utilities.StringSubstitutionConstants.NAME_KEY import org.session.libsession.utilities.StringSubstitutionConstants.OTHER_NAME_KEY +import org.session.libsession.utilities.withGroupConfigs import org.session.libsignal.utilities.AccountId import org.thoughtcrime.securesms.conversation.v2.settings.ConversationSettingsDestination import org.thoughtcrime.securesms.database.RecipientRepository diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/OpenGroupManager.kt b/app/src/main/java/org/thoughtcrime/securesms/groups/OpenGroupManager.kt index 93159ed2ef..8fc317a6c4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/OpenGroupManager.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/OpenGroupManager.kt @@ -7,6 +7,7 @@ import org.session.libsession.messaging.open_groups.OpenGroup import org.session.libsession.messaging.open_groups.OpenGroupApi import org.session.libsession.messaging.sending_receiving.pollers.OpenGroupPollerManager import org.session.libsession.utilities.ConfigFactoryProtocol +import org.session.libsession.utilities.withMutableUserConfigs import org.session.libsignal.utilities.Log import org.thoughtcrime.securesms.database.LokiAPIDatabase import javax.inject.Inject diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/SelectContactsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/groups/SelectContactsViewModel.kt index 49cf31e28d..67db224033 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/SelectContactsViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/SelectContactsViewModel.kt @@ -25,6 +25,7 @@ import kotlinx.coroutines.flow.update import kotlinx.coroutines.withContext import org.session.libsession.utilities.Address import org.session.libsession.utilities.recipients.Recipient +import org.session.libsession.utilities.withUserConfigs import org.thoughtcrime.securesms.database.RecipientRepository import org.thoughtcrime.securesms.dependencies.ConfigFactory import org.thoughtcrime.securesms.home.search.searchName diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/handler/AdminStateSync.kt b/app/src/main/java/org/thoughtcrime/securesms/groups/handler/AdminStateSync.kt index 8722a23487..02a966990b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/handler/AdminStateSync.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/handler/AdminStateSync.kt @@ -5,6 +5,9 @@ import network.loki.messenger.libsession_util.util.GroupMember import org.session.libsession.utilities.ConfigFactoryProtocol import org.session.libsession.utilities.UserConfigType import org.session.libsession.utilities.userConfigsChanged +import org.session.libsession.utilities.withGroupConfigs +import org.session.libsession.utilities.withMutableGroupConfigs +import org.session.libsession.utilities.withUserConfigs import org.session.libsignal.utilities.AccountId import org.thoughtcrime.securesms.auth.AuthAwareComponent import org.thoughtcrime.securesms.auth.LoggedInState diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/handler/CleanupInvitationHandler.kt b/app/src/main/java/org/thoughtcrime/securesms/groups/handler/CleanupInvitationHandler.kt index fe40ee72f2..0fc08444cc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/handler/CleanupInvitationHandler.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/handler/CleanupInvitationHandler.kt @@ -4,6 +4,8 @@ import network.loki.messenger.libsession_util.allWithStatus import network.loki.messenger.libsession_util.util.GroupMember import org.session.libsession.messaging.groups.GroupScope import org.session.libsession.utilities.ConfigFactoryProtocol +import org.session.libsession.utilities.withMutableGroupConfigs +import org.session.libsession.utilities.withUserConfigs import org.session.libsignal.utilities.AccountId import org.thoughtcrime.securesms.auth.AuthAwareComponent import org.thoughtcrime.securesms.auth.LoggedInState diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/handler/DestroyedGroupSync.kt b/app/src/main/java/org/thoughtcrime/securesms/groups/handler/DestroyedGroupSync.kt index e608a6f8ea..c623386ca2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/handler/DestroyedGroupSync.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/handler/DestroyedGroupSync.kt @@ -8,6 +8,8 @@ import org.session.libsession.utilities.Address import org.session.libsession.utilities.ConfigFactoryProtocol import org.session.libsession.utilities.ConfigUpdateNotification import org.session.libsession.utilities.waitUntilGroupConfigsPushed +import org.session.libsession.utilities.withGroupConfigs +import org.session.libsession.utilities.withMutableUserConfigs import org.session.libsignal.utilities.Log import org.thoughtcrime.securesms.auth.AuthAwareComponent import org.thoughtcrime.securesms.auth.LoggedInState diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/handler/RemoveGroupMemberHandler.kt b/app/src/main/java/org/thoughtcrime/securesms/groups/handler/RemoveGroupMemberHandler.kt index 7e598e3229..c8bade5f28 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/handler/RemoveGroupMemberHandler.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/handler/RemoveGroupMemberHandler.kt @@ -30,6 +30,8 @@ import org.session.libsession.utilities.ConfigFactoryProtocol import org.session.libsession.utilities.ConfigUpdateNotification import org.session.libsession.utilities.getGroup import org.session.libsession.utilities.waitUntilGroupConfigsPushed +import org.session.libsession.utilities.withGroupConfigs +import org.session.libsession.utilities.withMutableGroupConfigs import org.session.libsignal.utilities.AccountId import org.session.libsignal.utilities.Base64 import org.session.libsignal.utilities.Log diff --git a/app/src/main/java/org/thoughtcrime/securesms/home/ConversationOptionsBottomSheet.kt b/app/src/main/java/org/thoughtcrime/securesms/home/ConversationOptionsBottomSheet.kt index 64ba334ad7..14cd15f89e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/home/ConversationOptionsBottomSheet.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/home/ConversationOptionsBottomSheet.kt @@ -14,8 +14,8 @@ import network.loki.messenger.databinding.FragmentConversationBottomSheetBinding import org.session.libsession.messaging.groups.LegacyGroupDeprecationManager import org.session.libsession.utilities.Address import org.session.libsession.utilities.GroupRecord -import org.session.libsession.utilities.TextSecurePreferences import org.session.libsession.utilities.recipients.Recipient +import org.session.libsession.utilities.withUserConfigs import org.session.libsignal.utilities.AccountId import org.thoughtcrime.securesms.auth.LoginStateRepository import org.thoughtcrime.securesms.database.GroupDatabase diff --git a/app/src/main/java/org/thoughtcrime/securesms/home/HomeActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/home/HomeActivity.kt index eb5c55a74b..798385cfa7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/home/HomeActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/home/HomeActivity.kt @@ -14,7 +14,6 @@ import androidx.compose.animation.Crossfade import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.offset -import androidx.compose.foundation.layout.padding import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.remember @@ -58,6 +57,7 @@ import org.session.libsession.utilities.TextSecurePreferences import org.session.libsession.utilities.recipients.RecipientData import org.session.libsession.utilities.recipients.displayName import org.session.libsession.utilities.updateContact +import org.session.libsession.utilities.withMutableUserConfigs import org.session.libsignal.utilities.Log import org.thoughtcrime.securesms.ScreenLockActionBarActivity import org.thoughtcrime.securesms.auth.LoginStateRepository diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/PushRegistrationHandler.kt b/app/src/main/java/org/thoughtcrime/securesms/notifications/PushRegistrationHandler.kt index 992ecf8534..7fb8fb2d9d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/PushRegistrationHandler.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/PushRegistrationHandler.kt @@ -15,6 +15,7 @@ import org.session.libsession.messaging.notifications.TokenFetcher import org.session.libsession.utilities.TextSecurePreferences import org.session.libsession.utilities.UserConfigType import org.session.libsession.utilities.userConfigsChanged +import org.session.libsession.utilities.withUserConfigs import org.session.libsignal.utilities.Log import org.thoughtcrime.securesms.auth.AuthAwareComponent import org.thoughtcrime.securesms.auth.LoggedInState diff --git a/app/src/main/java/org/thoughtcrime/securesms/onboarding/loading/LoadingViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/onboarding/loading/LoadingViewModel.kt index cc373aaf1c..82cb14bb32 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/onboarding/loading/LoadingViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/onboarding/loading/LoadingViewModel.kt @@ -25,6 +25,7 @@ import org.session.libsession.utilities.ConfigFactoryProtocol import org.session.libsession.utilities.TextSecurePreferences import org.session.libsession.utilities.UserConfigType import org.session.libsession.utilities.userConfigsChanged +import org.session.libsession.utilities.withUserConfigs import org.session.libsignal.utilities.Log import org.thoughtcrime.securesms.auth.LoginStateRepository import org.thoughtcrime.securesms.util.castAwayType diff --git a/app/src/main/java/org/thoughtcrime/securesms/onboarding/manager/CreateAccountManager.kt b/app/src/main/java/org/thoughtcrime/securesms/onboarding/manager/CreateAccountManager.kt index 67b75450f1..107c7f0bc2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/onboarding/manager/CreateAccountManager.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/onboarding/manager/CreateAccountManager.kt @@ -4,6 +4,7 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import network.loki.messenger.libsession_util.PRIORITY_HIDDEN import org.session.libsession.utilities.ConfigFactoryProtocol +import org.session.libsession.utilities.withMutableUserConfigs import org.session.libsignal.database.LokiAPIDatabaseProtocol import org.session.libsignal.utilities.Log import org.thoughtcrime.securesms.auth.LoggedInState diff --git a/app/src/main/java/org/thoughtcrime/securesms/onboarding/pickname/PickDisplayNameViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/onboarding/pickname/PickDisplayNameViewModel.kt index 2d8274f511..52f62f2b24 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/onboarding/pickname/PickDisplayNameViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/onboarding/pickname/PickDisplayNameViewModel.kt @@ -18,6 +18,7 @@ import network.loki.messenger.R import org.session.libsession.messaging.messages.ProfileUpdateHandler import org.session.libsession.utilities.ConfigFactoryProtocol import org.session.libsession.utilities.TextSecurePreferences +import org.session.libsession.utilities.withMutableUserConfigs @HiltViewModel(assistedFactory = PickDisplayNameViewModel.Factory::class) class PickDisplayNameViewModel @AssistedInject constructor( diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/PrivacySettingsPreferenceFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/preferences/PrivacySettingsPreferenceFragment.kt index 37cd8c84a7..9b29e081f2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/preferences/PrivacySettingsPreferenceFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/preferences/PrivacySettingsPreferenceFragment.kt @@ -12,22 +12,21 @@ import androidx.preference.PreferenceDataStore import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.delay import kotlinx.coroutines.launch -import javax.inject.Inject import network.loki.messenger.BuildConfig import network.loki.messenger.R import org.session.libsession.utilities.TextSecurePreferences import org.session.libsession.utilities.TextSecurePreferences.Companion.isPasswordDisabled import org.session.libsession.utilities.TextSecurePreferences.Companion.setScreenLockEnabled +import org.session.libsession.utilities.withMutableUserConfigs import org.thoughtcrime.securesms.components.SwitchPreferenceCompat import org.thoughtcrime.securesms.dependencies.ConfigFactory import org.thoughtcrime.securesms.permissions.Permissions import org.thoughtcrime.securesms.service.KeyCachingService import org.thoughtcrime.securesms.showSessionDialog import org.thoughtcrime.securesms.sskenvironment.TypingStatusRepository -import org.thoughtcrime.securesms.webrtc.CallNotificationBuilder.Companion.areNotificationsEnabled import org.thoughtcrime.securesms.util.IntentUtils -import java.time.Instant -import java.time.ZonedDateTime +import org.thoughtcrime.securesms.webrtc.CallNotificationBuilder.Companion.areNotificationsEnabled +import javax.inject.Inject @AndroidEntryPoint class PrivacySettingsPreferenceFragment : CorrectedPreferenceFragment() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/SettingsScreen.kt b/app/src/main/java/org/thoughtcrime/securesms/preferences/SettingsScreen.kt index 599a2c8014..5d29d66d54 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/preferences/SettingsScreen.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/preferences/SettingsScreen.kt @@ -472,6 +472,7 @@ fun Settings( DialogButtonData( text = GetString(stringResource(id = R.string.save)), enabled = uiState.usernameDialog.setEnabled, + dismissOnClick = false, onClick = { sendCommand(SetUsername) }, qaTag = stringResource(R.string.qa_settings_dialog_username_save), ), diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/SettingsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/preferences/SettingsViewModel.kt index df8d1eff35..6aded95720 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/preferences/SettingsViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/preferences/SettingsViewModel.kt @@ -4,7 +4,6 @@ import android.content.Context import android.net.Uri import android.provider.OpenableColumns import android.widget.Toast -import androidx.core.net.toUri import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.canhub.cropper.CropImage @@ -42,6 +41,8 @@ import org.session.libsession.utilities.StringSubstitutionConstants.VERSION_KEY import org.session.libsession.utilities.TextSecurePreferences import org.session.libsession.utilities.recipients.Recipient import org.session.libsession.utilities.recipients.displayName +import org.session.libsession.utilities.withMutableUserConfigs +import org.session.libsession.utilities.withUserConfigs import org.session.libsignal.utilities.ExternalStorageUtil.getImageDir import org.session.libsignal.utilities.Log import org.session.libsignal.utilities.NoExternalStorageException diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/prosettings/ProSettingsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/preferences/prosettings/ProSettingsViewModel.kt index 163b35ce7a..d1711f0c11 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/preferences/prosettings/ProSettingsViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/preferences/prosettings/ProSettingsViewModel.kt @@ -44,6 +44,7 @@ import org.session.libsession.utilities.StringSubstitutionConstants.SELECTED_PLA import org.session.libsession.utilities.StringSubstitutionConstants.SELECTED_PLAN_LENGTH_SINGULAR_KEY import org.session.libsession.utilities.StringSubstitutionConstants.TIME_KEY import org.session.libsession.utilities.TextSecurePreferences +import org.session.libsession.utilities.withMutableUserConfigs import org.session.libsignal.utilities.Log import org.thoughtcrime.securesms.debugmenu.DebugLogGroup import org.thoughtcrime.securesms.preferences.prosettings.ProSettingsViewModel.Commands.ShowOpenUrlDialog diff --git a/app/src/main/java/org/thoughtcrime/securesms/pro/ConfigExt.kt b/app/src/main/java/org/thoughtcrime/securesms/pro/ConfigExt.kt index 85c8432bd0..5369a0b6ba 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/pro/ConfigExt.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/pro/ConfigExt.kt @@ -7,6 +7,7 @@ import network.loki.messenger.libsession_util.pro.ProConfig import org.session.libsession.utilities.ConfigFactoryProtocol import org.session.libsession.utilities.UserConfigType import org.session.libsession.utilities.userConfigsChanged +import org.session.libsession.utilities.withUserConfigs import org.thoughtcrime.securesms.util.castAwayType import java.util.EnumSet diff --git a/app/src/main/java/org/thoughtcrime/securesms/pro/FetchProDetailsWorker.kt b/app/src/main/java/org/thoughtcrime/securesms/pro/FetchProDetailsWorker.kt index 59e17d357b..9817861b3b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/pro/FetchProDetailsWorker.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/pro/FetchProDetailsWorker.kt @@ -20,6 +20,8 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.mapNotNull import org.session.libsession.snode.SnodeClock import org.session.libsession.utilities.ConfigFactoryProtocol +import org.session.libsession.utilities.withMutableUserConfigs +import org.session.libsession.utilities.withUserConfigs import org.session.libsignal.exceptions.NonRetryableException import org.session.libsignal.utilities.Log import org.thoughtcrime.securesms.auth.LoginStateRepository diff --git a/app/src/main/java/org/thoughtcrime/securesms/pro/ProProofGenerationWorker.kt b/app/src/main/java/org/thoughtcrime/securesms/pro/ProProofGenerationWorker.kt index 4617a46315..0c680b2be1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/pro/ProProofGenerationWorker.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/pro/ProProofGenerationWorker.kt @@ -18,6 +18,7 @@ import network.loki.messenger.libsession_util.ED25519 import network.loki.messenger.libsession_util.pro.ProConfig import org.session.libsession.snode.OnionRequestAPI import org.session.libsession.utilities.ConfigFactoryProtocol +import org.session.libsession.utilities.withMutableUserConfigs import org.session.libsignal.exceptions.NonRetryableException import org.session.libsignal.utilities.Log import org.thoughtcrime.securesms.auth.LoginStateRepository diff --git a/app/src/main/java/org/thoughtcrime/securesms/pro/ProStatusManager.kt b/app/src/main/java/org/thoughtcrime/securesms/pro/ProStatusManager.kt index cc5689cd01..d4e9cd84ee 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/pro/ProStatusManager.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/pro/ProStatusManager.kt @@ -47,6 +47,8 @@ import org.session.libsession.utilities.TextSecurePreferences import org.session.libsession.utilities.UserConfigType import org.session.libsession.utilities.recipients.Recipient import org.session.libsession.utilities.userConfigsChanged +import org.session.libsession.utilities.withMutableUserConfigs +import org.session.libsession.utilities.withUserConfigs import org.session.libsignal.utilities.Log import org.session.libsignal.utilities.toHexString import org.thoughtcrime.securesms.auth.AuthAwareComponent diff --git a/app/src/main/java/org/thoughtcrime/securesms/repository/DefaultConversationRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/repository/DefaultConversationRepository.kt index 601dcbcff1..87ee280ef1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/repository/DefaultConversationRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/repository/DefaultConversationRepository.kt @@ -37,6 +37,8 @@ import org.session.libsession.utilities.recipients.Recipient import org.session.libsession.utilities.recipients.RecipientData import org.session.libsession.utilities.upsertContact import org.session.libsession.utilities.userConfigsChanged +import org.session.libsession.utilities.withMutableUserConfigs +import org.session.libsession.utilities.withUserConfigs import org.session.libsignal.utilities.AccountId import org.session.libsignal.utilities.Log import org.thoughtcrime.securesms.auth.LoginStateRepository diff --git a/app/src/main/java/org/thoughtcrime/securesms/search/SearchRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/search/SearchRepository.kt index 3f2ec98b33..a8367be60c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/search/SearchRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/search/SearchRepository.kt @@ -17,6 +17,7 @@ import org.session.libsession.utilities.ConfigFactoryProtocol import org.session.libsession.utilities.recipients.Recipient import org.session.libsession.utilities.recipients.RecipientData import org.session.libsession.utilities.recipients.displayName +import org.session.libsession.utilities.withUserConfigs import org.session.libsignal.utilities.AccountId import org.thoughtcrime.securesms.database.CursorList import org.thoughtcrime.securesms.database.MmsSmsColumns