1package eu.siacs.conversations.entities;
2
3import java.util.ArrayList;
4import java.util.Collections;
5import java.util.Hashtable;
6import java.util.Iterator;
7import java.util.List;
8import java.util.Map;
9
10import eu.siacs.conversations.xml.Element;
11
12public class Presences {
13 private final Hashtable<String, Presence> presences = new Hashtable<>();
14
15 public Hashtable<String, Presence> getPresences() {
16 return this.presences;
17 }
18
19 public void updatePresence(String resource, Presence presence) {
20 synchronized (this.presences) {
21 this.presences.put(resource, presence);
22 }
23 }
24
25 public void removePresence(String resource) {
26 synchronized (this.presences) {
27 this.presences.remove(resource);
28 }
29 }
30
31 public void clearPresences() {
32 synchronized (this.presences) {
33 this.presences.clear();
34 }
35 }
36
37 public Presence.Status getShownStatus() {
38 Presence.Status status = Presence.Status.OFFLINE;
39 synchronized (this.presences) {
40 for(Presence p : presences.values()) {
41 if (p.getStatus() == Presence.Status.DND) {
42 return p.getStatus();
43 } else if (p.getStatus().compareTo(status) < 0){
44 status = p.getStatus();
45 }
46 }
47 }
48 return status;
49 }
50
51 public int size() {
52 synchronized (this.presences) {
53 return presences.size();
54 }
55 }
56
57 public String[] asStringArray() {
58 synchronized (this.presences) {
59 final String[] presencesArray = new String[presences.size()];
60 presences.keySet().toArray(presencesArray);
61 return presencesArray;
62 }
63 }
64
65 public List<PresenceTemplate> asTemplates() {
66 synchronized (this.presences) {
67 ArrayList<PresenceTemplate> templates = new ArrayList<>(presences.size());
68 for(Presence p : presences.values()) {
69 if (p.getMessage() != null && !p.getMessage().trim().isEmpty()) {
70 templates.add(new PresenceTemplate(p.getStatus(), p.getMessage()));
71 }
72 }
73 return templates;
74 }
75 }
76
77 public boolean has(String presence) {
78 synchronized (this.presences) {
79 return presences.containsKey(presence);
80 }
81 }
82
83 public List<String> getStatusMessages() {
84 ArrayList<String> messages = new ArrayList<>();
85 synchronized (this.presences) {
86 for(Presence presence : this.presences.values()) {
87 String message = presence.getMessage() == null ? null : presence.getMessage().trim();
88 if (message != null && !message.isEmpty() && !messages.contains(message)) {
89 messages.add(message);
90 }
91 }
92 }
93 return messages;
94 }
95
96 public boolean allOrNonSupport(String namespace) {
97 synchronized (this.presences) {
98 for(Presence presence : this.presences.values()) {
99 ServiceDiscoveryResult disco = presence.getServiceDiscoveryResult();
100 if (disco == null || !disco.getFeatures().contains(namespace)) {
101 return false;
102 }
103 }
104 }
105 return true;
106 }
107}