From 6122078e30791274408ab8f648bfd989c6094dd9 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Fri, 6 Jan 2017 17:13:01 +0100 Subject: [PATCH] Removed loading of each contact's picture causin OutOfMemory exceptions when contact list is large + fixed contacts first/last name --- src/org/linphone/ChatFragment.java | 7 +- src/org/linphone/ChatListFragment.java | 7 +- src/org/linphone/ContactsListFragment.java | 7 +- src/org/linphone/ContactsManager.java | 14 +--- src/org/linphone/HistoryListFragment.java | 11 +--- src/org/linphone/LinphoneContact.java | 77 +++++----------------- 6 files changed, 25 insertions(+), 98 deletions(-) diff --git a/src/org/linphone/ChatFragment.java b/src/org/linphone/ChatFragment.java index 27370af3f..cc8b68ea5 100644 --- a/src/org/linphone/ChatFragment.java +++ b/src/org/linphone/ChatFragment.java @@ -1110,12 +1110,7 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC displayName = contact.getFullName(); } if (contact.hasPhoto()) { - Bitmap photo = contact.getPhoto(); - if (photo != null) { - holder.contactPicture.setImageBitmap(photo); - } else { - LinphoneUtils.setImagePictureFromUri(getActivity(), holder.contactPicture, contact.getPhotoUri(), contact.getThumbnailUri()); - } + LinphoneUtils.setImagePictureFromUri(getActivity(), holder.contactPicture, contact.getPhotoUri(), contact.getThumbnailUri()); } else { holder.contactPicture.setImageResource(R.drawable.avatar); } diff --git a/src/org/linphone/ChatListFragment.java b/src/org/linphone/ChatListFragment.java index d18c84fdb..4eb79ff82 100644 --- a/src/org/linphone/ChatListFragment.java +++ b/src/org/linphone/ChatListFragment.java @@ -422,12 +422,7 @@ public class ChatListFragment extends Fragment implements OnClickListener, OnIte if (contact != null) { - Bitmap photo = contact.getPhoto(); - if (photo != null) { - holder.contactPicture.setImageBitmap(photo); - } else { - LinphoneUtils.setImagePictureFromUri(getActivity(), holder.contactPicture, contact.getPhotoUri(), contact.getThumbnailUri()); - } + LinphoneUtils.setImagePictureFromUri(getActivity(), holder.contactPicture, contact.getPhotoUri(), contact.getThumbnailUri()); } else { holder.contactPicture.setImageResource(R.drawable.avatar); } diff --git a/src/org/linphone/ContactsListFragment.java b/src/org/linphone/ContactsListFragment.java index fc71a6df6..156a49f4f 100644 --- a/src/org/linphone/ContactsListFragment.java +++ b/src/org/linphone/ContactsListFragment.java @@ -524,12 +524,7 @@ public class ContactsListFragment extends Fragment implements OnClickListener, O } if (contact.hasPhoto()) { - Bitmap photo = contact.getPhoto(); - if (photo != null) { - holder.contactPicture.setImageBitmap(photo); - } else { - LinphoneUtils.setImagePictureFromUri(getActivity(), holder.contactPicture, contact.getPhotoUri(), contact.getThumbnailUri()); - } + LinphoneUtils.setImagePictureFromUri(getActivity(), holder.contactPicture, contact.getPhotoUri(), contact.getThumbnailUri()); } else { holder.contactPicture.setImageResource(R.drawable.avatar); } diff --git a/src/org/linphone/ContactsManager.java b/src/org/linphone/ContactsManager.java index 1c23ecabe..81e8b408d 100644 --- a/src/org/linphone/ContactsManager.java +++ b/src/org/linphone/ContactsManager.java @@ -300,10 +300,7 @@ public class ContactsManager extends ContentObserver { while (c.moveToNext()) { String id = c.getString(c.getColumnIndex(Data.CONTACT_ID)); String displayName = c.getString(c.getColumnIndex(Data.DISPLAY_NAME)); - String givenName = c.getString(c.getColumnIndex(CommonDataKinds.StructuredName.GIVEN_NAME)); - String familyName = c.getString(c.getColumnIndex(CommonDataKinds.StructuredName.FAMILY_NAME)); LinphoneContact contact = new LinphoneContact(); - contact.setFirstNameAndLastName(givenName, familyName); contact.setFullName(displayName); contact.setAndroidId(id); contacts.add(contact); @@ -359,7 +356,7 @@ public class ContactsManager extends ContentObserver { TimeUnit.MILLISECONDS.toMinutes(timeElapsed), TimeUnit.MILLISECONDS.toSeconds(timeElapsed) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(timeElapsed))); - Log.d("[ContactsManager] minimal informations for " + contacts.size() + " contacts gathered in " + time); + Log.i("[ContactsManager] minimal informations for " + contacts.size() + " contacts gathered in " + time); // Public the current list of contacts without all the informations populated publishProgress(contacts); @@ -372,7 +369,7 @@ public class ContactsManager extends ContentObserver { TimeUnit.MILLISECONDS.toMinutes(timeElapsed), TimeUnit.MILLISECONDS.toSeconds(timeElapsed) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(timeElapsed))); - Log.d("[ContactsManager] complete informations for " + contacts.size() + " contacts gathered in " + time); + Log.i("[ContactsManager] complete informations for " + contacts.size() + " contacts gathered in " + time); return contacts; } @@ -452,7 +449,7 @@ public class ContactsManager extends ContentObserver { + "' AND " + CommonDataKinds.Phone.NUMBER + " IS NOT NULL " + " OR (" + Data.MIMETYPE + " = '" + CommonDataKinds.SipAddress.CONTENT_ITEM_TYPE + "' AND " + CommonDataKinds.SipAddress.SIP_ADDRESS + " IS NOT NULL))"; - String[] projection = new String[] { Data.CONTACT_ID, Data.DISPLAY_NAME, CommonDataKinds.StructuredName.GIVEN_NAME, CommonDataKinds.StructuredName.FAMILY_NAME }; + String[] projection = new String[] { Data.CONTACT_ID, Data.DISPLAY_NAME }; String query = Data.DISPLAY_NAME + " IS NOT NULL AND (" + req + ")"; Cursor cursor = cr.query(Data.CONTENT_URI, projection, query, null, " lower(" + Data.DISPLAY_NAME + ") COLLATE UNICODE ASC"); @@ -470,14 +467,9 @@ public class ContactsManager extends ContentObserver { int contactID = cursor.getColumnIndex(Data.CONTACT_ID); int displayName = cursor.getColumnIndex(Data.DISPLAY_NAME); - int givenName = cursor.getColumnIndex(CommonDataKinds.StructuredName.GIVEN_NAME); - int familyName = cursor.getColumnIndex(CommonDataKinds.StructuredName.FAMILY_NAME); newRow[contactID] = cursor.getString(contactID); newRow[displayName] = cursor.getString(displayName); - newRow[givenName] = cursor.getString(givenName); - newRow[familyName] = cursor.getString(familyName); - result.addRow(newRow); } } diff --git a/src/org/linphone/HistoryListFragment.java b/src/org/linphone/HistoryListFragment.java index 83840f0da..fb2ed93ba 100644 --- a/src/org/linphone/HistoryListFragment.java +++ b/src/org/linphone/HistoryListFragment.java @@ -473,16 +473,7 @@ public class HistoryListFragment extends Fragment implements OnClickListener, On final String sipUri = address.asString(); if (c != null) { displayName = c.getFullName(); - if (c.hasPhoto()) { - Bitmap photo = c.getPhoto(); - if (photo != null) { - holder.contactPicture.setImageBitmap(photo); - } else { - LinphoneUtils.setImagePictureFromUri(getActivity(), holder.contactPicture, c.getPhotoUri(), c.getThumbnailUri()); - } - } else { - LinphoneUtils.setImagePictureFromUri(getActivity(), holder.contactPicture, c.getPhotoUri(), c.getThumbnailUri()); - } + LinphoneUtils.setImagePictureFromUri(getActivity(), holder.contactPicture, c.getPhotoUri(), c.getThumbnailUri()); } else { holder.contactPicture.setImageResource(R.drawable.avatar); } diff --git a/src/org/linphone/LinphoneContact.java b/src/org/linphone/LinphoneContact.java index 94e55840b..52d34c8c6 100644 --- a/src/org/linphone/LinphoneContact.java +++ b/src/org/linphone/LinphoneContact.java @@ -18,8 +18,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package org.linphone; -import java.io.FileNotFoundException; -import java.io.IOException; import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; @@ -29,7 +27,6 @@ import java.util.Locale; import org.linphone.core.LinphoneAddress; import org.linphone.core.LinphoneCore; import org.linphone.core.LinphoneCoreException; -import org.linphone.core.LinphoneCoreFactory; import org.linphone.core.LinphoneFriend; import org.linphone.core.LinphoneFriend.SubscribePolicy; import org.linphone.core.PresenceBasicStatus; @@ -41,10 +38,8 @@ import android.content.ContentResolver; import android.content.ContentUris; import android.content.ContentValues; import android.database.Cursor; -import android.graphics.Bitmap; import android.net.Uri; import android.provider.ContactsContract; -import android.provider.MediaStore; import android.provider.ContactsContract.CommonDataKinds; public class LinphoneContact implements Serializable, Comparable { @@ -60,7 +55,6 @@ public class LinphoneContact implements Serializable, Comparable changesToCommit; private transient ArrayList changesToCommit2; private boolean hasSipAddress; - private transient Bitmap photoBitmap, thumbnailBitmap; public LinphoneContact() { addresses = new ArrayList(); @@ -71,20 +65,7 @@ public class LinphoneContact implements Serializable, Comparable(); hasSipAddress = false; } - - @Override - protected void finalize() throws Throwable { - if (photoBitmap != null) { - photoBitmap.recycle(); - photoBitmap = null; - } - if (thumbnailBitmap != null) { - thumbnailBitmap.recycle(); - thumbnailBitmap = null; - } - super.finalize(); - } - + @Override public int compareTo(LinphoneContact contact) { String fullName = getFullName() != null ? getFullName().toUpperCase(Locale.getDefault()) : ""; @@ -188,60 +169,21 @@ public class LinphoneContact implements Serializable, Comparable