import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
+ import android.graphics.Matrix;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
+ import android.media.ExifInterface;
import android.media.ThumbnailUtils;
import android.net.Uri;
import android.os.AsyncTask;
return true;
}
+ public static boolean cancelPotentialWork(File file, ImageView imageView) {
+ final ThumbnailLocalGenerationTask bitmapWorkerTask = getBitmapLocalWorkerTask(imageView);
+
+ if (bitmapWorkerTask != null) {
+ final File bitmapData = bitmapWorkerTask.mFile;
+ // If bitmapData is not yet set or it differs from the new data
+ if (bitmapData == null || bitmapData != file) {
+ // Cancel previous task
+ bitmapWorkerTask.cancel(true);
+ } else {
+ // The same work is already in progress
+ return false;
+ }
+ }
+ // No task associated with the ImageView, or an existing task was cancelled
+ return true;
+ }
+
public static ThumbnailGenerationTask getBitmapWorkerTask(ImageView imageView) {
if (imageView != null) {
final Drawable drawable = imageView.getDrawable();
}
return null;
}
+
+ public static ThumbnailLocalGenerationTask getBitmapLocalWorkerTask(ImageView imageView) {
+ if (imageView != null) {
+ final Drawable drawable = imageView.getDrawable();
+ if (drawable instanceof AsyncLocalDrawable) {
+ final AsyncLocalDrawable asyncDrawable = (AsyncLocalDrawable) drawable;
+ return asyncDrawable.getBitmapWorkerTask();
+ }
+ }
+ return null;
+ }
+
+ public static class ThumbnailLocalGenerationTask extends AsyncTask<File, Void, Bitmap> {
+ private final WeakReference<ImageView> mImageViewLocalReference;
+ private File mFile;
+
+ public ThumbnailLocalGenerationTask(ImageView imageView) {
+ // Use a WeakReference to ensure the ImageView can be garbage collected
+ mImageViewLocalReference = new WeakReference<ImageView>(imageView);
+ }
+
+ // Decode image in background.
+ @Override
+ protected Bitmap doInBackground(File... params) {
+ Bitmap thumbnail = null;
+
+ try {
+ mFile = params[0];
+ final String imageKey = String.valueOf(mFile.hashCode());
+
+ // Check disk cache in background thread
+ thumbnail = getBitmapFromDiskCache(imageKey);
+
+ // Not found in disk cache
+ if (thumbnail == null) {
+ // Converts dp to pixel
+ Resources r = MainApp.getAppContext().getResources();
+
+ int px = (int) Math.round(r.getDimension(R.dimen.file_icon_size));
+
+ Bitmap bitmap = BitmapUtils.decodeSampledBitmapFromFile(
+ mFile.getAbsolutePath(), px, px);
+
+ if (bitmap != null) {
+ thumbnail = ThumbnailUtils.extractThumbnail(bitmap, px, px);
+
+ // Add thumbnail to cache
+ addBitmapToCache(imageKey, thumbnail);
+ }
+ }
+
+ } catch (Throwable t) {
+ // the app should never break due to a problem with thumbnails
+ Log_OC.e(TAG, "Generation of thumbnail for " + mFile + " failed", t);
+ if (t instanceof OutOfMemoryError) {
+ System.gc();
+ }
+ }
+
+ return thumbnail;
+ }
+
+ protected void onPostExecute(Bitmap bitmap){
+ if (isCancelled()) {
+ bitmap = null;
+ }
+
+ if (mImageViewLocalReference != null && bitmap != null) {
+ final ImageView imageView = mImageViewLocalReference.get();
+ final ThumbnailLocalGenerationTask bitmapWorkerTask = getBitmapLocalWorkerTask(imageView);
+ if (this == bitmapWorkerTask && imageView != null) {
+ if (imageView.getTag().equals(mFile.hashCode())) {
+ imageView.setImageBitmap(bitmap);
+ }
+ }
+ }
+ }
+ }
public static class ThumbnailGenerationTask extends AsyncTask<OCFile, Void, Bitmap> {
private final WeakReference<ImageView> mImageViewReference;
if (bitmap != null) {
thumbnail = ThumbnailUtils.extractThumbnail(bitmap, px, px);
+
+ // Rotate image, obeying exif tag
+ thumbnail = BitmapUtils.rotateImage(thumbnail, mFile.getStoragePath());
// Add thumbnail to cache
addBitmapToCache(imageKey, thumbnail);
return bitmapWorkerTaskReference.get();
}
}
+
+ public static class AsyncLocalDrawable extends BitmapDrawable {
+ private final WeakReference<ThumbnailLocalGenerationTask> bitmapWorkerLocalTaskReference;
+
+ public AsyncLocalDrawable(Resources res, Bitmap bitmap, ThumbnailLocalGenerationTask bitmapWorkerTask) {
+ super(res, bitmap);
+ bitmapWorkerLocalTaskReference =
+ new WeakReference<ThumbnailLocalGenerationTask>(bitmapWorkerTask);
+ }
+
+ public ThumbnailLocalGenerationTask getBitmapWorkerTask() {
+ return bitmapWorkerLocalTaskReference.get();
+ }
+ }
/**
mThumbnailsDiskCacheLock.notifyAll(); // Wake any waiting threads
}
}
-
+
}