diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java
index de34abb650..340506ac30 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java
@@ -308,6 +308,13 @@ public class GroupDatabase extends Database implements LokiOpenGroupDatabaseProt
databaseHelper.getWritableDatabase().update(TABLE_NAME, contents, GROUP_ID + " = ?", new String[] {groupId});
}
+ public void updateFormationTimestamp(String groupId, Long formationTimestamp) {
+ ContentValues contents = new ContentValues();
+ contents.put(TIMESTAMP, formationTimestamp);
+
+ databaseHelper.getWritableDatabase().update(TABLE_NAME, contents, GROUP_ID + " = ?", new String[] {groupId});
+ }
+
public void removeMember(String groupId, Address source) {
List
currentMembers = getCurrentMembers(groupId, false);
currentMembers.remove(source);
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 66b4fd5004..22f1f46041 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt
@@ -428,6 +428,10 @@ class Storage(context: Context, helper: SQLCipherOpenHelper) : Database(context,
DatabaseFactory.getLokiAPIDatabase(context).removeAllClosedGroupEncryptionKeyPairs(groupPublicKey)
}
+ override fun updateFormationTimestamp(groupID: String, formationTimestamp: Long) {
+ DatabaseFactory.getGroupDatabase(context).updateFormationTimestamp(groupID, formationTimestamp)
+ }
+
override fun getAllV2OpenGroups(): Map {
return DatabaseFactory.getLokiThreadDatabase(context).getAllV2OpenGroups()
}
diff --git a/libsession/src/main/java/org/session/libsession/database/StorageProtocol.kt b/libsession/src/main/java/org/session/libsession/database/StorageProtocol.kt
index 9d42a2a2f8..20371c0715 100644
--- a/libsession/src/main/java/org/session/libsession/database/StorageProtocol.kt
+++ b/libsession/src/main/java/org/session/libsession/database/StorageProtocol.kt
@@ -115,6 +115,7 @@ interface StorageProtocol {
fun isClosedGroup(publicKey: String): Boolean
fun getClosedGroupEncryptionKeyPairs(groupPublicKey: String): MutableList
fun getLatestClosedGroupEncryptionKeyPair(groupPublicKey: String): ECKeyPair?
+ fun updateFormationTimestamp(groupID: String, formationTimestamp: Long)
// Groups
fun getAllGroups(): List
diff --git a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt
index 653492138e..58e0641331 100644
--- a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt
+++ b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt
@@ -262,27 +262,22 @@ private fun MessageReceiver.handleNewClosedGroup(message: ClosedGroupControlMess
private fun handleNewClosedGroup(sender: String, sentTimestamp: Long, groupPublicKey: String, name: String, encryptionKeyPair: ECKeyPair, members: List, admins: List, formationTimestamp: Long) {
val context = MessagingModuleConfiguration.shared.context
val storage = MessagingModuleConfiguration.shared.storage
+ val userPublicKey = TextSecurePreferences.getLocalNumber(context)
// Create the group
val groupID = GroupUtil.doubleEncodeGroupID(groupPublicKey)
if (storage.getGroup(groupID) != null) {
// Update the group
- // Clear zombie list if the group wasn't active
if (!storage.isGroupActive(groupPublicKey)) {
+ // Clear zombie list if the group wasn't active
storage.setZombieMembers(groupID, listOf())
+ // Update the formation timestamp
+ storage.updateFormationTimestamp(groupID, formationTimestamp)
}
storage.updateTitle(groupID, name)
storage.updateMembers(groupID, members.map { Address.fromSerialized(it) })
} else {
storage.createGroup(groupID, name, LinkedList(members.map { Address.fromSerialized(it) }),
null, null, LinkedList(admins.map { Address.fromSerialized(it) }), formationTimestamp)
- val userPublicKey = TextSecurePreferences.getLocalNumber(context)
- // Notify the user
- if (userPublicKey == sender) {
- val threadID = storage.getOrCreateThreadIdFor(Address.fromSerialized(groupID))
- storage.insertOutgoingInfoMessage(context, groupID, SignalServiceGroup.Type.CREATION, name, members, admins, threadID, sentTimestamp)
- } else {
- storage.insertIncomingInfoMessage(context, sender, groupID, SignalServiceGroup.Type.CREATION, name, members, admins, sentTimestamp)
- }
}
storage.setProfileSharing(Address.fromSerialized(groupID), true)
// Add the group to the user's set of public keys to poll for
@@ -291,6 +286,13 @@ private fun handleNewClosedGroup(sender: String, sentTimestamp: Long, groupPubli
storage.addClosedGroupEncryptionKeyPair(encryptionKeyPair, groupPublicKey)
// Notify the PN server
PushNotificationAPI.performOperation(PushNotificationAPI.ClosedGroupOperation.Subscribe, groupPublicKey, storage.getUserPublicKey()!!)
+ // Notify the user
+ if (userPublicKey == sender) {
+ val threadID = storage.getOrCreateThreadIdFor(Address.fromSerialized(groupID))
+ storage.insertOutgoingInfoMessage(context, groupID, SignalServiceGroup.Type.CREATION, name, members, admins, threadID, sentTimestamp)
+ } else {
+ storage.insertIncomingInfoMessage(context, sender, groupID, SignalServiceGroup.Type.CREATION, name, members, admins, sentTimestamp)
+ }
// Start polling
ClosedGroupPollerV2.shared.startPolling(groupPublicKey)
}