rotate avatars
Conflicts: src/eu/siacs/conversations/persistance/FileBackend.java
This commit is contained in:
		
							parent
							
								
									d42ea45b1c
								
							
						
					
					
						commit
						c62937016b
					
				| @ -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)); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 iNPUTmice
						iNPUTmice