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