Fixed contact edition

This commit is contained in:
Sylvain Berfini 2018-09-12 13:17:00 +02:00
parent 9ff8d854ae
commit 8b5a52a8b1
3 changed files with 67 additions and 41 deletions

View file

@ -148,7 +148,7 @@ public class ContactEditorFragment extends Fragment {
} }
contact = LinphoneContact.createContact(); contact = LinphoneContact.createContact();
} }
contact.setFirstNameAndLastName(firstName.getText().toString(), lastName.getText().toString()); contact.setFirstNameAndLastName(firstName.getText().toString(), lastName.getText().toString(), true);
if (photoToAdd != null) { if (photoToAdd != null) {
contact.setPhoto(photoToAdd); contact.setPhoto(photoToAdd);
} }
@ -158,7 +158,7 @@ public class ContactEditorFragment extends Fragment {
} }
contact.addOrUpdateNumberOrAddress(noa); contact.addOrUpdateNumberOrAddress(noa);
} }
contact.setOrganization(organization.getText().toString()); contact.setOrganization(organization.getText().toString(), true);
contact.save(); contact.save();
getFragmentManager().popBackStackImmediate(); getFragmentManager().popBackStackImmediate();
} }
@ -282,7 +282,7 @@ public class ContactEditorFragment extends Fragment {
} }
}); });
numbersAndAddresses = new ArrayList<LinphoneNumberOrAddress>(); numbersAndAddresses = new ArrayList<>();
sipAddresses = initSipAddressFields(contact); sipAddresses = initSipAddressFields(contact);
numbers = initNumbersFields(contact); numbers = initNumbersFields(contact);

View file

@ -466,9 +466,9 @@ public class ContactsManager extends ContentObserver implements FriendListListen
sipContacts.add(contact); sipContacts.add(contact);
} }
} else if (ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE.equals(mime)) { } else if (ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE.equals(mime)) {
contact.setOrganization(data1); contact.setOrganization(data1, false);
} else if (ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE.equals(mime)) { } else if (ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE.equals(mime)) {
contact.setFirstNameAndLastName(data2, data3); contact.setFirstNameAndLastName(data2, data3, false);
} }
if (created && !contacts.contains(contact)) { if (created && !contacts.contains(contact)) {

View file

@ -81,6 +81,14 @@ public class LinphoneContact implements Serializable, Comparable<LinphoneContact
return (this.compareTo(contact) == 0); return (this.compareTo(contact) == 0);
} }
private void addChangesToCommit(ContentProviderOperation operation, boolean doItAfterAccountCreation) {
if (doItAfterAccountCreation) {
changesToCommit2.add(operation);
} else {
changesToCommit.add(operation);
}
}
public void setFullName(String name) { public void setFullName(String name) {
fullName = name; fullName = name;
} }
@ -89,28 +97,30 @@ public class LinphoneContact implements Serializable, Comparable<LinphoneContact
return fullName; return fullName;
} }
public void setFirstNameAndLastName(String fn, String ln) { public void setFirstNameAndLastName(String fn, String ln, boolean commitChanges) {
if (fn != null && fn.length() == 0 && ln != null && ln.length() == 0) return; if (fn != null && fn.length() == 0 && ln != null && ln.length() == 0) return;
if (fn != null && fn.equals(firstName) && ln != null && ln.equals(lastName)) return;
if (isAndroidContact()) { if (isAndroidContact() && commitChanges) {
if (firstName != null || lastName != null) { if (firstName != null || lastName != null) {
String select = ContactsContract.Data.CONTACT_ID + "=? AND " + ContactsContract.Data.MIMETYPE + "='" + ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE + "'"; String select = ContactsContract.Data.CONTACT_ID + "=? AND " + ContactsContract.Data.MIMETYPE + "='" + ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE + "'";
String[] args = new String[]{getAndroidId()}; String[] args = new String[]{getAndroidId()};
changesToCommit.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) addChangesToCommit(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
.withSelection(select, args) .withSelection(select, args)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, fn) .withValue(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, fn)
.withValue(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, ln) .withValue(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, ln)
.build() .build()
); , false);
} else { } else {
changesToCommit.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) addChangesToCommit(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, fn) .withValue(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, fn)
.withValue(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, ln) .withValue(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, ln)
.build()); .build()
, false);
} }
} }
@ -137,31 +147,36 @@ public class LinphoneContact implements Serializable, Comparable<LinphoneContact
return organization; return organization;
} }
public void setOrganization(String org) { public void setOrganization(String org, boolean commitChanges) {
if (isAndroidContact()) { if (org != null && org.equals(organization)) return;
if (isAndroidContact() && commitChanges) {
if (androidRawId != null) { if (androidRawId != null) {
String select = ContactsContract.Data.CONTACT_ID + "=? AND " + ContactsContract.Data.MIMETYPE + "='" + ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE + "'"; String select = ContactsContract.Data.CONTACT_ID + "=? AND " + ContactsContract.Data.MIMETYPE + "='" + ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE + "'";
String[] args = new String[]{getAndroidId()}; String[] args = new String[]{getAndroidId()};
if (organization != null) { if (organization != null) {
changesToCommit.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) addChangesToCommit(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
.withSelection(select, args) .withSelection(select, args)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE) .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Organization.COMPANY, org) .withValue(ContactsContract.CommonDataKinds.Organization.COMPANY, org)
.build()); .build()
, false);
} else { } else {
changesToCommit.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) addChangesToCommit(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValue(ContactsContract.Data.RAW_CONTACT_ID, androidRawId) .withValue(ContactsContract.Data.RAW_CONTACT_ID, androidRawId)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE) .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Organization.COMPANY, org) .withValue(ContactsContract.CommonDataKinds.Organization.COMPANY, org)
.build()); .build()
, false);
} }
} else { } else {
changesToCommit.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) addChangesToCommit(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE) .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Organization.COMPANY, org) .withValue(ContactsContract.CommonDataKinds.Organization.COMPANY, org)
.build()); .build()
, false);
} }
} }
@ -194,19 +209,21 @@ public class LinphoneContact implements Serializable, Comparable<LinphoneContact
if (photo != null) { if (photo != null) {
if (isAndroidContact()) { if (isAndroidContact()) {
if (androidRawId != null) { if (androidRawId != null) {
changesToCommit.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) addChangesToCommit(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValue(ContactsContract.Data.RAW_CONTACT_ID, androidRawId) .withValue(ContactsContract.Data.RAW_CONTACT_ID, androidRawId)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE) .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, photo) .withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, photo)
.withValue(ContactsContract.Data.IS_PRIMARY, 1) .withValue(ContactsContract.Data.IS_PRIMARY, 1)
.withValue(ContactsContract.Data.IS_SUPER_PRIMARY, 1) .withValue(ContactsContract.Data.IS_SUPER_PRIMARY, 1)
.build()); .build()
, false);
} else { } else {
changesToCommit.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) addChangesToCommit(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE) .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, photo) .withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, photo)
.build()); .build()
, false);
} }
} }
} }
@ -247,9 +264,10 @@ public class LinphoneContact implements Serializable, Comparable<LinphoneContact
String select = ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + ContactsContract.Data.DATA1 + "=?"; String select = ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + ContactsContract.Data.DATA1 + "=?";
String[] args = new String[]{androidTagId, noa.getOldValue()}; String[] args = new String[]{androidTagId, noa.getOldValue()};
changesToCommit.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) addChangesToCommit(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI)
.withSelection(select, args) .withSelection(select, args)
.build()); .build()
, false);
} else { } else {
String select; String select;
if (noa.isSIPAddress()) { if (noa.isSIPAddress()) {
@ -259,9 +277,10 @@ public class LinphoneContact implements Serializable, Comparable<LinphoneContact
} }
String[] args = new String[]{getAndroidId(), noa.getOldValue()}; String[] args = new String[]{getAndroidId(), noa.getOldValue()};
changesToCommit.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) addChangesToCommit(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI)
.withSelection(select, args) .withSelection(select, args)
.build()); .build()
, false);
} }
} }
@ -291,21 +310,23 @@ public class LinphoneContact implements Serializable, Comparable<LinphoneContact
if (noa.getOldValue() == null) { if (noa.getOldValue() == null) {
if (noa.isSIPAddress() && LinphoneManager.getInstance().getContext().getResources().getBoolean(R.bool.use_linphone_tag)) { if (noa.isSIPAddress() && LinphoneManager.getInstance().getContext().getResources().getBoolean(R.bool.use_linphone_tag)) {
if (androidTagId != null) { if (androidTagId != null) {
changesToCommit.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) addChangesToCommit(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValue(ContactsContract.Data.RAW_CONTACT_ID, androidTagId) .withValue(ContactsContract.Data.RAW_CONTACT_ID, androidTagId)
.withValue(ContactsContract.Data.MIMETYPE, ContactsManager.getInstance().getString(R.string.sync_mimetype)) .withValue(ContactsContract.Data.MIMETYPE, ContactsManager.getInstance().getString(R.string.sync_mimetype))
.withValue(ContactsContract.Data.DATA1, noa.getValue()) .withValue(ContactsContract.Data.DATA1, noa.getValue())
.withValue(ContactsContract.Data.DATA2, ContactsManager.getInstance().getString(R.string.app_name)) .withValue(ContactsContract.Data.DATA2, ContactsManager.getInstance().getString(R.string.app_name))
.withValue(ContactsContract.Data.DATA3, noa.getValue()) .withValue(ContactsContract.Data.DATA3, noa.getValue())
.build()); .build()
, false);
} else { } else {
changesToCommit2.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) addChangesToCommit(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(ContactsContract.Data.MIMETYPE, ContactsManager.getInstance().getString(R.string.sync_mimetype)) .withValue(ContactsContract.Data.MIMETYPE, ContactsManager.getInstance().getString(R.string.sync_mimetype))
.withValue(ContactsContract.Data.DATA1, noa.getValue()) .withValue(ContactsContract.Data.DATA1, noa.getValue())
.withValue(ContactsContract.Data.DATA2, ContactsManager.getInstance().getString(R.string.app_name)) .withValue(ContactsContract.Data.DATA2, ContactsManager.getInstance().getString(R.string.app_name))
.withValue(ContactsContract.Data.DATA3, noa.getValue()) .withValue(ContactsContract.Data.DATA3, noa.getValue())
.build()); .build()
, true);
} }
} else { } else {
ContentValues values = new ContentValues(); ContentValues values = new ContentValues();
@ -321,34 +342,38 @@ public class LinphoneContact implements Serializable, Comparable<LinphoneContact
values.put(ContactsContract.CommonDataKinds.Phone.LABEL, ContactsManager.getInstance().getString(R.string.addressbook_label)); values.put(ContactsContract.CommonDataKinds.Phone.LABEL, ContactsManager.getInstance().getString(R.string.addressbook_label));
} }
if (androidRawId != null) { if (androidRawId != null) {
changesToCommit.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) addChangesToCommit(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValue(ContactsContract.Data.RAW_CONTACT_ID, androidRawId) .withValue(ContactsContract.Data.RAW_CONTACT_ID, androidRawId)
.withValues(values) .withValues(values)
.build()); .build()
, false);
} else { } else {
changesToCommit.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) addChangesToCommit(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValues(values) .withValues(values)
.build()); .build()
, false);
} }
} }
} else { } else {
if (noa.isSIPAddress() && LinphoneManager.getInstance().getContext().getResources().getBoolean(R.bool.use_linphone_tag)) { if (noa.isSIPAddress() && LinphoneManager.getInstance().getContext().getResources().getBoolean(R.bool.use_linphone_tag)) {
if (androidTagId != null) { if (androidTagId != null) {
changesToCommit.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) addChangesToCommit(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
.withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + ContactsContract.Data.DATA1 + "=? ", new String[]{androidTagId, noa.getOldValue()}) .withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + ContactsContract.Data.DATA1 + "=? ", new String[]{androidTagId, noa.getOldValue()})
.withValue(ContactsContract.Data.DATA1, noa.getValue()) .withValue(ContactsContract.Data.DATA1, noa.getValue())
.withValue(ContactsContract.Data.DATA2, ContactsManager.getInstance().getString(R.string.app_name)) .withValue(ContactsContract.Data.DATA2, ContactsManager.getInstance().getString(R.string.app_name))
.withValue(ContactsContract.Data.DATA3, noa.getValue()) .withValue(ContactsContract.Data.DATA3, noa.getValue())
.build()); .build()
, false);
} else { } else {
changesToCommit2.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) addChangesToCommit(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(ContactsContract.Data.MIMETYPE, ContactsManager.getInstance().getString(R.string.sync_mimetype)) .withValue(ContactsContract.Data.MIMETYPE, ContactsManager.getInstance().getString(R.string.sync_mimetype))
.withValue(ContactsContract.Data.DATA1, noa.getValue()) .withValue(ContactsContract.Data.DATA1, noa.getValue())
.withValue(ContactsContract.Data.DATA2, ContactsManager.getInstance().getString(R.string.app_name)) .withValue(ContactsContract.Data.DATA2, ContactsManager.getInstance().getString(R.string.app_name))
.withValue(ContactsContract.Data.DATA3, noa.getValue()) .withValue(ContactsContract.Data.DATA3, noa.getValue())
.build()); .build()
, true);
} }
} else { } else {
ContentValues values = new ContentValues(); ContentValues values = new ContentValues();
@ -364,10 +389,11 @@ public class LinphoneContact implements Serializable, Comparable<LinphoneContact
values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
values.put(ContactsContract.CommonDataKinds.Phone.NUMBER, noa.getValue()); values.put(ContactsContract.CommonDataKinds.Phone.NUMBER, noa.getValue());
} }
changesToCommit.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) addChangesToCommit(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
.withSelection(select, args) .withSelection(select, args)
.withValues(values) .withValues(values)
.build()); .build()
, false);
} }
} }
} }