From 89c5e118dce8041cfa941e2c9dc0f316754ee7f5 Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Tue, 27 Jun 2023 19:54:44 -0500 Subject: [PATCH] Use ImageDecoder for avatars --- .../persistance/FileBackend.java | 24 +++++++++++++++++-- .../conversations/services/AvatarService.java | 2 +- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/persistance/FileBackend.java b/src/main/java/eu/siacs/conversations/persistance/FileBackend.java index ae6a4876bf4b71923548ad4c98d51f953f129be1..542d6dec34f4f302d2ebb9b96cc85e1b76ad91a4 100644 --- a/src/main/java/eu/siacs/conversations/persistance/FileBackend.java +++ b/src/main/java/eu/siacs/conversations/persistance/FileBackend.java @@ -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 { diff --git a/src/main/java/eu/siacs/conversations/services/AvatarService.java b/src/main/java/eu/siacs/conversations/services/AvatarService.java index 65d54301bbed4f44cc68060fb8ce570513eb2e6e..198285d515ef6df353cc5d366709ce3362d60b55 100644 --- a/src/main/java/eu/siacs/conversations/services/AvatarService.java +++ b/src/main/java/eu/siacs/conversations/services/AvatarService.java @@ -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) {