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() {
55 public GroupInfoV1(@JsonProperty("groupId") byte[] groupId
, @JsonProperty("name") String name
, @JsonProperty("members") Collection
<SignalServiceAddress
> members
, @JsonProperty("avatarId") long _ignored_avatarId
, @JsonProperty("color") String color
, @JsonProperty("blocked") boolean blocked
, @JsonProperty("inboxPosition") Integer inboxPosition
, @JsonProperty("archived") boolean archived
, @JsonProperty("messageExpirationTime") int messageExpirationTime
, @JsonProperty("active") boolean _ignored_active
) {
58 this.members
.addAll(members
);
60 this.blocked
= blocked
;
61 this.inboxPosition
= inboxPosition
;
62 this.archived
= archived
;
63 this.messageExpirationTime
= messageExpirationTime
;
67 public Set
<SignalServiceAddress
> getMembers() {
72 public boolean isBlocked() {
77 public void setBlocked(final boolean blocked
) {
78 this.blocked
= blocked
;
82 public int getMessageExpirationTime() {
83 return messageExpirationTime
;
86 public void addMembers(Collection
<SignalServiceAddress
> addresses
) {
87 for (SignalServiceAddress address
: addresses
) {
88 if (this.members
.contains(address
)) {
91 removeMember(address
);
92 this.members
.add(address
);
96 public void removeMember(SignalServiceAddress address
) {
97 this.members
.removeIf(member
-> member
.matches(address
));
100 private static final class JsonSignalServiceAddress
{
106 private String number
;
108 JsonSignalServiceAddress(@JsonProperty("uuid") final UUID uuid
, @JsonProperty("number") final String number
) {
110 this.number
= number
;
113 JsonSignalServiceAddress(SignalServiceAddress address
) {
114 this.uuid
= address
.getUuid().orNull();
115 this.number
= address
.getNumber().orNull();
118 SignalServiceAddress
toSignalServiceAddress() {
119 return new SignalServiceAddress(uuid
, number
);
123 private static class MembersSerializer
extends JsonSerializer
<Set
<SignalServiceAddress
>> {
126 public void serialize(final Set
<SignalServiceAddress
> value
, final JsonGenerator jgen
, final SerializerProvider provider
) throws IOException
{
127 jgen
.writeStartArray(value
.size());
128 for (SignalServiceAddress address
: value
) {
129 if (address
.getUuid().isPresent()) {
130 jgen
.writeObject(new JsonSignalServiceAddress(address
));
132 jgen
.writeString(address
.getNumber().get());
135 jgen
.writeEndArray();
139 private static class MembersDeserializer
extends JsonDeserializer
<Set
<SignalServiceAddress
>> {
142 public Set
<SignalServiceAddress
> deserialize(JsonParser jsonParser
, DeserializationContext deserializationContext
) throws IOException
{
143 Set
<SignalServiceAddress
> addresses
= new HashSet
<>();
144 JsonNode node
= jsonParser
.getCodec().readTree(jsonParser
);
145 for (JsonNode n
: node
) {
147 addresses
.add(new SignalServiceAddress(null, n
.textValue()));
149 JsonSignalServiceAddress address
= jsonProcessor
.treeToValue(n
, JsonSignalServiceAddress
.class);
150 addresses
.add(address
.toSignalServiceAddress());