RtpCapability.java

 1package eu.siacs.conversations.xmpp.jingle;
 2
 3import java.util.ArrayList;
 4import java.util.Arrays;
 5import java.util.Collections;
 6import java.util.List;
 7import java.util.Map;
 8
 9import eu.siacs.conversations.entities.Contact;
10import eu.siacs.conversations.entities.Presence;
11import eu.siacs.conversations.entities.Presences;
12import eu.siacs.conversations.entities.ServiceDiscoveryResult;
13import eu.siacs.conversations.xml.Namespace;
14
15public class RtpCapability {
16
17    private static List<String> BASIC_RTP_REQUIREMENTS = Arrays.asList(
18            Namespace.JINGLE,
19            Namespace.JINGLE_TRANSPORT_ICE_UDP,
20            Namespace.JINGLE_APPS_RTP,
21            Namespace.JINGLE_APPS_DTLS
22    );
23    private static List<String> VIDEO_REQUIREMENTS = Arrays.asList(
24            Namespace.JINGLE_FEATURE_AUDIO,
25            Namespace.JINGLE_FEATURE_VIDEO
26    );
27
28    public static Capability check(final Presence presence) {
29        final ServiceDiscoveryResult disco = presence.getServiceDiscoveryResult();
30        final List<String> features = disco == null ? Collections.emptyList() : disco.getFeatures();
31        if (features.containsAll(BASIC_RTP_REQUIREMENTS)) {
32            if (features.containsAll(VIDEO_REQUIREMENTS)) {
33                return Capability.VIDEO;
34            }
35            if (features.contains(Namespace.JINGLE_FEATURE_AUDIO)) {
36                return Capability.AUDIO;
37            }
38        }
39        return Capability.NONE;
40    }
41
42    public static String[] filterPresences(final Contact contact, Capability required) {
43        final Presences presences = contact.getPresences();
44        final ArrayList<String> resources = new ArrayList<>();
45        for(final Map.Entry<String,Presence> presence : presences.getPresencesMap().entrySet()) {
46            final Capability capability = check(presence.getValue());
47            if (capability == Capability.NONE) {
48                continue;
49            }
50            if (required == Capability.AUDIO || capability == required) {
51                resources.add(presence.getKey());
52            }
53        }
54        return resources.toArray(new String[0]);
55    }
56
57    public static Capability check(final Contact contact) {
58        final Presences presences = contact.getPresences();
59        Capability result = Capability.NONE;
60        for(Presence presence : presences.getPresences()) {
61            Capability capability = check(presence);
62            if (capability == Capability.VIDEO) {
63                result = capability;
64            } else if (capability == Capability.AUDIO && result == Capability.NONE) {
65                result = capability;
66            }
67        }
68        return result;
69    }
70
71    public enum Capability {
72        NONE, AUDIO, VIDEO
73    }
74
75}