diff --git a/src/org/linphone/ChatActivity.java b/src/org/linphone/ChatActivity.java index f37ec58cb..b486f4901 100644 --- a/src/org/linphone/ChatActivity.java +++ b/src/org/linphone/ChatActivity.java @@ -34,6 +34,7 @@ public class ChatActivity extends FragmentActivity { extras.putString("SipUri", getIntent().getExtras().getString("SipUri")); extras.putString("DisplayName", getIntent().getExtras().getString("DisplayName")); extras.putString("PictureUri", getIntent().getExtras().getString("PictureUri")); + extras.putString("ThumbnailUri", getIntent().getExtras().getString("ThumbnailUri")); ChatFragment fragment = new ChatFragment(); fragment.setArguments(extras); diff --git a/src/org/linphone/ChatFragment.java b/src/org/linphone/ChatFragment.java index 2820c6705..e68ea2669 100644 --- a/src/org/linphone/ChatFragment.java +++ b/src/org/linphone/ChatFragment.java @@ -33,6 +33,7 @@ import org.linphone.core.LinphoneChatMessage.State; import org.linphone.core.LinphoneChatRoom; import org.linphone.core.LinphoneContent; import org.linphone.core.LinphoneCore; +import org.linphone.core.LinphoneCoreException; import org.linphone.core.LinphoneCoreFactory; import org.linphone.core.LinphoneCoreListenerBase; import org.linphone.mediastream.Log; @@ -334,6 +335,20 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC } private void displayChatHeader(String displayName, String pictureUri) { + LinphoneAddress lAddress; + try { + lAddress = LinphoneCoreFactory.instance().createLinphoneAddress(sipUri); + Contact contact = ContactsManager.getInstance().findContactWithAddress(getActivity().getContentResolver(), lAddress); + if (contact != null) { + LinphoneUtils.setImagePictureFromUri(getActivity(), contactPicture.getView(), contact.getPhotoUri(), contact.getThumbnailUri(), R.drawable.unknown_small); + + } else { + contactPicture.setImageResource(R.drawable.unknown_small); + } + } catch (LinphoneCoreException e) { + e.printStackTrace(); + } + if (displayName == null && getResources().getBoolean(R.bool.only_display_username_if_unknown) && LinphoneUtils.isSipAddress(sipUri)) { contactName.setText(LinphoneUtils.getUsernameFromAddress(sipUri)); } else if (displayName == null) { @@ -342,11 +357,6 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC contactName.setText(displayName); } - if (pictureUri != null) { - LinphoneUtils.setImagePictureFromUri(getActivity(), contactPicture.getView(), Uri.parse(pictureUri), R.drawable.unknown_small); - } else { - contactPicture.setImageResource(R.drawable.unknown_small); - } } public void changeDisplayedChat(String newSipUri, String displayName, String pictureUri) { diff --git a/src/org/linphone/ChatListFragment.java b/src/org/linphone/ChatListFragment.java index fa1a461ce..e6a8b7e8d 100644 --- a/src/org/linphone/ChatListFragment.java +++ b/src/org/linphone/ChatListFragment.java @@ -365,7 +365,7 @@ public class ChatListFragment extends Fragment implements OnClickListener, OnIte if (history != null && history.length > 0) { for (int i = history.length - 1; i >= 0; i--) { LinphoneChatMessage msg = history[i]; - if (msg.getText() != null && msg.getText().length() > 0) { + if (msg.getText() != null && msg.getText().length() > 0 && msg.getFileTransferInformation() == null) { message = msg.getText(); break; } diff --git a/src/org/linphone/Contact.java b/src/org/linphone/Contact.java index 4352bc21d..bbb4ebf13 100644 --- a/src/org/linphone/Contact.java +++ b/src/org/linphone/Contact.java @@ -37,6 +37,7 @@ public class Contact implements Serializable { private String id; private String name; private transient Uri photoUri; + private transient Uri thumbnailUri; private transient Bitmap photo; private List numbersOrAddresses; private boolean hasFriends; @@ -46,23 +47,26 @@ public class Contact implements Serializable { this.id = id; this.name = name; this.photoUri = null; + this.thumbnailUri = null; this.hasFriends = false; } - public Contact(String id, String name, Uri photo) { + public Contact(String id, String name, Uri photo, Uri thumbnail) { super(); this.id = id; this.name = name; this.photoUri = photo; + this.thumbnailUri = thumbnail; this.photo = null; this.hasFriends = false; } - public Contact(String id, String name, Uri photo, Bitmap picture) { + public Contact(String id, String name, Uri photo, Uri thumbnail, Bitmap picture) { super(); this.id = id; this.name = name; this.photoUri = photo; + this.thumbnailUri = thumbnail; this.photo = picture; this.hasFriends = false; } @@ -83,6 +87,10 @@ public class Contact implements Serializable { public Uri getPhotoUri() { return photoUri; } + + public Uri getThumbnailUri() { + return thumbnailUri; + } public Bitmap getPhoto() { return photo; @@ -96,7 +104,7 @@ public class Contact implements Serializable { public void refresh(ContentResolver cr) { this.numbersOrAddresses = Compatibility.extractContactNumbersAndAddresses(id, cr); - for(LinphoneFriend friend : LinphoneManager.getLc().getFriendList()) { + for(LinphoneFriend friend : LinphoneManager.getLcIfManagerNotDestroyedOrNull().getFriendList()) { if (friend.getRefKey().equals(id)) { hasFriends = true; this.numbersOrAddresses.add(friend.getAddress().asStringUriOnly()); diff --git a/src/org/linphone/ContactsManager.java b/src/org/linphone/ContactsManager.java index 1e5aa8001..1852ef93b 100644 --- a/src/org/linphone/ContactsManager.java +++ b/src/org/linphone/ContactsManager.java @@ -154,7 +154,7 @@ public class ContactsManager { friend.setRefKey(contact.getID()); friend.done(); try { - LinphoneManager.getLc().addFriend(friend); + LinphoneManager.getLcIfManagerNotDestroyedOrNull().addFriend(friend); return true; } catch (LinphoneCoreException e) { e.printStackTrace(); @@ -174,7 +174,7 @@ public class ContactsManager { oldSipUri = "sip:" + oldSipUri; } - LinphoneFriend friend = LinphoneManager.getLc().findFriendByAddress(oldSipUri); + LinphoneFriend friend = LinphoneManager.getLcIfManagerNotDestroyedOrNull().findFriendByAddress(oldSipUri); if (friend != null) { friend.edit(); try { @@ -191,18 +191,18 @@ public class ContactsManager { sipUri = "sip:" + sipUri; } - LinphoneFriend friend = LinphoneManager.getLc().findFriendByAddress(sipUri); + LinphoneFriend friend = LinphoneManager.getLcIfManagerNotDestroyedOrNull().findFriendByAddress(sipUri); if (friend != null) { - LinphoneManager.getLc().removeFriend(friend); + LinphoneManager.getLcIfManagerNotDestroyedOrNull().removeFriend(friend); return true; } return false; } public void removeAllFriends(Contact contact) { - for (LinphoneFriend friend : LinphoneManager.getLc().getFriendList()) { + for (LinphoneFriend friend : LinphoneManager.getLcIfManagerNotDestroyedOrNull().getFriendList()) { if (friend.getRefKey().equals(contact.getID())) { - LinphoneManager.getLc().removeFriend(friend); + LinphoneManager.getLcIfManagerNotDestroyedOrNull().removeFriend(friend); } } } @@ -256,8 +256,8 @@ public class ContactsManager { public List getContactsId(){ List ids = new ArrayList(); - if(LinphoneManager.getLc().getFriendList() == null) return null; - for(LinphoneFriend friend : LinphoneManager.getLc().getFriendList()) { + if(LinphoneManager.getLcIfManagerNotDestroyedOrNull().getFriendList() == null) return null; + for(LinphoneFriend friend : LinphoneManager.getLcIfManagerNotDestroyedOrNull().getFriendList()) { friend.edit(); friend.enableSubscribes(false); friend.done(); @@ -342,8 +342,8 @@ public class ContactsManager { if (sipUri.startsWith("sip:")) sipUri = sipUri.substring(4); - if(LinphoneManager.getLc().getFriendList() != null && LinphoneManager.getLc().getFriendList().length > 0) { - for (LinphoneFriend friend : LinphoneManager.getLc().getFriendList()) { + if(LinphoneManager.getLcIfManagerNotDestroyedOrNull().getFriendList() != null && LinphoneManager.getLcIfManagerNotDestroyedOrNull().getFriendList().length > 0) { + for (LinphoneFriend friend : LinphoneManager.getLcIfManagerNotDestroyedOrNull().getFriendList()) { if (friend.getAddress().equals(address)) { return getContact(friend.getRefKey(), contentResolver); } @@ -530,7 +530,7 @@ public class ContactsManager { contact.refresh(contentResolver); //Add tag to Linphone contact if it not existed - if (LinphoneActivity.instance().getResources().getBoolean(R.bool.use_linphone_tag)) { + if (LinphoneActivity.isInstanciated() && LinphoneActivity.instance().getResources().getBoolean(R.bool.use_linphone_tag)) { if (!isContactHasLinphoneTag(contact, contentResolver)) { Compatibility.createLinphoneContactTag(context, contentResolver, contact, findRawContactID(contentResolver, String.valueOf(contact.getID()))); @@ -547,7 +547,7 @@ public class ContactsManager { continue; //Remove linphone contact tag if the contact has no sip address - if (LinphoneActivity.instance().getResources().getBoolean(R.bool.use_linphone_tag)) { + if (LinphoneActivity.isInstanciated() && LinphoneActivity.instance().getResources().getBoolean(R.bool.use_linphone_tag)) { if (removeContactTagIsNeeded(contact) && isContactHasLinphoneTag(contact, contentResolver)) { removeLinphoneContactTag(contact); } diff --git a/src/org/linphone/HistoryDetailFragment.java b/src/org/linphone/HistoryDetailFragment.java index dd1e62311..ceea76b21 100644 --- a/src/org/linphone/HistoryDetailFragment.java +++ b/src/org/linphone/HistoryDetailFragment.java @@ -23,6 +23,7 @@ import java.util.Calendar; import org.linphone.core.LinphoneAddress; import org.linphone.core.LinphoneCoreException; import org.linphone.core.LinphoneCoreFactory; +import org.linphone.mediastream.Log; import org.linphone.ui.AvatarWithShadow; import android.annotation.SuppressLint; @@ -114,10 +115,10 @@ public class HistoryDetailFragment extends Fragment implements OnClickListener { lAddress = LinphoneCoreFactory.instance().createLinphoneAddress(sipUri); Contact contact = ContactsManager.getInstance().findContactWithAddress(getActivity().getContentResolver(), lAddress); if (contact != null) { - LinphoneUtils.setImagePictureFromUri(view.getContext(), contactPicture.getView(),contact.getPhotoUri(), R.drawable.unknown_small); + LinphoneUtils.setImagePictureFromUri(view.getContext(), contactPicture.getView(),contact.getPhotoUri(), contact.getThumbnailUri(), R.drawable.unknown_small); view.findViewById(R.id.addContactRow).setVisibility(View.GONE); } else { - LinphoneUtils.setImagePictureFromUri(view.getContext(), contactPicture.getView(),null ,R.drawable.unknown_small); + LinphoneUtils.setImagePictureFromUri(view.getContext(), contactPicture.getView(),null, null ,R.drawable.unknown_small); } } catch (LinphoneCoreException e) { e.printStackTrace(); diff --git a/src/org/linphone/InCallActivity.java b/src/org/linphone/InCallActivity.java index adbde2ca0..181d1e677 100644 --- a/src/org/linphone/InCallActivity.java +++ b/src/org/linphone/InCallActivity.java @@ -1301,9 +1301,9 @@ public class InCallActivity extends FragmentActivity implements OnClickListener LinearLayout imageView = (LinearLayout) inflater.inflate(R.layout.active_call_image_row, container, false); Contact contact = ContactsManager.getInstance().findContactWithAddress(imageView.getContext().getContentResolver(), lAddress); if(contact != null) { - displayOrHideContactPicture(imageView, contact.getPhotoUri(), false); + displayOrHideContactPicture(imageView, contact.getPhotoUri(), contact.getThumbnailUri(), false); } else { - displayOrHideContactPicture(imageView, null, false); + displayOrHideContactPicture(imageView, null, null, false); } callsList.addView(imageView); @@ -1366,10 +1366,10 @@ public class InCallActivity extends FragmentActivity implements OnClickListener return isCallPaused || isInConference; } - private void displayOrHideContactPicture(LinearLayout callView, Uri pictureUri, boolean hide) { + private void displayOrHideContactPicture(LinearLayout callView, Uri pictureUri, Uri thumbnailUri, boolean hide) { AvatarWithShadow contactPicture = (AvatarWithShadow) callView.findViewById(R.id.contactPicture); if (pictureUri != null) { - LinphoneUtils.setImagePictureFromUri(callView.getContext(), contactPicture.getView(), Uri.parse(pictureUri.toString()), R.drawable.unknown_small); + LinphoneUtils.setImagePictureFromUri(callView.getContext(), contactPicture.getView(), Uri.parse(pictureUri.toString()), thumbnailUri, R.drawable.unknown_small); } callView.setVisibility(hide ? View.GONE : View.VISIBLE); } diff --git a/src/org/linphone/IncomingCallActivity.java b/src/org/linphone/IncomingCallActivity.java index 81427cb60..713c009d0 100644 --- a/src/org/linphone/IncomingCallActivity.java +++ b/src/org/linphone/IncomingCallActivity.java @@ -125,7 +125,8 @@ public class IncomingCallActivity extends Activity implements LinphoneSliderTrig LinphoneAddress address = mCall.getRemoteAddress(); // May be greatly sped up using a drawable cache Contact contact = ContactsManager.getInstance().findContactWithAddress(getContentResolver(), address); - LinphoneUtils.setImagePictureFromUri(this, mPictureView.getView(), contact != null ? contact.getPhotoUri() : null, R.drawable.unknown_small); + LinphoneUtils.setImagePictureFromUri(this, mPictureView.getView(), contact != null ? contact.getPhotoUri() : null, + contact != null ? contact.getThumbnailUri() : null, R.drawable.unknown_small); // To be done after findUriPictureOfContactAndSetDisplayName called mNameView.setText(contact != null ? contact.getName() : ""); diff --git a/src/org/linphone/LinphoneActivity.java b/src/org/linphone/LinphoneActivity.java index 2a4f4298b..2b0e8bf18 100644 --- a/src/org/linphone/LinphoneActivity.java +++ b/src/org/linphone/LinphoneActivity.java @@ -613,7 +613,13 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene } Contact contact = ContactsManager.getInstance().findContactWithAddress(getContentResolver(), lAddress); String displayName = contact != null ? contact.getName() : null; - String pictureUri = contact != null && contact.getPhotoUri() != null ? contact.getPhotoUri().toString() : null; + + String pictureUri = null; + String thumbnailUri = null; + if(contact != null && contact.getPhotoUri() != null){ + pictureUri = contact.getPhotoUri().toString(); + thumbnailUri = contact.getThumbnailUri().toString(); + } if (isTablet()){ if (currentFragment == FragmentsAvailable.CHATLIST || currentFragment == FragmentsAvailable.CHAT){ @@ -624,9 +630,10 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene } else { Bundle extras = new Bundle(); extras.putString("SipUri", sipUri); - if (lAddress.getDisplayName() != null) { + if (contact != null) { extras.putString("DisplayName", displayName); extras.putString("PictureUri", pictureUri); + extras.putString("ThumbnailUri", thumbnailUri); } changeCurrentFragment(FragmentsAvailable.CHAT, extras); } @@ -639,7 +646,8 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene intent.putExtra("SipUri", sipUri); if (contact != null) { intent.putExtra("DisplayName", contact.getName()); - intent.putExtra("PictureUri", contact.getPhotoUri()); + intent.putExtra("PictureUri", pictureUri); + intent.putExtra("ThumbnailUri", thumbnailUri); } startOrientationSensor(); startActivityForResult(intent, CHAT_ACTIVITY); diff --git a/src/org/linphone/LinphoneUtils.java b/src/org/linphone/LinphoneUtils.java index 177d11534..d98711c1e 100644 --- a/src/org/linphone/LinphoneUtils.java +++ b/src/org/linphone/LinphoneUtils.java @@ -58,6 +58,7 @@ import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.Uri; import android.os.Build; +import android.provider.MediaStore; import android.telephony.TelephonyManager; import android.util.TypedValue; import android.view.KeyEvent; @@ -158,7 +159,7 @@ public final class LinphoneUtils { } - public static void setImagePictureFromUri(Context c, ImageView view, Uri uri, int notFoundResource) { + public static void setImagePictureFromUri(Context c, ImageView view, Uri uri, Uri tUri, int notFoundResource) { if (uri == null) { view.setImageResource(notFoundResource); return; @@ -169,7 +170,17 @@ public final class LinphoneUtils { view.setImageBitmap(bm); } else { if (Version.sdkAboveOrEqual(Version.API06_ECLAIR_201)) { - view.setImageURI(uri); + Bitmap bm = null; + try { + bm = MediaStore.Images.Media.getBitmap(c.getContentResolver(),uri); + } catch (IOException e) { + if(tUri != null){ + view.setImageURI(tUri); + } + } + if(bm != null) { + view.setImageBitmap(bm); + } } else { @SuppressWarnings("deprecation") Bitmap bitmap = android.provider.Contacts.People.loadContactPhoto(c, uri, notFoundResource, null); diff --git a/src/org/linphone/compatibility/ApiFivePlus.java b/src/org/linphone/compatibility/ApiFivePlus.java index 5fcc12100..11ce8f0db 100644 --- a/src/org/linphone/compatibility/ApiFivePlus.java +++ b/src/org/linphone/compatibility/ApiFivePlus.java @@ -216,7 +216,8 @@ public class ApiFivePlus { String id = cursor.getString(cursor.getColumnIndex(Data.CONTACT_ID)); String name = getContactDisplayName(cursor); - Uri photo = getContactPictureUri(id); + Uri thumbnail = getContactPictureUri(id); + Uri photo = getContactPhotoUri(id); InputStream input = getContactPictureInputStream(cr, id); Contact contact; @@ -228,7 +229,7 @@ public class ApiFivePlus { try { bm = BitmapFactory.decodeStream(input); } catch (OutOfMemoryError oome) {} - contact = new Contact(id, name, photo, bm); + contact = new Contact(id, name, photo, thumbnail, bm); } return contact; @@ -248,6 +249,11 @@ public class ApiFivePlus { } private static Uri getContactPictureUri(String id) { + Uri person = ContentUris.withAppendedId(Contacts.CONTENT_URI, Long.parseLong(id)); + return Uri.withAppendedPath(person, Contacts.Photo.CONTENT_DIRECTORY); + } + + private static Uri getContactPhotoUri(String id) { Uri person = ContentUris.withAppendedId(Contacts.CONTENT_URI, Long.parseLong(id)); return Uri.withAppendedPath(person, Contacts.Photo.DISPLAY_PHOTO); }