]> nmode's Git Repositories - signal-cli/blob - lib/src/main/java/org/asamk/signal/manager/storage/recipients/Profile.java
dc3aaf534fb6f0f2fee5dc979a6d380901bf9bb8
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / storage / recipients / Profile.java
1 package org.asamk.signal.manager.storage.recipients;
2
3 import org.whispersystems.signalservice.internal.util.Util;
4
5 import java.util.Collections;
6 import java.util.Objects;
7 import java.util.Set;
8
9 public class Profile {
10
11 private final long lastUpdateTimestamp;
12
13 private final String givenName;
14
15 private final String familyName;
16
17 private final String about;
18
19 private final String aboutEmoji;
20
21 private final String avatarUrlPath;
22
23 private final UnidentifiedAccessMode unidentifiedAccessMode;
24
25 private final Set<Capability> capabilities;
26
27 public Profile(
28 final long lastUpdateTimestamp,
29 final String givenName,
30 final String familyName,
31 final String about,
32 final String aboutEmoji,
33 final String avatarUrlPath,
34 final UnidentifiedAccessMode unidentifiedAccessMode,
35 final Set<Capability> capabilities
36 ) {
37 this.lastUpdateTimestamp = lastUpdateTimestamp;
38 this.givenName = givenName;
39 this.familyName = familyName;
40 this.about = about;
41 this.aboutEmoji = aboutEmoji;
42 this.avatarUrlPath = avatarUrlPath;
43 this.unidentifiedAccessMode = unidentifiedAccessMode;
44 this.capabilities = capabilities;
45 }
46
47 private Profile(final Builder builder) {
48 lastUpdateTimestamp = builder.lastUpdateTimestamp;
49 givenName = builder.givenName;
50 familyName = builder.familyName;
51 about = builder.about;
52 aboutEmoji = builder.aboutEmoji;
53 avatarUrlPath = builder.avatarUrlPath;
54 unidentifiedAccessMode = builder.unidentifiedAccessMode;
55 capabilities = builder.capabilities;
56 }
57
58 public static Builder newBuilder() {
59 return new Builder();
60 }
61
62 public static Builder newBuilder(final Profile copy) {
63 Builder builder = new Builder();
64 builder.lastUpdateTimestamp = copy.getLastUpdateTimestamp();
65 builder.givenName = copy.getGivenName();
66 builder.familyName = copy.getFamilyName();
67 builder.about = copy.getAbout();
68 builder.aboutEmoji = copy.getAboutEmoji();
69 builder.avatarUrlPath = copy.getAvatarUrlPath();
70 builder.unidentifiedAccessMode = copy.getUnidentifiedAccessMode();
71 builder.capabilities = copy.getCapabilities();
72 return builder;
73 }
74
75 public long getLastUpdateTimestamp() {
76 return lastUpdateTimestamp;
77 }
78
79 public String getGivenName() {
80 return givenName;
81 }
82
83 public String getFamilyName() {
84 return familyName;
85 }
86
87 public String getInternalServiceName() {
88 if (familyName == null) {
89 return givenName == null ? "" : givenName;
90 }
91 return String.join("\0", givenName == null ? "" : givenName, familyName);
92 }
93
94 public String getDisplayName() {
95 final var noGivenName = Util.isEmpty(givenName);
96 final var noFamilyName = Util.isEmpty(familyName);
97
98 if (noGivenName && noFamilyName) {
99 return "";
100 } else if (noGivenName) {
101 return familyName;
102 } else if (noFamilyName) {
103 return givenName;
104 }
105
106 return givenName + " " + familyName;
107 }
108
109 public String getAbout() {
110 return about;
111 }
112
113 public String getAboutEmoji() {
114 return aboutEmoji;
115 }
116
117 public String getAvatarUrlPath() {
118 return avatarUrlPath;
119 }
120
121 public UnidentifiedAccessMode getUnidentifiedAccessMode() {
122 return unidentifiedAccessMode;
123 }
124
125 public Set<Capability> getCapabilities() {
126 return capabilities;
127 }
128
129 public enum UnidentifiedAccessMode {
130 UNKNOWN,
131 DISABLED,
132 ENABLED,
133 UNRESTRICTED;
134
135 static UnidentifiedAccessMode valueOfOrUnknown(String value) {
136 try {
137 return valueOf(value);
138 } catch (IllegalArgumentException ignored) {
139 return UNKNOWN;
140 }
141 }
142 }
143
144 public enum Capability {
145 storage,
146 gv1Migration,
147 senderKey,
148 announcementGroup;
149
150 static Capability valueOfOrNull(String value) {
151 try {
152 return valueOf(value);
153 } catch (IllegalArgumentException ignored) {
154 return null;
155 }
156 }
157 }
158
159 @Override
160 public boolean equals(final Object o) {
161 if (this == o) return true;
162 if (o == null || getClass() != o.getClass()) return false;
163 final Profile profile = (Profile) o;
164 return lastUpdateTimestamp == profile.lastUpdateTimestamp
165 && Objects.equals(givenName, profile.givenName)
166 && Objects.equals(familyName, profile.familyName)
167 && Objects.equals(about, profile.about)
168 && Objects.equals(aboutEmoji, profile.aboutEmoji)
169 && Objects.equals(avatarUrlPath, profile.avatarUrlPath)
170 && unidentifiedAccessMode == profile.unidentifiedAccessMode
171 && Objects.equals(capabilities, profile.capabilities);
172 }
173
174 @Override
175 public int hashCode() {
176 return Objects.hash(lastUpdateTimestamp,
177 givenName,
178 familyName,
179 about,
180 aboutEmoji,
181 avatarUrlPath,
182 unidentifiedAccessMode,
183 capabilities);
184 }
185
186 public static final class Builder {
187
188 private String givenName;
189 private String familyName;
190 private String about;
191 private String aboutEmoji;
192 private String avatarUrlPath;
193 private UnidentifiedAccessMode unidentifiedAccessMode = UnidentifiedAccessMode.UNKNOWN;
194 private Set<Capability> capabilities = Collections.emptySet();
195 private long lastUpdateTimestamp = 0;
196
197 private Builder() {
198 }
199
200 public Builder withGivenName(final String val) {
201 givenName = val;
202 return this;
203 }
204
205 public Builder withFamilyName(final String val) {
206 familyName = val;
207 return this;
208 }
209
210 public Builder withAbout(final String val) {
211 about = val;
212 return this;
213 }
214
215 public Builder withAboutEmoji(final String val) {
216 aboutEmoji = val;
217 return this;
218 }
219
220 public Builder withAvatarUrlPath(final String val) {
221 avatarUrlPath = val;
222 return this;
223 }
224
225 public Builder withUnidentifiedAccessMode(final UnidentifiedAccessMode val) {
226 unidentifiedAccessMode = val;
227 return this;
228 }
229
230 public Builder withCapabilities(final Set<Capability> val) {
231 capabilities = val;
232 return this;
233 }
234
235 public Profile build() {
236 return new Profile(this);
237 }
238
239 public Builder withLastUpdateTimestamp(final long val) {
240 lastUpdateTimestamp = val;
241 return this;
242 }
243 }
244 }