aboutsummaryrefslogtreecommitdiffstats
path: root/src/eu/siacs/conversations/persistance
diff options
context:
space:
mode:
Diffstat (limited to 'src/eu/siacs/conversations/persistance')
-rw-r--r--src/eu/siacs/conversations/persistance/FileBackend.java97
1 files changed, 63 insertions, 34 deletions
diff --git a/src/eu/siacs/conversations/persistance/FileBackend.java b/src/eu/siacs/conversations/persistance/FileBackend.java
index 9ae406452..122898b91 100644
--- a/src/eu/siacs/conversations/persistance/FileBackend.java
+++ b/src/eu/siacs/conversations/persistance/FileBackend.java
@@ -6,65 +6,82 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
-import java.math.BigInteger;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.util.Log;
+import android.util.LruCache;
import eu.siacs.conversations.entities.Conversation;
import eu.siacs.conversations.entities.Message;
-
public class FileBackend {
-
+
private static int IMAGE_SIZE = 1920;
-
+
private Context context;
-
+ private LruCache<String, Bitmap> thumbnailCache;
+
public FileBackend(Context context) {
this.context = context;
+
+ int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
+ int cacheSize = maxMemory / 8;
+ thumbnailCache = new LruCache<String, Bitmap>(cacheSize) {
+ @Override
+ protected int sizeOf(String key, Bitmap bitmap) {
+ return bitmap.getByteCount() / 1024;
+ }
+ };
+
}
-
- private File getImageFile(Message message) {
+
+ public File getImageFile(Message message) {
Conversation conversation = message.getConversation();
- String prefix = context.getFilesDir().getAbsolutePath();
- String path = prefix+"/"+conversation.getAccount().getJid()+"/"+conversation.getContactJid();
+ String prefix = context.getFilesDir().getAbsolutePath();
+ String path = prefix + "/" + conversation.getAccount().getJid() + "/"
+ + conversation.getContactJid();
String filename = message.getUuid() + ".webp";
- return new File(path+"/"+filename);
+ return new File(path + "/" + filename);
}
+ private Bitmap resize(Bitmap originalBitmap, int size) {
+ int w = originalBitmap.getWidth();
+ int h = originalBitmap.getHeight();
+ if (Math.max(w, h) > size) {
+ int scalledW;
+ int scalledH;
+ if (w <= h) {
+ scalledW = (int) (w / ((double) h / size));
+ scalledH = size;
+ } else {
+ scalledW = size;
+ scalledH = (int) (h / ((double) w / size));
+ }
+ Bitmap scalledBitmap = Bitmap.createScaledBitmap(
+ originalBitmap, scalledW, scalledH, true);
+ return scalledBitmap;
+ } else {
+ return originalBitmap;
+ }
+ }
+
public File copyImageToPrivateStorage(Message message, Uri image) {
try {
- InputStream is = context.getContentResolver().openInputStream(image);
+ InputStream is = context.getContentResolver()
+ .openInputStream(image);
File file = getImageFile(message);
file.getParentFile().mkdirs();
file.createNewFile();
OutputStream os = new FileOutputStream(file);
Bitmap originalBitmap = BitmapFactory.decodeStream(is);
is.close();
- int w = originalBitmap.getWidth();
- int h = originalBitmap.getHeight();
- boolean success;
- if (Math.max(w, h) > IMAGE_SIZE) {
- int scalledW;
- int scalledH;
- if (w<=h) {
- scalledW = (int) (w / ((double) h/IMAGE_SIZE));
- scalledH = IMAGE_SIZE;
- } else {
- scalledW = IMAGE_SIZE;
- scalledH = (int) (h / ((double) w/IMAGE_SIZE));
- }
- Bitmap scalledBitmap = Bitmap.createScaledBitmap(originalBitmap, scalledW,scalledH, true);
- success = scalledBitmap.compress(Bitmap.CompressFormat.WEBP, 75, os);
- } else {
- success = originalBitmap.compress(Bitmap.CompressFormat.WEBP, 75, os);
- }
+ Bitmap scalledBitmap = resize(originalBitmap, IMAGE_SIZE);
+ boolean success = scalledBitmap.compress(Bitmap.CompressFormat.WEBP,75,os);
if (!success) {
- Log.d("xmppService","couldnt compress");
+ Log.d("xmppService", "couldnt compress");
}
os.close();
return file;
@@ -75,12 +92,24 @@ public class FileBackend {
// TODO Auto-generated catch block
e.printStackTrace();
}
-
+
return null;
}
-
-
+
public Bitmap getImageFromMessage(Message message) {
- return BitmapFactory.decodeFile(getImageFile(message).getAbsolutePath());
+ return BitmapFactory
+ .decodeFile(getImageFile(message).getAbsolutePath());
+ }
+
+ public Bitmap getThumbnailFromMessage(Message message, int size) {
+ Bitmap thumbnail = thumbnailCache.get(message.getUuid());
+ if (thumbnail==null) {
+ Log.d("xmppService","creating new thumbnail" + message.getUuid());
+ Bitmap fullsize = BitmapFactory.decodeFile(getImageFile(message)
+ .getAbsolutePath());
+ thumbnail = resize(fullsize, size);
+ this.thumbnailCache.put(message.getUuid(), thumbnail);
+ }
+ return thumbnail;
}
}