package lab.prada.collage.util;
import java.io.File;
import java.io.FileOutputStream;
import java.util.UUID;
import lab.prada.collage.Constants;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.view.ViewGroup;
public class StoreImageHelper {
public interface onSaveListener {
public void onSaveSuccess();
public void onSaveFail();
}
protected static final int BACKGROUND_COLOR = Color.WHITE;
protected static final String IMAGE_FORMAT_TYPE = ".jpg";
private static Bitmap loadBitmapFromView(View v) {
Bitmap b = Bitmap.createBitmap(v.getMeasuredWidth(),
v.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
v.draw(c);
return b;
}
private static File saveFile(Bitmap bmp, String filename){
File dcim = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath() + "/PradaCollage/");
if(dcim.exists()==false)
dcim.mkdirs();
File f = new File(dcim,filename);
try {
FileOutputStream out = new FileOutputStream(f);
bmp.compress(Bitmap.CompressFormat.JPEG, 90, out);
out.close();
} catch (Exception e) {
e.printStackTrace();
return null;
}
return f;
}
private static Uri store(final ContentResolver cr, File file, String name, String description){
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.TITLE, name);
values.put(MediaStore.Images.Media.DATE_TAKEN, file.lastModified());
values.put(MediaStore.Images.Media.DATE_ADDED, file.lastModified());
values.put(MediaStore.Images.Media.DATE_MODIFIED, file.lastModified());
values.put(MediaStore.Images.Media.BUCKET_DISPLAY_NAME, "PradaCollage");
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
values.put(MediaStore.Images.Media.DESCRIPTION, description);
values.put(MediaStore.MediaColumns.DATA, file.getAbsolutePath());
return cr.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
}
public static void save(final ContentResolver cr, final ViewGroup allViews, final onSaveListener listener){
AsyncTask<Void, Void, Void> saveImagesTask = new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
Bitmap largeBitmap = Bitmap.createBitmap(allViews.getWidth(),
allViews.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(largeBitmap);
canvas.drawColor(BACKGROUND_COLOR);
for (int i = 0; i < allViews.getChildCount(); i++) {
View v = allViews.getChildAt(i);
canvas.drawBitmap(loadBitmapFromView(v), v.getX(),
v.getY(), null);
}
Bitmap mediumBitmap = Bitmap.createScaledBitmap(largeBitmap,
(int) (largeBitmap.getWidth() * Constants.MEDIUM_SCALE_FACTOR),
(int) (largeBitmap.getHeight() * Constants.MEDIUM_SCALE_FACTOR), false);
Bitmap smallBitmap = Bitmap.createScaledBitmap(largeBitmap,
(int) (largeBitmap.getWidth() * Constants.SMALL_SCALE_FACTOR),
(int) (largeBitmap.getHeight() * Constants.SMALL_SCALE_FACTOR), false);
String fileNamePrefix = UUID.randomUUID().toString();
store(cr,saveFile(largeBitmap,fileNamePrefix + "_large"+IMAGE_FORMAT_TYPE),fileNamePrefix + "_large"+IMAGE_FORMAT_TYPE,"");
largeBitmap.recycle();
store(cr,saveFile(mediumBitmap,fileNamePrefix + "_medium"+IMAGE_FORMAT_TYPE),fileNamePrefix + "_large"+IMAGE_FORMAT_TYPE,"");
mediumBitmap.recycle();
store(cr,saveFile(smallBitmap,fileNamePrefix + "_small"+IMAGE_FORMAT_TYPE),fileNamePrefix + "_large"+IMAGE_FORMAT_TYPE,"");
smallBitmap.recycle();
return null;
}
@Override
protected void onPostExecute(Void result) {
if(listener!=null)
listener.onSaveSuccess();
}
};
saveImagesTask.execute();
}
}