]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/storage/groups/GroupInfoV1.java
Reformat project
[signal-cli] / src / main / java / org / asamk / signal / storage / groups / GroupInfoV1.java
1 package org.asamk.signal.storage.groups;
2
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;
15
16 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
17
18 import java.io.IOException;
19 import java.util.Collection;
20 import java.util.HashSet;
21 import java.util.Set;
22 import java.util.UUID;
23
24 public class GroupInfoV1 extends GroupInfo {
25
26 private static final ObjectMapper jsonProcessor = new ObjectMapper();
27
28 @JsonProperty
29 public String name;
30
31 @JsonProperty
32 @JsonDeserialize(using = MembersDeserializer.class)
33 @JsonSerialize(using = MembersSerializer.class)
34 public Set<SignalServiceAddress> members = new HashSet<>();
35 @JsonProperty
36 public String color;
37 @JsonProperty(defaultValue = "0")
38 public int messageExpirationTime;
39 @JsonProperty(defaultValue = "false")
40 public boolean blocked;
41 @JsonProperty
42 public Integer inboxPosition;
43 @JsonProperty(defaultValue = "false")
44 public boolean archived;
45
46 public GroupInfoV1(byte[] groupId) {
47 super(groupId);
48 }
49
50 @Override
51 public String getTitle() {
52 return name;
53 }
54
55 public GroupInfoV1(
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
66 ) {
67 super(groupId);
68 this.name = name;
69 this.members.addAll(members);
70 this.color = color;
71 this.blocked = blocked;
72 this.inboxPosition = inboxPosition;
73 this.archived = archived;
74 this.messageExpirationTime = messageExpirationTime;
75 }
76
77 @JsonIgnore
78 public Set<SignalServiceAddress> getMembers() {
79 return members;
80 }
81
82 @Override
83 public boolean isBlocked() {
84 return blocked;
85 }
86
87 @Override
88 public void setBlocked(final boolean blocked) {
89 this.blocked = blocked;
90 }
91
92 @Override
93 public int getMessageExpirationTime() {
94 return messageExpirationTime;
95 }
96
97 public void addMembers(Collection<SignalServiceAddress> addresses) {
98 for (SignalServiceAddress address : addresses) {
99 if (this.members.contains(address)) {
100 continue;
101 }
102 removeMember(address);
103 this.members.add(address);
104 }
105 }
106
107 public void removeMember(SignalServiceAddress address) {
108 this.members.removeIf(member -> member.matches(address));
109 }
110
111 private static final class JsonSignalServiceAddress {
112
113 @JsonProperty
114 private UUID uuid;
115
116 @JsonProperty
117 private String number;
118
119 JsonSignalServiceAddress(@JsonProperty("uuid") final UUID uuid, @JsonProperty("number") final String number) {
120 this.uuid = uuid;
121 this.number = number;
122 }
123
124 JsonSignalServiceAddress(SignalServiceAddress address) {
125 this.uuid = address.getUuid().orNull();
126 this.number = address.getNumber().orNull();
127 }
128
129 SignalServiceAddress toSignalServiceAddress() {
130 return new SignalServiceAddress(uuid, number);
131 }
132 }
133
134 private static class MembersSerializer extends JsonSerializer<Set<SignalServiceAddress>> {
135
136 @Override
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));
144 } else {
145 jgen.writeString(address.getNumber().get());
146 }
147 }
148 jgen.writeEndArray();
149 }
150 }
151
152 private static class MembersDeserializer extends JsonDeserializer<Set<SignalServiceAddress>> {
153
154 @Override
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) {
161 if (n.isTextual()) {
162 addresses.add(new SignalServiceAddress(null, n.textValue()));
163 } else {
164 JsonSignalServiceAddress address = jsonProcessor.treeToValue(n, JsonSignalServiceAddress.class);
165 addresses.add(address.toSignalServiceAddress());
166 }
167 }
168
169 return addresses;
170 }
171 }
172 }