package com.tomclaw.mandarin.core;
import android.content.Context;
import android.graphics.Bitmap;
import android.text.TextUtils;
import com.tomclaw.mandarin.R;
import com.tomclaw.mandarin.util.BitmapHelper;
import com.tomclaw.mandarin.util.FileHelper;
import com.tomclaw.mandarin.util.Logger;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Random;
/**
* Created by Solkin on 03.11.2014.
*/
public class BitmapFile extends VirtualFile {
private File file;
private BitmapFile(File file) {
this.file = file;
}
@Override
public String getMimeType() {
return "image/jpeg";
}
@Override
public long getSize() {
return file.length();
}
@Override
public String getName() {
return file.getName();
}
@Override
public InputStream openInputStream(Context context) throws FileNotFoundException {
return new FileInputStream(file);
}
@Override
public Bitmap getThumbnail(Context context) {
throw new UnsupportedOperationException();
}
@Override
public String getPath() {
throw new UnsupportedOperationException();
}
public static BitmapFile create(Context context, UriFile file)
throws UnsupportedFileTypeException, ImageCompressionDesireLackException {
// Check for this is image and not GIF.
String extension = FileHelper.getFileExtensionFromPath(file.getName());
if (file.getMimeType().startsWith("image") &&
!TextUtils.equals(extension.toLowerCase(), "gif")) {
// Check for preferences of image compression.
String imageCompression = PreferenceHelper.getImageCompression(context);
if (TextUtils.equals(imageCompression, context.getString(R.string.compression_original))) {
throw new ImageCompressionDesireLackException();
}
int sampleSize;
int quality;
if (TextUtils.equals(imageCompression, context.getString(R.string.compression_medium))) {
sampleSize = 768;
quality = 75;
} else {
sampleSize = 480;
quality = 60;
}
// Now we can compress this image with pleasure.
Bitmap bitmap = BitmapHelper.decodeSampledBitmapFromUri(context, file.getUri(), sampleSize, sampleSize);
if (bitmap != null) {
File bitmapFile = saveBitmapSync(file.getName(), bitmap, quality);
if (bitmapFile != null) {
return new BitmapFile(bitmapFile);
}
}
}
throw new UnsupportedFileTypeException();
}
public static File saveBitmapSync(String fileName, Bitmap bitmap, int quality) {
try {
File file = File.createTempFile("MND_",
"." + FileHelper.getFileExtensionFromPath(fileName));
OutputStream os = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, quality, os);
os.flush();
os.close();
return file;
} catch (Throwable ex) {
// Unable to create file, likely because external storage is
// not currently mounted or OutOfMemory was thrown.
Logger.log("Error saving bitmap: " + fileName, ex);
}
return null;
}
public static class UnsupportedFileTypeException extends Throwable {
}
public static class ImageCompressionDesireLackException extends Throwable {
}
}