JabberIdContact.java

  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}