FileBackend.java

  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}