Change summary
  src/main/java/eu/siacs/conversations/persistance/FileBackend.java | 24 
src/main/java/eu/siacs/conversations/services/AvatarService.java  |  2 
2 files changed, 23 insertions(+), 3 deletions(-)
  Detailed changes
  
  
    
    @@ -2008,8 +2008,28 @@ public class FileBackend {
         if (avatar == null) {
             return null;
         }
-        Bitmap bm = cropCenter(getAvatarUri(avatar), size, size);
-        return new BitmapDrawable(bm);
+
+        if (android.os.Build.VERSION.SDK_INT >= 28) {
+            try {
+                ImageDecoder.Source source = ImageDecoder.createSource(getAvatarFile(avatar));
+                return ImageDecoder.decodeDrawable(source, (decoder, info, src) -> {
+                    int w = info.getSize().getWidth();
+                    int h = info.getSize().getHeight();
+                    Rect r = rectForSize(w, h, size);
+                    decoder.setTargetSize(r.width(), r.height());
+
+                    int newSize = Math.min(r.width(), r.height());
+                    int left = (r.width() - newSize) / 2;
+                    int top = (r.height() - newSize) / 2;
+                    decoder.setCrop(new Rect(left, top, left + newSize, top + newSize));
+                });
+            } catch (final IOException e) {
+                return null;
+            }
+        } else {
+            Bitmap bm = cropCenter(getAvatarUri(avatar), size, size);
+            return new BitmapDrawable(bm);
+        }
     }
 
     private static class Dimensions {
  
  
  
    
    @@ -154,7 +154,7 @@ public class AvatarService implements OnAdvancedStreamFeaturesLoaded {
 		canvas.drawARGB(0, 0, 0, 0);
 		canvas.drawCircle(bitmap.getWidth() / 2, bitmap.getHeight() / 2, bitmap.getWidth() / 2, paint);
 		paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
-		canvas.drawBitmap(bitmap, rect, rect, paint);
+		canvas.drawBitmap(bitmap.copy(Bitmap.Config.ARGB_8888, false), rect, rect, paint);
 	}
 
 	private void drawIcon(Canvas canvas, Paint paint) {