From e4570f167da4b33362b324ebba1819c5d2bcaf2b Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 18 Mar 2025 14:00:22 +0100 Subject: [PATCH] Few tweaks trying to prevent jni global ref table overflow --- .../org/linphone/contacts/ContactLoader.kt | 32 ++++------- .../java/org/linphone/core/CorePreferences.kt | 4 ++ .../viewmodel/ContactNewOrEditViewModel.kt | 55 ++++++++----------- .../contacts/viewmodel/ContactViewModel.kt | 2 +- .../viewmodel/ContactsListViewModel.kt | 5 +- .../viewmodel/AddressSelectionViewModel.kt | 3 +- .../org/linphone/utils/PhoneNumberUtils.kt | 13 ----- 7 files changed, 45 insertions(+), 69 deletions(-) diff --git a/app/src/main/java/org/linphone/contacts/ContactLoader.kt b/app/src/main/java/org/linphone/contacts/ContactLoader.kt index 7c430f73f..7cdff06a2 100644 --- a/app/src/main/java/org/linphone/contacts/ContactLoader.kt +++ b/app/src/main/java/org/linphone/contacts/ContactLoader.kt @@ -219,14 +219,9 @@ class ContactLoader : LoaderManager.LoaderCallbacks { } if (!number.isNullOrEmpty()) { - if (friend.phoneNumbersWithLabel.find { - PhoneNumberUtils.arePhoneNumberWeakEqual(it.phoneNumber, number) - } == null - ) { - val phoneNumber = Factory.instance() - .createFriendPhoneNumber(number, label) - friend.addPhoneNumberWithLabel(phoneNumber) - } + val phoneNumber = Factory.instance() + .createFriendPhoneNumber(number, label) + friend.addPhoneNumberWithLabel(phoneNumber) } } ContactsContract.CommonDataKinds.SipAddress.CONTENT_ITEM_TYPE -> { @@ -250,17 +245,14 @@ class ContactLoader : LoaderManager.LoaderCallbacks { } } ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE -> { - val vCard = friend.vcard - if (vCard != null) { - val givenName: String? = cursor.getString(givenNameColumn) - if (!givenName.isNullOrEmpty()) { - vCard.givenName = givenName - } + val givenName: String? = cursor.getString(givenNameColumn) + if (!givenName.isNullOrEmpty()) { + friend.firstName = givenName + } - val familyName: String? = cursor.getString(familyNameColumn) - if (!familyName.isNullOrEmpty()) { - vCard.familyName = familyName - } + val familyName: String? = cursor.getString(familyNameColumn) + if (!familyName.isNullOrEmpty()) { + friend.lastName = familyName } } } @@ -291,7 +283,7 @@ class ContactLoader : LoaderManager.LoaderCallbacks { if (core.globalState == GlobalState.Shutdown || core.globalState == GlobalState.Off) { Log.w("$TAG Core is being stopped or already destroyed, abort") - } else if (friends.isEmpty) { + } else if (friends.isEmpty()) { Log.w("$TAG No friend created!") } else { Log.i("$TAG ${friends.size} friends fetched") @@ -322,7 +314,7 @@ class ContactLoader : LoaderManager.LoaderCallbacks { friends.remove(localFriend.refKey) localFriend.nativeUri = newlyFetchedFriend.nativeUri // Native URI isn't stored in linphone database, needs to be updated - if (newlyFetchedFriend.vcard?.asVcard4String() == localFriend.vcard?.asVcard4String()) continue + if (newlyFetchedFriend.dumpVcard() == localFriend.dumpVcard()) continue localFriend.edit() // Update basic fields that may have changed diff --git a/app/src/main/java/org/linphone/core/CorePreferences.kt b/app/src/main/java/org/linphone/core/CorePreferences.kt index d8f2de885..821d9fd7f 100644 --- a/app/src/main/java/org/linphone/core/CorePreferences.kt +++ b/app/src/main/java/org/linphone/core/CorePreferences.kt @@ -304,6 +304,10 @@ class CorePreferences val hideAssistantThirdPartySipAccount: Boolean get() = config.getBool("ui", "assistant_hide_third_party_account", false) + @get:WorkerThread + val magicSearchResultsLimit: Int + get() = config.getInt("ui", "max_number_of_magic_search_results", 1000) + @get:WorkerThread val singleSignOnClientId: String get() = config.getString("app", "oidc_client_id", "linphone")!! diff --git a/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactNewOrEditViewModel.kt b/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactNewOrEditViewModel.kt index 05aecb53a..c50f21f05 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactNewOrEditViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactNewOrEditViewModel.kt @@ -97,13 +97,8 @@ class ContactNewOrEditViewModel if (exists) { Log.i("$TAG Found friend [${friend.name}] using ref key [$refKey]") - val vCard = friend.vcard - if (vCard != null) { - firstName.postValue(vCard.givenName) - lastName.postValue(vCard.familyName) - } else { - // TODO: What to do if vCard is null? - } + firstName.postValue(friend.firstName.orEmpty()) + lastName.postValue(friend.lastName.orEmpty()) id.postValue(friend.refKey ?: friend.vcard?.uid) @@ -169,33 +164,29 @@ class ContactNewOrEditViewModel friend.edit() friend.name = name + friend.firstName = fn + friend.lastName = ln - val vCard = friend.vcard - if (vCard != null) { - vCard.givenName = fn - vCard.familyName = ln - - val picture = picturePath.value.orEmpty() - if (picture.isNotEmpty()) { - if (picture.contains(TEMP_PICTURE_NAME)) { - val newFile = FileUtils.getFileStoragePath( - getPictureFileName(), - isImage = true, - overrideExisting = true - ) - val oldFile = FileUtils.getProperFilePath(picture).toUri() - viewModelScope.launch { - FileUtils.copyFile(oldFile, newFile) - } - val newPicture = FileUtils.getProperFilePath(newFile.absolutePath) - Log.i("$TAG Temporary picture [$picture] copied to [$newPicture]") - friend.photo = newPicture - } else { - friend.photo = FileUtils.getProperFilePath(picture) + val picture = picturePath.value.orEmpty() + if (picture.isNotEmpty()) { + if (picture.contains(TEMP_PICTURE_NAME)) { + val newFile = FileUtils.getFileStoragePath( + getPictureFileName(), + isImage = true, + overrideExisting = true + ) + val oldFile = FileUtils.getProperFilePath(picture).toUri() + viewModelScope.launch { + FileUtils.copyFile(oldFile, newFile) } + val newPicture = FileUtils.getProperFilePath(newFile.absolutePath) + Log.i("$TAG Temporary picture [$picture] copied to [$newPicture]") + friend.photo = newPicture } else { - friend.photo = null + friend.photo = FileUtils.getProperFilePath(picture) } + } else { + friend.photo = null } friend.organization = organization @@ -327,8 +318,8 @@ class ContactNewOrEditViewModel @UiThread fun isPendingChanges(): Boolean { if (isEdit.value == true) { - if (firstName.value.orEmpty() != friend.vcard?.givenName.orEmpty()) return true - if (lastName.value.orEmpty() != friend.vcard?.familyName.orEmpty()) return true + if (firstName.value.orEmpty() != friend.firstName.orEmpty()) return true + if (lastName.value.orEmpty() != friend.lastName.orEmpty()) return true if (picturePath.value.orEmpty() != friend.photo.orEmpty()) return true if (company.value.orEmpty() != friend.organization.orEmpty()) return true if (jobTitle.value.orEmpty() != friend.jobTitle.orEmpty()) return true diff --git a/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactViewModel.kt b/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactViewModel.kt index 7cbb7090e..a4a3c5c40 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactViewModel.kt @@ -369,7 +369,7 @@ class ContactViewModel fun exportContactAsVCard() { coreContext.postOnCoreThread { if (::friend.isInitialized) { - val vCard = friend.vcard?.asVcard4String() + val vCard = friend.dumpVcard() if (!vCard.isNullOrEmpty()) { Log.i("$TAG Friend has been successfully dumped as vCard string") val fileName = friend.name.orEmpty().replace(" ", "_").lowercase( diff --git a/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactsListViewModel.kt b/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactsListViewModel.kt index 13b28858f..7ceb7d225 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactsListViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactsListViewModel.kt @@ -109,7 +109,8 @@ class ContactsListViewModel coreContext.contactsManager.addListener(contactsListener) magicSearch = core.createMagicSearch() - magicSearch.limitedSearch = false + magicSearch.limitedSearch = true + magicSearch.searchLimit = corePreferences.magicSearchResultsLimit magicSearch.addListener(magicSearchListener) coreContext.postOnMainThread { @@ -197,7 +198,7 @@ class ContactsListViewModel @UiThread fun exportContactAsVCard(friend: Friend) { coreContext.postOnCoreThread { - val vCard = friend.vcard?.asVcard4String() + val vCard = friend.dumpVcard() if (!vCard.isNullOrEmpty()) { Log.i("$TAG Friend has been successfully dumped as vCard string") val fileName = friend.name.orEmpty().replace(" ", "_").lowercase( diff --git a/app/src/main/java/org/linphone/ui/main/viewmodel/AddressSelectionViewModel.kt b/app/src/main/java/org/linphone/ui/main/viewmodel/AddressSelectionViewModel.kt index fae45f014..c095029ba 100644 --- a/app/src/main/java/org/linphone/ui/main/viewmodel/AddressSelectionViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/viewmodel/AddressSelectionViewModel.kt @@ -104,7 +104,8 @@ abstract class AddressSelectionViewModel coreContext.contactsManager.addListener(contactsListener) magicSearch = core.createMagicSearch() - magicSearch.limitedSearch = false + magicSearch.limitedSearch = true + magicSearch.searchLimit = corePreferences.magicSearchResultsLimit magicSearch.addListener(magicSearchListener) } diff --git a/app/src/main/java/org/linphone/utils/PhoneNumberUtils.kt b/app/src/main/java/org/linphone/utils/PhoneNumberUtils.kt index cf7e76001..47715ae50 100644 --- a/app/src/main/java/org/linphone/utils/PhoneNumberUtils.kt +++ b/app/src/main/java/org/linphone/utils/PhoneNumberUtils.kt @@ -117,18 +117,5 @@ class PhoneNumberUtils { else -> ContactsContract.CommonDataKinds.BaseTypes.TYPE_CUSTOM } } - - @AnyThread - fun arePhoneNumberWeakEqual(number1: String, number2: String): Boolean { - return trimPhoneNumber(number1) == trimPhoneNumber(number2) - } - - @AnyThread - private fun trimPhoneNumber(phoneNumber: String): String { - return phoneNumber.replace(" ", "") - .replace("-", "") - .replace("(", "") - .replace(")", "") - } } }