FileBackend.java

 1package eu.siacs.conversations.persistance;
 2
 3import java.io.File;
 4import java.io.FileNotFoundException;
 5import java.io.FileOutputStream;
 6import java.io.IOException;
 7import java.io.InputStream;
 8import java.io.OutputStream;
 9import java.math.BigInteger;
10
11import android.content.Context;
12import android.graphics.Bitmap;
13import android.graphics.BitmapFactory;
14import android.net.Uri;
15import android.util.Log;
16
17import eu.siacs.conversations.entities.Conversation;
18import eu.siacs.conversations.entities.Message;
19
20
21public class FileBackend {
22	
23	private static int IMAGE_SIZE = 1920;
24	
25	private Context context;
26	
27	public FileBackend(Context context) {
28		this.context = context;
29	}
30	
31	private File getImageFile(Message message) {
32		Conversation conversation = message.getConversation();
33		String prefix =  context.getFilesDir().getAbsolutePath();
34		String path = prefix+"/"+conversation.getAccount().getJid()+"/"+conversation.getContactJid();
35		String filename = message.getUuid() + ".webp";
36		return new File(path+"/"+filename);
37	}
38	
39	public File copyImageToPrivateStorage(Message message, Uri image) {
40		try {
41			InputStream is = context.getContentResolver().openInputStream(image);
42			File file = getImageFile(message);
43			file.getParentFile().mkdirs();
44			file.createNewFile();
45			OutputStream os = new FileOutputStream(file);
46			Bitmap originalBitmap = BitmapFactory.decodeStream(is);
47			is.close();
48			int w = originalBitmap.getWidth();
49			int h = originalBitmap.getHeight();
50			boolean success;
51			if (Math.max(w, h) > IMAGE_SIZE) {
52				int scalledW;
53				int scalledH;
54				if (w<=h) {
55					scalledW = (int) (w / ((double) h/IMAGE_SIZE));
56					scalledH = IMAGE_SIZE;
57				} else {
58					scalledW = IMAGE_SIZE;
59					scalledH = (int) (h / ((double) w/IMAGE_SIZE));
60				}
61				Bitmap scalledBitmap = Bitmap.createScaledBitmap(originalBitmap, scalledW,scalledH, true);
62				success = scalledBitmap.compress(Bitmap.CompressFormat.WEBP, 75, os);
63			} else {
64				success = originalBitmap.compress(Bitmap.CompressFormat.WEBP, 75, os);
65			}
66			if (!success) {
67				Log.d("xmppService","couldnt compress");
68			}
69			os.close();
70			return file;
71		} catch (FileNotFoundException e) {
72			// TODO Auto-generated catch block
73			e.printStackTrace();
74		} catch (IOException e) {
75			// TODO Auto-generated catch block
76			e.printStackTrace();
77		}
78		
79		return null;
80	}
81	
82	
83	public Bitmap getImageFromMessage(Message message) {
84		return BitmapFactory.decodeFile(getImageFile(message).getAbsolutePath());
85	}
86}