Store all phone numbers and SIP addresses in LinphoneFriend + some improvements in the way we handle it

This commit is contained in:
Sylvain Berfini 2016-06-27 14:32:58 +02:00
parent b22b142e5f
commit 6d1f06fe7f
2 changed files with 39 additions and 28 deletions

View file

@ -385,7 +385,7 @@ public class ContactEditorFragment extends Fragment {
if (contact != null) { if (contact != null) {
for (LinphoneNumberOrAddress numberOrAddress : contact.getNumbersOrAddresses()) { for (LinphoneNumberOrAddress numberOrAddress : contact.getNumbersOrAddresses()) {
if (!numberOrAddress.isSIPAddress()) { if (!numberOrAddress.isSIPAddress()) {
View view = displayNumberOrAddress(controls, numberOrAddress.getValue()); View view = displayNumberOrAddress(controls, numberOrAddress.getValue(), false);
if (view != null) if (view != null)
controls.addView(view); controls.addView(view);
} }
@ -395,7 +395,7 @@ public class ContactEditorFragment extends Fragment {
if (newSipOrNumberToAdd != null) { if (newSipOrNumberToAdd != null) {
boolean isSip = LinphoneUtils.isStrictSipAddress(newSipOrNumberToAdd) || !LinphoneUtils.isNumberAddress(newSipOrNumberToAdd); boolean isSip = LinphoneUtils.isStrictSipAddress(newSipOrNumberToAdd) || !LinphoneUtils.isNumberAddress(newSipOrNumberToAdd);
if(!isSip) { if(!isSip) {
View view = displayNumberOrAddress(controls, newSipOrNumberToAdd); View view = displayNumberOrAddress(controls, newSipOrNumberToAdd, false);
if (view != null) if (view != null)
controls.addView(view); controls.addView(view);
} }
@ -415,7 +415,7 @@ public class ContactEditorFragment extends Fragment {
if (contact != null) { if (contact != null) {
for (LinphoneNumberOrAddress numberOrAddress : contact.getNumbersOrAddresses()) { for (LinphoneNumberOrAddress numberOrAddress : contact.getNumbersOrAddresses()) {
if (numberOrAddress.isSIPAddress()) { if (numberOrAddress.isSIPAddress()) {
View view = displayNumberOrAddress(controls, numberOrAddress.getValue()); View view = displayNumberOrAddress(controls, numberOrAddress.getValue(), true);
if (view != null) if (view != null)
controls.addView(view); controls.addView(view);
} }
@ -425,7 +425,7 @@ public class ContactEditorFragment extends Fragment {
if (newSipOrNumberToAdd != null) { if (newSipOrNumberToAdd != null) {
boolean isSip = LinphoneUtils.isStrictSipAddress(newSipOrNumberToAdd) || !LinphoneUtils.isNumberAddress(newSipOrNumberToAdd); boolean isSip = LinphoneUtils.isStrictSipAddress(newSipOrNumberToAdd) || !LinphoneUtils.isNumberAddress(newSipOrNumberToAdd);
if (isSip) { if (isSip) {
View view = displayNumberOrAddress(controls, newSipOrNumberToAdd); View view = displayNumberOrAddress(controls, newSipOrNumberToAdd, true);
if (view != null) if (view != null)
controls.addView(view); controls.addView(view);
} }
@ -438,35 +438,33 @@ public class ContactEditorFragment extends Fragment {
return controls; return controls;
} }
private View displayNumberOrAddress(final LinearLayout controls, String numberOrAddress) { private View displayNumberOrAddress(final LinearLayout controls, String numberOrAddress, boolean isSIP) {
return displayNumberOrAddress(controls, numberOrAddress, false); return displayNumberOrAddress(controls, numberOrAddress, isSIP, false);
} }
@SuppressLint("InflateParams") @SuppressLint("InflateParams")
private View displayNumberOrAddress(final LinearLayout controls, String numberOrAddress, boolean forceAddNumber) { private View displayNumberOrAddress(final LinearLayout controls, String numberOrAddress, boolean isSIP, boolean forceAddNumber) {
boolean isSip = LinphoneUtils.isStrictSipAddress(numberOrAddress) || !LinphoneUtils.isNumberAddress(numberOrAddress); if (isSIP) {
if (isSip) {
if (firstSipAddressIndex == -1) { if (firstSipAddressIndex == -1) {
firstSipAddressIndex = controls.getChildCount(); firstSipAddressIndex = controls.getChildCount();
} }
numberOrAddress = numberOrAddress.replace("sip:", ""); numberOrAddress = numberOrAddress.replace("sip:", "");
} }
if ((getResources().getBoolean(R.bool.hide_phone_numbers_in_editor) && !isSip) || (getResources().getBoolean(R.bool.hide_sip_addresses_in_editor) && isSip)) { if ((getResources().getBoolean(R.bool.hide_phone_numbers_in_editor) && !isSIP) || (getResources().getBoolean(R.bool.hide_sip_addresses_in_editor) && isSIP)) {
if (forceAddNumber) if (forceAddNumber)
isSip = !isSip; // If number can't be displayed because we hide a sort of number, change that category isSIP = !isSIP; // If number can't be displayed because we hide a sort of number, change that category
else else
return null; return null;
} }
LinphoneNumberOrAddress tempNounoa; LinphoneNumberOrAddress tempNounoa;
if (forceAddNumber) { if (forceAddNumber) {
tempNounoa = new LinphoneNumberOrAddress(null, isSip); tempNounoa = new LinphoneNumberOrAddress(null, isSIP);
} else { } else {
if(isNewContact || newSipOrNumberToAdd != null) { if(isNewContact || newSipOrNumberToAdd != null) {
tempNounoa = new LinphoneNumberOrAddress(numberOrAddress, isSip); tempNounoa = new LinphoneNumberOrAddress(numberOrAddress, isSIP);
} else { } else {
tempNounoa = new LinphoneNumberOrAddress(null, isSip, numberOrAddress); tempNounoa = new LinphoneNumberOrAddress(null, isSIP, numberOrAddress);
} }
} }
final LinphoneNumberOrAddress nounoa = tempNounoa; final LinphoneNumberOrAddress nounoa = tempNounoa;
@ -475,7 +473,7 @@ public class ContactEditorFragment extends Fragment {
final View view = inflater.inflate(R.layout.contact_edit_row, null); final View view = inflater.inflate(R.layout.contact_edit_row, null);
final EditText noa = (EditText) view.findViewById(R.id.numoraddr); final EditText noa = (EditText) view.findViewById(R.id.numoraddr);
noa.setInputType(isSip ? InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS : InputType.TYPE_CLASS_PHONE); noa.setInputType(isSIP ? InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS : InputType.TYPE_CLASS_PHONE);
noa.setText(numberOrAddress); noa.setText(numberOrAddress);
noa.addTextChangedListener(new TextWatcher() { noa.addTextChangedListener(new TextWatcher() {
@Override @Override
@ -496,7 +494,7 @@ public class ContactEditorFragment extends Fragment {
} }
ImageView delete = (ImageView) view.findViewById(R.id.delete_field); ImageView delete = (ImageView) 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)) { 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); delete.setVisibility(View.GONE);
} }
delete.setOnClickListener(new OnClickListener() { delete.setOnClickListener(new OnClickListener() {

View file

@ -203,12 +203,14 @@ public class LinphoneContact implements Serializable, Comparable<LinphoneContact
} }
if (isLinphoneFriend()) { if (isLinphoneFriend()) {
if (noa.isSIPAddress()) {
if (!noa.getOldValue().startsWith("sip:")) { if (!noa.getOldValue().startsWith("sip:")) {
noa.setOldValue("sip:" + noa.getOldValue()); noa.setOldValue("sip:" + noa.getOldValue());
} }
}
LinphoneNumberOrAddress toRemove = null; LinphoneNumberOrAddress toRemove = null;
for (LinphoneNumberOrAddress address : addresses) { for (LinphoneNumberOrAddress address : addresses) {
if (noa.getOldValue().equals(address.getValue())) { if (noa.getOldValue().equals(address.getValue()) && noa.isSIPAddress() == address.isSIPAddress()) {
toRemove = address; toRemove = address;
break; break;
} }
@ -274,15 +276,19 @@ public class LinphoneContact implements Serializable, Comparable<LinphoneContact
} }
} }
if (isLinphoneFriend()) { if (isLinphoneFriend()) {
if (noa.isSIPAddress()) {
if (!noa.getValue().startsWith("sip:")) { if (!noa.getValue().startsWith("sip:")) {
noa.setValue("sip:" + noa.getValue()); noa.setValue("sip:" + noa.getValue());
} }
}
if (noa.getOldValue() != null) { if (noa.getOldValue() != null) {
if (noa.isSIPAddress()) {
if (!noa.getOldValue().startsWith("sip:")) { if (!noa.getOldValue().startsWith("sip:")) {
noa.setOldValue("sip:" + noa.getOldValue()); noa.setOldValue("sip:" + noa.getOldValue());
} }
}
for (LinphoneNumberOrAddress address : addresses) { for (LinphoneNumberOrAddress address : addresses) {
if (noa.getOldValue().equals(address.getValue())) { if (noa.getOldValue().equals(address.getValue()) && noa.isSIPAddress() == address.isSIPAddress()) {
address.setValue(noa.getValue()); address.setValue(noa.getValue());
break; break;
} }
@ -321,10 +327,13 @@ public class LinphoneContact implements Serializable, Comparable<LinphoneContact
for (LinphoneAddress address : friend.getAddresses()) { for (LinphoneAddress address : friend.getAddresses()) {
friend.removeAddress(address); friend.removeAddress(address);
} }
for (LinphoneNumberOrAddress address : addresses) { for (String phone : friend.getPhoneNumbers()) {
if (address.isSIPAddress()) { friend.removePhoneNumber(phone);
}
for (LinphoneNumberOrAddress noa : addresses) {
if (noa.isSIPAddress()) {
try { try {
LinphoneAddress addr = lc.interpretUrl(address.getValue()); LinphoneAddress addr = lc.interpretUrl(noa.getValue());
if (addr != null) { if (addr != null) {
friend.addAddress(addr); friend.addAddress(addr);
hasAddr = true; hasAddr = true;
@ -332,6 +341,8 @@ public class LinphoneContact implements Serializable, Comparable<LinphoneContact
} catch (LinphoneCoreException e) { } catch (LinphoneCoreException e) {
Log.e(e); Log.e(e);
} }
} else {
friend.addPhoneNumber(noa.getValue());
} }
} }
if (hasAddr) { if (hasAddr) {
@ -400,6 +411,8 @@ public class LinphoneContact implements Serializable, Comparable<LinphoneContact
} catch (LinphoneCoreException e) { } catch (LinphoneCoreException e) {
Log.e(e); Log.e(e);
} }
} else {
friend.addPhoneNumber(noa.getValue());
} }
} }
} }