From 4d976609bf1fafaedc4830234e56053286a506e5 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Fri, 18 Mar 2016 11:37:06 +0100 Subject: [PATCH] Improved multiple contacts deletion + fixed list update --- src/org/linphone/ContactsListFragment.java | 23 ++++++++++-- src/org/linphone/ContactsManager.java | 41 +++++++++++++++++++--- src/org/linphone/LinphoneContact.java | 5 ++- 3 files changed, 61 insertions(+), 8 deletions(-) diff --git a/src/org/linphone/ContactsListFragment.java b/src/org/linphone/ContactsListFragment.java index a3a70e1c5..135ea6486 100644 --- a/src/org/linphone/ContactsListFragment.java +++ b/src/org/linphone/ContactsListFragment.java @@ -19,6 +19,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package org.linphone; +import java.util.ArrayList; import java.util.List; import org.linphone.core.LinphoneFriend; @@ -51,7 +52,7 @@ import android.widget.TextView; * @author Sylvain Berfini */ @SuppressLint("DefaultLocale") -public class ContactsListFragment extends Fragment implements OnClickListener, OnItemClickListener { +public class ContactsListFragment extends Fragment implements OnClickListener, OnItemClickListener, ContactsUpdatedListener { private LayoutInflater mInflater; private ListView contactsList; private TextView noSipContact, noContact; @@ -273,14 +274,23 @@ public class ContactsListFragment extends Fragment implements OnClickListener, O } } - private void removeContacts(){ + private void removeContacts() { + ArrayList ids = new ArrayList(); int size = contactsList.getAdapter().getCount(); + for (int i = size - 1; i >= 0; i--) { if (contactsList.isItemChecked(i)) { LinphoneContact contact = (LinphoneContact) contactsList.getAdapter().getItem(i); - contact.delete(); + if (contact.isAndroidContact()) { + contact.deleteFriend(); + ids.add(contact.getAndroidId()); + } else { + contact.delete(); + } } } + + ContactsManager.getInstance().deleteMultipleContactsAtOnce(ids); } public void quitEditMode(){ @@ -369,6 +379,7 @@ public class ContactsListFragment extends Fragment implements OnClickListener, O @Override public void onResume() { instance = this; + ContactsManager.addContactsListener(this); super.onResume(); if (editConsumed) { @@ -388,9 +399,15 @@ public class ContactsListFragment extends Fragment implements OnClickListener, O @Override public void onPause() { instance = null; + ContactsManager.removeContactsListener(this); super.onPause(); } + @Override + public void onContactsUpdated() { + invalidate(); + } + public void invalidate() { if (searchField != null && searchField.getText().toString().length() > 0) { searchContacts(searchField.getText().toString()); diff --git a/src/org/linphone/ContactsManager.java b/src/org/linphone/ContactsManager.java index 83e657d5b..ddfbd6982 100644 --- a/src/org/linphone/ContactsManager.java +++ b/src/org/linphone/ContactsManager.java @@ -29,6 +29,7 @@ import org.linphone.mediastream.Log; import android.accounts.Account; import android.accounts.AccountManager; +import android.content.ContentProviderOperation; import android.content.ContentResolver; import android.content.Context; import android.database.ContentObserver; @@ -52,6 +53,15 @@ public class ContactsManager extends ContentObserver { private Account mAccount; private boolean preferLinphoneContacts = false, isContactPresenceDisabled = true, hasContactAccess = false; private ContentResolver contentResolver; + + private static ArrayList contactsUpdatedListeners; + public static void addContactsListener(ContactsUpdatedListener listener) { + contactsUpdatedListeners.add(listener); + } + public static void removeContactsListener(ContactsUpdatedListener listener) { + contactsUpdatedListeners.remove(listener); + } + private static Handler handler = new Handler() { @SuppressWarnings("unchecked") @Override @@ -59,12 +69,16 @@ public class ContactsManager extends ContentObserver { if (msg.what == CONTACTS_UPDATED && msg.obj instanceof List) { List c = (List) msg.obj; ContactsManager.getInstance().setContacts(c); + for (ContactsUpdatedListener listener : contactsUpdatedListeners) { + listener.onContactsUpdated(); + } } } }; private ContactsManager(Handler handler) { super(handler); + contactsUpdatedListeners = new ArrayList(); } @Override @@ -156,10 +170,6 @@ public class ContactsManager extends ContentObserver { } return null; } - - public synchronized void removeContact(LinphoneContact linphoneContact) { - contacts.remove(linphoneContact); - } public synchronized void setContacts(List c) { contacts = c; @@ -224,4 +234,27 @@ public class ContactsManager extends ContentObserver { } return null; } + + public void delete(String id) { + ArrayList ids = new ArrayList(); + ids.add(id); + deleteMultipleContactsAtOnce(ids); + } + + public void deleteMultipleContactsAtOnce(List ids) { + String select = ContactsContract.Data.CONTACT_ID + " = ?"; + ArrayList ops = new ArrayList(); + + for (String id : ids) { + String[] args = new String[] { id }; + ops.add(ContentProviderOperation.newDelete(ContactsContract.RawContacts.CONTENT_URI).withSelection(select, args).build()); + } + + ContentResolver cr = ContactsManager.getInstance().getContentResolver(); + try { + cr.applyBatch(ContactsContract.AUTHORITY, ops); + } catch (Exception e) { + Log.e(e); + } + } } diff --git a/src/org/linphone/LinphoneContact.java b/src/org/linphone/LinphoneContact.java index ce6a49aaa..8b73780ab 100644 --- a/src/org/linphone/LinphoneContact.java +++ b/src/org/linphone/LinphoneContact.java @@ -137,8 +137,11 @@ public class LinphoneContact implements Serializable { } catch (Exception e) { Log.e(e); } - ContactsManager.getInstance().removeContact(this); } + deleteFriend(); + } + + public void deleteFriend() { if (friend != null) { LinphoneManager.getLcIfManagerNotDestroyedOrNull().removeFriend(friend); }