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 27e4c6ae27..8ca792d29a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/configs/ConfigToDatabaseSync.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/configs/ConfigToDatabaseSync.kt @@ -351,7 +351,7 @@ class ConfigToDatabaseSync @Inject constructor( val members = group.members.keys.map { fromSerialized(it) } val admins = group.members.filter { it.value /*admin = true*/ }.keys.map { fromSerialized(it) } val title = group.name - val formationTimestamp = (group.joinedAt * 1000L) + val formationTimestamp = (group.joinedAtSecs * 1000L) storage.createGroup(groupId, title, admins + members, null, null, admins, formationTimestamp) storage.setProfileSharing(fromSerialized(groupId), true) // Add the group to the user's set of public keys to poll for 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 947f75166e..16956ae1ad 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt @@ -861,7 +861,7 @@ open class Storage @Inject constructor( encPubKey = (encryptionKeyPair.publicKey as DjbECPublicKey).publicKey, // 'serialize()' inserts an extra byte encSecKey = encryptionKeyPair.privateKey.serialize(), disappearingTimer = expirationTimer.toLong(), - joinedAt = (formationTimestamp / 1000L) + joinedAtSecs = (formationTimestamp / 1000L) ) // shouldn't exist, don't use getOrConstruct + copy userGroups.set(groupInfo) @@ -894,7 +894,7 @@ open class Storage @Inject constructor( encSecKey = latestKeyPair.privateKey.serialize(), priority = if (isPinned(threadID)) PRIORITY_PINNED else PRIORITY_VISIBLE, disappearingTimer = getExpirationConfiguration(threadID)?.expiryMode?.expirySeconds ?: 0L, - joinedAt = (existingGroup.formationTimestamp / 1000L) + joinedAtSecs = (existingGroup.formationTimestamp / 1000L) ) userGroups.set(groupInfo) } 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 3659bad438..4721dbfe1f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java @@ -156,7 +156,6 @@ public class ThreadDatabase extends Database { private long createThreadForRecipient(Address address, boolean group, int distributionType) { ContentValues contentValues = new ContentValues(4); - long date = SnodeAPI.getNowWithOffset(); contentValues.put(ADDRESS, address.serialize()); 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 3018868ef8..06138793af 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/dependencies/ConfigFactory.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/dependencies/ConfigFactory.kt @@ -534,7 +534,7 @@ private fun MutableUserGroupsConfig.initFrom(storage: StorageProtocol) { encPubKey = (encryptionKeyPair.publicKey as DjbECPublicKey).publicKey, // 'serialize()' inserts an extra byte encSecKey = encryptionKeyPair.privateKey.serialize(), disappearingTimer = recipient.expireMessages.toLong(), - joinedAt = (group.formationTimestamp / 1000L) + joinedAtSecs = (group.formationTimestamp / 1000L) ) } .forEach(this::set) 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 c48181a3ee..d0b00f458b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2Impl.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2Impl.kt @@ -61,6 +61,7 @@ import org.thoughtcrime.securesms.database.MmsSmsDatabase import org.thoughtcrime.securesms.database.ThreadDatabase import org.thoughtcrime.securesms.dependencies.ConfigFactory import org.thoughtcrime.securesms.dependencies.PollerFactory +import java.util.concurrent.TimeUnit import javax.inject.Inject import javax.inject.Singleton @@ -108,7 +109,7 @@ class GroupManagerV2Impl @Inject constructor( // Create a group in the user groups config val group = configFactory.withMutableUserConfigs { configs -> configs.userGroups.createGroup() - .copy(name = groupName) + .copy(name = groupName, joinedAtSecs = TimeUnit.MILLISECONDS.toSeconds(groupCreationTimestamp)) .also(configs.userGroups::set) } @@ -608,7 +609,10 @@ class GroupManagerV2Impl @Inject constructor( // Clear the invited flag of the group in the config configFactory.withMutableUserConfigs { configs -> - configs.userGroups.set(group.copy(invited = false)) + configs.userGroups.set(group.copy( + invited = false, + joinedAtSecs = TimeUnit.MILLISECONDS.toSeconds(clock.currentTimeMills()) + )) } val poller = checkNotNull(pollerFactory.pollerFor(group.groupAccountId)) { "Unable to start a poller for groups " } @@ -759,6 +763,7 @@ class GroupManagerV2Impl @Inject constructor( invited = !shouldAutoApprove, name = groupName, destroyed = false, + joinedAtSecs = 0L ) configFactory.withMutableUserConfigs { diff --git a/libsession-util/src/main/cpp/user_groups.h b/libsession-util/src/main/cpp/user_groups.h index 6255a8d04b..f14fc5da11 100644 --- a/libsession-util/src/main/cpp/user_groups.h +++ b/libsession-util/src/main/cpp/user_groups.h @@ -51,7 +51,7 @@ inline session::config::legacy_group_info deserialize_legacy_group_info(JNIEnv * auto enc_sec_key_field = env->GetFieldID(clazz, "encSecKey", "[B"); auto priority_field = env->GetFieldID(clazz, "priority", "J"); auto disappearing_timer_field = env->GetFieldID(clazz, "disappearingTimer", "J"); - auto joined_at_field = env->GetFieldID(clazz, "joinedAt", "J"); + auto joined_at_field = env->GetFieldID(clazz, "joinedAtSecs", "J"); auto id = static_cast(env->GetObjectField(info, id_field)); jstring name = static_cast(env->GetObjectField(info, name_field)); jobject members_map = env->GetObjectField(info, members_field); @@ -133,9 +133,9 @@ inline jobject serialize_closed_group_info(JNIEnv* env, session::config::group_i jstring name = util::jstringFromOptional(env, info.name); jclass group_info_class = env->FindClass("network/loki/messenger/libsession_util/util/GroupInfo$ClosedGroupInfo"); - jmethodID constructor = env->GetMethodID(group_info_class, "","(Lorg/session/libsignal/utilities/AccountId;[B[BJZLjava/lang/String;Z)V"); + jmethodID constructor = env->GetMethodID(group_info_class, "","(Lorg/session/libsignal/utilities/AccountId;[B[BJZLjava/lang/String;ZJ)V"); jobject return_object = env->NewObject(group_info_class,constructor, - session_id, admin_bytes, auth_bytes, (jlong)info.priority, info.invited, name, info.is_destroyed()); + session_id, admin_bytes, auth_bytes, (jlong)info.priority, info.invited, name, info.is_destroyed(), info.joined_at); return return_object; } @@ -148,6 +148,7 @@ inline session::config::group_info deserialize_closed_group_info(JNIEnv* env, jo jfieldID invited_field = env->GetFieldID(closed_group_class, "invited", "Z"); jfieldID name_field = env->GetFieldID(closed_group_class, "name", "Ljava/lang/String;"); jfieldID destroy_field = env->GetFieldID(closed_group_class, "destroyed", "Z"); + jfieldID joined_at_field = env->GetFieldID(closed_group_class, "joinedAtSecs", "J"); jobject id_jobject = env->GetObjectField(info_serialized, id_field); @@ -166,6 +167,7 @@ inline session::config::group_info deserialize_closed_group_info(JNIEnv* env, jo group_info.priority = env->GetLongField(info_serialized, priority_field); group_info.invited = env->GetBooleanField(info_serialized, invited_field); group_info.name = name; + group_info.joined_at = env->GetLongField(info_serialized, joined_at_field); if (env->GetBooleanField(info_serialized, destroy_field)) { group_info.mark_destroyed(); } diff --git a/libsession-util/src/main/java/network/loki/messenger/libsession_util/util/GroupInfo.kt b/libsession-util/src/main/java/network/loki/messenger/libsession_util/util/GroupInfo.kt index dde8e1cf9c..110b5207c6 100644 --- a/libsession-util/src/main/java/network/loki/messenger/libsession_util/util/GroupInfo.kt +++ b/libsession-util/src/main/java/network/loki/messenger/libsession_util/util/GroupInfo.kt @@ -14,6 +14,7 @@ sealed class GroupInfo { val invited: Boolean, val name: String, val destroyed: Boolean, + val joinedAtSecs: Long ): GroupInfo() { init { @@ -42,7 +43,7 @@ sealed class GroupInfo { val encSecKey: ByteArray, val priority: Long, val disappearingTimer: Long, - val joinedAt: Long + val joinedAtSecs: Long ): GroupInfo() { companion object { @Suppress("FunctionName") @@ -62,7 +63,7 @@ sealed class GroupInfo { if (!encSecKey.contentEquals(other.encSecKey)) return false if (priority != other.priority) return false if (disappearingTimer != other.disappearingTimer) return false - if (joinedAt != other.joinedAt) return false + if (joinedAtSecs != other.joinedAtSecs) return false return true } @@ -75,7 +76,7 @@ sealed class GroupInfo { result = 31 * result + encSecKey.contentHashCode() result = 31 * result + priority.hashCode() result = 31 * result + disappearingTimer.hashCode() - result = 31 * result + joinedAt.hashCode() + result = 31 * result + joinedAtSecs.hashCode() return result }