diff options
Diffstat (limited to 'src/main/java/de/pixart/messenger/android')
-rw-r--r-- | src/main/java/de/pixart/messenger/android/AbstractPhoneContact.java | 39 | ||||
-rw-r--r-- | src/main/java/de/pixart/messenger/android/JabberIdContact.java | 73 |
2 files changed, 112 insertions, 0 deletions
diff --git a/src/main/java/de/pixart/messenger/android/AbstractPhoneContact.java b/src/main/java/de/pixart/messenger/android/AbstractPhoneContact.java new file mode 100644 index 000000000..abab89aee --- /dev/null +++ b/src/main/java/de/pixart/messenger/android/AbstractPhoneContact.java @@ -0,0 +1,39 @@ +package de.pixart.messenger.android; + +import android.database.Cursor; +import android.net.Uri; +import android.provider.ContactsContract; +import android.text.TextUtils; + +abstract class AbstractPhoneContact { + + private final Uri lookupUri; + private final String displayName; + private final String photoUri; + + + AbstractPhoneContact(Cursor cursor) { + int phoneId = cursor.getInt(cursor.getColumnIndex(ContactsContract.Data._ID)); + String lookupKey = cursor.getString(cursor.getColumnIndex(ContactsContract.Data.LOOKUP_KEY)); + this.lookupUri = ContactsContract.Contacts.getLookupUri(phoneId, lookupKey); + this.displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.Data.DISPLAY_NAME)); + this.photoUri = cursor.getString(cursor.getColumnIndex(ContactsContract.Data.PHOTO_URI)); + } + + public Uri getLookupUri() { + return lookupUri; + } + + public String getDisplayName() { + return displayName; + } + + public String getPhotoUri() { + return photoUri; + } + + + public int rating() { + return (TextUtils.isEmpty(displayName) ? 0 : 2) + (TextUtils.isEmpty(photoUri) ? 0 : 1); + } +}
\ No newline at end of file diff --git a/src/main/java/de/pixart/messenger/android/JabberIdContact.java b/src/main/java/de/pixart/messenger/android/JabberIdContact.java new file mode 100644 index 000000000..bfafb54c9 --- /dev/null +++ b/src/main/java/de/pixart/messenger/android/JabberIdContact.java @@ -0,0 +1,73 @@ +package de.pixart.messenger.android; + +import android.Manifest; +import android.content.Context; +import android.content.pm.PackageManager; +import android.database.Cursor; +import android.os.Build; +import android.provider.ContactsContract; +import android.util.Log; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import de.pixart.messenger.Config; +import rocks.xmpp.addr.Jid; + +public class JabberIdContact extends AbstractPhoneContact { + + private final Jid jid; + + private JabberIdContact(Cursor cursor) throws IllegalArgumentException { + super(cursor); + try { + this.jid = Jid.of(cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Im.DATA))); + } catch (IllegalArgumentException | NullPointerException e) { + throw new IllegalArgumentException(e); + } + } + + public Jid getJid() { + return jid; + } + + public static Map<Jid, JabberIdContact> load(Context context) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context.checkSelfPermission(Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { + return Collections.emptyMap(); + } + final String[] PROJECTION = new String[]{ContactsContract.Data._ID, + ContactsContract.Data.DISPLAY_NAME, + ContactsContract.Data.PHOTO_URI, + ContactsContract.Data.LOOKUP_KEY, + ContactsContract.CommonDataKinds.Im.DATA}; + + final String SELECTION = "(" + ContactsContract.Data.MIMETYPE + "=\"" + + ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE + + "\") AND (" + ContactsContract.CommonDataKinds.Im.PROTOCOL + + "=\"" + ContactsContract.CommonDataKinds.Im.PROTOCOL_JABBER + + "\")"; + final Cursor cursor; + try { + cursor = context.getContentResolver().query(ContactsContract.Data.CONTENT_URI, PROJECTION, SELECTION, null, null); + } catch (Exception e) { + return Collections.emptyMap(); + } + final HashMap<Jid, JabberIdContact> contacts = new HashMap<>(); + while (cursor != null && cursor.moveToNext()) { + try { + final JabberIdContact contact = new JabberIdContact(cursor); + final JabberIdContact preexisting = contacts.put(contact.getJid(), contact); + if (preexisting == null || preexisting.rating() < contact.rating()) { + contacts.put(contact.getJid(), contact); + } + } catch (IllegalArgumentException e) { + Log.d(Config.LOGTAG,"unable to create jabber id contact"); + } + } + if (cursor != null) { + cursor.close(); + } + return contacts; + } +}
\ No newline at end of file |