Presences.java

  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}