From 4c30e385f0e47fe5b19b9de3eb034bbb9c7ed4e6 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Sun, 5 Apr 2020 18:57:04 +0200 Subject: [PATCH] Fixed issues with contact creation & removal --- .../fragments/ContactEditorFragment.kt | 1 + .../fragments/DetailContactFragment.kt | 5 +++ .../fragments/MasterContactsFragment.kt | 18 ++++++----- .../viewmodels/ContactEditorViewModel.kt | 6 ++++ .../contact/viewmodels/ContactViewModel.kt | 32 +++++++++++++++++++ .../org/linphone/contact/ContactsManager.kt | 5 +++ 6 files changed, 59 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/linphone/activities/main/contact/fragments/ContactEditorFragment.kt b/app/src/main/java/org/linphone/activities/main/contact/fragments/ContactEditorFragment.kt index 9480f004c..ec56410d0 100644 --- a/app/src/main/java/org/linphone/activities/main/contact/fragments/ContactEditorFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/contact/fragments/ContactEditorFragment.kt @@ -84,6 +84,7 @@ class ContactEditorFragment : Fragment() { binding.setSaveChangesClickListener { val savedContact = viewModel.save() if (savedContact is NativeContact) { + savedContact.syncValuesFromAndroidContact(requireContext()) val deepLink = "linphone-android://contact/view/${savedContact.nativeId}" Log.i("[Contact Editor] Displaying contact, starting deep link: $deepLink") findNavController().navigate(Uri.parse(deepLink)) diff --git a/app/src/main/java/org/linphone/activities/main/contact/fragments/DetailContactFragment.kt b/app/src/main/java/org/linphone/activities/main/contact/fragments/DetailContactFragment.kt index 8c7d49437..925c68fdc 100644 --- a/app/src/main/java/org/linphone/activities/main/contact/fragments/DetailContactFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/contact/fragments/DetailContactFragment.kt @@ -115,6 +115,11 @@ class DetailContactFragment : Fragment() { } } + binding.setDeleteClickListener { + viewModel.deleteContact() + findNavController().navigateUp() + } + viewModel.onErrorEvent.observe(viewLifecycleOwner, Observer { it.consume { messageResourceId -> (activity as MainActivity).showSnackBar(messageResourceId) 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 031ecbd4c..0896ff9a6 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 @@ -169,15 +169,17 @@ class MasterContactsFragment : MasterFragment() { } else { // When trying to display a non-native contact from history val addressString = arguments?.getString("address") - val address = Factory.instance().createAddress(addressString) - if (address != null) { - Log.i("[Contacts] Found friend native pointer parameter in arguments: ${address.asStringUriOnly()}") - arguments?.clear() + if (addressString != null) { + val address = Factory.instance().createAddress(addressString) + if (address != null) { + Log.i("[Contacts] Found friend native pointer parameter in arguments: ${address.asStringUriOnly()}") + arguments?.clear() - val contact = coreContext.contactsManager.findContactByAddress(address) - if (contact != null) { - Log.i("[Contacts] Found matching contact $contact") - adapter.selectedContactEvent.value = Event(contact) + val contact = coreContext.contactsManager.findContactByAddress(address) + if (contact != null) { + Log.i("[Contacts] Found matching contact $contact") + adapter.selectedContactEvent.value = Event(contact) + } } } } diff --git a/app/src/main/java/org/linphone/activities/main/contact/viewmodels/ContactEditorViewModel.kt b/app/src/main/java/org/linphone/activities/main/contact/viewmodels/ContactEditorViewModel.kt index 46edd12a4..9aaec73ed 100644 --- a/app/src/main/java/org/linphone/activities/main/contact/viewmodels/ContactEditorViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/contact/viewmodels/ContactEditorViewModel.kt @@ -78,7 +78,9 @@ class ContactEditorViewModel(val c: Contact?) : ViewModel(), ContactViewModelInt fun save(): Contact { var contact = c + var created = false if (contact == null) { + created = true contact = if (PermissionHelper.get().hasWriteContactsPermission()) { NativeContact(AppUtils.createAndroidContact().toString()) } else { @@ -107,6 +109,10 @@ class ContactEditorViewModel(val c: Contact?) : ViewModel(), ContactViewModelInt } } } + + if (created) { + coreContext.contactsManager.addContact(contact) + } return contact } diff --git a/app/src/main/java/org/linphone/activities/main/contact/viewmodels/ContactViewModel.kt b/app/src/main/java/org/linphone/activities/main/contact/viewmodels/ContactViewModel.kt index db285871d..395ae1a06 100644 --- a/app/src/main/java/org/linphone/activities/main/contact/viewmodels/ContactViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/contact/viewmodels/ContactViewModel.kt @@ -19,6 +19,8 @@ */ package org.linphone.activities.main.contact.viewmodels +import android.content.ContentProviderOperation +import android.provider.ContactsContract import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider @@ -129,6 +131,36 @@ class ContactViewModel(private val c: Contact) : ErrorReportingViewModel(), Cont super.onCleared() } + fun deleteContact() { + val select = ContactsContract.Data.CONTACT_ID + " = ?" + val ops = java.util.ArrayList() + + if (c is NativeContact) { + val nativeContact: NativeContact = c + Log.i("[Contact] Setting Android contact id ${nativeContact.nativeId} to batch removal") + val args = arrayOf(nativeContact.nativeId) + ops.add( + ContentProviderOperation.newDelete(ContactsContract.RawContacts.CONTENT_URI) + .withSelection(select, args) + .build() + ) + } + + if (c.friend != null) { + Log.i("[Contact] Removing friend") + c.friend?.remove() + } + + if (ops.isNotEmpty()) { + try { + Log.i("[Contact] Removing ${ops.size} contacts") + coreContext.context.contentResolver.applyBatch(ContactsContract.AUTHORITY, ops) + } catch (e: Exception) { + Log.e("[Contact] $e") + } + } + } + private fun updateNumbersAndAddresses() { val list = arrayListOf() for (address in c.sipAddresses) { diff --git a/app/src/main/java/org/linphone/contact/ContactsManager.kt b/app/src/main/java/org/linphone/contact/ContactsManager.kt index b25590132..31da3672b 100644 --- a/app/src/main/java/org/linphone/contact/ContactsManager.kt +++ b/app/src/main/java/org/linphone/contact/ContactsManager.kt @@ -117,6 +117,11 @@ class ContactsManager(private val context: Context) { loadContactsTask?.executeOnExecutor(THREAD_POOL_EXECUTOR) } + @Synchronized + fun addContact(contact: Contact) { + contacts.add(contact) + } + @Synchronized fun updateContacts(all: ArrayList, sip: ArrayList) { contacts.clear()