Presence.java

 1package im.conversations.android.xmpp.model.stanza;
 2
 3import com.google.common.base.Strings;
 4import im.conversations.android.annotation.XmlElement;
 5import im.conversations.android.xmpp.model.capabilties.EntityCapabilities;
 6import im.conversations.android.xmpp.model.jabber.Show;
 7import im.conversations.android.xmpp.model.jabber.Status;
 8
 9@XmlElement
10public class Presence extends Stanza implements EntityCapabilities {
11
12    public Presence() {
13        super(Presence.class);
14    }
15
16    public Availability getAvailability() {
17        final var show = getExtension(Show.class);
18        if (show == null) {
19            return Availability.ONLINE;
20        }
21        return Availability.valueOfShown(show.getContent());
22    }
23
24    public void setAvailability(final Availability availability) {
25        if (availability == null || availability == Availability.ONLINE) {
26            return;
27        }
28        this.addExtension(new Show()).setContent(availability.toShowString());
29    }
30
31    public void setStatus(final String status) {
32        if (Strings.isNullOrEmpty(status)) {
33            return;
34        }
35        this.addExtension(new Status()).setContent(status);
36    }
37
38    public String getStatus() {
39        final var status = getExtension(Status.class);
40        return status == null ? null : status.getContent();
41    }
42
43    public enum Availability {
44        CHAT,
45        ONLINE,
46        AWAY,
47        XA,
48        DND,
49        OFFLINE;
50
51        public String toShowString() {
52            return switch (this) {
53                case CHAT -> "chat";
54                case AWAY -> "away";
55                case XA -> "xa";
56                case DND -> "dnd";
57                default -> null;
58            };
59        }
60
61        public static Availability valueOfShown(final String content) {
62            if (Strings.isNullOrEmpty(content)) {
63                return Availability.ONLINE;
64            }
65            return switch (content) {
66                case "away" -> Availability.AWAY;
67                case "xa" -> Availability.XA;
68                case "dnd" -> Availability.DND;
69                case "chat" -> Availability.CHAT;
70                default -> Availability.ONLINE;
71            };
72        }
73    }
74}