diff --git a/app/src/main/java/org/linphone/utils/ImageUtils.java b/app/src/main/java/org/linphone/utils/ImageUtils.java index d451365fa..ddc749a43 100644 --- a/app/src/main/java/org/linphone/utils/ImageUtils.java +++ b/app/src/main/java/org/linphone/utils/ImageUtils.java @@ -32,65 +32,14 @@ import android.provider.MediaStore; import android.util.DisplayMetrics; import android.util.TypedValue; import android.widget.ImageView; -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; +import com.bumptech.glide.Glide; import org.linphone.R; -import org.linphone.contacts.ContactsManager; -import org.linphone.core.tools.Log; public class ImageUtils { - public static Bitmap downloadBitmap(Uri uri) { - URL url; - InputStream is = null; - try { - url = new URL(uri.toString()); - is = url.openStream(); - return BitmapFactory.decodeStream(is); - } catch (IOException e) { - Log.e(e, e.getMessage()); - } finally { - try { - is.close(); - } catch (IOException x) { - Log.e(x); - } - } - return null; - } - public static void setImagePictureFromUri( Context c, ImageView view, Uri pictureUri, Uri thumbnailUri) { - if (pictureUri == null && thumbnailUri == null) { - view.setImageBitmap(ContactsManager.getInstance().getDefaultAvatarBitmap()); - return; - } - if (pictureUri.getScheme().startsWith("http")) { - Bitmap bm = downloadBitmap(pictureUri); - if (bm == null) view.setImageResource(R.drawable.avatar); - view.setImageBitmap(bm); - } else { - Bitmap bm = null; - try { - bm = MediaStore.Images.Media.getBitmap(c.getContentResolver(), pictureUri); - } catch (IOException e) { - if (thumbnailUri != null) { - try { - bm = - MediaStore.Images.Media.getBitmap( - c.getContentResolver(), thumbnailUri); - } catch (IOException ie) { - Log.e(ie); - } - } - } - if (bm != null) { - view.setImageBitmap(bm); - } else { - view.setImageBitmap(ContactsManager.getInstance().getDefaultAvatarBitmap()); - } - } + Glide.with(c).load(pictureUri).thumbnail(Glide.with(c).load(thumbnailUri)).into(view); } public static Bitmap getRoundBitmapFromUri(Context context, Uri fromPictureUri) { diff --git a/app/src/main/java/org/linphone/views/ContactAvatar.java b/app/src/main/java/org/linphone/views/ContactAvatar.java index df7b6133c..879598e5e 100644 --- a/app/src/main/java/org/linphone/views/ContactAvatar.java +++ b/app/src/main/java/org/linphone/views/ContactAvatar.java @@ -19,20 +19,23 @@ along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -import android.graphics.Bitmap; -import android.provider.MediaStore; +import android.content.Context; +import android.graphics.drawable.Drawable; import android.view.View; import android.widget.ImageView; import android.widget.TextView; -import java.io.IOException; +import androidx.annotation.Nullable; +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.DataSource; +import com.bumptech.glide.load.engine.GlideException; +import com.bumptech.glide.request.RequestListener; +import com.bumptech.glide.request.target.Target; import org.linphone.LinphoneService; import org.linphone.R; import org.linphone.contacts.LinphoneContact; import org.linphone.core.ChatRoomSecurityLevel; -import org.linphone.core.tools.Log; -import org.linphone.utils.ImageUtils; -class ContactAvatarHolder { +class ContactAvatarHolder implements RequestListener { public final ImageView contactPicture; public final ImageView avatarMask; public final ImageView securityLevel; @@ -50,6 +53,27 @@ class ContactAvatarHolder { generatedAvatar.setVisibility(View.VISIBLE); securityLevel.setVisibility(View.GONE); } + + @Override + public boolean onLoadFailed( + @Nullable GlideException e, + Object model, + Target target, + boolean isFirstResource) { + generatedAvatar.setVisibility(View.VISIBLE); + contactPicture.setVisibility(View.GONE); + return true; + } + + @Override + public boolean onResourceReady( + Drawable resource, + Object model, + Target target, + DataSource dataSource, + boolean isFirstResource) { + return false; + } } public class ContactAvatar { @@ -126,38 +150,24 @@ public class ContactAvatar { public static void displayAvatar(LinphoneContact contact, View v) { if (contact == null || v == null) return; - Bitmap bm = null; ContactAvatarHolder holder = new ContactAvatarHolder(v); holder.init(); - if (contact.getThumbnailUri() != null - && contact.getThumbnailUri().getScheme().startsWith("http")) { - bm = ImageUtils.downloadBitmap(contact.getThumbnailUri()); - } else { - if (contact.getThumbnailUri() != null) { - try { - bm = - MediaStore.Images.Media.getBitmap( - LinphoneService.instance().getContentResolver(), - contact.getThumbnailUri()); - } catch (IOException e) { - Log.e(e); - } - } - } + // Kepp the generated avatar ready in case of failure while loading picture + holder.generatedAvatar.setText( + generateAvatar( + contact.getFullName() == null + ? contact.getFirstName() + " " + contact.getLastName() + : contact.getFullName())); + holder.generatedAvatar.setVisibility(View.GONE); - if (bm != null) { - holder.contactPicture.setImageBitmap(bm); - holder.contactPicture.setVisibility(View.VISIBLE); - holder.generatedAvatar.setVisibility(View.GONE); - } else { - holder.generatedAvatar.setText( - generateAvatar( - contact.getFullName() == null - ? contact.getFirstName() + " " + contact.getLastName() - : contact.getFullName())); - holder.generatedAvatar.setVisibility(View.VISIBLE); - } + Context c = LinphoneService.instance().getApplicationContext(); + holder.contactPicture.setVisibility(View.VISIBLE); + Glide.with(c) + .load(contact.getPhotoUri()) + .thumbnail(Glide.with(c).load(contact.getThumbnailUri())) + .listener(holder) + .into(holder.contactPicture); holder.securityLevel.setVisibility(View.GONE); }