Support member labels in backups.

This commit is contained in:
jeffrey-signal
2026-02-11 18:06:18 -05:00
committed by Michelle Tang
parent 28d8d62cbd
commit 59bb505a3e
17 changed files with 24 additions and 6 deletions

View File

@@ -17,11 +17,13 @@ import kotlin.random.Random
* Helper methods for creating groups for message processing tests et al. * Helper methods for creating groups for message processing tests et al.
*/ */
object GroupTestingUtils { object GroupTestingUtils {
fun member(aci: ACI, revision: Int = 0, role: Member.Role = Member.Role.ADMINISTRATOR): DecryptedMember { fun member(aci: ACI, revision: Int = 0, role: Member.Role = Member.Role.ADMINISTRATOR, labelEmoji: String = "", labelString: String = ""): DecryptedMember {
return DecryptedMember.Builder() return DecryptedMember.Builder()
.aciBytes(aci.toByteString()) .aciBytes(aci.toByteString())
.joinedAtRevision(revision) .joinedAtRevision(revision)
.role(role) .role(role)
.labelEmoji(labelEmoji)
.labelString(labelString)
.build() .build()
} }

View File

@@ -123,7 +123,13 @@ private fun Member.Role.toRemote(): Group.Member.Role {
} }
private fun DecryptedMember.toRemote(): Group.Member { private fun DecryptedMember.toRemote(): Group.Member {
return Group.Member(userId = aciBytes, role = role.toRemote(), joinedAtVersion = joinedAtRevision) return Group.Member(
userId = aciBytes,
role = role.toRemote(),
joinedAtVersion = joinedAtRevision,
labelEmoji = labelEmoji,
labelString = labelString
)
} }
private fun DecryptedPendingMember.toRemote(): Group.MemberPendingProfileKey { private fun DecryptedPendingMember.toRemote(): Group.MemberPendingProfileKey {

View File

@@ -116,7 +116,13 @@ private fun Group.Member.Role.toLocal(): Member.Role {
} }
private fun Group.Member.toLocal(): DecryptedMember { private fun Group.Member.toLocal(): DecryptedMember {
return DecryptedMember(aciBytes = userId, role = role.toLocal(), joinedAtRevision = joinedAtVersion) return DecryptedMember(
aciBytes = userId,
role = role.toLocal(),
joinedAtRevision = joinedAtVersion,
labelEmoji = labelEmoji,
labelString = labelString
)
} }
private fun Group.MemberPendingAdminApproval.toLocal(): DecryptedRequestingMember { private fun Group.MemberPendingAdminApproval.toLocal(): DecryptedRequestingMember {

View File

@@ -331,6 +331,8 @@ message Group {
reserved /*profileKey*/ 3; // This field is ignored in Backups, in favor of Contact frames for members reserved /*profileKey*/ 3; // This field is ignored in Backups, in favor of Contact frames for members
reserved /*presentation*/ 4; // This field is deprecated in the context of static group state reserved /*presentation*/ 4; // This field is deprecated in the context of static group state
uint32 joinedAtVersion = 5; uint32 joinedAtVersion = 5;
string labelEmoji = 6;
string labelString = 7;
} }
message MemberPendingProfileKey { message MemberPendingProfileKey {

View File

@@ -42,15 +42,17 @@ fun DecryptedGroupChange.Builder.addMember(aci: ACI) {
newMembers += member(aci) newMembers += member(aci)
} }
fun member(serviceId: UUID, role: Member.Role = Member.Role.DEFAULT, joinedAt: Int = 0): DecryptedMember { fun member(serviceId: UUID, role: Member.Role = Member.Role.DEFAULT, joinedAt: Int = 0, labelEmoji: String = "", labelString: String = ""): DecryptedMember {
return member(ACI.from(serviceId), role, joinedAt) return member(ACI.from(serviceId), role, joinedAt, labelEmoji, labelString)
} }
fun member(aci: ACI, role: Member.Role = Member.Role.DEFAULT, joinedAt: Int = 0): DecryptedMember { fun member(aci: ACI, role: Member.Role = Member.Role.DEFAULT, joinedAt: Int = 0, labelEmoji: String = "", labelString: String = ""): DecryptedMember {
return DecryptedMember.Builder() return DecryptedMember.Builder()
.role(role) .role(role)
.aciBytes(aci.toByteString()) .aciBytes(aci.toByteString())
.joinedAtRevision(joinedAt) .joinedAtRevision(joinedAt)
.labelEmoji(labelEmoji)
.labelString(labelString)
.build() .build()
} }