Fixed issues with contact creation & removal
This commit is contained in:
parent
69618141f2
commit
4c30e385f0
6 changed files with 59 additions and 8 deletions
|
@ -84,6 +84,7 @@ class ContactEditorFragment : Fragment() {
|
||||||
binding.setSaveChangesClickListener {
|
binding.setSaveChangesClickListener {
|
||||||
val savedContact = viewModel.save()
|
val savedContact = viewModel.save()
|
||||||
if (savedContact is NativeContact) {
|
if (savedContact is NativeContact) {
|
||||||
|
savedContact.syncValuesFromAndroidContact(requireContext())
|
||||||
val deepLink = "linphone-android://contact/view/${savedContact.nativeId}"
|
val deepLink = "linphone-android://contact/view/${savedContact.nativeId}"
|
||||||
Log.i("[Contact Editor] Displaying contact, starting deep link: $deepLink")
|
Log.i("[Contact Editor] Displaying contact, starting deep link: $deepLink")
|
||||||
findNavController().navigate(Uri.parse(deepLink))
|
findNavController().navigate(Uri.parse(deepLink))
|
||||||
|
|
|
@ -115,6 +115,11 @@ class DetailContactFragment : Fragment() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
binding.setDeleteClickListener {
|
||||||
|
viewModel.deleteContact()
|
||||||
|
findNavController().navigateUp()
|
||||||
|
}
|
||||||
|
|
||||||
viewModel.onErrorEvent.observe(viewLifecycleOwner, Observer {
|
viewModel.onErrorEvent.observe(viewLifecycleOwner, Observer {
|
||||||
it.consume { messageResourceId ->
|
it.consume { messageResourceId ->
|
||||||
(activity as MainActivity).showSnackBar(messageResourceId)
|
(activity as MainActivity).showSnackBar(messageResourceId)
|
||||||
|
|
|
@ -169,15 +169,17 @@ class MasterContactsFragment : MasterFragment() {
|
||||||
} else {
|
} else {
|
||||||
// When trying to display a non-native contact from history
|
// When trying to display a non-native contact from history
|
||||||
val addressString = arguments?.getString("address")
|
val addressString = arguments?.getString("address")
|
||||||
val address = Factory.instance().createAddress(addressString)
|
if (addressString != null) {
|
||||||
if (address != null) {
|
val address = Factory.instance().createAddress(addressString)
|
||||||
Log.i("[Contacts] Found friend native pointer parameter in arguments: ${address.asStringUriOnly()}")
|
if (address != null) {
|
||||||
arguments?.clear()
|
Log.i("[Contacts] Found friend native pointer parameter in arguments: ${address.asStringUriOnly()}")
|
||||||
|
arguments?.clear()
|
||||||
|
|
||||||
val contact = coreContext.contactsManager.findContactByAddress(address)
|
val contact = coreContext.contactsManager.findContactByAddress(address)
|
||||||
if (contact != null) {
|
if (contact != null) {
|
||||||
Log.i("[Contacts] Found matching contact $contact")
|
Log.i("[Contacts] Found matching contact $contact")
|
||||||
adapter.selectedContactEvent.value = Event(contact)
|
adapter.selectedContactEvent.value = Event(contact)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -78,7 +78,9 @@ class ContactEditorViewModel(val c: Contact?) : ViewModel(), ContactViewModelInt
|
||||||
|
|
||||||
fun save(): Contact {
|
fun save(): Contact {
|
||||||
var contact = c
|
var contact = c
|
||||||
|
var created = false
|
||||||
if (contact == null) {
|
if (contact == null) {
|
||||||
|
created = true
|
||||||
contact = if (PermissionHelper.get().hasWriteContactsPermission()) {
|
contact = if (PermissionHelper.get().hasWriteContactsPermission()) {
|
||||||
NativeContact(AppUtils.createAndroidContact().toString())
|
NativeContact(AppUtils.createAndroidContact().toString())
|
||||||
} else {
|
} else {
|
||||||
|
@ -107,6 +109,10 @@ class ContactEditorViewModel(val c: Contact?) : ViewModel(), ContactViewModelInt
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (created) {
|
||||||
|
coreContext.contactsManager.addContact(contact)
|
||||||
|
}
|
||||||
return contact
|
return contact
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,8 @@
|
||||||
*/
|
*/
|
||||||
package org.linphone.activities.main.contact.viewmodels
|
package org.linphone.activities.main.contact.viewmodels
|
||||||
|
|
||||||
|
import android.content.ContentProviderOperation
|
||||||
|
import android.provider.ContactsContract
|
||||||
import androidx.lifecycle.MutableLiveData
|
import androidx.lifecycle.MutableLiveData
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.ViewModelProvider
|
import androidx.lifecycle.ViewModelProvider
|
||||||
|
@ -129,6 +131,36 @@ class ContactViewModel(private val c: Contact) : ErrorReportingViewModel(), Cont
|
||||||
super.onCleared()
|
super.onCleared()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun deleteContact() {
|
||||||
|
val select = ContactsContract.Data.CONTACT_ID + " = ?"
|
||||||
|
val ops = java.util.ArrayList<ContentProviderOperation>()
|
||||||
|
|
||||||
|
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() {
|
private fun updateNumbersAndAddresses() {
|
||||||
val list = arrayListOf<ContactNumberOrAddressViewModel>()
|
val list = arrayListOf<ContactNumberOrAddressViewModel>()
|
||||||
for (address in c.sipAddresses) {
|
for (address in c.sipAddresses) {
|
||||||
|
|
|
@ -117,6 +117,11 @@ class ContactsManager(private val context: Context) {
|
||||||
loadContactsTask?.executeOnExecutor(THREAD_POOL_EXECUTOR)
|
loadContactsTask?.executeOnExecutor(THREAD_POOL_EXECUTOR)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Synchronized
|
||||||
|
fun addContact(contact: Contact) {
|
||||||
|
contacts.add(contact)
|
||||||
|
}
|
||||||
|
|
||||||
@Synchronized
|
@Synchronized
|
||||||
fun updateContacts(all: ArrayList<Contact>, sip: ArrayList<Contact>) {
|
fun updateContacts(all: ArrayList<Contact>, sip: ArrayList<Contact>) {
|
||||||
contacts.clear()
|
contacts.clear()
|
||||||
|
|
Loading…
Reference in a new issue