1package eu.siacs.conversations.persistance;
2
3import java.io.FileNotFoundException;
4import java.io.FileOutputStream;
5import java.io.IOException;
6import java.io.InputStream;
7import java.io.OutputStream;
8
9import android.content.Context;
10import android.graphics.Bitmap;
11import android.graphics.BitmapFactory;
12import android.net.Uri;
13import android.util.Log;
14import android.util.LruCache;
15
16import eu.siacs.conversations.entities.Conversation;
17import eu.siacs.conversations.entities.Message;
18import eu.siacs.conversations.xmpp.jingle.JingleFile;
19
20public class FileBackend {
21
22 private static int IMAGE_SIZE = 1920;
23
24 private Context context;
25 private LruCache<String, Bitmap> thumbnailCache;
26
27 public FileBackend(Context context) {
28 this.context = context;
29
30 int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
31 int cacheSize = maxMemory / 8;
32 thumbnailCache = new LruCache<String, Bitmap>(cacheSize) {
33 @Override
34 protected int sizeOf(String key, Bitmap bitmap) {
35 return bitmap.getByteCount() / 1024;
36 }
37 };
38
39 }
40
41 public JingleFile getImageFile(Message message) {
42 Conversation conversation = message.getConversation();
43 String prefix = context.getFilesDir().getAbsolutePath();
44 String path = prefix + "/" + conversation.getAccount().getJid() + "/"
45 + conversation.getContactJid();
46 String filename = message.getUuid() + ".webp";
47 return new JingleFile(path + "/" + filename);
48 }
49
50 private Bitmap resize(Bitmap originalBitmap, int size) {
51 int w = originalBitmap.getWidth();
52 int h = originalBitmap.getHeight();
53 if (Math.max(w, h) > size) {
54 int scalledW;
55 int scalledH;
56 if (w <= h) {
57 scalledW = (int) (w / ((double) h / size));
58 scalledH = size;
59 } else {
60 scalledW = size;
61 scalledH = (int) (h / ((double) w / size));
62 }
63 Bitmap scalledBitmap = Bitmap.createScaledBitmap(
64 originalBitmap, scalledW, scalledH, true);
65 return scalledBitmap;
66 } else {
67 return originalBitmap;
68 }
69 }
70
71 public JingleFile copyImageToPrivateStorage(Message message, Uri image) {
72 try {
73 InputStream is = context.getContentResolver()
74 .openInputStream(image);
75 JingleFile file = getImageFile(message);
76 file.getParentFile().mkdirs();
77 file.createNewFile();
78 OutputStream os = new FileOutputStream(file);
79 Bitmap originalBitmap = BitmapFactory.decodeStream(is);
80 is.close();
81 Bitmap scalledBitmap = resize(originalBitmap, IMAGE_SIZE);
82 boolean success = scalledBitmap.compress(Bitmap.CompressFormat.WEBP,75,os);
83 if (!success) {
84 Log.d("xmppService", "couldnt compress");
85 }
86 os.close();
87 return file;
88 } catch (FileNotFoundException e) {
89 // TODO Auto-generated catch block
90 e.printStackTrace();
91 } catch (IOException e) {
92 // TODO Auto-generated catch block
93 e.printStackTrace();
94 }
95
96 return null;
97 }
98
99 public Bitmap getImageFromMessage(Message message) {
100 return BitmapFactory
101 .decodeFile(getImageFile(message).getAbsolutePath());
102 }
103
104 public Bitmap getThumbnailFromMessage(Message message, int size) {
105 Bitmap thumbnail = thumbnailCache.get(message.getUuid());
106 if (thumbnail==null) {
107 Log.d("xmppService","creating new thumbnail" + message.getUuid());
108 Bitmap fullsize = BitmapFactory.decodeFile(getImageFile(message)
109 .getAbsolutePath());
110 thumbnail = resize(fullsize, size);
111 this.thumbnailCache.put(message.getUuid(), thumbnail);
112 }
113 return thumbnail;
114 }
115}