/** ** Copyright (c) 2011 Ushahidi Inc ** All rights reserved ** Contact: team@ushahidi.com ** Website: http://www.ushahidi.com ** ** GNU Lesser General Public License Usage ** This file may be used under the terms of the GNU Lesser ** General Public License version 3 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 3 requirements ** will be met: http://www.gnu.org/licenses/lgpl.html. ** ** ** If you have questions regarding the use of this file, please contact ** Ushahidi developers at team@ushahidi.com. ** **/ package com.ushahidi.android.app.util; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import android.app.Activity; import android.content.res.Configuration; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.net.Uri; import android.os.Environment; import android.provider.MediaStore; import android.util.Log; import android.view.Display; import com.ushahidi.android.app.ImageManager; import com.ushahidi.android.app.Preferences; public class PhotoUtils { private static final String CLASS_TAG = PhotoUtils.class.getCanonicalName(); public static int getScreenOrientation(Activity context) { Display display = context.getWindowManager().getDefaultDisplay(); if (display.getWidth() == display.getHeight()) { return Configuration.ORIENTATION_SQUARE; } else { if (display.getWidth() < display.getHeight()) { return Configuration.ORIENTATION_PORTRAIT; } else { return Configuration.ORIENTATION_LANDSCAPE; } } } public static Uri getPhotoUri(String filename, Activity activity) { File path = new File(Environment.getExternalStorageDirectory(), activity.getPackageName()); if (!path.exists() && path.mkdir()) { return Uri.fromFile(new File(path, filename)); } return Uri.fromFile(new File(path, filename)); } public static String getPhotoPath(Activity activity) { Log.d(CLASS_TAG, "getPhotoPath"); File path = new File(Environment.getExternalStorageDirectory(), activity.getPackageName()); return path.exists() ? path.getAbsolutePath() : null; } public static boolean imageExist(String filename, Activity activity) { Log.d(CLASS_TAG, "imageExist(): " + filename); File path = new File(filename); if (!path.exists()) { Log.d(CLASS_TAG, "image does not exist"); return false; } Log.d(CLASS_TAG, "image does exist"); return true; } public static Bitmap getGalleryPhoto(Activity activity, Uri uri) { Log.d("XXX", "uri: " + uri); if (uri != null) { if(uri.toString().startsWith("file")) return getCameraPhoto(activity, uri); String[] columns = { MediaStore.Images.Media.DATA, MediaStore.Images.Media.ORIENTATION }; Cursor cursor = activity.getContentResolver().query(uri, columns, null, null, null); if (cursor != null) { cursor.moveToFirst(); String filePath = cursor.getString(cursor .getColumnIndex(columns[0])); int orientation = cursor.getInt(cursor .getColumnIndex(columns[1])); Bitmap original = BitmapFactory.decodeFile(filePath); Log.d("XXX", "original: " + original); if (original != null) { Bitmap scaled = scaleBitmap(activity, original); original.recycle(); if (orientation == 0 && scaled.getWidth() < scaled.getHeight()) { Log.i("XXX", String.format( "FILE:%s ORIENTATION: LANDSCAPE", filePath)); Bitmap rotated = rotatePhoto(scaled, -90); scaled.recycle(); return rotated; } else if (orientation == 90 && scaled.getWidth() > scaled.getHeight()) { Log.i("XXX", String.format( "FILE:%s ORIENTATION: PORTRAIT", filePath)); Bitmap rotated = rotatePhoto(scaled, 90); scaled.recycle(); return rotated; } else { Log.i("XXX", String.format("FILE:%s ORIENTATION: %d", filePath, orientation)); } return scaled; } } } return null; } public static Bitmap getCameraPhoto(Activity activity, Uri uri) { if (uri != null) { File path = new File(uri.getPath()); if (path.exists()) { Log.i("File Exists", "File Exists"); } else { Log.i("File not Exists", "File not Exists"); } Bitmap original = BitmapFactory.decodeFile(uri.getPath()); if (original != null) { Log.i("XXX", String.format("ORIGINAL %dx%d", original.getWidth(), original.getHeight())); Bitmap scaled = scaleBitmap(activity, original); if (scaled != null) { Log.i("XXX", String.format("SCALED %dx%d", scaled.getWidth(), scaled.getHeight())); original.recycle(); if (getScreenOrientation(activity) == Configuration.ORIENTATION_PORTRAIT && scaled.getWidth() > scaled.getHeight()) { Bitmap rotated = rotatePhoto(scaled, 90); scaled.recycle(); return rotated; } return scaled; } return original; } } return null; } public static boolean savePhoto(Activity activity, Bitmap bitmap, int ImageIdex) { try { ByteArrayOutputStream byteArray = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArray); bitmap.recycle(); ImageManager.writeImage(byteArray.toByteArray(), "photo" + ImageIdex + ".jpg", getPhotoPath(activity)); byteArray.flush(); return true; } catch (IOException e) { e.printStackTrace(); }catch(NullPointerException npe){ npe.printStackTrace(); } return false; } public static Bitmap rotatePhoto(Bitmap bitmap, int rotate) { Matrix matrix = new Matrix(); matrix.postRotate(rotate); return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); } public static Bitmap scaleBitmap(Activity activity, Bitmap original) { if (original != null) { float ratio = (float) original.getHeight() / (float) original.getWidth(); int newWidth = Preferences.photoWidth > 0 ? Preferences.photoWidth : 500; Log.i(CLASS_TAG, "Scaling image to " + newWidth + " x " + ratio); Bitmap scaled = Bitmap.createScaledBitmap(original, newWidth, (int) (newWidth * ratio), true); original.recycle(); return scaled; } return null; } }