Allow publishing SVG avatar

Stephen Paul Weber created

Change summary

src/main/java/eu/siacs/conversations/persistance/FileBackend.java                   | 17 
src/main/java/eu/siacs/conversations/ui/PublishGroupChatProfilePictureActivity.java |  3 
src/main/java/eu/siacs/conversations/ui/PublishProfilePictureActivity.java          |  3 
3 files changed, 17 insertions(+), 6 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/persistance/FileBackend.java 🔗

@@ -1537,7 +1537,12 @@ public class FileBackend {
                 return new Pair(getPepAvatar(bitmap, Bitmap.CompressFormat.PNG, 100), false);
             }
         } catch (Exception e) {
-            return null;
+            try {
+                final SVG svg = SVG.getFromInputStream(mXmppConnectionService.getContentResolver().openInputStream(uri));
+                return new Pair(getPepAvatar(uri, (int) svg.getDocumentWidth(), (int) svg.getDocumentHeight(), "image/svg+xml"), true);
+            } catch (Exception e2) {
+                return null;
+            }
         }
     }
 
@@ -1758,7 +1763,7 @@ public class FileBackend {
                     decoder.setCrop(new Rect(left, top, left + newSize, top + newSize));
                 });
             } catch (final IOException e) {
-                return null;
+                return getSVGSquare(image, size);
             }
         } else {
             Bitmap bitmap = cropCenterSquare(image, size);
@@ -2125,7 +2130,7 @@ public class FileBackend {
             Canvas canvas = new Canvas(output);
             svg.renderToCanvas(canvas, target);
 
-            return new BitmapDrawable(output);
+            return new SVGDrawable(output);
         } catch (final IOException | SVGParseException e) {
             return null;
         }
@@ -2146,7 +2151,7 @@ public class FileBackend {
             Canvas canvas = new Canvas(output);
             svg.renderToCanvas(canvas);
 
-            return new BitmapDrawable(output);
+            return new SVGDrawable(output);
         } catch (final IOException | SVGParseException e) {
             return null;
         }
@@ -2198,4 +2203,8 @@ public class FileBackend {
             return resId;
         }
     }
+
+    public static class SVGDrawable extends BitmapDrawable {
+        public SVGDrawable(Bitmap bm) { super(bm); }
+    }
 }

src/main/java/eu/siacs/conversations/ui/PublishGroupChatProfilePictureActivity.java 🔗

@@ -48,6 +48,7 @@ import eu.siacs.conversations.Config;
 import eu.siacs.conversations.R;
 import eu.siacs.conversations.databinding.ActivityPublishProfilePictureBinding;
 import eu.siacs.conversations.entities.Conversation;
+import eu.siacs.conversations.persistance.FileBackend;
 import eu.siacs.conversations.ui.interfaces.OnAvatarPublication;
 import eu.siacs.conversations.ui.util.PendingItem;
 
@@ -145,7 +146,7 @@ public class PublishGroupChatProfilePictureActivity extends XmppActivity impleme
         if (Build.VERSION.SDK_INT >= 28) {
             this.uri = uri;
             reloadAvatar();
-            if (this.binding.accountImage.getDrawable() instanceof AnimatedImageDrawable) {
+            if (this.binding.accountImage.getDrawable() instanceof AnimatedImageDrawable || this.binding.accountImage.getDrawable() instanceof FileBackend.SVGDrawable) {
                 return;
             }
         }

src/main/java/eu/siacs/conversations/ui/PublishProfilePictureActivity.java 🔗

@@ -29,6 +29,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import eu.siacs.conversations.Config;
 import eu.siacs.conversations.R;
 import eu.siacs.conversations.entities.Account;
+import eu.siacs.conversations.persistance.FileBackend;
 import eu.siacs.conversations.services.XmppConnectionService;
 import eu.siacs.conversations.ui.interfaces.OnAvatarPublication;
 import eu.siacs.conversations.utils.PhoneHelper;
@@ -241,7 +242,7 @@ public class PublishProfilePictureActivity extends XmppActivity implements XmppC
     public void cropUri(final Uri uri) {
         if (Build.VERSION.SDK_INT >= 28) {
             loadImageIntoPreview(uri);
-            if (this.avatar.getDrawable() instanceof AnimatedImageDrawable) {
+            if (this.avatar.getDrawable() instanceof AnimatedImageDrawable || this.avatar.getDrawable() instanceof FileBackend.SVGDrawable) {
                 this.avatarUri = uri;
                 return;
             }