diff --git a/app/src/main/assets/linphonerc_factory b/app/src/main/assets/linphonerc_factory index 23e6571e4..be1535813 100644 --- a/app/src/main/assets/linphonerc_factory +++ b/app/src/main/assets/linphonerc_factory @@ -36,6 +36,7 @@ enable_basic_to_client_group_chat_room_migration=0 enable_simple_group_chat_message_state=0 aggregate_imdn=1 notify_each_friend_individually_when_presence_received=0 +fetch_contacts_vcard_list_at_startup=0 [app] activation_code_length=4 diff --git a/app/src/main/java/org/linphone/activities/main/contact/fragments/MasterContactsFragment.kt b/app/src/main/java/org/linphone/activities/main/contact/fragments/MasterContactsFragment.kt index d388c9e78..685e4108c 100644 --- a/app/src/main/java/org/linphone/activities/main/contact/fragments/MasterContactsFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/contact/fragments/MasterContactsFragment.kt @@ -335,6 +335,26 @@ class MasterContactsFragment : MasterFragment + binding.swiperefresh.isRefreshing = false + if (!success) { + val activity = requireActivity() as MainActivity + activity.showSnackBar(R.string.vcard_sync_failed) + } else { + listViewModel.updateContactsList(true) + } + } + + binding.swiperefresh.setOnRefreshListener { + if (!coreContext.core.isNetworkReachable) { + binding.swiperefresh.isRefreshing = false + val activity = requireActivity() as MainActivity + activity.showSnackBar(R.string.call_error_network_unreachable) + } else { + listViewModel.refreshVCards() + } + } } override fun deleteItems(indexesOfItemToDelete: ArrayList) { @@ -362,6 +382,7 @@ class MasterContactsFragment : MasterFragment>() } + var vcardsFetchInProgress = MutableLiveData() + var vcardsFetchSuccesfull = MutableLiveData() + + val friendListListener: FriendListListenerStub = object : FriendListListenerStub() { + override fun onSyncStatusChanged( + friendList: FriendList, + status: FriendList.SyncStatus?, + message: String? + ) { + if (status == FriendList.SyncStatus.Successful || status == FriendList.SyncStatus.Failure) { + vcardsFetchSuccesfull.value = status == FriendList.SyncStatus.Successful + vcardsFetchInProgress.value = false + friendList.removeListener(this) + coreContext.contactsManager.prepareVCardContacts() + } + } + } + private val contactsUpdatedListener = object : ContactsUpdatedListenerStub() { override fun onContactsUpdated() { Log.i("[Contacts] Contacts have changed") @@ -126,6 +144,7 @@ class ContactsListViewModel : ViewModel() { Log.i( "[Contacts] Asking Magic search for contacts matching filter [$filterValue], domain [$domain] and in sources [$sources]" ) + coreContext.contactsManager.prepareVCardContacts() coreContext.contactsManager.magicSearch.getContactsListAsync( filterValue, domain, @@ -229,4 +248,14 @@ class ContactsListViewModel : ViewModel() { } } } + + fun refreshVCards() { + corePreferences.contactsVCardList?.also { contactsVcardListName -> + coreContext.core.getFriendListByName(contactsVcardListName)?.also { contactsVcardList -> + contactsVcardList.addListener(friendListListener) + vcardsFetchInProgress.value = true + contactsVcardList.synchronizeFriendsFromServer() + } + } + } } diff --git a/app/src/main/java/org/linphone/contact/ContactsManager.kt b/app/src/main/java/org/linphone/contact/ContactsManager.kt index 07aafe7e8..1575deeed 100644 --- a/app/src/main/java/org/linphone/contact/ContactsManager.kt +++ b/app/src/main/java/org/linphone/contact/ContactsManager.kt @@ -379,6 +379,29 @@ class ContactsManager(private val context: Context) { return friend } + fun prepareVCardContacts() { + coreContext.core.friendsLists.forEach { list -> + if (list.displayName == coreContext.core.config?.getString( + "misc", + "contacts-vcard-list", + "no-contacts-vcard-list" + ) + ) { + coreContext.core.defaultAccount?.params?.domain?.also { domain -> + list.friends.forEach { friend -> + if (friend.address == null && friend.phoneNumbers.size > 0) { + friend.phoneNumbers.first()?.also { phoneNumber -> + Factory.instance() + .createAddress("sip:" + phoneNumber + "@" + domain)?.also { + friend.setAddress(it) + } + } + } + } + } + } + } + } } fun Friend.getContactForPhoneNumberOrAddress(value: String): String? { diff --git a/app/src/main/java/org/linphone/contact/ContactsSelectionViewModel.kt b/app/src/main/java/org/linphone/contact/ContactsSelectionViewModel.kt index 46f47dbc6..dfc81d924 100644 --- a/app/src/main/java/org/linphone/contact/ContactsSelectionViewModel.kt +++ b/app/src/main/java/org/linphone/contact/ContactsSelectionViewModel.kt @@ -97,6 +97,7 @@ open class ContactsSelectionViewModel : MessageNotifierViewModel() { val domain = if (sipContactsSelected.value == true) coreContext.core.defaultAccount?.params?.domain ?: "" else "" searchResultsPending = true fastFetchJob?.cancel() + coreContext.contactsManager.prepareVCardContacts() coreContext.contactsManager.magicSearch.getContactsListAsync( filterValue, domain, diff --git a/app/src/main/java/org/linphone/core/CorePreferences.kt b/app/src/main/java/org/linphone/core/CorePreferences.kt index e65c90932..eba48e42a 100644 --- a/app/src/main/java/org/linphone/core/CorePreferences.kt +++ b/app/src/main/java/org/linphone/core/CorePreferences.kt @@ -239,6 +239,9 @@ class CorePreferences constructor(private val context: Context) { /* Contacts */ + val contactsVCardList: String? + get() = config.getString("misc", "contacts-vcard-list", null) + var storePresenceInNativeContact: Boolean get() = config.getBool("app", "store_presence_in_native_contact", false) set(value) { diff --git a/app/src/main/res/layout/contact_master_fragment.xml b/app/src/main/res/layout/contact_master_fragment.xml index cd9dd2e14..37a07d1eb 100644 --- a/app/src/main/res/layout/contact_master_fragment.xml +++ b/app/src/main/res/layout/contact_master_fragment.xml @@ -156,12 +156,19 @@ android:layout_below="@id/searchBar" android:background="?attr/dividerColor" /> - + android:layout_height="match_parent"> + + + app:visibility="@{viewModel.fetchInProgress || viewModel.vcardsFetchInProgress}"/> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c21b13a67..8d90a37ca 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -117,6 +117,7 @@ This contact can\'t be deleted More results are available, refine your search You are about to create a new contact without a SIP URI nor a phone number, thus it won\'t be visible in &appName;.\n\nDo you want to create it anyway? + an error occured fetching vcard contacts. Enter a number or an address