package fr.eyal.datalib.sample.netflix.ui; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import android.content.Context; import android.graphics.Bitmap; import android.view.animation.AlphaAnimation; import android.view.animation.Animation; import android.widget.ImageView; import android.widget.TextView; import fr.eyal.datalib.sample.cache.BitmapMemoryLruCache; import fr.eyal.datalib.sample.cache.CacheableBitmapDrawable; import fr.eyal.datalib.sample.netflix.data.model.movieimage.MovieImage; import fr.eyal.datalib.sample.netflix.data.model.top100.ItemTop100; import fr.eyal.datalib.sample.netflix.data.service.NetflixDataManager; import fr.eyal.datalib.sample.netflix.data.service.NetflixService; import fr.eyal.datalib.sample.netflix.util.Resources; import fr.eyal.lib.data.model.ResponseBusinessObject; import fr.eyal.lib.data.service.DataManager; import fr.eyal.lib.data.service.DataManager.OnDataListener; import fr.eyal.lib.data.service.model.BusinessResponse; import fr.eyal.lib.data.service.model.DataLibRequest; public class MovieItemHolder implements OnDataListener { public static final String BIG_APPENDIX = "BIG"; public ImageView image; public TextView text; public ItemTop100 item; public boolean mBigImage; private NetflixDataManager mDataManager; private Context mContext; public MovieItemHolder(Context context, boolean bigImage) { mDataManager = NetflixDataManager.getInstance(); mContext = context.getApplicationContext(); mBigImage = bigImage; } @Override public void onRequestFinished(int requestId, boolean suceed, BusinessResponse response) { mDataManager.removeOnDataListener(requestId, this); if(!suceed) return; switch (response.webserviceType) { case NetflixService.WEBSERVICE_MOVIEIMAGE: MovieImage img = (MovieImage) response.response; Bitmap bitmap = img.image.get(); if(bitmap != null){ BitmapMemoryLruCache bitmapCache = Resources.getInstance().mBitmapCache; CacheableBitmapDrawable cacheBmp = new CacheableBitmapDrawable(mContext.getResources(), item.getPosterName(), bitmap, CacheableBitmapDrawable.RecyclePolicy.DISABLED); bitmapCache.put(cacheBmp); //we cache another bitmap if we are on a big element //this is dirty but handles the different size of the big elements on the selection panel if(mBigImage){ cacheBmp = new CacheableBitmapDrawable(mContext.getResources(), item.getPosterName() + BIG_APPENDIX, bitmap, CacheableBitmapDrawable.RecyclePolicy.DISABLED); bitmapCache.put(cacheBmp); } image.post(new UpdatePoster(cacheBmp, image)); } break; default: break; } } @Override public void onCacheRequestFinished(int requestId, ResponseBusinessObject response) { mDataManager.removeOnDataListener(requestId, this); if(response instanceof MovieImage){ MovieImage img = (MovieImage) response; item.image = img; Bitmap bitmap = img.getBitmap(); if(bitmap != null){ BitmapMemoryLruCache bitmapCache = Resources.getInstance().mBitmapCache; CacheableBitmapDrawable cacheBmp = new CacheableBitmapDrawable(mContext.getResources(), item.getPosterName(), bitmap, CacheableBitmapDrawable.RecyclePolicy.DISABLED); bitmapCache.put(cacheBmp); if(mBigImage){ cacheBmp = new CacheableBitmapDrawable(mContext.getResources(), item.getPosterName() + "BIG", bitmap, CacheableBitmapDrawable.RecyclePolicy.DISABLED); bitmapCache.put(cacheBmp); } image.post(new UpdatePoster(cacheBmp, image)); } else { try { if(mDataManager != null) mDataManager.getMovieImage(DataManager.TYPE_NETWORK, this, item.getImageUrl(), DataLibRequest.OPTION_NO_OPTION, null, null); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } } } @Override public void onDataFromDatabase(int code, ArrayList<?> data) { // TODO Auto-generated method stub } public class UpdatePoster implements Runnable { CacheableBitmapDrawable mImage; ImageView mView; Animation mFadeIn; public UpdatePoster(CacheableBitmapDrawable bitmap, ImageView view){ mImage = bitmap; mView = view; mFadeIn = new AlphaAnimation(0, 1); mFadeIn.setDuration(300); } @Override public void run() { Animation anim = mView.getAnimation(); if(anim != null){ anim.cancel(); anim.reset(); mView.setImageDrawable(mImage); anim.startNow(); } else { mView.setImageDrawable(mImage); mView.startAnimation(mFadeIn); } } } }