🐛 Fixed new contact SIP adress being duplicated

This commit is contained in:
Sylvain Berfini 2018-09-12 11:18:37 +02:00
parent d8aecc5990
commit 339d58e51f
6 changed files with 109 additions and 109 deletions

View file

@ -43,6 +43,8 @@ import org.linphone.core.ChatRoom;
import org.linphone.core.ChatRoomListenerStub;
import org.linphone.core.Core;
import org.linphone.core.Factory;
import org.linphone.core.PresenceBasicStatus;
import org.linphone.core.PresenceModel;
import org.linphone.core.ProxyConfig;
import org.linphone.fragments.FragmentsAvailable;
import org.linphone.mediastream.Log;
@ -205,11 +207,15 @@ public class ContactDetailsFragment extends Fragment implements OnClickListener
}
}
String contactAddress = contact.getPresenceModelForUriOrTel(noa.getValue());
if (contactAddress != null) {
v.findViewById(R.id.friendLinphone).setVisibility(View.GONE);
if (contact.getFriend() != null) {
PresenceModel pm = contact.getFriend().getPresenceModelForUriOrTel(noa.getValue());
if (pm != null && pm.getBasicStatus().equals(PresenceBasicStatus.Open)) {
v.findViewById(R.id.friendLinphone).setVisibility(View.VISIBLE);
}
}
String contactAddress = contact.getPresenceModelForUriOrTel(noa.getValue());
if (!displayChatAddressOnly) {
v.findViewById(R.id.contact_call).setOnClickListener(dialListener);
if (contactAddress != null) {

View file

@ -109,20 +109,20 @@ public class ContactEditorFragment extends Fragment {
view = inflater.inflate(R.layout.contact_edit, container, false);
phoneNumbersSection = (LinearLayout) view.findViewById(R.id.phone_numbers);
phoneNumbersSection = view.findViewById(R.id.phone_numbers);
if (getResources().getBoolean(R.bool.hide_phone_numbers_in_editor) || !ContactsManager.getInstance().hasContactsAccess()) {
//Currently linphone friends don't support phone numbers, so hide them
phoneNumbersSection.setVisibility(View.GONE);
}
sipAddressesSection = (LinearLayout) view.findViewById(R.id.sip_addresses);
sipAddressesSection = view.findViewById(R.id.sip_addresses);
if (getResources().getBoolean(R.bool.hide_sip_addresses_in_editor)) {
sipAddressesSection.setVisibility(View.GONE);
}
deleteContact = (ImageView) view.findViewById(R.id.delete_contact);
deleteContact = view.findViewById(R.id.delete_contact);
cancel = (ImageView) view.findViewById(R.id.cancel);
cancel = view.findViewById(R.id.cancel);
cancel.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
@ -130,7 +130,7 @@ public class ContactEditorFragment extends Fragment {
}
});
ok = (ImageView) view.findViewById(R.id.ok);
ok = view.findViewById(R.id.ok);
ok.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
@ -164,7 +164,7 @@ public class ContactEditorFragment extends Fragment {
}
});
lastName = (EditText) view.findViewById(R.id.contactLastName);
lastName = view.findViewById(R.id.contactLastName);
// Hack to display keyboard when touching focused edittext on Nexus One
if (Version.sdkStrictlyBelow(Version.API11_HONEYCOMB_30)) {
lastName.setOnClickListener(new OnClickListener() {
@ -194,7 +194,7 @@ public class ContactEditorFragment extends Fragment {
}
});
firstName = (EditText) view.findViewById(R.id.contactFirstName);
firstName = view.findViewById(R.id.contactFirstName);
firstName.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
@ -215,7 +215,7 @@ public class ContactEditorFragment extends Fragment {
});
organization = (EditText) view.findViewById(R.id.contactOrganization);
organization = view.findViewById(R.id.contactOrganization);
boolean isOrgVisible = getResources().getBoolean(R.bool.display_contact_organization);
if (!isOrgVisible) {
organization.setVisibility(View.GONE);
@ -241,8 +241,8 @@ public class ContactEditorFragment extends Fragment {
@Override
public void onClick(View v) {
final Dialog dialog = LinphoneActivity.instance().displayDialog(getString(R.string.delete_text));
Button delete = (Button) dialog.findViewById(R.id.delete_button);
Button cancel = (Button) dialog.findViewById(R.id.cancel);
Button delete = dialog.findViewById(R.id.delete_button);
Button cancel = dialog.findViewById(R.id.cancel);
delete.setOnClickListener(new OnClickListener() {
@Override
@ -267,7 +267,7 @@ public class ContactEditorFragment extends Fragment {
deleteContact.setVisibility(View.INVISIBLE);
}
contactPicture = (ImageView) view.findViewById(R.id.contact_picture);
contactPicture = view.findViewById(R.id.contact_picture);
if (contact != null) {
LinphoneUtils.setImagePictureFromUri(getActivity(), contactPicture, contact.getPhotoUri(), contact.getThumbnailUri());
} else {
@ -286,7 +286,7 @@ public class ContactEditorFragment extends Fragment {
sipAddresses = initSipAddressFields(contact);
numbers = initNumbersFields(contact);
addSipAddress = (ImageView) view.findViewById(R.id.add_address_field);
addSipAddress = view.findViewById(R.id.add_address_field);
if (getResources().getBoolean(R.bool.allow_only_one_sip_address)) {
addSipAddress.setVisibility(View.GONE);
}
@ -297,7 +297,7 @@ public class ContactEditorFragment extends Fragment {
}
});
addNumber = (ImageView) view.findViewById(R.id.add_number_field);
addNumber = view.findViewById(R.id.add_number_field);
if (getResources().getBoolean(R.bool.allow_only_one_phone_number)) {
addNumber.setVisibility(View.GONE);
}
@ -426,7 +426,7 @@ public class ContactEditorFragment extends Fragment {
}
private LinearLayout initNumbersFields(final LinphoneContact contact) {
LinearLayout controls = (LinearLayout) view.findViewById(R.id.controls_numbers);
LinearLayout controls = view.findViewById(R.id.controls_numbers);
controls.removeAllViews();
if (contact != null) {
@ -449,7 +449,7 @@ public class ContactEditorFragment extends Fragment {
}
if (newDisplayName != null) {
EditText lastNameEditText = (EditText) view.findViewById(R.id.contactLastName);
EditText lastNameEditText = view.findViewById(R.id.contactLastName);
if (view != null)
lastNameEditText.setText(newDisplayName);
}
@ -462,7 +462,7 @@ public class ContactEditorFragment extends Fragment {
}
private LinearLayout initSipAddressFields(final LinphoneContact contact) {
LinearLayout controls = (LinearLayout) view.findViewById(R.id.controls_sip_address);
LinearLayout controls = view.findViewById(R.id.controls_sip_address);
controls.removeAllViews();
if (contact != null) {
@ -526,7 +526,7 @@ public class ContactEditorFragment extends Fragment {
final View view = inflater.inflate(R.layout.contact_edit_row, null);
final EditText noa = (EditText) view.findViewById(R.id.numoraddr);
final EditText noa = view.findViewById(R.id.numoraddr);
if (!isSIP) {
noa.setInputType(InputType.TYPE_CLASS_PHONE);
}
@ -549,7 +549,7 @@ public class ContactEditorFragment extends Fragment {
nounoa.setValue(noa.getText().toString());
}
ImageView delete = (ImageView) view.findViewById(R.id.delete_field);
ImageView delete = view.findViewById(R.id.delete_field);
if ((getResources().getBoolean(R.bool.allow_only_one_phone_number) && !isSIP) || (getResources().getBoolean(R.bool.allow_only_one_sip_address) && isSIP)) {
delete.setVisibility(View.GONE);
}
@ -572,7 +572,7 @@ public class ContactEditorFragment extends Fragment {
final View view = inflater.inflate(R.layout.contact_edit_row, null);
final LinphoneNumberOrAddress nounoa = new LinphoneNumberOrAddress(null, isSip);
final EditText noa = (EditText) view.findViewById(R.id.numoraddr);
final EditText noa = view.findViewById(R.id.numoraddr);
numbersAndAddresses.add(nounoa);
noa.setHint(isSip ? getString(R.string.sip_address) : getString(R.string.phone_number));
if (!isSip) {
@ -594,7 +594,7 @@ public class ContactEditorFragment extends Fragment {
}
});
final ImageView delete = (ImageView) view.findViewById(R.id.delete_field);
final ImageView delete = view.findViewById(R.id.delete_field);
if ((getResources().getBoolean(R.bool.allow_only_one_phone_number) && !isSip) || (getResources().getBoolean(R.bool.allow_only_one_sip_address) && isSip)) {
delete.setVisibility(View.GONE);
}

View file

@ -146,7 +146,6 @@ public class ContactsListAdapter extends SelectableAdapter<ContactsListAdapter.V
holder.delete.setVisibility(isEditionEnabled() ? View.VISIBLE : View.INVISIBLE);
holder.delete.setChecked(isSelected(position));
}
@Override

View file

@ -342,14 +342,9 @@ public class ContactsListFragment extends Fragment implements OnItemClickListene
public void onContactsUpdated() {
if (!LinphoneActivity.isInstanciated() || LinphoneActivity.instance().getCurrentFragment() != FragmentsAvailable.CONTACTS_LIST)
return;
ContactsListAdapter adapter = (ContactsListAdapter) contactsList.getAdapter();
if (adapter != null) {
if (onlyDisplayLinphoneContacts) {
adapter.updateDataSet(ContactsManager.getInstance().getSIPContacts());
} else {
adapter.updateDataSet(ContactsManager.getInstance().getContacts());
}
contactsFetchInProgress.setVisibility(View.GONE);
if (mContactAdapter != null) {
mContactAdapter.updateDataSet(onlyDisplayLinphoneContacts ? ContactsManager.getInstance().getSIPContacts() : ContactsManager.getInstance().getContacts());
mContactAdapter.notifyDataSetChanged();
}
}

View file

@ -97,13 +97,6 @@ public class ContactsManager extends ContentObserver implements FriendListListen
if (LinphoneManager.getLcIfManagerNotDestroyedOrNull() != null) {
magicSearch = LinphoneManager.getLcIfManagerNotDestroyedOrNull().createMagicSearch();
}
Core lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull();
if (lc != null) {
for (FriendList list : lc.getFriendsLists()) {
list.setListener(this);
}
}
}
public void destroy() {
@ -267,11 +260,14 @@ public class ContactsManager extends ContentObserver implements FriendListListen
return null;
}
public synchronized void refreshSipContact(Friend lf) {
public synchronized boolean refreshSipContact(Friend lf) {
LinphoneContact contact = (LinphoneContact) lf.getUserData();
if (contact != null && !mSipContacts.contains(contact)) {
mSipContacts.add(contact);
Collections.sort(mSipContacts);
return true;
}
return false;
}
public static String getAddressOrNumberForAndroidContact(ContentResolver resolver, Uri contactUri) {
@ -352,14 +348,14 @@ public class ContactsManager extends ContentObserver implements FriendListListen
@Override
public void onPresenceReceived(FriendList list, Friend[] friends) {
for (Friend lf : friends) {
ContactsManager.getInstance().refreshSipContact(lf);
}
Collections.sort(mSipContacts);
boolean newContact = ContactsManager.getInstance().refreshSipContact(lf);
if (newContact) {
for (ContactsUpdatedListener listener : contactsUpdatedListeners) {
listener.onContactsUpdated();
}
}
}
}
public void fetchContactsSync() {
mActivity.getLoaderManager().initLoader(CONTACTS_LOADER, null, this);
@ -504,10 +500,14 @@ public class ContactsManager extends ContentObserver implements FriendListListen
setSipContacts(sipContacts);
if (LinphonePreferences.instance() != null && LinphonePreferences.instance().isFriendlistsubscriptionEnabled()) {
if (mActivity.getString(R.string.rls_uri) != null) {
LinphoneManager.getLc().getFriendsLists()[0].setRlsUri(mActivity.getString(R.string.rls_uri));
String rls = mActivity.getString(R.string.rls_uri);
for (FriendList list : LinphoneManager.getLc().getFriendsLists()) {
if (rls != null && rls.equals(list.getRlsAddress().asStringUriOnly())) {
list.setRlsUri(mActivity.getString(R.string.rls_uri));
}
list.setListener(this);
list.updateSubscriptions();
}
LinphoneManager.getLc().getFriendsLists()[0].updateSubscriptions();
}
long timeElapsed = (new Date()).getTime() - contactsTime.getTime();
@ -516,6 +516,10 @@ public class ContactsManager extends ContentObserver implements FriendListListen
TimeUnit.MILLISECONDS.toSeconds(timeElapsed) -
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(timeElapsed)));
Log.i("[ContactsManager] For " + contacts.size() + " contacts: " + time + " elapsed since starting");
for (ContactsUpdatedListener listener : contactsUpdatedListeners) {
listener.onContactsUpdated();
}
}
@Override

View file

@ -243,6 +243,14 @@ public class LinphoneContact implements Serializable, Comparable<LinphoneContact
public void removeNumberOrAddress(LinphoneNumberOrAddress noa) {
if (noa != null && noa.getOldValue() != null) {
if (isAndroidContact()) {
if (androidTagId != null && noa.isSIPAddress()) {
String select = ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + ContactsContract.Data.DATA1 + "=?";
String[] args = new String[]{androidTagId, noa.getOldValue()};
changesToCommit.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI)
.withSelection(select, args)
.build());
} else {
String select;
if (noa.isSIPAddress()) {
select = ContactsContract.Data.CONTACT_ID + "=? AND " + ContactsContract.Data.MIMETYPE + "='" + ContactsContract.CommonDataKinds.SipAddress.CONTENT_ITEM_TYPE + "' AND " + ContactsContract.CommonDataKinds.SipAddress.SIP_ADDRESS + "=?";
@ -251,14 +259,6 @@ public class LinphoneContact implements Serializable, Comparable<LinphoneContact
}
String[] args = new String[]{getAndroidId(), noa.getOldValue()};
changesToCommit.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI)
.withSelection(select, args)
.build());
if (androidTagId != null && noa.isSIPAddress()) {
select = ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + ContactsContract.Data.DATA1 + "=?";
args = new String[]{androidTagId, noa.getOldValue()};
changesToCommit.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI)
.withSelection(select, args)
.build());
@ -289,6 +289,25 @@ public class LinphoneContact implements Serializable, Comparable<LinphoneContact
if (noa != null && noa.getValue() != null) {
if (isAndroidContact()) {
if (noa.getOldValue() == null) {
if (noa.isSIPAddress() && LinphoneManager.getInstance().getContext().getResources().getBoolean(R.bool.use_linphone_tag)) {
if (androidTagId != null) {
changesToCommit.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValue(ContactsContract.Data.RAW_CONTACT_ID, androidTagId)
.withValue(ContactsContract.Data.MIMETYPE, ContactsManager.getInstance().getString(R.string.sync_mimetype))
.withValue(ContactsContract.Data.DATA1, noa.getValue())
.withValue(ContactsContract.Data.DATA2, ContactsManager.getInstance().getString(R.string.app_name))
.withValue(ContactsContract.Data.DATA3, noa.getValue())
.build());
} else {
changesToCommit2.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(ContactsContract.Data.MIMETYPE, ContactsManager.getInstance().getString(R.string.sync_mimetype))
.withValue(ContactsContract.Data.DATA1, noa.getValue())
.withValue(ContactsContract.Data.DATA2, ContactsManager.getInstance().getString(R.string.app_name))
.withValue(ContactsContract.Data.DATA3, noa.getValue())
.build());
}
} else {
ContentValues values = new ContentValues();
if (noa.isSIPAddress()) {
values.put(ContactsContract.Data.MIMETYPE, CommonDataKinds.SipAddress.CONTENT_ITEM_TYPE);
@ -312,12 +331,12 @@ public class LinphoneContact implements Serializable, Comparable<LinphoneContact
.withValues(values)
.build());
}
}
} else {
if (noa.isSIPAddress() && LinphoneManager.getInstance().getContext().getResources().getBoolean(R.bool.use_linphone_tag)) {
if (androidTagId != null) {
changesToCommit.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValue(ContactsContract.Data.RAW_CONTACT_ID, androidTagId)
.withValue(ContactsContract.Data.MIMETYPE, ContactsManager.getInstance().getString(R.string.sync_mimetype))
changesToCommit.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
.withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + ContactsContract.Data.DATA1 + "=? ", new String[]{androidTagId, noa.getOldValue()})
.withValue(ContactsContract.Data.DATA1, noa.getValue())
.withValue(ContactsContract.Data.DATA2, ContactsManager.getInstance().getString(R.string.app_name))
.withValue(ContactsContract.Data.DATA3, noa.getValue())
@ -331,7 +350,6 @@ public class LinphoneContact implements Serializable, Comparable<LinphoneContact
.withValue(ContactsContract.Data.DATA3, noa.getValue())
.build());
}
}
} else {
ContentValues values = new ContentValues();
String select;
@ -350,24 +368,6 @@ public class LinphoneContact implements Serializable, Comparable<LinphoneContact
.withSelection(select, args)
.withValues(values)
.build());
if (noa.isSIPAddress() && LinphoneManager.getInstance().getContext().getResources().getBoolean(R.bool.use_linphone_tag)) {
if (androidTagId != null) {
changesToCommit.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
.withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + ContactsContract.Data.DATA1 + "=? ", new String[]{androidTagId, noa.getOldValue()})
.withValue(ContactsContract.Data.DATA1, noa.getValue())
.withValue(ContactsContract.Data.DATA2, ContactsManager.getInstance().getString(R.string.app_name))
.withValue(ContactsContract.Data.DATA3, noa.getValue())
.build());
} else {
changesToCommit2.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(ContactsContract.Data.MIMETYPE, ContactsManager.getInstance().getString(R.string.sync_mimetype))
.withValue(ContactsContract.Data.DATA1, noa.getValue())
.withValue(ContactsContract.Data.DATA2, ContactsManager.getInstance().getString(R.string.app_name))
.withValue(ContactsContract.Data.DATA3, noa.getValue())
.build());
}
}
}
}
@ -483,10 +483,6 @@ public class LinphoneContact implements Serializable, Comparable<LinphoneContact
public void delete() {
if (isAndroidContact()) {
String select = ContactsContract.Data.CONTACT_ID + " = ?";
String[] args = new String[]{getAndroidId()};
changesToCommit.add(ContentProviderOperation.newDelete(ContactsContract.RawContacts.CONTENT_URI).withSelection(select, args).build());
save();
ContactsManager.getInstance().delete(getAndroidId());
}
if (isFriend()) {