package com.koushikdutta.ion.loader;
import android.annotation.TargetApi;
import android.content.ContentResolver;
import android.graphics.Bitmap;
import android.graphics.Point;
import android.media.MediaMetadataRetriever;
import android.media.ThumbnailUtils;
import android.os.Build;
import android.provider.MediaStore;
import com.koushikdutta.async.future.Future;
import com.koushikdutta.async.future.SimpleFuture;
import com.koushikdutta.ion.Ion;
import com.koushikdutta.ion.bitmap.BitmapInfo;
import java.io.File;
import java.net.URI;
/**
* Created by koush on 11/6/13.
*/
public class VideoLoader extends SimpleLoader {
private boolean useThumbnailUtils;
public void useThumbnailUtils(boolean useThumbnailUtils) {
this.useThumbnailUtils = useThumbnailUtils;
}
@TargetApi(Build.VERSION_CODES.GINGERBREAD_MR1)
public static Bitmap createVideoThumbnail(String filePath) throws Exception {
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(filePath);
return retriever.getFrameAtTime();
}
@Override
public Future<BitmapInfo> loadBitmap(Ion ion, final String key, final String uri, int resizeWidth, int resizeHeight, boolean animateGif) {
if (!uri.startsWith(ContentResolver.SCHEME_FILE))
return null;
final MediaFile.MediaFileType type = MediaFile.getFileType(uri);
if (type == null || !MediaFile.isVideoFileType(type.fileType))
return null;
final SimpleFuture<BitmapInfo> ret = new SimpleFuture<BitmapInfo>();
Ion.getBitmapLoadExecutorService().execute(new Runnable() {
@Override
public void run() {
final File file = new File(URI.create(uri));
if (ret.isCancelled()) {
// Log.d("VideoLoader", "Bitmap load cancelled (no longer needed)");
return;
}
try {
Bitmap bmp;
if (useThumbnailUtils || Build.VERSION.SDK_INT < Build.VERSION_CODES.GINGERBREAD_MR1)
bmp = ThumbnailUtils.createVideoThumbnail(file.getAbsolutePath(), MediaStore.Video.Thumbnails.MINI_KIND);
else
bmp = createVideoThumbnail(file.getAbsolutePath());
if (bmp == null)
throw new Exception("video bitmap failed to load");
BitmapInfo info = new BitmapInfo(key, type.mimeType, new Bitmap[] { bmp }, new Point(bmp.getWidth(), bmp.getHeight()));
info.loadedFrom = LoaderEmitter.LOADED_FROM_CACHE;
ret.setComplete(info);
} catch (Exception e) {
ret.setComplete(e);
}
}
});
return ret;
}
}