package com.android.camera;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.location.Location;
import android.media.ExifInterface;
import android.net.Uri;
import android.os.Environment;
import android.os.Parcel;
import android.os.Parcelable;
import android.provider.MediaStore;
import android.provider.MediaStore.Images;
import android.util.Log;
import com.android.camera.gallery.BaseImageList;
import com.android.camera.gallery.IImage;
import com.android.camera.gallery.IImageList;
import com.android.camera.gallery.ImageList;
import com.android.camera.gallery.ImageListUber;
import com.android.camera.gallery.SingleImageList;
private static final String TAG = "ImageManager";
private static final Uri STORAGE_URI = Images.Media.EXTERNAL_CONTENT_URI;
private static final Uri THUMB_URI
= Images.Thumbnails.EXTERNAL_CONTENT_URI;
private static final Uri VIDEO_STORAGE_URI =
Uri.parse("content://media/external/video/media");
public DataLocation mLocation;
public int mInclusion;
public int mSort;
public String mBucketId;
public Uri mSingleImageUri;
public boolean mIsEmptyImageList;
out.writeInt(mLocation.ordinal());
out.writeInt(mInclusion);
out.writeInt(mSort);
out.writeString(mBucketId);
out.writeParcelable(mSingleImageUri, flags);
out.writeInt(mIsEmptyImageList ? 1 : 0);
}
mLocation = DataLocation.values()[in.readInt()];
mInclusion = in.readInt();
mSort = in.readInt();
mBucketId = in.readString();
mSingleImageUri = in.readParcelable(null);
mIsEmptyImageList = (in.readInt() != 0);
}
return String.format("ImageListParam{loc=%s,inc=%d,sort=%d," +
"bucket=%s,empty=%b,single=%s}", mLocation, mInclusion,
mSort, mBucketId, mIsEmptyImageList, mSingleImageUri);
}
public static final Parcelable.Creator CREATOR
= new Parcelable.Creator() {
public ImageListParam createFromParcel(Parcel in) {
return new ImageListParam(in);
}
public ImageListParam[] newArray(int size) {
return new ImageListParam[size];
}
};
return 0;
}
}
public static enum DataLocation { NONE, INTERNAL, EXTERNAL, ALL }
public static final int INCLUDE_IMAGES = (1 << 0);
public static final int INCLUDE_DRM_IMAGES = (1 << 1);
public static final int INCLUDE_VIDEOS = (1 << 2);
public static final int SORT_ASCENDING = 1;
public static final int SORT_DESCENDING = 2;
public static final String CAMERA_IMAGE_BUCKET_NAME =
Environment.getExternalStorageDirectory().toString()
+ "/DCIM/Camera";
public static final String CAMERA_IMAGE_BUCKET_ID =
getBucketId(CAMERA_IMAGE_BUCKET_NAME);
return String.valueOf(path.toLowerCase().hashCode());
}
File nnnAAAAA = new File(
Environment.getExternalStorageDirectory().toString()
+ "/DCIM/100ANDRO");
if ((!nnnAAAAA.exists()) && (!nnnAAAAA.mkdir())) {
Log.e(TAG, "create NNNAAAAA file: " + nnnAAAAA.getPath()
+ " failed");
}
}
return mimeType.startsWith("image/");
}
public static boolean isImage(IImage image) {
return isImageMimeType(image.getMimeType());
}
public static boolean isVideo(IImage image) {
return false;
}
public static Uri
addImage(ContentResolver cr, String title,
long dateTaken,
Location location, String directory, String filename,
Bitmap source, byte[] jpegData, int[] degree) {
OutputStream outputStream = null;
String filePath = directory + "/" + filename;
try {
File dir = new File(directory);
if (!dir.exists()) dir.mkdirs();
File file = new File(directory, filename);
outputStream = new FileOutputStream(file);
if (source != null) {
source.compress(CompressFormat.JPEG, 75, outputStream);
degree[0] = 0;
} else {
outputStream.write(jpegData);
degree[0] = getExifOrientation(filePath);
}
} catch (FileNotFoundException ex) {
Log.w(TAG, ex);
return null;
} catch (IOException ex) {
Log.w(TAG, ex);
return null;
} finally {
Util.closeSilently(outputStream);
}
ContentValues values = new ContentValues(7);
values.put(Images.Media.TITLE, title);
values.put(Images.Media.DISPLAY_NAME, filename);
values.put(Images.Media.DATE_TAKEN, dateTaken);
values.put(Images.Media.MIME_TYPE, "image/jpeg");
values.put(Images.Media.ORIENTATION, degree[0]);
values.put(Images.Media.DATA, filePath);
if (location != null) {
values.put(Images.Media.LATITUDE, location.getLatitude());
values.put(Images.Media.LONGITUDE, location.getLongitude());
}
return cr.insert(STORAGE_URI, values);
}
int degree = 0;
ExifInterface exif = null;
try {
exif = new ExifInterface(filepath);
} catch (IOException ex) {
Log.e(TAG, "cannot read exif", ex);
}
if (exif != null) {
int orientation = exif.getAttributeInt(
ExifInterface.TAG_ORIENTATION, -1);
if (orientation != -1) {
switch(orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
degree = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
degree = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
degree = 270;
break;
}
}
}
return degree;
}
ImageListParam param) {
DataLocation location = param.mLocation;
int inclusion = param.mInclusion;
int sort = param.mSort;
String bucketId = param.mBucketId;
Uri singleImageUri = param.mSingleImageUri;
boolean isEmptyImageList = param.mIsEmptyImageList;
if (isEmptyImageList || cr == null) {
return new EmptyImageList();
}
if (singleImageUri != null) {
return new SingleImageList(cr, singleImageUri);
}
boolean haveSdCard = hasStorage(false);
ArrayList<BaseImageList> l = new ArrayList<BaseImageList>();
if (haveSdCard && location != DataLocation.INTERNAL) {
if ((inclusion & INCLUDE_IMAGES) != 0) {
l.add(new ImageList(cr, STORAGE_URI, sort, bucketId));
}
}
if (location == DataLocation.INTERNAL || location == DataLocation.ALL) {
if ((inclusion & INCLUDE_IMAGES) != 0) {
l.add(new ImageList(cr,
Images.Media.INTERNAL_CONTENT_URI, sort, bucketId));
}
}
Iterator<BaseImageList> iter = l.iterator();
while (iter.hasNext()) {
BaseImageList sublist = iter.next();
if (sublist.isEmpty()) {
sublist.close();
iter.remove();
}
}
if (l.size() == 1) {
BaseImageList list = l.get(0);
return list;
}
ImageListUber uber = new ImageListUber(
l.toArray(new IImageList[l.size()]), sort);
return uber;
}
public static IImageList
makeImageList(ContentResolver cr, Uri uri,
int sort) {
String uriString = (uri != null) ? uri.toString() : "";
if (uriString.startsWith("content://drm")) {
return makeImageList(cr, DataLocation.ALL, INCLUDE_DRM_IMAGES, sort,
null);
} else if (uriString.startsWith("content://media/external/video")) {
return makeImageList(cr, DataLocation.EXTERNAL, INCLUDE_VIDEOS,
sort, null);
} else if (isSingleImageMode(uriString)) {
return makeSingleImageList(cr, uri);
} else {
String bucketId = uri.getQueryParameter("bucketId");
return makeImageList(cr, DataLocation.ALL, INCLUDE_IMAGES, sort,
bucketId);
}
}
return !uriString.startsWith(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI.toString())
&& !uriString.startsWith(
MediaStore.Images.Media.INTERNAL_CONTENT_URI.toString());
}
}
return new HashMap<String, String>();
}
return 0;
}
return true;
}
return null;
}
return null;
}
return false;
}
return false;
}
throw new UnsupportedOperationException();
}
}
int inclusion, int sort, String bucketId) {
ImageListParam param = new ImageListParam();
param.mLocation = location;
param.mInclusion = inclusion;
param.mSort = sort;
param.mBucketId = bucketId;
return param;
}
ImageListParam param = new ImageListParam();
param.mSingleImageUri = uri;
return param;
}
ImageListParam param = new ImageListParam();
param.mIsEmptyImageList = true;
return param;
}
DataLocation location, int inclusion, int sort, String bucketId) {
ImageListParam param = getImageListParam(location, inclusion, sort,
bucketId);
return makeImageList(cr, param);
}
return makeImageList(null, getEmptyImageListParam());
}
return makeImageList(cr, getSingleImageListParam(uri));
}
String directoryName =
Environment.getExternalStorageDirectory().toString() + "/DCIM";
File directory = new File(directoryName);
if (!directory.isDirectory()) {
if (!directory.mkdirs()) {
return false;
}
}
File f = new File(directoryName, ".probe");
try {
if (f.exists()) {
f.delete();
}
if (!f.createNewFile()) {
return false;
}
f.delete();
return true;
} catch (IOException ex) {
return false;
}
}
return hasStorage(true);
}
public static boolean hasStorage(
boolean requireWriteAccess) {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
if (requireWriteAccess) {
boolean writable = checkFsWritable();
return writable;
} else {
return true;
}
} else if (!requireWriteAccess
&& Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
return true;
}
return false;
}
private static Cursor
query(ContentResolver resolver, Uri uri,
String[] projection, String selection, String[] selectionArgs,
String sortOrder) {
try {
if (resolver == null) {
return null;
}
return resolver.query(
uri, projection, selection, selectionArgs, sortOrder);
} catch (UnsupportedOperationException ex) {
return null;
}
}
boolean result = false;
Cursor cursor = query(cr, MediaStore.getMediaScannerUri(),
new String [] {MediaStore.MEDIA_SCANNER_VOLUME},
null, null, null);
if (cursor != null) {
if (cursor.getCount() == 1) {
cursor.moveToFirst();
result = "external".equals(cursor.getString(0));
}
cursor.close();
}
return result;
}
}