package com.tomclaw.mandarin.core;
import android.content.ContentResolver;
import android.content.Context;
import android.content.res.Resources;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.provider.MediaStore;
import android.text.TextUtils;
import android.util.DisplayMetrics;
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.FileNotFoundException;
import java.io.InputStream;
/**
* Created by Solkin on 18.10.2014.
*/
public class UriFile extends VirtualFile {
private String uri;
private String mimeType;
private long size;
private String name;
public UriFile() {
}
private UriFile(String uri, String mimeType, long size, String name) {
this.uri = uri;
this.mimeType = mimeType;
this.size = size;
this.name = name;
}
@Override
public String getMimeType() {
return mimeType;
}
@Override
public long getSize() {
return size;
}
@Override
public String getName() {
return name;
}
public Uri getUri() {
return Uri.parse(uri);
}
@Override
public InputStream openInputStream(Context context) throws FileNotFoundException {
return context.getContentResolver().openInputStream(getUri());
}
@Override
public Bitmap getThumbnail(Context context) {
int sizePx = context.getResources().getDimensionPixelSize(R.dimen.preview_bitmap);
long time = System.currentTimeMillis();
Bitmap bitmap;
if (mimeType.startsWith("image")) {
bitmap = BitmapHelper.decodeSampledBitmapFromUri(context, getUri(), sizePx, sizePx);
} else if (mimeType.startsWith("video")) {
bitmap = BitmapHelper.createVideoThumbnail(context, getUri(), sizePx);
} else {
bitmap = null;
}
Logger.log("preview sampling (" + sizePx + "): " + (System.currentTimeMillis() - time));
return bitmap;
}
/**
* This method converts dp unit to equivalent pixels, depending on device density.
*
* @param dp A value in dp (density independent pixels) unit. Which we need to convert into pixels
* @param context Context to get resources and device specific display metrics
* @return A float value to represent px equivalent to dp depending on device density
*/
public static float convertDpToPixel(float dp, Context context) {
Resources resources = context.getResources();
DisplayMetrics metrics = resources.getDisplayMetrics();
return dp * (metrics.densityDpi / 160f);
}
@Override
public String getPath() {
return uri;
}
public static UriFile create(Context context, Uri uri) throws FileNotFoundException {
String uriScheme = uri.getScheme();
if (TextUtils.equals(uriScheme, ContentResolver.SCHEME_CONTENT)) {
String[] projection = {
MediaStore.MediaColumns.MIME_TYPE,
MediaStore.MediaColumns.SIZE,
MediaStore.MediaColumns.DISPLAY_NAME};
Cursor cursor = null;
try {
cursor = context.getContentResolver().query(uri, projection, null, null, null);
if (cursor != null && cursor.moveToFirst()) {
// Size detection.
long size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.SIZE));
// Try to detect name.
String name;
int nameColumn = cursor.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME);
if (nameColumn == -1) {
name = String.valueOf(System.currentTimeMillis());
} else {
name = cursor.getString(nameColumn);
}
// Try to detect mime-type.
String mimeType;
int mimeTypeColumn = cursor.getColumnIndex(MediaStore.MediaColumns.MIME_TYPE);
if (mimeTypeColumn == -1) {
mimeType = FileHelper.getMimeType(name);
} else {
mimeType = cursor.getString(mimeTypeColumn);
}
return new UriFile(uri.toString(), mimeType, size, name);
}
} finally {
if (cursor != null) {
cursor.close();
}
}
} else if (TextUtils.equals(uriScheme, ContentResolver.SCHEME_FILE)) {
File file = new File(uri.getPath());
return new UriFile(uri.toString(), FileHelper.getMimeType(file.getName()), file.length(), file.getName());
}
throw new FileNotFoundException();
}
@Override
public String toString() {
return "UriFile{" +
"uri='" + uri + '\'' +
", mimeType='" + mimeType + '\'' +
", size=" + size +
", name='" + name + '\'' +
'}';
}
}