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/DatabaseBackend.java8
-rw-r--r--src/eu/siacs/conversations/persistance/FileBackend.java113
2 files changed, 119 insertions, 2 deletions
diff --git a/src/eu/siacs/conversations/persistance/DatabaseBackend.java b/src/eu/siacs/conversations/persistance/DatabaseBackend.java
index 4c0d6216..852a9315 100644
--- a/src/eu/siacs/conversations/persistance/DatabaseBackend.java
+++ b/src/eu/siacs/conversations/persistance/DatabaseBackend.java
@@ -23,7 +23,7 @@ public class DatabaseBackend extends SQLiteOpenHelper {
private static DatabaseBackend instance = null;
private static final String DATABASE_NAME = "history";
- private static final int DATABASE_VERSION = 2;
+ private static final int DATABASE_VERSION = 3;
public DatabaseBackend(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
@@ -50,7 +50,7 @@ public class DatabaseBackend extends SQLiteOpenHelper {
+ " TEXT PRIMARY KEY, " + Message.CONVERSATION + " TEXT, "
+ Message.TIME_SENT + " NUMBER, " + Message.COUNTERPART
+ " TEXT, " + Message.BODY + " TEXT, " + Message.ENCRYPTION
- + " NUMBER, " + Message.STATUS + " NUMBER," + "FOREIGN KEY("
+ + " NUMBER, " + Message.STATUS + " NUMBER," +Message.TYPE +" NUMBER, FOREIGN KEY("
+ Message.CONVERSATION + ") REFERENCES "
+ Conversation.TABLENAME + "(" + Conversation.UUID
+ ") ON DELETE CASCADE);");
@@ -72,6 +72,10 @@ public class DatabaseBackend extends SQLiteOpenHelper {
db.execSQL("update " + Account.TABLENAME
+ " set " + Account.OPTIONS + " = " + Account.OPTIONS + " | 8");
}
+ if (oldVersion < 3 && newVersion >= 3) {
+ //add field type to message
+ db.execSQL("ALTER TABLE "+Message.TABLENAME+" ADD COLUMN "+Message.TYPE+" NUMBER");;
+ }
}
public static synchronized DatabaseBackend getInstance(Context context) {
diff --git a/src/eu/siacs/conversations/persistance/FileBackend.java b/src/eu/siacs/conversations/persistance/FileBackend.java
new file mode 100644
index 00000000..f7f986f2
--- /dev/null
+++ b/src/eu/siacs/conversations/persistance/FileBackend.java
@@ -0,0 +1,113 @@
+package eu.siacs.conversations.persistance;
+
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.net.Uri;
+import android.util.LruCache;
+
+import eu.siacs.conversations.entities.Conversation;
+import eu.siacs.conversations.entities.Message;
+import eu.siacs.conversations.xmpp.jingle.JingleFile;
+
+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;
+ }
+ };
+
+ }
+
+ public JingleFile getJingleFile(Message message) {
+ Conversation conversation = message.getConversation();
+ String prefix = context.getFilesDir().getAbsolutePath();
+ String path = prefix + "/" + conversation.getAccount().getJid() + "/"
+ + conversation.getContactJid();
+ String filename = message.getUuid() + ".webp";
+ return new JingleFile(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 JingleFile copyImageToPrivateStorage(Message message, Uri image) {
+ try {
+ InputStream is = context.getContentResolver()
+ .openInputStream(image);
+ JingleFile file = getJingleFile(message);
+ file.getParentFile().mkdirs();
+ file.createNewFile();
+ OutputStream os = new FileOutputStream(file);
+ Bitmap originalBitmap = BitmapFactory.decodeStream(is);
+ is.close();
+ Bitmap scalledBitmap = resize(originalBitmap, IMAGE_SIZE);
+ boolean success = scalledBitmap.compress(Bitmap.CompressFormat.WEBP,75,os);
+ if (!success) {
+ //Log.d("xmppService", "couldnt compress");
+ }
+ os.close();
+ return file;
+ } catch (FileNotFoundException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ return null;
+ }
+
+ public Bitmap getImageFromMessage(Message message) {
+ return BitmapFactory
+ .decodeFile(getJingleFile(message).getAbsolutePath());
+ }
+
+ public Bitmap getThumbnailFromMessage(Message message, int size) {
+ Bitmap thumbnail = thumbnailCache.get(message.getUuid());
+ if (thumbnail==null) {
+ Bitmap fullsize = BitmapFactory.decodeFile(getJingleFile(message)
+ .getAbsolutePath());
+ thumbnail = resize(fullsize, size);
+ this.thumbnailCache.put(message.getUuid(), thumbnail);
+ }
+ return thumbnail;
+ }
+}