From 781a5d5bcd991e908bb13f378afa5c1c9ac6baeb Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 19 Jan 2017 14:19:17 +0100 Subject: [PATCH] Fixed contact's presence + more contacts optimizations --- src/org/linphone/ContactDetailsFragment.java | 2 +- src/org/linphone/ContactsManager.java | 69 +++++++++++---- src/org/linphone/LinphoneContact.java | 93 +++++++++++--------- src/org/linphone/LinphoneManager.java | 4 +- 4 files changed, 105 insertions(+), 63 deletions(-) diff --git a/src/org/linphone/ContactDetailsFragment.java b/src/org/linphone/ContactDetailsFragment.java index 0474cb924..3167713ef 100644 --- a/src/org/linphone/ContactDetailsFragment.java +++ b/src/org/linphone/ContactDetailsFragment.java @@ -183,7 +183,7 @@ public class ContactDetailsFragment extends Fragment implements OnClickListener LinphoneActivity.instance().selectMenu(FragmentsAvailable.CONTACT_DETAIL); LinphoneActivity.instance().hideTabBar(false); } - contact.minimalRefresh(); + contact.minimalRefresh(true); displayContact(inflater, view); } diff --git a/src/org/linphone/ContactsManager.java b/src/org/linphone/ContactsManager.java index 8b4e6d878..d138c3fbf 100644 --- a/src/org/linphone/ContactsManager.java +++ b/src/org/linphone/ContactsManager.java @@ -32,6 +32,7 @@ import java.util.concurrent.TimeUnit; import org.linphone.core.LinphoneAddress; import org.linphone.core.LinphoneCore; import org.linphone.core.LinphoneFriend; +import org.linphone.core.LinphoneFriendList; import org.linphone.core.LinphoneProxyConfig; import org.linphone.mediastream.Log; @@ -285,12 +286,22 @@ public class ContactsManager extends ContentObserver { public synchronized void setContacts(List c) { contacts = c; - sipContacts = new ArrayList(); + } + + public synchronized void setSipContacts(List c) { + sipContacts = c; + } + + public synchronized void refreshSipContacts() { for (LinphoneContact contact : contacts) { - if (contact.hasAddress() || contact.isInLinphoneFriendList()) { + if (contact.isInLinphoneFriendList() && !sipContacts.contains(contact)) { sipContacts.add(contact); } } + Collections.sort(sipContacts); + for (ContactsUpdatedListener listener : contactsUpdatedListeners) { + listener.onContactsUpdated(); + } } public synchronized void fetchContactsAsync() { @@ -300,11 +311,21 @@ public class ContactsManager extends ContentObserver { contactsFetchTask = new ContactsFetchTask(); contactsFetchTask.execute(); } + + private class ContactsLists { + public List contacts; + public List sipContacts; + + public ContactsLists(List c, List s) { + contacts = c; + sipContacts = s; + } + } - private class ContactsFetchTask extends AsyncTask, List> { - @SuppressWarnings("unchecked") - protected List doInBackground(Void... params) { + private class ContactsFetchTask extends AsyncTask { + protected ContactsLists doInBackground(Void... params) { List contacts = new ArrayList(); + List sipContacts = new ArrayList(); Date contactsTime = new Date(); //We need to check sometimes to know if Linphone was destroyed @@ -317,7 +338,7 @@ public class ContactsManager extends ContentObserver { if (c != null) { while (c.moveToNext()) { String id = c.getString(c.getColumnIndex(Data.CONTACT_ID)); - String displayName = c.getString(c.getColumnIndex(Data.DISPLAY_NAME)); + String displayName = c.getString(c.getColumnIndex(Data.DISPLAY_NAME_PRIMARY)); LinphoneContact contact = new LinphoneContact(); contact.setFullName(displayName); contact.setAndroidId(id); @@ -386,13 +407,17 @@ public class ContactsManager extends ContentObserver { // This will only get name & picture informations to be able to quickly display contacts list contact.minimalRefresh(); i++; + if (contact.hasAddress()) { + sipContacts.add(contact); + } if (i == CONTACTS_STEP) { i = 0; - publishProgress(contacts); + publishProgress(new ContactsLists(contacts, sipContacts)); } } Collections.sort(contacts); + Collections.sort(sipContacts); timeElapsed = (new Date()).getTime() - contactsTime.getTime(); time = String.format("%02d:%02d", @@ -401,7 +426,7 @@ public class ContactsManager extends ContentObserver { TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(timeElapsed))); Log.i("[ContactsManager] organization, SIP and phone numbers for " + contacts.size() + " contacts fetched in " + time); // Public the current list of contacts without all the informations populated - publishProgress(contacts); + publishProgress(new ContactsLists(contacts, sipContacts)); for (LinphoneContact contact : contacts) { //We need to check sometimes to know if Linphone was destroyed @@ -410,6 +435,10 @@ public class ContactsManager extends ContentObserver { } // This time fetch all informations including phone numbers and SIP addresses contact.refresh(); + + if (contact.isInLinphoneFriendList() && !sipContacts.contains(contact)) { + sipContacts.add(contact); + } } timeElapsed = (new Date()).getTime() - contactsTime.getTime(); time = String.format("%02d:%02d", @@ -417,13 +446,19 @@ public class ContactsManager extends ContentObserver { TimeUnit.MILLISECONDS.toSeconds(timeElapsed) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(timeElapsed))); Log.i("[ContactsManager] linphone friends for " + contacts.size() + " contacts created in " + time); + + for (LinphoneFriendList lfl : lc.getFriendLists()) { + Log.d("[ContactsManager] Updating friends subscribtions"); + lfl.updateSubscriptions(); + } - return contacts; + return new ContactsLists(contacts, sipContacts); } - protected void onProgressUpdate(List... result) { + protected void onProgressUpdate(ContactsLists... result) { synchronized (ContactsManager.this) { - setContacts(result[0]); + setContacts(result[0].contacts); + setSipContacts(result[0].sipContacts); contactsCache.clear(); for (ContactsUpdatedListener listener : contactsUpdatedListeners) { listener.onContactsUpdated(); @@ -431,7 +466,7 @@ public class ContactsManager extends ContentObserver { } } - protected void onPostExecute(List result) { + protected void onPostExecute(ContactsLists result) { for (ContactsUpdatedListener listener : contactsUpdatedListeners) { listener.onContactsUpdated(); } @@ -498,10 +533,10 @@ public class ContactsManager extends ContentObserver { + "' AND " + CommonDataKinds.Phone.NUMBER + " IS NOT NULL " + " OR (" + Data.MIMETYPE + " = '" + CommonDataKinds.SipAddress.CONTENT_ITEM_TYPE + "' AND " + CommonDataKinds.SipAddress.SIP_ADDRESS + " IS NOT NULL))"; - String[] projection = new String[] { Data.CONTACT_ID, Data.DISPLAY_NAME }; - String query = Data.DISPLAY_NAME + " IS NOT NULL AND (" + req + ")"; + String[] projection = new String[] { Data.CONTACT_ID, Data.DISPLAY_NAME_PRIMARY }; + String query = Data.DISPLAY_NAME_PRIMARY + " IS NOT NULL AND (" + req + ")"; - Cursor cursor = cr.query(Data.CONTENT_URI, projection, query, null, " lower(" + Data.DISPLAY_NAME + ") COLLATE UNICODE ASC"); + Cursor cursor = cr.query(Data.CONTENT_URI, projection, query, null, " lower(" + Data.DISPLAY_NAME_PRIMARY + ") COLLATE UNICODE ASC"); if (cursor == null) { return cursor; } @@ -509,13 +544,13 @@ public class ContactsManager extends ContentObserver { MatrixCursor result = new MatrixCursor(cursor.getColumnNames()); Set groupBy = new HashSet(); while (cursor.moveToNext()) { - String name = cursor.getString(cursor.getColumnIndex(Data.DISPLAY_NAME)); + String name = cursor.getString(cursor.getColumnIndex(Data.DISPLAY_NAME_PRIMARY)); if (!groupBy.contains(name)) { groupBy.add(name); Object[] newRow = new Object[cursor.getColumnCount()]; int contactID = cursor.getColumnIndex(Data.CONTACT_ID); - int displayName = cursor.getColumnIndex(Data.DISPLAY_NAME); + int displayName = cursor.getColumnIndex(Data.DISPLAY_NAME_PRIMARY); newRow[contactID] = cursor.getString(contactID); newRow[displayName] = cursor.getString(displayName); diff --git a/src/org/linphone/LinphoneContact.java b/src/org/linphone/LinphoneContact.java index f1ff5bfe6..dfce7d512 100644 --- a/src/org/linphone/LinphoneContact.java +++ b/src/org/linphone/LinphoneContact.java @@ -401,6 +401,9 @@ public class LinphoneContact implements Serializable, Comparable(); hasSipAddress = false; if (isAndroidContact()) { - getContactNames(); - getNativeContactOrganization(); + if (getAllNames) { + getContactNames(); + } + boolean isOrgVisible = LinphoneManager.getInstance().getContext().getResources().getBoolean(R.bool.display_contact_organization); + if (isOrgVisible) { + getNativeContactOrganization(); + } for (LinphoneNumberOrAddress noa : getAddressesAndNumbersForAndroidContact()) { addNumberOrAddress(noa); diff --git a/src/org/linphone/LinphoneManager.java b/src/org/linphone/LinphoneManager.java index 3acc4c67d..c99473a7c 100644 --- a/src/org/linphone/LinphoneManager.java +++ b/src/org/linphone/LinphoneManager.java @@ -1000,7 +1000,9 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag public void displayMessage(LinphoneCore lc, String message) {} public void show(LinphoneCore lc) {} public void newSubscriptionRequest(LinphoneCore lc, LinphoneFriend lf, String url) {} - public void notifyPresenceReceived(LinphoneCore lc, LinphoneFriend lf) {} + public void notifyPresenceReceived(LinphoneCore lc, LinphoneFriend lf) { + ContactsManager.getInstance().refreshSipContacts(); + } @Override public void dtmfReceived(LinphoneCore lc, LinphoneCall call, int dtmf) {