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 GroupInfoV1
extends GroupInfo
{
26 private static final ObjectMapper jsonProcessor
= new ObjectMapper();
32 @JsonDeserialize(using
= MembersDeserializer
.class)
33 @JsonSerialize(using
= MembersSerializer
.class)
34 public Set
<SignalServiceAddress
> members
= new HashSet
<>();
37 @JsonProperty(defaultValue
= "0")
38 public int messageExpirationTime
;
39 @JsonProperty(defaultValue
= "false")
40 public boolean blocked
;
42 public Integer inboxPosition
;
43 @JsonProperty(defaultValue
= "false")
44 public boolean archived
;
46 public GroupInfoV1(byte[] groupId
) {
51 public String
getTitle() {
56 @JsonProperty("groupId") byte[] groupId
,
57 @JsonProperty("name") String name
,
58 @JsonProperty("members") Collection
<SignalServiceAddress
> members
,
59 @JsonProperty("avatarId") long _ignored_avatarId
,
60 @JsonProperty("color") String color
,
61 @JsonProperty("blocked") boolean blocked
,
62 @JsonProperty("inboxPosition") Integer inboxPosition
,
63 @JsonProperty("archived") boolean archived
,
64 @JsonProperty("messageExpirationTime") int messageExpirationTime
,
65 @JsonProperty("active") boolean _ignored_active
69 this.members
.addAll(members
);
71 this.blocked
= blocked
;
72 this.inboxPosition
= inboxPosition
;
73 this.archived
= archived
;
74 this.messageExpirationTime
= messageExpirationTime
;
78 public Set
<SignalServiceAddress
> getMembers() {
83 public boolean isBlocked() {
88 public void setBlocked(final boolean blocked
) {
89 this.blocked
= blocked
;
93 public int getMessageExpirationTime() {
94 return messageExpirationTime
;
97 public void addMembers(Collection
<SignalServiceAddress
> addresses
) {
98 for (SignalServiceAddress address
: addresses
) {
99 if (this.members
.contains(address
)) {
102 removeMember(address
);
103 this.members
.add(address
);
107 public void removeMember(SignalServiceAddress address
) {
108 this.members
.removeIf(member
-> member
.matches(address
));
111 private static final class JsonSignalServiceAddress
{
117 private String number
;
119 JsonSignalServiceAddress(@JsonProperty("uuid") final UUID uuid
, @JsonProperty("number") final String number
) {
121 this.number
= number
;
124 JsonSignalServiceAddress(SignalServiceAddress address
) {
125 this.uuid
= address
.getUuid().orNull();
126 this.number
= address
.getNumber().orNull();
129 SignalServiceAddress
toSignalServiceAddress() {
130 return new SignalServiceAddress(uuid
, number
);
134 private static class MembersSerializer
extends JsonSerializer
<Set
<SignalServiceAddress
>> {
137 public void serialize(
138 final Set
<SignalServiceAddress
> value
, final JsonGenerator jgen
, final SerializerProvider provider
139 ) throws IOException
{
140 jgen
.writeStartArray(value
.size());
141 for (SignalServiceAddress address
: value
) {
142 if (address
.getUuid().isPresent()) {
143 jgen
.writeObject(new JsonSignalServiceAddress(address
));
145 jgen
.writeString(address
.getNumber().get());
148 jgen
.writeEndArray();
152 private static class MembersDeserializer
extends JsonDeserializer
<Set
<SignalServiceAddress
>> {
155 public Set
<SignalServiceAddress
> deserialize(
156 JsonParser jsonParser
, DeserializationContext deserializationContext
157 ) throws IOException
{
158 Set
<SignalServiceAddress
> addresses
= new HashSet
<>();
159 JsonNode node
= jsonParser
.getCodec().readTree(jsonParser
);
160 for (JsonNode n
: node
) {
162 addresses
.add(new SignalServiceAddress(null, n
.textValue()));
164 JsonSignalServiceAddress address
= jsonProcessor
.treeToValue(n
, JsonSignalServiceAddress
.class);
165 addresses
.add(address
.toSignalServiceAddress());