rotate avatars

iNPUTmice created

Conflicts:
	src/eu/siacs/conversations/persistance/FileBackend.java

Change summary

src/eu/siacs/conversations/persistance/FileBackend.java | 92 ++++++----
1 file changed, 55 insertions(+), 37 deletions(-)

Detailed changes

src/eu/siacs/conversations/persistance/FileBackend.java 🔗

@@ -44,8 +44,9 @@ public class FileBackend {
 
 	private Context context;
 	private LruCache<String, Bitmap> thumbnailCache;
-	
-	private SimpleDateFormat imageDateFormat = new SimpleDateFormat("yyyyMMdd_HHmmssSSS",Locale.US);
+
+	private SimpleDateFormat imageDateFormat = new SimpleDateFormat(
+			"yyyyMMdd_HHmmssSSS", Locale.US);
 
 	public FileBackend(Context context) {
 		this.context = context;
@@ -85,14 +86,15 @@ public class FileBackend {
 		}
 		return new JingleFile(path + "/" + filename);
 	}
-	
+
 	public JingleFile getJingleFile(Message message) {
 		return getJingleFile(message, true);
 	}
 
 	public JingleFile getJingleFile(Message message, boolean decrypted) {
 		StringBuilder filename = new StringBuilder();
-		filename.append(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath());
+		filename.append(Environment.getExternalStoragePublicDirectory(
+				Environment.DIRECTORY_PICTURES).getAbsolutePath());
 		filename.append("/Conversations/");
 		filename.append(message.getUuid());
 		if ((decrypted) || (message.getEncryption() == Message.ENCRYPTION_NONE)) {
@@ -106,7 +108,7 @@ public class FileBackend {
 		}
 		return new JingleFile(filename.toString());
 	}
-	
+
 	public Bitmap resize(Bitmap originalBitmap, int size) {
 		int w = originalBitmap.getWidth();
 		int h = originalBitmap.getHeight();
@@ -144,7 +146,8 @@ public class FileBackend {
 	private JingleFile copyImageToPrivateStorage(Message message, Uri image,
 			int sampleSize) throws ImageCopyException {
 		try {
-			InputStream is = context.getContentResolver().openInputStream(image);
+			InputStream is = context.getContentResolver()
+					.openInputStream(image);
 			JingleFile file = getJingleFile(message);
 			file.getParentFile().mkdirs();
 			file.createNewFile();
@@ -194,17 +197,23 @@ public class FileBackend {
 			}
 		}
 	}
-	
+
 	private int getRotation(Uri image) {
 		if ("content".equals(image.getScheme())) {
-	        Cursor cursor = context.getContentResolver().query(image,
-	                new String[] { MediaStore.Images.ImageColumns.ORIENTATION }, null, null, null);
-
-	        if (cursor.getCount() != 1) {
-	            return -1;
-	        }
-	        cursor.moveToFirst();
-	        return cursor.getInt(0);
+			try {
+				Cursor cursor = context
+						.getContentResolver()
+						.query(image,
+								new String[] { MediaStore.Images.ImageColumns.ORIENTATION },
+								null, null, null);
+				if (cursor.getCount() != 1) {
+					return -1;
+				}
+				cursor.moveToFirst();
+				return cursor.getInt(0);
+			} catch (IllegalArgumentException e) {
+				return -1;
+			}
 		} else {
 			ExifInterface exif;
 			try {
@@ -273,28 +282,32 @@ public class FileBackend {
 
 	public Uri getTakePhotoUri() {
 		StringBuilder pathBuilder = new StringBuilder();
-		pathBuilder.append(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM));
+		pathBuilder.append(Environment
+				.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM));
 		pathBuilder.append('/');
 		pathBuilder.append("Camera");
 		pathBuilder.append('/');
-		pathBuilder.append("IMG_"+this.imageDateFormat.format(new Date())+".jpg");
-		Uri uri = Uri.parse("file://"+pathBuilder.toString());
+		pathBuilder.append("IMG_" + this.imageDateFormat.format(new Date())
+				+ ".jpg");
+		Uri uri = Uri.parse("file://" + pathBuilder.toString());
 		File file = new File(uri.toString());
 		file.getParentFile().mkdirs();
 		return uri;
 	}
-	
+
 	public Avatar getPepAvatar(Uri image, int size, Bitmap.CompressFormat format) {
 		try {
 			Avatar avatar = new Avatar();
 			Bitmap bm = cropCenterSquare(image, size);
-			if (bm==null) {
+			if (bm == null) {
 				return null;
 			}
 			ByteArrayOutputStream mByteArrayOutputStream = new ByteArrayOutputStream();
-			Base64OutputStream mBase64OutputSttream = new Base64OutputStream(mByteArrayOutputStream, Base64.DEFAULT);
+			Base64OutputStream mBase64OutputSttream = new Base64OutputStream(
+					mByteArrayOutputStream, Base64.DEFAULT);
 			MessageDigest digest = MessageDigest.getInstance("SHA-1");
-			DigestOutputStream mDigestOutputStream = new DigestOutputStream(mBase64OutputSttream, digest);
+			DigestOutputStream mDigestOutputStream = new DigestOutputStream(
+					mBase64OutputSttream, digest);
 			if (!bm.compress(format, 75, mDigestOutputStream)) {
 				return null;
 			}
@@ -309,25 +322,26 @@ public class FileBackend {
 			return null;
 		}
 	}
-	
+
 	public boolean isAvatarCached(Avatar avatar) {
 		File file = new File(getAvatarPath(context, avatar.getFilename()));
 		return file.exists();
 	}
-	
+
 	public boolean save(Avatar avatar) {
 		if (isAvatarCached(avatar)) {
 			return true;
 		}
 		String filename = getAvatarPath(context, avatar.getFilename());
-		File file = new File(filename+".tmp");
+		File file = new File(filename + ".tmp");
 		file.getParentFile().mkdirs();
 		try {
 			file.createNewFile();
 			FileOutputStream mFileOutputStream = new FileOutputStream(file);
 			MessageDigest digest = MessageDigest.getInstance("SHA-1");
 			digest.reset();
-			DigestOutputStream mDigestOutputStream = new DigestOutputStream(mFileOutputStream, digest);
+			DigestOutputStream mDigestOutputStream = new DigestOutputStream(
+					mFileOutputStream, digest);
 			mDigestOutputStream.write(avatar.getImageAsBytes());
 			mDigestOutputStream.flush();
 			mDigestOutputStream.close();
@@ -337,7 +351,7 @@ public class FileBackend {
 				file.renameTo(new File(filename));
 				return true;
 			} else {
-				Log.d("xmppService","sha1sum mismatch for "+avatar.owner);
+				Log.d("xmppService", "sha1sum mismatch for " + avatar.owner);
 				file.delete();
 				return false;
 			}
@@ -349,9 +363,9 @@ public class FileBackend {
 			return false;
 		}
 	}
-	
+
 	public static String getAvatarPath(Context context, String avatar) {
-		return context.getFilesDir().getAbsolutePath() + "/avatars/"+avatar;
+		return context.getFilesDir().getAbsolutePath() + "/avatars/" + avatar;
 	}
 
 	public Bitmap cropCenterSquare(Uri image, int size) {
@@ -361,16 +375,20 @@ public class FileBackend {
 			InputStream is = context.getContentResolver()
 					.openInputStream(image);
 			Bitmap input = BitmapFactory.decodeStream(is, null, options);
-			if (input==null) {
+			if (input == null) {
 				return null;
 			} else {
+				int rotation = getRotation(image);
+				if (rotation > 0) {
+					input = rotate(input, rotation);
+				}
 				return cropCenterSquare(input, size);
 			}
 		} catch (FileNotFoundException e) {
 			return null;
 		}
 	}
-	
+
 	public static Bitmap cropCenterSquare(Bitmap input, int size) {
 		int w = input.getWidth();
 		int h = input.getHeight();
@@ -381,8 +399,7 @@ public class FileBackend {
 		float outHeight = scale * h;
 		float left = (size - outWidth) / 2;
 		float top = (size - outHeight) / 2;
-		RectF target = new RectF(left, top, left + outWidth, top
-				+ outHeight);
+		RectF target = new RectF(left, top, left + outWidth, top + outHeight);
 
 		Bitmap output = Bitmap.createBitmap(size, size, input.getConfig());
 		Canvas canvas = new Canvas(output);
@@ -412,11 +429,11 @@ public class FileBackend {
 		return inSampleSize;
 
 	}
-	
+
 	public Uri getJingleFileUri(Message message) {
 		File file = getJingleFile(message);
 		if (file.exists()) {
-			return Uri.parse("file://"+file.getAbsolutePath());
+			return Uri.parse("file://" + file.getAbsolutePath());
 		} else {
 			return ImageProvider.getProviderUri(message);
 		}
@@ -436,8 +453,9 @@ public class FileBackend {
 	}
 
 	public static Bitmap getAvatar(String avatar, int size, Context context) {
-		Bitmap bm = BitmapFactory.decodeFile(FileBackend.getAvatarPath(context, avatar));
-		if (bm==null) {
+		Bitmap bm = BitmapFactory.decodeFile(FileBackend.getAvatarPath(context,
+				avatar));
+		if (bm == null) {
 			return null;
 		}
 		return cropCenterSquare(bm, UIHelper.getRealPx(size, context));