From 7e81f775c3bb0b4ef0674b128f85259ffa615ceb Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Mon, 6 Apr 2020 08:55:55 +0200 Subject: [PATCH] Fixed duplicated contacts in SIP list after contact added or removed --- .../org/linphone/contact/AsyncContactsLoader.kt | 14 ++++++++------ .../java/org/linphone/contact/ContactsManager.kt | 13 ++++++++++++- .../res/layout-sw533dp-land/settings_fragment.xml | 10 ---------- app/src/main/res/layout/settings_fragment.xml | 10 ---------- 4 files changed, 20 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/org/linphone/contact/AsyncContactsLoader.kt b/app/src/main/java/org/linphone/contact/AsyncContactsLoader.kt index d10c74405..345745443 100644 --- a/app/src/main/java/org/linphone/contact/AsyncContactsLoader.kt +++ b/app/src/main/java/org/linphone/contact/AsyncContactsLoader.kt @@ -63,15 +63,15 @@ class AsyncContactsLoader(private val context: Context) : } override fun doInBackground(vararg args: Void): AsyncContactsData { - Log.i("[Contacts Loader] Background synchronization started") - val data = AsyncContactsData() - val core: Core = coreContext.core + if (isCancelled) return data + Log.i("[Contacts Loader] Background synchronization started") + val core: Core = coreContext.core val androidContactsCache: HashMap = HashMap() val nativeIds = arrayListOf() - val friendLists = core.friendsLists + for (list in friendLists) { val friends = list.friends for (friend in friends) { @@ -133,6 +133,7 @@ class AsyncContactsLoader(private val context: Context) : while (cursor.moveToNext()) { if (isCancelled) { Log.w("[Contacts Loader] Task cancelled") + cursor.close() return data } @@ -218,7 +219,6 @@ class AsyncContactsLoader(private val context: Context) : androidContactsCache.clear() data.contacts.sort() - data.sipContacts.sort() Log.i("[Contacts Loader] Background synchronization finished") return data @@ -232,11 +232,13 @@ class AsyncContactsLoader(private val context: Context) : if (contact is NativeContact) { contact.createOrUpdateFriendFromNativeContact() - if (contact.friend?.presenceModel?.basicStatus == PresenceBasicStatus.Open) { + if (contact.friend?.presenceModel?.basicStatus == PresenceBasicStatus.Open && !data.sipContacts.contains(contact)) { + Log.i("[Contacts Loader] Friend $contact has presence information, adding it to SIP list") data.sipContacts.add(contact) } } } + data.sipContacts.sort() // Now that contact fetching is asynchronous, this is required to ensure // presence subscription event will be sent with all friends diff --git a/app/src/main/java/org/linphone/contact/ContactsManager.kt b/app/src/main/java/org/linphone/contact/ContactsManager.kt index 31da3672b..e39c39fc7 100644 --- a/app/src/main/java/org/linphone/contact/ContactsManager.kt +++ b/app/src/main/java/org/linphone/contact/ContactsManager.kt @@ -49,10 +49,12 @@ open class ContactsUpdatedListenerStub : ContactsUpdatedListener { class ContactsManager(private val context: Context) { private val contactsObserver: ContentObserver by lazy { object : ContentObserver(coreContext.handler) { + @Synchronized override fun onChange(selfChange: Boolean) { onChange(selfChange, null) } + @Synchronized override fun onChange(selfChange: Boolean, uri: Uri?) { Log.i("[Contacts Observer] At least one contact has changed") fetchContactsAsync() @@ -61,9 +63,13 @@ class ContactsManager(private val context: Context) { } var contacts = ArrayList() + @Synchronized + get @Synchronized private set var sipContacts = ArrayList() + @Synchronized + get @Synchronized private set @@ -111,8 +117,12 @@ class ContactsManager(private val context: Context) { Log.i("[Contacts Manager] Created") } + @Synchronized fun fetchContactsAsync() { - loadContactsTask?.cancel(true) + if (loadContactsTask != null) { + Log.w("[Contacts Manager] Cancelling existing async task") + loadContactsTask?.cancel(true) + } loadContactsTask = AsyncContactsLoader(context) loadContactsTask?.executeOnExecutor(THREAD_POOL_EXECUTOR) } @@ -136,6 +146,7 @@ class ContactsManager(private val context: Context) { } } + @Synchronized fun getAndroidContactIdFromUri(uri: Uri): String? { val projection = arrayOf(ContactsContract.Data.CONTACT_ID) val cursor = context.contentResolver.query(uri, projection, null, null, null) diff --git a/app/src/main/res/layout-sw533dp-land/settings_fragment.xml b/app/src/main/res/layout-sw533dp-land/settings_fragment.xml index e8244100f..0dfaff72c 100644 --- a/app/src/main/res/layout-sw533dp-land/settings_fragment.xml +++ b/app/src/main/res/layout-sw533dp-land/settings_fragment.xml @@ -80,11 +80,6 @@ android:layout_width="wrap_content" android:layout_height="wrap_content"/> - - - - - - - -