/**
* galaxy inc.
* meetup client for android
*/
package com.galaxy.meetup.client.util;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;
import com.galaxy.meetup.server.client.domain.DataVideo;
import com.galaxy.meetup.server.client.domain.DataVideoStream;
import com.galaxy.meetup.server.client.util.JsonUtil;
/**
*
* @author sihai
*
*/
public class MediaStoreUtils {
private static final Pattern PAT_RESOLUTION = Pattern.compile("(\\d+)[xX](\\d+)");
public static final Uri PHONE_STORAGE_IMAGES_URI = android.provider.MediaStore.Images.Media.getContentUri("phoneStorage");
public static final Uri PHONE_STORAGE_VIDEO_URI = android.provider.MediaStore.Video.Media.getContentUri("phoneStorage");
public static final String MEDIA_ID_PROJECTION[] = {
"_id"
};
public static boolean deleteLocalFileAndMediaStore(ContentResolver contentresolver, Uri uri) {
boolean flag = true;
String s = getFilePath(contentresolver, uri);
if(contentresolver.delete(uri, null, null) > 0)
flag = false;
if(flag && s != null) {
File file = new File(s);
if(file.exists())
flag = file.delete();
}
return flag;
}
public static String getFilePath(ContentResolver contentresolver, Uri uri) {
Cursor cursor = null;
try {
cursor = contentresolver.query(uri, new String[] {"_data"}, null, null, null);
if(null == cursor) {
if(EsLog.isLoggable("MediaStoreUtils", 5)) {
Log.w("MediaStoreUtils", (new StringBuilder("getFilePath: query returned null cursor for uri=")).append(uri).toString());
}
return null;
}
if(!cursor.moveToFirst()) {
if(EsLog.isLoggable("MediaStoreUtils", 5))
Log.w("MediaStoreUtils", (new StringBuilder("getFilePath: query returned empty cursor for uri=")).append(uri).toString());
return null;
}
String s = cursor.getString(0);
if(TextUtils.isEmpty(s)) {
Log.w("MediaStoreUtils", (new StringBuilder("getFilePath: MediaColumns.DATA was empty for uri=")).append(uri).toString());
return null;
}
return s;
} finally {
if(null != cursor) {
cursor.close();
}
}
}
public static long getMediaId(ContentResolver contentresolver, Uri uri) {
Cursor cursor = null;
try {
cursor = contentresolver.query(uri, MEDIA_ID_PROJECTION, null, null, null);
if(null == cursor || !cursor.moveToFirst()) {
return -1L;
}
return cursor.getLong(0);
} finally {
if(null != cursor) {
cursor.close();
}
}
}
public static Bitmap getThumbnail(Context context, Uri uri, int i) {
int j = ImageUtils.getMaxThumbnailDimension(context, 1);
return getThumbnailHelper(context, uri, j, j, 1);
}
public static Bitmap getThumbnail(Context context, Uri uri, int i, int j) {
byte byte0 = 3;
int k = ImageUtils.getMaxThumbnailDimension(context, byte0);
if(i > k || j > k)
byte0 = 1;
return getThumbnailHelper(context, uri, i, j, byte0);
}
private static Bitmap getThumbnailHelper(Context context, Uri uri, int i, int j, int k) {
if(null == uri) {
return null;
}
if(!isExternalMediaStoreUri(uri)) {
return null;
}
ContentResolver contentresolver = context.getContentResolver();
long id = ContentUris.parseId(uri);
String type = ImageUtils.getMimeType(contentresolver, uri);
if(ImageUtils.isImageMimeType(type)) {
Bitmap bitmap = android.provider.MediaStore.Images.Thumbnails.getThumbnail(contentresolver, id, k, null);
if(bitmap != null)
{
bitmap = ImageUtils.rotateBitmap(contentresolver, uri, bitmap);
if(bitmap.getWidth() != i || bitmap.getHeight() != j)
{
Bitmap bitmap1 = ImageUtils.resizeAndCropBitmap(bitmap, i, j);
if(bitmap1 != bitmap)
{
bitmap.recycle();
bitmap = bitmap1;
}
}
}
return bitmap;
} else if(ImageUtils.isVideoMimeType(type)) {
return android.provider.MediaStore.Video.Thumbnails.getThumbnail(contentresolver, id, k, null);
} else {
if(EsLog.isLoggable("MediaStoreUtils", 5))
{
Log.w("MediaStoreUtils", (new StringBuilder("getThumbnail: unrecognized mimeType=")).append(type).append(", uri=").append(uri).toString());
}
return null;
}
}
public static boolean isExternalMediaStoreUri(Uri uri) {
if(isMediaStoreUri(uri)) {
return false;
}
String s = uri.getPath();
String s1 = android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI.getPath();
String s2 = android.provider.MediaStore.Video.Media.EXTERNAL_CONTENT_URI.getPath();
return s.startsWith(s1) || s.startsWith(s2);
}
public static boolean isMediaStoreUri(Uri uri) {
boolean flag;
if(uri != null && "content".equals(uri.getScheme()) && "media".equals(uri.getAuthority()))
flag = true;
else
flag = false;
return flag;
}
public static DataVideo toVideoData(Context context, Uri uri)
{
ContentResolver contentresolver = context.getContentResolver();
if(!ImageUtils.isVideoMimeType(ImageUtils.getMimeType(contentresolver, uri))) {
return null;
}
DataVideoStream datavideostream = new DataVideoStream();
datavideostream.url = uri.toString();
datavideostream.formatId = Integer.valueOf(0);
Cursor cursor = null;
try {
cursor = contentresolver.query(uri, VideoQuery.PROJECTION, null, null, null);
if(null == cursor || !cursor.moveToFirst()) {
return null;
}
long l = cursor.getLong(1);
String s = cursor.getString(2);
if(null == s) {
return null;
}
Matcher matcher = PAT_RESOLUTION.matcher(s);
if(!matcher.find()) {
return null;
}
datavideostream.width = Integer.parseInt(matcher.group(1));
datavideostream.height = Integer.parseInt(matcher.group(2));
List list = new ArrayList(1);
list.add(datavideostream);
DataVideo datavideo = new DataVideo();
datavideo.status = "FINAL";
datavideo.durationMillis = Long.valueOf(l);
datavideo.stream = list;
return datavideo;
} finally {
if(null != cursor) {
cursor.close();
}
}
}
public static byte[] toVideoDataBytes(Context context, Uri uri) {
DataVideo datavideo = toVideoData(context, uri);
byte abyte0[];
if(datavideo == null)
abyte0 = null;
else
abyte0 = JsonUtil.toByteArray(datavideo);
return abyte0;
}
//===========================================================================
// Inner class
//===========================================================================
private static interface VideoQuery {
public static final String PROJECTION[] = {
"_id", "duration", "resolution"
};
}
}