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}