fixed add contact detail fragment when launching application from native contact

This commit is contained in:
Claire Rosset 2019-06-03 14:57:49 +02:00
parent e711e0750d
commit 05a440f27a
6 changed files with 84 additions and 7 deletions

View file

@ -599,11 +599,13 @@ public abstract class MainActivity extends LinphoneGenericActivity
protected void changeFragment(Fragment fragment, String name, boolean isChild) { protected void changeFragment(Fragment fragment, String name, boolean isChild) {
FragmentManager fragmentManager = getFragmentManager(); FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction(); FragmentTransaction transaction = fragmentManager.beginTransaction();
if (transaction.isAddToBackStackAllowed()) { if (transaction.isAddToBackStackAllowed()) {
int count = fragmentManager.getBackStackEntryCount(); int count = fragmentManager.getBackStackEntryCount();
if (count > 0) { if (count > 0) {
FragmentManager.BackStackEntry entry = FragmentManager.BackStackEntry entry =
fragmentManager.getBackStackEntryAt(count - 1); fragmentManager.getBackStackEntryAt(count - 1);
if (entry != null && name.equals(entry.getName())) { if (entry != null && name.equals(entry.getName())) {
fragmentManager.popBackStack(); fragmentManager.popBackStack();
if (!isChild) { if (!isChild) {

View file

@ -231,6 +231,7 @@ class AsyncContactsLoader extends AsyncTask<Void, Void, AsyncContactsLoader.Asyn
+ " contacts found in which " + " contacts found in which "
+ data.sipContacts.size() + data.sipContacts.size()
+ " are SIP"); + " are SIP");
for (LinphoneContact contact : data.contacts) { for (LinphoneContact contact : data.contacts) {
contact.createOrUpdateFriendFromNativeContact(); contact.createOrUpdateFriendFromNativeContact();
} }

View file

@ -291,6 +291,7 @@ public class ContactDetailsFragment extends Fragment implements ContactsUpdatedL
} }
String contactAddress = mContact.getContactFromPresenceModelForUriOrTel(noa.getValue()); String contactAddress = mContact.getContactFromPresenceModelForUriOrTel(noa.getValue());
if (!mDisplayChatAddressOnly) { if (!mDisplayChatAddressOnly) {
v.findViewById(R.id.contact_call) v.findViewById(R.id.contact_call)
.setOnClickListener( .setOnClickListener(

View file

@ -22,6 +22,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
import android.Manifest; import android.Manifest;
import android.app.Fragment; import android.app.Fragment;
import android.content.Intent; import android.content.Intent;
import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
import android.widget.Toast; import android.widget.Toast;
@ -47,6 +48,7 @@ public class ContactsActivity extends MainActivity {
super.onStart(); super.onStart();
Fragment currentFragment = getFragmentManager().findFragmentById(R.id.fragmentContainer); Fragment currentFragment = getFragmentManager().findFragmentById(R.id.fragmentContainer);
if (currentFragment == null) { if (currentFragment == null) {
if (getIntent() != null && getIntent().getExtras() != null) { if (getIntent() != null && getIntent().getExtras() != null) {
Bundle extras = getIntent().getExtras(); Bundle extras = getIntent().getExtras();
@ -54,6 +56,17 @@ public class ContactsActivity extends MainActivity {
showContactsList(); showContactsList();
} }
handleIntentExtras(extras); handleIntentExtras(extras);
} else if (getIntent() != null && getIntent().getData() != null) {
Uri uri = getIntent().getData();
if (isTablet()) {
showContactsList();
}
Bundle bundle = new Bundle();
bundle.putString("uri", uri.toString());
handleIntentExtras(bundle);
} else { } else {
showContactsList(); showContactsList();
if (isTablet()) { if (isTablet()) {
@ -67,18 +80,26 @@ public class ContactsActivity extends MainActivity {
protected void onNewIntent(Intent intent) { protected void onNewIntent(Intent intent) {
super.onNewIntent(intent); super.onNewIntent(intent);
Bundle bundle = intent.getExtras();
if (bundle == null) {
bundle = new Bundle();
}
// Clean fragments stack upon return // Clean fragments stack upon return
while (getFragmentManager().getBackStackEntryCount() > 0) { while (getFragmentManager().getBackStackEntryCount() > 0) {
getFragmentManager().popBackStackImmediate(); getFragmentManager().popBackStackImmediate();
} }
handleIntentExtras(intent.getExtras()); if (intent.getData() != null) {
bundle.putString("uri", intent.getDataString());
}
handleIntentExtras(bundle);
} }
@Override @Override
protected void onResume() { protected void onResume() {
super.onResume(); super.onResume();
mContactsSelected.setVisibility(View.VISIBLE); mContactsSelected.setVisibility(View.VISIBLE);
} }
@ -113,12 +134,27 @@ public class ContactsActivity extends MainActivity {
private void handleIntentExtras(Bundle extras) { private void handleIntentExtras(Bundle extras) {
if (extras == null) return; if (extras == null) return;
if (extras.containsKey("Contact")) { if (isTablet()) {
showContactsList();
}
if (extras.containsKey("uri")) {
String uri = extras.getString("uri");
Uri contactUri = Uri.parse(uri);
String id = ContactsManager.getInstance().getAndroidContactIdFromUri(contactUri);
LinphoneContact linphoneContact =
ContactsManager.getInstance().findContactFromAndroidId(id);
if (linphoneContact != null) {
showContactDetails(linphoneContact, isTablet());
}
} else if (extras.containsKey("Contact")) {
LinphoneContact contact = (LinphoneContact) extras.get("Contact"); LinphoneContact contact = (LinphoneContact) extras.get("Contact");
if (extras.containsKey("Edit")) { if (extras.containsKey("Edit")) {
showContactEdit(contact, extras, false); showContactEdit(contact, extras, isTablet());
} else { } else {
showContactDetails(contact, false); showContactDetails(contact, isTablet());
} }
} else if (extras.containsKey("CreateOrEdit")) { } else if (extras.containsKey("CreateOrEdit")) {
mEditOnClick = extras.getBoolean("CreateOrEdit"); mEditOnClick = extras.getBoolean("CreateOrEdit");
@ -153,6 +189,7 @@ public class ContactsActivity extends MainActivity {
if (contact != null) { if (contact != null) {
extras.putSerializable("Contact", contact); extras.putSerializable("Contact", contact);
} }
ContactDetailsFragment fragment = new ContactDetailsFragment(); ContactDetailsFragment fragment = new ContactDetailsFragment();
fragment.setArguments(extras); fragment.setArguments(extras);
changeFragment(fragment, "Contact detail", isChild); changeFragment(fragment, "Contact detail", isChild);

View file

@ -327,8 +327,25 @@ public class ContactsManager extends ContentObserver implements FriendListListen
} }
} }
public String getAndroidContactIdFromUri(Uri uri) {
String[] projection = {ContactsContract.CommonDataKinds.SipAddress.CONTACT_ID};
Cursor cursor =
mContext.getApplicationContext()
.getContentResolver()
.query(uri, projection, null, null, null);
cursor.moveToFirst();
int nameColumnIndex =
cursor.getColumnIndex(ContactsContract.CommonDataKinds.SipAddress.CONTACT_ID);
String id = cursor.getString(nameColumnIndex);
cursor.close();
return id;
}
public synchronized LinphoneContact findContactFromAndroidId(String androidId) { public synchronized LinphoneContact findContactFromAndroidId(String androidId) {
if (androidId == null) return null; if (androidId == null) {
return null;
}
for (LinphoneContact c : getContacts()) { for (LinphoneContact c : getContacts()) {
if (c.getAndroidId() != null && c.getAndroidId().equals(androidId)) { if (c.getAndroidId() != null && c.getAndroidId().equals(androidId)) {
@ -427,7 +444,9 @@ public class ContactsManager extends ContentObserver implements FriendListListen
private synchronized boolean refreshSipContact(Friend lf) { private synchronized boolean refreshSipContact(Friend lf) {
LinphoneContact contact = (LinphoneContact) lf.getUserData(); LinphoneContact contact = (LinphoneContact) lf.getUserData();
if (contact != null) { if (contact != null) {
if (!mSipContacts.contains(contact)) { if (!mSipContacts.contains(contact)) {
mSipContacts.add(contact); mSipContacts.add(contact);
return true; return true;
@ -484,8 +503,11 @@ public class ContactsManager extends ContentObserver implements FriendListListen
@Override @Override
public void onPresenceReceived(FriendList list, Friend[] friends) { public void onPresenceReceived(FriendList list, Friend[] friends) {
boolean updated = false; boolean updated = false;
for (Friend lf : friends) { for (Friend lf : friends) {
boolean newContact = refreshSipContact(lf); boolean newContact = refreshSipContact(lf);
if (newContact) { if (newContact) {
updated = true; updated = true;
} }

View file

@ -66,8 +66,10 @@ public class LinphoneContact extends AndroidContact
public static LinphoneContact createContact() { public static LinphoneContact createContact() {
LinphoneContact contact = new LinphoneContact(); LinphoneContact contact = new LinphoneContact();
if (ContactsManager.getInstance().hasReadContactsAccess()) { if (ContactsManager.getInstance().hasReadContactsAccess()) {
contact.createAndroidContact(); contact.createAndroidContact();
} else { } else {
contact.createFriend(); contact.createFriend();
} }
@ -89,7 +91,9 @@ public class LinphoneContact extends AndroidContact
int idComp = getAndroidId().compareTo(contact.getAndroidId()); int idComp = getAndroidId().compareTo(contact.getAndroidId());
if (idComp == 0) return 0; if (idComp == 0) return 0;
List<LinphoneNumberOrAddress> noas1 = getNumbersOrAddresses(); List<LinphoneNumberOrAddress> noas1 = getNumbersOrAddresses();
List<LinphoneNumberOrAddress> noas2 = contact.getNumbersOrAddresses(); List<LinphoneNumberOrAddress> noas2 = contact.getNumbersOrAddresses();
if (noas1.size() == noas2.size()) { if (noas1.size() == noas2.size()) {
if (noas1.containsAll(noas2) && noas2.containsAll(noas1)) { if (noas1.containsAll(noas2) && noas2.containsAll(noas1)) {
return 0; return 0;
@ -333,6 +337,7 @@ public class LinphoneContact extends AndroidContact
if (isFriend()) { if (isFriend()) {
mFriend.edit(); mFriend.edit();
mFriend.setName(mFullName); mFriend.setName(mFullName);
if (mFriend.getVcard() != null) { if (mFriend.getVcard() != null) {
mFriend.getVcard().setFamilyName(mLastName); mFriend.getVcard().setFamilyName(mLastName);
mFriend.getVcard().setGivenName(mFirstName); mFriend.getVcard().setGivenName(mFirstName);
@ -349,9 +354,13 @@ public class LinphoneContact extends AndroidContact
mFriend.removePhoneNumber(phone); mFriend.removePhoneNumber(phone);
} }
} }
for (LinphoneNumberOrAddress noa : getNumbersOrAddresses()) { for (LinphoneNumberOrAddress noa : getNumbersOrAddresses()) {
if (noa.isSIPAddress()) { if (noa.isSIPAddress()) {
Address addr = core.interpretUrl(noa.getValue()); Address addr = core.interpretUrl(noa.getValue());
if (addr != null) { if (addr != null) {
mFriend.addAddress(addr); mFriend.addAddress(addr);
} }
@ -415,7 +424,9 @@ public class LinphoneContact extends AndroidContact
} }
public String getContactFromPresenceModelForUriOrTel(String uri) { public String getContactFromPresenceModelForUriOrTel(String uri) {
if (mFriend != null && mFriend.getPresenceModelForUriOrTel(uri) != null) { if (mFriend != null && mFriend.getPresenceModelForUriOrTel(uri) != null) {
return mFriend.getPresenceModelForUriOrTel(uri).getContact(); return mFriend.getPresenceModelForUriOrTel(uri).getContact();
} }
return null; return null;
@ -467,6 +478,7 @@ public class LinphoneContact extends AndroidContact
mOrganization = mFriend.getVcard().getOrganization(); mOrganization = mFriend.getVcard().getOrganization();
Core core = LinphoneManager.getCore(); Core core = LinphoneManager.getCore();
if (core != null && core.vcardSupported()) { if (core != null && core.vcardSupported()) {
for (Address addr : mFriend.getAddresses()) { for (Address addr : mFriend.getAddresses()) {
if (addr != null) { if (addr != null) {
@ -511,6 +523,7 @@ public class LinphoneContact extends AndroidContact
public void syncValuesFromAndroidCusor(Cursor c) { public void syncValuesFromAndroidCusor(Cursor c) {
String displayName = String displayName =
c.getString(c.getColumnIndex(ContactsContract.Data.DISPLAY_NAME_PRIMARY)); c.getString(c.getColumnIndex(ContactsContract.Data.DISPLAY_NAME_PRIMARY));
String mime = c.getString(c.getColumnIndex(ContactsContract.Data.MIMETYPE)); String mime = c.getString(c.getColumnIndex(ContactsContract.Data.MIMETYPE));
String data1 = c.getString(c.getColumnIndex("data1")); String data1 = c.getString(c.getColumnIndex("data1"));
String data2 = c.getString(c.getColumnIndex("data2")); String data2 = c.getString(c.getColumnIndex("data2"));
@ -523,10 +536,12 @@ public class LinphoneContact extends AndroidContact
if (ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE.equals(mime)) { if (ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE.equals(mime)) {
addNumberOrAddress(new LinphoneNumberOrAddress(data1, data4)); addNumberOrAddress(new LinphoneNumberOrAddress(data1, data4));
} else if (ContactsContract.CommonDataKinds.SipAddress.CONTENT_ITEM_TYPE.equals(mime) } else if (ContactsContract.CommonDataKinds.SipAddress.CONTENT_ITEM_TYPE.equals(mime)
|| LinphoneService.instance() || LinphoneService.instance()
.getString(R.string.linphone_address_mime_type) .getString(R.string.linphone_address_mime_type)
.equals(mime)) { .equals(mime)) {
addNumberOrAddress(new LinphoneNumberOrAddress(data1, true)); addNumberOrAddress(new LinphoneNumberOrAddress(data1, true));
} else if (ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE.equals(mime)) { } else if (ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE.equals(mime)) {
setOrganization(data1, false); setOrganization(data1, false);
@ -543,7 +558,6 @@ public class LinphoneContact extends AndroidContact
public void delete() { public void delete() {
deleteAndroidContact(); deleteAndroidContact();
if (isFriend()) { if (isFriend()) {
deleteFriend(); deleteFriend();
} }