1package eu.siacs.conversations.xmpp.pep;
2
3import android.util.Base64;
4import eu.siacs.conversations.xml.Element;
5import eu.siacs.conversations.xmpp.Jid;
6import im.conversations.android.xmpp.model.avatar.Metadata;
7
8public class Avatar {
9
10 public enum Origin {
11 PEP,
12 VCARD
13 }
14
15 public String type;
16 public String sha1sum;
17 public String image;
18 public int height;
19 public int width;
20 public long size;
21 public Jid owner;
22 public Origin origin = Origin.PEP; // default to maintain compat
23
24 public byte[] getImageAsBytes() {
25 return Base64.decode(image, Base64.DEFAULT);
26 }
27
28 public String getFilename() {
29 return sha1sum;
30 }
31
32 public static Avatar parseMetadata(final String primaryId, final Metadata metadata) {
33 if (primaryId == null || metadata == null) {
34 return null;
35 }
36 for (Element child : metadata.getChildren()) {
37 if (child.getName().equals("info") && primaryId.equals(child.getAttribute("id"))) {
38 Avatar avatar = new Avatar();
39 String height = child.getAttribute("height");
40 String width = child.getAttribute("width");
41 String size = child.getAttribute("bytes");
42 try {
43 if (height != null) {
44 avatar.height = Integer.parseInt(height);
45 }
46 if (width != null) {
47 avatar.width = Integer.parseInt(width);
48 }
49 if (size != null) {
50 avatar.size = Long.parseLong(size);
51 }
52 } catch (NumberFormatException e) {
53 return null;
54 }
55 avatar.type = child.getAttribute("type");
56 String hash = child.getAttribute("id");
57 if (!isValidSHA1(hash)) {
58 return null;
59 }
60 avatar.sha1sum = hash;
61 avatar.origin = Origin.PEP;
62 return avatar;
63 }
64 }
65 return null;
66 }
67
68 @Override
69 public boolean equals(Object object) {
70 if (object != null && object instanceof Avatar other) {
71 return other.getFilename().equals(this.getFilename());
72 } else {
73 return false;
74 }
75 }
76
77 public static Avatar parsePresence(Element x) {
78 String hash = x == null ? null : x.findChildContent("photo");
79 if (hash == null) {
80 return null;
81 }
82 if (!isValidSHA1(hash)) {
83 return null;
84 }
85 Avatar avatar = new Avatar();
86 avatar.sha1sum = hash;
87 avatar.origin = Origin.VCARD;
88 return avatar;
89 }
90
91 private static boolean isValidSHA1(String s) {
92 return s != null && s.matches("[a-fA-F0-9]{40}");
93 }
94}