aboutsummaryrefslogtreecommitdiffstats
path: root/src/eu/siacs
diff options
context:
space:
mode:
Diffstat (limited to 'src/eu/siacs')
-rw-r--r--src/eu/siacs/conversations/persistance/FileBackend.java41
1 files changed, 35 insertions, 6 deletions
diff --git a/src/eu/siacs/conversations/persistance/FileBackend.java b/src/eu/siacs/conversations/persistance/FileBackend.java
index ca6360b9..1ee68a27 100644
--- a/src/eu/siacs/conversations/persistance/FileBackend.java
+++ b/src/eu/siacs/conversations/persistance/FileBackend.java
@@ -11,6 +11,8 @@ import java.io.OutputStream;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
+import android.graphics.Matrix;
+import android.media.ExifInterface;
import android.net.Uri;
import android.util.Log;
import android.util.LruCache;
@@ -85,19 +87,29 @@ public class FileBackend {
return originalBitmap;
}
}
-
- public JingleFile copyImageToPrivateStorage(Message message, Uri image) throws ImageCopyException {
- return this.copyImageToPrivateStorage(message, image,0);
+
+ public Bitmap rotate(Bitmap bitmap, int degree) {
+ int w = bitmap.getWidth();
+ int h = bitmap.getHeight();
+ Matrix mtx = new Matrix();
+ mtx.postRotate(degree);
+ return Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, true);
}
- private JingleFile copyImageToPrivateStorage(Message message, Uri image, int sampleSize)
+ public JingleFile copyImageToPrivateStorage(Message message, Uri image)
throws ImageCopyException {
+ return this.copyImageToPrivateStorage(message, image, 0);
+ }
+
+ private JingleFile copyImageToPrivateStorage(Message message, Uri image,
+ int sampleSize) throws ImageCopyException {
try {
InputStream is;
if (image != null) {
is = context.getContentResolver().openInputStream(image);
} else {
is = new FileInputStream(getIncomingFile());
+ image = getIncomingUri();
}
JingleFile file = getJingleFile(message);
file.getParentFile().mkdirs();
@@ -105,7 +117,8 @@ public class FileBackend {
Bitmap originalBitmap;
BitmapFactory.Options options = new BitmapFactory.Options();
int inSampleSize = (int) Math.pow(2, sampleSize);
- Log.d("xmppService","reading bitmap with sample size "+inSampleSize);
+ Log.d("xmppService", "reading bitmap with sample size "
+ + inSampleSize);
options.inSampleSize = inSampleSize;
originalBitmap = BitmapFactory.decodeStream(is, null, options);
is.close();
@@ -116,6 +129,18 @@ public class FileBackend {
getIncomingFile().delete();
}
Bitmap scalledBitmap = resize(originalBitmap, IMAGE_SIZE);
+ originalBitmap = null;
+ ExifInterface exif = new ExifInterface(image.toString());
+ if (exif.getAttribute(ExifInterface.TAG_ORIENTATION)
+ .equalsIgnoreCase("6")) {
+ scalledBitmap = rotate(scalledBitmap, 90);
+ } else if (exif.getAttribute(ExifInterface.TAG_ORIENTATION)
+ .equalsIgnoreCase("8")) {
+ scalledBitmap = rotate(scalledBitmap, 270);
+ } else if (exif.getAttribute(ExifInterface.TAG_ORIENTATION)
+ .equalsIgnoreCase("3")) {
+ scalledBitmap = rotate(scalledBitmap, 180);
+ }
OutputStream os = new FileOutputStream(file);
boolean success = scalledBitmap.compress(
Bitmap.CompressFormat.WEBP, 75, os);
@@ -138,7 +163,7 @@ public class FileBackend {
R.string.error_security_exception_during_image_copy);
} catch (OutOfMemoryError e) {
++sampleSize;
- if (sampleSize<=3) {
+ if (sampleSize <= 3) {
return copyImageToPrivateStorage(message, image, sampleSize);
} else {
throw new ImageCopyException(R.string.error_out_of_memory);
@@ -190,6 +215,10 @@ public class FileBackend {
public File getIncomingFile() {
return new File(context.getFilesDir().getAbsolutePath() + "/incoming");
}
+
+ public Uri getIncomingUri() {
+ return Uri.parse(context.getFilesDir().getAbsolutePath() + "/incoming");
+ }
public class ImageCopyException extends Exception {
private static final long serialVersionUID = -1010013599132881427L;