diff --git a/src/org/linphone/Contact.java b/src/org/linphone/Contact.java index e456bcc54..55d16a684 100644 --- a/src/org/linphone/Contact.java +++ b/src/org/linphone/Contact.java @@ -20,6 +20,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. import java.io.Serializable; import java.util.List; +import android.graphics.Bitmap; import android.net.Uri; /** @@ -30,21 +31,31 @@ public class Contact implements Serializable { private String id; private String name; - private transient Uri photo; + private transient Uri photoUri; + private transient Bitmap photo; private List numerosOrAddresses; public Contact(String id, String name) { super(); this.id = id; this.name = name; - this.photo = null; + this.photoUri = null; } public Contact(String id, String name, Uri photo) { super(); this.id = id; this.name = name; - this.photo = photo; + this.photoUri = photo; + this.photo = null; + } + + public Contact(String id, String name, Uri photo, Bitmap picture) { + super(); + this.id = id; + this.name = name; + this.photoUri = photo; + this.photo = picture; } public String getID() { @@ -55,7 +66,11 @@ public class Contact implements Serializable { return name; } - public Uri getPhoto() { + public Uri getPhotoUri() { + return photoUri; + } + + public Bitmap getPhoto() { return photo; } diff --git a/src/org/linphone/ContactFragment.java b/src/org/linphone/ContactFragment.java index 860a79621..5c220aad4 100644 --- a/src/org/linphone/ContactFragment.java +++ b/src/org/linphone/ContactFragment.java @@ -41,7 +41,7 @@ public class ContactFragment extends Fragment { ImageView contactPicture = (ImageView) view.findViewById(R.id.contactPicture); if (contact.getPhoto() != null) { - LinphoneUtils.setImagePictureFromUri(view.getContext(), contactPicture, contact.getPhoto(), R.drawable.unknown_small); + LinphoneUtils.setImagePictureFromUri(view.getContext(), contactPicture, contact.getPhotoUri(), R.drawable.unknown_small); } chatListener = getChatListener(); @@ -81,7 +81,7 @@ public class ContactFragment extends Fragment { return new OnClickListener() { @Override public void onClick(View v) { - LinphoneActivity.instance().setAddressAndGoToDialer(v.getTag().toString(), contact.getName(), contact.getPhoto()); + LinphoneActivity.instance().setAddressAndGoToDialer(v.getTag().toString(), contact.getName(), contact.getPhotoUri()); } }; } diff --git a/src/org/linphone/ContactsFragment.java b/src/org/linphone/ContactsFragment.java index f0bd86288..1b458a92d 100644 --- a/src/org/linphone/ContactsFragment.java +++ b/src/org/linphone/ContactsFragment.java @@ -18,6 +18,8 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; import android.content.ContentUris; import android.content.Intent; @@ -53,6 +55,7 @@ public class ContactsFragment extends Fragment implements OnClickListener, OnIte private boolean onlyDisplayLinphoneCalls; private int lastKnownPosition; private Cursor cursor; + private List contacts; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, @@ -114,10 +117,45 @@ public class ContactsFragment extends Fragment implements OnClickListener, OnIte contactsList.setAdapter(new ContactsListAdapter()); contactsList.setFastScrollEnabled(true); } + contacts = new ArrayList(); + new Thread(new Runnable() { + @Override + public void run() { + for (int i = 0; i < cursor.getCount(); i++) { + Contact contact = getContact(i); + contacts.add(contact); + } + } + }).start(); contactsList.setSelectionFromTop(lastKnownPosition, 0); } + private Contact getContact(int position) { + cursor.moveToFirst(); + boolean success = cursor.move(position); + if (!success) + return null; + + String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); + String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); + Uri person = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.parseLong(id)); + Uri photo = Uri.withAppendedPath(person, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY); + + InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(getActivity().getContentResolver(), person); + Contact contact; + if (input == null) { + contact = new Contact(id, name); + } + else { + contact = new Contact(id, name, photo, BitmapFactory.decodeStream(input)); + } + + contact.setNumerosOrAddresses(ContactHelper.extractContactNumbersAndAddresses(contact.getID(), getActivity().getContentResolver())); + + return contact; + } + class ContactsListAdapter extends BaseAdapter implements SectionIndexer { private AlphabetIndexer indexer; private int margin; @@ -134,28 +172,11 @@ public class ContactsFragment extends Fragment implements OnClickListener, OnIte } public Object getItem(int position) { - cursor.moveToFirst(); - boolean success = cursor.move(position); - if (!success) - return null; - - String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); - String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); - Uri person = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.parseLong(id)); - Uri photo = Uri.withAppendedPath(person, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY); - - InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(getActivity().getContentResolver(), person); - Contact contact; - if (input == null) { - contact = new Contact(id, name); - } - else { - contact = new Contact(id, name, photo); - } - - contact.setNumerosOrAddresses(ContactHelper.extractContactNumbersAndAddresses(contact.getID(), getActivity().getContentResolver())); - - return contact; + if (position >= contacts.size()) { + return getContact(position); + } else { + return contacts.get(position); + } } public long getItemId(int position) { @@ -171,7 +192,10 @@ public class ContactsFragment extends Fragment implements OnClickListener, OnIte view = mInflater.inflate(R.layout.contact_cell, parent, false); } - Contact contact = (Contact) getItem(position); + Contact contact = null; + do { + contact = (Contact) getItem(position); + } while (contact == null); TextView name = (TextView) view.findViewById(R.id.name); name.setText(contact.getName()); @@ -189,7 +213,9 @@ public class ContactsFragment extends Fragment implements OnClickListener, OnIte ImageView icon = (ImageView) view.findViewById(R.id.icon); if (contact.getPhoto() != null) { - icon.setImageURI(contact.getPhoto()); + icon.setImageBitmap(contact.getPhoto()); + } else if (contact.getPhotoUri() != null) { + icon.setImageURI(contact.getPhotoUri()); } else { icon.setImageBitmap(bitmapUnknown); }