1package eu.siacs.conversations.android;
2
3import android.Manifest;
4import android.content.Context;
5import android.content.pm.PackageManager;
6import android.database.Cursor;
7import android.os.Build;
8import android.provider.ContactsContract;
9import android.util.Log;
10
11import eu.siacs.conversations.Config;
12import eu.siacs.conversations.services.QuickConversationsService;
13import eu.siacs.conversations.xmpp.Jid;
14
15import java.util.Collections;
16import java.util.HashMap;
17import java.util.Map;
18
19public class JabberIdContact extends AbstractPhoneContact {
20
21 private static final String[] PROJECTION =
22 new String[] {
23 ContactsContract.Data._ID,
24 ContactsContract.Data.DISPLAY_NAME,
25 ContactsContract.Data.PHOTO_URI,
26 ContactsContract.Data.LOOKUP_KEY,
27 ContactsContract.CommonDataKinds.Im.DATA
28 };
29 private static final String SELECTION =
30 ContactsContract.Data.MIMETYPE
31 + "=? AND ("
32 + ContactsContract.CommonDataKinds.Im.PROTOCOL
33 + "=? or ("
34 + ContactsContract.CommonDataKinds.Im.PROTOCOL
35 + "=? and lower("
36 + ContactsContract.CommonDataKinds.Im.CUSTOM_PROTOCOL
37 + ")=?))";
38
39 private static final String[] SELECTION_ARGS = {
40 ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE,
41 String.valueOf(ContactsContract.CommonDataKinds.Im.PROTOCOL_JABBER),
42 String.valueOf(ContactsContract.CommonDataKinds.Im.PROTOCOL_CUSTOM),
43 "xmpp"
44 };
45
46 private final Jid jid;
47
48 private JabberIdContact(Cursor cursor) throws IllegalArgumentException {
49 super(cursor);
50 try {
51 this.jid =
52 Jid.of(
53 cursor.getString(
54 cursor.getColumnIndexOrThrow(
55 ContactsContract.CommonDataKinds.Im.DATA)));
56 } catch (final IllegalArgumentException | NullPointerException e) {
57 throw new IllegalArgumentException(e);
58 }
59 }
60
61 public Jid getJid() {
62 return jid;
63 }
64
65 public static Map<Jid, JabberIdContact> load(final Context context) {
66 if (!QuickConversationsService.isContactListIntegration(context)
67 || (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
68 && context.checkSelfPermission(Manifest.permission.READ_CONTACTS)
69 != PackageManager.PERMISSION_GRANTED)) {
70 return Collections.emptyMap();
71 }
72 try (final Cursor cursor =
73 context.getContentResolver()
74 .query(
75 ContactsContract.Data.CONTENT_URI,
76 PROJECTION,
77 SELECTION,
78 SELECTION_ARGS,
79 null)) {
80 if (cursor == null) {
81 return Collections.emptyMap();
82 }
83 final HashMap<Jid, JabberIdContact> contacts = new HashMap<>();
84 while (cursor.moveToNext()) {
85 try {
86 final JabberIdContact contact = new JabberIdContact(cursor);
87 final JabberIdContact preexisting = contacts.put(contact.getJid(), contact);
88 if (preexisting == null || preexisting.rating() < contact.rating()) {
89 contacts.put(contact.getJid(), contact);
90 }
91 } catch (final IllegalArgumentException e) {
92 Log.d(Config.LOGTAG, "unable to create jabber id contact");
93 }
94 }
95 return contacts;
96 } catch (final Exception e) {
97 Log.d(Config.LOGTAG, "unable to query", e);
98 return Collections.emptyMap();
99 }
100 }
101}