1 package org
.asamk
.signal
.storage
.groups
;
3 import com
.fasterxml
.jackson
.annotation
.JsonIgnore
;
4 import com
.fasterxml
.jackson
.annotation
.JsonProperty
;
5 import com
.fasterxml
.jackson
.core
.JsonGenerator
;
6 import com
.fasterxml
.jackson
.core
.JsonParser
;
7 import com
.fasterxml
.jackson
.databind
.DeserializationContext
;
8 import com
.fasterxml
.jackson
.databind
.JsonDeserializer
;
9 import com
.fasterxml
.jackson
.databind
.JsonNode
;
10 import com
.fasterxml
.jackson
.databind
.JsonSerializer
;
11 import com
.fasterxml
.jackson
.databind
.ObjectMapper
;
12 import com
.fasterxml
.jackson
.databind
.SerializerProvider
;
13 import com
.fasterxml
.jackson
.databind
.annotation
.JsonDeserialize
;
14 import com
.fasterxml
.jackson
.databind
.annotation
.JsonSerialize
;
16 import org
.whispersystems
.signalservice
.api
.push
.SignalServiceAddress
;
18 import java
.io
.IOException
;
19 import java
.util
.Collection
;
20 import java
.util
.HashSet
;
22 import java
.util
.UUID
;
24 public class GroupInfo
{
26 private static final ObjectMapper jsonProcessor
= new ObjectMapper();
29 public final byte[] groupId
;
35 @JsonDeserialize(using
= MembersDeserializer
.class)
36 @JsonSerialize(using
= MembersSerializer
.class)
37 public Set
<SignalServiceAddress
> members
= new HashSet
<>();
40 @JsonProperty(defaultValue
= "0")
41 public int messageExpirationTime
;
42 @JsonProperty(defaultValue
= "false")
43 public boolean blocked
;
45 public Integer inboxPosition
;
46 @JsonProperty(defaultValue
= "false")
47 public boolean archived
;
49 private long avatarId
;
53 private boolean active
;
55 public GroupInfo(byte[] groupId
) {
56 this.groupId
= groupId
;
59 public GroupInfo(@JsonProperty("groupId") byte[] groupId
, @JsonProperty("name") String name
, @JsonProperty("members") Collection
<SignalServiceAddress
> members
, @JsonProperty("avatarId") long avatarId
, @JsonProperty("color") String color
, @JsonProperty("blocked") boolean blocked
, @JsonProperty("inboxPosition") Integer inboxPosition
, @JsonProperty("archived") boolean archived
, @JsonProperty("messageExpirationTime") int messageExpirationTime
) {
60 this.groupId
= groupId
;
62 this.members
.addAll(members
);
63 this.avatarId
= avatarId
;
65 this.blocked
= blocked
;
66 this.inboxPosition
= inboxPosition
;
67 this.archived
= archived
;
68 this.messageExpirationTime
= messageExpirationTime
;
72 public long getAvatarId() {
77 public Set
<SignalServiceAddress
> getMembers() {
82 public Set
<String
> getMembersE164() {
83 Set
<String
> membersE164
= new HashSet
<>();
84 for (SignalServiceAddress member
: members
) {
85 if (!member
.getNumber().isPresent()) {
88 membersE164
.add(member
.getNumber().get());
94 public Set
<SignalServiceAddress
> getMembersWithout(SignalServiceAddress address
) {
95 Set
<SignalServiceAddress
> members
= new HashSet
<>(this.members
.size());
96 for (SignalServiceAddress member
: this.members
) {
97 if (!member
.matches(address
)) {
104 public void addMembers(Collection
<SignalServiceAddress
> addresses
) {
105 for (SignalServiceAddress address
: addresses
) {
106 removeMember(address
);
107 this.members
.add(address
);
111 public void removeMember(SignalServiceAddress address
) {
112 this.members
.removeIf(member
-> member
.matches(address
));
116 public boolean isMember(SignalServiceAddress address
) {
117 for (SignalServiceAddress member
: this.members
) {
118 if (member
.matches(address
)) {
125 private static final class JsonSignalServiceAddress
{
131 private String number
;
133 JsonSignalServiceAddress(@JsonProperty("uuid") final UUID uuid
, @JsonProperty("number") final String number
) {
135 this.number
= number
;
138 JsonSignalServiceAddress(SignalServiceAddress address
) {
139 this.uuid
= address
.getUuid().orNull();
140 this.number
= address
.getNumber().orNull();
143 SignalServiceAddress
toSignalServiceAddress() {
144 return new SignalServiceAddress(uuid
, number
);
148 private static class MembersSerializer
extends JsonSerializer
<Set
<SignalServiceAddress
>> {
151 public void serialize(final Set
<SignalServiceAddress
> value
, final JsonGenerator jgen
, final SerializerProvider provider
) throws IOException
{
152 jgen
.writeStartArray(value
.size());
153 for (SignalServiceAddress address
: value
) {
154 if (address
.getUuid().isPresent()) {
155 jgen
.writeObject(new JsonSignalServiceAddress(address
));
157 jgen
.writeString(address
.getNumber().get());
160 jgen
.writeEndArray();
164 private static class MembersDeserializer
extends JsonDeserializer
<Set
<SignalServiceAddress
>> {
167 public Set
<SignalServiceAddress
> deserialize(JsonParser jsonParser
, DeserializationContext deserializationContext
) throws IOException
{
168 Set
<SignalServiceAddress
> addresses
= new HashSet
<>();
169 JsonNode node
= jsonParser
.getCodec().readTree(jsonParser
);
170 for (JsonNode n
: node
) {
172 addresses
.add(new SignalServiceAddress(null, n
.textValue()));
174 JsonSignalServiceAddress address
= jsonProcessor
.treeToValue(n
, JsonSignalServiceAddress
.class);
175 addresses
.add(address
.toSignalServiceAddress());