From 6b5b2b9075387cb2a80d6ff5aea42cee436368cb Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Mon, 21 Mar 2016 14:25:53 +0100 Subject: [PATCH] Added back sip contacts filter --- src/org/linphone/ContactEditorFragment.java | 2 +- src/org/linphone/ContactsManager.java | 10 ++- src/org/linphone/LinphoneContact.java | 92 +++++++++++---------- 3 files changed, 56 insertions(+), 48 deletions(-) diff --git a/src/org/linphone/ContactEditorFragment.java b/src/org/linphone/ContactEditorFragment.java index 19816b799..ba5227c40 100644 --- a/src/org/linphone/ContactEditorFragment.java +++ b/src/org/linphone/ContactEditorFragment.java @@ -132,7 +132,7 @@ public class ContactEditorFragment extends Fragment { getFragmentManager().popBackStackImmediate(); return; }*/ - contact = LinphoneContact.createAndroidContact(); + contact = LinphoneContact.createContact(); } contact.setFirstNameAndLastName(firstName.getText().toString(), lastName.getText().toString()); if (photoToAdd != null) { diff --git a/src/org/linphone/ContactsManager.java b/src/org/linphone/ContactsManager.java index b0dafd6f9..311a86698 100644 --- a/src/org/linphone/ContactsManager.java +++ b/src/org/linphone/ContactsManager.java @@ -48,7 +48,7 @@ public class ContactsManager extends ContentObserver { private static final int CONTACTS_UPDATED = 543; private static ContactsManager instance; - private List contacts; + private List contacts, sipContacts; private Account mAccount; private boolean preferLinphoneContacts = false, isContactPresenceDisabled = true, hasContactAccess = false; private ContentResolver contentResolver; @@ -112,7 +112,7 @@ public class ContactsManager extends ContentObserver { } public synchronized List getSIPContacts() { - return contacts; + return sipContacts; } public void enableContactsAccess() { @@ -176,6 +176,12 @@ public class ContactsManager extends ContentObserver { public synchronized void setContacts(List c) { contacts = c; + sipContacts = new ArrayList(); + for (LinphoneContact contact : contacts) { + if (contact.hasAddress()) { + sipContacts.add(contact); + } + } } public synchronized void fetchContacts() { diff --git a/src/org/linphone/LinphoneContact.java b/src/org/linphone/LinphoneContact.java index 169f3f6cd..920dc1e0e 100644 --- a/src/org/linphone/LinphoneContact.java +++ b/src/org/linphone/LinphoneContact.java @@ -45,6 +45,7 @@ public class LinphoneContact implements Serializable { private transient Uri photoUri, thumbnailUri; private List addresses; private transient ArrayList changesToCommit; + private boolean hasSipAddress; public LinphoneContact() { addresses = new ArrayList(); @@ -52,6 +53,7 @@ public class LinphoneContact implements Serializable { thumbnailUri = null; photoUri = null; changesToCommit = new ArrayList(); + hasSipAddress = false; } public void setFullName(String name) { @@ -86,6 +88,7 @@ public class LinphoneContact implements Serializable { .build()); } } + firstName = fn; lastName = ln; fullName = firstName + " " + lastName; @@ -121,11 +124,18 @@ public class LinphoneContact implements Serializable { public void setPhoto(byte[] photo) { if (isAndroidContact() && photo != null) { - if (!hasPhoto()) { + String id = findDataId(getAndroidId()); + if (id != null) { + changesToCommit.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.Data._ID + "= ?", new String[] { id }) + .withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, photo) + .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE) + .build()); + } else { String rawContactId = findRawContactID(getAndroidId()); if (rawContactId != null) { changesToCommit.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) - .withSelection(ContactsContract.Data.RAW_CONTACT_ID + "= ?", new String[] { rawContactId }) + .withValue(ContactsContract.Data.RAW_CONTACT_ID, new String[] { rawContactId }) .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE) .withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, photo) .build()); @@ -136,21 +146,15 @@ public class LinphoneContact implements Serializable { .withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, photo) .build()); } - } else { - String id = findDataId(getAndroidId()); - if (id != null) { - changesToCommit.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) - .withSelection(ContactsContract.Data._ID + "= ?", new String[] { id }) - .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE) - .withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, photo) - .build()); - } } } } public void addNumberOrAddress(LinphoneNumberOrAddress noa) { if (noa == null) return; + if (noa.isSIPAddress()) { + hasSipAddress = true; + } addresses.add(noa); } @@ -171,12 +175,7 @@ public class LinphoneContact implements Serializable { } public boolean hasAddress() { - for (LinphoneNumberOrAddress noa : getNumbersOrAddresses()) { - if (noa.isSIPAddress()) { - return true; - } - } - return false; + return hasSipAddress; } public void setAndroidId(String id) { @@ -196,10 +195,9 @@ public class LinphoneContact implements Serializable { } finally { changesToCommit = new ArrayList(); } - } else { - if (friend == null) { - friend = LinphoneCoreFactory.instance().createLinphoneFriend(); - } + } + + if (isLinphoneFriend()) { friend.setName(fullName); } } @@ -234,6 +232,7 @@ public class LinphoneContact implements Serializable { thumbnailUri = null; photoUri = null; } else { + hasSipAddress = false; String id = getAndroidId(); fullName = getName(id); lastName = getContactLastName(id); @@ -241,7 +240,7 @@ public class LinphoneContact implements Serializable { setThumbnailUri(getContactPictureUri(id)); setPhotoUri(getContactPhotoUri(id)); for (LinphoneNumberOrAddress noa : getAddressesAndNumbersForAndroidContact(id)) { - addresses.add(noa); + addNumberOrAddress(noa); } } } @@ -249,31 +248,16 @@ public class LinphoneContact implements Serializable { public boolean isAndroidContact() { return androidId != null; } - - public static LinphoneContact createLinphoneFriend(String name, String address) { - LinphoneContact contact = new LinphoneContact(); - LinphoneFriend friend = LinphoneCoreFactory.instance().createLinphoneFriend(); - contact.friend = friend; - - if (name != null) { - contact.setFullName(name); - } - if (address != null) { - contact.addNumberOrAddress(new LinphoneNumberOrAddress(address, true)); - } - - return contact; + + public boolean isLinphoneFriend() { + return friend != null; } - public static LinphoneContact createAndroidContact() { - LinphoneContact contact = new LinphoneContact(); - contact.changesToCommit.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI) - .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null) - .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null) - .withValue(ContactsContract.RawContacts.AGGREGATION_MODE, ContactsContract.RawContacts.AGGREGATION_MODE_DEFAULT) - .build()); - contact.setAndroidId("0"); - return contact; + public static LinphoneContact createContact() { + if (ContactsManager.getInstance().hasContactsAccess()) { + return createAndroidContact(); + } + return createLinphoneFriend(); } private Uri getContactUri(String id) { @@ -391,4 +375,22 @@ public class LinphoneContact implements Serializable { return result; } + + private static LinphoneContact createAndroidContact() { + LinphoneContact contact = new LinphoneContact(); + contact.changesToCommit.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI) + .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null) + .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null) + .withValue(ContactsContract.RawContacts.AGGREGATION_MODE, ContactsContract.RawContacts.AGGREGATION_MODE_DEFAULT) + .build()); + contact.setAndroidId("0"); + return contact; + } + + private static LinphoneContact createLinphoneFriend() { + LinphoneContact contact = new LinphoneContact(); + LinphoneFriend friend = LinphoneCoreFactory.instance().createLinphoneFriend(); + contact.friend = friend; + return contact; + } }