From 2c091589779851c387bdc9f80212b60a73291be2 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Mon, 19 Aug 2024 11:59:33 +0200 Subject: [PATCH] Added a way to choose which friend list to use to store newly created contacts into (for CardDAV friend list for example) --- .../java/org/linphone/core/CorePreferences.kt | 11 +++++ .../viewmodel/ContactNewOrEditViewModel.kt | 40 ++++++++++++++--- .../settings/viewmodel/CardDavViewModel.kt | 43 +++++++++++++++++-- .../res/layout/settings_contacts_carddav.xml | 26 +++++++++++ app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 6 files changed, 112 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/linphone/core/CorePreferences.kt b/app/src/main/java/org/linphone/core/CorePreferences.kt index b0594e278..de9f86596 100644 --- a/app/src/main/java/org/linphone/core/CorePreferences.kt +++ b/app/src/main/java/org/linphone/core/CorePreferences.kt @@ -26,6 +26,7 @@ import androidx.annotation.WorkerThread import java.io.File import java.io.FileOutputStream import org.linphone.LinphoneApplication.Companion.coreContext +import org.linphone.contacts.ContactLoader.Companion.LINPHONE_ADDRESS_BOOK_FRIEND_LIST class CorePreferences @UiThread constructor(private val context: Context) { companion object { @@ -129,6 +130,16 @@ class CorePreferences @UiThread constructor(private val context: Context) { config.setBool("ui", "show_favorites_contacts", value) } + var friendListInWhichStoreNewlyCreatedFriends: String + get() = config.getString( + "app", + "friend_list_to_store_newly_created_contacts", + LINPHONE_ADDRESS_BOOK_FRIEND_LIST + )!! + set(value) { + config.setString("app", "friend_list_to_store_newly_created_contacts", value) + } + /* Voice recordings related */ @get:WorkerThread @set:WorkerThread 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 d558ce874..f07f65424 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 @@ -27,11 +27,13 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope import kotlinx.coroutines.launch import org.linphone.LinphoneApplication.Companion.coreContext +import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.R import org.linphone.contacts.ContactLoader.Companion.LINPHONE_ADDRESS_BOOK_FRIEND_LIST import org.linphone.core.Address import org.linphone.core.Factory import org.linphone.core.Friend +import org.linphone.core.FriendList import org.linphone.core.FriendList.Status import org.linphone.core.FriendPhoneNumber import org.linphone.core.SubscribePolicy @@ -224,18 +226,44 @@ class ContactNewOrEditViewModel @UiThread constructor() : GenericViewModel() { friend.done() - val fl = core.getFriendListByName(LINPHONE_ADDRESS_BOOK_FRIEND_LIST) ?: core.createFriendList() - if (fl.displayName.isNullOrEmpty()) { - Log.i( - "$TAG Locally saved friend list [$LINPHONE_ADDRESS_BOOK_FRIEND_LIST] didn't exist yet, let's create it" - ) + val friendListNameToStoreFriends = corePreferences.friendListInWhichStoreNewlyCreatedFriends + Log.i( + "$TAG Looking for friend list with name [$friendListNameToStoreFriends] to use to store newly created contact" + ) + val friendList = core.getFriendListByName(friendListNameToStoreFriends) ?: core.getFriendListByName( + LINPHONE_ADDRESS_BOOK_FRIEND_LIST + ) + val fl = friendList ?: core.createFriendList() + if (friendList == null) { + if (friendListNameToStoreFriends != LINPHONE_ADDRESS_BOOK_FRIEND_LIST) { + Log.w( + "$TAG Locally saved friend list [$friendListNameToStoreFriends] didn't exist yet (nor [$LINPHONE_ADDRESS_BOOK_FRIEND_LIST]), let's create it" + ) + } else { + Log.w( + "$TAG Locally saved friend list [$friendListNameToStoreFriends] didn't exist yet, let's create it" + ) + } fl.isDatabaseStorageEnabled = true // We do want to store friends created in app in DB fl.displayName = LINPHONE_ADDRESS_BOOK_FRIEND_LIST core.addFriendList(fl) } status = fl.addFriend(friend) - fl.updateSubscriptions() + if (status == Status.OK) { + Log.i("$TAG Contact successfully created, updating subscriptions") + fl.updateSubscriptions() + + if (fl.type == FriendList.Type.CardDAV) { + Log.i( + "$TAG Contact successfully created into CardDAV friend list, synchronizing it" + ) + fl.synchronizeFriendsFromServer() + } + } else { + Log.e("$TAG Failed to add contact to friend list [${fl.displayName}]!") + } } else { + Log.i("$TAG Finished applying changes to existing friend") friend.done() } diff --git a/app/src/main/java/org/linphone/ui/main/settings/viewmodel/CardDavViewModel.kt b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/CardDavViewModel.kt index 5193b96c3..0e4a263f0 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/viewmodel/CardDavViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/CardDavViewModel.kt @@ -23,7 +23,9 @@ import androidx.annotation.UiThread import androidx.annotation.WorkerThread import androidx.lifecycle.MutableLiveData import org.linphone.LinphoneApplication.Companion.coreContext +import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.R +import org.linphone.contacts.ContactLoader.Companion.LINPHONE_ADDRESS_BOOK_FRIEND_LIST import org.linphone.core.Factory import org.linphone.core.FriendList import org.linphone.core.FriendListListenerStub @@ -31,7 +33,7 @@ import org.linphone.core.tools.Log import org.linphone.ui.GenericViewModel import org.linphone.utils.Event -class CardDavViewModel : GenericViewModel() { +class CardDavViewModel @UiThread constructor() : GenericViewModel() { companion object { private const val TAG = "[CardDAV ViewModel]" } @@ -52,9 +54,15 @@ class CardDavViewModel : GenericViewModel() { val syncInProgress = MutableLiveData() - val syncSuccessfulEvent = MutableLiveData>() + val storeNewContactsInIt = MutableLiveData() - val friendListRemovedEvent = MutableLiveData>() + val syncSuccessfulEvent: MutableLiveData> by lazy { + MutableLiveData>() + } + + val friendListRemovedEvent: MutableLiveData> by lazy { + MutableLiveData>() + } private lateinit var friendList: FriendList @@ -110,6 +118,7 @@ class CardDavViewModel : GenericViewModel() { isEdit.value = false showPassword.value = false syncInProgress.value = false + storeNewContactsInIt.value = false } override fun onCleared() { @@ -134,6 +143,9 @@ class CardDavViewModel : GenericViewModel() { friendList.addListener(friendListListener) displayName.postValue(name) + storeNewContactsInIt.postValue( + name == corePreferences.friendListInWhichStoreNewlyCreatedFriends + ) serverUrl.postValue(friendList.uri) Log.i("$TAG Existing friend list CardDAV values loaded") } @@ -144,6 +156,12 @@ class CardDavViewModel : GenericViewModel() { coreContext.postOnCoreThread { core -> if (isEdit.value == true && ::friendList.isInitialized) { val name = friendList.displayName + if (name == corePreferences.friendListInWhichStoreNewlyCreatedFriends) { + Log.i( + "$TAG Deleting friend list configured to be used to store newly created friends, updating default friend list back to [$LINPHONE_ADDRESS_BOOK_FRIEND_LIST]" + ) + corePreferences.friendListInWhichStoreNewlyCreatedFriends = LINPHONE_ADDRESS_BOOK_FRIEND_LIST + } core.removeFriendList(friendList) Log.i("$TAG Removed friends list with display name [$name]") showGreenToastEvent.postValue( @@ -225,7 +243,11 @@ class CardDavViewModel : GenericViewModel() { friendList = core.createFriendList() friendList.displayName = name friendList.type = FriendList.Type.CardDAV - friendList.uri = server + friendList.uri = if (server.startsWith("http://") || server.startsWith("https://")) { + server + } else { + "https://$server" + } friendList.isDatabaseStorageEnabled = true friendList.addListener(friendListListener) core.addFriendList(friendList) @@ -235,6 +257,19 @@ class CardDavViewModel : GenericViewModel() { ) } + if (storeNewContactsInIt.value == true) { + val previous = corePreferences.friendListInWhichStoreNewlyCreatedFriends + Log.i( + "$TAG Updating default friend list to store newly created contacts from [$previous] to [$name]" + ) + corePreferences.friendListInWhichStoreNewlyCreatedFriends = name + } else if (storeNewContactsInIt.value == false) { + Log.i( + "$TAG No longer using friend list [$name] as default friend list, switching back to [$LINPHONE_ADDRESS_BOOK_FRIEND_LIST]" + ) + corePreferences.friendListInWhichStoreNewlyCreatedFriends = LINPHONE_ADDRESS_BOOK_FRIEND_LIST + } + syncInProgress.postValue(true) friendList.synchronizeFriendsFromServer() } diff --git a/app/src/main/res/layout/settings_contacts_carddav.xml b/app/src/main/res/layout/settings_contacts_carddav.xml index 3529c9b1f..ce80ad71d 100644 --- a/app/src/main/res/layout/settings_contacts_carddav.xml +++ b/app/src/main/res/layout/settings_contacts_carddav.xml @@ -251,6 +251,32 @@ app:layout_constraintTop_toBottomOf="@id/realm_title" app:layout_constraintBottom_toBottomOf="parent"/> + + + + diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index b7fc0d674..57fa41b1d 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -195,6 +195,7 @@ Nom d\'utilisateur Mot de passe Domaine d\'authentification + Stocker ici les contacts nouvellement crées Synchronization réussie Erreur de synchronization ! Compte CardDAV supprimé diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8d9c60cc7..061e8f448 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -232,6 +232,7 @@ Username Password Auth realm + Store newly created contacts in it Synchronization was successful Synchronization error! CardDAV account removed