From d6811c3e5efe6974b0ad2ceba43532bf898bdf64 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 29 Nov 2018 11:31:01 +0100 Subject: [PATCH] Started to toy around with the native contact editor (disabled by default) --- .../contacts/ContactDetailsFragment.java | 9 ++-- .../contacts/ContactsListFragment.java | 15 +++--- .../linphone/contacts/ContactsManager.java | 47 +++++++++++++++++-- .../linphone/contacts/LinphoneContact.java | 17 +++++-- .../settings/LinphonePreferences.java | 10 ++-- .../res/values/non_localizable_custom.xml | 1 + app/src/main/res/xml/syncadapter.xml | 2 +- 7 files changed, 76 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/org/linphone/contacts/ContactDetailsFragment.java b/app/src/main/java/org/linphone/contacts/ContactDetailsFragment.java index 23098c2c9..02e1c9a86 100644 --- a/app/src/main/java/org/linphone/contacts/ContactDetailsFragment.java +++ b/app/src/main/java/org/linphone/contacts/ContactDetailsFragment.java @@ -25,6 +25,7 @@ import android.app.Fragment; import android.content.Intent; import android.net.Uri; import android.os.Bundle; +import android.provider.ContactsContract; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; @@ -300,9 +301,8 @@ public class ContactDetailsFragment extends Fragment implements OnClickListener int id = v.getId(); if (id == R.id.editContact) { - LinphoneActivity.instance().editContact(contact); - } - if (id == R.id.deleteContact) { + ContactsManager.getInstance().editContact(getActivity(), contact, null); + } else if (id == R.id.deleteContact) { final Dialog dialog = LinphoneActivity.instance().displayDialog(getString(R.string.delete_text)); Button delete = dialog.findViewById(R.id.dialog_delete_button); Button cancel = dialog.findViewById(R.id.dialog_cancel_button); @@ -324,8 +324,7 @@ public class ContactDetailsFragment extends Fragment implements OnClickListener } }); dialog.show(); - } - if (id == R.id.back) { + } else if (id == R.id.back) { getFragmentManager().popBackStackImmediate(); } } diff --git a/app/src/main/java/org/linphone/contacts/ContactsListFragment.java b/app/src/main/java/org/linphone/contacts/ContactsListFragment.java index e284940f4..4eeb9129d 100644 --- a/app/src/main/java/org/linphone/contacts/ContactsListFragment.java +++ b/app/src/main/java/org/linphone/contacts/ContactsListFragment.java @@ -22,10 +22,14 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import android.app.Fragment; import android.content.Context; +import android.content.Intent; +import android.net.Uri; import android.os.Bundle; import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; + +import android.provider.ContactsContract; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -114,10 +118,7 @@ public class ContactsListFragment extends Fragment implements OnItemClickListene @Override public void onClick(View v) { editConsumed = true; - if (displayName != null) - LinphoneActivity.instance().addContact(displayName, sipAddressToAdd); - else - LinphoneActivity.instance().addContact(null, sipAddressToAdd); + ContactsManager.getInstance().createContact(getActivity(), displayName, sipAddressToAdd); } }); @@ -154,7 +155,7 @@ public class ContactsListFragment extends Fragment implements OnItemClickListene @Override public boolean onQueryTextChange(String newText) { - searchContacts(newText.toString()); + searchContacts(newText); return true; } }); @@ -273,7 +274,7 @@ public class ContactsListFragment extends Fragment implements OnItemClickListene LinphoneContact contact = (LinphoneContact) adapter.getItemAtPosition(position); if (editOnClick) { editConsumed = true; - LinphoneActivity.instance().editContact(contact, sipAddressToAdd); + ContactsManager.getInstance().editContact(getActivity(), contact, sipAddressToAdd); } else { lastKnownPosition = layoutManager.findFirstVisibleItemPosition(); LinphoneActivity.instance().displayContact(contact, onlyDisplayChatAddress); @@ -289,7 +290,7 @@ public class ContactsListFragment extends Fragment implements OnItemClickListene } else if (editOnClick) { editConsumed = true; - LinphoneActivity.instance().editContact(contact, sipAddressToAdd); + ContactsManager.getInstance().editContact(getActivity(), contact, sipAddressToAdd); } else { lastKnownPosition = layoutManager.findFirstVisibleItemPosition(); LinphoneActivity.instance().displayContact(contact, onlyDisplayChatAddress); diff --git a/app/src/main/java/org/linphone/contacts/ContactsManager.java b/app/src/main/java/org/linphone/contacts/ContactsManager.java index 034fba1ee..73d6ea6b1 100644 --- a/app/src/main/java/org/linphone/contacts/ContactsManager.java +++ b/app/src/main/java/org/linphone/contacts/ContactsManager.java @@ -25,7 +25,9 @@ import android.annotation.SuppressLint; import android.app.Activity; import android.content.ContentProviderOperation; import android.content.ContentResolver; +import android.content.ContentValues; import android.content.Context; +import android.content.Intent; import android.content.pm.PackageManager; import android.database.ContentObserver; import android.database.Cursor; @@ -36,6 +38,7 @@ import android.os.AsyncTask; import android.provider.ContactsContract; import android.provider.ContactsContract.Data; +import org.linphone.LinphoneActivity; import org.linphone.LinphoneManager; import org.linphone.settings.LinphonePreferences; import org.linphone.LinphoneService; @@ -225,7 +228,7 @@ public class ContactsManager extends ContentObserver implements FriendListListen try { accountManager.addAccountExplicitly(newAccount, null, null); } catch (Exception e) { - Log.e(e); + Log.e("[Contacts Manager] " + e); } } } @@ -319,7 +322,7 @@ public class ContactsManager extends ContentObserver implements FriendListListen try { mContext.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); } catch (Exception e) { - Log.e(e); + Log.e("[Contacts Manager] " + e); } } @@ -455,12 +458,14 @@ public class ContactsManager extends ContentObserver implements FriendListListen String data2 = c.getString(c.getColumnIndex("data2")); String data3 = c.getString(c.getColumnIndex("data3")); String data4 = c.getString(c.getColumnIndex("data4")); + String lookupKey = c.getString(c.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY)); LinphoneContact contact = mAndroidContactsCache.get(id); if (contact == null) { nativeIds.add(id); contact = new LinphoneContact(); contact.setAndroidId(id); + contact.setAndroidLookupKey(lookupKey); contact.setFullName(displayName); mAndroidContactsCache.put(id, contact); } @@ -505,7 +510,7 @@ public class ContactsManager extends ContentObserver implements FriendListListen for (LinphoneNumberOrAddress noa : contact.getNumbersOrAddresses()) { if (noa.isSIPAddress()) { contact.setFullName(LinphoneUtils.getAddressDisplayName(noa.getValue())); - Log.w("Couldn't find a display name for contact " + contact.getFullName() + ", used SIP address display name / username instead..."); + Log.w("[Contacts Manager] Couldn't find a display name for contact " + contact.getFullName() + ", used SIP address display name / username instead..."); break; } } @@ -524,7 +529,6 @@ public class ContactsManager extends ContentObserver implements FriendListListen data.sipContacts.add(contact); } } - contact.createOrUpdateFriendFromNativeContact(); data.contacts.add(contact); } mAndroidContactsCache.clear(); @@ -540,6 +544,9 @@ public class ContactsManager extends ContentObserver implements FriendListListen for (ContactsUpdatedListener listener : contactsUpdatedListeners) { listener.onContactsUpdated(); } + for (LinphoneContact contact : data.contacts) { + contact.createOrUpdateFriendFromNativeContact(); + } setContacts(data.contacts); setSipContacts(data.sipContacts); @@ -557,4 +564,36 @@ public class ContactsManager extends ContentObserver implements FriendListListen mSipContacts = c; } } + + public void editContact(Context context, LinphoneContact contact, String valueToAdd) { + if (context.getResources().getBoolean(R.bool.use_native_contact_editor)) { + Intent intent = new Intent(Intent.ACTION_EDIT); + Uri contactUri = ContactsContract.Contacts.getLookupUri(Long.parseLong(contact.getAndroidId()), contact.getAndroidLookupKey()); + intent.setDataAndType(contactUri, ContactsContract.Contacts.CONTENT_ITEM_TYPE); + intent.putExtra("finishActivityOnSaveCompleted", true); // So after save will go back here + if (valueToAdd != null) { + intent.putExtra(ContactsContract.Intents.Insert.IM_HANDLE, valueToAdd); + } + context.startActivity(intent); + } else { + LinphoneActivity.instance().editContact(contact); + } + } + + public void createContact(Context context, String name, String valueToAdd) { + if (context.getResources().getBoolean(R.bool.use_native_contact_editor)) { + Intent intent = new Intent(ContactsContract.Intents.Insert.ACTION); + intent.setType(ContactsContract.RawContacts.CONTENT_TYPE); + intent.putExtra("finishActivityOnSaveCompleted", true); // So after save will go back here + if (name != null) { + intent.putExtra(ContactsContract.Intents.Insert.NAME, name); + } + if (valueToAdd != null) { + intent.putExtra(ContactsContract.Intents.Insert.IM_HANDLE, valueToAdd); + } + context.startActivity(intent); + } else { + LinphoneActivity.instance().addContact(name, valueToAdd); + } + } } diff --git a/app/src/main/java/org/linphone/contacts/LinphoneContact.java b/app/src/main/java/org/linphone/contacts/LinphoneContact.java index 7eea49fe1..debc6fc3d 100644 --- a/app/src/main/java/org/linphone/contacts/LinphoneContact.java +++ b/app/src/main/java/org/linphone/contacts/LinphoneContact.java @@ -50,7 +50,7 @@ public class LinphoneContact implements Serializable, Comparable addresses; private transient ArrayList changesToCommit; @@ -60,6 +60,7 @@ public class LinphoneContact implements Serializable, Comparable(); androidId = null; + androidLookupKey = null; thumbnailUri = null; photoUri = null; changesToCommit = new ArrayList<>(); @@ -463,10 +464,18 @@ public class LinphoneContact implements Serializable, Comparablefalse false false + false false diff --git a/app/src/main/res/xml/syncadapter.xml b/app/src/main/res/xml/syncadapter.xml index 172f5795d..77a0d1f09 100644 --- a/app/src/main/res/xml/syncadapter.xml +++ b/app/src/main/res/xml/syncadapter.xml @@ -2,6 +2,6 @@