Added missing joined_at for groups (#829)

* Added missing "joinedAt" field for groups

* Renamed
pull/1706/head
SessionHero01 5 months ago committed by GitHub
parent eaa9cc9e50
commit a21d283ae4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -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

@ -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)
}

@ -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());

@ -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)

@ -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 {

@ -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<jstring>(env->GetObjectField(info, id_field));
jstring name = static_cast<jstring>(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, "<init>","(Lorg/session/libsignal/utilities/AccountId;[B[BJZLjava/lang/String;Z)V");
jmethodID constructor = env->GetMethodID(group_info_class, "<init>","(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();
}

@ -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
}

Loading…
Cancel
Save