aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/de/pixart/messenger/persistance/FileBackend.java
diff options
context:
space:
mode:
authorChristian Schneppe <christian@pix-art.de>2018-09-23 16:42:56 +0200
committerChristian Schneppe <christian@pix-art.de>2018-09-23 16:42:56 +0200
commit1e63a8291579043659f86dbb46d4d63d3225c471 (patch)
tree8f1f2a24aee230eb63364a80ef04d1d7a379d67c /src/main/java/de/pixart/messenger/persistance/FileBackend.java
parentd159ba22126f7be06f50cb33b677ddcc8786219c (diff)
preview media before sending them and allow sharing and attaching of multiple files
Diffstat (limited to 'src/main/java/de/pixart/messenger/persistance/FileBackend.java')
-rw-r--r--src/main/java/de/pixart/messenger/persistance/FileBackend.java51
1 files changed, 46 insertions, 5 deletions
diff --git a/src/main/java/de/pixart/messenger/persistance/FileBackend.java b/src/main/java/de/pixart/messenger/persistance/FileBackend.java
index 0c3028feb..35967e624 100644
--- a/src/main/java/de/pixart/messenger/persistance/FileBackend.java
+++ b/src/main/java/de/pixart/messenger/persistance/FileBackend.java
@@ -56,6 +56,7 @@ import de.pixart.messenger.R;
import de.pixart.messenger.entities.DownloadableFile;
import de.pixart.messenger.entities.Message;
import de.pixart.messenger.services.XmppConnectionService;
+import de.pixart.messenger.ui.util.Attachment;
import de.pixart.messenger.utils.CryptoHelper;
import de.pixart.messenger.utils.ExifHelper;
import de.pixart.messenger.utils.FileUtils;
@@ -172,16 +173,19 @@ public class FileBackend {
}
}
- public static boolean allFilesUnderSize(Context context, List<Uri> uris, long max) {
+ public static boolean allFilesUnderSize(Context context, List<Attachment> attachments, long max) {
if (max <= 0) {
Log.d(Config.LOGTAG, "server did not report max file size for http upload");
return true; //exception to be compatible with HTTP Upload < v0.2
}
- for (Uri uri : uris) {
- String mime = context.getContentResolver().getType(uri);
+ for (Attachment attachment : attachments) {
+ if (attachment.getType() != Attachment.Type.FILE) {
+ continue;
+ }
+ String mime = attachment.getMime();
if (mime != null && mime.startsWith("video/")) {
try {
- Dimensions dimensions = FileBackend.getVideoDimensions(context, uri);
+ Dimensions dimensions = FileBackend.getVideoDimensions(context, attachment.getUri());
if (dimensions.getMin() >= 720) {
Log.d(Config.LOGTAG, "do not consider video file with min width larger or equal than 720 for size check");
continue;
@@ -190,7 +194,7 @@ public class FileBackend {
//ignore and fall through
}
}
- if (FileBackend.getFileSize(context, uri) > max) {
+ if (FileBackend.getFileSize(context, attachment.getUri()) > max) {
Log.d(Config.LOGTAG, "not all files are under " + max + " bytes. suggesting falling back to jingle");
return false;
}
@@ -554,6 +558,21 @@ public class FileBackend {
return paint;
}
+ private Bitmap cropCenterSquareVideo(Uri uri, int size) {
+ MediaMetadataRetriever metadataRetriever = new MediaMetadataRetriever();
+ Bitmap frame;
+ try {
+ metadataRetriever.setDataSource(mXmppConnectionService, uri);
+ frame = metadataRetriever.getFrameAtTime(0);
+ metadataRetriever.release();
+ return cropCenterSquare(frame, size);
+ } catch (Exception e) {
+ frame = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
+ frame.eraseColor(0xff000000);
+ return frame;
+ }
+ }
+
private Bitmap getVideoPreview(File file, int size) throws IOException {
MediaMetadataRetriever metadataRetriever = new MediaMetadataRetriever();
Bitmap frame;
@@ -1041,6 +1060,28 @@ public class FileBackend {
return getVideoDimensions(metadataRetriever);
}
+ public Bitmap getPreviewForUri(Attachment attachment, int size, boolean cacheOnly) {
+ final LruCache<String, Bitmap> cache = mXmppConnectionService.getBitmapCache();
+ Bitmap bitmap = cache.get(attachment.getUuid().toString());
+ if (bitmap != null || cacheOnly) {
+ return bitmap;
+ }
+ Log.d(Config.LOGTAG, "attachment mime=" + attachment.getMime());
+ if (attachment.getMime() != null && attachment.getMime().startsWith("video/")) {
+ bitmap = cropCenterSquareVideo(attachment.getUri(), size);
+ drawOverlay(bitmap, R.drawable.play_video, 0.75f);
+ } else {
+ bitmap = cropCenterSquare(attachment.getUri(), size);
+ if ("image/gif".equals(attachment.getMime())) {
+ Bitmap withGifOverlay = bitmap.copy(Bitmap.Config.ARGB_8888, true);
+ drawOverlay(withGifOverlay, R.drawable.play_gif, 1.0f);
+ bitmap.recycle();
+ bitmap = withGifOverlay;
+ }
+ }
+ cache.put(attachment.getUuid().toString(), bitmap);
+ return bitmap;
+ }
private static Dimensions getVideoDimensions(Context context, Uri uri) throws NotAVideoFile {
MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();