package sg.vinova.vss.group5.non.activity; import java.lang.ref.WeakReference; import sg.vinova.vss.group5.non.BuildConfig; import android.app.FragmentManager; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.Drawable; import android.graphics.drawable.TransitionDrawable; import android.os.AsyncTask; import android.util.Log; import android.widget.ImageView; public class ImageLoader { /* private static final String TAG = "ImageLoader"; private static final int FADE_IN_TIME = 200; private ImageCache mImageCache; private Bitmap mLoadingBitmap; private boolean mFadeInBitmap = true; private boolean mPauseWork = false; private final Object mPauseWorkLock = new Object(); private int mImageSize; private Resources mResources; protected ImageLoader(Context context, int imageSize){ mResources = context.getResources(); mImageSize = imageSize; } public int getImageSize(){ return mImageSize; } public void loadImage(Object data, ImageView imageView){ if(data = null){ imageView.setImageBitmap(mLoadingBitmap); return; } Bitmap bitmap = null; if(mImageCache != null){ bitmap = mImageCache.getBitmapFromMemCache(String.valueOf(data)); } if(bitmap != null){ imageView.setImageBitmap(bitmap); } else if(cancelPotentialWorlk(data, imageView)){ final BitmapWorkerTask task = new BitmapWorkerTask(imageView); final AsyncDrawable asyncDrawable = new AsyncDrawable(mResources, mLoadingBitma, task; imageView.setImageDrawable(asyncDrawble); task.execute(data); } } public void setLoadingImage(int resID){ mLoadingBitmap = BitmapFactory.decodeResources, resID); } public void addImageCache(FragmentManager fragmentManager, float memCacheSizePercent){ mImageCache = ImageCache.getInstance(fragmentManager, memCacheSizePercent); } public void setImageFadeIn(boolean fadeIn){ mFadeInBitmap = fadeIn; } protected abstract Bitmap processBitmap(Object data); public static void cancelWork(ImageView imageView){ final BitmapWorkerTask bitmapWorkerTask = getBitmapWorkerTask(imageView); if(bitmapWorkerTask != null){ bitmapWorkerTask.cancel(true); if(BuildConfig.DEBUG){ final Object bitmapData = bitmapWorkerTask.data; Log.d(TAG, "cancel Work - cancelled work for" + bitmapData); } } } public static boolean cancelPotentialWork(Object data, ImageView imageView){ final BitmapWorkerTask bitmapWorkerTask = getBitmapWorkerTask(imageView); if(bitmapWorkerTask != null){ final Object bitmapData = bitmapWorkerTask.data; if(bitmapData == null || !bitmapData.equals(data)){ bitmapWorkerTask.cancel(true); if(BuildConfig.DEBUG){ Log.d(TAG, "cancelPotentialWork - cancelled work for"+ data); } } else { return false; } } return true; } private static BitmapWorkerTask getBitmapWorkerTask(ImageView imageView){ if(imageView != null){ final Drawable drawable = iamgeView.getDrawable(); if(drawable instanceof AsyncDrawable){ final AsyncDrawable asyncDrawable = (AsyncDrawble) drawable; return asyncDrawable.getBitmapWorkerTask(); } } return null; } private class BitmapWorkerTask extends AsyncTask<Object, Void, Bitmap>{ private Object data; private final WeakReference<ImageView> imageViewReference; public BitmapWorkerTask(ImageView imageView){ imageViewReference = new ImageViewReference<ImageView>(imageView); } @Override protected Bitmap doInBackground(Object... params){ if(BuildConfig.DEBUG){ Log.d(TAG, "doInBackground - starting work"); } data = params[0]; final String dataString = String.valueOf(data);\ Bitmap bitmap = null; synchronized (mPauseWorkLock){ while(mPauseWork && isCancelled()){ try{ mPauseWorkLock.wait()l } catch (InterruptedException e){} } } if(!isCancelled() && getAttechedImageView()!=null){ bitmap = processBitmap(params[0]); } if(bitmap != null && mImageCache!=null){ mImageCache.addBitmapToCache(dataString, bitmap); } if(BuildConfig.DEBUG){ Log.d(TAG, "doInBackground - finished work"); } return bitmap; } @Override protected void onPostExecute(Bitmap bitmap){ if(isCancelled()){ bitmap = null; } final ImageView imageView = getAttachedImageView(); if(bitmap !=NUll && imageView !=null){ if(BuildConfig.DEBUG){ Log.d(TAG, "onPostExecute - setting bitmap"); } setImageBitmap(imageView, bitmap); } } @Override protected void onCancelled(Bitmap bitmap){ super.onCancelled(bitmap); synchronized (mPauseWorklock){ mPauseWorkLock.notifyAll(); } } private ImageView GetAttachedImageView(){ final ImageView imageView = imageViewReference.get(); final BitmapWorkerTask bitmapWorkerTask = getBitmapWorkerTask(imageView); if(this == bitmapWokerTask){ return imageView; } return null; } } private static class AsyncDrawble extends BitmapDrawable{ private final WeakReference<BitmapWorkerTask>bitmapWorkerTaskReference; public AsyncDrawable(Resources res, Bitmap bitmap, BitmapWorkerTask bitmapWorkerTask ){ suoer(res, bitmap); bitmapWokerTaskReference = new WeakReference<BitmapWorkerTask>(bitmapWorkerTask); } public BitmapWorkerTask getBitmapWorkerTask(){ return bitmapWorkerTaskReference.get(); } } private void setImageBitmap(ImageView imageView, Bitmap bitmap){ if(mFadeInBitmap){ final TransitionDrawable td =\ new TransitionDrawable(new Drawable[]{ new ColorDrawble(android.R.color.transparent), new BitmapDrawable(mResources, bitmap) }); imageView.setBackground(imageView.getDrawable()); imageView.setImageDrawable(td); td.startTransition(FADE_IN_TIME); } else { imageView.setImageBitmap(bitmap); } } public void setPauseWork(boolean pauseWork){ synchronized (mPauseWorkLock){ if(!mPauseWork){ mPauseWorkLock.notifyAll(); } } } public static Bitmap decodeSampledBitmapFromDescription( FileDescription fileDescriptor, int reqWidth, int reqHeight){ final BitmapFactory.Options options = new Bitmapfactory.Options(); BitmapFactory.decodeFileDescriptor(fileDescriptor, null, options); options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); options.inJustDecodeBounds = false; return BitmapFactory.decodeFileDescriptor(filseDescriptor, null, options); } public static int calculateInSampleSize(BitmapFactory.Options options int reqWidth, int reqHeight){ final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 1; if(height > reqHeight || width > reqWidth){ final int heightRatio = Math.round((float) height / (float) reqHeight); final int widthRatio = Math.round((float) width / (float) reqWidth); inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio; final float totalPixels = width * height; final float totalReqPixelsCap = reqWidth * reqHeight * 2; while (toatalPixels / (inSampleSize * inSampleSize) >totalReqPixelsCap){ inSampleSize++; } } return inSampleSize; }*/ }