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
.asamk
.signal
.manager
.GroupInviteLinkUrl
;
17 import org
.whispersystems
.signalservice
.api
.push
.SignalServiceAddress
;
19 import java
.io
.IOException
;
20 import java
.util
.Collection
;
21 import java
.util
.HashSet
;
23 import java
.util
.UUID
;
25 public class GroupInfoV1
extends GroupInfo
{
27 private static final ObjectMapper jsonProcessor
= new ObjectMapper();
30 public byte[] expectedV2Id
;
36 @JsonDeserialize(using
= MembersDeserializer
.class)
37 @JsonSerialize(using
= MembersSerializer
.class)
38 public Set
<SignalServiceAddress
> members
= new HashSet
<>();
41 @JsonProperty(defaultValue
= "0")
42 public int messageExpirationTime
;
43 @JsonProperty(defaultValue
= "false")
44 public boolean blocked
;
46 public Integer inboxPosition
;
47 @JsonProperty(defaultValue
= "false")
48 public boolean archived
;
50 public GroupInfoV1(byte[] groupId
) {
55 public String
getTitle() {
60 public GroupInviteLinkUrl
getGroupInviteLink() {
65 @JsonProperty("groupId") byte[] groupId
,
66 @JsonProperty("expectedV2Id") byte[] expectedV2Id
,
67 @JsonProperty("name") String name
,
68 @JsonProperty("members") Collection
<SignalServiceAddress
> members
,
69 @JsonProperty("avatarId") long _ignored_avatarId
,
70 @JsonProperty("color") String color
,
71 @JsonProperty("blocked") boolean blocked
,
72 @JsonProperty("inboxPosition") Integer inboxPosition
,
73 @JsonProperty("archived") boolean archived
,
74 @JsonProperty("messageExpirationTime") int messageExpirationTime
,
75 @JsonProperty("active") boolean _ignored_active
78 this.expectedV2Id
= expectedV2Id
;
80 this.members
.addAll(members
);
82 this.blocked
= blocked
;
83 this.inboxPosition
= inboxPosition
;
84 this.archived
= archived
;
85 this.messageExpirationTime
= messageExpirationTime
;
89 public Set
<SignalServiceAddress
> getMembers() {
94 public boolean isBlocked() {
99 public void setBlocked(final boolean blocked
) {
100 this.blocked
= blocked
;
104 public int getMessageExpirationTime() {
105 return messageExpirationTime
;
108 public void addMembers(Collection
<SignalServiceAddress
> addresses
) {
109 for (SignalServiceAddress address
: addresses
) {
110 if (this.members
.contains(address
)) {
113 removeMember(address
);
114 this.members
.add(address
);
118 public void removeMember(SignalServiceAddress address
) {
119 this.members
.removeIf(member
-> member
.matches(address
));
122 private static final class JsonSignalServiceAddress
{
128 private String number
;
130 JsonSignalServiceAddress(@JsonProperty("uuid") final UUID uuid
, @JsonProperty("number") final String number
) {
132 this.number
= number
;
135 JsonSignalServiceAddress(SignalServiceAddress address
) {
136 this.uuid
= address
.getUuid().orNull();
137 this.number
= address
.getNumber().orNull();
140 SignalServiceAddress
toSignalServiceAddress() {
141 return new SignalServiceAddress(uuid
, number
);
145 private static class MembersSerializer
extends JsonSerializer
<Set
<SignalServiceAddress
>> {
148 public void serialize(
149 final Set
<SignalServiceAddress
> value
, final JsonGenerator jgen
, final SerializerProvider provider
150 ) throws IOException
{
151 jgen
.writeStartArray(value
.size());
152 for (SignalServiceAddress address
: value
) {
153 if (address
.getUuid().isPresent()) {
154 jgen
.writeObject(new JsonSignalServiceAddress(address
));
156 jgen
.writeString(address
.getNumber().get());
159 jgen
.writeEndArray();
163 private static class MembersDeserializer
extends JsonDeserializer
<Set
<SignalServiceAddress
>> {
166 public Set
<SignalServiceAddress
> deserialize(
167 JsonParser jsonParser
, DeserializationContext deserializationContext
168 ) throws IOException
{
169 Set
<SignalServiceAddress
> addresses
= new HashSet
<>();
170 JsonNode node
= jsonParser
.getCodec().readTree(jsonParser
);
171 for (JsonNode n
: node
) {
173 addresses
.add(new SignalServiceAddress(null, n
.textValue()));
175 JsonSignalServiceAddress address
= jsonProcessor
.treeToValue(n
, JsonSignalServiceAddress
.class);
176 addresses
.add(address
.toSignalServiceAddress());