aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/de/pixart/messenger/android
diff options
context:
space:
mode:
authorChristian Schneppe <christian@pix-art.de>2018-11-23 08:30:12 +0100
committerChristian Schneppe <christian@pix-art.de>2018-11-23 08:51:39 +0100
commit35d5d97544cd6abc45809a19324898dfbf457467 (patch)
tree0d358bcb048a3de2aa99f18d1baa71d71b0c29de /src/main/java/de/pixart/messenger/android
parent9ec0a87cc28d134c974e8ca0e0b3fda3d89bca7a (diff)
refactored phone contact loading in preperation for sync
Diffstat (limited to 'src/main/java/de/pixart/messenger/android')
-rw-r--r--src/main/java/de/pixart/messenger/android/AbstractPhoneContact.java39
-rw-r--r--src/main/java/de/pixart/messenger/android/JabberIdContact.java73
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