Avatar.java

 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}