add overlay to indicate that image is gif

Daniel Gultsch created

Change summary

art/play_gif.svg                                                    | 68 
art/render.rb                                                       |  3 
src/main/java/eu/siacs/conversations/persistance/FileBackend.java   | 32 
src/main/res/drawable-hdpi/message_bubble_received.9.png            |  0 
src/main/res/drawable-hdpi/message_bubble_received_dark.9.png       |  0 
src/main/res/drawable-hdpi/message_bubble_received_grey.9.png       |  0 
src/main/res/drawable-hdpi/message_bubble_received_warning.9.png    |  0 
src/main/res/drawable-hdpi/message_bubble_received_white.9.png      |  0 
src/main/res/drawable-hdpi/message_bubble_sent.9.png                |  0 
src/main/res/drawable-hdpi/message_bubble_sent_grey.9.png           |  0 
src/main/res/drawable-hdpi/play_gif.png                             |  0 
src/main/res/drawable-hdpi/play_video.png                           |  0 
src/main/res/drawable-mdpi/message_bubble_received.9.png            |  0 
src/main/res/drawable-mdpi/message_bubble_received_dark.9.png       |  0 
src/main/res/drawable-mdpi/message_bubble_received_grey.9.png       |  0 
src/main/res/drawable-mdpi/message_bubble_received_warning.9.png    |  0 
src/main/res/drawable-mdpi/message_bubble_received_white.9.png      |  0 
src/main/res/drawable-mdpi/message_bubble_sent.9.png                |  0 
src/main/res/drawable-mdpi/message_bubble_sent_grey.9.png           |  0 
src/main/res/drawable-mdpi/play_gif.png                             |  0 
src/main/res/drawable-mdpi/play_video.png                           |  0 
src/main/res/drawable-xhdpi/message_bubble_received.9.png           |  0 
src/main/res/drawable-xhdpi/message_bubble_received_dark.9.png      |  0 
src/main/res/drawable-xhdpi/message_bubble_received_grey.9.png      |  0 
src/main/res/drawable-xhdpi/message_bubble_received_warning.9.png   |  0 
src/main/res/drawable-xhdpi/message_bubble_received_white.9.png     |  0 
src/main/res/drawable-xhdpi/message_bubble_sent.9.png               |  0 
src/main/res/drawable-xhdpi/message_bubble_sent_grey.9.png          |  0 
src/main/res/drawable-xhdpi/play_gif.png                            |  0 
src/main/res/drawable-xhdpi/play_video.png                          |  0 
src/main/res/drawable-xxhdpi/message_bubble_received.9.png          |  0 
src/main/res/drawable-xxhdpi/message_bubble_received_dark.9.png     |  0 
src/main/res/drawable-xxhdpi/message_bubble_received_grey.9.png     |  0 
src/main/res/drawable-xxhdpi/message_bubble_received_warning.9.png  |  0 
src/main/res/drawable-xxhdpi/message_bubble_received_white.9.png    |  0 
src/main/res/drawable-xxhdpi/message_bubble_sent.9.png              |  0 
src/main/res/drawable-xxhdpi/message_bubble_sent_grey.9.png         |  0 
src/main/res/drawable-xxhdpi/play_gif.png                           |  0 
src/main/res/drawable-xxhdpi/play_video.png                         |  0 
src/main/res/drawable-xxxhdpi/message_bubble_received.9.png         |  0 
src/main/res/drawable-xxxhdpi/message_bubble_received_dark.9.png    |  0 
src/main/res/drawable-xxxhdpi/message_bubble_received_grey.9.png    |  0 
src/main/res/drawable-xxxhdpi/message_bubble_received_warning.9.png |  0 
src/main/res/drawable-xxxhdpi/message_bubble_received_white.9.png   |  0 
src/main/res/drawable-xxxhdpi/message_bubble_sent.9.png             |  0 
src/main/res/drawable-xxxhdpi/message_bubble_sent_grey.9.png        |  0 
src/main/res/drawable-xxxhdpi/play_gif.png                          |  0 
src/main/res/drawable-xxxhdpi/play_video.png                        |  0 
48 files changed, 96 insertions(+), 7 deletions(-)

Detailed changes

art/play_gif.svg 🔗

@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   viewBox="0 0 24 24"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="play_gif.svg">
+  <metadata
+     id="metadata14">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1920"
+     inkscape:window-height="1200"
+     id="namedview12"
+     showgrid="false"
+     inkscape:zoom="9.8333333"
+     inkscape:cx="1.5762712"
+     inkscape:cy="11.084746"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg2" />
+  <defs
+     id="defs4">
+    <path
+       id="a"
+       d="M24 24H0V0h24v24z" />
+  </defs>
+  <clipPath
+     id="b">
+    <use
+       xlink:href="#a"
+       overflow="visible"
+       id="use8" />
+  </clipPath>
+  <path
+     d="M11.5 9H13v6h-1.5zM9 9H6c-.6 0-1 .5-1 1v4c0 .5.4 1 1 1h3c.6 0 1-.5 1-1v-2H8.5v1.5h-2v-3H10V10c0-.5-.4-1-1-1zm10 1.5V9h-4.5v6H16v-2h2v-1.5h-2v-1z"
+     clip-path="url(#b)"
+     id="path10"
+     style="fill:#ffffff;fill-opacity:0.7019608" />
+</svg>

art/render.rb 🔗

@@ -13,7 +13,8 @@ resolutions = {
 images = {
 	'ic_launcher.svg' => ['ic_launcher', 48],
 	'main_logo.svg' => ['main_logo', 200],
-	'play_video.svg' => ['play_video', 96],
+	'play_video.svg' => ['play_video', 128],
+	'play_gif.svg' => ['play_gif', 128],
 	'conversations_mono.svg' => ['ic_notification', 24],
 	'ic_received_indicator.svg' => ['ic_received_indicator', 12],
 	'ic_send_text_offline.svg' => ['ic_send_text_offline', 36],

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

@@ -9,6 +9,8 @@ import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.graphics.Canvas;
 import android.graphics.Matrix;
+import android.graphics.Paint;
+import android.graphics.Rect;
 import android.graphics.RectF;
 import android.media.MediaMetadataRetriever;
 import android.net.Uri;
@@ -412,7 +414,8 @@ public class FileBackend {
 					return thumbnail;
 				}
 				DownloadableFile file = getFile(message);
-				if (file.getMimeType().startsWith("video/")) {
+				final String mime = file.getMimeType();
+				if (mime.startsWith("video/")) {
 					thumbnail = getVideoPreview(file, size);
 				} else {
 					Bitmap fullsize = getFullsizeImagePreview(file, size);
@@ -421,6 +424,12 @@ public class FileBackend {
 					}
 					thumbnail = resize(fullsize, size);
 					thumbnail = rotate(thumbnail, getRotation(file));
+					if (mime.equals("image/gif")) {
+						Bitmap withGifOverlay = thumbnail.copy(Bitmap.Config.ARGB_8888,true);
+						drawOverlay(withGifOverlay,R.drawable.play_gif,1.0f);
+						thumbnail.recycle();
+						thumbnail = withGifOverlay;
+					}
 				}
 				this.mXmppConnectionService.getBitmapCache().put(uuid, thumbnail);
 			}
@@ -439,6 +448,21 @@ public class FileBackend {
 		}
 	}
 
+	private void drawOverlay(Bitmap bitmap, int resource, float factor) {
+		Bitmap overlay = BitmapFactory.decodeResource(mXmppConnectionService.getResources(), resource);
+		Canvas canvas = new Canvas(bitmap);
+		Paint paint = new Paint();
+		paint.setAntiAlias(true);
+		paint.setFilterBitmap(true);
+		paint.setDither(true);
+		float targetSize = Math.min(canvas.getWidth(),canvas.getHeight()) * factor;
+		Log.d(Config.LOGTAG,"target size overlay: "+targetSize+" overlay bitmap size was "+overlay.getHeight());
+		float left = (canvas.getWidth() - targetSize) / 2.0f;
+		float top = (canvas.getHeight() - targetSize) / 2.0f;
+		RectF dst = new RectF(left,top,left+targetSize-1,top+targetSize-1);
+		canvas.drawBitmap(overlay,null,dst,paint);
+	}
+
 	private Bitmap getVideoPreview(File file, int size) {
 		MediaMetadataRetriever metadataRetriever = new MediaMetadataRetriever();
 		Bitmap frame;
@@ -451,11 +475,7 @@ public class FileBackend {
 			frame = Bitmap.createBitmap(size,size, Bitmap.Config.ARGB_8888);
 			frame.eraseColor(0xff000000);
 		}
-		Canvas canvas = new Canvas(frame);
-		Bitmap play = BitmapFactory.decodeResource(mXmppConnectionService.getResources(), R.drawable.play_video);
-		float x = (frame.getWidth() - play.getWidth()) / 2.0f;
-		float y = (frame.getHeight() - play.getHeight()) / 2.0f;
-		canvas.drawBitmap(play,x,y,null);
+		drawOverlay(frame,R.drawable.play_video,0.75f);
 		return frame;
 	}